OmniAICreator/Qiita-1.07M huggingface dataset:
Cannot run more than 1 Free size dynos.

```zsh
% heroku run console
Running console on ⬢ obscure-escarpment-7xxx2... done
 ›   Error: Cannot run more than 1 Free size dynos.
 ›
 ›   Error ID: cannot_run_above_limit
 ›   See https://devcenter.heroku.com/articles/dyno-types#default-scaling-limits for more information.
```

Cannot run more than 1 Free size dynos.
「Dynoに空きが無い」と怒られています。


```zsh
% heroku ps
Free dyno hours quota remaining this month: 999h 53m (99%)
Free dyno usage for this app: 0h 6m (0%)
For more information on dyno sleeping and how to upgrade, see:
https://devcenter.heroku.com/articles/dyno-sleeping

=== run: one-off processes (1)
run.9665 (Free): up 2021/09/24 00:07:57 +0900 (~ 1h ago): bash

=== web (Free): iex (1)
web.1: crashed 2021/09/24 01:28:00 +0900 (~ 26m ago)
```

`9665`のプロセスがいらなそうなのでストップします。

```
heroku ps:stop run.9665
```

```
 % heroku ps              
Free dyno hours quota remaining this month: 999h 53m (99%)
Free dyno usage for this app: 0h 6m (0%)
For more information on dyno sleeping and how to upgrade, see:
https://devcenter.heroku.com/articles/dyno-sleeping

=== web (Free): iex (1)
web.1: crashed 2021/09/24 01:28:00 +0900 (~ 31m ago)

```

消えてます。
【備忘録】pythonのplaysoundがGst関連エラーで動かなかったら

# 症状
↓のようなエラーが出て再生できなかった (Raspberry Pi OS @ Raspberry Pi 2B)

```
Traceback (most recent call last):
  File "/home/pi/.local/lib/python3.7/site-packages/playsound.py", line 261, in <module>
    playsound(argv[1])
  File "/home/pi/.local/lib/python3.7/site-packages/playsound.py", line 163, in _playsoundNix        
    gi.require_version('Gst', '1.0')
  File "/usr/lib/python3/dist-packages/gi/__init__.py", line 129, in require_version
    raise ValueError('Namespace %s not available' % namespace)
ValueError: Namespace Gst not available
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/pi/.local/lib/python3.7/site-packages/playsound.py", line 254, in <lambda>
    playsound = lambda sound, block = True: _playsoundAnotherPython('/usr/bin/python3', sound, block, macOS = False)
  File "/home/pi/.local/lib/python3.7/site-packages/playsound.py", line 229, in _playsoundAnotherPython
    t.join()
  File "/home/pi/.local/lib/python3.7/site-packages/playsound.py", line 218, in join
    raise self.exc
  File "/home/pi/.local/lib/python3.7/site-packages/playsound.py", line 211, in run
    self.ret = self._target(*self._args, **self._kwargs)
  File "/home/pi/.local/lib/python3.7/site-packages/playsound.py", line 226, in <lambda>
    t = PropogatingThread(target = lambda: check_call([otherPython, playsoundPath, _handlePathOSX(sound) if macOS else sound]))
  File "/usr/lib/python3.7/subprocess.py", line 347, in check_call
    raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['/usr/bin/python3', '/home/pi/.local/lib/python3.7/site-packages/playsound.py', 'chime.mp3']' returned non-zero exit status 1.
```


# 解決方法
[GitHubのissue](https://github.com/TaylorSMarks/playsound/issues/16#issuecomment-658182306)に解決策がありました。  
python版gstreamerが入っていないことが原因らしいので

```bash
sudo apt install python3-gst-1.0
```

でちゃんと音声が再生されるようになります。
Unity ECS ScheduleParallel で 値を抽出したい (備忘)

（追記:修正 2021/10/06）
結論は出来て出来ん。
Job理解しきれてなかった。

スケジュール（Schedule/ScheduleParallel）をやってる時点で
メインスレッドからはずれて別の時に実行されます。

１．スケジュールが完了していれば（１～２フレーム待てば）使える。
２．JobをCompleteさせる。（スケジュールの恩寵が薄れる）

横と縦だけじゃなくて時間軸まで意識しないといけなくてワイ、泣きそう。

～～～～やり方～～～～
WithNativeDisableParallelForRestriction()と
WithNativeDisableContainerSafetyRestriction()を使ってください。

・WithNativeDisableParallelForRestriction(myvar) 
  ⇒複数のスレッドが同じ書き込み可能なネイティブコンテナーにアクセスすることを許可。
・WithNativeDisableContainerSafetyRestriction(myvar) 
  ⇒ネイティブコンテナへの危険なアクセスを防ぐ通常の安全制限を無効。

```csharp:System.cs
    public enum TradeResult{ Success = 0, Fail = 1 } 

    protected override void OnUpdate() 
    {
        var results = new NativeArray<TradeResult>(2, Allocator.TempJob, NativeArrayOptions.UninitializedMemory);
        var members = new NativeArray<Entity>(2, Allocator.TempJob, NativeArrayOptions.UninitializedMemory);
        Dependency = Entities.
            WithNativeDisableParallelForRestriction(results).     // 重要なところ
            WithNativeDisableContainerSafetyRestriction(results). // 重要なところ
            WithNativeDisableParallelForRestriction(members).     // 重要なところ
            WithNativeDisableContainerSafetyRestriction(members). // 重要なところ
            ForEach((Entity member) => {
              ~~~~~~~~~~~~ なんやかんやの処理 ~~~~~~~~~~~
               members[0] = member; 
               results[0] = TradeResult.Success;
               members[1] = member; 
               results[1] = TradeResult.Fail;
              ~~~~~~~~~~~~ なんやかんやの処理 ~~~~~~~~~~~
            }).ScheduleParallel(Dependency);
        var dataFromEquipment = GetComponentDataFromEntity<Translation>();
        Dependency.Complete(); // 2.JobをCompleteさせる
        Debug.Log($"{results[0]}-{results[1]}"); // => Success - Fail
        if (dataFromEquipment.HasComponent(members[0])) Debug.Log($"Exist Position {dataFromEquipment[members[0]]}");
        if (dataFromEquipment.HasComponent(members[1])) Debug.Log($"Exist Position {dataFromEquipment[members[1]]}");
        results.Dispose();
        members.Dispose();
      }

```

参考:https://note.com/npaka/n/n75c418080ff0
heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/"


```
2021-09-23T16:28:21.498473+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" host=obscure-escarpment-7xxx2.herokuapp.com request_id=79818b0b-6f0b-4ab9-9bf4-5be938b9e177 fwd="153.246.214.88" dyno= connect= service= status=503 bytes= protocol=https
2021-09-23T16:28:21.890623+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/favicon.ico" host=obscure-escarpment-7xxx2.herokuapp.com request_id=e6cb1a7f-3a21-47aa-a199-622feea5aae6 fwd="153.246.214.88" dyno= connect= service= status=503 bytes= protocol=https

```

↑クラッシュした事実だけが記載されている。

`heroku run console`で原因が見つかるかも。

```
% heroku run console
Running console on ⬢ obscure-escarpment-76252... done
 ›   Error: Cannot run more than 1 Free size dynos.
 ›
 ›   Error ID: cannot_run_above_limit
 ›   See https://devcenter.heroku.com/articles/dyno-types#default-scaling-limits for more information.
```
font-size: 62.5%;はアクセシビリティを損ねるのか？

## これは何

ルート要素に`font-size: 62.5%;`を指定しつつ、それぞれの要素に`font-size: ○○rem;`と指定するやり方はアクセシビリティを損なうという意見をたまに見るので、それを検証した記事です

## 結論

ここでいう「アクセシビリティ」が「ブラウザのfont-size変更機能が正しく機能する」を意味するなら損ねません。

## 事の発端

「font-size指定をするにはpxが良いかremが良いか」の話題、時折盛り上がりますよね。

いつだったか「`font-size: 62.5%;`はアクセシビリティを損ねる」とツイートされているのを見つけました。
なんでも、ブラウザが持っているfont-size変更機能が上手く働かなくとのことです。

書かれていたのは**記憶が正しければ**[^1]以下のような内容。

- デフォルトのfont-sizeは16px
- 設定変更で32pxにしたとする（2倍に拡大している）
- CSSでの`font-size: 62.5%;`のせいで、200 * 0.625 = 125、つまり125%の拡大率にしかならない
- アクセシビリティの観点でremを使っているとしたら、結局拡大を阻害するので良くない

最初に見た際は「ふーんそうなんだ」くらいで流してしまいましたが、仕事でしっかりと確認したい場面に遭遇し、改めて検証するに至りました。

[^1]: 記憶が正しければと記載したのは、当時この理屈を提唱していたツイートを確認しようとしたものの発見できなかったからです。個人ブログなどで引用されているリンクから飛んでみたらどれも消えていました。

## ブラウザのfont-size変更機能とは

CSSで何も指定していない状態の`font-size`はブラウザによって`16px`に指定されています。[^2]
しかし人によっては16pxでは小さすぎるor大きすぎる場合もあるため、ブラウザ側でデフォルトのサイズを変えられるようになっています。

[^2]: 少なくとも「モダンブラウザ」として名前の挙がるChromeやFirefox, Safariなどは16pxです。しかし、もしかしたら違うブラウザもあるかもしれません。その際はご容赦ください。

以下は実際に変更する方法の一例。

- Chrome
    - chrome://settings/fonts
    - `Appearance` -> `Customize fonts` -> `Font size`
- Firefox
    - about:preferences
    - `Language and Appearance` -> `Fonts and Colors` -> `Size`

## 検証

以下の3つのパターンのページを作って検証してみました。

1. ルート要素にfont-size指定無し、個別要素にpx指定
1. ルート要素にfont-size指定無し、個別要素にrem指定
1. ルート要素にfont-size: 62.5%、個別要素にrem指定

GitHub Pagesで公開しているので、こちらにアクセスしつつブラウザの設定を変更してもらえれば実際に確かめられます。

https://xrxoxcxox.github.io/qiita-font-size-px-rem/index.html

ついでに、リポジトリも公開しているのでもし興味があればどうぞ。

https://github.com/xrxoxcxox/qiita-font-size-px-rem

### ブラウザのfont-sizeを変えていない場合

| ルート要素にfont-size指定無し、個別要素にpx指定 | ルート要素にfont-size指定無し、個別要素にrem指定 | ルート要素にfont-size: 62.5%、個別要素にrem指定 |
| --- | --- | --- |
| ![ルート要素にfont-size指定無し、個別要素にpx指定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/24b7b74d-b239-bde7-987c-24e1b9f5d05a.png) | ![ルート要素にfont-size指定無し、個別要素にrem指定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/a405320a-6ac2-a19a-f0dc-838c3d11b2c2.png) | ![ルート要素にfont-size: 62.5%、個別要素にrem指定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/8e4e9db3-2f56-ed68-2246-635e8dfb18f5.png) |

まずはこの状態で、どの指定でも見た目が変わっていないのを確認します。

### ブラウザのfont-sizeを変えた場合

| ルート要素にfont-size指定無し、個別要素にpx指定 | ルート要素にfont-size指定無し、個別要素にrem指定 | ルート要素にfont-size: 62.5%、個別要素にrem指定 |
| --- | --- | --- |
| ![ルート要素にfont-size指定無し、個別要素にpx指定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/b5987e98-74d1-faf4-6909-64056de055e3.png) | ![ルート要素にfont-size指定無し、個別要素にrem指定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/bc4ab0e8-672d-a963-1d77-00124ab4aeee.png) | ![ルート要素にfont-size: 62.5%、個別要素にrem指定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/ec40d0e8-0e63-f17f-1950-6d1dcf3bf81e.png) |

16pxから20pxへ変更してみました。

pxで指定したものの表示が変わらないのは想定通りの挙動です。

そして本題、2つのrem指定の違いを見てみましょう。
何も差は無く「`font-size: 62.5%;`のせいでユーザーが想定した通りの拡大ができなくなる」事象は観測されません。

## まとめ

`font-size: 62.5%;`指定によってブラウザのfont-size変更が正しく機能しなくなりアクセシビリティを損ねる……という事象は起きない。
【Swift】StringをdropFirstできなかった時の解決策

Swiftで文字列の最初の文字を削除したかったので、以下の処理を書いたがdropFirstが反映されない。

```swift
str = str.dropFirst()
str = str.dropFirst(1)
str = str.dropFirst(2)
```

3行ともdropFirstが反映されない。

エラー文はこんな感じ。

`No 'dropFirst' candidates produce the expected contextual result type 'String'`

~~ちなみにこの辺りの記事でもString型にdropFirstは適用されているが、自分の場合はなぜか反映されず。~~
コメントでご指摘いただいたようにdropFirstはSubstringにしか適用されないようです。

https://qiita.com/masakihori/items/889cb5496f53cfff5b43

https://satoriku.com/string-cheatsheet/

## 解決策

```swift
str = String(str.dropFirst())
str = String(str.dropFirst(1))
str = String(str.dropFirst(2))
```

Stringでキャストしたら処理が反映された。

## Swiftのお役立ち情報

https://wagtechblog.com/programing/swift-iphone-application-school

https://wagtechblog.com/programing/swift-textbook.html
Blenderのビューポート配置のメモ

Blenderのアドオンを書いていても
ビューポート上の配置の情報にアクセスすることはほとんどないのだけれど、
ごくまれに調べる必要があって、その度に調べ直したりしていたのでこの機会にメモしておきます
ほぼ自分用メモなので間違っていてもご勘弁を

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/b197f7f7-b8ef-a9b5-62c0-1c95bfa7938a.png)

例えば　Scriptthingのワークスペースでは3Dビューのある部分は

```
bpy.context.screen.areas[5]
```
で取得できる areaが個々のエディタのことで
「現在実行中のウインドウの5番目のエディッタが表示されてる領域」といった感じの意味
Scriptingのワークスペースでは0がプロパティ 4がテキストエディタ
といった感じに作成時の順序になるので　.type等で調べてみるまで分からない
area の持つ属性は

```
>>> dir(bpy.context.screen.areas[5])
['__doc__', '__module__', '__slots__', 'bl_rna', 'header_text_set', 'height', 'regions', 
 'rna_type', 'show_menus', 'spaces', 'tag_redraw', 'type', 'ui_type', 'width', 'x', 'y']
```
このうち spacesはareaで切り替えて表示したエディッタで　spaces[0]が現在表示しているエディタ
そしてアドオンでパネル等にUIを登録した場合クラスのcontext で取得されるのはこの下にある情報の様子で
アドオンのテスト段階でビューの状態に関わるものを試したい場合、これを取得することで挙動を試すことができる

x,yはウインドウ左下基準のareaの位置　width,height はそのままareaの幅と高さ
regionsがarea内の個々のUIの領域（ヘッダやメニュー、ツール等）を表す
このうちサイドバー(図中areas[5].regions[3])のtypeは'UI'となっていて他と命名が違う

それぞれのregionもx,y width,heightを取得できるので（x,yはウインドウ全体の左下基準）
ウインドウの中のどの範囲に必要な情報が表示されているかを取得することは可能

ビューポートの情報の取得例：

```
space = bpy.context.screen.areas[5].spaces[0]
space.region_3d.is_perspective #パース表示かどうか
space.region_3d.view_location #ビューの中心位置
space.region_3d.view_distance#(距離)
```
【Swift】Character型の配列をString型の配列にキャスト

## ぶつかった課題

文字列を1文字ずつの配列にする方法として以下の手段がある。

```swift
let a = "abcde"
let array = Array(a)
```

ただここで生成される配列は1文字の型の意味を持つCharacter型。

そのためarrayをappendしようとすると

```
Cannot convert value of type '[String.Element]' (aka 'Array<Character>') to expected argument type '[String]'
```
とエラーになってしまう。

そのためarrayの中身のCharacter型をString型に直す必要がある。

## 解決策

map関数を使って、配列全体に処理を与えれば良いだけだった。

```swift
 let new_array = array.map{String($0)}
```

型変換を克服できずに数日悩んでいたので解決して何より。

## 参考文献

CharacterからIntに変更している記事でした。

https://qiita.com/rondine-jumpei/items/a298bf4e0612166e5dd5

## Swiftのお役立ち情報

https://wagtechblog.com/programing/swift-iphone-application-school

https://wagtechblog.com/programing/swift-textbook.html
angel70

# angel70
### qmkのソースはangel64からコピーして作った
キーマトリクスが異なるため、実機で試行錯誤して調整
現在、最新ソースにangel64は存在しない
### バックライトが光らない
はんだ付けしてPCに繋いだら、
バックライトが途中で光らないところがある（;以降すべて）
バックライトが途中から色が変わる（;と左スペース、→）
バックライトが途中から光る（左スペース、→）
など、いろいろと不安定。
また、バックライトを点灯させると、USBを繋いで数秒でキーボードと認識されなくなる。

いろいろと試行錯誤したところ、状態が変わるところ（4;と左スペース、→）のはんだを付け直したら安定した。

### バックライトがチカチカする
突然点滅し始め、色もいろいろな色になる。
特定のキー（4）以降で発生。
→特定のキー（4）を長押しすると収まる（ちがうかも？）
 →該当キー（4）のはんだを付け直したら現象は発生しなくなった。
　→しかし、数秒するとキーボードとして認識されなくなる（切断）という現象が発生するようになった。
   これまでと異なり、バックライトには一切異常が見られない
   しかし、切断前にPro MicroのLEDが点滅する
   →一日寝かしたら治ったと思ったらやっぱりだめ。
    →該当キー（4）のはんだを吸取線で吸ったら治った
.htaccessでサイトをメンテナンスモード表示にする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94360/4e0e0639-e361-1ddb-f835-abc7e45e0619.png)

メンテナンス時は何も考えずベーシック認証かけたりしてます？メンテナンス時だったらメンテナンス表示にしましょう。

# 画面作成

まず、メンテナンス表示の画面を作ります。

```html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>メンテナンス中</title>
    <style>
        body {margin-top:50px;text-align:center;}
        h1 {font-size:1.5rem;}
        div.alert {
                max-width:800px;font-weight:bold;
                background-color: #D02D26;
                color:#fff;margin:30px auto;padding:1rem;
        }
    </style>
</head>
<body>
    <img src="/503.jpg">
    <h1>ただいまメンテナンス中です。</h1>
    <div class="alert">
        メンテナンス日時<br>
        9月21日 12:00 - 13:00
    </div>
    <p>
        ただいまホームページをご利用できません。<br>
        メンテナンス終了までしばらくお待ちください。
    </p>
    <p>
        <b>お急ぎの場合はこちら</b><br>
        Tel : 03-xxxx-xxxx<br>
        email : dummy@example.com
    </p>
    <p>
        ※作業の状況により終了時刻が延びる場合がございます。あらかじめ了承をお願いします。
    </p>
</body>
</html>
```

ファイル名を503.htmlとして(※なんでもいい)、内容はこんな感じ。

上記のサンプルは
https://nukumori-icon.com/tag/%E3%83%A1%E3%83%B3%E3%83%86%E3%83%8A%E3%83%B3%E3%82%B9/
上記サイトの画像を使わせていただきました。

# .htaccess

htmlファイルの用意ができたら、次は.htaccessを編集。

```
ErrorDocument 503 /503.html
RewriteEngine On
RewriteCond %{REQUEST_URI} !/503.html
RewriteCond %{REQUEST_FILENAME} !^(.*)\.(jpg|png|css)$
RewriteCond %{REMOTE_ADDR} !xxx.xxx.xxx.xxx
RewriteRule ^.*$ - [R=503,L]
```

ステータスコード503を返すことで、メンテナンス中にたまたまGoogleのクローラーが来ても拾わせずに帰ってもらうことができます。

`%{REMOTE_ADDR}` で自分のIPアドレスを指定します。こうすることで、作業担当者だけは普通にサイトにアクセスできます。たぶんこれが分からなくてなんとなくベーシック認証にしちゃうんじゃないでしょうか？

あと、503.htmlやjpgファイルを制限対象から外している点もポイント。こうしないと503ページ自体が思ったように表示されません。

## CPIの場合

https://support.cpi.ad.jp/manual/sv-basic/tools/tips-htaccess

> ※アクセス集中を表す 503 エラー（Service Temporarily Unavailable）につきましては、サーバー側で制御しているため、お客さまにて変更いただけません。ご了承ください。

とのことなので503は使えません。302リダイレクトなどで対応する必要があります。

https://webmaster-ja.googleblog.com/2011/02/blog-post.html

Googleは「503を使うべき」と言ってますが・・

## WordPressの場合

[プラグイン](https://www.google.com/search?q=WP+Maintenance+Mode)を使えば簡単。

# 最後に

https://www.google.com/search?q=Retry-After+503+.htaccess
数日間に渡ってメンテナンス状態にする場合は検索エンジン対策が必要です。

https://qiita.com/search?q=503+.htaccess
もっと高度なことをやりたいならキーワードはこちら。時刻で制御する書き方などもあります。
【CentOS8】Varnish リッスンポートの設定ファイルが見つからないあなたへ

CentOS8でVarnishを建てたところ、Varnishのリッスンポートの設定ファイルが見つからなかった。

##公式チュートリアル
各設定ファイルの場所

__Debian/Ubuntu (legacy)__
　-> /etc/default/varnish

__Debian (v8+) / Ubuntu (v15.04+)__
　-> /etc/systemd/system/varnish.service.d/customexec.confにファイルを新規作成

__Red Hat Enterprise Linux / CentOS__
　-> /etc/sysconfig/varnish

ただ、私のCentOS8では「/etc/sysconfig/varnish」は見つからず、、

##見つけた場所

__/usr/lib/systemd/system/varnish.service__

ほかに似たようなことで困っている人がいないので、自分だけの事象かも？
【PHP】アクセス修飾子（public、protected、private）の違い

#はじめに
私は、少し前まで、`public`などのアクセス修飾子について、functionの前についている利用範囲を示すもの程度の認識しかなかったため、備忘録として残しておきます。

#アクセス修飾子
アクセス修飾子とは、クラス内のプロパティやメソッドをどの範囲まで利用することができるか（どこからアクセスできるのか）を定義するものです。
それでは、早速３つのアクセス修飾子の違いについて見ていきましょう。

# ①public

クラスの内外にかかわらず、__どこからでも__アクセスが許可されます。
※ アクセス修飾子をつけずに宣言したメソッドは、`public`が指定されたものとみなされます。

# ②protected

__クラス内__と__そのクラスを継承したクラス__からのアクセスが許可されます。

# ③private

__クラス内でのみ__アクセスが許可されます。
継承したクラスからもアクセスできません。

#おわりに
上記ような基本をしっかり頭に入れて、外部から変更されては困るようなプロパティは`private`を指定するなど、アクセス修飾子を適切に使いましょう。
Node.js で発生させた乱数で自動で音を鳴らす（Sonic Pi に OSC通信でデータを送信して音を出す）

今回の内容は、以下の記事の続きです。

●Sonic Pi による音の出力を Node.js のプログラム（osc.js を利用）から制御： OSC over UDP による通信 - Qiita
　https://qiita.com/youtoy/items/a158b847b142f0a134a6

この記事では、Node.js のプログラムでキーの押下を検知し、それに応じた OSC通信と音の出力を行っていました。
今回は「音の高さと音を鳴らすタイミング」をプログラムで発生させた乱数で決めて、音を奏でてみます。

## 構成
構成は[前回の記事の内容](　https://qiita.com/youtoy/items/a158b847b142f0a134a6
)と同じで、以下の通りです。
詳細については、これ以降についても[前回の記事の内容](　https://qiita.com/youtoy/items/a158b847b142f0a134a6
)を参照してください。

- 送信側
   - Node.js のプログラム
      - ライブラリ： osc.js
- 受信側
   - Sonic Pi

## プログラムの内容
### Sonic Pi側
Sonic Pi側のプログラムは、[前回の記事](　https://qiita.com/youtoy/items/a158b847b142f0a134a6
)で作ったものに、少しだけ手を加えています。
具体的には、同時に受けとる数値を 2つに増やし、その後に鳴らす音を指定する部分も 2つの音が同時に鳴るような形にしています。

```ruby
live_loop :trigger do
  use_real_time
  n1, n2 = sync "/osc*/trigger/synth"
  play n1
  play n2
end
```

### Node.js側
Node.js側のプログラムは以下のとおりです。

```javascript
const osc = require("osc");

var udpPort = new osc.UDPPort({
  localAddress: "0.0.0.0",
  remoteAddress: "0.0.0.0",
  remotePort: 4560,
  metadata: true,
});

udpPort.on("ready", function () {
  console.log("ready");
  setTimeout(sendValue, 500);
});

function sendValue() {
  const note1 = Math.floor(Math.random() * (100-60) + 60);
  const note2 = Math.floor(Math.random() * (100-60) + 60);
  const time = Math.floor(Math.random() * (800-100) + 100);

  udpPort.send({
    address: "/trigger/synth",
    args: [
      {
        type: "f",
        value: note1,
      },
      {
        type: "f",
        value: note2,
      },
    ],
  });
  console.log(`note: ${note1}, ${note2} / time: ${time}`);
  setTimeout(sendValue, time);
}

udpPort.open();
```

鳴らす音と、音を鳴らすタイミングの部分で乱数を使っています。
前者は「60 から 100」の値をとるようにし、後者については「100から800」の値をとるようにしました。

## 音が鳴っている様子
今回の内容を試した時の様子は、以下のとおりです。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Sonic Pi と Node.js のプログラムの連携（OSC通信を利用）の続き。<br><br>今度は、Node.js側で乱数を発生させて、その値を使って鳴らす音・音を鳴らすタイミングを決めるようなことをやってみました。<br><br>この話は、さらに手を加えたものを作っていきたい！ <a href="https://t.co/MAcgF4SFv3">pic.twitter.com/MAcgF4SFv3</a></p>&mdash; you (@youtoy) <a href="https://twitter.com/youtoy/status/1441061345319813124?ref_src=twsrc%5Etfw">September 23, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## おわりに
今回作った内容について、想定通りの挙動が確認できました。

今後は、Sonic Pi側の音を鳴らす処理を少し複雑なものにしてみたり、Node.js側で発生させる乱数を変えてみたり、またセンサー等で取得した連続値にしてみたり等といったことが試せればと思います。
乱数については、以下のものを試せると良さそうかな、と思っています。

●simplex-noise - npm
　https://www.npmjs.com/package/simplex-noise
SCRUM BOOT CAMP THE BOOKで勉強してみた

#【SCRUM BOOT CAMP THE BOOKで勉強してみた】

現在のチーム開発でスクラムを採用しています
スクラムを正しく理解することが最初の目標。
ただ本を読むだけではなく、内容を残します。

**参考**：[SCRUM BOOT CAMP THE BOOK](https://www.amazon.co.jp/SCRUM-BOOT-CAMP-BOOK-%E8%A5%BF%E6%9D%91/dp/4798129712)

## SCRUM BOOT CAMP THE BOOK
[アジャイル開発](https://qiita.com/haruki_u/items/1c62a4b1c67da152c91e)では「**事前にすべてを正確に予測し、計画することはできない**」という前提がある。
リスクの高いものを先に作り、そうでないものは後回しにすることで成果を最大化していく

- **スクラム**（アジャイル開発のやり方の1つ）
    - スクラムのルールを本当の意味で正しく理解する
    - 実際の開発を進めていくためのポイントを抑える
    - 自分のチームをよくしていくために取り入れられそうなものを考える

### プロダクトバックログ（機能や要求などプロダクトに必要なものを抽出し並び替える）
- 実現したいことをリストにして並び替える（優先度ではない）
- 常にメンテナンスすることを意識して、最新にしておく
    - 項目が追加、削除される
    - 項目の順番は定期的に見直す
- 上位項目の見積もりを済ませておく
    - 上位項目から開発する
    - 定期的に見直す

### 開発チーム（3人〜9人）
- 自己組織化
    - 基本的に外部から仕事の指示を受けない
    - 開発チームで主体的に仕事進める
    - それによって、開発チームの能力が底上げされていく

### スプリント（短く区切って繰り返す）
- 2週間で1スプリント（基本的に）
    - この決めた期間は固定する、変更してはいけない
    - 同じ期間で開発をし、開発のリズムをができる
    - 計画していた作業が残っていても終了する

### スプリントプランニング（何をどのように作るか計画を立てる）
- スプリントの冒頭で実施
    - 何を達成するかを決める
        - 過去の実績（ベロシティ）
        - 今回のスプリントで使える時間（キャパシティ）などを踏まえる
    - スプリントゴールが必要
        - 今回のスプリントの目標を簡潔にまとめる
        - **リファインメント**（作業項目を分割、見積もる）をおこなう
        - スプリントの10％以内にすることが一般的

- **プロダクトバックログ**項目をどうやって実現するか計画を立てる
    - 具体的な作業を洗い出す
    - 作業計画を立てる
    - プロダクトバックログと項目と作業の一覧を合わせて、**スプリントバックログ**という

- **スプリントバックログ**
    - 開発チームの作業計画
    - スプリント期間中も自由に作業の追加、削除が可能
    - 個々の作業は1日以内に終わるように分割するのが一般的

### インクリメント（スプリントごとに完成させていく）
- 開発チームは完成したインクリメントを作成
    - これまでのスプリントでの成果と今スプリントで完成したプロダクトバックログ項目を合わせたもの
    - リリースするかどうかに関係なく動作して検査可能にしておく

### デイリースクラム（毎日の状況を確認する）
- 開発チームのための会議
    - 毎日同じ時間、同じ場所に開発チームが集まる
    - スプリントバックログの残作業を確認
    - これまでの進捗状況でスプリントゴールを達成できるか。
    
- スプリントゴール達成のために共有すること。
    - 自分が昨日やったこと
    - 自分が今日やること
    - 自分が困っていること

### スプリントレビュー（出来上がったプロダクトを確認）
- スプリントの成果をレビュー
    - 事前に完成したもの、完成していないものを区別しておく
    - フィードバックを得て、プロダクトバックログを見直す
    - 全体の残作業、進捗をトラッキング
    - 今後の予定や見直しを共有
    - スプリントで完成しなかったものの説明
    - うまくいかなかったことや問題点、解決した場合はその方法を議論
    - プロダクトバックログに追加すべき項目の有無の議論
    - 開発を進めるうえでの問題となる事例についての議論
    - 現状の進捗をふまえて、リリース日や完了日を予測する

　→　これらの決定、議論した内容をもとに必要に応じて、プロダクトバックログに反映

### スプリントレトロスペクティブ（もっとうまくできるはず！）
- 次回以降のスプリントでもっとうまく進めるために改善を繰り返す
    - バグを直すだけでなく、バグが生まれるプロセスを直す
    - 人、関係、プロセス、ツールなどの観点でスプリントを検査
    - うまくいったこと、うまくいかず改善が必要なことを整理
    - 今後のアクションプランを作る
    - **一度にたくさんのことを変更しすぎないように意識する**

**仕事のやり方、進め方を常に精査して、より良いやり方に変え続けることが重要**

### プロダクトオーナー、スクラムマスター（縁の下の力持ち）については省略
※ まず自分を求められていることは開発メンバーとしての役割を果たすこと。

## スクラムチーム
**プロダクトオーナー**、**開発チーム**、**スクラムマスター**を合わせたもの。

### スクラム開発で良い結果、成果をあげるための5つの価値基準
これらの価値基準をふまえて、行動することでより良い成果を上げられる。

- 確約
    - それぞれの人がゴールの達成に全力を尽くすことに確約する
- 勇気
    - 正しいことをする勇気を持ち、困難な問題に取り組む
- 集中
    - 全員がスプリントでの作業やゴールの達成に集中する
- 公開
    - すべての仕事や問題を公開することに合意する
- 尊敬
    - お互いを能力ある個人として尊敬する

## おわりに

自分のなりに少し言葉を変えたところもあります。
誤りがありましたらご指摘くださいm(_ _)m

Web系企業でスクラムは常識。
あたりまえにこなし、チーム開発で成果をあげていきたい。
Unity Mirror を使ってサーバーをDedicatedServerで動かした際の、サーバー側でClientRPCを実行する方法

この内容、Unityもマルチプレイヤーゲーム開発も不慣れな状態で書いたので一般常識レベルだったらすんません…
調べても見つからなかったので…(´・ω・`)



## 概要

* Mirrorでマルチプレイヤーゲームを作る
* サーバーはHost ServerではなくDedicated Serverで作る
  * ここでいう Host Server / Dedicated Server については [UNETのここ](https://docs.unity3d.com/Manual/UNetClientServer.html) か [Mirrorのここ](https://mirror-networking.gitbook.io/docs/general#server-and-host) を参照
* このようなときに、サーバー側で `ClientRPC` を実行するにはどうするか？



## サーバー側で `ClientRPC` を実行する際の問題点

1. サーバー側では、 `NetworkClient.connection.identity.GetComponent<T>();` という手法は使えない
   1. Deicated Serverとして動かしてるから、クライアントなんてあるわけがない…
   2. クライアントがないから、 `ClientRPC` を実行できる `NetworkBehaviour` コンポーネントも工夫しないととってこれない
2. そもそも論として、  `ClientRPC` ってクライアント側じゃないと実行できない
   1. [ここ](https://mirror-networking.gitbook.io/docs/guides/communications/remote-actions#clientrpc-calls) に `ClientRpc calls are sent from objects on the server to objects on clients.` とあるように、クライアント上で実行する前提の仕組みだし。



## 実行方法

### 実行方法の概要

任意の有効なクライアントのコネクションは、

> サーバー側では `NetworkConnectionToClient` プロパティで、全クライアントのコネクションオブジェクトにアクセスできる

ということだから、

* `NetworkConnectionToClient` から、任意の有効なクライアントのコネクションを使って `NetworkBehaviour` をとってくればいい

という考えで実行する方法です。

### 実行例

※疑似コードなのでこのままでは使えません

`NetworkPlayer.cs`

```c#
using Mirror;
using UnityEngine;
using System;

public class NetworkPlayer : NetworkBehaviour
{
    [ClientRpc]
    public void RpcSayHello()
    {
        Debug.Log("Hello!");
    }
}
```

`GameMain.cs`

```C#
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Mirror;

public class GameMain : MonoBehaviour
{
    private void Update()
    {
        // なんでもいいので有効なネットワーククライアントを手に入れる
        foreach (KeyValuePair<int, NetworkConnectionToClient> kvp in NetworkServer.connections)
        {
            NetworkPlayer networkPlayer = kvp.Value.identity.GetComponent<NetworkPlayer>();
            networkPlayer.RpcSayHello();
            break;
        }
    }
}
```



## 備考

> このようなときに、サーバー側で `ClientRPC` を実行するにはどうするか？

「そもそも、そんな回りくどいことしないでメッセージングしろ」と言う場合は、 [この辺](https://mirror-networking.com/docs/api/Mirror.NetworkServer.html#Mirror_NetworkServer_SendToAll__1___0_System_Int32_System_Boolean_) をどうぞ。
[シリーズ] Python におけるデザインパターンの記録


## 概要

Python におけるデザインパターンの記録です.

|コンテンツ|個人的な使用頻度|個人的な感想|
|:--|:--|:--|
|[Factory Method (継承)の採用可否基準](https://qiita.com/robozushi10/items/66c71f342be3a6aa47cd)|<font color="blue">高</font>|ライブラリ(パッケージ)にも Factory Method を採用したものが多く、真似をしやすい.|
|[Strategy Pattern (移譲) の採用可否基準と実装例](https://qiita.com/robozushi10/items/a5fbc9dc9a6e5ba98ed3)|<font color="blue">高</font>|C/C++の関数ポインタの感覚で使っている.|
|[Factory (継承)と Strategy (移譲)の混合例](https://qiita.com/robozushi10/items/b963c585ec7609e569f6)|<font color="blue">高</font>|実践では Singleton に次いで使用頻度が高い.|
|[State Pattern の実践記録](https://qiita.com/robozushi10/items/9a89131b231ebd6f3843)|<font color="darkred">低</font>|複雑な分岐を求められるシステムで積極採用している. このとき「Transitions」パッケージの力を借りている.|
|[Template Method (継承)の採用可否基準](https://qiita.com/robozushi10/items/a7b1fd770ba6a5eeff5d)|<font color="green">中</font>|リファクタリングを行ったときに採用することが多い.<br/>新規設計で採用することは難しくてできない.|
|[Singleton の使用例](https://qiita.com/robozushi10/items/6763c2db325e51c923de)|<font color="blue">高</font>|DB を導入するほどでも無いシステムで使用することが多い.|
|[Observer Pattern の使用例](https://qiita.com/robozushi10/items/f169d85b8c8d3eff94db)|<font color="darkred">低</font>|組込みC++でログを収集するシステムで実践したことはあるが、Python では無い.|
|Facade|<font color="blue">高</font>|手抜きしやすいこともあり使用頻度が高い.<br/>C言語の ioctl() の API を作る感覚である.|
desktop app by python

# 開発環境
* Python3
* Anaconda3
* Git + Git Bash 
* Visual Studio Code(VSCODE)

```
$ cat .bashrc
export PATH=$PATH:$HOME/anaconda3/:$HOME/anaconda3/Scripts/
alias python="winpty python"
```

## layer pattern 1
* FG : node.js + vue.js
* BG : python + fastapi 
* DB : excel

## layer pattern 2

Docker + Anaconda3
* https://docs.microsoft.com/ja-jp/windows/wsl/install-win10
* https://python.kirikutitarou.com/2019/07/docker-anaconda.html

![pic01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133187/a6d6c743-1723-16fa-08f1-cd03fdc388d7.png)


```
$ docker volume create --name source
$ docker run --name anaconda3 -v source:/opt/source -v /c/database:/opt/database -it continuumio/anaconda3 /bin/bash
```

```
$ docker run --name anaconda3 -v /c/users/XXXX/home/dockermount:/root/workspace -it continuumio/anaconda3 /bin/bash
```

https://docs.microsoft.com/ja-jp/windows/wsl/install-win10#step-4---download-the-linux-kernel-update-package

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133187/c71686da-f80f-3641-8bdf-853ab6f77852.png)


```
$ git config --global user.name "GitHubに登録しているユーザー名"
$ git config --global user.email GitHubに登録しているメールアドレス
```


python実行環境としてどうやって配るか

pythonをいれてもらえばいい。
docker + spa

https://hub.docker.com/r/nikolaik/python-nodejs

```
# Pull from Docker Hub
$ docker pull nikolaik/python-nodejs:latest

# Build from GitHub
$ docker build -t python-nodejs github.com/nikolaik/docker-python-nodejs

# Run image
$ docker run --name python-nodejs2 -v /c/users/lynthey/home/dockermount:/root/dockermount -it python-nodejs /bin/bash
```

```
$ git config --global user.name yourname
$ git config --global user.email yourname@mail.com

```


spa

```
> cd frontend 
> npm run serve

> cd backend
> source env/bin/activate
> pipenv run start
```


myspa1

```
$ cd server
$ python3.9 -m venv env
$ source env/bin/activate
(env)$ pip install -r requirements.txt
(env)$ python app.py
Navigate to http://localhost:5000

Run the client-side Vue app in a different terminal window:

$ cd client
$ npm install
$ npm run serve
```
【Python】seleniumを使ってVPS上でスクレイピングする方法【selenium】

#概要

pythonを使ってVPS上でseleniumを使うときにハマったのでtipsをまとめる。

#selenium のインストール

```sh
conda install selenium 
```

#chrome, chromedriver のインストール

chromeのインストール

```sh
sudo apt-get install libappindicator1 fonts-liberation
sudo apt-get install xdg-utils libxss1
curl -O https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
sudo dpkg -i google-chrome-stable_current_amd64.deb
```

seleniumはchromedriverを使うので、ダウンロードしてきて、実行ファイルと同じディレクトリに配置する。

URL：ChromeDriver - WebDriver for Chrome
https://sites.google.com/a/chromium.org/chromedriver/downloads
↑上記の適するバージョンをダウンロードしてきて、同じディレクトリに配置。

#selenium を使って、Yahoo! 天気から大阪の天気をとってくる

```sh

#ヘッドレスの設定をするため、Optionsクラスのインポートを行う
from selenium.webdriver.chrome.options import Options

#変数optionsに格納するためOptionsのインスタンスを生成する。
options = Options()

#headlessの設定をTrueにする
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')

#webdriverを起動する
driver = webdriver.Chrome(options=options)

#URLを開く（下記はYahoo!天気）
driver.get("https://weather.yahoo.co.jp/weather/")

high = driver.find_elements_by_xpath('//*[@id="map"]/ul/li[8]/a/dl/dd/p[2]/em[1]')
low = driver.find_elements_by_xpath('//*[@id="map"]/ul/li[8]/a/dl/dd/p[2]/em[2]')

#大阪の最高気温
print(high[0].text)

#大阪の最低気温
print(low[0].text)

```

出力

```sh
'30'
'22'
```

#参考にしたサイト
さくらの VPS 上の Ubuntu で Headless Chrome を動かす
https://loumo.jp/archives/17035

【EC2】seleniumのwebdriverを実行する方法
https://qiita.com/shizen-shin/items/7028c3095686292e8084
BATファイルで3つの和を求めるサブルーチンを作る

# 空のBATファイルを作る

ファイル名　好きな名前.BAT を新規テキストファイルで作成

メモ帳（またはお好きなテキストエディタ）で開く

※おすすめ！mery を使用すると、色分けで編集できます。
meryのダウンロード先
https://www.haijin-boys.com/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8

  拡張子は .BAT で 日本語シフトJIS でセーブしてください（以下は mery 使用）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76087/a4bf74e3-eaf6-a23b-af3c-8cb10d1ca6bb.png)
メモ帳ならANSI

まず、日本語対応なファイルで空で保存してから、そこにコードを書き込んでいきます。（忘れる前の保険）

#実行結果　           
123+456+789　の和が表示されます

```
C:\Test>echo off
total = 1368  (123+456+789 の和です)
続行するには何かキーを押してください . . .
```




#コード


```bat

echo off
call :WA_ABC 123 456 789
echo total = %ret%  (123+456+789 の和です)
pause

EXIT

rem --------------------------------------------

goto :skip0
rem --------------------------------------------------
rem ３つの値の和を計算する 使い方 call :WA_ABC 数値引数
rem 戻り値 %ret% 
rem --------------------------------------------------
:WA_ABC
set /a ret=%1+%2+%3
EXIT/B
:skip0
```

# ちょっと説明


```bat
set /a ret=%1+%2+%3
```
和の計算をしています。  /a を無くして実行すると別の表示になります。
変数を指定する場合、いちいち<B> %ret% </B>という感じで <B>%</B> でくくります。
戻り値は正確にはエラーレベルを使った別の方法があるのですが、文字列を使ったりすると
別の場所で支障が出たりする可能性があるので、変数ret を使って行っています。

<B>goto skip0:</B> はコピペ用の保険です。なくても問題ありません。
文法忘れた～～、コピペして中身を変えよう、とかコピペで位置を間違えてフォールダウンで入ってしまうのを防ぐため。


あとは、コードを頭から丁寧に見ていけば、Qiitaの懸命賢明な読者の方たちなら理解できるかと思います。
CCNA　RIP

では、今回はRIP(Routing Information Protocol)について学習していきます。

まず、復習ですが、このRIPはベルマンフォード法というアルゴリズムを
使っているIGPの一種です。ルーティングテーブルの情報を常に更新する
ルーティングプロトコルになります。

これは有効なインターフェイスから30秒毎にルーティングテーブルの情報を更新します。
これをレギュラーアップデートと言います。
このアルゴリズムのベルマンフォード法ですが、受信情報が自身にない場合、
その情報を登録します。また、受信情報が自身にあり、送信元が同じだと
その情報で更新します。しかし、受信情報が自身にあり、送信元が異なり、
メトリックが小さい時、その情報で更新します。

では、RIPの特徴をまとめていきます。

・　様々なメーカーのルータで使用できます。
・　ディスタンスベクタ型です。
・　ルータにかかる負担が小さいです。
・　30秒毎に定期的に情報を交換します。
・　他のルーティングプロトコルよりもネットワークの負荷が大きいです。
なぜかと言うと、アップデートの内容がルーティングテーブル全体なので。
・　コンバージェンスが遅い
上記の理由から。
・メトリックはホップ数
・ルーティングループの可能性あり。

RIPのバージョン1はブロードキャストかつ、クラスフルで、
2はマルチキャストかつクラスレス。


**ルーティングループと無限ループ**

受信情報の送信元が同じなら登録情報を更新します。
これが引き起こすのがルーティングループと無限ループです。

どこかで障害が起きた時、あるルータは経路情報を破棄します。
しかし、別のルータから経路情報が送られてきて、
その経路情報が自身に無いことを確認するとその経路を登録します。
その経路情報を別のルータに送り、そのルータも経路情報を更新して、
また送ります。これが常に続く状態を無限カウントと言います。
この状態でパケットが送られるとルーティングループが起きます。
Macの環境構築について(Homebrewを使用したiTerm2,Oh My Zsh, Powerlevel10kなどについて)

##はじめに
今回は自分のmacの環境構築として、Homebrewをインストールした後
・iTerm2のインストール
・oh my zshを使用したzshのインストール
・zshのテーマとしてPowerlevel10kのインストール
以上の操作を行いました。

それらを導入した目的とそのインストール方法について説明していきたいと思います。
なお今回の導入については全てGUI（グラフィカルユーザーインターフェース）ではなく
CLI(コマンドラインインターフェース)によるターミナルを使用したものとなっております。

まずはHomebrewがどのようなものであるのかを知りたい方は
こちらの記事を参考にしてみてください。
バージョン管理システムとは

https://qiita.com/ryutake459/items/8fc750b9b00e770cac97

##iTerm2について
ここではiTerm2の必要性とそのインストール方法について解説していきます

###なぜiTerm2を使用する必要があるのか？
Macにはデフォルトのターミナルが既に存在している
→なぜわざわざiTerm2をインストールする必要があるのか？
→iTerm2はデフォルトのターミナルに比べ

・機能が充実
・細かい機能の調整(カスタマイズ)が可能
・デザイン性が高く(見た目がキレイ)、自分の好きなデザインに調整できる
・ショートカットのキーの割り当てを自分好みにできる

など様々な機能を自分好みに構築することができるのである。

###インストール方法
今回はデフォルトのターミナルからHomebrewを使用してインストールを行いました

```
$brew install iterm2
```
インストールに成功すると

```
🍺iterm2 was successfully installed!
```
と表示されます

成功したのかを実際に確認したい場合は

```
$ brew search iterm2　--cask
==> Exact match
iterm2
```
で確認することができます

##zshについて
シェルにはsh,csh,bashなど様々な種類のシェルが存在するが
Macではzshを使用することが可能
→そのため私もzshを使用することにしました

zshの特徴は充実した機能面にあります

###zshの特徴
その特徴として
・比較的新しいシェル
・bashなど他のシェルの機能を積極的に取り入れている
・独自の拡張機能が加えられている

など他のシェルに比べ機能面で優れている
→機能を使いこなすことで作業の効率化を図ることができる

###Oh My Zshの導入
私は汎用性の高さなどの観点からzshのフレームワークであるOh My Zshを導入しました。
導入方法についてはOh My ZshのREADME.mdを参考にしながら
Homebrewを使用して行いました。

https://github.com/ohmyzsh/ohmyzsh

それでは具体的な方法について説明していきます

####①zsh,curl,gitが導入されているかの確認
まずは現在使っているパソコンにzsh,curl,gitが導入されているかを確認します
確認方法と致しましては

```
$zsh --version
zsh 5.8
```
```
$curl --version
curl 7.64.
```
```
$git --version
git version 2.33.0
```
で確認を行い
このような表記が出てきたらすでに導入されている証です。

もし導入されていない場合は

```
$brew install 導入したいものの名前
```
で導入を行います

②インストール
今回はターミナル内にcurlが導入されているのでそれを用いた導入方法により行っていきたいと思います。

こちらのコードをターミナルに記述します

```
$sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
```

そうすることでインストールを行うことができます


###導入後について
導入後は自分の好みのプラグインやテーマをインストールして自分好みにカスタマイズすることができます。私はテーマとして速度性、柔軟性の観点からPowerlevel10kをインストールしました。


##Powerlevel10kについて
ここではPowerlevel10kについてお話ししていきたいと思います。
###Powerlevel10kとは
Zshには様々な機能を付与してくれるプラグインだけでなく、見た目を変えてくれるテーマという設定ファイル群が存在しています。(Zshが機能面で優れているという特徴が顕著に出ています)
その一つにPowerlevel10kがあります。
###Powerlevel10kの特徴
Powerlevel10kは処理のスピードや柔軟性などに重点を置いています。
なのでそれらの機能を求める方にはとてもお勧めです。

###Powerlevel10kの導入
こちらも導入方法についてはGitHub上でPowerlevel10kのREADME.mdを参考にしながら
Homebrewを使用して行いました。

https://github.com/romkatv/powerlevel10k

それでは説明していきたいと思います。

まずはターミナル上に以下のコードを記述します。

```
$brew install romkatv/powerlevel10k/powerlevel10k
$echo "source $(brew --prefix)/opt/powerlevel10k/powerlevel10k.zsh-theme" >>~/.zshrc
```
下のecho~は $(brew --prefix)/opt/powerlevel10k/powerlevel10k.zsh-theme"を
実行するコードを~/.zshrc(実行ファイル)を追記して下さいという意味を示します。

その後はあなた好みのデザインや機能性についてy/n(Yes or No)で質問されますので
実際に見ながらあなた好みに設定してみて下さい。

また詳しい詳細については上にあげたGitHubのREADMEに記載されておりますのでぜひ参考にしてみて下さい。
State Pattern の実践記録


|関連記事のトップページ|
|:--|
|[[シリーズ] Python におけるデザインパターンの記録](https://qiita.com/robozushi10/items/3c1c0d1b1fbf7b38a33b)|

## 概要

State Pattern (状態) の「採用可否の基準」と「実践例」を記す.
参考情報は下記書籍である.

|引用元情報|一言|
|:--|:--|
|[書籍 -- 独習デザインパターンC++](https://www.amazon.co.jp/独習デザインパターンC-株式会社テクノロジック・アート/dp/479811720X)||


## 採用の基準

ここは独断もしくは私の解釈です.

採用基準は次のどちらかを満すこと.
・**「状態」に応じて処理が異なること**
・**分岐フラグが複雑になりそうな見込み大であること**

言い換えると次である.
・**フラグ乱立回避のために State Pattern を採用する**


## 個人的感想

Python で State pattern を実現する場合は、サードパーティパッケージである
 「[Transitions](https://github.com/pytransitions/transitions)」を使用している.

次のように、Transitions の記事は @noca 様がまとめてくださっていて、
とても学習が進めやすかった. 

なお、Transitions の欠点は以下だと思う.

・学習コストがやや大きいこと[^1].
・他者が Transitions を知らない確率大なので、チーム開発では注意が必要.


|記事名|概要|
|:-----------------------------|:---------------------------|
|[Pythonで状態遷移(transitions)](https://qiita.com/noca/items/f7ffd4acc641a809ac67)|transitionsパッケージのチュートリアル|
|[Pythonの状態遷移パッケージ(transitions)を理解する【準備編】](https://qiita.com/noca/items/53c01ac5afb687a98db8)|transitionsパッケージのインストール<br>およびグラフ出力を実現するための設定方法|
|[Pythonの状態遷移パッケージ(transitions)を理解する【状態編1】](https://qiita.com/noca/items/dcdd149c6189098afa39)|状態の定義や各種設定などの詳細|
|[Pythonの状態遷移パッケージ(transitions)を理解する【状態編2】](https://qiita.com/noca/items/e7cd12179d37b2cb4675)|状態へのタグ付け、終端状態例外の詳細|
|[Pythonの状態遷移パッケージ(transitions)を理解する【状態編3】](https://qiita.com/noca/items/5479ef8a9f681e4385c6)|状態毎のクラスインスタンス生成、<br>状態タイムアウト設定、独自状態の定義|
|[Pythonの状態遷移パッケージ(transitions)を理解する【遷移編1】](https://qiita.com/noca/items/a132bb5e1ad4bf4eff6a)|ユーザ定義遷移やコールバック、<br>ガード判定等に関する詳細|
|[Pythonの状態遷移パッケージ(transitions)を理解する【遷移編2】](https://qiita.com/noca/items/1d887ad21ef0c66a4c58)|ユーザ定義外遷移に関する詳細|
|[Pythonの状態遷移パッケージ(transitions)を理解する【コールバック編1】](https://qiita.com/noca/items/6a809bd1527b8e667da0)|コールバックの種類や実施順序に関する詳細|
|[Pythonの状態遷移パッケージ(transitions)を理解する【コールバック編2】](https://qiita.com/noca/items/2db1ac853ee285d04c0b)|コールバックにデータを与える方法、<br>キューについての詳細|
|[Pythonの状態遷移パッケージ(transitions)を理解する【HSM編1】](https://qiita.com/noca/items/6c0870d8fa63095d6b96)|階層型ステートマシンの基本動作の紹介|



## Transitions の使用例

### その1

とある監視システムの状態遷移図である.
これを Transitions を使って実装した.
<font color="darkred">ただし、この規模であれば Transitions を使う必要は無いと思う (学習コストに見合わない)</font>

素直に状態を基準にして遷移させている.
なお、図の数値は遷移順を、数値に付与した「t」と「f」は
直前の状態での終了値 True と False を意味する.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246056/b6e8a059-2426-2a6a-73e3-e22c835341e2.png)


### その2

とある監視システムの状態遷移図.
これを Transitions を使って実装した.
<font color="blue">この規模になれば、Transitions の習得コストに見合う</font>

フラグが乱立しそうなことが目に見えていたので、
2台の Database (DB-A と DB-B) へのアクセス自体を状態とみなして
ステートマシンにした例である.

重要な点としては、**Transitions** は HSM と呼ばれる入れ子状にも対応していることである.

下図は HSM 構造になっていて、とても複雑な遷移だが、
Transitions を採用することでフラグが乱立することなく実装できた.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246056/3a833511-aab0-6c35-71cb-7b05d88e5b91.png)




以上.


[^1]: 私の場合は、同僚が Transitions を使った実装をしていて見本が存在していたが、それでもチュートリアルおよびnoca様の記事を完遂するまでに3日間(24h)要した
オフショア開発でよく直面した問題と対処法(解決するとは言ってない)

# 前置き　兼　注意事項
- **対処法と言っても「無理やり進捗進めるだけ」**です。毛髪と安眠と休日は犠牲になり続けます。
- オフショアの中でも惨いケースなので、もっとマトモなオフショアも居るとは思います。流石に。  
「マトモなオフショア」とお仕事できた経験はありません。
- **筆者がオフショア開発に関わった件数は両手で数え切れる程度です。**
- 「オフショアが引き起こした問題」ではなく「オフショア開発でよく直面した問題」です。  
なので、「オフショアがテスト結果改竄してやがったF○ck！」みたいなのはありましたが選外です。

# 本題
## 日本語通じない
通じるオフショアとだけ仕事できてる人は幸運とお上に感謝しましょう。割と通じません。

「全く通じない」まで行くのは少なく、オフショア側に翻訳要員が用意されてたりします。兼業の場合が多いけど。
ただ、エンジニア同士が直接話せないのでだいたい意思疎通失敗します。
バイリンガルなだけのプロデューサー職にエンジニア職の専門的な話は訳せません。事故ります。
「ここは荒野のウェスタンだ」になるくらいならともかく、大体「殺せ、ロシア人だ」になってゲームオーバーです。

### 対処法
意思疎通しようとせず、結果をそのまま渡しましょう。
例えばプルリクへの指摘なら、自然言語で頑張らず「こう直してください」とだけ書いて修正後のコードをまるっと書きましょう。

### 対処法2
英語をマスターしましょう。
日本語で会話しようというのが間違いです。相手は日本人ではありません。

## 英語通じない
通じるオフショアとだけ仕事できてる人は幸運とお上に感謝しましょう。割と通じません。

「全く通じない」まで行くのは少なく、オフショア側に翻訳要員が用意されてたりします。兼業の場合が多いけど。
ここまで日本語と同じ。まぁ、日本語に比べればまだ少しは話せる率上がります。
少しは話せると思っても結局「殺せ、ロシア人だ」になってゲームオーバーです。
流石にインドのオフショアなら公用語に英語入ってるしイケるべ！と思っていた時期が私にもありました。

### 対処法
意思疎通しようとせず、結果をそのまま渡しましょう。
例えば開発環境の構築なら、環境構築の手順書を渡すのではなく構築した環境そのものをまるっと渡しましょう。

### 対処法2
オフショアの母国語をマスターしましょう。
英語で会話しようというのが間違いです。相手はイギリス人でもアメリカ人でもありません。

## 出勤が遅い
時差です。インドだと3.5h日本とずれるんで、彼らが9:00に出社したなら日本はもう12:30です。
ベトナムなら2h、中国でも1hずれます。1h以上遅れてた気もしますが少なくとも1h分は時差です。

ついでにいうと「始業は定時前に準備し、終業は定時後」というジャパニーズトラディショナルスタイルは海外では通用しないので、彼らの稼働開始は始業時間から更に少し遅れたりします。文化の違いです。

### 対処法
3.5h残業すればインドの定時まで一緒に仕事できます。
時差出勤のようなシステムがある現場ならそれも一考の価値ありですが、その場合日本の同僚と時間がずれます。

## 自走させられない
当然ですが、現場のローカルルールや業務知識は教えなきゃ向こうは知りません。ドキュメント渡しましょう。

それはそれとして……
環境渡して、改修案件アサインして、1ヶ月してようやく出てきたプルリク見たらコードが酷すぎて指摘コメントが4桁の大台に到達したり。
例外がまるで対処されてなかったりstatic濫用してたり変数名が嘘だったりマジックナンバー祭だったり。
「納期的に今更直せないから、今度日本側で直して」とプロデューサーに言われる虚無感。その今度は数年は来ません。

### 対処法
自走させるという考えを捨てましょう。
毎日コードを確認すれば、少なくとも1ヶ月分の濃縮クソコードに絶望することはなくなります。

## そもそも全体的にスキル低くね？
スキルつよつよな人は日本人だって転職するやん？
新卒未経験並のが居るどころか、マジモンの新卒未経験くんが入ってたりします。いっちょ前にエンジニア一人分の単価で。
リーダブルコードなんて読んだことない。そもそもコード書いたことないのが来ることだって、ある……

### 対処法
自社の新人くんならペアプロとかで頑張れるんですが、他社の新人くんはどうにもなりません。他社は他社です。
どうにもならないので、レビュアーあたりの名目で1から10まで自分でコードをまるっと書きましょう。
そもそも、新人くんがいい子でやる気があったとしても貴方が面倒見るそのチケット中には成長も間に合わないでしょう。

# オチ
いまさら言うまでもないと思うけど、ここに書いてある対処法を実践するくらいなら最初からオフショア使わずにやったほうが普通に早いです。
というか、大体もう自分でやっちゃえって書いてあるだけです。
そんなことは現場にいる誰もが分かったまま、お上の命令でオフショア使用を強制されて爆発炎上する哀しさ。
TsukuCTF 2021 -  Login 100 

#問題

https://tsukuctf.sechack365.com/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/dbcc4ce8-06da-3ab7-3e53-1abfa0bf0759.png)


#解いてみた

問題のhttps://tsukuctf.sechack365.com/problems/login にアクセスしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/88339fbe-a901-cf74-642f-a2aee6f2188b.png)

適当にユーザとパスワードを入力してログインしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/216ef9be-3776-fd7a-23a1-90e7ca13f2ec.png)

成功するとここにフラグが出てきそうです。
戻ってソースを見てみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/c9632719-45e6-dda2-4021-d72d62c37a5c.png)

特に怪しい部分はなさそうです。
JSとかないなら単純にSQLインジェクションか？

passに「' OR 1=1 --」を入れてログインしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/9ac0afcb-f39d-d5b2-f194-d23ae5de2d3b.png)

特に何も変わりませんでした。
ユーザ名に入れてみても同じ結果でした。

SQLのコメントのつけ方についてネットで調べてみるとMySQLでは「#」もコメントとして使用できるようです。

MySQL 5.6 リファレンスマニュアル :: 9.6 コメントの構文
https://dev.mysql.com/doc/refman/5.6/ja/comments.html

passに「' OR 1=1 #」を入れてやってみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/eb46793c-0e9c-bc4c-8fe6-91f3b82f0536.png)

おお、ログインしました。
けどフラグはどこに？
ソースなどを見てもなかったので少し焦りましたが、トップページに戻ると書いてありました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/9ff8dbdc-2076-2195-9884-44f4251bffb7.png)
railsチュートリアル第6章 modelファイル

###modelファイル
Userモデルの作成によって```どのようにマイグレーションファイルが作成されるか```を見てきた。

usersテーブルを作成することで、development.sqlite3という名のファイルを更新し、id、name、email、created_at、updated_atを作成しました。

この節では、以後このモデル用ファイルを理解することに専念します。

app/models/ディレクトリにある、user.rbに書かれたUserモデルのコードを見てみましょう。
####生成されたばかりのUserモデル

```rb
class User < ApplicationRecord
end
```
```class User < ApplicationRecord```という構文で、Userクラスは```ApplicationRecord```を継承する
Userモデルは自動的に```ActiveRecord::Baseクラスのすべての機能を持つ```ことになります
ActiveRecord::Baseに含まれるメソッドなどについて```知らなければ何の役にも立ちません```

###演習
1.railsコンソールを開き、User.newでUserクラスのオブジェクトが生成されること、そしてそのオブジェクトがApplicationRecordを継承していることを確認してみてください

```rb
ubuntu:~/environment/sample_app (modeling-users) $ rails console
Running via Spring preloader in process 13587
Loading development environment (Rails 6.0.3)
>> user = User.new
   (0.4ms)  SELECT sqlite_version(*)
=> #<User id: nil, name: nil, email: nil, created_at: nil, updated_at: nil>
>> user.class
=> User(id: integer, name: string, email: string, created_at: datetime, updated_at: datetime)
>> user.class.superclass
=> ApplicationRecord(abstract)
```

2.ApplicationRecordがActiveRecord::Baseを継承していることについて確認してみてください。

```rb
ubuntu:~/environment/sample_app (modeling-users) $ rails console
Running via Spring preloader in process 13587
Loading development environment (Rails 6.0.3)
>> user = User.new
   (0.4ms)  SELECT sqlite_version(*)
=> #<User id: nil, name: nil, email: nil, created_at: nil, updated_at: nil>
>> user.class
=> User(id: integer, name: string, email: string, created_at: datetime, updated_at: datetime)
>> user.class.superclass
=> ApplicationRecord(abstract)
>> user.class.superclass.superclass
=> ActiveRecord::Base
```
継承していることを確認できた。
HomebrewでApacheをMacにインストール

Mac標準の Apache から Homebrew でインストールする Apache への設定方法を以下にまとめました。

## 環境
macOS Catalina

## 手順

【Apache が起動しているかを確認】(停止していれば何も出ない)

```
$ sudo launchctl list | grep httpd
```

【標準の Apache を停止】

```
$ sudo apachectl stop
```

【自動更新を停止】

```
$ sudo launchctl unload -w /System/Library/LaunchDaemons/org.apache.httpd.plist
```

【Apache が起動しているかを再度確認】

```
$ sudo launchctl list | grep httpd
```

【Apache を install 】(時間がかかる)

```
$ brew install httpd
```

【Xcode alone is not sufficient on Catalina. のエラーが出たら】(時間がかかる)

```
$ xcode-select --install
```

【Apache の起動＆自動設定】

```
$ sudo brew services start httpd
```

以上の手順で Apache をインストールすると
/usr/local/etc フォルダ以下に httpd フォルダができており、
ブラウザで localhost と入力して　It works!
と画面に出ればOKです。
Swiftでコードで作成したボタン（UIButton）を操作する方法　（応用例：ラジオボタン）

# 概要
Swiftのプロジェクトでボタンを動的に管理したいとき、UIButtonをStoryboardからではなく、コードで作成したいことがあると思います。
StoryboardからUIButtonを作成した場合はアウトレットで名前がついているので操作がしやすいのですが、コードで作成した場合は操作がしづらい場合があります。
本投稿では、コードから作成したUIButtonを操作する方法を一つご紹介します。

この方法が使えると、例えばラジオボタン（複数選択肢から一つだけを選択可能なボタン）をコードで実装することができます。

## 実行環境
- Apple Swift version 5.4
- Xcode 12.5

## 表示

![view.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1031614/dc46d937-8b7a-d976-c180-932865b66f38.gif)


# 方法

クラスの変数にUIButtonの配列を持たせておき、番号でアクセスする。

以下のコードをPlaygroundに貼り付けると動きます。

## コード
### 第一段階

コードで複数のボタンを作成する。

```swift:MyPlayground.playground
import UIKit
import XCPlayground
import PlaygroundSupport

class ViewController: UIViewController{
    
    @objc func tap(_ sender:UIButton) {
        print("\(sender.tag)番目がタップされた")
        sender.isSelected = !sender.isSelected
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.frame = CGRect(x: 0, y: 0, width: 375, height: 667)
        
        for i in 0..<5 {
            let button = UIButton()
            button.setTitle("ボタン"+String(i), for: .normal)
            button.setTitleColor(.systemBlue, for: .normal)
            button.setTitleColor(.systemGreen, for: .selected)
            button.frame = CGRect(x:0, y:100 + 30 * i, width:370, height:30)
            button.addTarget(self, action: #selector(ViewController.tap), for: .touchUpInside)
            button.tag = i
            self.view.addSubview(button)
        }
    }
}

PlaygroundPage.current.liveView = ViewController()
```

### 第二段階

ボタンを保持する配列を定義することで後から操作できるようにしていきます。

```swift:MyPlayground.playground
import UIKit
import XCPlayground
import PlaygroundSupport

class ViewController: UIViewController{
    
    var buttons = [UIButton()] // 追加
    
    @objc func tap(_ sender:UIButton) {
        print("\(sender.tag)番目がタップされた")
        if !sender.isSelected {
            buttons.forEach({element in element.isSelected = false})
        }
        sender.isSelected = !sender.isSelected
        // isSelectedがFalseのボタンを選ぶ場合はすべてのボタンを解除してから選択したボタンのisSelectedをTrueにして、
        // Tureのボタンを選んだ場合は単に選択をisSelectedをFalseにする
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.frame = CGRect(x: 0, y: 0, width: 375, height: 667)
        
        for i in 0..<5 {
            let button = UIButton()
            button.setTitle("ボタン"+String(i), for: .normal)
            button.setTitleColor(.systemBlue, for: .normal)
            button.setTitleColor(.systemGreen, for: .selected)
            button.frame = CGRect(x:0, y:100 + 30 * i, width:370, height:30)
            button.addTarget(self, action: #selector(ViewController.tap), for: .touchUpInside)
            button.tag = i
            self.view.addSubview(button)
            self.buttons.append(button) // 追加
        }
    }
}

PlaygroundPage.current.liveView = ViewController()
```
最近流行りのLightGBMとは




#1. LightGBMとは

QiitaやYoutubeとかでAI関係の学習をしていると、LightGBMがすごいというのが結構出てくるので、この機に学習してKaggleで使ってみたい。Kagglerの上位の人達が使っていて最近流行りのアルゴリズムであるらしい。
LightGBMは、Microsoftの人が開発した分散型勾配ブースティングフレームワークである。

基本的には、決定木の流れを組む分類問題を解くためのアルゴリズムであるらしい。



#2. 分類問題を解く各種手法

LightGBMは、決定木の流れを組むアルゴリズムであるという事は、決定木から整理しなおすと分かりやすそうである。
大昔には、分類問題を解くアルゴリズムとして、決定木があった。その後、分類性能を向上させるためのアンサンブル学習として、ランダムフォレストや、XGBoost、LightGBM、CatBoostなどが登場してきた。


![分類問題アルゴリズム.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/a4726ca7-3b19-5c15-a80e-f1e19b9d7846.png)



#2.1 決定木

決定木とは、上から条件分岐をしていって、最後に結論を得る分類問題を解く手法である。

<font color="Blue">メリット　：結果導出過程の説明が簡単であるという点。</font>
<font color="Red">デメリット：判断が雑、性能が低い</font>

![決定木.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/aa77b249-a79c-c90a-0921-d7b2848afe5f.png)

#2.2 アンサンブル学習

アンサンブル学習は、決定木のように性能の低い弱学習機を組み合わせて実行することで、性能の高いモデルを作っていく学習方法のことである。この組み合わせ方が、3種類ほどある。

1. バギング
1. ブースティング
1. スタッキング

# 2.2.1 ランダムフォレスト（バギング）

決定木は条件判断が雑なため、性能が低い。いわば意見の偏った普通の人であり、なんでも出来る天才ではない。
なら、普通の人をたくさん集めて意見を聞いて多数決をとろうというのが、バギングである。ランダムフォレストはバギングの代表手法である。

<font color="Blue">メリット　：決定木より性能Up</font>
<font color="Red">デメリット：ただの多数決なので、信頼できる人と、適当な人の結果が同等に扱われる</font>

![バギング.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/c5212d81-6a75-343b-5fab-c27c5175af8f.png)


# 2.2.2 ブースティング

ブースティングは、ランダムフォレストのような並列実行ではなく、学習機を直列接続し、前段で間違えた結果を重点的に次段で学習し、分類精度を高めていく手法である。初期のブースティング手法としては、AdaBoostが有名である。その後に有名になったのが、勾配降下法を使う勾配ブースティングである。



**勾配ブースティング（LightGBM)**

ランダムフォレストの多数決で決める際の問題を解決するのが、勾配ブースティング手法である。
ランダムフォレストの際には、男なのか女なのかの結果だけが、各学習機から出てきて、多数決を取っていた。ここに、どれだけその結果の精度が高いかの点数を付けて結果出力する。これを見て、合議制で結果を決める。
なお、この点数を決める際に、勾配を利用している。

この勾配ブースティング手法で、今はやっているのがLightGBM。


<font color="Blue">メリット　：合議制による性能Up</font>
<font color="Red">デメリット：ー</font>

![勾配ブースティング.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/41731279-5832-bb25-94f2-a60f4b9c8859.png)