OmniAICreator/Qiita-1.07M huggingface dataset:
【TypeScript】TypeScript の 判別Union型

#判別Union型 ( Discriminated Unions )
* Union型で型ガードを簡単にすることができます
* 複数のインターフェースで異なるプロパティが存在する場合の問題点として以下が挙げられます
    * 全Union型でプロパティのチェックをするのが大変...
    * プロパティ名を書き間違える場合がある...
    * インターフェースでは `instanceof` が使えない...
* そこで、全インターフェースで同じ名前のプロパティを作成します（ 判別Union型と言う ）
* 全Union型に含まれるオブジェクトが、同じプロパティを持っているので、そのプロパティで判別可能になります
    * インターフェースは、すべてのオブジェクトに対して、プロパティの実装を強制するためです

##具体例

```ts

interface Bird {
  type: 'bird';        // Literal型：birdという文字列のみを許容するstring型を用意
  flyingSpeed: number;
}

interface Cat {
  type: 'cat';
  runningSpeed: number;
}

type Animal = Bird | Cat;

function moveAnimal(animal: Animal) {
  let speed;
  switch (animal.type) {  // bird か cat しか存在しない
    case 'bird':                     
      speed = animal.flyingSpeed;
      break;
    case 'cat':
      speed = animal.runningSpeed;
  }
  console.log('移動速度: ' + speed);
}

moveAnimal({ type: 'bird', flyingSpeed: 10 });


```
コラボレーション売上予測のセットアップ ⇒ 売上予測ユーザの有効化と売上予測階層の設定

１．売上予測ユーザは [設定] のどのページで有効化できますか?
２．売上予測階層は何に基づくことができますか?
３．売上予測階層は、ネストされた展開可能な売上予測のリストです。売上予測階層はどのように示されますか?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/62de4aa5-3969-8c52-b525-64ab2df277f5.png)
emoji.jsonの情報からTMP_EmojiTextUGUIの絵文字に対応するstringへ変換するプログラム

# はじめに

以前から、Unityで絵文字パネルを作ってみたいという願望が有ったので、それを実装してみたというお話

> Windows10では、Winキー+.(ピリオド、テンキーのほうじゃない方)で絵文字パネルが表示されます…まぁ、車輪の再発明ですが、絵文字とUnicodeの関係を学ぶのに丁度いい機会ですし

# 背景

ここ数日、Unityでの絵文字を出してみたいと思い、情報を拾っていると、バーチャルキャストさんとこのブログに当たりました。

[親方！空から絵文字が！](https://virtualcast.jp/blog/2019/10/emoji/)

そこから、TextMeshProと[Full Emoji Support API](https://forum.unity.com/threads/full-emoji-support-api-emoji-sequen.660310/)で提供されている`TMP_EmojiTextUGUI`を使えば絵文字が表示できると判明しました。

また、[emoji-data](https://github.com/iamcal/emoji-data)の`emoji.json`と各種スプライトシートを使用すれば、いろんな表示(Apple,Google,Twitter)での絵文字が使えるとわかり、いっぺん絵文字パネルを作ってみようと試行錯誤してみたわけです。

# 試行錯誤

というわけで、当方にとって頭を捻った点は以下の３つでした

* そもそも、どれが文字コードになるのかわからん
* 文字コードは書いてあるようやけど、Unicodeは種類が沢山あってなぁ…UTF-8なのかUTF-16なのかUTF-32なのか
* それがわかれば、あとはstringに変換できれば…

## コードはどれだ！？

まず、`emoji.json`の中に正解がありそうと考えたので、中身をざっと見通したのですが、文字コードになりそうなのは`unified`の値がコードになりそうと判断。

ググってみると当たりのようですので、`unified`を使ってみます。

```
{"name":"HASH KEY","unified":"0023-FE0F-20E3","non_qualified":"0023-20E3","docomo":"E6E0","au":"EB84","softbank":"E210","google":"FE82C","image":"0023-fe0f-20e3.png","sheet_x":0,"sheet_y":0,"short_name":"hash","short_names":["hash"],"text":null,"texts":null,"category":"Symbols","sort_order":135,"added_in":"0.6","has_img_apple":true,"has_img_google":true,"has_img_twitter":true,"has_img_facebook":false}
```

## どのコードが最適？

これが実は最後まで悩みのタネで、様々なサイトで記事を読んで見ましたが、これといった正解が見つからず…。

ただ、色々記事を読んでみたり、emoji.jsonを眺めてみると、漠然的に

* 4桁どころか5桁の16進数で表現されている文字がある
* UTF-8でもUTF-16でも無理だろう
* ならUTF-32かな

と成り行きでコードが判明いたました。

## どうやってstringに変換しよう？

これが最後に残った謎でしたが、Full Emoji Support APIのソースを読めば一発で解決しました。

```
char.ConvertFromUtf32
```

という非常に便利なメソッドがありました。読んで字の如し、32ビット整数をUTF-32のコードと判別して文字列に変換してくれるというありがたいメソッドです。

あと、「サロゲートペアはどないしたら」云々は、このメソッドで変換したstringを単純に+でつなげただけで問題ありませんでした。

これで、emoji.jsonの情報からstringに変換できるようになりました。

# 成果

当方が絵文字パネルを作った際に作成した、emoji.jsonの情報->stringに変換するコードをそのままgistに掲載いたします。

https://gist.github.com/cyross/20985f7e196d639d07ce3029a5a51c04

パネルの実装イメージはスクリーンキャプチャをTwitterにあげていますので、そちらをご参照ください。

https://twitter.com/cyross4vocaloid/status/1391770712180879363

# さいごに

絵文字パネルの実装は昔からやってみたかったので、無事に実装できたことで得も言われぬ達成感を味わっています。

ほんま、出来上がった成果を目の当たりにすると感動しますね！ UT

# 参考文献

* [親方！空から絵文字が！](https://virtualcast.jp/blog/2019/10/emoji/)
* [Full Emoji Support Api](https://forum.unity.com/threads/full-emoji-support-api-emoji-sequen.660310/)
* [emoji-data](https://github.com/iamcal/emoji-data)
* [Get Emoji](https://getemoji.com/)
* [Unicodeキャラクター図鑑](https://unicode-table.com/jp/emoji/)
* [絵文字の連結と、書記素クラスター判定](https://ufcpp.net/blog/2017/10/graphemesplitter/)
* [絵文字バリエーション・シーケンスとは何か](https://moji-memo.hatenablog.jp/entry/20120802/1343876603)
【algorithm】計算量とランダウ記号

#はじめに
今回は、アルゴリズムの計算量についてまとめていきたいと思います。

#計算量とは
アルゴリズムの良し悪しを決める重要な指標
計算量が少ない方が、処理が早くなるということなので、アルゴリズムとしてはいいものとなる。


#ランダウ記号
ランダウ記号とは、アルゴリズムAの計算時間T(N)が概ねP（N）に比例するということを、T(N) = O(P(N))であると表現し、アルゴリズムAの計算量はO(P(N))であるという。
例えば、一重のfor文の計算量はおおよそO(N)で、二重になると、O(N^2)です。
あるアルゴリズムの計算量が、3N^2+10N+100になったとすると、以下の手順でこのアルゴリズムの計算量をランダウ記号を用いて表す。
・最高次以外の項を無視→3N^2
・係数を無視→N^2
よって、O(N^2)

以下のような、あるNが与えられた時の偶数のみ出力するアルゴリズムの計算量を考えます。

```swift
for n in stride(from: 2, through: N, by: 2) {
    print(n)
}
```

for文の反復回数はN/2回なので、計算量は概ねNに比例していることから、O(N)です。

さらに、少し難しい例として、最近点対問題を考えてみます。

```swift
正の整数NとN個の座標点(Xi, Yi)(i = 0, 1, 2, ..., N-1)
が与えられているとき、最も距離が近い2点間の距離を求める
```

全ての点対に対して距離を計算してそのうちの最小のものを出力する方針です。

```swift
let N = 100
func calculateDistance(Xa: Double, Ya: Double,
                       Xb: Double, Yb: Double) -> Double {
    return sqrt((Xa - Xb) * (Xa - Xb) + (Ya - Yb) * (Ya - Yb))
}
var x = [Int]()
var y = [Int]()
for _ in 0..<N {
    x.append(Int.random(in: -N*N...N*N))
    y.append(Int.random(in: -N*N...N*N))
}
var minimumDistance = Double(Int.max)
for i in 0..<N {
    for j in i+1..<N {
        let distance = calculateDistance(Xa: Double(x[i]),
                                         Ya: Double(y[i]),
                                         Xb: Double(x[j]),
                                         Yb: Double(y[j]))
        if distance < minimumDistance {
            minimumDistance = distance
        }
    }
}
print(minimumDistance) // 例えば、108.15729286552988
```

解説
Nは本来であれば、もっと大きい値として定義したいのですが、Swiftのコンパイルが遅くて、今回は100としておきました。
`calculateDistance`は2点間の距離を求める関数です。
配列x, yにN個のランダムな要素を格納します。
minimumDistanceは、十分大きな値で初期化しておきます。
一つ目のfor文は、１個目の点をN通りに試す処理をしています。（添字i）
二つ目のfor文は2個目の点を順に試す処理をしています。（添字j）
注意点として、添字jが動く範囲は0からN-1ではなく、i+1からN-１で十分だということです。例えば、以下のような点同士の距離は明らかに等しく、計算するだけ無駄です。
i=2, j=5の場合: (X2, Y2)と(X5, Y5)との距離
i=5, j=2の場合: (X5, Y5)と(X2, Y2)との距離
また、iとjが同じ点は異なる2点でなく、同じ点を示すので、jはi+1からスタートさせます。

```swift
i=0の時j=1, 2, ..., N-1のN-1回
i=1の時j=2, ..., N-1のN-2回
i=2の時j=3, 2, ..., N-1のN-3回
...
i=N-2の時j=N-2, N-1の2回
i=N-1の時j=N-1の1回
```

つまり、反復回数T(N)は、k=0からN-1までのΣ(N-1-k)となり、これを計算すると、`(1/2)(N^2-N)`となる。
よって、計算量はO(N^2)となります。
ちなみに、N個のものから異なる2点を選ぶので、込み合わせの総数は`nC2=(1/2)(N^2-N)`となります。


また、Nがいくつであってもその数によらないようなアルゴリズムの計算量はO(1)というふうに表現します。

#問題
適当な問題を出すので、理解できているか不安な方はチャレンジしてみてください。

問題1: 以下の計算時間をランダウ記号Oを用いて示してください。

```swift
1.
T1(N) = 1000N
2.
T2(N) = 2N^2+2N-3
3.
T3(N) = 100N-11N^2-5NlogN
4.
T4(N) = 2^N+N^10000
```

問題2: 以下の計算量はいくらになるのか求めてください。

```swift
for i in 0..<N {
    for j in i+1..<N {
        for k in j+1..<N {
            
        }
    }
}
```

#答え
O: ランダウ記号

問題1

```
1.
O(N)
2.
O(N^2)
3.
O(N^2)
4.
O(2^N)
```

問題2

0 <= i < j < k < N を満たす (i, j, k) の組の個数を数え上げればよいので、nC3 = (1/6)N(N-1)(N-2)となり、答えは
O(N^3)である。

#おわりに
終わりです。
Spring Security構築時エラー


①

```
java.sql.SQLNonTransientConnectionException: Could not create connection to database server.
Caused by: java.time.zone.ZoneRulesException: Unknown time-zone ID: JST
```
application property urlのparameterを削除

②

```
org.thymeleaf.exceptions.TemplateInputException: Error resolving template [login], template might not exist or might not be accessible by any of the configured Template Resolvers
```

https://boukenki.info/springboot-jar-tymeleaf-error-templateinputexception/

template th:actionの/を削除
Ubuntu Server 21.04 に Samba サーバを立てて Mac とファイルを共有する

# 本記事の前提

1. Ubuntu Server 21.04 がインストールされている
2. Mac から Ubuntu Server のファイルを参照したい

# 設定手順

まずは Samba サーバのパッケージをインストールします。

```
$ sudo apt-get install samba
```

次に、Samba を使うユーザを作成します。
ユーザ名は Ubuntu Server, Mac, Samba で共通化しておくのが無難です。

```
$ sudo pdbedit -a hajime-f
new password:
retype new password:
Unix username:        hajime-f
NT username:
Account Flags:        [U          ]
User SID:             S-1-5-21-3096135977-926823050-829666163-1000
Primary Group SID:    S-1-5-21-3096135977-926823050-829666163-513
Full Name:            Hajime Fujita
... （後略）
```

次に、```/etc/samba/smb.conf``` を編集します。デフォルトの設定ファイルに追記・修正した箇所**のみ**を示すと、下記のとおりです。

```conf:/etc/samba/smb.conf
[global]
   workgroup = ISLANDS
   unix extensions = no

[homes]
   writeable = yes 
   create mask = 644
   directory mask = 755
```

```workgroup``` が ```ISLANDS``` になっているのは、私が[各マシンのホスト名に南の島の名前をつけるという個人的なポリシー](https://qiita.com/hajime-f/items/2c10db500bc40d1f8e29)を持っているからです。

最後に、Samba デーモンを再起動します。ステータスがきちんと「Active: active (running)」になっていることも確認しておきましょう。

```
$ sudo service smbd restart
$ sudo service smbd status
● smbd.service - Samba SMB Daemon
     Loaded: loaded (/lib/systemd/system/smbd.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2021-05-10 06:12:55 UTC; 52s ago
...（中略）
May 10 06:12:55 phuket systemd[1]: Starting Samba SMB Daemon...
May 10 06:12:55 phuket systemd[1]: Started Samba SMB Daemon.
```

# Mac から Ubuntu Server に接続する

Finder のメニューバーで、「移動」→「サーバへ接続」を選びます。

![Screenshot 2021-05-10 16.03.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/667942/d5587cad-1c15-0810-0336-54da77785086.png)

「サーバへ接続」のポップアップが出たら、下記のように、「smb://(IPアドレス)」し、「接続」します。

![Screenshot 2021-05-10 15.18.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/667942/a7a94223-787e-05d4-dbac-83039ee838e1.png)

Samba ユーザのユーザ名とパスワードを聞かれるので、入力しましょう。

![Screenshot 2021-05-10 15.16.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/667942/4f0c565b-bcdb-26a2-0a9f-e5a51ecc7dc4.png)

ということで、Ubuntu サーバのホームディレクトリを参照できました。

![Screenshot 2021-05-10 16.06.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/667942/f7df784a-31c6-d850-af5d-465873bff66a.png)

ホームディレクトリは、```/Volumes/hajime-f``` にマウントされているので、適当にシンボリックリンクでも張っておきましょう。
フラットなファイル構成のディレクトリでguardを使ってrspecを自動実行する

## やりたいこと
下記のように、rubyソースコード、specファイル、Guardfileが全て一つのディレクトリにフラットに配置されている環境で、[guard](https://github.com/guard/guard)による自動テスト実行を行いたい。
<pre>
root_dir
├── Guardfile
├── gilded_rose.rb
└── gilded_rose_spec.rb
</pre>

## 設定方法
### guard, guard-rspecをインストールする
上記のような配置の場合、bundleを使っていることは考えにくいのでシステムにインストールしておく。

```
gem install guard guard-rspec
```

### Guardfileを作成
root_dirにGuardfileを作成し、下記を記述する。

```ruby
guard :rspec, cmd: 'rspec', spec_paths: ["./"] do
  watch(%r{.+_spec\.rb$}) { |m| "./#{m[0]}" }
  watch(%r{(.+)(?!_spec)\.rb$}) { |m| "./#{m[1]}_spec.rb" }
end
```

### guardを実行

```
guard
```

guardを実行してから、rubyファイルかspecファイルを更新すれば、自動的にspecが実行される。

## 上記のように設定する理由
デフォルトの設定だと自動実行されないため。
デフォルトでは、実行ファイルはlibディレクトリ配下、specファイルはspecディレクトリに配置されていることが想定されている。したがって、カレントディレクトリ配下でも動くように設定を変えてやる必要がある。

### ポイント
1. `spec_paths`にカレントディレクトリを設定する  
guardはこれをテスト用のファイルが入っているディレクトリとみなす。ここに入っていないテストの実行は防止する仕組みになっている。 

2. watchのブロックの返り値に`./`がつくようにする  
ファイルの変更を検出すると、watchのブロックを評価した結果のパスで指定されるspecファイルを実行するが、これがspec_pathsに入っているか確認している。spec_pathsに`./`と指定しているので、ブロックの返り値のパスが`./`で始まっていないと対象のフォルダに入っていないとみなしてしまう。

実行するファイルのフィルタは下記のソースコードを参照。
[https://github.com/guard/guard-rspec/blob/master/lib/guard/rspec/inspectors/base_inspector.rb#L48-L50](https://github.com/guard/guard-rspec/blob/master/lib/guard/rspec/inspectors/base_inspector.rb#L48-L50)
ReactコンポーネントのテストケースをChromeでデバッグする

ReactというよりJestの機能ですが、Reactコンポーネントのユニットテストは、Chromeでデバッグできます。

## 1. テストケースでBreakPointを設定したい場所にdebugger文を書く

通常のデバッグと同じです。

```
  expect(tree).toMatchSnapshot();

  debugger

  // manually trigger the callback
```

## 2. デバッグオプション付きでJestを起動

```
$ node --inspect-brk node_modules/.bin/jest --findRelatedTests [テストケースへのパス]
```

デバッガの接続待ちで停止する

```
Debugger listening on ws://127.0.0.1:9229/4e252f35-9932-4144-ad7e-cd9c659a0b86
For help, see: https://nodejs.org/en/docs/inspector
```

## 3. ChromeのURLからchrome://inspectを入力

![Screen Shot 2021-05-11 at 6.56.08.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48172/d4e5373c-4d0e-0228-5345-1d33adc7f619.jpeg)

## 4. Target - inspectをクリックしてデバッガを立ち上げる

右上のResume script Executionで実行すると、BraekPointを設定した位置で停止する。

[![Image from Gyazo](https://i.gyazo.com/a1c33ffd01ce535564e17a6ad6a39e66.gif)](https://gyazo.com/a1c33ffd01ce535564e17a6ad6a39e66)

通常のデバッグと同じく、consoleから変数の内容の確認などができる

## 参考

https://jestjs.io/docs/troubleshooting
cursor とは

■　cursorとは

要素にカーソルが乗ったときにカーソルの形を変える事を言います。

e] 何か検索をする際に検索する場所にカーソルを移動させるとカーソルが変わる

下はイメージ図です⬇️
https://gyazo.com/4b1c2760de5137503bed608196eab955

■　cssの書き方

cursor: text, 

 ↪︎　この書き方をすると上のイメージ図みたいなカーソルに変化します。



今日の投稿は以上です。
これからもアウトプットの方頑張っていきたいと思います！
plunkerでenebular

#概要

plunkerでenebularを叩いてみた。
javascriptで受信ポイントにhttpリクエストを送った。

#サンプルコード

```

function test() {
  var xhr = new XMLHttpRequest();
  xhr.open("POST", "https://ev2-prod-node-red-3e84d49c-22c.herokuapp.com/sensordata", true);
  xhr.setRequestHeader("x-api-key", "test-api-key");
  xhr.onreadystatechange = function() {
    if (this.readyState === 4 && this.status === 200)
    {
      alert(this.responseText);
    }
  }
  xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
  var lines = [];
  lines[0] = "roomname=" + encodeURIComponent("house1");
  lines[1] = "temperature=" + encodeURIComponent(25.3);
  xhr.send(lines.join("&"));
}


```

以上。
Togglポモドーロ と もくもく朝会 でリモートお仕事習慣カイゼンをはじめた


- **コロナ以前**
    - [週休3日、1日6時間勤務達成したい](https://qiita.com/e99h2121/items/f1847b338c17086f0e95)
- **2020のコロナの頃**
    - [2020年、（3歳1歳と）私のリモートワーク - 在宅まとめ](https://qiita.com/e99h2121/items/c8878d027603745a6426)

上記を「史料」としてふりかえりつつ、最近（2021年5月）、2つのことを始めた。

在宅になってから、それぞれのチームでデイリースクラムの実施や、Slackで始業・お昼・終業連絡の運用等は習慣づいてきたとはおもう。しかし以前のように物理的に勤怠していた頃と比べるとやはり「なにか違う」は依然、感覚として残る。

継続するって大変ですよね...。

**「頑張りすぎたくはないのだが、リモートワークでも仕事にメリハリを付けたい。」**という、かゆいところに悩みを持つ方に **Togglポモドーロ** と **もくもく朝会** 参考になればと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/113361a6-b901-8e25-a472-0d7f2fead0c5.png) 
ポモドーロとはトマトのことらしい。



## 1. Toggl でポモドーロ

自分はお仕事開始は チビッコが出かける or チビッコを送って帰ってくる タイミングというのがあるので比較的わかりやすく開始宣言しやすい。

一方終業時間は18時前にチビッコが帰宅してしまうと混沌のままPCを離れざるを得ない日々が続いていた。

その後の数時間は開発チーム的にはプライムタイム（？）にもかかわらず「ながら見」になる。普通にもう見なきゃ良いじゃんという向きもあるが気持ちは「仕事したい」もある。だからエクスキューズは残しつつもお仕事の実績投稿はしたかった。さてどうするか？

https://qiita.com/e99h2121/items/18533f39dc3643c1ceaf

はい、Togglはじめました。[Toggl](https://toggl.com/track/) はレコーディングボタンを押したり止めたりするので一つひとつの作業によしやるぞというスイッチが入る。特にChrome拡張を利用した際は以下のように、自分の作業の開始停止が切り替えられるのが良いです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/164ef63f-2163-8ee0-b40e-c35e40742099.png)
一種のポモドーロテクニックというやつの気がしている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/9e628b90-ee58-6ef6-5d64-d6baa33a06fd.png)


https://qiita.com/hayatoise/items/a9ac20330bb101b366b3
>集中している状態が持続しやすくなる
1ポモドーロ当たりの仕事量を理解することによって、工数見積りの正確度が高まる
自らの成長を実感することができる

いかに集中力をコントロールするか、がポイントとなりそう。メリハリ大事。


## 2. もくもく朝会（もくもくタイム）

もう一つ、仕事はじめのエンジンのかけ方の工夫として「もくもく朝会」をはじめた。
朝からそうそうテンションをあげられない人（主に私）、チームにおすすめしたい。


### 趣旨

以下を掲げている。およそ社内で告知した原文ママ。

- 平日 10:00-11:00 Google Meet の規定URL
- Meetで繋ぎながらもくもく作業をしたり、問合せを見たり、チケットを見たりするための時間です。
- 何か話す義務はありません。ただ Meet でつなぐだけです。顔見せするしないもおまかせです。
- ですが私は質問には答えますし、その場で話題があれば振ったりはします。
- 10時に勝手に始まって11時に後腐れなく終わることにします。

### 効用

- 何か話さなきゃ！等というプレッシャーを感じる必要はありません。やろうとしている作業をmeetでつないだままやるだけです。
- でも遅くとも10時には業務開始するという規律のある日々を送りたい。ちょっとした相談くらいはしたい。とかいうのの役に立ったら良いと思っています。
- 1時間これやるぞと決めるので集中してなにかしら取り組めるとおもわれる。
- ほかの会と時間帯はかぶってしまうので、曜日によって自由にしてよいです。ほかの打合せとかある日もあるでしょう。
    - まあ私は大体居ます。というタイムです。
    - 元ネタ: もくもく会 https://mokumokukai.tumblr.com/

### もともとのチームの雰囲気

自分が、朝からそんなにワイワイしたいというほどではない。というか作業したい！作業時間欲しい！だって朝だもの...。そういう気持ちでした。で、もともと、夕方にデイリースクラムの運用をしていた。

https://qiita.com/Koki_jp/items/b8aebc449f6d2ec79a67

https://qiita.com/masa-m/items/ca0341870398b8905664

あまりガッツリ作業時間に入ってしまうと、「あれ、いま話しかけてよいのかな、、」等となってしまうケースもあるという。その点、「絶対に話しかけて良い」時間が明確なのは非常に良い。ラバーダック 的効果もある気がします。

https://en.wikipedia.org/wiki/Rubber_duck_debugging

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/fdcb2e00-8875-8403-057e-251ca5dc3a33.png)
敢えて触れていませんがもくもくタイムは[もぐもぐタイム](https://dime.jp/genre/646440/)と掛け合わせたおっさんギャグです。


## 感想

1、2、いずれも、使用するツールとあわせて、人のココロをうまくコントロール、マネジメントするのが肝だと思っている。逆に朝から筋トレ！とか、挨拶！とか、そういうストイックなチームもあるとおもう。でも自分（たち）にあった形が長く続けるコツになったりするとおもうので、皆で色々やってみて選べたらいいのではないでしょうか。

以上、参考になればさいわいです。
motpyのROS実装（高速オブジェクトトラッキング）

　高速オブジェクトトラッキングアルゴリズムのmotpyをROS1/ROS2に実装したので投稿します。この記事には[個人ブログ](https://ar-ray.hatenablog.com/entry/2021/05/05/180000?_ga=2.217442582.1422315070.1620487900-298354071.1617775319)やROS Japan UGでも発表したものも含まれます。
## motpyとは？
　motpyとは、カルマンフィルタを用いてバウンディングボックスを追跡するオブジェクトトラッキングアルゴリズムです。デプスイメージを使わずともWebカメラのみの画像でもトラッキングが可能で、矩形のみの情報で追跡するため、Raspberry Piなどでも高速オブジェクトトラッキングを実現することができます。

https://github.com/wmuron/motpy

　この手法自体はそれほど珍しくはないですが、motpyは、他と異なりPythonライブラリとして提供されているため、あらゆるPython実装の物体検出アルゴリズムに組み込むことができます。

 私は、このアルゴリズムをDarknet_rosに組み込みたいと思っていましたが、darknet自体はC++とCで実装されているのでイマイチ使いにくい…

　そこで、motpy自体をROS1/ROS2ノードにしました。

## 処理フロー

　追跡方法について処理フローを以下に示します。

1. Webカメラから画像トピックを送信します（usb_cam）
1. darknet_rosによって物体検出を行います（darknet_ros）
1. motpy_rosによってdarknet_ros由来のBoundingBoxesを入力からトラッキングID付きのBoundingBoxesに変換します（motpy_ros）
1. 表示専用ノードで表示します（ROS1の場合、mosaic_bbox）
![Screenshot from 2021-05-11 03-04-19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1022754/75645907-9d7d-b3eb-2f33-7902135d02e0.png)

　現時点では、motpy自体にクラス名が実装されていないため、motpy_rosの出力には「Person」や「Bus」などの区別が付けられません。
## インストール
　ここでは、ROS1での環境構築と実行について示します。依存環境は以下のとおりです。

- ROS1 Noetic
- OpenCV4
- darknet_ros_msgs
- ros-noetic-usb_cam
- motpy

```bash
# Create workspace
$ source /opt/ros/noetic/setup.bash
$ cd ~
$ mkdir -p ros1_ws/src
$ cd ros1_ws/src

# Clone repository
$ git clone --branch ros1-noetic https://github.com/Ar-Ray-code/motpy_ros.git
$ cd motpy_ros
$ pip3 install -r requirements.txt

$ cd ~/ros1_ws/src
$ catkin_make
```
## 実行
　WebカメラをPCに接続して、以下のコマンドを入力します。

```bash
$ source /opt/ros/noetic/setup.bash
$ source ~/ros1_ws/devel/setup.bash
$ roslaunch motpy_ros example_mosaic.launch
```

　トラッキングの様子です。物体を移動させたあとも認識した顔に対してIDを追跡しています。

![tracking_mosaic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1022754/de64b092-054a-3379-763c-9c695fc699be.png)
　Rqt-graphの表示は次のようになっているはずです。
![Rqt_graph_example_mosaic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1022754/1c2c7815-8893-d64b-b51a-56a2ce2f2c08.png)
　ノートPCのCPU（Core i5 10210U）でも十分に追跡できるため、かなり実用的なトラッキングノードだと思います。

　バグなど気づいた点があれば、ぜひissueやPRを送ってもらえると嬉しいです。

https://github.com/Ar-Ray-code/motpy_ros
チャンネルの動画を古い順で再生

<iframe width="560" height="400" src="https://www.youtube.com/embed/Lxasiwvl-tw" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

```html:test.html
<html lang="ja"><head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<script>
	
/*

console.log(
	ytInitialData.contents.twoColumnBrowseResultsRenderer.tabs[1]
	.tabRenderer.content.sectionListRenderer.contents[0]
	.itemSectionRenderer.contents[0]
	.gridRenderer.items.map(v=>{
		var r = v.gridVideoRenderer
		return r.videoId+','+r.title.runs[0].text
	}).join("\n")
)

*/

var s = `

FxjWWtdw4Hw,サンプルですよ
5tpHkvQ30Sg,マイクラB2J｜Java版もゲームパッドで遊びたい！実用アプリ自作・後編
TO6KsmQIGL0,マイクラB2J｜Java版もゲームパッドで遊びたい！実用アプリ自作・前編
0iNRtSDcJjQ,マイクラB2J｜iPhoneのワールドで遊びたい！！！
mPE_qROWQLQ,マイクラB2J｜Java版もゲームパッドで遊びたい・外伝
8X_lRF9z08A,マイクラB2J｜統合版のワールドで遊びたい！！！
sKCzh3Tthxk,マイクラB2J｜Java版も寝ころがって遊びたい！！！
xGlVax-Y8fM,マイクラB2J｜いっちゃんキレイなマイクラください！！！

`
var data = s.trim().split("\n").map(t=>t.split(','))

$(e=>{
	$('body').append(
		$('<div id="player">'),
		data.map(a=>$('<div>').attr('data-id',a[0]).append(a[1]))
	)
	$('[data-id]').click(e=>{
		location.hash = e.target.dataset.id
	})

	var id = location.hash.slice(1)||$('[data-id]')[0].dataset.id
	$('[data-id='+id+']').addClass('on')
	location.hash = id

	$('head').append(
		$('<script>').attr('src','https://www.youtube.com/iframe_api')
	)
})

function onYouTubeIframeAPIReady() {
	var p = new YT.Player('player', {
		width:'100%',height:400,
		videoId:location.hash.slice(1),
		events:{
			onReady(e){e.target.playVideo()},
			onStateChange(e){
				if (e.data ==YT.PlayerState.ENDED) {
					var q = $('div[data-id="'+location.hash.slice(1)+'"]').next()
					if(q.length>0) location.hash = q[0].dataset.id
				}
			}
		}
	})
	window.onhashchange = e=>{
		var s = location.hash.slice(1)
		$('[data-id]').removeClass()
		$('[data-id='+s+']').addClass('on')
		p.loadVideoById(s)
	}
}

</script>
<style>

div{line-height:40px;border-bottom:1px solid #eee;}
.on{background:#eee;}

</style>
</head>
</html>
```
Herokuインストール〜デプロイまでの基本手順


Herokuインストール〜デプロイするまでのコマンド備忘録です。

<h2>Herokuがインストールされていることの確認</h2>

```
$ heroku --version
```
バージョンが表示されない場合は、以下のコマンドからHerokuをインストールする。

```
$ source <(curl -sL https://cdn.learnenough.com/heroku_install)
```

<h2>Herokuにログインしてsshキーを追加</h2>
初回のみ。既に追加済みの場合はスキップする。

```
$ heroku login --interactive
$ heroku keys:add
```


<h2>Herokuサーバー上にアプリを作成</h2>
herokuにログインして、アプリのデプロイ場所を新規作成する。

```
$ heroku create
```
コマンド実施後、アプリ専用のサブドメインが自動生成される。デプロイ前でも、出力されたURLにてブラウザでアクセス可能。

<h2>デプロイしたいアプリをherokuリポジトリにプッシュ</h2>
`$ heroku create`実施時にリモートリポジトリにherokuが自動登録されるので、デプロイ対象のアプリをherokuにpushする。

```
$ git push heroku master
```


<h2>データベースをマイグレーション</h2>

アプリのデータベースを動作させる場合は、`heroku run` コマンドを実行してデータベースをマイグレーションする。

```
$ heroku run rails db:migrate
```

<h2>ブラウザでURLにアクセス</h2>
URLが不明な場合は以下のコマンドを実行してURLを確認できる。

```
$ heroku domain
```


<h2>【おまけ】herokuアプリの一覧表示</h2>

```
$ heroku apps
```

Herokuでは、1アカウントにつき5つまでのアプリが作成可能(無料の場合)。オーバーする場合は`$ heroku create`に失敗する。

<h2>herokuアプリの削除</h2>
アプリが多くて削除したいといった場合には、以下のコマンドで削除可能。

```
$ heroku destory -app アプリ名
```
これでまた、デプロイ出来るね。（にっこり）
条件付きマージを行う（結合先テーブルに条件を付けたい）

#テーブルをマージするとき、特定の条件のものだけくっつけたいとき

たとえば、こんなデータがあって
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1120006/2ed615e0-6683-c554-be07-f375cb702d27.png)
こう、自分の点数と合格点を比較して、合否を計算してみたい、と…
##もちろん、方法はいっぱいある

　たとえば、点数テーブルのほうに受験年度の列を足して、マージキーにするとか
　たとえば、合格点テーブルをフィルタかけてからマージするとか

##でも、時には計算式一本で対応したいときもある。かも。

特に何の処理もなく、結合→クエリのマージから左外部結合（点数テーブル←合格点テーブル）にするとこうですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1120006/57938674-a0e9-f47c-4e0c-503bed6a262f.png)

で、自動生成された式は、こんなん
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1120006/85338fdd-f6f1-e742-7f50-b627b7faaf13.png)
　　黄色い線と丸：結合先テーブル名＆Key
　　青い線と丸：結合元テーブル名＆Key
　　（ちなみに緑線は、マージしたときにできるカラム。
　　　（Table)ってはいってるとこ。デフォルトのままだとちょっとわかりにくい…）

なので、青線のところにフィルタかけられればよさそうです！

#フィルタかける呪文はどんなんだったかな
やってみたら早いですもんね。
合格点テーブルのほうでフィルタかけてみると。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1120006/ade8a54a-f51a-0ad1-03bb-fd8d594b082e.png)

    = Table.SelectRows(変更された型, each ([年度] = 2021))

ほうなるほど。
（式だけコピーしたら、フィルタの解除忘れずに💦頑張って式を作る意味がなくなっちゃう…）

##さっきのマージの式に差し込んでみよう
Before![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1120006/59ce2140-b79f-c096-34b5-8709fe2214a6.png)
After
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1120006/b8132803-b528-73ab-91f3-d59e5c798d60.png)
おお！いいかんじですね！

さっきの式の
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1120006/38f44fa5-8ecb-3e4e-91b0-513a3f1f79e7.png)
ここ！この青いとこに、さっきのフィルタの式を書いて…

で、フィルタの式の中の
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1120006/6682f41b-570e-a656-e0bc-c74f731b269c.png)
この青いところは、「何を」フィルタするのか指定するところなので、ステップ名ではなくて、クエリ名に書き換えてあげる。

つまり、こうですね。（青いところが直したところ）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1120006/8c6ef665-d859-5e03-7685-90f6a74b513b.png)

こうしとくと、フィルタ条件のところにパラメータとか、ユーザが任意に書き換え可能な変数を持ってきたときに自由に計算結果を書き換えられたりとか、あとは単純に参照されるテーブルがいろいろかつ、フィルタ条件がいろいろあって、どうにもならん！って時に使えるんじゃないかと思います。

#念のため
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1120006/91199bd5-323b-e28e-f29b-a88f81689bc0.png)
マージ出来たら、ここは展開ボタン押して、選択して、展開できます。
　カラム名が被らないなら、元の列名を使用オプションは外すのが好きです（赤部分）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1120006/8b6910cf-5ff1-78b6-9acf-e16160ac8036.png)

できあがり！めでたしめでたし！
NavigationBarのボタンの位置を左右に動かす方法

こんにちは！

最近のアプリでよく見る、NavigationBarのleftやrightにボタンを複数追加しているようなUI、
実際あの手のUIを作る場合、Customで作るかそれっぽいのをViewで作ったりなどなど、ちょっと手間のかかるやり方があったりしますよね。

今回はそんなことしないで済む方法を見つけたので、ちょっと裏技的な感じになるのかもしれませんが、似たような記事がなかったので、書くことにしました。実装の参考にして頂ければと思います。


## 結論
-  ButtonのItemImageのInsetsを調節すればそれなりに見える

## 調べたこと

いつからか正確にはわかりませんがNavigationBarのItemを複数設置する場合画像のようになっておりまして
UIButtonBarStackViewというViewが存在するので何も考えずに、 BarButtonItemにButtonを追加していくと、自動的にボタン同士のmarginが決まってしまいます。
(画像の青くなっているものがUIButtonBarStackViewです）

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403613/1213b950-ffff-0963-2f97-8d7df9c55b87.png">

この間隔（多分20pt以上ある）だと、以下画像のようになり、人によりますがちょっと間隔あり過ぎじゃない？って思う人もいると思います。
実際、以下画像のようになったている場合ちょっと間抜けな感じもします。
僕が調べた限りですが、そもそもこれに近い間隔で実装しているアプリはほぼないです。
 appleのミュージックですらこの間隔で作ってません。

 <img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403613/f3cb8d97-d435-678d-6152-a709a10f4af5.png">

調べてみるとどうやら以下のようにAutolayoutが効いておりました.

![スクリーンショット 2021-05-09 8.27.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403613/8bab629f-6ca5-90b5-3a0b-ec4a2cc6b5e5.png)

上の画像のように、で左右の感覚が１１pt あることが分かったので、その分Insetを入れて詰めてやれば良いのではと閃き、実際にやってみたところ以下のようにずらすことに成功しました。

 <img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403613/df9aa99f-fe1a-564c-977c-7df8aa657c35.png">

Codeは以下になります
 
``` swift

 let item1 = UIBarButtonItem(image: .add, style: .plain, target: self, action: #selector(taped))
 let item2 = UIBarButtonItem(image: .checkmark, style: .plain, target: self, action: #selector(taped))

item1.imageInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0) // 緑色のプラスボタン
item2.imageInsets = UIEdgeInsets(top: 0, left: 30, bottom: 0, right: 0) //  青色のチェックボタン　 left に３０のInsetsを入れております。

```

実際の感じがこちら

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403613/7c894e37-95ec-6b7f-aa71-cb0c4f8b2cb1.png" >


こんな感じで実装をすることができました。

三つにするならこんな感じでできます。
(40ずつずらしています）
 <img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403613/3655835f-0cb5-c894-cbc2-e80dbef0c39f.png">
 
 ``` swift 
 item1.imageInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
 item2.imageInsets = UIEdgeInsets(top: 0, left: 40, bottom: 0, right: 0)
 item3.imageInsets = UIEdgeInsets(top: 0, left: 80, bottom: 0, right: 0)
```

leftはこんな感じ

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403613/7416bd22-1023-21c4-aa87-180889791c1d.png">

``` swift
item1.imageInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
item2.imageInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 40)
item3.imageInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 80)

navigationItem.setLeftBarButtonItems([item1, item2, item3], animated: true)
```

##  まとめ

今回はこんな感じで実装することができました。
しかし本来での位置で良いなら（多分そのほうが上記のようなことをしなくて良い）
それに越したことはないので、特に特別間隔を詰めなければいけない場合
（世の中にはそういう時もある）以外はこのやり方はしなくて良いなと思いました。
まあ、どうしてもやらなければならないような時だけやってみてください。
多分邪道なやり方です。
あくまでも視覚的にいい感じになる方法です。

また、これではない方法があるのであればぜひ教えてください！

今回は読んでいただきありがとうございました！
REST APIについて

#REST APIとは
REST APIとはRESTの原則に沿った形で設計されたAPIのことです。
4つの原則に従って設計されてます。

###1アドレス可能性
URIを通して、誰が見てもすぐに何を指してるのかがわかること。
`http://api.sample.com/v1/users`
上記のコードはuserの情報を取得しようとしてるんだなというのが一目でわかります。


###ステートレスサーバー
ここに関しては以前に記事を書いてますのでみてみてください！
[ステートレスについて](https://qiita.com/moemon/items/d9a679a5a4fdd457beb1)

###接続性
接続性とは、情報の内部に別の情報やその情報へのリンクを含めることができることです。

###統一インターフェース
　取得・作成・更新・削除などのHTTPメソッドを利用すること。
[HTTPメソッド](https://qiita.com/moemon/items/d9a679a5a4fdd457beb1)
以前に記事を書いてますのでみてみください！

APIは奥が深い。。。

##参考記事
[RESTful APIとは何なのか
](https://qiita.com/NagaokaKenichi/items/0647c30ef596cedf4bf2)
[RESTful APIとは？](https://blog.api.rakuten.net/ja/jp-restful-api/)

##学習中図書
・オライリー・ジャパン Web API the Good Parts
・Webを支える技術
CentOS 8.3 to Rocky Linux 8.3

Rocky Linuxを使用する場合は、Centos 8.3にアップグレードする必要があります。

**実稼働環境で直接試さないでください。**

**x86_64のみをサポートします。**

```shell
# rootユーザーに変更してください。
rpm -e --nodeps centos-linux-release
rpm -e --nodeps centos-linux-repos

cat > /etc/yum.repos.d/Rocky-BaseOS.repo <<-EOF
# Rocky-BaseOS.repo
#
# The mirrorlist system uses the connecting IP address of the client and the
# update status of each mirror to pick current mirrors that are geographically
# close to the client.  You should use this for Rocky updates unless you are
# manually picking other mirrors.
#
# If the mirrorlist does not work for you, you can try the commented out
# baseurl line instead.

[baseos]
name=Rocky Linux $releasever - BaseOS
baseurl=http://dl.rockylinux.org/pub/rocky/8.3/BaseOS/x86_64/os/
gpgcheck=0
enabled=1
EOF

dnf install rocky-repos
dnf update

# システムバージョンを確認する
cat /etc/system-release
# Rocky Linux release 8.3

```
JavaScriptで時間の差分を計算する 

Webアプリを作成する中で、ユーザーが選択した時刻の差分を計算して表示することを実装しようとしたのですが、時間計算が簡単そうで、結構詰まったので、メモに残すことにしました。
#### やりたいこと
時間の差分を計算して、「00:00:00」のような感じにして表示したい

```javascript
const NowTime = new Date();
const ChangeTime = new Date();
let TimeDefference = NowTime.getTime() - ChangeTime.getTime()

let Hour = TimeDefference / (1000 * 60 * 60);    
//「時間」の部分を「Hour」に代入
let Minute = (Hour - Math.floor(Hour)) * 60;
//「分」の部分をMinuteに代入
let diffSecond = (Minute - Math.floor(Minute)) * 60;
TimeDefference = (('00' + Math.floor(Hour)).slice(-2) + ':' + ('00' + Math.floor(Minute)).slice(-2) + ':' + ('00' + Math.floor(Second)).slice(-2));
```

`Math.floor`は数値の小数点以下の切り捨て処理を行う方法です。
`.slice()`メソッドは文字列を切り分けるメソッドで、指定した引数の位置で文字列を切り分けることができます。
`.slice(-2)`は右端から２番目の文字列だけを抽出することになり、`"0021"`だと`"21"`だけを抽出できます。

このままのコードだと動かないので、`ChangeTime`には、ユーザーが選択した時刻を代入するような処理を書いてください。
また、入力した時刻が現在時刻と早いとうまくいかないので、この点の修正等も次の記事で書きたいと思います。
もっといい方法がありましたら、ご教示願います。

#### 参考記事
https://qiita.com/chokunari/items/9642741c6ce84ab5e133
【Vue × Firestore】削除機能の追加


#削除機能の追加

```html:list.vue
<button class="hide-btn" @click="deletePost">×</button>
```

```javascript:list.vue
deletePost() {
 firebase
 .firestore()
 .collection("posts")
 .doc(this.$route.params.uid)
 .delete();
}
```

```javascript:router.vue
  {
    path: "/board/:uid",
    name: "Board",
    component: Board,
  },
```

clickしたらdeletePost()が発火します。
postsというコレクションを参照して、現在のURLのパラメータを取得。
delete()で対象を削除します。

この記述のみで削除機能を実装可能です。

#おまけ

[【Vue.js】vue-swalを使ってアラートを実装](https://qiita.com/TMTN/items/ad899f5572ab43a2b8ac)

vueにはvue-swalという便利なライブラリをがあります。
このライブラリを使用して削除の際にアラートを付けてあげるとより良いでしょう。
Goのnew()とmake()の違いと、それぞれの使い所をさらっとまとめる

# new()

new(T)はtypeがTのインスタンスを、Tのゼロ値で生成して、そのポインタを返してくれる。
構造体でよく使われる。

# make()

make(T, args)における、Tはsliceかmapかchannelのいずれかである。
make(T, args)はtypeがTのインスタンスをargsを元に初期化して返してくれる。

# new()とmake()の使い分け

そもそも、make()はsliceかmapかchannelでしか使えない。
これら3つの型には初期化情報を与えることで事前にメモリを確保しておくことが可能だ。
sliceにはlenとcapを、mapとchannelにはlenを与えられる。
あらかじめ使用するメモリ幅が決まっているのなら事前に確保しておくことで、処理時間を短くできる。

一応、new()でsliceやmapのインスタンスを生成することもできる。

```go
package main

import (
	"fmt"
)

func main() {
	s := new([]string)
	(*s) = append((*s), "hello")
	fmt.Println((*s)[0]) // output: hello
}
```

```go
package main

import (
	"fmt"
)

func main() {
	m := new(map[string]string)
	m = &map[string]string{} // この行がないとエラーになる
	(*m)["hello"] = "world"
	fmt.Println((*m)["hello"]) // output: hello
}
```

ご覧の通り、sliceとmapのゼロ値はnilであったり、new()がポインタを返すせいで、冗長な書き方になってしまう。

処理を短時間にする観点に加えて、sliceやmapやchannelでは初期化情報を与えないとすぐに使えないという事情もありそうだ。

new()の使い所はというと、sliceでもmapでもchannelでもない型のインスタンスを生成したい時、ということになる。
ただ、それらは初期化子としてリテラルが使えることがほとんどだ。

```go
package main

import (
	"fmt"
)

func main() {
	str := new(string)
	*str = "hello"
	fmt.Println(*str)
}
```

👆このように書くよりも、

👇このように書いた方が早い。

```go
package main

import (
	"fmt"
)

func main() {
	str := "hello"
	fmt.Println(str)
}
```

ということなので、new()の使い所はある程度限られてきそうだ。
使い所の一つにはゼロ値の初期化で十分使える状態になるという場合がある。

```go
type SyncedBuffer struct {
    lock    sync.Mutex
    buffer  bytes.Buffer
}

p := new(SyncedBuffer)
```

sync.Mutexのゼロ値はUnlockedなmutexで、
bytes.Bufferのゼロ値は、すぐに使える空のバッファーである。

これはゼロ値が便利なのでnew()を使いたい。

もう一つには、構造体をnew()で初期化しておいて、メンバを一つずつ計算して当てはめていきたい場合もあるかもしれない。

また、構造体で、ほとんどのメンバのゼロ値は使えるが、一部のメンバのゼロ値はやっかいな場合に、とりあえずnew()してから一部のメンバを計算するという使い方もできそうだ。

# まとめ

Effective Goにはこう書かれている。

"Since the memory returned by new is zeroed, it's helpful to arrange when designing your data structures that the zero value of each type can be used without further initialization. "

ゼロ値がすぐに使えるもので、追加の初期化処理がいらないときにnew()を使うと便利だよ、ということらしい。

これからは立ち止まって初期化の方法を考えていきたい。
git stash 作業中にマージ依頼が来たときとかに使える方法

**作業中にマージ依頼が来て困ったのでその時に学んだ対処法（git stashの使い方）を備忘録***


```git stash save　""```　コミットしてないファイルを一時保存
```git stash list```　stashされてる履歴確認
```git stash show ~~``` stashされてるファイル確認
```git stash pop```　元に戻す
```git stash apply```　元に戻しstashにも残す
【Vue × Firestore】ページを一つ前に戻る（認証済みユーザー）

#ページを一つ前に戻る

```html:chat.vue
<router-link :to="`/board/${this.uid}`" class="back-btn">
```

```javascript:chat.vue
  created() {

    const currentUser = firebase.auth().currentUser;
    this.uid = currentUser.uid;

    firebase
      .firestore()
      .collection("users")
      .doc(currentUser.uid)
      .get();
}
```

```javascript:router.vue
 {
    path: "/board/:uid",
    name: "Board",
    component: Board,
  },
```

上記では、変数に入れてるが入れずに記述すると下記になります。
このコードでログイン中のuidを取得できます。

```javascript:chat.vue
 firebase
   .firestore()
   .collection("users")
   .doc(firebase.auth().currentUser.uid)
   .get();
```

そして、routerで記述したようにPathを"/board/:uidとしているので、
router-linkタグに:to="`/board/${this.uid}`"としてあげると/boardページに戻ることが出来る。

```html:chat.vue
<router-link :to="`/board/${this.uid}`" class="back-btn">
```
IBM,Rigetti,IonQの量子コンピュータでQAOAやってみた

# QAOA

QAOA(Quantum Approximate Optimization Algorithm) は、組み合わせ最適化問題を解く古典・量子アルゴリズムです。
精度保証や高速性の保証はありませんが、NISQ(Noisy Intermetidate Quantum)でも動く可能性アリとされています。

今回は、各社の量子コンピュータを使って、QAOAをやってみます。[^1]
特にRigetti, IonQ のものは有料なので、ベンチマーク結果はまだまだ貴重だと思います。

# 実装の流れ

IBMについては、qiskitを用いてIBMQサービス（無料）で駆動します。
マシンとして、5 qubitでは性能が最も低い ibmqx2(=ibmq_5_yorktown) と 最も高いibmq_santiagoを使います。

RigettiおよびIonQについては、braketを用いてblueqat cloud をエンドポイントとして使用することで駆動します。

# QAOAで解く問題

4ノードのMAX CUT です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878664/6e749c8b-7abe-4c99-eb84-97020b03affd.png)

QAOA回路です。(p=1)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878664/e9a67188-0ec0-276d-75d6-510dc6f0c84f.png)

qiskitでのシミュレーション結果です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878664/f0249c94-b601-5762-9258-a275e85ed445.png)

問題の解は0101と1010であり、確かに解となる量子状態が高い確率で観測されます。

braketでのシミュレーション結果です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878664/5bd19bb0-2374-3d7e-5147-948a97b0f24e.png)

シミュレーターなので、qiskitもbraketも変わりませんが、いずれも正しく実装できていると確認できます。

# 結果

# IBM 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878664/5dad9ed6-53f3-074b-e040-39673748806f.png)

Quantum Volume という性能指標が高いibmq_satiagoでは解けていますが、低いibmqx2ではうまくいきません。

# Rigetti

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878664/78d386dd-edb4-50cf-f204-b899212da4e5.png)

全然だめなようです。

# IonQ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878664/c6d16fbf-2105-f386-0865-24c2fb89e238.png)

1010は出ていますが、0101のほうが出ておらず、やや不自然です。

# まとめ

**無料のIBM量子コンピュータが一番良い**　という意外な結果になりました。
IBMの5量子ビットマシンは完成度が高いのかもしれません。
RigettiやIonQは有料だけあって、それぞれ37qubit,全結合11qubit使えますので、
量子ビット数が多数必要な問題やゲート操作が密になる回路では必須になると言えます。[^2]


[^1]: なおQAOAパラメータはシミュレーターで最適化したものを決め打ちとし、回路生成し、実機実行しています。量子・古典でiterationを回すのが正当ですが、クラウドアクセスしか出来ない現状では非現実的な計算時間とお金がかかります。

[^2]: 実はIBMも最大60量子ビット級のマシンや、QV=128のマシンを提供しています。が、無料ユーザーではアクセスできません。
toioのDo!コンの二次審査でベイトイオをブラッシュアップしました

# ベイトイオ
![スクリーンショット 2021-05-10 21.57.19のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/f1a4798f-ae92-2692-9159-9c265f9cb6ba.png)

# コアキューブだけでも遊べるけれど、LEGOでカスタムしたほうがおもしろい
![IMG_9188のコピー.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/0dd3c4f9-4fcc-1572-ad1a-119cdb7f4ce1.jpeg)

# ざっくりとしたシステム概要図
![ベイトイオシステム概要図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/50328596-067f-8c42-a5f0-2ae43d49ccaf.png)

# 各スクリプトの解説
## 常時監視用スクリプト系
### コアキューブの向き取得スクリプト
- 変数に、コアキューブ2台の向きをそれぞれ格納しています。
- ちなみに、ここで-180の数値を入れると、コアキューブに対峙する形で向きを調整することができます。

### 終了処理
- いつでもゲームセットが機能するようにしています。
- コアキューブがマットに触れていない状態になったときに、音が鳴って、すべての処理が止まります。
- つまり、コアキューブの「タイヤが浮いた」時点でもゲームセットになるので、LEGOなどでデコる際は、「パーツの量が多いから強い」わけではなくなることでバランスが取られています。
![スクリーンショット 2021-05-10 22.12.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/f3a08cb0-fde5-8e8c-82d4-b9692829a506.png)

## 初期処理〜主処理
### 初期処理
- バトル開始地点までコアキューブが移動するスクリプトが、ブロック定義によって設定されています。

### 主処理
- 前進処理と回転処理を3回繰り返したのち、バトルフィールド中央付近(バトル開始地点付近)へコアキューブが向かうようにしています。(バトルの冗長化の回避のため)
![スクリーンショット 2021-05-10 22.13.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/f994e5b2-1701-5da2-8510-19062068949f.png)

## 各種ブロック定義
### 初期処理
- お互いのコアキューブが衝突しないよう、外周に沿って、バトル開始地点まで移動します。
- コアキューブの設置地点から移動を開始するので、バトル開始は同時ではないので、そこもちょっとしたハンデであったり、ゆるっとしたバトルプレイとなります。

### 前進処理
- ただ前に進むだけでは、場合によってはマットの外に出てしまう可能性もあるので、50%の確率で、前進するか、後退するかの処理にわかれます。
- 前進する場合、相手のコアキューブの前方へ自身も向いて、そこへ前進します。
![スクリーンショット 2021-05-10 22.13.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/bbff0292-3b43-bfaf-f6b9-812296634f59.png)

### 回転処理
- 実際にプレイする際の、最大のアレンジポイントとなります。
- 左タイヤと右タイヤの数値を意図的に変えることにより、明確に「右回転」「左回転」にすることができるので、より激しいバトルが期待されます。
![スクリーンショット 2021-05-10 22.13.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/94a42620-d1da-ad98-d8b6-8ed61d05f27c.png)
XCTUnwrapを使ってUnitTestのunwrapをすっきり書く

# 概要

Xcode11以降に追加された`XCTUnwrap`を使ってテストコード中のOptional値のunwrapをスッキリ書く方法の紹介です。

## XCTUnwrapとは

公式ドキュメントには以下のような記載があります
https://developer.apple.com/documentation/xctest/3380195-xctunwrap

```
Asserts that an expression is not nil, and returns the unwrapped value.
```

ざっくり言えば「unwrapと`XCTAssertNotNil`」という感じです。

## どんなときに有効か

unwrapしたオブジェクトを計算に使いたいケースで有効。
unwrapしたオブジェクトが「`nil`であるかどうか」をテストしたいケースには向かない。

以下に具体例。

# 一般的なUnitTest中のunwrapの書き方（XCTUnwrapを使わない書き方）


```swift

func testSample() {
    let string = "1"
    
    // 「if let」だとネストが深くなるので「guard let」で書くのが一般的かと思います
    guard var number = Int(string) else {
        XCTFail()  // unwrapできないときはテストを失敗させる
        return     // 以降の処理を行わせないためにreturn
    }

    number += 1

    XCTAssertEqual(unwrappedNumber, 2)
}

```


# XCTUnwrapを使った書き方

```swift

func testSample() throws { // tryで例外を投げる可能性があるのでthrowsが必要
    let string = "1"

    let number = Int(string)
    var unwrappedNumber = try XCTUnwrap(number) // unwrapに失敗したらthrowされるので以降の処理とテストは実施されない
                                                // testSampleのテストはfailureとして処理される
    unwrappedNumber += 1

    XCTAssertEqual(unwrappedNumber, 2)
}

```

## XCTUnwrapを使った書き方の特徴

- unwrapできないとき例外を投げてテスト失敗になるので、unwrap出来なかったケースを考えなくて済む
  - 「一般的な書き方」の`guard ~ else`のスコープで行っている「`XCTFail`と`return`」など
- 一行で済むのでコードが簡潔になる
差し込み＋ファイルを添付してメール一斉送信

[パスワード付PDFを一括作成する](https://qiita.com/neko22/items/d1ddd9c99f12fbb33f21)で作成した各人別のファイルを件名や本文に文字列を差し込んでGoogleAppsScriptで一斉送信します。
##下準備
1.マイドライブに適当なフォルダを作成し、pdfファイルを保存しておきます。
2.スプレッドシートを作成し、シート名を「送信リスト」に変更。
3.下記のようなデータを用意します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565780/f2d02cbb-32a1-c2ee-81af-a8ba2ee5e18e.png)
##差し込みデータの準備
A列（1列目）はタイトルに差し込む文字列、B～D列（2～4列目）は本文に、E列（5列目）は送信先です。それぞれを配列に格納します。

```javascript
function Mail() {
  //個別設定
  var listst = SpreadsheetApp.getActive().getSheetByName('送信リスト');
  var lastrow = listst.getLastRow()-1
  var Title = listst.getRange(2, 1, lastrow,1).getValues();
  var Body01 = listst.getRange(2, 2, lastrow,1).getValues();
  var Body02 = listst.getRange(2, 3, lastrow,1).getValues();
  var Body03 = listst.getRange(2, 4, lastrow,1).getValues();
  var ToAddress = listst.getRange(2, 5, lastrow,1).getValues();
``` 

##ファイルを添付して送信

```javascript
  for( var i = 0, l = ToAddress.length; i < l; i = i + 1 ) {  
    
    //添付ファイルの設定
    var files = listst.getRange(i + 2, 6).getValues();
    var file = DriveApp.getFilesByName(file_name).next();

    //送信メールの設定
    GmailApp.sendEmail(
    ToAddress[i],
    '【' + Title[i] + 'さん】住所確認のお願い', 
    'ここに本文\n' + 
    '本文本文本文本文本文本文本文本文本文本文本文本文本文本文\n' + 
    '本文本文本文本文本文本文本文本文本文本文本文本文本文本文\n' + 
    '項目1：' + Body01[i] + '\n' +
    '項目2：' + Body02[i] + '\n' +
    '項目3：' + Body03[i] + '\n' +
    '本文本文本文本文本文本文本文本文本文本文本文本文本文本文',{
      from: '******@gmail.com',
      name: 'メール自動配信',
      cc: '******@gmail.com',
      attachments:file,
    });
    var dtLimit = new Date();  //送信日時の取得
    listst.getRange(i + 2, 7).setValue(dtLimit); 
  }
}
```

無事に送信されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565780/669fca0d-77e0-a953-da5f-1836ed6b13dc.png)
ransackの検索機能をRSpecでテストする方法

# はじめに
ransackの検索機能をRSpecにてテストする際に、書き方を検索したが思ったような記事がヒットしなかったので備忘録として記事を書きます。

## この記事の内容
- ransackをRSpecでテストの実施

## Companyテーブル構成

|Column |type |
|:---- |:---- |
|name |string |
|category |integer |

## テストコード

```
RSpec.describe '#index', type: :request do
  describe '企業名検索のテスト' do
    context '正しいパラメータが渡されている場合' do
      it '検索後の対象データに想定している内容があること' do
        #空のインスタンス変数を作る
        @params = {}
        #インスタンス変数に値を入れる
        @params[:q] = { name_cont: 'test2' }
        #検索メソッドに値を入れた変数を渡して、結果を変数に入れる
        @q = Company.ransack(@params)
        #検索結果のリザルトを比較用の変数にいれる
        @companies = @q.result
        #検索結果と比較する
        expect(@companies) == ({ name: 'test2' })
      end

      context '不正なパラメータが渡されている場合' do
        it '検索後の対象データに想定している内容がないこと' do
          @params = {}
          @params[:q] = { name_cont: 'test2' }
          @q = Company.ransack(@params)
          @companies = @q.result
          expect(@companies) != ({ name: 'テスト２' })
        end
      end
    end
  end
end
```
## コードの説明
コードの説明はコメントアウトをご確認ください。
RSpecのcontextやitは下記URLのサイトがわかりやすかったです。
https://qiita.com/jnchito/items/42193d066bd61c740612

## まとめ
Qiitaの記事を久々に書きましたが、説明を考えながら記事を書くと自分の思考も整理されてスッキリしました。
改めて、テストコードは重要だなと感じたので、少しでも皆さんのお役に立てればと思います。
拙い箇所が多々あるかとは思いますが、ご指摘等あればコメントいただけると幸いです。。。
【JavaScript】DOM(Document Object Model)からHTMLとCSSを操作して、背景色、文字色、文字サイズを操作せよ。※css不要

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954863/6b423a3c-79f1-f34d-7659-37358e7b3b39.png)

```javascript
<!DOCTYPE html>
<html lang="ja">
<head>
   <meta charset="UTF-8">
   <title>challenge_dom</title>
</head>
<body>
   <div id="large">
       <div id="box1">文字色は赤、文字サイズは24p</div>
       <div id="box2">文字色は白、文字サイズはデフォルト</div>
   </div>
   <script>
       // ここに追記
       var large = document.getElementById('large'); // id="box1"の要素を取得
       var box1 = document.getElementById('box1'); // id="box1"の要素を取得
       var box2 = document.getElementById('box2'); // id="box2"の要素を取得

       large.style.backgroundColor = 'black';
       box1.style.color = 'red';
       box1.style.fontSize = "24px";
       box2.style.color = 'white';

   </script>
</body>
</html>

```
rsyslogとsyslogの違い

## 勉強前イメージ

古いのがsyslogで新しいのがrsyslog
互換性はあるけど・・・違いは知らない

## 調査

### syslog とは

syslogとはシステムのログを収集し、ネットワーク上で転送するための規格です。
他のプログラムからのメッセージを受信したり、定義した出力先に転送できます。
歴史としては、syslogのほうが古くUDPを使用しています。
なので途中でパケットロスが発生する可能性がありました。

### rsyslog とは

syslogを改良したのが rsyslogになります。
頭文字の `r` とは reliable のrで、信頼性の意味があり、TCPを使用したり暗号化で転送を行ったりしています。
他にもログのフィルタリングや主要なデータベースとの連携も可能になりました。
また圧縮転送も可能になりました。
syslogと互換性があります。
centos7ではデフォルトでrsyslogが採用されています。

## 勉強後イメージ

大体認識合ってたけど、syslogってUDPだったんだ・・・
途中でログがなくなっちゃうこともあるよね。。。
他にも syslog-ng ってのがあるみたいなので次調べてみる

## 参考

- [syslog と rsyslog の違いを比較表で説明](http://tooljp.com/windows/chigai/html/Linux/syslog-rsyslog-chigai.html)
- [syslogとrsyslog、syslog-ngの挙動の違いをまとめた](https://webnewage.com/syslog)
SQLAlchemyで既存のDBからモデルを作る方法


Djangoならこちらの方法があるんですが
https://docs.djangoproject.com/ja/3.1/howto/legacy-databases/

それ以外の場合に少し困ったのでこちらに備忘録として書いておきます。

## sqlacodegen 
https://pypi.org/project/sqlacodegen/

## インストール
```
pip install sqlacodegen
```

## 使用例
sqlacodegenの後にSQLAlchemyで使用するDatabaseURLを記載します。
下記はpostgresqlの例です。

```
sqlacodegen postgresql://{DB_USER}:{DB_PASSWORD}@{DB_HOST}/{DB_NAME} > models.py
```
gnuplotで指定した値域から外れるデータをプロットしない方法

自分はgnuplotを使ってグラフを描いています。
実験結果をグラフにする際に、データ取得ミスなどでデータが変な値(すなわち、自分が予想する値域から外れた値)を出力することがあります。
gnuplotなどグラフ描画ソフトを使ったことある方なら、わかると思いますが、線つなぎ、点と線で繋ぐなどやっていると、おかしなところに線が吹っ飛びます。
今回はそれを無くすための設定を記載していきます。

# C言語の三項演算子を使う。

元々大学一年生の授業でプログラミング入門みたいな授業でC言語を学んだ程度なので、そんなものは知りません。
なので、知らない人が知らない人のためにわかりやすく説明したいと思います。
いつも使っているソースコードは以下

```gnuplot:plot.gp
set parametric
set size square
set xtics 500
set ytics 250
set xrange[-2250:2250]
set yrange[-2250:2250]
set xlabel'x(mm)' font "Arial,16"
set ylabel'y(mm)' font "Arial,16"
set title "グラフのタイトル記入しましょう" font "Arial,20"
set grid
      
set terminal eps #この出力はpngでも可能。それ以外はわかりません。
set output "/hoge.eps" #絶対パスでも記述可能です。
plot [0:2*pi] 2000*cos(t),2000*sin(t) lw 8 title "course" ,\
     "1kaime_take1.txt" every 2::5:: u ($4 > -2000 && $4 < 2000 ? $4 : 1/0):($5 > -2000 && $5 < 2000 ? $5 : 1/0) with lines lw 3 title "1号機" ,\
     "1kaime_take1.txt" every 2::6:: u ($1 > -2000 && $1 < 2000 ? $1 : 1/0):($2 > -2000 && $2 < 2000 ? $2 : 1/0) with lines lw 3 title "2号機"
set output
```

一行ずつコメントしていくのは大変な作業なので割愛。
大事な部分は以下です。

```
"1kaime_take1.txt" every 2::5:: u ($4 > -2000 && $4 < 2000 ? $4 : 1/0):($5 > -2000 && $5 < 2000 ? $5 : 1/0) with lines lw 3 title "1号機" ,\
```

この行でグラフを描いています。
その中の`  u ($4 > -2000 && $4 < 2000 ? $4 : 1/0):($5 > -2000 && $5 < 2000 ? $5 : 1/0) `　の部分が大切
まず大きなくくりとして、usingコマンドを使っています。

```
using 1:2
# これだと、1列目をx軸へセット、2列目をy軸へセット。
# すなわち、x-y軸を入れ替えたい場合は using 2:1にすれば入れ替わります。
```

usingコマンドの内部を見ていきましょう。
これが重要な三項演算子である。

```
x < 0 ? 0 : x
```

↑が三項演算子の大まかな使い方である。
x<0のとき、0を、それ以外の場合(x>=0)はxを出力という具合である。
もっとわかりやすく説明すると

```
[条件式] ? [条件式が正のときの処理] : [条件式が偽のときの処理]
```

という形である。
これが私の場合のソースコードである。

```
$4 > -2000 && $4 < 2000 ? $4 : 1/0
```

4列目の値が -2000 < $4 < 2000の場合は4列目の値をそのまま出力
偽の場合は1/0を出力。

いや、1/0ってなによ。ゼロディビジョンエラーやろ
そうだそうだ、ZerodivisionErrorやろ
`ZeroDivisionError: division by zero`
そうそうこいつだ、きもいやつ

まぁ、お遊びはこのあたりで。

gnuplotで値をplotしたくないときには`1/0`と入力することで、値をプロットしないようにできます。
重要なので、もう一度言っときます

gnuplotでは、`1/0`と記入することで、値をプロットしないようにできます。

こんなコアなことを調べてる皆さんなので、わかっていると思いますが
ターミナル上で以下のように入力することで、gpファイルを実行することができます。

```
$ gnuplot plot.gp
```

覚えておいて損はないでしょう。
それでは。

# 参考サイト

https://ss.scphys.kyoto-u.ac.jp/person/yonezawa/contents/program/gnuplot/ternary-operator.html
Python3 エンジニア認定基礎試験に合格した話

#自己紹介

みなさん、はじめまして。
Web開発エンジニアを目指している、インフラエンジニア歴7年目の者です。

初投稿なので、備忘録として資格合格した話を書いていこうと思います。
技術的な深い話はなく、かつ拙い文章になるかと思いますので、ご覧いただいた方は暖かい目で見てください。。

#概要

今回受験した資格試験は、冒頭の通り「Python3 エンジニア認定基礎試験」になります。
Pythonを扱う、またはこれからPythonを使って仕事をしていきたいという方々が目指す初心者向けの資格になるかと思います。

試験の詳細については<a href="https://cbt.odyssey-com.co.jp/pythonic-exam.html">こちら</a>を参照してください。

結論から申しあげると、当方は知識ゼロから合格するまでに1か月程度あれば合格できるレベルでした。
公式のチュートリアルやWeb模擬問題集などの試験対策がすべて無料で活用できるため、経済的にも受験しやすい資格です(ただし受験料だけが11,000円（税込）と微妙に高い。。。)。

そんなかんじで、資格取得したい方は受験料に目を瞑って勉強頑張っていきましょう。

#試験当日までの手続き

資格試験の受験するための前準備として、以下のステップが必要になります。

①試験会場の申し込み
　・・・お近くの試験会場を探して申し込みをするだけなのですが、試験会場によって空いている日時が違ったりするので、早めに試験スケジュールを確認することを推奨します。
②Odyssey IDの登録
　・・・試験日までに登録が必要となり、試験当日に「Odyssey ID」と「パスワード」が必要になるので忘れないようにしましょう。
③試験当日の持ち物
　・・・「写真付き身分証明書」と「受験票」を忘れないように持っていきます。
　　　　中には「受験票」が発行されない試験会場もあるので、電話等で確認してみましょう。
　　　　(当方は発行されない試験会場でした)

詳しくは概要欄で書いた試験の詳細の参照先にある「受験の流れ」を確認してください。

#試験当日までの勉強方法

それでは、勉強方法について書いていきます。

###使用教材

使用する教材(教科書)については一つだけ、以下を読み込みましょう。
<a href="https://docs.python.org/ja/3.5/tutorial/index.html">Python ver3.5 チュートリアル</a>
※2021/5/10時点ではver3.5が試験範囲となっていますが、今後変更する可能性はあるため注意してください。

このチュートリアルは試験範囲そのものなので、出題率の高い章から重点的に勉強していきましょう。
出題率は、概要欄で書いた試験の詳細の参照先にある「試験科目」＞「Python 3 エンジニア認定基礎試験」＞「出題範囲」から確認してください。

ただし、読み込むだけで頭に入らない方は実際に同バージョンのPythonをPCにインストールして、テキストの内容を検証していくと理解しやすくなるのでおすすめです。

Pythonインストール方法は、以下を参考にしてください。
<a href="https://www.python.jp/install/install.html">Python環境構築ガイド</a>

###使用模擬問題

使用する模擬問題については二つ、以下を周回しましょう。
<a href="https://exam.diveintocode.jp/exam">DIVE INTO EXAM</a>
<a href="https://study.prime-strategy.co.jp/">PRIME STUDY</a>

基礎と応用の問題がうまく散りばめられているので、最初は1問ずつ丁寧に解いていくと良いかと思います。
慣れてきたら、実際の試験時間に合わせて問題を解いていくことでより合格に近づけるはずです。

#あとがき

ここまで「Python 3 エンジニア認定基礎試験」の備忘録を書いてみました。
決して難しくない資格なので、やる気と受験料さえ出せれば問題なく合格できるはずです。
少しでも合格を目指している方のお力になれれば幸いです。

当方もまだまだプログラミングに足を踏み入れたばかりなので、Web開発エンジニアを目指している方々と一緒に頑張りたいと思います。

というわけで、拙い文章でしたがご覧いただきありがとうございました。

明日はなんの勉強しよっかな。。
現場で経験した技術を個人アプリに実装する

2.現場で経験した技術を個人アプリに実装する


ソースコードをGitHubに上げる
10件以上


- [ ] 1. カルーセル CollectionVivewの選択により、PageViewを切り替える  
https://github.com/YingZheng02590218/iKingdom/commit/4abfb2e48d8024415d69f2ecdb291fabdac526e7

- [ ] 2.  
https://github.com/YingZheng02590218/iKingdom/commit/b5063205b8f86be62a1dc14ce47c3d3559315d4f

- [ ] 3.  Asset Catalogを使ってカラー定義の管理  
https://github.com/YingZheng02590218/iKingdom/commit/d967c419f009354c4ddb89678c58272e3af07695

- [ ] 4. UICollectionView  画面の回転に合わせてセルのサイズを変更
https://github.com/YingZheng02590218/iKingdom/commit/1e417c4a896d8b2e94f9b7921ca295bf48cedb92

- [ ] 5. アプリ内でブラウザを開くSafariViewController
https://github.com/YingZheng02590218/iKingdom/commit/fb80a3ca2693ece393e273b621c85467ad760716

- [ ] 6. Storyboardを分ける 1ViewController1 Storyboard
https://github.com/YingZheng02590218/iKingdom/commit/14d557b9aeeb2d517ff1e036c22c45973dbd2451

- [ ] 7. 命名規則 任意の名称+ViewController
https://github.com/YingZheng02590218/iKingdom/commit/bfcce29d4733001280970922a6ea2b876a848ab7

- [ ] 8. TableViewCellの左端にアイコン画像を配置した。
https://github.com/YingZheng02590218/iKingdom/commit/706be4cdb0741e37c8c14456ce152d824810058f

- [ ] 9.

- [ ] 10.