OmniAICreator/Qiita-1.07M huggingface dataset:
衆議院の質問主意書データをWebページから集計する

国会に提出された質問主意書データをRubyを使って集計する。

集計に使った元データが必要な方は、[@ts_3156](https://twitter.com/ts_3156)までご連絡ください。データの各種加工もお引き受けいたします。

集計結果は以下の通り。

**国会議員ごとのランキング**

```
1位 初鹿　明博 20回
2位 櫻井　周 17回
3位 松原　仁 16回
4位 丸山　穂高 16回
5位 城井　崇 8回
6位 早稲田　夕季 8回
7位 下地　幹郎 6回
8位 中谷　一馬 5回
9位 阿部　知子 4回
10位 江田　憲司 3回
11位 山井　和則 3回
12位 森山　浩行 2回
13位 岡本　充功 2回
14位 大河原　雅子 2回
15位 柿沢　未途 1回
16位 山崎　誠 1回
17位 中島　克仁 1回
18位 山内　康一 1回
19位 稲富　修二 1回
20位 青山　大人 1回
21位 関　健一郎 1回
22位 赤嶺　政賢 1回
23位 黒岩　宇洋 1回
24位 亀井　亜紀子 1回
25位 大西　健介 1回
26位 階　猛 1回
27位 奥野　総一郎 1回
```

**会派ごとのランキング**

```
1位 立憲民主・国民・社保・無所属フォーラム 82回
2位 無所属 42回
3位 日本共産党 1回
```

以下、集計に使ったRubyコード

```ruby:Gemfile
gem 'anemone'
```

```ruby
require 'anemone'

def scrape(url)
  Anemone.crawl(url, depth_limit: 0) do |anemone|
    anemone.on_every_page do |page|
      return page
    end
  end
end

url = 'http://www.shugiin.go.jp/internet/itdb_shitsumon.nsf/html/shitsumon/kaiji201_l.htm'
progress_links = []
question_links = []
answer_links = []

scrape(url).links.each do |link|
  str = link.to_s

  if str.match?(/[^ab]201\d{3}\.htm/)
    progress_links << link
  elsif str.match?(/a201\d{3}\.htm/)
    question_links << link
  elsif str.match?(/b201\d{3}\.htm/)
    answer_links << link
  end
end

questions = []

progress_links.each do |link|
  page = scrape(link.to_s)
  html = Nokogiri::HTML(page.body)
  table = html.xpath('//*[@id="mainlayout"]/table')
  question = {}

  table.xpath('tr').each do |row|
    komoku = row.xpath("td[@headers='KOMOKU']").text
    naiyo = row.xpath("td[@headers='NAIYO']").text

    next if komoku == ''
    question[komoku] = naiyo
  end

  questions << question

  sleep 10
end
```

提出者名で順位を集計する場合

```ruby
ranking = Hash.new(0)
questions.each do |question|
  key = question['提出者名']
  # key = question['会派名']
  ranking[key] += 1
end; nil

ranking.sort_by { |k, v| -v }.each.with_index do |(key, count), i|
  puts "#{i + 1}位 #{key.chomp('君')} #{count}回"
end
```

集計に使った元データが必要な方は、[@ts_3156](https://twitter.com/ts_3156)までご連絡ください。データの各種加工もお引き受けいたします。
【PHP】連想配列に代入した値を使って文字を置換する

入力した文字列の中から任意の文字を置換したくて、for文使ったりforeach使ってみたりして数時間うんうん悩んでたけど、`strtr()`関数に配列突っ込んだら解決したっていうメモ。

##なんやそれ？
>str_replace — 検索文字列に一致したすべての文字列を置換する

とのこと。
参考: [PHP: strtr - Manual ](https://www.php.net/manual/ja/function.strtr.php)


```php:引数
strtr($検索する文字列, $対象文字列, $置換する文字列);
```
引数に連想配列を渡すこともできる。
`$key`が対象文字列、`$value`が置換する文字列になる。

```php:引数に連想配列を渡す
$s = 'AI';
$ary = ['A' => 1];

echo strtr($s, $ary);

//実行結果
1I
```




##実装

```php
<?php
$str = 'PIZZA EAT PIZZA';
$words = [
    'A' => 4,
    'E'	=> 3,
    'G'	=> 6,
    'I'	=> 1,
    'O'	=> 0,
    'S'	=> 5,
    'Z'	=> 2,
    ];

echo $str."\n";
echo strtr($str, $words);


//実行結果
PIZZA EAT PIZZA
P1224 34T P1224

```

##おわり
`str_replace()`ちゅーものもあるみたい。パラメータが多くて便利そうだけど、使うときに注意が必要っぽい。
参考1: [PHP: str_replace - Manual ](https://www.php.net/manual/ja/function.str-replace.php)
参考2: [str_replaceとstrtrの違いって何なのさ
](https://norm-nois.com/blog/archives/4088)
PyCharmで”None of supported template languages is selected.”のエラー対処方法

フォルダーを右クリックしてTemplate Folderに設定するとき

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330873/67bdb61a-4baa-8928-aaf6-1682f922c03f.png)

”None of supported template languages is selected.”のエラーが発生する場合は

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330873/c0dda33c-0a71-3c2a-7535-4013bd53ef4e.png)

Settings>Languages & Frameworksよりテンプレート言語を選択すればよい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330873/fe75c74f-167c-e5dd-a3a6-ad9a17d885d7.png)
create-react-appで作成したアプリのデプロイにおける環境変数の扱いについて

## 環境
- create-react-app 3.4.0
- gh-pages 2.2.0

## create-react-appでの環境変数について
ReactやNodeなどで環境変数を使いたい場合には、dotenvをインストールする必要がありますが、create-react-appを使用した場合だと、デフォルトでdotenvが組み込まれています。

このため、追加のインストールをせずとも環境変数が設定できます。
ただし、create-react-appの場合は`REACT_APP_`から始まる変数名をつけなくてはなりません。
`.env`ファイルの例は以下のようになります。

```:.env
REACT_APP_API_KEY="YOURKEY"
```

環境変数にアクセスするには次のようになります。

```App.js
render () {
  return (
    <div>
      {process.env.REACT_APP_API_KEY}
    </div>
  )
}
```

## デプロイする際の注意点
環境変数の読み込みにはいくつかモードがあり、
ローカル実行時には、`.env.development`、
テスト実行時には、`.env.test`、
ビルド時には、`.env.production`
というふうになっています。

このため`.env`しか用意せず、ビルドを行い、デプロイをすると、環境変数が読み込まれない場合があります。

### 解決法
この解決法として、`.env`ファイルを複数モード用に分ける方法があります。
私は以下のように分けました。

- 開発用

```:.env.development
REACT_APP_API_KEY="YOURKEY"
```

- 本番用

```:.env.production
REACT_APP_API_KEY="YOURKEY"
```

このように分けることで、`npm run build`や`gh-pages -d build`を行った際に、生成したjsファイルに環境変数が埋め込まれるようになります。

## 参考文献
- [知っていると捗るcreate-react-appの設定](https://qiita.com/geek_duck/items/6f99a3da15dd39658fff)
- [create-react-appで環境変数を設定したり切り替えたりする方法 | sumii.io](https://sumii.io/posts/create-react-app-env-setup/)
GAS 特定の列の最終行番号を取得する

とにかくめんどくさいので自作。
普通にちゃんと全ての行を埋めてくれるようなスプレッドシートだったらもっと簡単に書けるが、
所々空の行が挿入されていたり、穴ぼこがたくさんあるときにうまく取得できない時がある。
そんなときにこれが使えそう。

```js
var headers = speadersheet.getDataRange().getValues()[1]

// 列とか変更されると辛いので、動的に常に列番号を取得
function getColumnRow(columnName) {
  return header.map(function(h) {
    return h.replace(/\r?\n/g, '')
  }).indexOf(columnName)
}

function getAlphabets() {
  return 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split('')
}

// 特定のカラムの最終行を取得
function getLastRowByColumn(columnName) {
  var index = getColumnRow(columnName)
  var alph = getAlphabets()[index]
  var range = alph+':'+alph
  var rangeData = sheet.getRange(range).getValues()
  return rangeData.filter(function(data) {
    return data[0]
  }).length
}
```

1. 指定の列名で列番号を取得する
2. それがアルファベットの配列の中でどこに配置されているか
3. A:Aみたいにrangeを作成する
4. A:A列の値を前取得
5. 空を排除
6. 配列の大きさを返せばそれが最終行（などにヘッダーが複数行で構成されていたら、5で減るので帳尻合わせ）
PHP　年と月からその月の長さ（最終日）を取得する　うるう年判定込

```php
function checkFinalDay($year,$month){
    $finalDay = [
        "1" => 31,
        "2" => 28,
        "3" => 31,
        "4" => 30,
        "5" => 31,
        "6" => 30,
        "7" => 31,
        "8" => 31,
        "9" => 30,
        "10" => 31,
        "11" => 30,
        "12" => 31,
    ];

    if( $year%4 == 0 && $year%100 != 0 || $year%400 == 0 {
        $finalDay["2"] = 29;
    }
    return $finalDay[$month];
}
```
Gulp さんぷるこーど　いろいろ

```javascript
var gulp = require("gulp");
var del = require("del");
var rename = require("gulp-rename");
var concat = require("gulp-concat");
var uglify = require("gulp-uglify");
var sass = require("gulp-sass")

var copyTask = async function () {
    return gulp.src("./src/sample1.txt")
        .pipe(gulp.dest("./dist"));
};

var delTask = async function () {
    return del("./dist/*");
};

var renameTask = async function () {
    gulp.src("./src/sample1.txt")
        .pipe(rename({ suffix: ".min" }))
        .pipe(gulp.dest("./dist"));
};
var concatTask = async function () {
    gulp.src(["sample1.txt", "sample2.txt"], { cwd: "./src" })
        .pipe(concat("bundle.txt"))
        .pipe(gulp.dest("./dist"));
};

var minifyTask = async function () {
    gulp.src("./src/sample1.js")
        .pipe(uglify())
        .pipe(gulp.dest("./dest"));
};

var minifyTask2 = async function () {
    gulp.src(["sample1.js", "sample2.js"], { cwd: "./src" })
        .pipe(concat("bundle.js"))
        .pipe(uglify())
        .pipe(rename({ suffix: ".min" }))
        .pipe(gulp.dest("./dist"));
};

var sassTask = async function () {
    gulp.src(["sample1.scss", "sample2.scss"], { cwd: "./src" })
        .pipe(concat("bundle.scss"))
        .pipe(sass({ outputStyle: "compressed" }))
        .pipe(rename({suffix: ".min"}))
        .pipe(gulp.dest("./dist"));
};

module.exports.default = sassTask;//minifyTask2;//concatTask;//renameTask;//delTask;//copyTask;
pythonドキュメント読み ソケットプログラミング HOWTO

https://docs.python.org/ja/3/howto/sockets.html
こちらを読んだ際のメモです。
読んでいるときの脳内をダンプしたものなので、単純に内容を知りたい方は直接ドキュメントを読むことをおすすめします。
python3.8.2

# なぜドキュメントを読んでいるか
- ここらでドキュメントを読んで、知らないだけで実は使うと便利な機能を知っておきたい
    - pythonを使い始めてかれこれ8年ほどになるが、雰囲気でやっているので未だに知らない機能がある
- flask・djangoやzmqなどたまに使っているが、内部のソケットプログラミングからは目をそらしながら生きてきた
    - 詳しいことはともかくざっくりとソケットって何やってんだろうと知っておきたい

# 概要
- 一般的なソケットプログラミング、なかでもINETのSTREAM(すなわちIPv4のTCP)について、pythonで書くことを通して簡単に説明するとのこと
    - 現時点では何を言っているのか全くわからない
- ソケットプログラミングについても、pythonでの書き方についても、詳解するわけではなく、

> 恥ずかしくない使い方ができるようになる程度の情報は得られるはず

とのこと

# メモ
## 歴史
- ソケットはBSD Unixの一部としてバークレイで発明され、めっちゃ普及した

## ソケットの作成
- client sideとserver sideのそれぞれのソケットが存在する
    - このあたりはzmqでもそうなので、ソケットレベルを意識したインターフェースになってそう
    - なのでzmqでイメージしながら読んでみる

### client side
```client_socket.py
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("qiita.com", 80))
```
これだけ。簡単

### server side
```server_side.py
# server socketを作る
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversocket.bind((socket.gethostname(), 80))
serversocket.listen(5)

# serving
while True:
  clientsocket, address = serversocket.accept()
  # threaded server
  ct = client_thread(clientsocket)
  ct.run()
```
ちょっと多いが、結構単純。

- 1行目は、変数名はserversocketだがやってることはclientsocketと全く同じ
- サーバーソケットとは、listenしているportに何かがconnect()してきたら、そいつと喋る(=送信する)クライアントソケットを作るやつのことだった
    - 作ったら自分は引き続きlistenに戻る
- [昨日読んだディスクリプタ](https://qiita.com/kirin_san_san_san/items/2b4e6d1f0b1d34ba5f2e)の文脈では、例えばオブジェクトに関数をboundするとは関数のデフォルトの１個目の引数に常に自分自身を代入することだった
    - ここでのbindも同じ'束縛'と解釈した
    - つまり、まずは匿名のserversocketを作って、聞きに行くホストとしてsocket.gethostname()を登録したということか
    - ディスクリプタの例から類推すると、bindしなくても動的にlistenする先を調節したりといったことをしているものも世の中にはありそう
    - また、clientsocket.connectではホストとportを渡しているが、serversocketではここで使っているもっとプリミティブなめそっどにデフォルトで渡すようになっているのではないかと想像する

## ソケットの例
- もう少し具体的な例で説明している
- server sideで生成されたclientsocketはclient sideで精製したものと同じ
    - 上述のclientからserverにconnect→serverがclientsocketを生成→clientsocket同士が喋るという流れはあくまで1レベル抽象的な設計であってソケット自体の仕様ではない
- コード例はsocketでのメッセージの送受信のわかりやすい例
    - メッセージを全部送りきれたか、ネットワークバッファに残っているか否かを気にしなければいけない
    - あとはzmqと似たような感じ？
- 複数のメッセージを受け取るのはむずかしく、切れ目が自明ではない
    - いくつか解決策とその問題点が示されている
    - 冒頭に長さをまず送るのは良い解法に思えるが、例えば５桁の数字でデータ長を示しても、高負荷ネットワークでは5文字を一度に受信出来るとは限らない

## バイナリデータ
- エンディアンが異なると変換が必要
- また、longを大量に送る場合、0はlongでは４バイトだがASCIIなら2バイト
    - データをよく見て選ぼうということか

## 切断
- 切断時、本来は`shutdown()`して`close()`する
    - pythonのライブラリは`close()`のみで`shutdown(); close();`をやってくれる
- しかもpythonではGCされるときに自動で`close`してくれる
    - しかし意図せずsocketが死ぬと相手がハングするかもしれないのでこれに頼り切らないほうが良い
   
## ノンブロッキングソケット
- `socket.setblocking(0)`とすればノンブロッキング
- ブロッキングソケットと異なるのは、send, recv, connect, acceptが何もしないで戻ってくる可能性がある
    - 選択肢1: 返り値とエラーをハンドリングする→発狂するらしい
    - 選択肢2: selectを使う
    - select.selectにsocketのリストを渡すと、読み/書き可能な状態のもののみ帰ってくるのでそれらを使って上記動詞を使えばいい

## 実装
せっかくなので実装もちらっと見てみた
https://github.com/python/cpython/blob/3.8/Lib/socket.py#L213
- with構文で使えばコンテキストを出ればcloseするようにかけるっぽい
- 人間が使う際は、SocketIOやcreate_serverを使うのが良いのだろう

## 感想
- もっと深く理解するにはINET, STREAM以外も見たほうが良い気がする
- 直接使うことは今後も無いだろうが、zmqはかなり良い抽象化だと実感できた
cloud9でlaravelの認証機能を実装後、LOGIN, REDISTERをクリックすると「Oops」となる

cloud9でlaravelの認証機能を実装し、LOGIN, REGISTERの動作確認をしようとしたところ
「Oops VFS connection does not exist」が表示されてしまう。

### 【試したこと】
- cloud9のワークスペース（インスタンス？）の再起動
- cloud9のワークスペースを削除して最初からやり直す

### 【解決方法】
以下のファイルにコードを追加。
/app/Providers/AppServiceProvider.php

```php

public function boot()
    {
        //以下を追記
        \URL::forceScheme('https');
    }
```
再度サーバーを起動して試したところLOGIN, REGISTERともに無事に遷移できました。
新卒２年目がJava Silver/Goldに2ヵ月で合格した話

#導入
こんにちは。けちょんです。
Java Silver/Goldに合格したので、嬉しくて記事を書きました。
これから受験する方の参考になれば、と思います。

#受験結果

##Java Silver
得点：88/100
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260518/2f5ddc6f-970a-e8ee-b832-689e5c90d903.png)



##Java Gold
得点：91/100
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260518/1ac04c61-b8aa-6e54-e46b-3b1f8f34c112.png)

#勉強開始時点の知識
業務でエンハンスは行っていたため、基本的なデータ構造や文法は分かる
ジェネリクス？ラムダ式？ストリーム？？何それな状態


#勉強時間
##Java Silver
勉強時間：約8時間
基礎知識は既に築かれていたため、演習問題2つとその復習に力を注いだ
また、Goldの勉強をしていれば割とカバーされる

##Java Gold
勉強時間：約70時間
ゼロベースから、広く深く知識を習得する必要があったため、時間を要した
特にラムダ式などは新しい概念となるため、習得に時間を要した

#スケジュール
1/24 勉強開始
2/8 Gold黒本の練習問題を読了
2/16 Gold白本の練習問題を読了
2/19 Silver白本の演習問題で8割獲得
3/1 Silver黒本の演習問題で9割獲得
3/4 Gold黒本の演習問題(巻末)で7.5割獲得
3/11 **Silver合格**
3/12 Gold白本の演習問題で8割獲得
3/16 Gold黒本の演習問題(ダウンロード版)で6.5割獲得
3/18 **Gold合格**

#教材
GoldとSilverでそれぞれJava8の黒本と白本を利用
Goldの黒本/白本についての所感は以下
（Silverはあまり覚えてないため省略します。。。）

##黒本
練習問題：とても簡単
演習問題(巻末)：普通
演習問題(ダウンロード版)：とても難しい

###練習問題
ジェネリクス？ラムダ式？ストリーム？？な人はまず黒本の練習問題を解くのががおすすめです。
一週目は問題よりも解説を読み込み基礎知識を得ながら、とにかく手を動かします。
手を動かすことで、知識が拡張されますし、記憶に定着されます。
また、初めて得た知識はすぐにアウトプットするのがおすすめです。
※Qiitaで記事にした内容は今でもよく覚えてます

###演習問題
白本の練習問題を解いた後に解くのがおすすめです。
個人的には試験と同じ環境（途中で調べてはいけない等）にする必要はないと思います。
なぜなら、答え合わせして、復習している頃には多くの疑問を忘れてしまうからです。
細かいことにこだわらず、より成長できる選択肢を選びましょう。
全ての疑問は発生した都度潰しましょう。
ちなみに演習問題(ダウンロード版)は**解く必要がありません**。
知識がマニアックで、実際の試験ではほとんど出題されませんでした。
可変リダクション操作が大好きな人は解くといいと思います。


##白本
練習問題：普通
演習問題(巻末)：少し難しい

###練習問題
黒本の練習問題を解き終えたら、白本の練習問題を解きましょう。
基礎知識をもちろん、出題範囲に幅広さがあります。
黒本より難易度が上がるため、黒本で自信がついてきた人はがっかりすると思います。
ここでも、とにかくコードを書くことが近道です。

###演習問題
ある程度実力がついてきたと思う方は、試験と同じ環境で解いてみましょう。
ここで合格点に届かない場合はコーディングが足りていないと思います。
不正解が多い分野を分析し、コードを書きましょう。

#それぞれ受験してみた感想
##Java Silver
業務で専門的にJavaを扱っているのであれば、合格できるレベルは必須だと思います。
もちろん通常業務で使用しない知識も多いですが、以下のような必須知識も多いです。
・「値渡し」と「参照渡し」の違い（正確にはJavaに参照渡しは存在しないようですが）
・StringとStringBuilderの違い
などなど

##Java Gold
業務で詳細設計も行っているのであれば、あった方が役立つと思うくらいです。必須ではありません。
純粋に知識量が増えることで、以下メリットがあると思います。
・最適なクラスやそのメソッドを選択できる
　例）Dateクラスではなく、Date And Time API
　　　ArrayListとLinkedListの最適な選択
　　　などなど
ラムダ式やストリームの問題が多数出題されますが、業務で安易に使用するのは可読性を損なう危険があり、避けるべきです。

#まとめ
色々書きましたが、知識量が格段に増えたので、取得して良かったと思います。
これからの時代、Javaはこれまでほど利用されなくなっていくかもしれません。
しかし、静的型付け言語を一つマスターするというのは非常に重要な礎となるはずです。
是非皆さんも受験してみてください。
SimpleSAMLPHPでIdPのログインページをカスタマイズする方法

#やりたいこと
SimpleSAMLPHPを使ってIdpを構築してSSOをやっているのですが
いざ、構築し終わったらデフォルトのログインページのまま

これではだめなので変えようとしたところ死ぬほど苦戦したのでメモ

#実現方法
デフォルトのログイン画面は

`modules/core/templates/loginuserpass.tpl.php`になります

こいつをオーバライドしてやる必要があるわけです。

SimpleSAMLPHPにはテーマ機能があって、すべての画面をカスタマイズできます。
しかしその情報が公式ドキュメントのみなので面倒です

[公式](https://simplesamlphp.org/docs/1.18/simplesamlphp-theming#section_1_1)の通りにディレクトリを作成します

```
cd modules
mkdir mymodule
cd mymodule
touch default-enable
cd modules/mymodule
mkdir -p themes/fancytheme
```

configの設定を変えます

```
'theme.use'         => 'mymodule:fancytheme',
```

公式の例3を確認すると

>たとえば、preprodwarningテンプレートを上書きするには（ファイルはにありますmodules/preprodwarning/templates/warning.php）、新しいファイルを追加する必要があります。

>modules/mymodule/themes/fancytheme/preprodwarning/warning.php
モジュールfoomoduleで言うと、bar.phpテンプレートを表示するいくつかのコード要求、SimpleSAMLphpは次のようになります。

>最初にテーマを確認して、代替品を探してくださいmodules/mymodule/themes/fancytheme/foomodule/bar.php。
見つからない場合、そのモジュールのベーステンプレートを使用します。 modules/foomodule/templates/bar.php

とあるので
`loginuserpass`をオーバーライドしたい場合
今回の場合`modules/mymodule/themes/fancytheme`に`core`ディレクトリを作成します。(core内のテンプレートのため)
そこに`loginuserpass.php`を作成してやれば上書きできます。
Next.jsをTypeSctiptで書いてnetlifyにデプロイする！

# 概要
Next.js（reactをssrしてくれるフレームワーク）をTypeScriptで構築して、netlifyでデプロイするまでのメモ

# Next.jsの構築
ここ見れば、localでTypeScriptでの準備まで書いてくれている。
https://nextjs.org/learn/excel/typescript/setup

# gitにコミット

```[.gitignore]
// .gitnignore
# next.js build output
.next
# dotenv environment variables file (build for Zeit Now)
.env
.env.build
# Dependency directories
node_modules/
# Logs
npm-debug.log*
yarn-debug.log*
yarn-error.log*
```

```_redirects
/*   /index.html   200
```

```[package.json]
...
"scripts": {
    "dev": "next",
    "build": "next build",
    "start": "next start",
    "export": "next export",
    "deploy": "npm run build && npm run export && cp _redirects out/_redirects"
 },
...
```

とりあえずリモートリポジトリをgitに作ってコミット

# netlifyの準備
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160041/62007eee-1a14-839d-6459-dca40d01acfa.png)
STM32 F1 Discoveryを使う。(Part1. 開発環境構築(TrueStudioインストール))

趣味で、マイコンF/Wを開発する予定があり、STM32 F1を使う予定があるので、
備忘録も兼ねて記事にします。

開発環境～デバッガの使い方等まで、纏めていけたらと思います。
今回は、TrueStudioのインストールまで。

## 用語説明
### ■STM32とは
下記サイトに、STM32についてわかりやすく説明されています。
[なぜSTM32?](http://miqn.net/%E3%81%AA%E3%81%9Cstm32/)

ざっくりいうと
・ARM系マイコン
・比較的安価に買える。
・ST-Link(デバッガ)搭載
・ARM系マイコンなので、CMSISの資産が使える
・開発環境が無償(ex:TrueStudioなど)

等の特徴があります。
数千円でデバッグ環境含めて構築できるので、個人ユースには超おすすめです。

### ■TrueStudio
STM32の開発環境のこと。無償で配布されているIDE


## 開発環境構築(TrueStudioインストール)

1. 下記サイトにアクセスします。
※Chromeだとダウンロード画面が表示されなかったので、出来ない場合は他ブラウザからアクセスなりを試みてください。
[TrueSTUDIO-Atollic](https://atollic.com/truestudio/)
![TRUESTUDIO.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605728/2e823a1b-5d93-51fb-f405-5f779349479e.png)

2. 下記画面から、対象のプラットフォームを選択します。
![WindowsInstaller.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605728/c7c348fc-29a5-fe23-e062-1f1798f889ca.png)

3. 登録画面が出てくるので、ユーザ登録します。
![登録.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605728/27e33516-dca8-cb97-2927-636f536e4fdf.png)

4. 最新のバージョンをクリックし、ダウンロードします。
![STM32.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605728/0b8eca0b-9f7d-fabf-3f29-c1a8c37e00ee.png)

5. Languageを日本語で選択します。
![Language.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605728/fe507ff6-0557-b21e-fad3-766a4179ce7e.png)

6. ようこそ画面が出てくるので、次へを選択します。
![ようこそ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605728/d4962fc4-3dc2-594e-13cc-5b28f73a1f27.png)

7. 同意するを選択。
![登録2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605728/13882d96-28dd-2efa-8b85-e8c8e31ab8d9.png)

8. 同意するを選択。
![登録3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605728/897f7d4f-c2d2-9c7d-9c82-3c51118bcd0c.png)

9.次へを選択。
![登録4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605728/d78262fa-7882-b9f5-1827-72090ff714a0.png)

10.次へを選択。
![登録5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605728/c65bbe9d-4b95-3426-c7b2-1896c1577741.png)

11.インストール完了まで待機。
![登録6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605728/eb67a65e-d88b-ae14-2ed8-c120a412b5c5.png)

12.インストールを選択。
![登録7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605728/3cf30fc5-a25b-856c-c52f-29eeac0925c5.png)

13.次へを選択。
![登録8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605728/c50c3a9e-884e-14f6-d7fb-ed0dfb522ebb.png)

14.次へを選択。
![登録9.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605728/406f3cfb-1bda-9b63-8046-6485ce5b0351.png)

15.完了を選択。以上で終わりです。
![登録10.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605728/341cb8da-c1c8-cc29-cc68-661ac81ee4d9.png)


先ずはインストールが完了したので、次回以降から、実際にTrueStudioを使ってみたい
と思います。
※本記事について、間違い等あれば、ご指摘を頂けると助かります。
JavaScriptで *タブ* を作成する方法 windowオブジェクト

## タブとは何か？

タブとはドキュメントを切り替えて表示するためのGUIウィジェットである。一般的には長方形のボックス中にテキストラベルを表示する形で画面上部に表示され、タブの選択により**管理するドキュメントを切り替えて表示させる**仕組みとなっている。

>wikipedia
https://ja.wikipedia.org/wiki/%E3%82%BF%E3%83%96_(GUI)

**<完成品>**
*タブが作成されます！*
<img width="314" alt="スクリーンショット 2020-03-20 0.40.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517237/ee489aa9-d7b5-d29c-ed2c-9e19a26032b6.png">
<img width="264" alt="スクリーンショット 2020-03-20 0.39.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517237/13372e51-a66d-a36c-53da-15f6d9b17dda.png">
<img width="239" alt="スクリーンショット 2020-03-20 0.40.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517237/3c6c45dc-e765-1dc5-51ed-f1a22ca6fd1c.png">



```html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>

<a href="javascript:window.open('sample2.html','','')">開く</a>

</body>
</html>
```

```html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div class="top">
        新しいウィンドウ
        <!-- !ウィンドウを閉じる -->
        <a href="javascript:window.close()">閉じる</a>
    </div>
    
</body>
</html>
```

なんとHTMLにワンライナーでの記述で完了です。
`<a>`タグに `javascript:window.open('sample2.html','','')`記述します。

<br>
`window.open`
**windowオブジェクトとはJavaScriptにあらかじめ用意されてるオブジェクトで、JavaScriptを何も書いてない状態でもwindowオブジェクトは利用する事が出来る。**
>windowオブジェクトについて
https://developer.mozilla.org/ja/docs/Web/API/Window
<br>

`('sample2.html','','')`
**1つめがファイル名、2つめがウィンドウ名、3つめがプロパティが入ります。**

簡単に記述できますね！
しかし、プライバシポリシー等で使用するケースは多いですよね！
是非開発の使ってみては？
Wordpressでカスタマイザーにオプションを追加する一番簡単な方法

カスタマイザーを使うことでロゴやヘッダー画像のアップロード、テーマカラーの設定などWordpressテーマの様々なオプション設定ができるようになる。

## カスタマイザーを作成する方法
functios.phpに以下のコードを追記する。

```php
function mytheme_customize_register( $wp_customize ) {
  // セクション（グループ）を作成
  $wp_customize->add_section( 'theme_color' , array(
		'title'      => __( 'Theme Color', 'text_domain' ),
		'priority'   => 21,
	) );
  // データベースに新しい設定項目を登録
	$wp_customize->add_setting( 'color_base' , array(
    'default'   => '#fff',
		'transport' => 'refresh',
		'sanitize_callback' => 'sanitize_hex_color',
	) );
  // 管理画面に表示するコントローラ（フォーム）を登録
	$wp_customize->add_control( new WP_Customize_Color_Control( $wp_customize, 'color_base', array(
		'label'      => __( 'Base Color', 'text_domain' ),
		'section'    => 'theme_color',
		'settings'   => 'color_base',
	) ) );

  // 画像のアップロードの場合
	$wp_customize->add_section( 'theme_image' , array(
		'title'      => __( 'Image', 'text_domain' ),
		'priority'   => 20,
	) );
	$wp_customize->add_setting( 'logo_upload' , array(
		'transport' => 'refresh',
		'sanitize_callback' => 'text_domain_sanitize_file',
	) );
	$wp_customize->add_control( new WP_Customize_Image_Control( $wp_customize, 'logo', array(
		'label'      => __( 'Upload a logo', 'text_domain' ),
		'section'    => 'theme_image',
		'settings'   => 'logo_upload',
	)));
}

// カラー設定をCSSで表示するための関数、wp_headで呼び出し
function header_output() {
	$color_base = get_theme_mod('color_base', '#fff');
	$css = '
	/**
	 * custom theme
	 */
	body { color: '.$color_base.'; }
	'
  ?>
	<style type="text/css">
		<?php echo $css; ?>
	</style>
	<?php
}
// 画像用サニタイザー、ファイルタイプをチェックする
function text_domain_sanitize_file( $file, $setting ) {
  //allowed file types
  $mimes = array(
    'jpg|jpeg|jpe' => 'image/jpeg',
    'gif'          => 'image/gif',
    'png'          => 'image/png'
  );
    
  //check file type from file name
  $file_ext = wp_check_filetype( $file, $mimes );
    
  //if file has a valid mime type return it, otherwise return default
  return ( $file_ext['ext'] ? $file : $setting->default );
}

// カスタマイザーの登録
add_action( 'customize_register', 'mytheme_customize_register' );

// headに設定したCSSを表示
add_action( 'wp_head' , 'header_output' );
```

カスタマイザーにオプションを登録するには以下の３つの設定を行う必要がある。

- section: オプションのグループを作る
- setting: オプションの設定をデータベースに登録
- control: オプションの表示（フォームやラベルなど）を設定

コードを追記してカスタマイザーを表示すると、画像のように項目が追加される。

<img width="425" alt="customizer.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549249/c2efb167-6b26-61d2-48ce-0d3011b5bc26.png">



## カスタマイザーのデータをテンプレートに表示する方法
上記のコードの場合、headで出力するものはアクションの登録で自動的に表示される。

画像はアップロードしたデータをテンプレート側で取得して表示する必要がある。

取得方法は、`get_theme_mod()`で登録した設定名を指定するだけ。

```php
<?php if( get_theme_mod('logo_upload') ): ?>
  <h1><img src="<?php echo get_theme_mod('logo_upload'); ?>" alt="logo"></h1>
<?php endif; ?>
```
自動デプロイ

ローカル環境% bundle exec cap prodcution　deploy

Stage not set, please call something such as `cap production deploy`, where production is a stage you have defined.

自動デプロイが成功した後、アセットコンパイルを実行したら、上のエラーが出た。
参考にしたサイト
http://akishin.hatenablog.jp/entry/20140511/1399807279

# vi Capfile　の末尾に追記
Rake::Task[:production].invoke
invoke :production

ローカルでbundle exec cap deployすれば自動デプロイする

ただアセットコンパイルができないまま、チーム開発なので明日までには自動デプロイできるようにする。だいぶ足を引っ張ってる！
PHP 配列に連想配列を入れたものをforeach文で出力する

# 目的

- 下記の記事で配列に連想配列を入れることをまとめた、その応用として配列の中身をforeach文で出力する方法をまとめる
    - [PHP 配列に連想配列を入れる](https://qiita.com/miriwo/items/83e03aa66ea7aa86da35)


# 実施環境

- MacOS上のローカル環境にテスト用スクリプトファイルを作成してVisual Studio Codeのデバッグを用いて結果を確認した。
- 下記にVisual Studio CodeでPHPのデバッグ環境を構築する際の手順をまとめた記事へのリンクを記載する。
    - [https://qiita.com/miriwo/items/e0a41308e042e34ebf78](https://qiita.com/miriwo/items/6edd6e1817def4fc11d5)
- 下記に実施環境の詳細な情報を記載する。

| 項目 | 情報 |
| --- | --- |
| OS | macOS Catalina(10.15.3) |
| ハードウェア | MacBook  Air (11-inch ,2012) |
| プロセッサ | 1.7 GHz デュアルコアIntel Core i5 |
| メモリ | 8 GB 1600 MHz DDR3 |
| グラフィックス | Intel HD Graphics 4000 1536 MB |

# 書き方の例(連想配列のキーを出力しない)

- 下記に配列に連想配列を入れたものを定義し、foreach文で配列の中の要素がある分だけ繰り返す処理を記載する。
- 配列のインデックスが0の連想配列には'num1' => 10, 'num2' => 20, 'num3' => 30を格納する。
- 配列のインデックスが1の連想配列には'num1' => 40, 'num2' => 50, 'num3' => 60を格納する。
- 配列のインデックスが2の連想配列には'num1' => 70, 'num2' => 80, 'num3' => 90を格納する。

    ```php
    # 配列の中にインデックス0の連想配列を格納する
    $data = [
        [
            'num1' => 10,
            'num2' => 20,
            'num3' => 30
        ]
    ];

    # 配列の末尾に連想配列を追加する(インデックス1の追加)
    array_push($data, [
            'num1' => 40,
            'num2' => 50,
            'num3' => 60
        ]);

    # 配列の末尾に連想配列を追加する(インデックス2の追加)
    array_push($data, [
            'num1' => 70,
            'num2' => 80,
            'num3' => 90
        ]);
    ];

    # 配列のインデックス0の内容から順に$datumに格納される。
    # $dataの内容は連想配列なので出力時は連想配列のそれと同じく、連想配列名('キー名')で出力できる。
    foreach ($data as $datum){
        echo $datum['num1'];
        echo '/';
        echo $datum['num2'];
        echo '/';
        echo $datum['num3'];
        echo '///';
    }
    ```
【プログラミング言語】使い手 呼び名リスト

プログラミング言語の使い手の呼び名を集めれるだけ集めました。使われてるかよくよくわからないものも含まれているので、使う際はあくまで自己責任でオナシャス( ˘ω˘ )ｽﾔｧ… 

※アルファベット順

#C
* C-man（シーマン）

#C Sharp
* C#er（シーシャーパー）

#C++
* C++er（シープラプラー）

#COBOL
* COBOLer（コボラー）

#Flash
* Flasher（フラッシャー）

#GO
* Gopher（ゴーファー）

#Haskell
* Haskeller（ハスケラー）

#JAVA
* JAVAer（ジャバー）
* Java屋
* Javaヤー

#JavaScript
* JavaScripter（ジャバスクリプター）
* JSer（ジェイサー）

#Julia
* Juliana（ジュリアナ）

#Kotlin
* Kotliner（コトリナー）

#node
* noder（ノーダー）

#LISP
* LISPer（リスパー）

#Objective-C
* Objective-C-man（オブジェクトシーマン）

#Perl
* Perler（パーラー）
* Perl Monger（パール・モンガー）

#PHP
* PHPer（ペチパー）

#Python
* Pythonista（パイソニスタ）
* Pythonian（パイソニアン）
* Pythonist（パイソニスト）
* Pythoner（パイソナー）

#Ruby
* Rubyist（ルビイスト）

#Rails
* Railser（レイルザー）

#Salesforce/APEX
* Trailblazer（トレイルブレイザー）

#Scala
* Scalalian（スカラリアン）
* Scalman（スカルマン）

#Swift
* Swift屋
* Swiftヤー

#TypeScript
* TypeScripter（タイプスクリプター）

#Unity
* Unityist（ユニティスト）

#.NET
* .NETer（ドットネット）

以上！！
WSL2 の Ubuntu 18.04 で Xpra3 を使う

# 目的

IntelliJ IDEA を WSL2 で使いたいのだけどWindows版から WSL2 の Ubuntu 18.04 のファイルシステムにうまくアクセスできず結局 Linux 版を WSL2 で動かすのが手っ取り早い。ところが、WSL2からWindowsで動くXサーバ(X410等)に接続している状態でマシンがスリープするとウインドウだけ消えてしまうという問題がある (https://x410.dev/cookbook/wsl/using-x410-with-wsl2/ の一番下)。 

xrdp と mstsc で繋ぐ方法もあるが一部のショートカットキー (ctrl-alt-左右 とか) がmstscに横取りされて使えない等で不便。

そこで X の tmux のような Xpra を使いたいが apt でそのまま入れても動かずまたバージョンもちょっと古かったので Xpra 3 を入れて動かす。

# Xpra3のインストール

 https://xpra.org/trac/wiki/Download#Linux の一番下にあるように以下を実行して Xpra 3 をインストール。

```sh
wget -q https://xpra.org/gpg.asc -O- | sudo apt-key add -
sudo add-apt-repository "deb https://xpra.org/ bionic main"
sudo apt-get install xpra
```

そのまま実行してもエラーになるので以下を実行

```sh
sudo mkdir /run/user/$(id -u)
sudo chown $USER /run/user/$(id -u)
```

# 実行

```sh
xpra start :100 --start=lxterminal
xpra attach
```

# 接続が切れたら

もう一度

```sh
xpra attach
```
NestJSで特定のサービスのメソッドを直接実行する

NestJSをLambdaでホストしているとき、特定のサービスのメソッドをダイレクトに実行したい場合があります。

例：cronジョブをCloudWatch Event -> Lambdaで実行する

そういう時はこんな感じのhandlerを作ればOKです。

```typescript
import {
    NestFactory
} from '@nestjs/core'
import { Handler } from 'aws-lambda'

// 実行したいサービスのあるモジュール
import {
    SiteModule
} from './site.module'

// 実行したいサービス
import { 
    SiteService
} from './site.service'

export const handler: Handler = async (event) => {
    // Create NestJS application
    const app = await NestFactory.create(SiteModule)

    // Resolve Dependencies
    const service = await app.resolve(SiteService)

    // Execute method
    const result = await service.listSite(event.username)
    return result
  };

```

## NestJSをLambdaでってどうなの？

パフォーマンス期待するならやめた方がいいと思います。
Fargateとかその辺覚える労力より先にNestJS使いこなせるようになりたい目的でLambdaに載せてるだけなので・・・

ただ、この記事のような形で、すでに動かしているNestJSアプリケーションの実装を使ったバッチ処理をLambdaにやらせるのはありかもしれません。
ジョブのリトライとか通知とかその辺りの便利機能がLambdaにはありますし、バッチ系なら多少立ち上がりが遅くても問題ないですし。
【UiPath】PostgreSQLと接続しクエリを実行する

# この記事はなにか

UiPathをPostgreSQLに接続し、そのデータをEXCELに出力させる方法を書いています。
PostgreSQLについては日本語でまとまったものがなかったので簡単に。

# バージョン情報

- Windows10 home
- UiPath Studio 2020.2.0-beta.108 Community License
- PostgreSQL ver.12 (今回はherokuのDBを使用)

既にUiPathはダウンロードしており、PostgreSQLは接続情報がわかっているものとします。

# 手順&イメージ

大まかな手順は以下の通り。

1. PostgreSQL ODBC driverをダウンロード&インストール
2. ODBCデータソースアドミニストレーター設定
3. UiPathに接続&クエリ実行
4. 【おまけ】実行したクエリをEXCELに貼り付ける

シーケンスはこんなイメージです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224314/1256e098-899f-01da-b386-ba3de6b9d7fc.png)

## 手順1.PostgreSQL ODBC driverをダウンロード&インストール

こちらのサイトよりODBCドライバをインストールします。
<https://odbc.postgresql.org/>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224314/995cff5e-4a38-9818-2bf6-632ed45f1a17.png)

ダウンロードしたファイルを解凍し、実行してインストールします。

## 手順2.ODBCデータソースアドミニストレーター設定

コントロールパネル⇒システムとセキュリティ⇒管理ツールに進み、以下の通り設定します。
ポイントは**ODBC Data Sourse(32-bit)**を選択することです。**32bit**です！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224314/f82fbb9f-afc4-a6ec-bf2b-4e8a10120d7e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224314/bee6de17-18ef-a7ea-a1d8-24e8f89c3867.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224314/99bb1428-75e4-f6be-f6d4-98b3af9da29b.png)

## 手順3.UiPathに接続&クエリ実行！ 

まず、必要なアクティビティ「UiPath.Database.Activities」をインストールします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224314/0b4edeb7-fd23-cc6a-af72-94bb0d393cbf.png)

先述してますが、シーケンスをこんな感じで組み立てます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224314/1256e098-899f-01da-b386-ba3de6b9d7fc.png)

実行したクエリを入れる変数を作ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224314/08ce04bd-f9ad-77fb-2423-0c0afb765fa2.png)

「クエリを実行」の「接続を構成」⇒「接続ウィザード」をクリックして必要情報を入力します。
ポイントは`Data Source`は`Microsoft ODBC Data Source`を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224314/3208697e-bf3d-4e2f-a618-c8de3b8f9a9b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224314/23532ee7-37af-109b-ffde-7ab197fcde43.png)

そうすると、左のように設定されているかと思います。
`プロバイダー名`が`System.Data.Odbc`になってなかったらそうしましょう。
プロパティにSQLとデータテーブルの設定もお忘れなく。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224314/bd9c424a-91be-1dcd-5001-78193cee458f.png)

## 手順4. 【おまけ】実行したクエリをEXCELに貼り付ける

せっかくですので、実行したクエリの情報を入れる任意のファイル（EXCEL）を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224314/b43f8e49-8212-f982-ea69-6f5b1de156ce.png)

さあ、デバックしてみましょう！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224314/25207e14-5cd5-ea42-19e0-65376a63734a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224314/d3cefb5a-59d0-8e0e-a0b6-7b2946abf4e6.png)

できていますね！

# 参考

[【UiPath】ODBC接続でMySQLに接続してクエリを発行するまで](https://uipath.site/blog/odbcconnect.html)
Autosar errata, AUTOSAR(9)

Autosar erratta

<この項は描きかけです。順序築城します。>

Autosar list of reference, abbreviation and term.(48-94/237): English(40c)
https://qiita.com/kaizen_nagoya/items/619a7a83cd153e31af18
# 52 Requirements on Time Synchronization
https://www.autosar.org/fileadmin/standards/foundation/19-11/AUTOSAR_RS_TimeSync.pdf

## 3 Acronyms and abbreviations

| Abbreviation / Acronym | Description |G/B|
|:--|:--|:--|
| StbM | (Global) Time Domain |bad|
| StbM | Synchronized Time-Base Manager |good|

Autosar list of reference, abbreviation and term.(1-47/237): English(40d)
https://qiita.com/kaizen_nagoya/items/10b0fe6530bacdf376f9

# 25 Time Synchronization Protocol Specification

https://www.autosar.org/fileadmin/standards/foundation/19-11/AUTOSAR_PRS_TimeSyncProtocol.pdf
## 4 4.1 Definition of terms and acronyms Acronyms and abbreviations

| Abbreviation / Acronym | Description |G/B|
|:--|:--|:--|
| StbM | (Global) Time Domain |bad|
| StbM | Synchronized Time-Base Manager |good|


# reference

Autosar list of reference, abbreviation and term.(141-190/237): English(40a)

https://qiita.com/kaizen_nagoya/items/3161832363290ee75800

#190 Specification of Synchronized Time-Base Manager
AUTOSAR_SWS_SynchronizedTimeBaseManager.pdf
##2.1 AcronymsandAbbreviations

| Abbreviation / Acronym | Description |
|:--|:--|
| StbM | Synchronized Time-Base Manager |

＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞


# Countdown Calendar 2022

今年企画した6つのCountdown Calendarと、それぞれの記事一つをご紹介します。

AUTOSAR Countdown Calendar 2022

https://qiita.com/advent-calendar/2022/autosar

AUTOSAR References to ISO, IEC, ITU, IEEE, RFC and SEA etc.

https://qiita.com/kaizen_nagoya/items/d7d252211e10a79516df

Automotive Handbook Countdown Calendar 2022

https://qiita.com/advent-calendar/2022/automotivehandbook

Basic principles, ボッシュ自動車handbook(英語)11版まとめ<2>

https://qiita.com/kaizen_nagoya/items/24a1ba5da3d09b2a95d1


2022 いいねをいただいた記事ランキング(O.K.版) Countdown Calendar 2022

https://qiita.com/advent-calendar/2022/goods

2022年１月下旬　いいねをいただいた記事　16

https://qiita.com/kaizen_nagoya/items/0ee589a8edaeab24fd2a

AdCale(O.K.) Countdown Calendar 2022

https://qiita.com/advent-calendar/2022/adventcalendar2022

「会議は15分未満」に。小耳にはさんだ話。

https://qiita.com/kaizen_nagoya/items/510c47c5d1e8d03145db

ABC language (O.K.版） Advent Calendar 2022

https://qiita.com/advent-calendar/2022/abc_ok

LLVMソースコードのコンパイルをしようと思ってハマった罠とそこから脱出するための努力

https://qiita.com/kaizen_nagoya/items/16f270e42b947756ced3

ABC maker(O.K版） Advent Calendar 2022

https://qiita.com/advent-calendar/2022/abcmaker

JAXA/IPA クリティカルソフトウェアワークショップ WOCS言語関連発表(改定版)

https://qiita.com/kaizen_nagoya/items/4789832baf494cb74626

CountdownCalendar2022 報告

https://qiita.com/kaizen_nagoya/items/5b4b99cb9ad571f4094b

誤差の評価が苦手（専門分野以外）

https://qiita.com/kaizen_nagoya/items/cc3a50827b24ab80985f


# 文書履歴(document history)
ver. 0.01 初稿 20221229
### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

### Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
コロナウイルスの拡散シミュレーション

#ウイルス拡散シミュレーション
コロナウイルスの収束時期を予測するために、感染が拡大していく様子をシミュレーションするプログラムをMATLABで作ってみました。[ソースコード](https://github.com/higotakayuki/COVID-19/blob/master/simulation.m)を公開しています。下に示すアニメーションgifは実行例で、それぞれの図の意味は次のとおりです。
・左の図：青が未感染で、黄色が回復（抗体獲得済み）
・真ん中の図：黄色が保菌者、青がそれ以外
・右側の図：保菌者の数（保菌者が増え過ぎると、医療現場がパンクのおそれあり）
![anim2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13548/84802f46-7bb2-53a6-d56a-f54adeedff8f.gif)


#シミュレーションの概要
まず、このシミュレーションの時間単位は日です。つまり、１ステップで１日が経過します。次に、300×300の格子を考え、各格子点で人を表します。各人は、上下左右と斜めの人（合計8人）と接触しています。保菌者と接触している人は、一定の確率で接触した保菌者からウイルスが移り感染します。保菌者は、規定の日数が経過すると、回復します。回復した人は抗体を獲得し、二度と感染しません。各パラメータは、次のように設定しました。
・感染確率：3%（１日あたり3%の確率で、接触した保菌者から感染）
・回復までの経過日数：10日

#実装方法
このシミュレーションの実装方法を説明します。まず、各格子点（人）の状態を表すために、300×300の配列（9万人分）を用います。配列は整数を格納し、値が0の場合、その人は未感染であることを示します。感染すると、この値を1とします。感染後は、1日経過するごとに、この値を１ずつ増やします。ただし、10（回復までの経過日数）になったら、それ以上は増やしません。そして、値が10の場合、その人は回復して抗体を獲得した人であることを示します。一方で、値が1以上9以下の場合は保菌者であり、接触する未感染者に感染確率に従いウイルスを移します。この配列は、一度にすべての値を更新します。

#補足（境界条件）
全員が未感染ですと誰も感染しません。そこで、中央に一人感染者を配置します。この人は回復しないことにします。また、格子の最外周の人は感染しないことにします。そうすると、プログラムが簡単になります（番兵というテクニックですね）。

#所感
このシミュレーションは、すべての人は8人と接触することを仮定しており、また、感染確率と経過日数もいい加減な値です。このため、どの程度、現実的かは不明です。しかし、このシミュレーションが示すことの一つは、感染が拡大していく条件下では、ウイルス拡散の収束には年単位の時間が必要な可能性です。ということで、この騒動が収束するには、もう少し時間を要するのかもしれません。あるいは、ある気象条件下で、ウイルスが一気に不活性化するといったことも考えられますが。

#移植
MATLABで実装したため、動かせる人が限られます。接触者数等のパラメータを変えた挙動の分析をして欲しいと考えており、このためにPythonやJuliaに移植してもらえると嬉しいです。GPUを使うことで高速に計算できるので、GPUプログラミングの練習にもなると思います。
【now】ApolloServerを無料でサーバにデプロイする

## 概要

- ApolloServerで作ったGraphQLサーバをどこかにデプロイしたい！と思って調べた手順です
- [now](http://now.sh/)を使えば実現することができました

## サンプル用ApolloServer作成

- デプロイするための最小のApolloServerを作ります

```sh
mkdir apollo-server-sample
cd apollo-server-sample
yarn init -y
yarn add apollo-server graphql
```

- index.jsを作成します
    - 公式のサンプルを拝借

```js:index.js
const { ApolloServer, gql } = require('apollo-server');

const books = [
  { title: 'Harry Potter and the Chamber of Secrets', author: 'J.K. Rowling' },
  { title: 'Jurassic Park', author: 'Michael Crichton' },
];

const typeDefs = gql`
  type Query {
    books: [Book]
  }
  type Book {
    title: String
    author: String
  }
`;

const resolvers = {
  Query: {
    books: () => books,
  },
};

const server = new ApolloServer({ typeDefs, resolvers, cors: true });

server.listen().then(({ url }) => {
  console.log(`🚀  Server ready at ${url}`);
});
```

- package.jsonの`scripts`に起動コマンドを追加します

```json:package.json
{
  "name": "apollo-server-sample",
  "version": "1.0.0",
  "main": "index.js",
  "license": "MIT",
  "dependencies": {
    "apollo-server": "^2.11.0",
    "graphql": "^14.6.0"
  },
  "scripts": {
    "start": "node index.js"
  }
}
```

- `yarn start`で起動すると http://localhost:4000 でPlaygroundを確認できるはずです

## nowのセッティング

- now.jsonを作成します

```json:now.json
{
  "version": 2,
  "builds": [{ "src": "index.js", "use": "@now/node" }],
  "routes": [{ "src": ".*", "dest": "index.js" }]
}
```

- nowのcliをインストール

```sh
# 執筆時点ではバグがあるため@canaryで最新版をインストールしている
npm i -g now@canary
```

- nowにログイン

```sh
now login
```

- メールアドレスを入力しメールが来るのでVerifyする

## デプロイ

### dev環境へのデプロイ

- Playgroundが動いてほしいのでNODE_ENVにdevelopmentを指定

```sh
now -e NODE_ENV=development
```

- いろいろきかれますがエンター連打でOK
- 完了するとURLが表示されます
    - アクセスしてPlaygroundが表示されればOK
    - clientから叩いてもちゃんと動作するはずです

### prod環境へデプロイ

```sh
now --prod
```

- こちらも完了するとURLが表示されます
    - prodなのでPlaygroundは表示されません
    - clientから叩けばちゃんと動作するはずです

## まとめ

- now便利だけどサーバもデプロイできるとは知らなかった!
- 簡単にデプロイできて便利！

## おまけ

- [ポケモンのGraphQLサーバ](https://github.com/ozaki25/graphql-pokemon)をフォークして日本語化したものをデプロイしてみました
    - https://graphql-pokemon-oz.ozaki25.now.sh/
(随時更新) Ubuntuで発生するIntel GPUによるハードウェアアクセラレーションの不具合への対処法メモ

Ubuntu17からIntel CPUに搭載のGPUによるハードウェアアクセラレーションに対応しました。結果として動画再生などが以前よりスムーズに行える様になった様です。しかし、一部のアプリケーションのWindowではブラインドの様な横線が大量に入り、実用に耐えません。故に不具合を見つける度に対処方法を追記していこうと思います。

参考: [Ubuntu 17.10 その89](https://kledgeb.blogspot.com/2017/10/ubuntu-1710-89-intel-gpu.html)

# Google Chrome
通常のウィンドウは正常に表示されます。しかし、動作が伴うメニューウィンドウでは横線が大量に表示されてしまい、実用に耐えません。

## 実際の症状

![chrome_screen_before.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469079/4555513e-3ff2-669f-8a79-19ccaa289ff6.png)

## 対処方法

設定画面を起動し、詳細設定のシステム項で`ハードウェアアクセラレーションが使用可能な場合は使用する`を無効化する。

![chrome_settings.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469079/8fa7ce46-002c-a770-5a34-c0816569b68b.png)

### 対処後

![chrome_screen_after.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469079/60cd96b3-8a12-9923-5ff5-b583663424f7.png)


参考: [Google Chromeの表示不具合が起きた時の対処方法（Ver.59以降）](https://pc-tech.info/posts/748)

# Visual Studio Code
通常のウィンドウは正常に表示されます。ここでも動作が伴うメニューウィンドウが駄目です。

## 実際の症状

![vscode_before.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469079/5e8af472-79fb-f51d-e1b9-2042ec7d9dc1.png)


## 対処方法

### CLIの場合
Aliasを利用してハードウェアアクセラレーションを無効化したコマンドを登録します。

```bash

alias code='code --disable-gpu .`
```

### GUIの場合

`/usr/share/applications/code.desktop`を以下の様に編集

```diff:5行目
- Exec=/usr/share/code/code --no-sandbox --unity-launch %F
+ Exec=/usr/share/code/code --no-sandbox --unity-launch %F --disalbe-gpu %U
```
```diff:19行目
- Exec=/usr/share/code/code --no-sandbox --new-window %F
+ Exec=/usr/share/code/code --no-sandbox --new-window %F --disable-gpu %U
```

### 対処後

![vscode_afeter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469079/633b0cb3-b1c4-f448-99e0-0ca90a10e9be.png)

参考: [VS codeで表示がおかしい](https://banikojp.blogspot.com/2017/04/vs-code.html)
機種選びの要点

機種選びの要点

#中央処理装置（CPU: central processor unit)
## 設計・製造元
インテルCPUか、AMDか、ARMか。

## bit数
64bit CPU。64bit以外は、32bitOSと32bitアプリを動作させることが必須の場合だけ。

## コア数
4に対応した機能が、普及しつつあるかも。
dockerで、利用するCPUの設定ができれば。

#主記憶装置(memory)
8GB.開発に使うなら16GB. Autoware は32GB必要らしい。


#補助記録装置(disk)
外付けHDDが1TBでもそこそこの値段なので、最悪、外付け頼りにしてもよい。

# 画面(display)
13インチ、15インチ、21インチ、、

#基本ソフト(OS:operating system)
Windows, MacOS, Linux(Android)の３択。
Mac系でも、Windows, Linuxだけで使うことも可能。


#同梱ソフト
WindowsであればOffice同梱がいいか、Office365契約しているかで選択。

#保証
１年、３年、５年。
メーカ保証、販売店保証
#販売店
メーカー直販（店舗・ネット）
販売店（店舗・ネット）

# surface pro7

3/27 (金) に再入荷予定 - Surface Pro 7 - プラチナ、Intel Core i3、4GB、128GB
98780
https://www.microsoft.com/ja-jp/store/build/Microsoft-Store-限定-Surface-Pro-7-お得なまとめ買い/8Z0XL3GFWGQN?icid=pro7_abb1_essentialbundle_191023

Surface Pro 7
メモリーは4GBでストレージ容量は128GB。
https://kakaku.com/item/K0001196964/?lid=pc_ksearch_kakakuitem
¥89,360


OS種類：Windows 10 Home 64bit 画面サイズ：12.3インチ CPU：Core i5 1035G4/1.1GHz ストレージ容量：128GB
QWU-00006
https://kakaku.com/item/K0001229653/spec/?lid=spec_anchorlink_details#tab


# mac book pro

https://www.apple.com/macbook-pro-13/
https://www.apple.com/jp/shop/buy-mac/macbook-pro/13インチ


https://www.apple.com/jp_edu_1460/shop/buy-mac/macbook-pro/13インチ-シルバー-1.4ghzクアッドコアプロセッサ（turbo-boost使用時最大3.9ghz）-128gb#
¥159800
¥147,800
【今日のアブストラクト】SelectiveNet: A Deep Neural Network with an Integrated Reject Option【論文 DeepL 翻訳】

1 日 1 回 (努力目標) 論文の Abstract を DeepL 翻訳の力を借りて読んでいきます.

この記事は自分用のメモみたいなものです.
ほぼ DeepL 翻訳でお送りします.
間違いがあれば指摘していだだけると嬉しいです.

翻訳元
[SelectiveNet: A Deep Neural Network with an Integrated Reject Option](https://arxiv.org/abs/1901.09192)

# Abstract

### 訳文

ディープニューラルネットワークにおける選択的予測 (リジェクトオプションとも呼ばれる) の問題を考察し, リジェクトオプションを統合したディープニューラルアーキテクチャである SelectiveNet を導入する. 既存の拒否メカニズムは, ほとんどが事前学習されたネットワークの予測信頼度を超える閾値に基づいている. 対照的に, SelectiveNet は, 分類 (または回帰) と拒否の両方を同時にエンドツーエンドで最適化するように訓練されている. その結果、カバーされたドメインに最適化されたディープニューラルネットワークが実現する. 我々の実験では, いくつかのよく知られた分類・回帰データセットに対して, 一貫してリスクカバレッジのトレードオフが改善されていることを示し, 深層選択的分類のための新たな最先端の結果に到達した.


### 原文

We consider the problem of selective prediction (also known as reject option) in deep neural networks, and introduce SelectiveNet, a deep neural architecture with an integrated reject option. Existing rejection mechanisms are based mostly on a threshold over the prediction confidence of a pre-trained network. In contrast, SelectiveNet is trained to optimize both classification (or regression) and rejection simultaneously, end-to-end. The result is a deep neural network that is optimized over the covered domain. In our experiments, we show a consistently improved risk-coverage trade-off over several well-known classification and regression datasets, thus reaching new state-of-the-art results for deep selective classification.
Heroku MySQLのデータベースから持ってきた日本語が文字化けする

## 3行で

- ClearDBのアドオンでMySQLを使う
- [Heroku公式のやり方でMySQLからデータを持ってくる](https://devcenter.heroku.com/articles/cleardb#using-cleardb-with-php)
- 文字コードを指定する

## 環境

PHP, Heroku, ClearDB, Mac

## 文字化け

HerokuとMySQLを同期するやり方は割愛。
[Heroku公式のやり方で](https://devcenter.heroku.com/articles/cleardb#using-cleardb-with-php)を参考にMySQLからデータを持ってくる。

```php
<?php
$url = parse_url(getenv("CLEARDB_DATABASE_URL"));

$server = $url["host"];
$username = $url["user"];
$password = $url["pass"];
$db = substr($url["path"], 1);

$conn = new mysqli($server, $username, $password, $db);
?>
```

原則ここに書いてある内容はいじらなくてよい。
例えばカッコの中身をデータベース名やユーザー名に変える必要はない。
しかしこの形でデータベースから日本語のデータを持ってくると**『?????』** といった形で出力されてしまう。

[Heroku＋ClearDBで文字化けしていた件](https://omiend.hatenablog.jp/entry/2015/02/17/211134)

これでイケるかと思ったけどダメだった。

## 解決

```php
$conn = new mysqli($server, $username, $password, $db);
$conn->set_charset('utf8');
```

文字コードを指定してあげる。これだけ。
教えていただいて解決したんですが、これを参考にするべきだったのかも。

**mysqli::set_charset - PHP.net**
<https://www.php.net/manual/ja/mysqlinfo.concepts.charset.php>
インクリメンタルサーチで追加済みユーザーが検索されないようにする

## 目的
チャットアプリのグループメンバー追加ページを以下の仕様で作成する。
- インクリメンタルサーチでメンバー検索をして登録リストに表示
- 登録リストに表示されたメンバーを登録ボタンで追加リストに登録
- 登録されたメンバーは登録リストに表示されない

## 問題点
登録されたメンバーが登録リストに表示されてしまう。

## 考え方
検索されたメンバーのIDが追加リストに登録されたメンバーのIDと重複しない場合のみ表示させれば良い。

## コード
```javascript:before.js
users.forEach(function (user) {
  if (user.id) {
    addUser(user);
  }
})
```
```javascript:after.js
users.forEach(function (user) {
  let idNum = document.getElementById(user.id);
  if (user.id && !idNum) {
    addUser(user);
  }
})
```
Twitterカードのimageは同じドメインで

# はじめに
twitterでOGPを設定していたときに、画像が表示されないことがあったので、その理由と対処法

# twitter:img
metaタグにtwitter:imageを設定するのですが、その設定にCDNのURLを入れたときに表示されなかった。
理由は同じドメインのURLじゃないとだめみたい。

```html
<meta
  name="twitter:image"
  content="" // ここです。同じドメインのURLを書きましょう
/>
```
Golang ~map~【Golangをイマサラ学び始めた】

## Mapとは
**キー**と**値**を組み合わせたデータ構造
RubyでいうところのHashみたいなところか…？って認識

## Mapの作り方
空のMapの作り方 その1

```go
import ("fmt")

func main() {
var m map[string]int = map[string]int{}
fmt.Println(m)
}
```

実行結果

```go
map[]
```

空のMapの作り方 その2

```go
import ("fmt")

func main() {
m := map[string]int{}
fmt.Println(m)
```

実行結果

```go
map[]
```

空のMapの作り方 その3

```go
import ("fmt")

func main() {
m := make(map[string]int)
fmt.Println(m)
}
```

実行結果

```go
map[]
```

## 中身のあるMapの作り方
中身のあるMapの作り方

```go
import ("fmt")

func main() {
var m map[string]int = map[string]int{"hoge": 10, "fuga": 20, "piyo": 30}
fmt.Println(m)
}
```


- キーと値をコロン`:`で繋いであげればOK
- 要素の間にはカンマ`,`忘れずに入れてあげる

```go
import ("fmt")

func main() {
var m map[string]int = map[string]int{
     "hoge": 10, 
     "fuga": 20, 
     "piyo": 30,
}
fmt.Println(m)
}
```

改行するとこんな感じ
**最後の要素にカンマ`,`入れないといけないのだけ注意**



実行結果

```go
map[fuga:20 hoge:10 piyo:30]
```

中身のあるのMapの作り方 その2

```go
import ("fmt")

func main() {
m := map[string]string{
	"hoge": "hogehoge",
	"fuga": "fugafuga",
	"piyo": "piyopiyo",
}
fmt.Println(m)
}
```

実行結果

```go
map[fuga:fugafuga hoge:hogehoge piyo:piyopiyo]
```

## 存在するMapに要素を追加する時
```go
import ("fmt")

func main() {
m := map[string]int {
	"hoge": 10,
   }
}
```

`m`に要素を追加したいときは

```go
m["fuga"] = 20
m["piyo"] = 30
```

という感じで追加できる

### make()で作ったMapに要素を追加する

```go
m := make(map[string]int)
m["hoge"] = 10
m["fuga"] = 20

fmt.Println(m)
```

実行結果

```go
map[fuga:20 hoge:10]
```

## Mapの並び順（バージョン1.12以降）
1.11までは、生成順で表示されていまいしたが
1.12以降はキー順で返されるようになりました

例 1.11まで

```go
import ("fmt")

func main() {
m := map[string]string{
	"hoge": "hogehoge",
	"fuga": "fugafuga",
	"piyo": "piyopiyo",
}
fmt.Println(m)
}
```

実行結果

```go
map[hoge:hogehoge fuga:fugafuga piyo:piyopiyo]
```

例 1.12以降

```go
import ("fmt")

func main() {
m := map[string]string{
	"hoge": "hogehoge",
	"fuga": "fugafuga",
	"piyo": "piyopiyo",
}
fmt.Println(m)
}
```

実行結果

```go
map[fuga:fugafuga hoge:hogehoge piyo:piyopiyo]
```

#### 参考

- [Go 1.12 Release Notes](https://tip.golang.org/doc/go1.12#fmt)
GitHubでコントリビュートするときにするGitリモート設定の覚え書き

GitHubでコントリビュートするときにフォークしたリポジトリを最新のmasterに合わせるやり方を忘れるので覚え書きとして書いておきます。

## フォーク元のリポジトリで作業するとき

一般的な方式です。

```sh
# フォークしたリポジトリをものをローカルに落とす
git clone git@github.com:lighttiger2505/session.vim.git
# 親のリポジトリを上流としてリモート登録
git remote add upstream https://github.com/dareka/sugoino.git
# 親のリポジトリの変更を取得
git fetch upstream
# フォークのmasterに親リポジトリの変更をマージ
git merge upstream/master
```

## フォーク先のリポジトリで作業するとき

親リポジトリのパスを変えたくないときに使います。Golangはパスが依存していたりするのでこうします。go modを使えば良い気がするけど、未だによくわかってない。

```sh
# 親のリポジトリをローカルに落とす
git clone https://github.com/dareka/sugoino.git
# フォークしたリポジトリを下流としてリモート登録
git remote add downstream git@github.com:lighttiger2505/typo.git
# フォークしたリポジトリをチェックアウト
git checkout downstream/master
# 親リポジトリの変更を取得
git fetch origin
# フォークのmasterに親リポジトリの変更をマージ
git merge upstream/master
```