OmniAICreator/Qiita-1.07M huggingface dataset:
windowsでもlinuxコマンド（のようなもの）を使いたい

windowsのコマンドプロンプトでもlinuxでの`cat`や`pwd`などさまざまなコマンドを手癖で使いたくなりますが
その都度、コマンドプロンプトとの違いでモヤッとすることがあるため、手癖でよく叩きたくなるようなコマンドのみbatで用意する方法をまとめました。

## batを実行できるように準備

https://qiita.com/r12tkmt/items/b87ae823386d07c50c55

にもまとめていますが、linux用のbatを実行するために下記を準備しておく

- 環境変数のPATHEXTに`*.BAT`があること
- *.batを置く場所をPATHに設定してあること

## linux用batコマンド

`コマンド名.bat` としてファイルを用意していく

### cat

```bat
@type "%1"
```

### clear

```bat
@cls
```

### cp

```bat
@copy "%1" "%2"
```

### history

```bat
@doskey /history
```

### ls

```bat
@dir /b %*
```

`ll` も用意するのもアリ

### mv

```bat
@move "%1" "%2"
```

### pwd

```bat
@cd
```

### rm

```bat
@del "%1"
```

### which

```bat
@where "%1"
```
【RxSwift】TextFieldをViewModelに流すときに "Unexpectedly found nil while implicitly unwrapping an Optional value"

# どういうことか

たとえばViewControllerのTextFieldに入力した値を、ここでいう `LoginViewModel` の `nameText` に流したい。
ところが2行目で掲題のエラーになってしまう

```swift:ViewController.swift
        nameTextField.rx.text.orEmpty
            .bind(to: loginViewModel.inputs.nameText)
            .disposed(by: disposeBag)
```

## もしかして

```swift:ViewController.swift
    private var loginViewModel: LoginViewModel!
        
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // コレ
        loginViewModel = LoginViewModel()

        nameTextField.rx.text.orEmpty
            .bind(to: loginViewModel.inputs.nameText)
            .disposed(by: disposeBag)
```

ViewModelが初期化されていないのでは？
NavigationBar　(複数のItem追加)　(左右)　復習

# 今回の内容

* NavigationBarの左右にItemを追加

* NavigationBarにItemを複数個、追加

#コードと簡単解説

## 左側にUIBarButtonItemを追加

* ボタンにImageを付けずに、任意の`title`で作成 

* `action:`は任意で`#selector(@objc method)`などで設定します。(今回は.none)

```Swift:
navigationItem.leftBarButtonItem = UIBarButtonItem(title: "左ボタン", style: .done, target: self, action: .none)
```

## 右側にUIBarButtonItemを追加

* ボタンに`.action`のImageを設定したボタンを作成

* `action:`は任意で`#selector(@objc method)`などで設定します。(今回は.none)

```Swift:
navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .action, target: self, action: .none)
```

##複数のUIBarButtonItemを追加

* `.rightBarButtonItems`なら右側に追加

* `.leftBarButtonItems`なら左側に追加

* 追加するUIBarButtonItemの内容は、配列に入れる

```Swift:
navigationItem.rightBarButtonItems = [UIBarButtonItem(barButtonSystemItem: .action, target: self, action: .none),
                                      UIBarButtonItem(title: "右ボタン", style: .done, target: self, action: .none)]

```

#終わり
昨日、調べた内容の復習です。
ご指摘、ご質問などありましたら、コメントまでお願い致します。
好きなアイドルの曲に同じ言葉が何回出てくるか調べる

#はじめに
「=LOVE」というアイドルが好きです。

指原莉乃さんが作曲する歌詞が印象に残る曲ばかりなのですが、
特に好きな1曲(『桜が咲く音がした』)に同じ言葉(桜)が何回出てくるか調べました。

#環境
Mac OS 10.15.7
Python 3.8.8

#コード
```python:test.py　
file = "test.txt" #ファイル名
with open(file) as fileobj: #ファイルオブジェクトを作る
    text = fileobj.read() #ファイルを読み込む
    t = str(text) # 文字列に変換
    print(t.count("桜")) #数を数えて表示
```

#終わりに
3回でした！
意外と少なかった。

#参考文献
https://www.lyrical-nonsense.com/lyrics/equal-love/sakura-no-saku-oto-ga-shita/
逆数の総和を取る6つの方法とその誤差

# これは何？

https://qiita.com/ttf1998seiya/items/a60ff99c9fdffa09c28f

で素朴に総和をとっていて。

そういえば部分和を積み重ねることで誤差を減らせるよという話を最近 Qiita で見たな

https://qiita.com/kitahara1152/items/23e27622284f6d06fdba

と思い。

足し方でどう誤差が変わるのか調べてみた。

# 調べたこと

$$
\frac{1}{1} + \frac{1}{2} + \frac{1}{3} +...+ \frac{1}{n}
$$

を、n=100〜5100 についていろいろな方法で計算する。
得られた結果が、真の値を倍精度に丸めたものとどれだけ離れているのかを調べた。

# 足し方

以下の5通りの足し方を試した。

## 順に足す

こういうやつ。

```ruby:ruby
(1..n).each do |ix|
  sum += 1.0/ix
end
```

## 逆順に足す

こういうやつ。

```ruby:ruby
n.downto(1) do |ix|
  sum += 1.0/ix
end
```

## 遠くを足して積み重ねる

全体の和を、前半の総和と後半の総和を足すことで求める。
前半の総和は、前半の前半の総和 + 前半の後半の総和で。
後半の総和は、後半の前半の総和 + 後半の後半の総和で。
という感じの再帰呼び出しで求める。

## 近くを足して積み重ねる

先頭を 0 番目として。
まず、$2i+1$ 番目を $2i$ 番目に加える。
次に、$4i+2$ 番目を $4i$ 番目に加える。
次に、$8i+4$ 番目を $8i$ 番目に加える。
　　︙
　　︙
繰り返していけばそのうち0番目に全体の総和が入っている。

## 混ぜてから足す

手順は「遠くを足して積み重ねる」とほぼ同じなんだけど、その前にシャッフルする。

## sum で足す

ruby の `Enumerable` には `sum` という素晴らしいメソッドがある。
不思議な数学の魔力によって、誤差少なめで合計を求めることができるらしい。

こういう風に使う。

```ruby:ruby
(1..n).sum{ |ix| 1.0/ix }
```

## 誤差の評価

有理数で計算した正しい値と、それぞれの方法で計算した値の差の2乗の平均の平方根で評価する。

## コード

こんなコードを書いた。

```ruby:ruby
METHODS = []

METHODS.push def simple(n)
  sum=0
  (1..n).each do |ix|
    sum += 1.0/ix
  end
  sum
end

METHODS.push def reverse(n)
  sum=0
  n.downto(1) do |ix|
    sum += 1.0/ix
  end
  sum
end

def splitsum_impl(v,size)
  return v[0] if size==1
  s=size/2
  l=size-s
  s.times do |ix|
    v[ix] += v[ix+l]
  end
  splitsum_impl(v,l)
end

METHODS.push def split_sum(n)
  splitsum_impl((1..n).map{ |e| 1.0/e },n)
end

def sumnear_impl(v, step)
  return v[0] if v.size<step
  0.step(v.size-1,step*2) do |ix|
    v[ix]+=v[ix+step]||0
  end
  sumnear_impl(v,step*2)
end

METHODS.push def sum_near(n)
  sumnear_impl((1..n).map{ |e| 1.0/e },1)
end

METHODS.push def shuffle_sum(n)
  splitsum_impl((1..n).map{ |e| 1.0/e }.shuffle,n)
end

METHODS.push def use_sum(n)
  (1..n).sum{ |ix| 1.0/ix }
end

def main( lo, len )
  hi = lo+len
  sum=0
  expecteds = (1..hi).each.with_object({}) do |ix,o|
    sum+= 1r/ix
    o[ix]=sum.to_f
  end

  METHODS.each do |m|
    diff2s=[]
    (lo..hi).each do |v|
      sum = self.send(m,v)
      diff2s.push( (sum - expecteds[v])**2 )
    end
    puts("%12s %7.2fe-16" % [ m, (diff2s.sum / diff2s.size)**0.5*1e16] )
  end
end

main(100,5000)
```

`METHODS.push def` なんて初めて書いた。


## 実行結果

ruby 3.0.1 で実行するとこんな感じになった。

```text
      simple  172.03e-16
     reverse   41.35e-16
   split_sum    8.27e-16
    sum_near   10.35e-16
 shuffle_sum    8.21e-16
     use_sum    2.93e-16
```

# 結論

いろいろ試したわけじゃないから、これだけで色々言うことは出来ないわけだけど。

* やっぱり `sum` は優秀。
* 分割して加算してから総和を取るのはわりといい考え。
* 素直に足すとやっぱり誤差が大きい。

ということなのかなと思う。

とはいえ。
`sum` や分割加算は優秀なんだけど、元の記事にある「総和が N を超えたら加算をやめる」みたいな用途には使えない。

かといって、誤差なしの有理数で計算するには膨大な時間が必要だ。
難しいね。

# 追記

https://qiita.com/Nabetani/items/5d43abcf3d21aca762de

という記事を別に起こした。
SQL Serverのバックアップと復旧

##はじめに
SQL Serverのバックアップと復旧のクエリでの実行方法。

##バックアップ
```完全バックアップ.
BACKUP DATABASE [DB名] TO DISK = 'ファイルパス'
```

```差分バックアップ(前回の完全バックアップ以降の差分情報のみをバックアップする機能).
BACKUP DATABASE [DB名] TO DISK = 'ファイルパス' WITH DIFFERENTIAL
```

```トランザクションログバックアップ(前回のバックアップ以降の増分情報のみをバックアップする機能).
BACKUP LOG [DB名] TO DISK = 'ファイルパス'
```

##復旧
現時点への復旧方法(実行前にDBの接続を切断する)

1.ログ末尾のバックアップ
2.完全バックアップのリストア
3.差分バックアップのリストア
4.トランザクションログバックアップのリストア
5.「1」で取得したログ末尾のバックアップのリストア
6.DB復旧の終了
※差分バックアップやトランザクションログ時点でリストアを終了したい場合は対象のリストア終了後に「6」を実行

```
BACKUP LOG [DB名] TO DISK = 'ファイルパス' WITH NORECOVERY,NO_TRUNCATE
RESTORE DATABASE [DB名] FROM DISK = 'ファイルパス' WITH NORECOVERY,REPLACE
RESTORE DATABASE [DB名] FROM DISK = 'ファイルパス' WITH NORECOVERY
RESTORE LOG [DB名] FROM DISK = 'ファイルパス' WITH NORECOVERY
RESTORE LOG [DB名] FROM DISK = 'ファイルパス' WITH NORECOVERY
RESTORE DATABASE [DB名] WITH RECOVERY
```

##DBの接続の切断方法

1.対象のDBに接続されているspidを確認する
2.spidをkillする

```
sp_who
kill spid --spidが68の場合　例：kill 68
```
RDSのバックアップウィンドウ・メンテナンスウィンドウ とは

## 勉強前イメージ

よくわからない・・・

## 調査

### バックアップウィンドウ

自動バックアップが行われる時間のことを指します。
RDSで、以下の画面からバックアップウィンドウの時間を確認することが出来ます。
以下はデフォルトです。

![1RDS Management Console - Google Chrome 2021-08-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/961a8ff1-c1fa-2418-509f-a4530807932a.png)


自動バックアップ中はバックアッププロセス開始時にI/Oが一時数秒間中断し、
マルチAZだと数分間レイテンシーが高くなります。

### メンテナンスウィンドウ

システムの変更が適応される曜日と時間を定めたものになります。
例えば下記のメンテナンスウィンドウだと `sun:18:01-sun:18:31 UTC (GMT)` と記載されており、
世界標準時の日曜日、18:01 から 18:31まで適応します、という意味になります。
日本時間に直すと +9時間なので、月曜日の 03:01 から 03:31まで適応する ということになります。

![2RDS Management Console - Google Chrome 2021-08-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/7d26fa28-045a-53b5-15cb-2998cf402b05.png)

自分で設定を変更した際は、
メンテナンスウィンドウの際に変更するか、今すぐ設定変更するか、選択ができます。

## 勉強後イメージ

それ自体は知ってたけど、
バックアップウィンドウ・メンテナンスウィンドウっていうの知らなかった

## 参考

- [バックアップの使用](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_WorkingWithAutomatedBackups.html)
- [[SolutionArchitect Pro] AWS RDS メンテナンス と アップグレード](https://stay-ko.be/aws/solutionarchitect-pro-aws-rds-db-maintenance-upgrades/)
stylegan2-ada のアニメ画像の学習済みモデルの公開(CPUで動作可能)


## はじめに

- [StyleGAN2 ada](https://arxiv.org/abs/2006.06676) の検証とモデル公開
- CPU でのデモとその手順

## この記事の対象者

ディープラーニングモデルを手軽に実装したい方


# デモ

モデルとコードはよ！
って方のためにこちらの[Github](https://github.com/syu-tan/yomaker)で公開しています。

## 必要な環境

- python環境
- git

## 手順
```shell
git clone https://github.com/syu-tan/yomaker.git
cd yomaker
pip install -r requirements.txt
```

学習済みのモデルを Google Drive からダウンロードして `weights/` に配置する

```
python generate.py --outdir=out --trunc=1 --seeds=1 --network=./weights/00024-256px-animeportrait.pkl
```

![00024-seed0001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1873835/73390707-f114-6615-6d5d-3019492be0c7.png)

`out/seed0001.png` に画像が生成されています。


学習は float16 で学習していますが、float32 に変換しています。
CPU で動作するので GPU の制約がなく、多くの人が手軽に使えると思います。
CUDA の環境構築とかほんと大変。。。。。


## TODO
- 512px モデルの公開
- Dockerfile またはイメージの用意　

# まとめ
やっぱりなんでも手軽さが大切だと思いました。
何番煎じですか？って感じですが自身で一から全てやってみたかったのでお許しください

## Citation

[NVIDIA StyleGAN2 ADA](https://arxiv.org/abs/2006.06676)

## License

Copyright &copy; 2021, NVIDIA Corporation. All rights reserved.

This work is made available under the [Nvidia Source Code License](https://nvlabs.github.io/stylegan2-ada-pytorch/license.html).
Rubyの条件分岐・繰り返し処理

前回は、Rubyの基本文法について紹介しました。今回は、条件分岐について書いていこうと思います。
#条件分岐
ある条件が成り立つ時に、特定の処理をしたい場合に条件分岐を使います。最後にendを忘れないようにしましょう。
###構文

```ruby
if 条件式1
 処理A 条件式1が成り立つときの処理
elsif 条件式2
 処理B 条件式2が成り立つときの処理
else
 処理C 上記に当てはまらない場合
end
```

以下にサンプルコードを示します。入力した数字が5か6の倍数であるかを判断するプログラムです。

```ruby
puts "数字を入力してください。"
num = gets.to_i()

if num%5 == 0 && num%6 == 0
  puts "#{num}は5と6の倍数です。"
elsif num%6 == 0
  puts "#{num}は6の倍数です。"
elsif num%5 == 0
  puts "#{num}は5の倍数です"
else
  puts "5と6の倍数ではありません。"
end

```
演算子%はあまりを表します。
一つ目の条件：5かつ6の倍数であるとき
二つ目の条件：6の倍数であるとき
三つ目の条件：5の倍数であるとき
それ以外：上記に当てはまらない場合
実行結果は以下のようになります。

```
数字を入力してください。
100
100は5の倍数です

数字を入力してください。
36
36は6の倍数です。

数字を入力してください。
30
30は5と6の倍数です。
```
AmazonLinux2 で nginx: [emerg] unknown directive "stream" in /etc/nginx/nginx.conf: に遭遇した時の解決方法／備忘録

# ハマったこと
Amazon Linux2 に nginx をインストールしたあと、nginx.conf に ソケットのリバースプロキシ設定のために stream{} ディレクトリブ を設定後に nginx.service を開始した際に以下のエラーに遭遇した。

```
nginx: [emerg] unknown directive "stream" in /etc/nginx/nginx.conf:xx
```

(2021/08/12加筆）　前提として、以下を実行しておく必要がありました。別のインスタンスに作り直している際に気付いたので加筆しました。

```
sudo amazon-linux-extras enable nginx1
```

これを行わないと、対処実行時に、以下のエラーに遭遇します。

```
パッケージ nginx-mod-stream は利用できません。
エラー: 何もしません
```

これを解決した時の備忘録です

##　原因
ngx_stream_module.so が /usr/lib64/nginx/modules/ にない

##　対処

```
$ sudo yum install nginx-mod-stream

...（略）...

インストール:
  nginx-mod-stream.x86_64 1:1.20.0-2.amzn2.0.3                                                                                                                       

完了しました!

$ pwd
/usr/lib64/nginx/modules
$ ls
ngx_stream_module.so

```

上記の対処後に、バックエンドのサーバに対して、nginx（リバースプロキシ）を介して、クライアントから疎通できること確認できました。


# 以下、参考サイト

## nginx インストール手順（nginx公式）

http://nginx.org/en/linux_packages.html

  Amazon Linux の手順を参照


## it-swarm-ja.com のQA

https://www.it-swarm-ja.com/ja/nginx/etcnginxnginxconf86%E3%81%AE%E4%B8%8D%E6%98%8E%E3%81%AA%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%86%E3%82%A3%E3%83%96%E3%80%8C%E3%82%B9%E3%83%88%E3%83%AA%E3%83%BC%E3%83%A0%E3%80%8D/960015515/

以上です
node.js + express + herokuを使って LineBotを作ろう。 

# はじめに
おはようございます。こんにちは。こんばんは。
Watatakuです。

本日の記事はnode.jsとexpressを用いてLinebotを作って見ましょう。という記事になります。

# 対象者

- 初学者。
- LineBotを作りたい方または作ったことがない方。

# 書かないこと

- herokuアカウントの作り方。
- herokuへのデプロイ方法。

※herokuのアカウントが無いまたはherokuへのデプロイ方法がわからない方は[こちら](https://qiita.com/watataku8911/items/c2b79a141e6547ff4c79)をご覧ください。

# プログラムを書く前に
[Line Developers](https://developers.line.biz/ja/)にアクセスしログインしてください。
その後プロバイダーを作る
名前はなんでもいいです。Botの製作者として出るものです。

その後*「Create a new channel」*をクリック。

クリック後モーダルが立ち上がるので*「Messaging API」*をクリック。

必要事項を入力し*「Create」*し、チャネルを作成する。

## Channel access tokenの発行
後で使うのですが発行しておきます。
作成したチャネルの*「Messaging API」*タブの一番下にある*Channel access token*欄の黒ボタンを押して発行します。
![LINE_Developers.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116696/956c97f8-9653-1480-6b7c-b6c793e21ccb.png)

ちなみにもう一つ必要なキーがあるのですが、それは*Basic settings*タブ内に表示されています。

# プログラムを書いていく
## 環境構築

```console
$ mkdir linebot-sample
$ cd linebot-sample
$ touch index.js
$ npm init
```

## 必要パッケージのインストール

```console
$ npm install node-dev express @line/bot-sdk --save
```

## プログラムを書く

[実際のコード。](https://github.com/watataku8911/lineBot-sample/blob/master/index.js)

```js:index.js
"use strict";

const express = require("express");
const line = require("@line/bot-sdk");
const PORT = process.env.PORT || 3000;

const getChannelSeacret = "ご自身のchannel seacret key";
const getChannelAccessToken = "ご自身のchannel accsess token key";

const config = {
  channelSecret: getChannelSeacret(),
  channelAccessToken: getChannelAccessToken(),
};

const app = express();

app.post("/webhook", line.middleware(config), (req, res) => {
  console.log(req.body.events);

  Promise.all(req.body.events.map(handleEvent)).then((result) =>
    res.json(result)
  );
});

const client = new line.Client(config);

async function handleEvent(event) {
  if (event.type !== "message" || event.message.type !== "text") {
    return Promise.resolve(null);
  }

  /* -------------------------------------------
    ------- 返信メッセージの処理の記述ゾーン ---------
    ------------------------------------------- */

  let replyText = "";
  replyText = event.message.text; // event.message.textに自分のメッセージが入っている。

  /* ------------------------------------------
    ------------------------------------------
    ------------------------------------------ */

  return client.replyMessage(event.replyToken, {
    type: "text",
    text: replyText,
  });
}
app.listen(PORT);
console.log(`Server running at ${PORT}`);
```

このサンプルコードでは「オウム返し」のLineBotですが、コメントの**「返信メッセージの処理の記述ゾーン」**
で返答するメッセージの処理を記述してください。

# LineBotとプログラムを連携させる
上のセクションで書いたプログラムコードをherokuにデプロイする。
すると``https://○○○○○○○○○○.herokuapp.com``が作成されます。

なので*Messaging API*のこの欄の「Edit」をクリックし、
``https://○○○○○○○○○○.herokuapp.com/webhook``と入れる
![LINE_Developers-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116696/ef162a06-bf76-2172-acba-077badcc9749.png)

完成。

# 最後に
以上がLineBotの作成手順です。
是非ご参考にしていただければ幸いです。
英語講座で学ぶ最新トレンドに沿った開発の基礎 序

#駆け出しエンジニアとつながりたい。は正解か？

良くTwitterで流れてくる文言ですが、正直間違った方向で学ぶ可能性が高いと思います。自分も年齢の割にエンジニア歴が対して長くないのですが、意識しているのは、「正しいやり方を見つける」です。今はメチャできる人たち（年収数千万レベル）がガンガン情報発信してくれているので、近場の人やSNSで見つけた人に教えてっていきなり凸するよりは、正しい情報を見つける方が絶対的に◎です。
そういうお前は正しいやり方を知っているのか？というご意見もありそうですが、自分が紹介する講座は泣く子も黙るハーバード大学が提供しているものです。どこの誰が書いたかもわからん記事は信用できん！って方は当記事読むのはここで終了にして、動画を自分で見るだけでやっていくのも全然アリですが、この講座についてはやってみることをStrong Recommendしておきます・

講座は全て英語ですが、話していることの自分の理解レベルは、「なんとなくこんなことしゃべってるんだな～」程度です。英語苦手～とか思っている人も壁にメゲズに突っ込んで見ましょう。
玉石混交の日本語記事よりも話す内容が洗練されてるので、意外とわかりやすいです。


#edXの紹介

まず、自分がやっている講座ですが、
https://www.edx.org/
にある。CS50（Computer Science 50）という講座です。知ったきっかけは以下のようなTwitterの投稿でした。海外の有名大学が提供している講座が無料で色々と見れます。経歴としてアピールするにはお金を払って認定証を発行してもらう必要がありますが、見るだけなら基本無料です。GoogleやFacebookのアカウントを使うだけで簡単にログインできます。

#CS50's Web Programming with Python and JavaScript の概要

以下のように９つのセクションに分かれています。

0.HTML, CSS
1.Git
2.Python
3.Django
4.SQL, Models, and Migrations
5.JavaScript
6.User Interfaces
7.Testing, CI/CD
8.Scalability and Security

一通り学ぶとアプリケーションの開発についてザックリとしたイメージが持てます。基本的にはこの講座にあることをそのままやろうと思っていますが、それだとニーズ的にイマイチなので一つだけ自分流のアレンジをします。それは
「Windows環境で実践してみる」
ということです。この講座ではMacを使っているうえに基本設定周り（PythonとかRubyのインストール）は基本スルーされているのでそのあたりを参考になったらいいなと考えています。なおこれを読んでいる駆け出しエンジニアの方に言いたいのは、
「開発スタイルで一番スマートなのはWindows＋VisualStudioCode！」ということです。むしろ、これでなかったら「そのこだわりに何か意味あるの？」って聞かれると思ってください。
(仕事場においてはそこの開発環境のルールに素直に従いましょう。)

#開発環境の基本設定

①Visual Studio Code をインストールする。
②Git bash をインストールする。
　⇒VSCのメニューで「Terminal」→「New Terminal」して出てきた選択肢の中からGit bashを選択する。
③Python をインストールする。⇒コマンドプロンプトでpythonと打ってバージョンが表示されることを確認する。
④Gitのアカウントを作成する。

ここについては自分が勝手にそうだと思っているだけですが、まずはこれをやってください。VisualStudioCodeのインストールは特にやり方書かなくても最近のものであればOKとNEXTだけ押してればOKのはずです。
GitBashをTerminalに使うのは完全に自分の好みですが、この記事でやっていることは基本的に↑の設定をもとにやっているので、できればそのままでやって欲しいな～と思います。

![2021-08-10 (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479726/d8888359-459e-93ac-151c-738a2cc909fe.png)

以上が基本設定です。さっそくやっていきましょう！

#余談

講座の動画ですが[このページ](https://cs50.jp/web/2020/html-css/)にまとめてあります。ぶっちゃけ講座にログインしなくてもここの動画だけでも十分事足ります...。
C言語でリングバッファ、std::mapもどき

# 概要
C言語、組み込み、リソースが制約された環境下で使用できるライブラリです。
MITライセンス。

# ダウンロード
[LibCE(GitHub)](https://github.com/hrbm-smy/LibCE)
久しぶりにmakefileを書いたのでものすごく自信が無いです。アドバイス歓迎。

# 背景
末端下請けで色々なお客様から仕事を頂いておりますが、このやり方で仕事をしている場合、「権利ごと売り渡す」契約になっていることがほとんどです。

が、リングバッファとか、map(連想配列)とかは、大体どんなソフトを作るにあたっても欲しい。C++が使えればstd::vectorやstd::mapがあるので問題ないけど、Cには無い。自分の請けた範囲では、組み込みの案件では、いまだにCしか使えない場合が多い。

しょうがないので、お客様ごとに似たような機能で実装が違うモジュールを作って使用しているわけですが、もう、いいかげん面倒くさい。どうしてくれよう。

で、考えたのが、これまた契約において、「既存のものの権利は甲に属さない」となっている(あたりまえだけど)ので、案件のないときにあらかじめ作ってMITライセンスで公開してしまえば、どこで使っても契約違反にならない。はず。
色々契約書をひっくり返して眺めたけど、いけるはず。法律・権利関係は専門家でないので確実ではないですが、MITなら問題なさそう。ライセンス料とかいらない。ただ効率悪すぎるので使わせてくれ。

・・・ということで公開します。

# ポリシー的な、言い訳的な何か
ポリシーと言えばそうなのですが、実装が面倒で省略している、というのも真実。
実利用で問題が出たことがないので、これでいいだろうという判断です。
ただ、アラフィフのじじいが言ってることなので、昔の観念から抜け出せていない可能性もあります。もっといい方法論があるかもしれません。

## Remove、Delete(相当)は要らない
電源入れたらそのまま動きっぱなし、電源切ったらそこでCPUは動かなくなる。バッテリーバックアップさえされていないことがあるので、そもそもシャットダウン処理できない。
また、複数目的で使用する端末ではない。あらかじめ決めた機能容量で動かす。開発中に残記憶容量の関係などで増減はあるが、出荷時には確定する。
Remove、Deleteでき、それ前提で作っていると、メモリリーク的な現象が起きたりする。必要な容量は決まってるんだから、最初に用意して使う。

結論。**追加(Add)は必要だが、削除(Remove)は要らない。**

## Heapを使わない
環境によっては、そもそもmallocが無かったりしたこともあった。
高級言語を使っているとnewは当たり前で、もはやガベージコレクションさえかなりの環境で提供されているが、メモリアロケーションとは本来結構難しい問題をはらんでいる。で、さらにメモリリークの問題。使ってる最中に動かなくなる機器とか最悪。

結論。**Heapを使わない。あらかじめ作業領域を確保して使う。**

# 雑感
皆さん、背景にあるような場合、どうしてるんでしょうかねえ・・・？
今後の更新どうしよう。
[Rails] 検索機能の実装

##はじめに
オリジナルアプリに検索機能を実装したので、簡単な仕組みを記事に残しておきたいと思います。

ソースコードはあくまで私のアプリから抜粋しているのでわかりづらいかもしれませんが、ご了承ください。

よろしくお願いします。

##検索フォームの作成
検索フォームはform_withを使って実装しました。
メソッドはgetで、```local: true```の記述は忘れずに記載します。

非同期で実装するときは```remote: true```となるのですが、form_withはデフォルトがremoteとなっていうので、記述する必要はないらしいです。

```erb
<%= form_with(url: search_teachers_textbook_path(@teachers_textbook.id), remote: true, method: :get, class: "student-search-form") do |form| %>
  <%= form.text_field :keyword, placeholder: "生徒を検索する", class: "search-input" %>
  <%= form.submit "検索", class: "search-btn" %>
<% end %>
```

##searchアクションのルーティング設定

今回は自作でsearchアクションを作って検索ボタンを押した時の処理を書きます。
前回の記事で説明したcollectionとmemberのどちらかを使って設定をします。
前回の記事はこちら↓

https://qiita.com/minhee/items/45fa84ac90017dbdcfa9

私は、idを渡したかったのでmemberを使って実装しました。
ルーティングは下記のようになりました。

```ruby:routes.rb
#省略
resources :textbooks do
  member do
    get "search"
  end
end
```

これで各textbooksのidを渡せます。

##モデルに検索の処理を書く
検索の処理を行う場合は、あるテーブルから情報を引っ張り出してくるという流れがあるはずです。
検索をかけたいテーブルのモデルにsearchメソッドを定義します。

ここで記述するのは検索をかけた時の、取り出し方を記述するイメージです。

```ruby:/models/student.rb
#省略
  def self.search(search)
    if search != ""
      Student.where('name LIKE(?)', "%#{search}%")
    else
      Student.all
    end
  end
```

この記述は、検索フォームに入力された文字列が、Studentテーブルのnameカラムに含まれるレコードを検索しています。

もし検索フォームが空だったら全て取り出します。

##searchアクションをコントローラへ記述

searchアクションをコントローラーへ記述し、先ほど定義したsearchメソッドを使って変数に格納しています。

```ruby:textbooks_controller
#省略

@students = Student.search(params[:keyword])

#省略
```

ここではこれだけしか書いていませんが、私はビューで使う変数などがたくさんあったり、変数の中身をいろいろ加工したかったので実際は他にも処理を書いています。


params[:keyword]と記述することで検索結果を渡しています。


##検索結果のビューを作成

searchアクションに対応するビューはの名前はsearch.html.erbとなります。
その名前のファイルを適切な場所（私の場合はtextbooksコントローラのsearchアクションなので、```app/views/textbooks/search.html.erb```となります。

searchアクションが行われた後のビューをこのファイルに記述して完成です。


##終わりに
検索機能を想像するとなんとなく難しいイメージでしたが意外と簡単でした。

これをインクリメントサーチにするとすごく複雑そうだったので今回はこの方法で実装しました。
【AtCoder】ABC213をPython3で解説（ABCD）

ABC213の解説。

https://atcoder.jp/contests/abc213

## A - Bitwise Exclusive Or
### 解説

`xor` は、排他的論理和を表す。
これについては、`^` を用いることで答えがでる。

### コード

```python
a, b = map(int, input().split())

print(a ^ b)
```

## B - Booby Prize 
### 解説

下位から2番目の選手番号、つまり、スコアが2番目に大きい選手番号を答える問題。

`enumerate()`でスコアと選手番号をあわせてタプルにする。
その後、降順でソートし、リストの2番目の値を取ればAC。

### コード
```python
n = int(input())
alist = map(int, input().split())
result = []

for i, v in enumerate(alist):
    result.append((v, i+1))

ans = sorted(result, reverse=True)
print(ans[1][1])
```

## C - Reorder Cards
### 解説

今回の問題は、`*`と数値を使って、テーブルを作ってコードを書く、のではない。
それをしてしまうと、`RE`してしまう。

今回は、**座標圧縮**という方法を用いる。座標圧縮の手順は次のとおりだ。

- 座標についてのリストを作成する
- `set()`で重複を取り除く
- リストに戻して昇順に並び替え（ソート）する
- 番号と座標を合わせて辞書化
- もとのリストから値を参照する

この順番にコードを記述することで、`AC`できる。

### コード
```python
H, W, N = map(int, input().split())
X, Y = [], []

for i in range(N):
    x, y = map(int, input().split())
    X.append(x)
    Y.append(y)


Xdict = {x: i+1 for i, x in enumerate(sorted(list(set(X))))}
Ydict = {y: i+1 for i, y in enumerate(sorted(list(set(Y))))}


for i in range(N):
    print(Xdict[X[i]], Ydict[Y[i]])
```

## D - Takahashi Tour

### 解説

グラフ理論の問題。

都市1をスタートして、番号が小さい順番に深さ優先探索していく。深さ優先探索には、再帰関数を用いる。

まず、都市同士のつながりをもったグラフ作りたいので、隣接行列を作成する。今回は、番号が小さい順に訪れたいので、あらかじめ各行をソートしておく。

あとは、深さ優先探索をして、訪れた都市をひとつずつリストに追加していき、出力すれば`AC`。（この出力を**オイラーツアー**という。）

### コード
```python
# 再起の深さ上限を増やす
import sys
sys.setrecursionlimit(300000)

N = int(input())
graph = [[] for _ in range(N + 1)]

for i in range(N - 1):
    a, b = map(int, input().split())
    graph[a].append(b)
    graph[b].append(a)

for i in range(N + 1): # 隣接しているもので小さい順に訪れたいので、ソート
    graph[i].sort()

ans = []

def dfs(curr, prev): # DFS（深さ優先探索）
    ans.append(curr) # 訪れたノードを追加
    for nxt in graph[curr]:
        if nxt != prev:
            dfs(nxt, curr)
            ans.append(curr)

dfs(1, -1)
print(*ans) # オイラーツアー
```

## 編集後記

D問題解説するだけでものすごく知識がついている気がす
VSCODE で マークダウンで要件定義を書こう

## こんなことができる

flowjs形式でマークダウンに下記を埋め込むと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302078/c6c01ec9-2a16-2b43-ea30-1168d339c222.png)
このようにフローチャートが表示できたり
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302078/ae8f4b9b-1377-57af-cfae-0459f9f1e8f2.png)

[PlantUML](https://plantuml.com/ja/)を活用して下記のようなマークダウンを書くと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302078/061b2a59-d71d-76c8-9c87-1e9ecc374780.png)
こんな図が表示されたり
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302078/8b2a4ebd-1239-cef6-3b77-170a8e8f0659.png)

下記のようなマークダウンを書くと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302078/3b3c4398-4343-30f1-df59-7ccf828699a3.png)
こんな風に画面定義が表示されたりします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302078/dc6232c7-4d64-6eff-69ab-071bb8520ed3.png)


## このQiitaの前提条件

WSL2環境で開発をしているリポジトリー内のディレクトリーで要件定義のマークダウンを管理したい。

## 手順概要

### 1. プラグインの「Markdown Preview Enhanced」を導入する

### 2. WSL2側でホストWindowsのフォントを使えるようにする

`sudo vim /etc/fonts/local.conf` でフォントの設定を編集します。たぶん空なので下記の内容を追記してください。

```xml
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
    <dir>/mnt/c/Windows/Fonts</dir>
</fontconfig>
```

### 3. WSL に Javaをインストールします。

```bash
sudo apt-get install default-jre
sudo apt install graphviz
```

### 4. プレビューする

`Ctrl + K V` もしくは、メニュー→表示→コマンドパレットから「Markdown: Markdown Preview Enhanced: Open Preview to Side」を選んでください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302078/b87a9ae2-6b0f-4e09-c80f-49e34824c7f0.png)

### 5. PDFへ書き出す

プレビュー画面で右クリックで「Chrome(Puppeteer)で書きだし」がおススメです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302078/973feb4d-fb44-abee-f559-583de69c12c5.png)
C#8.0から使えるNull合体割り当て演算子「??=」を使ってみた。

# はじめに
C#のお勉強として公式のドキュメントを読んでいたらC#8.0からNull合体割り当て演算子というものが使えるようになったようなので実際に使ってみました。

https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/operators/null-coalescing-operator

これを用いることでif文でnull判定を行う記述を減らすことが可能になります。
## サンプルコード

```csharp:従来のコード(C#7まで).cs
static void Main(string[] args)
{
    int? a = null;

    if(a is null)
    {
        a = 5;
    }
    // C#7.0以降でしたら以下も可能です。@c-ari47さんにコメントでご教示いただきました！ありがとうございます！
    // a = a ?? 5;

    Console.WriteLine(a);  // 5が出力される。
}
```

```csharp:改良後のコード(C#8.0以降).cs
static void Main(string[] args)
{
    int? a = null;

    a ??= 5;

    Console.WriteLine(a);  // 5が出力される。
}
```

一気にスマートになりましたね！

#おわりに
個人的にはC#7.0までのif文を用いた判定方式の方が直感的に分かるので好きなのですが、やはり新しい書き方を身につけていきたいので今後はこのNull合体割り当て演算子をどんどん利用していこうと思います！！
C++でConfigparser的なものを使いたかった。

最近C++を勉強し始めました。

PythonのConfigparser的なものは無いかなぁと思って探したところ、[Inipp](https://github.com/mcmtroffaes/inipp)を見つけたので使ってみました。

Boostでもptreeを用いてiniファイルを扱えますが、デフォルト値を設定したかったのでこちらを採用しました。

他に便利なものあれば教えて頂けると助かります。

# サンプル
```config.ini
[DEFAULT]
value1 = number
value2 = 123
value3 = true

[setting1]
value4 = setting1

[setting2]
value4 = setting2
```

```sample.cpp
#include <fstream>
#include <string>

#include "inipp.h"

int main()
{
	inipp::Ini<char> ini;
	std::ifstream is("config.ini");
	ini.parse(is);
	ini.strip_trailing_comments();
	ini.default_section(ini.sections["DEFAULT"]);
	ini.interpolate();

	std::string value1;
	int value2;
	bool value3;

	inipp::get_value(ini.sections["setting1"], "value1", value1);
	inipp::get_value(ini.sections["setting1"], "value2", value2);
	inipp::get_value(ini.sections["setting1"], "value3", value3);

	std::cout << "value1: " << value1 << std::endl;
	std::cout << "value2: " << value2 << std::endl;
	std::cout << "value3: " << value3 << std::endl;
	std::cout << "---------------------" << std::endl;

	std::string value4_setting1;
	std::string value4_setting2;
	inipp::get_value(ini.sections["setting1"], "value4", value4_setting1);
	inipp::get_value(ini.sections["setting2"], "value4", value4_setting2);
	std::cout << "value4_setting1: " << value4_setting1 << std::endl;
	std::cout << "value4_setting2: " << value4_setting2 << std::endl;

	return 0;
}
```

### 出力
```
value1: number
value2: 123
value3: 1
---------------------
value4_setting1: setting1
value4_setting2: setting2
```
【初学者向け】HTTP／HTTPSとは

## はじめに
Web技術のキホンのキである「HTTP／HTTPSとは何か」について、図解しました。
まずは全体像を把握することが大切なので、必要最低限のポイントのみに絞っています。
説明を簡略化・割愛している部分もありますので、その点ご理解ください。

![課題2_小山和樹.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1225780/feb81927-d768-c05c-2f49-9fcbfcb4e139.jpeg)
![課題2_小山和樹 (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1225780/b33e02c4-8452-9ccf-49e2-e4d8c31296e4.jpeg)
![課題2_小山和樹 (2).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1225780/57997424-233b-b793-38c2-0fced8bd22be.jpeg)
![課題2_小山和樹 (3).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1225780/beba6b0f-8d79-3db4-fd0e-0a7d47beb6cc.jpeg)
![課題2_小山和樹 (4).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1225780/706bed10-8dc1-b57a-d438-d478b1d56a77.jpeg)

## 参考記事
- [HTTPとは？HTTPSとの違いをサイト移行で実施する
リダイレクト設定などをもとに解説](https://www.itmanage.co.jp/column/about-http-https/)
- [第1回　HTTPプロトコルとは](https://atmarkit.itmedia.co.jp/ait/articles/1703/29/news045.html)
- [[初心者必見] 通信プロトコルのHTTPとは? 何かわかりやすく解説します!](https://www.web-knowledge-info.com/wp/web_basic_knowledge4/)
Databricksジョブのマルチタスクオーケストレーションの有効化

[Enable orchestration of multiple tasks with Databricks jobs \| Databricks on AWS](https://docs.databricks.com/administration-guide/workspace/enable-mt-jobs.html) [2021/7/22時点]の翻訳です。

> [Databricksクイックスタートガイド](https://qiita.com/taka_yayoi/items/125231c126a602693610)のコンテンツです。


> **プレビュー**
この機能は[パブリックプレビュー](https://docs.databricks.com/release-notes/release-types.html)です。

Databricksでは、[ジョブにおける複数のタスクのオーケストレーション](https://docs.databricks.com/data-engineering/jobs/index.html)をサポートしています。この機能を利用するには、admin consoleから機能を有効化する必要があります。一度有効化するとこの機能を無効化することはできません。複数タスクのオーケストレーションを有効化するには：

1. [admin console](https://docs.databricks.com/administration-guide/admin-console.html)にアクセス
1. **Workspace Settings**タブをクリック
1. **Jobs**セクションで、**Task orchestration in Jobs**とグルスイッチをクリック
1. **Confirm**をクリック

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
ReplitでNode.js v16を使用する

先日、discord.js v13がリリースされました。

ですがv13は、Node.jsのバージョンがv16以上でないと使えません。

では、Node.jsがv12であるReplitは使えない！？と思ってしまいますが、裏技で使うことができます。
# 使う方法
## Node.jsのインストール
```bash
npm install -D node@v16
```
でNode.jsのv16をインストールします。
## Replitをいじる
そのあと`.replit`に

```toml
run="npx node index.js"
```
以下を付け加えましょう。(index.jsは適宜変更してください)

# 実行すると...?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1518670/7f579f5c-d169-f289-341d-401994da058a.png)
きちんとv12以上の文法が使えています。
(エディタ上ではエラーのように見えますが、ちゃんと実行できます。)
【テストコード】「Mysql is not connected」というエラー

#今回の概要
**①テストコードを行う**
**②「MySQL client is not connected」のエラーが発生**
**③「sleep」を記述して解決**

##①テストコードを行う
*◇下記のテストコードを行うときにエラーが発生*

```perl:purchase_shipping_spec
require 'rails_helper'

RSpec.describe PurchaseShipping, type: :model do
  before do
    @user = FactoryBot.create(:user)
    @item = FactoryBot.create(:item)
    @p_s = FactoryBot.build(:purchase_shipping, user_id: @user.id, item_id: @item.id)
  end
  describe '商品購入機能' do
   
〜テストコードは省略〜
  end
end
```
##②「MySQL client is not connected」のエラーが発生

*◇エラー内容* 

```perl:
ActiveRecord::StatementInvalid:
Mysql2::Error: MySQL client is not connected
```

*◇エラー原因*
処理速度の速いPCやmacbook Proなどを使用されている場合に発生することが多いみたいですが、、、
PCの処理速度の関係でbeforeに記載されているコードが読み込まれる前に、次の処理に移っていることが原因の可能性が高いみたいです

##③「sleep」を記述して解決

*◇解決方法*
purchase_shipping_spec.rbの下に「sleep(3）」と記述
※sleepとは、次の処理実行まで処理を遅延させるメソッド

```perl:purchase_shipping_spec
require 'rails_helper'

RSpec.describe PurchaseShipping, type: :model do
  before do
    @user = FactoryBot.create(:user)
    @item = FactoryBot.create(:item)
    @p_s = FactoryBot.build(:purchase_shipping, user_id: @user.id, item_id: @item.id)
    sleep(3)
  end
```

*◇記述の挙動*
処理が少し遅くなったが、解決！

```perl:テストコード結果
PurchaseShipping
  商品購入機能
    購入できるとき
      全ての項目が入力されていれば保存ができること
      建物名がなくても保存ができる
      購入できないとき
      tokenが空では登録できない
      郵便番号が空では登録できない
      郵便番号「3桁ハイフン4桁」ではないと登録できない
      郵便番号はハイフンがないと登録できない
      都道府県を選択しないと登録できない
      市区町村が空では登録できない
      番地が空では登録できない
      電話番号が空では登録できない
      電話番号が10桁以下では登録できない
      電話番号が11桁以上では登録できない
      電話番号が半角文字混合だと登録できない
      電話番号に-があると登録できない

Finished in 42.56 seconds (files took 1.74 seconds to load)
14 examples, 0 failures
```
以上。
google colaboratory上でPySparkをテストするための環境構築手順

# 要約
- PySparkを触ってみたいが、手短な環境を容易するのが面倒。
- google Colaboratory上で簡単にテストできる手順が紹介されていたため、試してみた。

# 参考文献
- https://toeming.hatenablog.com/entry/2021/3/21/colab_spark_base_env  
- https://www.analyticsvidhya.com/blog/2020/11/a-must-read-guide-on-how-to-work-with-pyspark-on-google-colab-for-data-scientists/


# 環境構築
```python
!apt-get update
!apt-get install openjdk-8-jdk-headless -qq > /dev/null
!wget -q http://archive.apache.org/dist/spark/spark-2.3.1/spark-2.3.1-bin-hadoop2.7.tgz
!tar xf spark-2.3.1-bin-hadoop2.7.tgz
!pip install -q findspark

import os
os.environ["JAVA_HOME"] = "/usr/lib/jvm/java-8-openjdk-amd64"
os.environ["SPARK_HOME"] = "/content/spark-2.3.1-bin-hadoop2.7"

import findspark
findspark.init()

import pyspark

# SparkContext
from pyspark import SparkConf, SparkContext
conf = SparkConf().setMaster("local").setAppName("My App")
sc = SparkContext(conf=conf)

# SparkSession
from pyspark.sql import SparkSession

#spark = SparkSession.builder.getOrCreate() 
spark = SparkSession.builder.appName("My App").getOrCreate()
```


# PySparkが使えるかテスト

```python
'''
SparkDataFrameの作成
'''

stringJSONRDD = sc.parallelize((""" 
  { "id": "123",
    "name": "Katie",
    "age": 19,
    "eyeColor": "brown"
  }""",
   """{
    "id": "234",
    "name": "Michael",
    "age": 22,
    "eyeColor": "green"
  }""", 
  """{
    "id": "345",
    "name": "Simone",
    "age": 23,
    "eyeColor": "blue"
  }""")
)

sdf = spark.read.json(stringJSONRDD)
```

```python
'''
.show()
'''

sdf.show()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374781/9e16ecf2-158a-9c4e-8a16-2f0303eebca7.png)

```python
'''
.printSchema()
'''

sdf.printSchema()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374781/d973661b-145c-59f0-4440-5301734aed23.png)


# 結果
データフレームの作成と、表示に成功。
LinuxのC/C++言語で二重起動防止

案外、UNIX系のC/C++での二重起動/多重起動防止について解説しているサイトがなかなか見つからず、サンプルも見つからないので以下URLを参考にさせて頂き pidfile でやる方法を以下にさくっと。

https://cpplover.blogspot.com/2013/06/unixos.html

`/var/run/[プログラム名]`のファイルを開き、「ファイルが存在し、そのPIDのプロセスが起動している」なら二重起動。そうでなければ初回起動。
`/var/run/[プログラム名]`のファイルが無ければ作って、自分のPIDを書き込み。
この仕組みにより、Ctrl+Cなど予期せぬ終了にも対応です。

Cでやる方は、文字列処理をchar配列とprintf()に読み替えてください（丸投げ）。

```sample.cpp
#include <stdio.h>
#include <stdlib.h>
#include <iostream>

int main()
{
	{
		// 準備
		string tmp_path = "/var/run/application"; // アプリ名など適当な被らないファイルを用意
		// 自分のPIDを書き出し準備
		string pid_write_script = "echo " + to_string(getpid()) + " > " + tmp_path;
		// 二重起動のチェック
		//bool first = true; // true=初回起動
		FILE *tmp_fd = fopen(tmp_path.c_str(), "r");
		if (tmp_fd != NULL) {
			// pidfile があった
			char *cret;
			char str[256];
			cret = fgets(str, 256, tmp_fd);
  			fclose(tmp_fd);
			if (cret != NULL) {
				// pidfile に書かれたPIDを読み込む
				char *endp;
				errno = 0;
				long file_pid = strtol(str, &endp, 10);
				if (errno == 0) {
					// そのPIDのプログラムが起動中かどうかチェック
					string pid_path = "/proc/" + to_string(file_pid);
					FILE *pid_fd = fopen(pid_path.c_str(), "r");
					if (pid_fd != NULL) {
						fclose(pid_fd);
						// 二重起動だった
						//first = false;
						return 1;
					}
				}
			}
		}
		// 自分のPIDを書き出し
		int ret = system(pid_write_script.c_str());
		if (ret != 0) {
			cout << "unknown error" << endl;
		}
	}
	
	return 0;
}
```
cannot import name 'Speech2TextTokenizer' from 'transformers.models.speech_to_text'がでたときの対処方法について

# はじめに

今回もハンズオン通りにやっていましたが、途中でエラーになってしまったので対処しました。

# 問題

訓練済みのトークナイザーを取得しようと以下のコードを入力したところエラーが出ました。

```
tokenizer = T5TokenizerFast.from_pretrained('t5-small')
```

エラーは必要な`Speech2TextTokenizer`がインポートできないよというものでした。

```
/usr/local/lib/python3.7/dist-packages/transformers/models/auto/tokenization_auto.py in <module>()
    143     from ..pegasus.tokenization_pegasus import PegasusTokenizer
    144     from ..reformer.tokenization_reformer import ReformerTokenizer
--> 145     from ..speech_to_text import Speech2TextTokenizer
    146     from ..t5.tokenization_t5 import T5Tokenizer
    147     from ..xlm_prophetnet.tokenization_xlm_prophetnet import XLMProphetNetTokenizer

ImportError: cannot import name 'Speech2TextTokenizer' from 'transformers.models.speech_to_text' (/usr/local/lib/python3.7/dist-packages/transformers/models/speech_to_text/__init__.py)

---------------------------------------------------------------------------
NOTE: If your import is failing due to a missing package, you can
manually install dependencies using either !pip or !apt.

To view examples of installing some common dependencies, click the
"Open Examples" button below.
---------------------------------------------------------------------------
```

ちなみにここでは`T5TokenizerFast`を利用しましたが、`T5Tokenizer`であればエラーが起きていませんでした。

# 解決方法

`Transformer`のインストールのバージョン指定をしました。

```
!pip install transformers
　　　　　　↓ # 変更
!pip install transformers==4.3.0
```

無事動きました。
バージョンによってあったりなかったりでエラーになります。
バージョン指定しないと最新がインストールされます。

# おわりに

HugginFace関係でライブラリないよと言われたら、古いライブラリにとりあえずしてみるのはありですね。
今回は解決方法が簡単ですので、記事も簡素になりました。
近年ソフトウエア技術のトレンド

# IPA 
まずは社会の動向から調べ始めるのが妥当と考える。IPAの資料は非常に参考になる
・　[IT社会の動向調査・分析、情報発信](https://www.ipa.go.jp/ikc/our_activities/rs.html)


# InfoQ
情報サイトInfoQでは、様々なトピックがテクノロジー採用ライフサイクルのどこにあるかをレポートしている。
近年の技術動向を知るきっかけになる。

[Wiki:テクノロジー採用ライフサイクル](https://ja.wikipedia.org/wiki/%E3%83%86%E3%82%AF%E3%83%8E%E3%83%AD%E3%82%B8%E3%83%BC%E6%8E%A1%E7%94%A8%E3%83%A9%E3%82%A4%E3%83%95%E3%82%B5%E3%82%A4%E3%82%AF%E3%83%AB)
[テクノロジー・ライフサイクルとは](https://www.nsspirt-cashf2.com/entry/2018/09/24/201/)

## トレンドレポート

| No | リンク |
|:-|:-|
|1   |ソフトウェアアーキテクチャと設計のInfoQトレンドレポート<br>[・2022年4月](https://www.infoq.com/jp/articles/architecture-trends-2022/?itm_source=articles_about_InfoQ-trends-report&itm_medium=link&itm_campaign=InfoQ-trends-report)<br>[・2021年4月](https://www.infoq.com/jp/articles/architecture-trends-2021/?itm_source=articles_about_dotnet&itm_medium=link&itm_campaign=dotnet)|
|2|[2020年第一四半期のソフトウェアチームとチームワークのトレンドレポート](https://www.infoq.com/jp/articles/teams-teamwork-trends-2020/)
|3|DevOpsとクラウドInfoQトレンドレポート<br>[・2022年6月](https://www.infoq.com/articles/devops-and-cloud-trends-2022/?utm_source=twitter&utm_medium=link&utm_campaign=calendar)<br>[・2021年7月](https://www.infoq.com/articles/devops-and-cloud-trends-2021/?utm_source=twitter&utm_medium=infoq&utm_campaign=cloud21trendsreport)
|4|AI、ML、データエンジニアリングのトレンドレポート<br>[・2021年8月](https://www.infoq.com/articles/ai-ml-data-engineering-trends-2021/?utm_campaign=infoq_content&utm_source=twitter&utm_medium=feed&utm_term=ai-ml-data-eng)<br>[・2022年8月](https://www.infoq.com/articles/ai-ml-data-engineering-trends-2022/)
|5|Javaのトレンドレポート<br>[・2021年12月](https://www.infoq.com/jp/articles/java-jvm-trends-2021/?itm_source=articles_about_InfoQ-trends-report&itm_medium=link&itm_campaign=InfoQ-trends-report)<br>[・2020年9月](https://www.infoq.com/jp/articles/java-jvm-trends-2020/)|
|6|[JavaScriptとWeb開発-2020年](https://www.infoq.com/jp/articles/javascript-web-development-trends-2020/)|
|7|[.NETのトレンド-2022年](https://www.infoq.com/articles/dotnet-trends-2022/?utm_campaign=infoq_content&utm_source=twitter&utm_medium=feed&utm_term=dotnet)|


# Thoughtworks

| No | リンク |
|:-|:-|
|1   |[Technology Radar](https://www.thoughtworks.com/radar)


# Stack Overflow
StackOverFlow 2021の開発者調査結果のリンク。
 
| No | リンク | 備考 |
|:-:|:-:|:-:|
|1   |[2021 Developer Survey](https://insights.stackoverflow.com/survey/2021?_ga=2.130949327.1702272376.1629038161-1683864203.1629038161#most-popular-technologies-new-collab-tools)   |開発ツール・言語に対するヒアリング結果が纏まっている。   |


# ガートナー社

| No | リンク | 
|:-:|:-:|
|1   |[戦略的テクノロジのトップ・トレンド 2022](https://www.gartner.co.jp/ja/newsroom/press-releases/pr-20211117) |  
|2   |[戦略的テクノロジのトップ・トレンド 2023](https://www.gartner.co.jp/ja/newsroom/press-releases/pr-20221101-techtrends) | 

[ハイプ・サイクル](https://www.gartner.co.jp/ja/research/methodologies/gartner-hype-cycle)によって、テクノロジーの動向を視覚的に表現している。
[ハイプ・サイクルの一覧](https://www.gartner.co.jp/ja/promo/hype-cycle-report-list)
「Julia で散布図を描く」検索結果の一部

JuliaでPlotsするよ
https://qiita.com/I_ppp/items/dca3552affa6a672e4bd

Julia早引きノート［23］JuliaでのMatplotlibによるグラフ描画
https://qiita.com/ttabata/items/96a0e172addfac690cca

Plots.jl+StatsPlots.jlでグラフを描画する
https://ki-chi.jp/?p=1005

Julia言語で任意の点を散布図に描画するには
https://abrakatabura.hatenablog.com/entry/2016/11/12/081354

[Julia] Plotのインストールと描画 
http://hidehikomurao.blogspot.com/2019/04/julia-plot.html

Plots/GR: グラフ package のおすすめ
http://www.cas.cmc.osaka-u.ac.jp/~paoon/misc/julia/post/trouble-plots-package/

Julia に翻訳--230　seaborn によるプロット，散布図行列，R の plot()
https://blog.goo.ne.jp/r-de-r/e/492c66e050453e98c97f0b7555b24bd5

Juliaで簡単なグラフを描いてみる · GitHub
https://gist.github.com/naoki-cpp/a0d85fcae07a813c95ce255735da433c

julia で、flowcytometry のデータを plot する 
https://evrythingonmac.blogspot.com/2018/10/julia-flowcytometry-plot.html

simulation_plot_v1
https://notebook.community/keiikegami/voting/simulation_plot_v1

VegaLite.jl - Vega-LiteへのJuliaバインディング
https://www.wenyanet.com/opensource/ja/6018e5747483be7c2952e9e0.html
食事中のタイムラプス動画をつくりたい

#動機
作った料理をログを残したい
ついでに、インスタにシェアしたい

#ハード
テーブルの上の天井に
ssh設定した、raspberry pi zero とカメラ 、USBスピーカーを設置


#画角の調整
通常のカメラだと、広角すぎてトリミングすると解像度が荒くなるので
中古の望遠レンズに、カメラをテープで貼り付け調整しました　
![IMG_4817.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514937/faac1175-75ba-888f-85ed-a57814de8a1a.jpeg)



また、インスタの制限で高画質かつ１分以内なので、タイムラプスにしました
その結果、こんなかんじになりました。
![gif](https://user-images.githubusercontent.com/45844502/128852448-bf822291-ce21-4f3c-854e-02070f5086e8.gif)



#インストール
sudo apt-get install imagemagick
sudo apt-get install ffmpeg

#スクリプト 
終了のトリガーを設定していたが、忘れることがあったので
大体の時間 30分くらいで終了し動画を作成することにしました。


```shellscript:timelapse.sh
#!/bin/bash
aplay ./Desktop/startshot.wav
rm -r /home/pi/Pictures/*.jpg &> /dev/null

for i in `seq 1 70` 
do
	fname=`printf "%08d.jpg" ${i}`
	raspistill -w 1998 -h 1500 -o /home/pi/Desktop/tmp/preCrop.jpg
	sleep 1
	convert /home/pi/Desktop/tmp/preCrop.jpg -crop '1500x1500+249+0' /home/pi/Pictures/$fname

	if [ "$i" = 5 ]; then
		sleep 10
   else
		sleep 19
	fi
done

aplay ./Desktop/finish.wav
```


ffmpeg 

```shellscript:timelapse.sh
FILENAME=$(date +"%Y-%m-%d_%H%M")
echo  $FILENAME
DATANAME="/home/pi/Desktop/data/"$FILENAME".mp4"
ffmpeg -f image2 -r 12 -i /home/pi/Pictures/%08d.jpg -r 12 -an -vcodec libx264 $DATANAME
```

#開始トリガー
iosのショートカットを使っています
![IMG_0179.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514937/a8baf3c3-14d0-cbdb-6345-7b9417a73177.jpeg)



#運用した結果
raspberry pi zero ではスペック不足だったため、試行錯誤の結果、動画作成部分をsynologyと連携しています
~~連携については、後日書きます~~　書きました　https://qiita.com/im02kai/items/b058a28605cd347fd360
１年やってみて、食べる速度がわかるようになったり
季節ごとに、何食べたかわかるようになり、献立が作りやすくなった
このスクリプト を使って、ストップモーションもつくれるようになりました

![gif](https://user-images.githubusercontent.com/45844502/128852605-33159e3d-d65e-4ab5-a0ab-901d6f2dbbfb.gif)

#インスタグラム
https://www.instagram.com/milmeshi/


#その他
撮りためたものを学習し何を食べたかまで推測したかったんですが
同じ角度だと学習不足で、そこまでできませんでした

#つづき
https://qiita.com/im02kai/items/b058a28605cd347fd360
SVGファイルを一気にepsに変換する方法

# 背景
texにベクター画像を使用したい場合、グラフであればmatplotlibで描画してsvgで保存、epsに変換というのが一つの方法です。ポンチ絵の作図ならばpptでsvg保存→epsに変換が主な流れでしょうか。1枚や2枚程度のsvgファイルであればオンライン上のコンバータを使用してepsに変換すれば良いのですが、大量にある場合非常に面倒です。まして修正が入るたびに手作業でやるのは非効率です。そのためにwin上でフォルダ内にあるsvgファイルを変換するバッチファイルを作成しました。

# 参考
* https://catdance124.hatenablog.jp/entry/2020/11/02/102253
* https://kimaguremono.hateblo.jp/entry/inkscape_cmd (bat作成で参考にさせていただきました)
* https://helpfan.jp/user/buzzaid_faq/toolfaq/junbi/ffmpeg/path_sys_admin.html (環境変数の設定)

# 環境
* windows10 
* Inkscape1.1 32bit版 

Inkspaceがインストールされていない前提です。既にインストールされている場合は下記手順4から行ってください。

# 手順
1. Iinkscapeダウンロード (https://inkscape.org/ja/release/inkscape-1.1/)
2. インストール
3. 環境変数設定
4. batファイル作成
5. svg→epsへ変換

## 1.Iinkscapeダウンロード
公式HP https://inkscape.org/ja/release/inkscape-1.1/ の上記画面の左下から「Windows」版(本稿では32bit)をダウンロードします。

## 2. インストール
インストーラーを実行するだけでOKです。
![image2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1840215/14113aa0-8b6f-abdc-e8ae-597751a1ce96.png)


## 3. 環境変数設定
Windows左下の検索窓にcmdと打ってコマンドプロンプトを検索し、管理者として実行します。
![image4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1840215/a32c0b33-a307-651b-ee42-9a367c2d9624.png)

コマンドラインに
Start C:\Windows\system32\rundll32.exe sysdm.cpl, EditEnvironmentVariables
と打ち込んで環境変数の設定画面を開きます。

次にシステム環境変数一覧のpathの項目を選択し編集をクリックします。最後に新規ボタンをクリックして、Inkspaceをインストールしたフォルダ内にありbinの場所を指定します。（私の環境では「C:\Program Files (x86)\Inkscape\bin」でした）。以下のように設定できれば成功です。
![image8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1840215/7c5033a7-03b0-4e88-a293-4feb1241e8f2.png)

## 4. batファイル作成
メモ帳を開き、以下をコピペしてください。https://kimaguremono.hateblo.jp/entry/inkscape_cmdの記事を参考にしました。

```bat
@echo off
dir *.svg /b > filelist.txt
for /f "tokens=1 delims=." %%a in ( filelist.txt ) do (
inkscape -p %%a.svg -o %%a.eps
)
del filelist.txt
```
そして「任意の名前.bat」という名前で保存してください。

## 5. svg→epsへ変換
変換したいsvgファイルのあるフォルダに4.で作成したbatファイルを置きます。そのbatファイルをダブルクリックすることでsvgからepsへの変換が始まります。

以上です。一度Inkscapeの設定(1.-3.)ができれば別のsvgファイルを変換する場合、そのファイルがあるフォルダにbatファイルをコピーして、同じようにすれば良いです。
SPSS Statistics Small Tips バックナンバー

## SPSS Statistics Small Tips過去の記事とURL

2021年8月からIBMソリューションブログで連載しているSPSS Statistics Small Tipsのバックナンバーです。

| 回数 | タイトル | リンク |
|:-:|:-:|:-:|
| #01| 顧客データ分析を始める方必見!!～SPSS Statistics Direct Marketing～ | https://www.ibm.com/blogs/solutions/jp-ja/spss-stats-tips-01/ | |
| #02| 決定木による顧客のセグメンテーション～SPSS Statistics Decision Trees～ | https://www.ibm.com/blogs/solutions/jp-ja/spss-stats-tips-02/ | |
| #03| 適正在庫を確保するための売上予測～SPSS Statistics Forecasting～ | https://www.ibm.com/blogs/solutions/jp-ja/spss-stats-tips-03/ | |
| #04| 欠損値も利用！中古車販売の価格予測モデルの作成～SPSS Statistics Missing Values～ | https://www.ibm.com/blogs/solutions/jp-ja/spss-stats-tips-04/ | |
| #05| アンケート結果からブランドポジショニングマップを作成する～SPSS Statistics Categories～| https://www.ibm.com/blogs/solutions/jp-ja/spss-stats-tips-05/ | |
| #06| アンケート分析で本領発揮！簡単操作できめ細やかなクロス表を作成～SPSS Statistics Custom Tables～| https://www.ibm.com/blogs/solutions/jp-ja/spss-stats-tips-06/ | |
| #07| 銀行の融資業務における人工知能を利用したデータ分析活用例～SPSS Neural Networks～ | https://www.ibm.com/blogs/solutions/jp-ja/spss-stats-tips-07/ | |
| #08| 生存時間を分析するKaplan-MeierとCox回帰、そして競合リスクデータの扱い ～ SPSS Advanced Statistics ～ | https://www.ibm.com/blogs/solutions/jp-ja/spss-stats-tips-08/ | |
| #09| リスク予測に活用できるロジスティック回帰分析 ～ SPSS Regression ～ | https://www.ibm.com/blogs/solutions/jp-ja/spss-stats-tips-09/ | |
【Laravel】Laravel入門備忘録　ルート記述メモ

## 記事の目的

書籍「PHPフレームワーク Laravel入門 第２版」を学習する中で、おそらくまた同じ問題に引っ掛かるであろう部分をまとめた備忘録です。

## 環境
OS:windows10
Laravel:8.40

## 問題
教材ではLaravel6を使用していたが、Laravel8で学習を進めていたためエラーが発生した。

## 対応
Laravel8の記述に修正して対応した。

【Laravel6】※教材での記載内容

```php
Route::get('hello', 'HelloController');
```

【Laravel8】※修正内容

```php
use App\Http\Controllers\HelloController;

Route::get('hello', HelloController::class);
```

## 備考
下記記述方法も可能でした。
@botamochi5522様、教えていただきありがとうございました。

```php
Route::get('hello', HelloController::class);
```
【kintone&FormBridge】履歴テーブルの実装方法を紹介

# はじめに
業務でkintoneとFormBridgeで履歴テーブルを実装する必要があったため、その実装方法について紹介します。

### システムの概要
申請者が申請し、その後承認者が承認をしていくワークフローシステムです。ユーザがアクションを行い必要であればコメントを入力し、更新日時とユーザとコメントを履歴として残すよう実装しました。

# 実装方法の紹介
## kintone
### フィールドの設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700107/74f87e07-49b2-95a1-d886-ba85abe316c1.png)
フォームの設定画面にてテーブルを追加し、必要な項目を追加していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700107/19235adf-a3a4-8856-bc98-a6271f4ac313.png)

- 更新日時について
 - 初期値に「レコード登録時の日時を初期値にする」にチェックを入れておくことで、レコードの更新日時と一致したデータを登録することができます。

# カスタマイズ方法
```javascript
// レコード保存前イベント
let registerEvent = [
    // 一覧画面
    'app.record.index.edit.submit',
    // 編集画面
    'app.record.edit.submit'
];

kintone.events.on(registerEvent, function (event) {
    // 履歴テーブルにデータを追加する
    event.record["履歴テーブル"].value.push({
        'value': {
            '履歴_ユーザ': {
                'value': '更新するユーザ',
                'type': 'SINGLE_LINE_TEXT'
            },
            '履歴_コメント': {
                'value': event.record['コメント'].value,
                'type': 'SINGLE_LINE_TEXT'
            },
            '履歴_更新日時': {
                'value': new Date(Date.now()).toISOString(),
                'type': 'DATETIME'
            }
        }
    });
    return event;
});
```
- 保存ボタン押下時イベント発生の際に履歴テーブルに自動でデータの追加を行います。保存イベントが発生した際に毎回データの追加が行われないようにする場合には条件を追加する必要があります。
- コメントについて
 - 履歴テーブルとは別でコメントを入力する項目からデータを取得し、設定します。
- 更新日時について
 - 保存ボタン押下時イベントはデータの登録を行っていないタイミングでありデータの更新日時の取得ができなかったため、サーバ時刻を取得しています。

## FormBridge
### フィールドの設定
フィールドの設定画面から、kintoneアプリの対象の項目にデータを保存するよう設定します。

### カスタマイズ方法
**入力画面遷移時**

```javascript
// 新規登録時には履歴データは必要ないため非表示にする
fb.getElementByCode('履歴テーブル').parentElement.style.display = 'none';
// 履歴データは完了画面遷移時に値を設定するため、新規の際には初回のデータを削除しておく
record["履歴テーブル"].value.shift();
```
新規登録の場合には履歴データは存在しないため、履歴テーブルは画面には表示しないように設定をする必要があります。また、データは完了画面遷移時に設定を行うため、非表示にした履歴テーブルの1行目のデータが不要なため削除します。

**完了画面遷移前**

```javascript
fb.events.confirm.submit = [function (state) {
    const user = sessionStorage.getItem('user');
    record["履歴テーブル"].value.push({
        'value': {
            '履歴_ユーザ': {
                'value': user,
                'type': 'SINGLE_LINE_TEXT'
            },
            '履歴_コメント': {
                'value': record['コメント'].value,
                'type': 'SINGLE_LINE_TEXT'
            }
        }
    });
        return state;
    }];
```
- 完了画面に遷移する際に履歴テーブルに値を設定します。もし確認画面で設定してしまうと、ユーザが入力画面に戻って値を修正される可能性があり再度値を設定し直すという手間が発生してしまうからです。
- ユーザについて
 - 現在入力しているユーザのデータを設定するには事前に入力画面にてsessionStorageにて値を入力しておき、sessionStorage.getItem('key')により値を取得します。完了画面遷移前イベントのタイミングでkViewerのAPIを呼び出しkintoneのレコードからデータを取得する場合、非同期処理の関係により値が上手く設定できないため、事前にsessionStorageに値を設定しておきます。
- 更新日時について
    - kintoneのフィールドの設定で初期値に「レコード登録時の日時を初期値にする」にチェックを入れておいたため、ここでは値を設定する必要はありません。kintoneのカスタマイズでは追加する必要がありましたが。。

# さいごに
履歴テーブルを実装することになり、どういった方法で実現するか悩みましたが上記の方法にて実現できました。kintoneやFormBridgeで履歴テーブルの実装を考えている方の参考になると幸いです！
Thread 1: "Storyboard (<UIStoryboard: 0x600002dfc840>) doesn't contain a view controller with identifier 'ChatListViewController'"が出た場合気をつけること。

ChatList.storyboardの四角を選択

![スクリーンショット 2021-08-10 19.17.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244853/3bf64594-2f33-eb23-cfe1-993f08dc2d7f.png)

下記のように
Classにcontroller名を入れる。
Storyboard IDも同様に値を入れる。
Use Storybord IDにもチェックを入れる

![スクリーンショット 2021-08-10 19.15.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244853/8e8b8bc6-3d55-641f-8c23-b0802d3aa577.png)