OmniAICreator/Qiita-1.07M huggingface dataset:
Team Foundation Server(TFS) で管理しているファイルの検索方法

## 前書き
Team Foundation Server(TFS)で管理しているファイルを検索したいが、
**最新バージョンを取得** などでローカル環境にダウンロードしているものだけではなく、
TFS上で管理されているものも含めて検索したい場合にTeam Foundation Version Control(TFVC)コマンドを使用した。
よく忘れるのでメモ＆共有。

## 本題
```:コマンド
> tf dir /recursive /collection:[検索対象コレクションへのURL] [検索したいファイル名orフォルダ名(ワイルドカード可)] 

(例)
> tf dir /recursive /collection:https://hoge-server.net/tfs/hoge-collection $/sample_folder/*search_key*
```

#### よく分かるかもしれない解説
上記の例を分解して解説します。

`tf`
TFVC関連のコマンドを使うときに最初につけるやつ。
以降のコマンドとオプションおよび引数がTFVCコマンドのものであることを示す。（と思う）

`dir`
ファイルまたはフォルダ検索するときのコマンド。
DOSコマンドと同じ意味。（と思う）

`/recursive`
指定フォルダ内の全てのファイルおよびサブフォルダを検索するオプション。
これを指定しないと指定した直下のファイルおよびフォルダしか検索されない。

`/collection:https://hoge-server.net/tfs/hoge-collection`
検索対象のサーバおよびコレクションを指定するオプション。
これを指定しないと「**ソース管理サーバーを決定できません。**」と怒られる。
コロンを付けてURLでコレクションを指定する。

`$/sample_folder/*search_key*`
検索対象を指定する引数。
ルートは`$/`で以降は検索したいファイル名なりフォルダ名なりを指定すればよい。
ワイルドカード`*`を使用してあいまい検索も可能。

## 参考
https://docs.microsoft.com/ja-jp/azure/devops/repos/tfvc/dir-command?view=azure-devops
値をURLのパラメータに追加するにあたって起きたエンコードの落とし穴

# エンコードの落とし穴
タイトルの通り
値をURLのパラメータで渡すにあたって、文字列を直書きはよろしくないだろうということで、
エンコードをしたものをURLに追加しました。
そこでの失敗例です。

# 間違っているのに出来てしまう
間違っているのにエラーになるわけでもないため発見が遅れました。

今回は乗せたかった値は以下
「イベント名=〇〇〇・〇〇〇のための就活セミナー」

エンコードは以下サイトを利用
https://tech-unlimited.com/urlencode.html
https://www.tagindex.com/cgi-lib/encode/url.cgi

結果
「イベント名=〇〇〇・〇〇〇のためのオンラインセミナー」
という値が渡されていました。

# 原因
エンコードの際
「イベント名=〇〇〇・〇〇〇のための就活セミナー」
をすべてエンコードにしていたため。

# 対処
エンコードを
・「イベント名」
・「〇〇〇・〇〇〇のための就活セミナー」
に分けてエンコード

パラメータへの記述は以下
（「イベント名」をエンコードした文字列）=（「〇〇〇・〇〇〇のための就活セミナー」をエンコードした文字列）

# 所感
＝（イコール）を含めてもエンコードが出来てしまい、パラメータに乗っけても微妙な違いだけで普通に値を渡せてしまう。という罠でした。
＝の両端（オペランド？）を別々にエンコードして＝（イコール）で繋ぐという一手間で解決となりました。
なぜこのような変換になるのか、というところまでは分からないので、エンコードについてもその内調べられればと思います。
M5Paper: RFID-RC522 の使い方

こちらのプログラムの *.ino と *.cpp を変換します。
[M5Stack Core2: RFID-RC522 の使い方](https://qiita.com/ekzemplaro/items/fd226e15f76c5096084c)

*.ino の変換

```text:sed_ino
s/RFID_RC522_CORE2.ino/RFID_RC522_M5Paper.ino/
s/M5Core2.h/M5EPD.h/
s/Wire.begin();/Wire1.begin(25, 32);/
s/M5.lcd./\/\/ M5.lcd./
s/M5.Lcd./\/\/ M5.Lcd./
```

*.cpp の変換

```text:sed_cpp
s/Wire.a/Wire1.a/g
s/Wire.b/Wire1.b/g
s/Wire.e/Wire1.e/g
s/Wire.r/Wire1.r/g
s/Wire.w/Wire1.w/g
```

変換スクリプト

```bash
mv RFID_RC522_CORE2.ino RFID_RC522_M5Paper.ino
#
sed -i -f ./sed_cpp MFRC522_I2C.cpp
#
sed -i -f ./sed_ino RFID_RC522_M5Paper.ino
```

Arduino IDE
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/418a1991-3ed3-d16d-5328-5b78a17a429e.png)

シリアルコンソールで接続

```bash
cu -s 115200 -l /dev/ttyACM0
```
Data Portal: 水際対策を可視化した

今月から、水際対策が緩和されました。
[国際的な人の往来再開に向けた措置について](https://www.mofa.go.jp/mofaj/ca/cp/page22_003380.html)

国や地域を３色の区分で分類し、来訪者のワクチン接種証明の有無と合わせて、入国時の検査要否と待機期間が決まるという事のようです。

> 一部の国・地域からの入国者に対する入国時検査の免除等がなされます

という事なのですが、いったいどのぐらいの国が、ここでいう一部の国・地域にあたるのか、サイトを見ただけではパッとわからなかったので [可視化](https://datastudio.google.com/s/tnodNeocS2I) してみました。

![スクリーンショット 2022-06-08 13.55.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/1deccb4c-a712-703e-db89-c118c61f9d2b.png)

「赤」に設定されている国がもっとも警戒される国という事になるのですが、4カ国しか設定されておらず、ほとんど日本に来る人はいないのだろうという感じがします。

「黄」に設定されている国が次に警戒されている国という事になるのですが、ワクチン接種証明があれば「青」と同等の扱いとなります。このグループに、つい先日までコロナ患者の急増が報じられていた北朝鮮も含まれています。

「青」に設定されている国からの来訪者はワクチン接種証明の有無に関わらず、入国時の検査も入国後の待機も無しという事のようです。



可視化したからか、可視化する為に少し調べたからかはわからないですが、今の日本の水際対策がなんとなく把握でき、そして少し不安になりました...
GPGキーの関係でmysqlがインストールできない時の対処法

# 現象
mySQLをインストールする際に、下記エラー文が出てくる。

```
Public key for mysql-community-libs-compat-5.7.38-1.el7.x86_64.rpm is not installed 

 Failing package is: mysql-community-libs-compat-5.7.38-1.el7.x86_64
 GPG Keys are configured as: file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
```

# 原因
yumを使用する際に、パッケージに変更点があるか確認するためにGPGキーを使用されいているのですが、GPGキーには有効期限が設定されており、期限が切れてしまうとGPGキーとしての役割を果たさなくなってしまいます。

# 対策
新しくGPGキーをインストールすればyumが使えるようになります！
```
sudo rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
```

# 結果

mysqlのインストールが出来ました！
```
Installed:
  mysql-community-libs.x86_64 0:5.7.38-1.el7
  mysql-community-libs-compat.x86_64 0:5.7.38-1.el7
  mysql-community-server.x86_64 0:5.7.38-1.el7

Dependency Installed:
  mysql-community-client.x86_64 0:5.7.38-1.el7
  mysql-community-common.x86_64 0:5.7.38-1.el7
  ncurses-compat-libs.x86_64 0:6.0-8.20170212.amzn2.1.3

Replaced:
  mariadb-libs.x86_64 1:5.5.68-1.amzn2

Complete!
```
Gitの目的－3. Collaboration (Pull request)

Pull request (Merge request) : 個人Branchで作業したデータをMain branchにアップし、レビュー後Mergeしてもらうように要求する作業で、Main branchの安定性を高めることができる。

Pull requestの2つの形式
1. Remote repositoryにアクセス権がある場合：作業したBranchを他のBranchにMergeする時にCollaboratorからの意見を受け取るために使用する
2. Remote repositoryにアクセス権がない場合：Remote repositoryを複製(fork機能)して、作業後にMergeを要求をする時に使用

Main branchは常に問題のない状態を保たなければならないため、Main branchでの作業をしないで新しいBranchを作って作業を進める事が重要
git branch branch名前：新しいBranchを作成　ex）git branch new1
git checkout branch名：指定したBranchに移動　ex) git checkout new1
git checkout -b branch名前：新しいBranchを作成し、すぐにそこへ移動　ex）git checkout -b new2
git branch -d branch名：Branch削除　ex）git branch -d new1
【Line works API 2.0】LaravelでBotからユーザーにメッセージを送信する

Line works API 1.0の廃止が2023年4月30日ということで、余裕を持って2.0に移行しておこうと思ったものの1.0と色々と違っていて手間取ったのと、PHPでの例がまだあまり見当たらなかったので書き留めておくことにしました。

やりたいことはBotから指定ユーザーにメッセージ送信することです。
今回の利用目的に合うのはService Account認証 (JWT)なのでJWTを使用します。
コードはLaravelを使ったものです。

# 事前準備
1. Line works Developer consoleでAPI 2.0のアプリを作成する
2. アプリのOAuth Scopesは"bot"と"bot:read"を選択
3. Botを作成する
4. BotのAPI InterfaceでAPI 2.0を選択する
5. Botをサービス中にする

Botを作成するとそのBotは「準備中」と表示されます。
5番の作業で[LINE WORKS Admin（管理者画面）](https://admin.worksmobile.com/ "LINE WORKS Admin（管理者画面）")のメニュー内のサービス→Botから今作成したBotを追加・設定する必要があります。私はここでBotが準備中のままであることを忘れていて暫く"Access is denied for bot"というエラーで悩まされたので忘れずに。
Botの詳しい追加方法についてはググればすぐに出てくるのでここでは割愛します。（[LINE WORKS（API2.0） 設定方法](https://help.7plus.jp/mail2link/line-worksapi2/)辺りを参考にしてみてください）

# PHP-JWTインストール
```
composer require firebase/php-jwt
```

# アクセストークン取得
まずはアクセストークンを取得する箇所です。必要なIDやキーなどはDeveloper consoleから取得しておきます。

```
use Firebase\JWT\JWT;

private function lw_get_accesstoken($client_id, $client_secret, $service_account_id, $private_key)
{
    $lw_auth_url = "https://auth.worksmobile.com/oauth2/v2.0/token";

    $token = $this->jwt_encode($client_id, $service_account_id, $private_key);

    $headers = ['Content-Type' => 'application/x-www-form-urlencoded'];

    $params = array(
        'assertion' => $token,
        'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer',
        'client_id' => $client_id,
        'client_secret' => $client_secret,
        'scope' => 'bot',
    );

    try {
        $client = new \GuzzleHttp\Client; // ここはLaravelのラッパーを使いたかったけどなぜかエラーでうまくいかないため断念
        $response = $client->post($lw_auth_url, [$headers, 'form_params' => $params]);

        $status_code = $response->getStatusCode();

        if($status_code == 200) {
            return json_decode($response->getBody());
        }
        else {
            // エラー処理
            return false;
        }
    }
    catch (Exception $e) {
        // エラー処理
        return false;
    }
}

private function jwt_encode($client_id, $service_account_id, $private_key)
{
    $payload = array(
        'iss' => $client_id,
        'sub' => $service_account_id,
        'iat' => time(),
        'exp' => time() + 3600
    );

    return JWT::encode($payload, $private_key, 'RS256');
}
```

# メッセージ送信
取得したトークンを使用してメッセージを送信します。

```
$token = $this->lw_get_accesstoken($client_id, $client_secret, $service_account_id, $private_key);

if(!$token) {
    // エラー処理
}

$user_message_api = 'https://www.worksapis.com/v1.0/bots/'.$bot_id.'/users/'.urlencode($user_id).'/messages';

$headers = ['Content-Type' => 'application/json; charset=UTF-8',
'Authorization' => 'Bearer '.$token->access_token];

$payload = [
    "content"=> [
      "type"=> "text",
      "text"=> "test message"
    ]
];

try {
    $response = Http::withHeaders($headers)->post($user_message_api, $payload);

    if($response->successful()) {
        // 送信成功
    }
    else {
        // エラー処理
    }
}
catch (Exception $e) {
    // エラー処理
}
```
ITILファンデーション合格体験記

# はじめに
この度「ITIL® 2011 Foundation」に満点合格しました。
これから受験を考えている方に、使用した問題集や勉強法など、参考にしていただければと思います。

# 試験を受けた感想・難易度
試験の難易度は公開されていませんが、個人的に感じた難易度としては、しっかりと問題集などを使って勉強をしていればそこまで難しい試験ではないと感じます。
経験豊富なエンジニアであれば一週間、経験の浅いエンジニアでも二週間の勉強期間があれば合格できると思います。（もちろん平日は仕事をしているという前提です。）

# 使用した参考書・問題集
使用した参考書・問題集は以下の３つです。

##### ・ITIL ファンデーション シラバス2011（Kindle版、約3200円）

https://www.amazon.co.jp/Service-Management%E6%95%99%E7%A7%91%E6%9B%B8-%E3%83%95%E3%82%A1%E3%83%B3%E3%83%87%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3-%E3%82%B7%E3%83%A9%E3%83%90%E3%82%B92011-EXAMPRESS/dp/4798125709

##### ・Ping-t（無料）

https://ping-t.com/

##### ・クラムメディア（30日利用、6000円）

http://www.crammedia.com/EX0-001-ITIL-Foundation-syllabus-2011-%E6%97%A7%E8%A9%A6%E9%A8%93%E7%95%AA%E5%8F%B7%EF%BC%9AEX0-117/p/247/204

# 勉強方法・手順
私が実際に勉強をしたプロセスを順番に紹介していきます。
### ①参考書を読む
先ずは参考書を２日間ほどかけて読みました。
初めて聞くような言葉だったり、難しい言葉などもたくさんあり、最初の一回で全て理解することはできませんでした。
ただ、ここで重要なのは、ITILがどのようなものなのか、大枠をしっかり理解することです。
細かい言葉や概念の説明は、問題集をやっていくと覚えます。

### ②Ping-tで問題を解く
次にPing-tで問題を解きます。４日間ほど時間を使いました。
Ping-tでは問題のカテゴリー（システムストラテジ、システムデザインなど）を選択することが可能です。なので、それぞれのカテゴリー別に順番に解いていきました。
カテゴリー別に問題を解くことによって、どのプロセスや機能がどのカテゴリーのものなのかということを理解しやすくなり、覚える効率が上がります。
全ての問題をヒット（一回正答）すれば十分かと思います。
時間に余裕がある方や不安な方はコンボ（二回連続正答）になるまでやってみてください。

### クラムメディアを解く
２日間ほどかけてクラムメディアの問題を解きました。
こちらもすべての問題を一回正答するまで解きました。

### Pint-tとクラムメディアの比較
Ping-tは解説がかなり丁寧なのに対して、クラムメディアの解説はほぼ無いに等しいです。
そのため、反復して問題を解きながら知識を定着させるにはPing-tの方がおすすめです。
しかし問題に関してはクラムメディアの方が本番に近いです。

なのでPing-tとクラムメディア、どちらもやっておくと良いと思います。

# 勉強する上でのコツ
ITILの考え方やプロセスはほとんどのシステム開発の現場に当てはまるものです。
そのため、実際の自分自身が経験したプロジェクトなどと照らし合わせながら勉強していくと覚えやすいです。
（例１）プロジェクトマネージャはあのプロジェクトでいうと○○さんか。。。
（例２）今自分が担当しているタスクはシステムトランジションの中のこのプロセスか。。。
などなど。

# 最後に
最後まで見て頂きありがとうございました。
この記事が少しでもITIL受験者の役に立てたら幸いです。
scipy.stats: ムード検定 mood

# scipy.stats: ムード検定 `mood`

2 つのデータが同じ分布で，尺度パラメータが等しいかどうかの検定である（ノンパラメトリック検定）。

`mood(x, y, axis=0, alternative='two-sided')`

戻り値は，検定統計量と $p$ 値である。


```python
from scipy.stats import mood
import numpy as np

ramsay = np.array([111, 107, 100, 99, 102, 106, 109, 108, 104, 99,
            101, 96, 97, 102, 107, 113, 116, 113, 110, 98])
jung_parekh = np.array([107, 108, 106, 98, 105, 103, 110, 105, 104,
            100, 96, 108, 103, 104, 114, 114, 113, 108, 106, 99])
mood(ramsay, jung_parekh)
```




    (0.9919203990624894, 0.32123635731324385)



R の `mood.test` と結果が異なる。理由は，わからない。

<pre>> example(mood.test)

md.tst> ## Same data as for the Ansari-Bradley test:
md.tst> ## Serum iron determination using Hyland control sera
md.tst> ramsay <- c(111, 107, 100, 99, 102, 106, 109, 108, 104, 99,
md.tst+             101, 96, 97, 102, 107, 113, 116, 113, 110, 98)

md.tst> jung.parekh <- c(107, 108, 106, 98, 105, 103, 110, 105, 104,
md.tst+             100, 96, 108, 103, 104, 114, 114, 113, 108, 106, 99)

md.tst> mood.test(ramsay, jung.parekh)

	Mood two-sample test of scale

data:  ramsay and jung.parekh
Z = 1.0371, p-value = 0.2997
alternative hypothesis: two.sided<pre>
Gitの目的－3. Collaboration

Collaboration：大きいProjectを一人で作業すると、時間と努力がかかりすぎてとても難しいことなので、多数の人が1つのProjectに集まってCollaborationすることで負担が減る

Collaborationの時にpullをしない状態でpushをするとrejectされるため、常にCollaborationの時にはpullをする習慣を持たなければならない

git fetch -> git merge FETCH_HEAD -> commit -> pushまたは
pull -> commit -> push
の順を守る

git fetch：変更されたRemote repositoryの内容を持ってくる
git merge FETCH_HEAD：持ってきたRemote repositoryをLocal repositoryとmergeする
git pull：git fetch + git mergeを同時に行う
【PHP】PHPでヒット＆ブロー

ヒットアンドブローとは、何桁かの数字を入力し数を当てる数当てパズルゲーム。

ランダム数値4桁に対して、入力した4桁のヒット数とブロー数を求める。

Hit数 　
同じ数字が同じ桁に出現する回数
Blow数 　
同じ数字が違う桁に出現する回数
# 入力値４桁
```
2345
```
# コード
```PHP
<?php
$list = str_split(fgets(STDIN));
$number = [];
foreach ([1,2,3,4] as $i) $number[] = mt_rand(1, 9);   
$hit_cnt = 0;
$blow_cnt = 0;
foreach ($list as $k => $v){
    if((int)$v === $number[$k]){
        $hit_cnt++;
    }
    if(in_array($v,$number)){
        $blow_cnt++;
    }
}
echo $hit_cnt,':ヒット',$blow_cnt,':ブロー',PHP_EOL;
echo 'コンピュータ:',$number[0],$number[1],$number[2],$number[3],PHP_EOL;
echo '入力値した値:',$list[0],$list[1],$list[2],$list[3];
```

# 結果
```
1:ヒット1:ブロー
コンピュータ:6761
入力値した値:6424
```
別コントローラーからビューを呼び出す

## はじめに
学習中の初心者です。
言葉足らずなところや間違えがあればコメントにて添削していただけるととても嬉しいです。


## 結論
別のファイルからビューを呼び出す際、**renderメソッド**を利用します。
renderメソッドとは、部分テンプレートを呼び出す際に利用するメソッドのことで、
部分テンプレートとは、ビューファイルで繰り返し使用するコードを切り出し、再利用する仕組みのことです。

**partialオプション**を付け、呼び出したいファイル名を指定する事で、部分テンプレートを表示することができます。
```ruby:qiita.rb
【例】
<%= render partial: "ディレクトリ名/呼び出すファイル名" %>
```


## 手順
呼び出されるテンプレートのファイルを作成します。
ファイル名は最初に **_(アンダースコア)** を入れること。

```ruby:qiita.rb
【例】
_sample.html.erb
```

該当するビューファイルにrenderで部分テンプレートを記述。
```ruby:qiita.rb
<%= render partial: "sample" %>
```
すると、_sample.html.erbに記述されたコードが挿入され、別コントローラーからでもビューを呼び出すことができます。
scipy.stats: 二項検定 binomtest

# scipy.stats: 二項検定 `binomtest`

母比率の検定を行う。

`binomtest(k, n, p=0.5, alternative='two-sided')`

- `k`　成功数
- `n`　試行数
- `p`　母比率。デフォルトで 0.5
- `alternative`　検定種別。デフォルトで両側検定 `'two-sided'`，片側検定は `'greater'`，`'less'`

戻り値は　`pvalue` などを含むオブジェクト

このオブジェクトのメソッド

`proportion_ci(confidence_level=0.95, method='exact')`

- `confidence_level`　信頼度
- `method`　デフォルトは `'exact'`，その他に `'wilson'`，`'wilsoncc'`


```python
from scipy.stats import binomtest

object = binomtest(682, 925, p = 3/4)
print(object.pvalue)
print(object.proportion_ci())
print(object.proportion_ci(method='wilson'))
print(object.proportion_ci(method='wilsoncc'))
```

    0.3824915595748516
    ConfidenceInterval(low=0.707668264079039, high=0.7654065582414781)
    ConfidenceInterval(low=0.7079959876196205, high=0.7646358009714889)
    ConfidenceInterval(low=0.7074390554781229, high=0.7651554240456733)
Gitの目的－2. Backup

Backup：データを別の場所に保管すること

Push：Local repositoryからRemote repositoryにアップロードすること
Clone：Remote repositoryに保存されているデータを別のLocal repositoryに完全にコピーすること
Pull：他のLocal repositoryで修正されたデータをRemote repositoryにpushし、その最新状態をLocal　repository にダウンロードし、同期させること


Clone方法
Terminalでgit clone Remote repository名をすると、現在のDirectoryの下にRemote repository名のDirectoryが作成、複製されます。
Gitの目的－1. Version(履歴)管理

バージョン管理：Gitを使って日々私がやった作業をバージョンとして保存することができ、以前のバージョンと比較することも容易になる


Working tree：ローカルでデータを作成・変更するスペース
Staging area：Working treeからRepositoryに保存される前のスペース
Repository：データが最終的にGitに保存される場所


nano データ名：データを作成し内容も同時に作成。内容編集の時も使われる　ex) nano work.txt
cat データ名：データの内容出力　ex) cat work.txt


git checkout branch名：branchへ移動　ex) git checkout main.txt 
git checkout -b branch名：branchを作成し、そちらへ移動　ex) git checkout -b sub1.txt　　
git commit -am "comment"：addとcommitを同時に実行。 untracked状態のデータは自動的にaddされないので最初の一回はaddとcommitを別々行う必要がある
git diff：データを修正したときに修正内容が見れる。 commitをする前にはgit diff命令ですぐに見ることが可能
git log：現在のブランチのcommit履歴を表示する
git reset commitID：特定のコミットポイントに戻し、戻ったcommit以降作成されたcommitは削除　ex) git reset 7867b65d1510b7ad94a42808af395ac60bc57e9c
git revert commitID：特定のコミットポイント戻すが、データの内容はそのまま維持し、戻ったcommit以降のすべてのcommit履歴はそのまま残る
Androidでライト/ダークモードのスクショをshellを叩けば一括で撮影できるようにしてみた

追記：スマホからPCに出力先の指定をしていなかったため、現在いるディレクトリに画像が出力されていたのでデスクトップに画像を出力する指定を追加しました。

PRを出す際にライトモード、ダークモードそれぞれのスクショを撮ってGithubに上げていたのですが、毎回ライトモード、ダークモードの切り替えをしてスクショを撮るというのが非常に手間だったのでshellを叩けばPCのデスクトップに出力してくれるようにしました。

# 環境
Macbook Pro Catalina 10.15.7
AndroidStudio Bumblebee
zsh

# shell内でリサイズするためにimagemagickをインストール
imagemagickのインストールはこちらを参考にさせていただきました🙇‍♂️
https://qiita.com/sowd/items/832594dd22d99aebc8a2

# shellの中身
```
#!/bin/bash

# ライトモードに切り替え
adb shell cmd uimode night no

# ライトモード切り替えを待機
sleep 1

# スクショを撮ってPCのデスクトップに保存（日付をUNIXTIMEで取得）
DATETIME=`date +%s`
adb shell screencap -p /sdcard/screen-not-night_$DATETIME.png
adb pull /sdcard/screen-not-night_$DATETIME.png ~/Desktop/screen-not-night_$DATETIME.png
adb shell rm /sdcard/screen-not-night_$DATETIME.png

# デスクトップに保存した画像を50%にリサイズ
convert -resize 50% ~/Desktop/screen-not-night_$DATETIME.png ~/Desktop/screen-not-night_$DATETIME.png

# ダークモードに切り替え
adb shell cmd uimode night yes

# ダークモード切り替えを待機
sleep 1

# スクショを撮ってPCのデスクトップに保存（日付をUNIXTIMEで取得）
DATETIME=`date +%s`
adb shell screencap -p /sdcard/screen-night_$DATETIME.png
adb pull /sdcard/screen-night_$DATETIME.png ~/Desktop/screen-night_$DATETIME.png
adb shell rm /sdcard/screen-night_$DATETIME.png

# デスクトップに保存した画像を50%にリサイズ
convert -resize 50% ~/Desktop/screen-night_$DATETIME.png ~/Desktop/screen-night_$DATETIME.png
```
Lattice FPGA / Diamond ProgrammerでサポートされているSPI Flashのリストを確認する方法

# Lattice FPGA / Diamond ProgrammerでサポートされているSPI Flashのリストを確認する方法

(1)　Diamond Programmerを起動する (Create a new blank projectをチェック)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489314/45878b08-66c5-dd4c-de04-412e6040cd72.png)

(2)　Helpを起動する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489314/dd8110da-0b70-9cfb-f9ac-26b0291420dd.png)

(3)　一覧を確認できる
ヘルプメニューのSerial Peripheral Interface(SPI)Flash Supportを選択すると対応SPI Flash一覧が表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489314/b65212ea-9ac5-a064-058d-338d2d797a4b.png)

# (補足) 確認したDiamond Programmerバージョン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489314/b91ba76a-4974-10ec-4a93-887b5d7644df.png)

# (補足2) 必要となるSPI Flashサイズの確認方法
各デバイスのsysCONFIG Usage Guideに記載あり
(Bitstream Size等で検索)
M5Stack Core2: RFID-RC522 の使い方

ファイル -> スケッチ例 -> M5Core2 -> Unit -> RFID_RC522 を改造しました。

次のファイルには変更はありません。

```text
MFRC522_I2C.cpp
MFRC522_I2C.h
```

フォルダー構造

```text
$ tree RFID_RC522_CORE2
RFID_RC522_CORE2
├── MFRC522_I2C.cpp
├── MFRC522_I2C.h
└── RFID_RC522_CORE2.ino
```

```text:RFID_RC522_CORE2.ino
// ---------------------------------------------------------------
//	RFID_RC522_CORE2.ino
//
//						Jun/8/2022
// ---------------------------------------------------------------
#include <M5Core2.h>
#include "MFRC522_I2C.h"

MFRC522 mfrc522(0x28);	 // Create MFRC522 instance.

int nocard = 0;
// ---------------------------------------------------------------
void setup() {
	M5.begin();
	M5.lcd.setTextSize(2);
	M5.Lcd.println("MFRC522 Test Jun/8/2022");
	Wire.begin();

	mfrc522.PCD_Init();
	M5.Lcd.println("Please put the card\n\nUID:");
}

// ---------------------------------------------------------------
void loop() {
	M5.Lcd.setCursor(50,47);
	if (!mfrc522.PICC_IsNewCardPresent() || ! mfrc522.PICC_ReadCardSerial()) {
	nocard++;
	if (2 < nocard)
		{
		M5.Lcd.println(" No Card       ");
		Serial.println("*** No Card ***");
		}

	}
else
	{
	nocard = 0;
	uid_display_proc();
	}
    delay(200);
}

// ---------------------------------------------------------------
void uid_display_proc()
{
	short aa[] = {1,0,0,0,0,0,0,0,0,0};
	char buf[60];
	sprintf(buf,"mfrc522.uid.size = %d",mfrc522.uid.size);
	Serial.println(buf);
	for (short it = 0; it < mfrc522.uid.size; it++) {
		aa[it] = mfrc522.uid.uidByte[it];
		}

	sprintf(buf, "%02x %02x %02x %02x",aa[0],aa[1],aa[2],aa[3]);
	M5.Lcd.println(buf);
	M5.Lcd.println("");
	Serial.println(buf);
}

// ---------------------------------------------------------------
```

Arduino IDE

![Screenshot from 2022-06-08 12-12-47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/5aecc42f-1313-dc43-bece-9b5166466674.png)

シリアルコンソールで接続

```text
$ cu -s 115200 -l /dev/ttyACM0
Connected.
*** No Card ***
*** No Card ***
*** No Card ***
```

実行時の様子
![IMG_20220608_122048.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/9533809e-aced-c9e7-0af7-da53bcf45983.jpeg)
Maya Cannot find procedure "CgAbBlastPanelOptChangeCallback

```
import maya.cmds as cmds
for model_panel in cmds.getPanel(typ="modelPanel"):
    callback = cmds.modelEditor(model_panel, query=True, editorChanged=True)
    if callback == "CgAbBlastPanelOptChangeCallback":
        cmds.modelEditor(model_panel, edit=True, editorChanged="")
```
【C#】Win32 API プログラムで壁紙を動かす

# はじめに
この記事ではWallpaperEngineのようにWindows端末の壁紙を動かすための実装方法について書きます。
やり方は、壁紙とアイコンの間にあるウィンドウのデバイスコンテキストを取得して書き換える、というものです。
Win32APIを使用するので、DLLのインポートの記述が必要です。
# 参考にしたもの
[Draw Behind Desktop Icons in Windows 8+](https://www.codeproject.com/Articles/856020/Draw-Behind-Desktop-Icons-in-Windows-plus)
[Natsunekoさんのgit](https://github.com/mika-archived/dotnet-window-to-wallpaper/blob/master/WpfApp1/MainWindow.xaml.cs)
# 最小コードの内容
```
// 1 「壁紙変えたよ」メッセージを発行する
var progman = User32.FindWindow("Progman", null);
User32.SendMessageTimeout(progman, 0x52C, new IntPtr(0), IntPtr.Zero, 0x0, 1000, out var result);

// 2 Workerwウィンドウのハンドルを取得する
handle_workerw = IntPtr.Zero;
User32.EnumWindows((hwnd, lParam) =>
{
    IntPtr shell = User32.FindWindowEx(hwnd, IntPtr.Zero, "SHELLDLL_DefView", null);
    if (shell != IntPtr.Zero) handle_workerw = User32.FindWindowEx(IntPtr.Zero, hwnd, "WorkerW", null);
    return true;
}, IntPtr.Zero);

// 3 WorkerWのDCを取得する
dc_workerw = User32.GetDCEx(handle_workerw, IntPtr.Zero, 0x403);

// 4 壁紙にしたい描写をしたDCを用意する
DoSomething();

// 5 WorkerWのDCに第6引数の内容をコピペ
GDI32.BitBlt(dc_workerw, 0, 0, w, h, dc_form, 0, 0, 0x00CC0020);

// 6 デバイスコンテキストを開放する。
User32.ReleaseDC(handle_workerw, dc_workerw);
```
<details><summary>用語解説</summary>

### ウィンドウハンドル
ウィンドウに割り振られた番号のこと。これを使うことでアプリケーションのウィンドウを操作できるよ。

### DC(デバイスコンテキスト)
ウィンドウごとに存在してる、描写をするやつ。BitBlt関数とかで書き換えることが出来るよ。
</details>

## 1の解説
Gerald Degeneve氏の「[Draw Behind Desktop Icons in Windows 8+](https://www.codeproject.com/Articles/856020/Draw-Behind-Desktop-Icons-in-Windows-plus)」からコードを使用しました。

Windows8以降、壁紙とアイコンの描写は同じWindowで行われています。このままではアイコンを塗りつぶしてしか描写することは出来ません。しかしシステムが壁紙を変えたとき送られる、「0x52C」というメッセージがプログラムマネージャー(progman)に送信されると、この壁紙とアイコンの描写に割り込むウィンドウ「WorkerW」が作成されます。これはGerald Degeneve氏の記事で紹介されているものです。このウィンドウは再起動するまで存在します。

## 2の解説
メッセージにより作成されたWorkerWのウィンドウハンドルを取得します。WorkerWさんはたくさんいらっしゃるので、Shellの近くにあるものを取得しています。

## 3の解説
とくにないです

## 4の解説
描写したい内容を描写したデバイスコンテキストを用意します。僕は画面と同じ大きさの、透明のフォームを作成し、それのデバイスコンテキストを使いました。フォームにピクチャボックスを作成してそこの画像をいじってます。それらの設定はこんな感じにするとうまくいきます。
```
//上のX削除
form.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
//透明にするよ
form.Opacity = 0D;

form.Location = new Point(0, 0);
form.Size = new Size(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);

form.pictureBox1.Location = new Point(0, 0);
form.pictureBox1.Size = new Size(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
```

## 5の解説
ここが描写処理です。第6引数の描写内容が第1引数にコピペされます。
5を無限ループにすると、用意したデバイスコンテキストが書き換わったときに壁紙も書き換わるようになります。

## 6の解説
開放しないとまずいかもしれないっぽい？温室育ちなのでよくわかんないです


# 最後に
https://github.com/utasimaru/ProgrammableWallpaper
https://github.com/utasimaru/DllTest
描写処理だけを記述したDLLだけで動かせる、壁紙のソフトをちょびちょび書いてます。DrawClassというクラスの、引数なし返り値なしの関数「DrawStart」と引数なしでbitmap型を返り値にする「GetDrawBitmap」を読み込んで、適宜呼び出してくれます。興味があったら見てみてください。
GoでZIPファイル扱う

# はじめに
PHPerだった私にはGoのZIPファイルの取り扱い方が少々ややこしかったので、忘れたときのために覚書を残すことにした。


# ZIPファイルの読み方
基本的な手順はこちら。
1. ZIPファイルを開く
1. 個別のファイルエントリーを取得
1. ファイルエントリーの情報が欲しい場合はFileHeader要素から取得
1. ファイルエントリーの中身を見たい場合はオープン
~~~go:reader.go
package main

import (
  "archive/zip"
  "io"
)

// エラー処理は省略
func main() {
  zipfile, _ := zip.OpenReader("./sample.zip") // 1. ZIPファイルを開く
  defer zipfile.Close()
  for _, entry := range zipfile.File { // 2. 個別のファイルエントリーを取得
    println(entry.FileHeader.Name) // 3. ファイルエントリーの情報が欲しい場合はFileHeader要素から取得
    reader, _ := entry.Open() // 4. ファイルエントリーの中身を見たい場合はオープン
    content, _ := io.ReadAll(reader)
    println(string(content))
    defer reader.Close()
  }
}
~~~

# ZIPファイルの書き方
基本的な手順はこちら。
1. ファイルを生成
1. ZIPのライターにする
1. ヘッダーを作成
1. ヘッダーからライターを生成
1. 書き込み

~~~go:writer.go
package main

import (
  "archive/zip"
  "os"
  "time"
  "fmt"
)

func main() {
  f, _ := os.Create("./writer_sample.zip") // 1. ファイルを生成
  writer := zip.NewWriter(f) // 2. ZIPのライターにする
  defer writer.Close()

  fh := new(zip.FileHeader) // 3. ヘッダーを作成
  fh.Name = "./file_entry1.txt"
  fh.Method = zip.Deflate
  fh.Modified = time.Now()
  w, _ := writer.CreateHeader(fh) // 4. ヘッダーからライターを生成
  w.Write([]byte("I'm FileEntry1")) // 5. 書き込み

  w, _ = writer.Create("./entries/file_entry2.txt") // ヘッダーを作らなくてもよいが、名前以外はデフォルト値になる
  w.Write([]byte("I'm FileEntry2")) // 5. 書き込み
} 
~~~
git logとは

# 履歴を見る
## ログを表示する
```
git log
git log --oneline
git log ファイル名
```
コミットの履歴を見るために使う。

## 実際使ってみよう。
```
*************@mbp training % git log
commit ************ (HEAD -> master)
Author: 設定された名前 <設定されたemail>
Date:   Tue Jun 7 14:27:10 2022 +0900

    this is test commit.

commit **********************
Author: ********* <**************::>
Date:   Wed Jun 1 12:08:46 2022 +0900

    練習用アプリを作成　rails new -B -T -J -d mysql -C .
```
## 思ったこと
すごい。
設定した名前、email、日付、コミットメッセージが表示されるのか。

## git log --oneline
ひとつのコミットにつき1行を表示させる。

## 実際使ってみよう。
```
**********@mbp training % git log --oneline
cdfa187 (HEAD -> master) this is test commit.
*******(ハッシュ値の最初の７桁) 練習用アプリを作成　rails new -B -T -J -d mysql -C .
```
## 思ったこと
なるほど
コミットを特定されることに使うハッシュ値の最初の７桁と
コミットメッセージが表示されるのか。

## git log ファイル名
指定したファイルの履歴を表示する。

## 実際使ってみよう。
```
**********@mbp training % git log README.md
commit コミットを特定するハッシュ値　(HEAD -> master)
Author: 設定した名前 <設定したemail>
Date:   Tue Jun 7 14:27:10 2022 +0900

    this is test commit.

commit コミットを特定するハッシュ値
Author: 設定した名前 <設定したemail>
Date:   Wed Jun 1 12:08:46 2022 +0900

    練習用アプリを作成　rails new -B -T -J -d mysql -C .
```
## 思ったこと
あれ？　```git log```と変わらないな。
どうしてだ。
別のファイルを確認してみよう。
それでまたコミットの履歴を確認しよう。
```
**********@mbp training % ls
Gemfile		app		db		storage
Gemfile.lock	bin		lib		tmp
README.md	config		log		vendor
Rakefile	config.ru	public

**********@mbp training % git log app
commit **********
Author: ***** <**************>
Date:   Wed Jun 1 12:08:46 2022 +0900

    練習用アプリを作成　rails new -B -T -J -d mysql -C .

**********@mbp training % git log Gemfile
commit *****************
Author: ******* <****************>
Date:   Wed Jun 1 12:08:46 2022 +0900

    練習用アプリを作成　rails new -B -T -J -d mysql -C .
```
## 思ったこと
なるほど。
コミットするときは一つだけじゃないから
コミットの履歴が偶然全てのコミットの履歴とREADME.mdの履歴が同じだっただけか。
LaravelからDropboxアクセストークン取得

Dropboxのアクセストークンが短命化されてからリフレッシュトークンを使ってアクセストークンを取得する方法がネット探してもなかったので投稿

```php5
$http = new GuzzleHttp\Client;
$response = $http->post('https://api.dropbox.com/oauth2/token', [
    'form_params' => [
        'grant_type' => 'refresh_token',
        'refresh_token' => '(リフレッシュトークン)',
    ],
    'auth' => [ '(ユーザー)', '(パスワード)', ],
]);
```

結果
```
[
     "access_token" => "sl.BJGK.....",
     "token_type" => "bearer",
     "expires_in" => 14400, // 有効時間４時間
   ]
```

リフレッシュトークン取得方法は[こちら](https://qiita.com/nkmk1215/items/2b2ed200a1c447655891 "LambdaでDropboxのアクセストークンを取得する")を参考にして頂いた。
https://qiita.com/nkmk1215/items/2b2ed200a1c447655891
【Unity + WebGL】実行中のデバイスがモバイルであるか判定する方法

# はじめに
Unityでプラットフォームを取得する際に`Application.platform`を実行するが、WebGLビルドでは動作しているデバイスが何なのか判定することができないので、ブラウザ側の機能で調べる必要がある。

# 取得方法
UnityC#側から以下のJavaScriptを呼び出すとモバイルであるか判定することができる。

```javascript:CheckMobile.js
﻿mergeInto(LibraryManager.library, {
    IsMobile: function () {
        var ua = window.navigator.userAgent.toLowerCase();
        var mobilePattern = /android|iphone|ipad|ipod/i;
        return ua.search(mobilePattern) !== -1 || (ua.indexOf("macintosh") !== -1 && "ontouchend" in document);
    },
});
```
Tableua　ログ確認場所


環境：Tableau Desktop 2021.4.3

■Tableauコマンドのログ
C:\Users\<UserName>\AppData\Local\Tableau\Tabcmd\tabcmd.log

■Tableauコマンドのセッション
C:\Users\<UserName>\AppData\Local\Tableau\Tabcmd\tabcmd-session.xml

■tsmのセッション
C:\Users\<UserName>\AppData\Local\Tableau\tsm\session-data.json

※AppDataは隠しファイル
OpenCVのunit testの動かし方

# 序論
ボンジュールお姫様お殿様、マドモアゼル、ギークの皆様。久しぶりに投稿いたします。
今日はOpenCVにcontributeするぜ！と思ったときにunit test実行で引っかかった人向けの記事です。


# 背景
OpenCVにcontributeしようとすると、unit testを作ることを要求されます。まあ当然ですね。
その場合、自動で走るCIで行うテストではなく、事前に手元でunit testを実行したほうが速く開発できますね。
しかし、単純にopencvをビルドしただけの場合、build/bin/opencv_test_* を実行すると、大抵の場合大量のエラーがでます。
これについては正式documentには何も書かれていません。
そこで、ネットで色々検索して実行したのですが、情報が散らばっており、これでできる！というものが見当たらなかったのでここでまとめておきます。
そもそもopencvにcontributeしようとする人が少ないから情報も少ないのかもしれませんね。


# 単純にunit testを実行した際のエラーメッセージ
例えばbuild/bin/opencv_test_imgproc　を単純に実行した際のエラーは下記のようなものです。
<details><summary>/opencv_test_imgproc実行時のエラーメッセージ</summary>

[  FAILED  ] Imgproc_Canny.accuracy (23 ms)
[ RUN      ] Imgproc_Canny.accuracy_deriv
[ WARN:0@9.352] global /home/hoge/opencv/modules/imgcodecs/src/loadsave.cpp (239) findDecoder imread_('shared/fruits.png'): can't open/read file: check file path/integrity
/home/hoge/opencv/modules/ts/src/ts.cpp:618: Failure
Failed

	failure reason: cvError invoked
	test case #0
	seed: ffffffffffffffff
-----------------------------------
	LOG:
Canny(size = 1 x 42, aperture_size = 5, threshold1 = 685.923, threshold2 = 160.56, L2 = TRUE) test_cpp = FALSE (test case #0)
OpenCV Error:
	Assertion failed (!ssize.empty()) in resize, file /home/hoge/opencv/modules/imgproc/src/resize.cpp, line 4052
OpenCV Error:
	Assertion failed (!ssize.empty()) in resize, file /home/hoge/opencv/modules/imgproc/src/resize.cpp, line 4052

</details>


# エラーの原因
上記エラーの原因は、エラーメッセージに "can't open/read file" とあるとおり、データが無いからです。
OpenCVのunit testを行うのには、sampleの実行に必要なデータに加えて、追加のデータが必要です。
また、それがみえるようにする環境変数の設定も必要です。
具体的な解決法を以下にまとめます。


# OpenCVのunit testの動かし方
1. opencv_extraのpull
はじめにopencvをpullしておき、pullしたopencvのdirectoryと同じ階層（並列）にopencv_extraを以下のようにpullします。
`
git pull git@github.com:opencv/opencv_extra.git
`

1. opencvのbuild
OpenCVのbuild時、cmakeに、以下のようにOPENCV_TEST_DATA_PATH optionをいれます。
下記で、${ROOTDIR}は自分がopencvを配置した上のdirectoryです。
`
cmake -D OPENCV_EXTRA_MODULES_PATH=${ROOTDIR}/opencv_contrib/modules \
	      -D OPENCV_TEST_DATA_PATH=${ROOTDIR}/opencv_extra/testdata \
	      -D BUILD_TESTS=ON -D BUILD_PERF_TESTS=ON \
	      -D BUILD_EXAMPLES=ON -D CMAKE_BUILD_TYPE=Debug \
	      ${ROOTDIR}/opencv
`

1. 環境変数の設定
`
export OPENCV_TEST_DATA_PATH=${ROOTDIR}/opencv_extra/testdata/
`

1. unit testの実行
あとは通常通りunit testのバイナリを実行するだけです。
`
build/bin/opencv_test_imgproc
`

# まとめ
以上、opencvのunit testの手動での実行方法でした。
次回は、見えそうで見えない、スカートでの座り方について書きたいと思います。
Kernel vs User mode  - Overview

# User/Kernel mode
<!-- 発端や概要を記載 -->
Windowsが動作するコンピュータのプロセッサには、User-modeとKernel-modeという2つの異なるモードがあります。
processorは、processor上でどのような種類のコードが実行されているかによって、2つのモードを切り替えています。アプリケーションはユーザーモードで実行され、コアオペレーティングシステムはカーネルモードで実行されます。多くのドライバはカーネルモードで実行されますが、一部のドライバはユーザーモードで実行される場合があります。

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [User mode](#user-mode)
1. [Kernel mode](#kernel-mode)

<!-- 各チャプター -->
<a id="#user-mode"></a>
# User mode
ユーザーモードのアプリケーションを起動すると、Windowsはその**application process**を作成します。このプロセスは、アプリケーションにprivate virtual address space とprivate handle tableを提供します。アプリケーションのvirtual address spaceはプライベートなので、あるアプリケーションが他のアプリケーションに属するデータを変更することはできません。各アプリケーションは分離して実行され、あるアプリケーションがクラッシュした場合、そのクラッシュはそのアプリケーションに限定されます。他のアプリケーションやオペレーティングシステムは、その**クラッシュの影響を受けません**。

プライベートであることに加え、user-mode applicationのvirtual address spaceは制限されています。**ユーザーモードで動作しているprocessorは、operating system用に予約されているvirtual addressesにアクセスすることができません**。**ユーザーモードアプリケーションの仮想アドレス空間を制限することで、アプリケーションが重要なオペレーティングシステムのデータを変更したり、場合によっては破損したりするのを防ぐことができます**。

<a id="#kernel-mode"></a>
# Kernel mode
**Kernel modeで実行されるすべてのコードは、1つのvirtual address spaceを共有します**。つまり、kernel-mode driver は、他のdriversやoperating system自体から分離されていないのです。kernel-mode driverが誤って間違った仮想アドレスに書き込んだ場合、オペレーティングシステムや他のドライバに属するデータが危険にさらされる可能性があります。カーネルモードドライバがクラッシュすると、オペレーティングシステム全体がクラッシュしてしまいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1089224/f3a59b53-ebfc-42c1-4fed-cc0895b5b61f.png)
Flutter環境構築で悩んだところ

パス通らなくて悩んだのですが
解凍した場所に見えない力が働くみたいで、別場所で解凍してから該当ディレクトリに移動じゃダメみたいです。
指定のフォルダで解凍か、該当ディレクトリにzipファイル置いて解凍しましょう。

参考
https://zenn.dev/kboy/books/ca6a9c93fd23f3/viewer/5232dc
サムライエンジニア塾の受講料は1時間あたり何円か調べてみた (講師との時給差も)

# コース

色々なコースがあるが、エキスパートコースの36週間の場合、総額が1,039,500円のようだ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89618/4a6e316c-3e30-781d-eb8a-7a082c09b2e4.png)

# レッスン時間

そしてレッスンは週1回60分

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89618/4586951d-1a47-0ac0-24d1-7dcb09cdc99b.png)

# 1回あたりの受講料

つまり1回あたりの受講料は…

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89618/2abac0de-57d2-4d21-a175-98282b92a0c3.png)


27,355円！？
60分で27,355円！？

まじか！

ちなみにレッスンだけではなく、チャットで講師にいつでも質問できる

# 講師の時給との差は？

講師の時給は、基本時給2000円 + インセンティヴだ。
ちなみにレッスン時間だけではなく、カリキュラム作成時間や質問回答時間でも時給は発生する。

なので生徒1レッスン60分あたり、講師は2〜3時間を使うことになるはず…なわけだが。
それにしても生徒が払う値段が27,355円、講師が得る報酬が2000-6000円程度…？

なにかの間違いではないだろうかと思うぐらいの値段な気がするが、でもまあ世の中の値段ってそういうものですよね。


# 感想

プログラミングスクールの受講料の高さに驚いた。

インセンティブがどんなものか分からないけど、プログラミング講師ってプログラマに比べると全然稼げないね。

<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
【Swift】ちょっと学んだinitの使い方（引数アリ、ナシを組み合わせてみる）

Classの中に初期値を入れるためだけにInitを使っていたのですが。
こういう使い方するのがCodeをシンプルにするうえで重要だなと思ったのでメモ程度に。

①フツーに初期値を入れる場合↓

    class 名札 {
        var 名前: String
        init() {
            名前 = "太郎"
        }
    }
    let 私の名前 = 名札()
    print(私の名前.名前)
    //実行結果:太郎

今までは、初期値入れて初期値を代える場合はわざわざそのコードを書いてました。
でもそういえばinitって引数を使うこともできたなーと思って。

②引数を使う場合↓

    class 名札 {
        let 名前: String
        init(名前の文字: String) {
            名前 = 名前の文字
        }
    }
    let 君の名前 = 名札(名前の文字: "花子")
    print(君の名前.名前)
    //実行結果:花子

①初期値を入れる場合と、②引数を使う場合を同時に使ったら、
初期値を入れるだけの時より、Classが使いまわしやすくなるし、
引数を使うだけの場合よりも、インスタンスを書く行を短縮できるのではと思いました。

①②を組み合わせた場合↓

    class 名札 {
        let 名前: String
        init() {
            名前 = "太郎"
        }
        init(名前の文字: String) {
            名前 = 名前の文字
        }
    }

    let 私の名前 = 名札()
    print(私の名前.名前)
    //実行結果:太郎

    let 君の名前 = 名札(名前の文字: "花子")
    print(君の名前.名前)
    //実行結果:花子


このように1つのクラスでイニシャライザーを使い分けができるようになりましたね。
どっかで使えるんじゃないかと思ったり思わなかったり。。。

気づきがあったらまた更新します。
ではでは
競技プログラミングのためのC++ 超入門

# 競技プログラミングのためのC++ 超入門
競技プログラミング(AtCoder)を始めようと思っている。そこで、競技プログラミングで扱うC++の文法や機能をここにメモしておく。
(基礎中の基礎なので、超初心者以外見る価値はない(多分))


## main()の記述
~~return 0; を終了時に記述しなければいけないらしい。~~
main関数に限ってはreturn0;を省略できるそうです！
```C++:main.cpp
int main() {
    /* ここに処理を記述 */
    return 0;
}
```

## 標準ライブラリのインクルード / 名前空間？の指定
まずは名前空間を使用しなかった場合↓(cinという関数を使用します)
```C++:include.cpp
#include <bits/stdc++.h>  //この行で標準ライブラリが使えるようになる
int a;
std::cin >> a;
```
次に名前空間を使用した場合↓
```C++:namespace.cpp
#include <bits/stdc++.h>
using namespace std;  //この行で標準ライブラリの「std::」を省略できるようになる

int a;
cin >> a;
```

## 入力処理
cin(シーイン)は外部入力を受け付けて、変数に代入してくれる
">>"これを抽出子 (extractor) という(らしい)
```C++:in.cpp
int a;
cin >> a;  //入力されたものがaに代入される
```
## 出力処理
cout(シーアウト)は出力に使われる
"<<"これを挿入子 (inserter)という(らs以下略)
```C++:out.cpp
cout << "出力したい文字" << endl;  //endlを記述することで改行される
```
## 文字列
stringで文字を扱える
```C++:string.cpp
int a;
string str = "Hello World!";

a = str.size();            //size()        -> strの文字数が戻る(12)
a = str.at(2);             //at(2)         -> strの引数文字目の文字が戻る(e)
str = str.substr(2,　6);    //substr(2, 6)  -> strの第一引数文字目から、二つの引数を足した値-1文字目までが戻る(ello Wo)
```

## 条件分岐(if else)

```C++:bunki.cpp
int a;
cin >> a;

if (a > 100) {  //aが100より大きい時の処理
    cout << "aは100より大きいよ！";
} else {  //aが100より大きくない時の処理
    cout << "aは100以下だよ！";
}
```

## 繰り返し構文
for、 while、 continue、 breakに注目。
```C++:roop.cpp
for (i = 0; i < 10; i++) { //iが10未満の間ループする(１ループごとにiに+1する)
    cout << "こんにちは";
}

int a = 0; 
while(True) {  //無限ループ
    a++;
    if (a >= 10) {
        continue;  //ループの最初に戻る
    }
break;  //ループを抜ける
}
```

## 配列
```C++:vector.cpp
vector<string> vec;  //stringを扱う配列の定義
vec = {"aaa", "bbb", "ccc", "ddd"} //配列の初期化

cout << vec[2];  //vecの添字が引数の要素を参照("ccc")
cout << vec.size(); //vecの要素数を参照(4)
```

# まとめ
今日勉強を始めたばかりなので、とりあえず基礎を記述していった。
まずはこれらを覚えてから、他の標準ライブラリについて学んでいくのがいいのかなと思っている。
AtCoderで茶コーダー目指して今日から頑張ります。
【JavaScript関数ドリル】初級編のtake関数の実装アウトプット



## take関数の課題内容

_.take関数を自分で実装する課題。
https://lodash.com/docs/4.17.15#take

「課題内容」/「解説動画」/「解答例」を確認したい場合は、以下リンク先のページを参照。
https://js-drills.com/blog/take/


## 課題に取り組む前の状態

- 解答例を見なくてもできそうだと思った。


## 課題に取り組んだ後の状態

- だいたい解答例と同じようなコードを書くことができた。

## take関数の実装コード（答えを見る前）
```javascript

function take(arr, n = 1) {
    const newArray = [];

    if (arr.length <= n) {
        return [...arr];
    }
    if (n === 0) {
        return [];
    }
    for (let i = 0; i < n; i++) {
        newArray.push(arr[i]);
    }
    return newArray;
}
```
祝！初投稿～土を掘る仕事からエンジニアになるためにやったこと～



はじめまして！
株式会社Lance Digital Strategyの星野と申します。

ド素人エンジニアがIT企業に転職し、どのような環境で日々学んでいるかを
投稿していこうと思います。



[1.星野の経歴～土を掘っていたらエンジニアになっていた件～](#1-星野の経歴～土を掘っていたらエンジニアになっていた件～)
[2.後悔ベース～土を掘りながらでもIT業界に入るまでに準備しておけば良かったこと～](#2-後悔ベース～土を掘りながらでもIT業界に入るまでに準備しておけば良かったこと～)
[3.会社の進む道](#3-会社の進む道)
[4.仲間募集～バトルしようぜ～](#4-仲間募集～バトルしようぜ～)
[5.終わりに](#5-終わりに)

***
### **星野の経歴～土を掘っていたらエンジニアになっていた件～**
私、某ゼネコンにて建設業をしておりました。
転職直前まで、土を掘っていましたよ。     
傾斜地を平坦にしてました。

転職のきっかけは、
前職の上司と起業した幼馴染から声をかけられたことです。
持つべきものは友達ですね。
土？関係ないよ。

現在職場は、雑談多くね？という環境です。

楽しくて逆に良い環境なのかわかりません。


***
### **後悔ベース～土を掘りながらでもIT業界に入るまでに準備しておけば良かったこと～**

経歴の通り、他業種からの転職はまさに右も左もわからない状態です。

もし前職から転職するまでに有休消化・・などの時間があれば！
準備しておくべきことを挙げます。ちなみに土を掘っているときは勉強できませんでした。

#### ①ITパスポートの資格取得
これは資格が必要というわけではなく、ITの用語や流れの知識を付けるためです。
PCに強い!!と思っていても、業界用語はどうしてもわからないので勉強ついでに資格を取っちゃいましょう！

　●おススメはこの本。
##### キタミ式イラストIT塾 ITパスポート 令和04年　
https://www.amazon.co.jp/%E3%82%AD%E3%82%BF%E3%83%9F%E5%BC%8F%E3%82%A4%E3%83%A9%E3%82%B9%E3%83%88IT%E5%A1%BE-IT%E3%83%91%E3%82%B9%E3%83%9D%E3%83%BC%E3%83%88-%E4%BB%A4%E5%92%8C04%E5%B9%B4-%E3%81%8D%E3%81%9F%E3%81%BF-%E3%82%8A%E3%82%85%E3%81%86%E3%81%98/dp/4297124491

![ITパスポート.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659538/a990ed9a-4adc-5a68-9406-3da182e86945.jpeg)


#### ②Pythonで自分のサイトを作ってみよう
プログラミングの基礎で、かつ最も汎用性のあるPythonという言語で、
自分のサイトを作ってみましょう！よっぽど作りこまなければ無料でできます。
私は上記の幼馴染と趣味で音楽をやっているため、YoutubeにUPしている動画を切り抜いてサイトを作ってみました。

　●おススメはUdemyの講座
##### 【3日でできる】Django 入門 ( Python 3 でウェブアプリを作って AWS EC2 で公開！）
https://www.udemy.com/share/1023g03@3hb1nnuRr4X5UJxeGO92cx_vonUpX0y3yaigKtSjUdXDq8rN5QXbk1nYidGMAaU8DQ==/

![udemy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659538/5d2efbf0-1425-6402-dca5-b7e1ee58efa4.png)

#### ③色々な言語の基礎だけ知って、プログラミングの共通点を見つけよう
転職先の特色にもよりますが、ある程度の言語の基礎知識は覚えておきましょう。
ひたすらプログラミングだけを体で理解し、例えばHello World!の出し方１つでもどんな違いがあるか把握するだけでも違うと思います！

●おススメはやはりProgate!
 https://prog-8.com/courses

![プロゲート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659538/e7b68d36-6f53-3813-2130-fdb2f96ca922.png)


***
### **会社の進む道**

さて、私は入社からまだ１年経っていないのですが
誘って頂いた今の会社の進む道について、少し前に方針会議がありました。

そもそも起業したウチの竹下は、FinTech(Finance Technology)領域に精通しており、
現在も金融システムの運用保守・改善を主軸として社員一同働いております。

私も現在金融システムの運用保守に携わり、
ノウハウを集め、ゆくゆくはシステム構成のフォーマットを構築できるよう
幼馴染に日々しごかれております。

FinTech領域は難易度が高いですが、この領域で活躍する人材が求められている現在の環境に着眼し、
"自社で経験→PM/PMOとして活躍"できる人材の育成を重視しています。

まったくの未経験からIT業界とは何たるか、金融とはなんぞや、
この辺りを学べるスタートアップ企業はあまりないのではないかと。

ありがたや。




***
### **仲間募集～バトルしようぜ～**
上記でも記載の通り、FinTechに知見のあるPM/PMOや
FinTechに興味のある方とお話をしたいです。
これから知識を付けていきたい方も気軽にコメントしてみてください！


***
### **終わりに**
初心者エンジニアとして、取っ掛かりの部分でつまづく方も多いと思います。
難しい言葉を多用せず、同じく初心者のためのWikiとしても今後参考にしてもらえればと思います。
一緒に頑張りましょう。


次回は、FinTech業界として激アツの言語は今なにか・・。

このあたりから来週紐解いていければと思います！




ただ、無理をせず、ワークライフバランスを大切に。
さもないと、マダツボミからウツボット(鬱bot)になってしまうので・・。
おあとがよろしいようで。

Have a Nice Day!!
[Swift]weak var がnilになるケースに遭遇した！

## 投稿の経緯
循環参照を避けるための手段として使う`weak`を付与したインスタンスがnilになるケースに遭遇したので備忘録として投稿。


## 循環参照とは
> 循環参照とは「クラスAとクラスBのインスタンスがそれぞれ存在した時、クラスAのインスタンスをクラスBのプロパティに格納し、クラスBのインスタンスをクラスAのプロパティに格納する」といった状態になった時に、お互いにインスタンスを参照しあうため、どちらも解放されずにそのまま残り続けてしまう、という現象です。

下記記事から引用。

https://qiita.com/1234224576/items/2241266f7d307cd25ba9#:~:text=%E5%BE%AA%E7%92%B0%E5%8F%82%E7%85%A7%E3%81%A8%E3%81%AF%E3%80%8C%E3%82%AF%E3%83%A9%E3%82%B9,%E3%81%A6%E3%81%97%E3%81%BE%E3%81%86%E3%80%81%E3%81%A8%E3%81%84%E3%81%86%E7%8F%BE%E8%B1%A1%E3%81%A7%E3%81%99%E3%80%82

## weak varがnilになったケースのコード
### Controller
```Controller.swift
final class Controller {
    private let useCaseInput: InputPort
    
    init(input: InputPort) {
        self.useCaseInput = input
    }
    
    func onButtonTapped() {
        useCaseInput.callPresenter()
    }
}
```

### UseCase
```UseCase.swift
protocol InputPort {
    func callPresenter()
}

protocol OutputPort: AnyObject {
    func callOutput()
}

final class UseCase: InputPort {
    private weak var output: OutputPort?
    
    init(output: OutputPort) {
        self.output = output
    }
    
    func callOutput() {
        output?.showLog()
    }
}
```

### Presenter
```Presenter.swift
final class Presenter: OutputPort {
    func callOutput() {
        print("hoge")
    }
}
```


## 原因
UseCaseのinitが呼ばれ、`self.output`に初期値が代入された後、`self.output`は何も処理することがなく、役割を終え、弱参照（weak）に従ってインスタンスが削除されます。UseCaseのinitが呼ばれたのちにPresenterで`deinit`を書いておくと原因が明確になると思います。


## 対処法
今回のパターンは循環参照ではないので`weak`を付与せずに書けば解決します。
```UseCase.swift
protocol InputPort {
    func callPresenter()
}

protocol OutputPort: AnyObject {
    func callOutput()
}

final class UseCase: InputPort {
    private let output: OutputPort
    
    init(output: OutputPort) {
        self.output = output
    }
    
    func callOutput() {
        output.showLog()
    }
}
```


## 結論
当然といえば当然ですが、`weak`は循環参照が存在する場合のみ付与しましょう！
[Rails] undefined method `has_many' for main:Objectと出てきた時

### はじめに
DM機能を実装中に
`undefined method 'has_many' for main:Object`
という見たことがなかったエラーに遭遇したので記事にしました。

### 結論
今回の場合は`has_many`のせいではなく`room.rb(Roomモデル)`の一行目の記述が何故か消えてしまった事によるものでした。
```ruby:room.rb
class Room < #この部分が消えていた！
  has_many :users, through: :user_rooms
  has_many :chats, dependent: :destroy
  has_many :user_rooms, dependent: :destroy
end
```
正しくは
```ruby:room.rb
class Room < ApplicationRecord
  has_many :users, through: :user_rooms
  has_many :chats, dependent: :destroy
  has_many :user_rooms, dependent: :destroy
end
```

### 他にも
少し調べただけですがタイポしてたりするとこのエラーが発生するようです。

```ruby
put 'Hello World!'
#=> undefined method `put' for main:Object (NoMethodError)
```
→正しくはputs
この場合はタイポしているメソッドに対してエラーが出るのでわかりやすい。

他にも中身が入っていないもの(nil)に対してメソッドを書いているとか。
この場合もメソッドに対してエラーが出るみたいなのでちょっとわかりにくいですね。

#### 参考にさせていただきました
https://techacademy.jp/magazine/19776

### 最後に
今回はすぐに気が付けましたが`has_many`の方がを深堀りしていたらきっとまだ解決していなかったかもな、と思うとエラー文の<b>周り</b>を見ることの大事さを実感しました。

最後まで閲覧頂きありがとうございました！
Laravel環境を再構築するときのメモ(完全に個人用)

下記記事参照。
https://qiita.com/ucan-lab/items/56c9dc3cf2e6762672f4#%E7%92%B0%E5%A2%83%E3%81%AE%E5%86%8D%E6%A7%8B%E7%AF%89

こちらの環境構築方法はとても参考になりますので、
dockerでLaravel開発をしてみたい方は、
手順通りに環境構築してみてください。
【JavaScript関数ドリル】初級編のtakeRight関数の実装アウトプット

## takeRight関数の課題内容

_.takeRight関数を自分で実装する課題。
https://lodash.com/docs/4.17.15#takeRight

「課題内容」/「解説動画」/「解答例」を確認したい場合は、以下リンク先のページを参照。

https://js-drills.com/blog/takeright/

## 課題に取り組む前の状態

- 配列関数のslice()を使えばいいのかなと思った
- slice()の動きがうろ覚え


## 課題に取り組んだ後の状態

- slice()の動きをリファレンスで確認して実装した
- Returns the slice of array という要件の部分で、リファレンスではslice()は新しい配列を返すとあったので、解答例のように新しい配列の宣言をせず、そのまま返り値を戻したがよかったのか確信なし。

## takeRight関数の実装コード（答えを見る前）
```javascript
function takeRight(arr, n = 1) {

    if (n >= arr.length) {
        return arr;
    }

    if (n === 0) {
        return [];
    }

    return arr.slice(-n);
}


```

## takeRight関数の実装コード（解答例）

```javascript
function takeRight(array, n = 1) {
  if(n === 0) {
    return [];
  }
  if(n > array.length) {
    return [...array];
  }

  const takenArray = [];
  for(let i = 0; i < n; i++) {
    // array [1, 2, 3]
    // 1 + i => 1, 2, 3
    // array.length =>
    //   3 - (1 + 0) = 2,
    //   3 - (1 + 1) = 1
    //   3 - (1 + 2) = 0
    const indexFromRight = array.length - (1 + i)
    takenArray.unshift( array[indexFromRight] );
  }

  return takenArray;
}

console.log( takeRight([1, 2, 3]) );
// => [3]

console.log( takeRight([1, 2, 3], 2) );
// => [2, 3]

console.log( takeRight([1, 2, 3], 5) );
// => [1, 2, 3]

console.log( takeRight([1, 2, 3], 0) ) ;
// => []
```
pythonで他のサイト上の画像を直接s3に保存する

環境は以下です。
```
$ python3 --version
Python 3.10.4
```

コードは以下です。
```python
import requests
import boto3

# s3の設定
BUCKET_NAME = 'your-bucket-name'
s3 = boto3.resource('s3')
bucket = s3.Bucket(BUCKET_NAME)

# 画像を直接保存
url = 'https://hogehoge.jpg'
res = requests.get(url, stream=True)
bucket.upload_fileobj(res.raw, "foo/bar/baz")
```

AWS EC2インスタンス上から実行するとして、
IAMロールでs3へのアクセス権限を設定したものをアタッチしておくか、`aws configure`から認証情報の設定周りは済んでいる前提です。
Re:DashでIBM Cloud Db2 に接続してみた

## 初めに

オープンソースのBIツールである[Re:Dash](https://redash.io)から、IBM Cloud のDb2に接続してみた内容になっています。

Re:Dash では、標準でDb2の接続機能を持っています。
ただし、IBM CloudのDb2には、SSL接続する必要がありますが、標準でSSL接続には対応していないため、ソースコードの変更が必要になります。

※注意
投稿時の内容のため、バージョンアップ等で変わる可能性があります。また当内容を実施した結果の責任は負えませんので、ご了承ください。

## ソースの変更
/redash/query_runner/db2.py の「configuration_schema」と「_get_connection」メソッドをを以下のように変更します。

```
    def configuration_schema(cls):
        return {
            "type": "object",
            "properties": {
                "user": {"type": "string"},
                "password": {"type": "string"},
                "host": {"type": "string", "default": "127.0.0.1"},
                "port": {"type": "number", "default": 50000},
                "dbname": {"type": "string", "title": "Database Name"},
　　　　　　　　　"sslcert": {"type": "string", "title": "SSL Certification"}
            },
            "order": ["host", "port", "user", "password", "dbname"],
            "required": ["dbname"],
            "secret": ["password"],
        }

    def _get_connection(self):
        self.connection_string = ""DATABASE={};HOSTNAME={};PORT={};PROTOCOL=TCPIP;UID={};PWD={};Security=Ssl;SSLServerCertificate={};".format(
            self.configuration["dbname"],
            self.configuration["host"],
            self.configuration["port"],
            self.configuration["user"],
            self.configuration["password"],
　　　　　　self.configuration["sslcert"]
        )
        connection = ibm_db_dbi.connect(self.connection_string, "", "")

        return connection
```

## Redashでの接続設定
ソースを変更後、Re:Dashを起動し、下記図のDb2接続設定画面で、接続に必要な情報を入力します。
「SSL Certification」には、証明書のパスを指定します。（事前にIBM Cloudから証明書のファイルをダウンロードして、Re:Dashを動かすサーバーに配置しておいてください）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740352/789d731d-60da-70fb-9f2d-f4706ec1ef8d.png)
「sympyの内積(英:inner product)」を調べた。(内積の垂直条件を含む)

# wikipediaで

https://ja.wikipedia.org/wiki/内積

English版 未掲載

# WolframAlphaで

https://reference.wolfram.com/language/ref/Dot.html.ja?source=footer

# sympyで
Return dot product of self with another Point.

https://docs.sympy.org/latest/modules/geometry/points.html#sympy.geometry.point.Point.dot

# 内積の垂直条件
・零ベクトル(非ゼロベクトル)が、0個でも,1個でも,2個でもいいような気がしてきました。
・x,y,zの内１個以上が,nonzero　⇔　x2+y2+z2>0

[数学入試問題 様 ](https://kamelink.com/blog/2023/08/31/9-1-23-hukusimadai-syokunou-3/
)より
＞零ベクトルでない2つのベクトルのなす角が９０°であることは2つのベクトルの内積が0であることです．...

#### ChatGPT-3.5で
１行づつです。
```
ベクトの内積の垂直条件
ベクトの内積の垂直条件は、ベクトルの長さが0でもいいですか
```
？？？　どちらか？　少なくとも一方？　2つ？
＞**どちらかのベクトル**がゼロベクトルでないこと：
＞**少なくとも一方**のベクトルが長さ（大きさ）が0でないことが必要です。
＞ただし、**2つの非ゼロベクトル**が内積がゼロである場合、それらは直交または垂直であると言えます。


#### google検索で
？？？　こだわりがないみたいです。

https://www.google.com/search?q=%E5%86%85%E7%A9%8D%E3%81%AE%E5%9E%82%E7%9B%B4%E6%9D%A1%E4%BB%B6&rlz=1CAUHAM_enJP1038JP1038&oq=%E5%86%85%E7%A9%8D%E3%81%AE%E5%9E%82%E7%9B%B4%E6%9D%A1%E4%BB%B6&aqs=chrome..69i57j0i546l4j69i61l2.2106j0j15&sourceid=chrome&ie=UTF-8


# 以下 「旧タイトル:sympyで内積の定義の成分表示を調べてみた。」

オリジナル

https://examist.jp/mathematics/planar-vector/vector-yogenteiri/

#### sympyで
```python
from sympy import *
from sympy.vector import CoordSys3D
var('a1 a2 b1 b2')
N = CoordSys3D('N')
a = a1*N.i+a2*N.j
b = b1*N.i+b2*N.j
# (b-a).magnitude()**2=a.magnitude()**2+b.magnitude()**2-2*a.magnitude()*b.magnitude()*cost
print("#",(Rational(1,2)*(a.magnitude()**2+b.magnitude()**2-(b-a).magnitude()**2)).expand())
# a1*b1 + a2*b2
```