OmniAICreator/Qiita-1.07M huggingface dataset:
Dockerfileでapt-get updateやapt-get upgradeを実行するとエラーになる

## 実行環境

・ホストOS: Windows10 Home 2004
・ゲストOS: WSL2 Ubuntu20.04
・docker ver20.10.3

## エラー内容
```dockerfile
FROM python:latest

RUN mkdir /code
WORKDIR /code

RUN apt-get update && apt-get  upgrade\
    apt-get install -y vim

COPY requirements.txt /tmp/
RUN pip install --upgrade pip \
    pip install -r /tmp/requirements.txt
```

上のようなDockerfileをビルドしようとしたところ、次のようなエラーが発生した

```
E: Unable to locate package apt-get
E: Unable to locate package install
```


## 解消方法

・apt-get upgradeを削除する
・apt-getをaptに書き換える
この二箇所の変更でエラーが発生しなくなった。

```dockerfile
FROM python:latest

RUN mkdir /code
WORKDIR /code

RUN apt update && apt install -y vim

COPY requirements.txt /tmp/
RUN pip install --upgrade pip \
    pip install -r /tmp/requirements.txt
```

理由は今のところ分からないので、後で調べて追記します。
バッチ要件確認項目

バッチが必要になったときに、確認、考察して最低限埋めるべき項目。


|項目 |備考|
|---|---|---|
|バッチの必要性・緊急度|代替手段、本当に必要か検討されているか？|
|重要度  |高・中・低・理由|
|既存の仕組みとの重複|既存バッチと共通化、新規で用意する必要性|
|関連部署 |ステークホルダー|
|リリース日|YYYY/MM/DD|
|開発期間|YYYY/MM/DD - YYYY/MM/DD|
|テスト・テストデータ準備期間（開発・本番）|開発 YYYY/MM/DD 本番 YYYY/MM/DD |
|ユーザテスト・受入期間| YYYY/MM/DD - YYYY/MM/DD|
|業務シナリオ|データ項目単位での使用目的|
|業務要件|xxデータが取得できること等|
|セキュリティ要件|個人情報、機密情報|
|性能要件|ディスク容量（x日分）、仮想CPU数、メモリ|
|オペレーション|通常時、例外時、緊急時|
|システム対象スコープ|xxシステム内データが範囲等|
|アーキテクチャ|アーキテクチャ図、構成、連携システム、対抗システム|
|トリガー|起動基準、日時、実行順番|
|実行時間|時分、日、月|
|想定処理時間|xxx分|
|想定処理件数|xxxx件|
|エラー時通知方法と対応|メール、slack etc 、リトライする、しない、リトライ間隔|
|監視・検知|検知方法、取得方法|
|INデータ|xxxシステムデータ　サイズ、件数、取得方式、成約、担当チーム|
|OUTデータ|xxxシステムデータ、サイズ、件数、保存先、保存期間、パージ手段|
|ログ|実行、終了ログ|
Rubyで言語ネゴシエーション

世の中には多くの言語、方言、書記体系がある。幸い、[BCP 47](https://tools.ietf.org/html/bcp47) 仕様には、それらを識別するためのタグが用意されており、[`Accept-Language` ヘッダー](https://tools.ietf.org/html/rfc2616#section-14.4) を使用すると、ユーザーは自分が好む言語を一覧で提示できる。

たとえば、日本語を母国語とする人は、ブラウザを次の値に設定できる：

```http
Accept-Language: ja
```

関西弁を好むなら：

```http
Accept-Language: ja-KS, ja;q=0.9
```

それらが表示できない場合、ユーザーはタイ語ならわかるとする。ただしタイ字は読めないのでローマ字が必要という場合：

```http
Accept-Language: ja-KS, ja;q=0.9, th-Latn;q=0.8
```

最後に、フランス語とドイツ語はわからないので、必要に応じて別の言語にフォールバックして欲しい場合：

```http
Accept-Language: ja-KS, ja;q=0.9, th-Latn;q=0.8, *;q=0.1, fr;q=0, de;q=0
```

Rubyには、そのための`accept_language`がある：

* [コード](https://github.com/cyril/accept_language.rb)
* [ジェム](https://rubygems.org/gems/accept_language)

日本語(`:ja`)と韓国語(`:ko`)に翻訳できるサーバーの場合、`accept_language`を使えばユーザーが好む言語一覧との共通部分を見つけることができる。これによりサーバーはユーザーのために日本語を選択できる：

```ruby
AcceptLanguage.parse("ja-KS, ja;q=0.9, th-Latn;q=0.8, *;q=0.1, fr;q=0, de;q=0").match(:ko, :ja) # => :ja
```

Railsアプリでは、以下のようになる：

```ruby
# app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  before_action :best_locale_from_request!

  def best_locale_from_request!
    I18n.locale = best_locale_from_request
  end

  def best_locale_from_request
    return I18n.default_locale unless request.headers.key?("HTTP_ACCEPT_LANGUAGE")

    string = request.headers.fetch("HTTP_ACCEPT_LANGUAGE")
    locale = AcceptLanguage.parse(string).match(*I18n.available_locales)

    # サーバーが一致する言語を何も提供できない場合は、
    # 理論的には 406 (Not Acceptable) エラーコードを送り返すことができます。
    # しかし、ユーザーの使い勝手をより良くするため、これはほとんど行われておらず、
    # このような場合には一般に Accept-Language ヘッダーを無視するという方法が採られます。
    return I18n.default_locale if locale.nil?

    locale
  end
end
```

Rubyで、言語ネゴシエーションの処理を楽しもう！🌐
Docker Machineのインストールができない

#Docker Machineとは
Docker MachineはDocker Engineを搭載した仮想マシンの作成、起動、停止、再起動などをコマンドを使って管理できるツールです。

参考：[Docker Machineの概要](https://docs.docker.jp/machine/overview.html)
#permission deniedというエラーの解決方法
Docker Machineは[こちら](https://github.com/docker/machine/releases/)に則ってインストールします。
インストールした際に以下のエラーが出てしまう場合があります。
```permission denied https://github.com/docker/machine/releases/
```
これは、実行ユーザーにアクセス権限がないというエラーです。
解決方法としては、```sudo -i```でスーパーユーザーにログインして、Docker Machineをインストールすれば解決できます。

参考：[permission deniedのエラーの際の解決方法](https://stackoverflow.com/questions/38433037/permission-denied-while-installing-docker-machine-in-ubuntu/39067036)
#最後に
permissionについて非常に参考になる記事がありましたので、リンクを貼っておきます。
参考：[permission deniedで悩まされたので勉強してみた](https://qiita.com/takuyanin/items/18590600d077df707923)
LineRenderer 上を動くオブジェクトを作る

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/637929d5-9d50-5c27-21c4-8464f6afbfd7.png)
[動画](https://youtu.be/qnIAFggi_ek)

単にLineの頂点を移動するだけでは移動速度が頂点位置のばらつきに依存してしまうので、Line上を等速で滑らかに移動できるようにします。
LineRenderer上を動かしたいオブジェクトに下記のスクリプトをアタッチすると、オブジェクトがライン上を移動します。

```
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MoveOnLine : MonoBehaviour
{
    [SerializeField] LineRenderer m_line=null;
    [SerializeField,Tooltip("速度[m/sec]")] float m_speed = 0.1f;
    [SerializeField,Tooltip("ライン上を動くObject")] Transform m_targetTr = null;
    int m_linePtr;
    float[] m_costArr;
    float m_remain;

    // Start is called before the first frame update
    void Start()
    {
        if (m_targetTr == null)
        {
            m_targetTr = transform;
        }
        init();
    }

    // Update is called once per frame
    void Update()
    {
        float delta = m_speed * Time.deltaTime;
        while (delta > 0f)
        {
            if (m_remain > delta)
            {
                m_remain -= delta;
                delta = 0f;
                break;
            }
            else
            {
                delta -= m_remain;
                m_linePtr = (m_linePtr + 1) % m_line.positionCount;
                m_remain = m_costArr[m_linePtr];
            }
        }
        Vector3 basePos = m_line.GetPosition(m_linePtr);
        if (m_remain > 0f)
        {
            float rate = 1f- m_remain / m_costArr[m_linePtr];
            basePos += (m_line.GetPosition((m_linePtr + 1) % m_line.positionCount) - basePos) * rate;
        }
        if (!m_line.useWorldSpace)
        {
            basePos = m_line.transform.position + Vector3.Scale(m_line.transform.rotation * basePos, m_line.transform.lossyScale);
        }
        m_targetTr.position = basePos;
    }

    private void init()
    {
        m_costArr = new float[m_line.positionCount];
        Vector3 pos = m_line.GetPosition(0);
        for (int i = 0; i < m_line.positionCount; ++i)
        {
            Vector3 nextPos = m_line.GetPosition((i + 1)% m_line.positionCount);
            m_costArr[i] = (nextPos - pos).magnitude;
            pos = nextPos;
        }
        if (!m_line.loop)
        {
            m_costArr[m_line.positionCount - 1] = 0f;
        }
        m_linePtr = 0;
        m_remain = m_costArr[0];
    }
}
```
Laravelアプリが接続拒否された時



```
[vagrant@local-docker docker-laravel]$ docker-compose build
ERROR: Couldn’t connect to Docker daemon at http+docker://localhost - is it running?
```

というエラーが出ました。
解決方法を調べ、

```
[vagrant@local-docker docker-laravel]$ sudo usermod -aG docker $USER
```

を実行しましたが、

```
[vagrant@local-docker docker-laravel]$ sudo chmod +x /usr/local/bin/docker-compose
chmod: `/usr/local/bin/docker-compose’ にアクセスできません: そのようなファイルやディレクトリはありません
と出て上手くいかなかったので別の方法である
```

と出てきました。

```
[vagrant@local-docker docker-laravel]$ sudo systemctl start docker
```

というコマンドを打ったところ、docker-compose up -dまでうまく動かすことが出来ましたが192.168.33.11に接続しようとしても

このサイトにアクセスできません
192.168.33.11 で接続が拒否されました。次をお試しください
接続を確認する
プロキシとファイアウォールを確認する
ERR_CONNECTION_REFUSED

と出てきて、Laravelアプリがうまく表示されません。
この時の解決方法を以下に、簡潔に記します。


1. docker-compose down
2. vagrant halt
3. vagrant up 
4. vagrant ssh
5. docker-compose build

```
ERROR: Couldn’t connect to Docker daemon at http+docker://localhost - is it running?
```

というエラーが出るので、順に

```
sudo groupadd docker
sudo gpasswd -a $USER docker
sudo systemctl restart docker
```

```
exit
```

```
docker-compose build
docker-compose up -d
```

192.168.33.11にアクセス。phpMyAdminでデータベースを構築してから、docker-compose exec web bashでwebコンテナに入ってマイグレーションの実行。で、アプリが再度表示されるようになりました。
[SwiftUI]@Stateとは

#@Stateの役割
・selfのプロパティを変更できるようにする
→ SwiftUIでのViewはstructであり保持するプロパティを変更することができないが、@stateを付与することで変更可能に
・そもそも@StateとはPropertyWrapperである
↓
PropertyWrapperとは？

```
プロパティラッパーとは、プロパティの値の保存方法や計算方法をプロパティラッパーとして定義し、同じ方法を適用できるプロパティを、そのプロパティラッパーでラップすることで開発の効率化を図るというもの

https://rakusui.org/swift_property_wrapper/

```
レスポンシブイメージ

ファイルの重さはほぼ画像が占めているのだとか。
その画像を、ユーザーの画面幅やデバイスの解像度に沿って最適になるよう設定しておくことで、できるだけ軽いwebサイトにすることができます！

### この記事について
レスポンシブイメージでの、３つの方法をまとめます。
最初にhtmlのimageタグに書くレスポンシブイメージの説明をして、最後にbackgroundイメージのレスポンシブイメージ対応について記載します。


### レスポンシブイメージの３つの方法

１、density switching　　（density...密度）
2、art direction
3、resolution switching　　（resolution...解像度）


### 1, density switching
一番シンプルな方法です。
低解像度ディスプレイか、高解像度ディスプレイ(retina displayなど）かによって画像を出し分けます。
下記のように記載すると自動的に低解像度か高解像度かを判断して出し分けてくれます。

```html:density-switching.html
<img srcset="img/logo-1x.png 1x, img/logo-2x.png 2x">
```
1xは低解像度、2xは高解像度で、1xの二倍サイズの画像を用意しておくと良いです。

### 2, art direction
全く異なる画像を出し分けたいときに使用します。

```html:art-direction.html
 <picture class="footer__logo">
     <source media="(max-width: 37.5em)" srcset="img/logo-small-1x.png 1x, img/logo-small-2x.png 2x">
     <img srcset="img/logo-1x.png 1x, img/logo-2x.png 2x">
</picture>
```

pictureタグで、sourceタグとimgタグを囲います。
sourceタグのメディアクエリで、max-width: 37.5em以下(600px以下)なら、sourceタグのsrcsetが適用されます。
上記に当てはまらない場合(601px以上)はimgタグが適用されます。

## 3, resolution switching
そもそもブラウザが理解できる情報は、現在のビューポートとpixel density(1xか2xかなど)です。
その情報にプラスして、画像の横幅や何％を画像が占めるかを書いてあげると、ブラウザがその情報に従って画像を出し分けてくれます。

srcset...画像のパスと幅を記載します。下記の例では横幅300pxと1000pxの画像を用意しています
size...ビューポートが◯pxの時は、横幅100%に対して◯%を画像が占めているという意味のコードを書きます。大体の％でOKです


```html:resolution-switching.html
<img srcset="img/photo.jpg 300w, img/photo-large.jpg 1000w" 
     size="(max-width: 900px) 22vw, (max-width: 400px) 30vw" 
     src="img/photo-large.jpg">
```

## TIPS
昔のブラウザーではsrcsetを読み込まなかったりするので、全てsrcも追加しておくと良いです。
```<img srcset="img/logo-1x.png 1x, img/logo-2x.png 2x　src="img/logo-2x.png">```




## backgroundイメージ
メディアクエリで書きます。
下記は、大きい画像(横幅2000px)と小さい画像(横幅1200px)の二つ用意したと想定して、
retinaディスプレイスクリーンかつ600px以上、または2000px以上の時に大きな画像が当たるように書いています。

メディアクエリでは、min-widthなどと同じようにresolution(解像度)も指定できます。
ただ、safariではmin/max-resolutionがサポートされていないので、``(-webkit-min-device-pixel-ratio: 2)``のようにプレフィックスを書きます。
（192dpiは、retinaディスプレイスクリーンという意味）

``,``で繋ぐとORと同じ意味になります。


```css:density-switching.css
@media (min-resolution: 192dpi) and (min-width: 600px),
       (-webkit-min-device-pixel-ratio: 2) and (min-width: 37.5em),
       (min-width: 2000px) {
          background-image: url(../img/hero.jpg);
        }
```
Qiita質問フォーマットの素晴らしさ


## Qiitaの質問フォーマットの素晴らしさを痛感したため、書き残させて頂きます!

こんにちは、koheiです。

Qiitaで質問をしようとして、改めて質問フォーマットはよくできているなと感じました。
その理由は
### 自己解決に導かれる
ためです。
そのきっかけになる部分は該当するソースコードをまとめた後に登場するこれです。

___
### 自分で試したこと
ここに問題・エラーに対して試したことを記載してください。
___

該当するであろうソースコードを記載した後、ここで自分の検証した内容をまとめていると
**本当にこれで質問して大丈夫？**
**予想以上にしょうもない失敗だとしたらどうしよう**
と改めて自分の置かれている状況を見直すことができます。

直前にソースコードをまとめていることもあり、問題の棚卸しができるので
### 初学者こそ質問フォーマットを活用して素早く問題解決を目指すべき
だと感じました。

自分は某プログラミングスクールに通っていたのですが、
メンターに相談するために「質問フォーマット」が定められていて
その時も質問を作成することで頭の中が整理されて、質問することなく解決するということが多々ありました。

もちろん初学者だからこそのケアレスミス、思い込みなどが原因で大した問題ではないことが多いことが理由とも思いますが、
毎回勉強になることが多いため、今後も質問フォーマットを活用しながら学習を進めていきたいと思います。

___
ちなみに、今回作りかけていた質問は以下のような内容でした

### 解決したいこと
テスト時の
ActiveModel::RangeError:

Ruby on RailsでWebアプリを作成しています。
サインアップに関するテストコードを作成時に以下のエラーが出てしまいました。

解決方法を教えて下さると幸いです。

※はじめ、自身ではUTF-8の対応範囲が1~４バイトであることに対して、日本語入力が引っかかっていると思っていました。
エラー文にしっかりと
16697386183 is out of range for ActiveModel::Type::Integer with limit 4 bytes
と書かれているにも関わらず、、





### 発生していた問題・エラー
```ruby
     Failure/Error: @buyer.save
     
     ActiveModel::RangeError:
       16697386183 is out of range for ActiveModel::Type::Integer with limit 4 bytes
     # ./spec/models/buyer_spec.rb:30:in `block (4 levels) in <top (required)>'
```
実際は電話番号をinteger型で受けようとして、
かつ１１文字のランダムな数字でテストしたために起こったエラーでした。



### 該当するソースコード
```ruby
モデル内のバリデーション
  with_options presence: true do
　　　略
    validates :phone_number,      numericality: { only_integer: true }, length: { maximum: 11 }
　　　略
  end
```

```ruby
ファクトリーボットで生成するインスタンス
FactoryBot.define do
  factory :buyer do
　　略
    phone_number          {Faker::Number.number(digits: 11)}
　　略
  end
end
```

```ruby
上記より生成されたインスタンス（例）
[1] pry(main)> @buyer = FactoryBot.build(:buyer)
   (0.4ms)  SET NAMES utf8,  @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'),  @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483
=> #<Buyer id: nil, email: "clemente.marvin@yahoo.com", phone_number: 69012459013, 
略
```

### 自分で試したこと
~~カタカナでバリデーションをかけている箇所以外を全てローマ字で入力し再度テストしました。~~
~~漢字がなくなれば~~　、、、ここで思い止まりました。笑

その後、検証を進める内に
- 電話番号はstring型で受けるべきこと
- integer型は初めの"0"は認識されないことなど思い出しました。
また、今回エラーに引っかかった4バイト以内のintegerについて調べると
-2147483648から+2147483647
が対象であることも分かり、2147483648は同じエラーに引っかかることも検証できました。
[Oracle Integration] エージェント・グループの作成

## エージェント・グループの作成

1. 「統合」 -> 「エージェント」 -> 「エージェント・グループの作成」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260307/fe9995a5-a9cb-3a1b-14ba-b876cf6b622a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260307/09b04349-f81a-a825-42ab-88e1e4324bab.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260307/824b91d8-7092-2f12-d9b0-debe591d5deb.png)

1. 必要な情報を入力し、「作成」ボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260307/c56b1c15-f19f-8895-d2bc-7f6db5802332.png)
  * 名前：エージェント・グループの名前、変更可能。
  * 識別子：システム的に一意であり、変更不可。名前を入力しているときに自動入力されます。
  * 説明：エージェント・グループの説明、エージェント画面で名前の下に表示されます。

## 参考情報

* [Create an Agent Group](https://docs.oracle.com/en/cloud/paas/integration-cloud/integrations-user/creating-agent-group.html)
Laravelを調べる：Controller/View追加編

# Laravelを調べる：Controller/View追加編


## 環境


|Name           |Version                     |
|---------------|----------------------------|
|OS             |macOS Catalina (ver 10.15.7)|
|docker desktop | version 3.2.2              |

環境構築はこちら↓

https://qiita.com/takeohman/items/2233a3d7f7a627cb8ed5


## Controllerの追加

Controllerの追加には以下のコマンドを実行します。

```bash
$ php artisan make:controller HogeController
```

実行すると、ディレクトリ: `./app/Http/Controllers` に `HogeController.php`が出力されました。
試しに、`index()` メソッドを追加してみます。

```php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class HogeController extends Controller
{
    // ↓ を追加!
    public function index(){
      return "Fuga Fuga!!";
    }
}
```


### ルーティングの追加(1)

`routes/web.php` に追加したコントローラを呼び出す行を追加する。


```php
<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\HogeController;

Route::get('/', function () {
    return view('welcome');
});
Route::get('hoge', [HogeController::class, 'index']);
```


### 動作確認(1)

ブラウザで

`http://localhost/hoge`

を開くとControllerで出力している文字列: `Fuga Fuga!!` が表示される。



## Viewの追加

class HogeController にview() メソッドを追加する。

```php
    
    public function view(){
      $data = [
        'msg1' => 'Hoge!',
        'msg2' => 'Fuga...'
      ];
      # view(path, args)
      return view('hoge', $data);
    }
}
```

### ルーティングの追加(2)

`./routes/web.php` に再度ルーティングを追加します。

```
Route::get('hoge', [HogeController::class, 'view']);
```

### テンプレートファイルの追加

ディレクトリ: `resources/views/` にテンプレートファイル: `hoge.blade.php` を追加する。


```html
<!DOCTYPE html>
<html>
  <head>
  <meta charset="utf-8" />
  <title>test</title>
  </head>
  <body>
    {{$msg1}}, {{$msg2}}
  </body>
</html>
```

### 動作確認(2)

ブラウザで`http://localhost/hoge` にアクセスすると、`Hoge!, Fuga...` が表示される。
Rのmlbenchライブラリで、機械学習ベンチマーク用のサンプルデータをサクッと作る

# はじめに
Pythonだと[scikit-learn datasetsライブラリ](https://scikit-learn.org/stable/modules/classes.html?highlight=dataset#module-sklearn.datasets)には、さまざまな評価用のデータをサクッと作れるsample generatorがあります。
Rでも同じようなデータ生成用のライブラリがないかを探したら、mlbenchというライブラリがあったので使ってみました。

# Rのmlbenchライブラリについて
[mlbench](https://cran.r-project.org/web/packages/mlbench/index.html)では、よく使われる実際のデータセットと人工データ生成用のライブラリが格納されています。
[マニュアル](https://cran.r-project.org/web/packages/mlbench/mlbench.pdf)記載の「mlbench.〇〇」と言う名称の関数は、人工データ生成ライブラリで、そうでないものはよく見る実際のデータセットです。

「mlbench.〇〇」で作ったオブジェクトは、通常のplot関数で可視化もできますが、指定が若干面倒です。
この面倒さの解消のために、mlbenchオブジェクト用のplot関数も用意されており、簡単に可視化が可能です。
実際にちょっと使ってみます。

# mlbenchで色々なデータを作ってみる。

## spiralデータ
```{r}
library(mlbench)
#spiralsで非線形境界を持つ1000個のデータの作成
spirals <- mlbench.spirals(1000, sd=0.1, cycles=1)
plot(spirals$x, col=spirals$classes) # 普通のplot関数だと、こんな感じで指定が必要だが。。
plot(spirals) # mlbenchオブジェクト用のplot関数が用意されているので、これだけで同じように可視化が可能。
```
2つplot関数を呼び出していますが、同じようにplot図が出ますので、下のように使うのが楽かと思います。
![000013.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187459/891f4f74-7d0e-ced0-cfaa-b5d425ae4197.png)

## 複数クラスの正規分布

```{r}
# サンプル数1000個で、クラス数が4の２次元正規分布のデータを作成。(各分布の中心をrで設定。sdでばらつき)
dnorm <- mlbench.2dnormals(1000, cl=4, r=1.5, sd=0.5)
plot(dnorm)
```
![000025.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187459/9cb4d4e6-c860-1560-c3e2-3f4f18002712.png)

# 球形データ
```{r}
circle.2 <- mlbench.circle(1000,d=2) #2次元
plot(circle.2)
circle.3 <- mlbench.circle(1000,d=3) #3次元
plot(circle.3)
```

![000035 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187459/c2c3e91c-fc85-8e30-9ff0-d1630e985b45.png)
![000037.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187459/2c257ece-ad47-d2cb-41ea-fca06d42367f.png)

# おわりに
他にも特有の問題のデータ生成関数がありますが、こんな感じで簡単に作って可視化できるので、
評価用に使えそうなものがないかパラパラ見てみると、時間短縮ができて良いかもしれません。

# 実行環境
- MacOS Big Sur 11.3.1
- R version 4.0.5 (2021-03-31)
- R Studio Version 1.4.1103

# 参考文献
- [mlbench: Machine Learning Benchmark Problems](https://cran.r-project.org/web/packages/mlbench/index.html)
[Vulkan ray tracing] サンプルコードからの次の一歩　影と透過について

#概要
ray tracingのAPIでは、シンプルなものなら影と透過(ガラスなどのオブジェクト)は比較的簡単に実装できる。

#サンプルコード
NVIDIA Vulkan Ray Tracing Tutorial
記事の最後で、shadowについての記述がある。
https://nvpro-samples.github.io/vk_raytracing_tutorial_KHR/

#traceRayEXT関数
raygenシェーダ、missシェーダ、rchitシェーダで使える超便利関数。originからdirection方向にrayを飛ばし、オブジェクトにhitすれば指定したrchitシェーダを、ヒットしなければ指定したmissシェーダを実行する。
traceRayEXT関数を初めて見るのはraygenシェーダだと思われるが、この関数はなんと冒頭の通り他のシェーダ内でも実行できる。
この関数を用いて、影や透過の判定を行う。

#実施例
透明なキューブと色のある平面を描き、そこに左上から光を当てた絵。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1446998/10242ba6-572c-bb8e-7dfa-a0e58abdb6e0.png)

#影について
アイデアは非常にシンプルで、平面上の各点からlightに向けてtraceRayEXT関数を実行し、もしオブジェクトに当たればそこは影になると判断する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1446998/22f4426f-fec5-09b1-0ce3-1b6f3282f41e.png)

``` glsl:rayhit.rchit
if(objId == 0 && dot(normal, L) > 0)
{
  float tMin = 0.001;
  float tMax = lightDistance;
  vec3 origin = worldPos;
  vec3 rayDir = L;
  uint flags = gl_RayFlagsTerminateOnFirstHitEXT | gl_RayFlagsOpaqueEXT 
                  | gl_RayFlagsSkipClosestHitShaderEXT;
  isShadowed = true;
  traceRayEXT(topLevelAS, flags, 0xFF, 0, 0, 1, origin, tMin, rayDir, tMax, 1);
  if(isShadowed)
  {
    attenuation = 0.3;
  }
}
```

```glsl:shadow.rmiss
void main()
{
  isShadowed = false;
}
```
traceRayEXT()を実行するが、ここでの目的はrayがmissするかどうかだけである。isShadowed変数にあらかじめtrueを入れておき、「missシェーダが呼ばれる=rayが当たらない」という状況であればmissシェーダ内でisShadowedをfalseに書き換えることで、呼び出し元の点が影になっているかどうかを判断する。

#透過について
これは上記リンクのサンプルコードには書かれていないが、アイデアは同じである。

```glsl:rayhit.rchit
if(alpha < 1.0)
{
  float tMin = 0.01;
  float tMax = 100.0;
  pldBlend.pos = worldPos;
  pldBlend.hit = false;
  pldBlend.color = pushC.clearColor.xyz;
  vec4 cameraPos = cam.viewInverse * vec4(0, 0, 0, 1);
  vec3 direction = normalize(worldPos - cameraPos.xyz);
  uint flags = gl_RayFlagsOpaqueEXT;
  for(uint i = 0; i < 4; i++)
  {
    traceRayEXT(topLevelAS, flags, 0xFF, 1, 0, 2, pldBlend.pos, tMin, direction, tMax, 2); 
    if(pldBlend.hit)
      break;
  }
  color = mix(pldBlend.color, color, alpha);
}
```
判断はobjIdでも構わないが、rchitが呼ばれた点(worldPos)がガラスキューブ上である場合にこの処理を行う。worldPosをoriginとし、directionはcameraから見たworldPos方向とする。初期の色を背景の色としておき、この方向に向けて複数回traceRayEXT関数を実行し、平面にhitすればその場所の色をとってくる。注意点として、originは呼ぶたびに次のhitした地点の座標を入れる必要がある。
最後に、とってきた色とガラスキューブの色をmix関数でblendを行う。

#最後に
ray tracingでは従来のrasterizer型のパイプラインとはレンダリングのアプローチの仕方が異なるように思える。従来のパイプラインだと各頂点ごとに動作を記述しているので、他の頂点にあわせてこうするといった記述は難しく、例えばシャドウマップなどの工夫が必要だったとだろうと思う。一方ray tracingではrayを飛ばして見える景色を描画するという思想なので、こういった影や透過に関しては、コードの記述が簡単になっているように感じる。
fastapiのrouterでハマった件

タイトルにある通り、fastapiのrouterでハマったので今後同じミスをしないように記録として残しておきます。
業務内で起きたエラーで、実際のコードをこちらに載せることには抵抗があったため、ドキュメントを元にまとめていきます。

## エラー内容
エラー内容は以下の通りです。(こちらは私が実際に遭遇したエラーです。)

```python
{
  "loc": [
    "path", 
    "account_id"
  ],
  "msg": "value is not a valid integer",
  "type": "type_error.integer"
}

```

このエラーはpydanticのエラーで以下の意味を持ちます。
・ loc　→ どこでエラーが起きているか
・ msg　→ エラー内容
・ type　→ エラーの種類
	
よって、今回のエラーは「pathのaccount_idの値が有効な数値ではありません」という内容のエラーです。
そこで私は、「account_idなんて今回使いたいパスに指定されていないのになぜこんなエラーが出るのだろう」と頭を悩ませていました。


## 結論

いきなり結論に入ります。
公式ドキュメントにも記載されていますが、fastapiのrouterでpath operationを作成する際は固定パスを先に持ってこなくてはいけません。
以下、ドキュメント内のコードです。

```python
from fastapi import FastAPI

app = FastAPI()

@app.get("/users/me")   #固定パスが先

async def read_user_me():
    return {"user_id": "the current user"}

@app.get("/users/{user_id}") #動的パスは後に指定する

async def read_user(user_id: str):
    return {"user_id": user_id}
```

[fastapi 順序の問題](https://fastapi.tiangolo.com/ja/tutorial/path-params/#_7)
もしこれを逆にして、@app.get("/users/{user_id}")の処理を先に持ってきてしまうと、値が"me"であるパラメータuser_idであると勘違いをしてしまそうです。

このようにHTTPメソッドが同じ処理を複数行う場合は、記述の順番に気をつけましょう。

## 最後に
ちょっと前にreact-router-domでも同じようなことで頭を悩ませたなぁ...
org-modeでスクリーンショットをペーストする方法(Win10/Mac両対応)の完成形

https://stackoverflow.com/questions/17435995/paste-an-image-on-clipboard-to-emacs-org-mode-file-without-saving-it

をまとめました。
markdownで疲弊しているみなさまこんにちは。論文執筆もプレゼンテーションもタスク管理も時間計測もできるorg-modeを使ったほうがよいですね。しらんけどおれはorg-mode使うので。
org-modeのよいところはmarkdownは文書をつくることしかできないのにたいしてorg-modeは思考をすすめることができる点がよい。プレビューみながらmarkdownとかで本当に思考できますかね。見た目確認しながら作業してない？しらんけど。

私は~/orgにorgファイルをもっていて、orgを適宜テーマごとにディレクトリ切ってバリバリかいてます。で、インラインのイメージどうするの問題。win/macで絶対パス違うので相対パスにしないと無理。

よくあるやつはルートからのパス打ち込んでるだけなのでwin-macで相互運用できない。
わたしはGoogleDriveにorgおいてシンボリックリンク/ジャーナルリンク？して~/orgにorgファイルがあるところまでは設定してる

画像は~/org/imgに物理的に貯まる

で、冒頭のstackoverflowの色んな人の意見を悪魔合体しました。久々のelisp
うごいているから良いと思う！

```lisp
(defun get-basename-from-fullpath (fullpath)
  "フルパスから最後のスラッシュまで削除した部分を返します。"
  (let ((parts (split-string fullpath "/")))
    (car (last parts))))

(defun my-org-screenshot-win ()
  "Take a screenshot into a time stamped unique-named file in the
   same directory as the org-buffer and insert a link to this file."  
  (interactive)
  (setq filename
        (concat (expand-file-name "~/org/img/")
                (get-basename-from-fullpath
                 (concat
                  (make-temp-name
                   (concat (buffer-file-name)
                           "_"
                           (format-time-string "%Y%m%d_%H%M%S_")) ) ".png"))))
  (shell-command "snippingtool /clip")
  (shell-command (concat "powershell -command \"Add-Type -AssemblyName System.Windows.Forms;if ($([System.Windows.Forms.Clipboard]::ContainsImage())) {$image = [System.Windows.Forms.Clipboard]::GetImage();[System.Drawing.Bitmap]$image.Save('" filename "',[System.Drawing.Imaging.ImageFormat]::Png); Write-Output 'clipboard content saved as file'} else {Write-Output 'clipboard does not contain image data'}\""))
  (setq pastepath
        (concat "~/org/img/" (get-basename-from-fullpath filename)))
  (insert (concat "[[" pastepath "]]"))
  (org-display-inline-images))

(defun my-org-screenshot-darwin ()
  "Save a clipboard's screenshot into a time stamped unique-named file
   in a specified directory and insert a link to this file."
  (interactive)
  (setq filename
        (concat
         (make-temp-name
          (concat (buffer-name)
                  "_"
                  (format-time-string "%Y%m%d_%H%M%S_")) ) ".png"))
  (call-process "pngpaste" nil nil nil (concat (expand-file-name "~/org/img/") filename))
  (setq pastepath
        (concat "~/org/img/" filename))
  (insert (concat "[[" pastepath "]]"))
  (org-display-inline-images))

(defun my-org-screenshot ()
  (interactive)
  (if (eq system-type 'darwin)
      (my-org-screenshot-darwin)
    (my-org-screenshot-win)
    )
  )

(global-set-key (kbd "C-^") 'my-org-screenshot)
```
リファクタの余地は大いにあると思うので適当にいじってみてください。
CoinMarketCapのAPI完全解説(初心者向け)　後編

#はじめに
この記事はCoinMarketCapから情報を取得したいプログラミング初心者向けの記事です。
また、とりあえず使ってみたいと言う人は[前編]('https://qiita.com/trmtikko/items/5fb71dadf1d111f62bef')を御覧ください。
では、この記事を読んでCoinMarketCapマスターになりましょう！
![4193091_m.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1524076/7d9e2120-3fef-10ac-0f4a-deed6fd99dfb.jpeg)

#やってみる
では早速、APIの解説をしていきたいと思います。
[前編]('https://qiita.com/trmtikko/items/5fb71dadf1d111f62bef')で書いたコードは下の通りでした。

```python:cmc.py
from coinmarketcapapi import CoinMarketCapAPI, CoinMarketCapAPIError
​
cmc = CoinMarketCapAPI('{YOUR_API_KEY}')

r = cmc.cryptocurrency_info(symbol='BTC')
```

実際にデータの取得をするのは一番最後の行でしたね。
ここではcryptocurrency_infoという関数をよびだしています。
この関数ではBTCの情報について取得していました。
では、他の関数を使ってこれ以外のデータを取得するにはどうすれば良いでしょうか？
前回と同じようにPyPIのドキュメントを見てみます。 https://pypi.org/project/python-coinmarketcap/
すると、下のような物を見つけられます。
![スクリーンショット 2021-05-24 23.01.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1524076/c57de2ca-34d9-a7b2-5e47-35629559672b.png)
これが、このCoinMarketCapから情報を取得するための関数の一覧です。
具体的に使い方を見ていきましょう！
まずはそれぞれの関数の詳細を見るために「doc」とあるところをクリックしてみます。
![スクリーンショット 2021-05-24 23.05.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1524076/544e2185-5fc8-1fbe-e210-53d119d74da0.png)
すると、下のようにごちゃごちゃ色々書かれているページに飛ぶと思います。
![スクリーンショット 2021-05-24 23.07.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1524076/48929331-cadc-1766-f251-0ed638a29b34.png)
一個一個解説していきます。
##料金プラン
まず、画像の真ん中あたりにあるBasicとかHobbyistとか書いてあるやつについて。
これは、CoinMarketApiのどのプランに入っている人が使えるのかを表しています。
課金をすることでより便利なデータにアクセスでき、よりたくさんの回数アクセスできるような仕組みになっています。
お金を払っていない人はBasicプランに入っているはずです。
API料金については以下をご参照ください。
https://coinmarketcap.com/api/pricing/
例えば、このOHLCV Latest(最新のローソク足)についてはStartup以上でないとアクセスできないようになっています。
![スクリーンショット 2021-05-24 23.13.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1524076/a2aed69f-f2fa-72f3-a619-b6aed70270f8.png)
##Response
では次に、画面右側の黒い画面の部分について。
ここでは渡されるデータの形を教えてくれています。JSON形式というものですが、pythonの中で辞書形式に変換できます。
たとえば、返ってきたデータを[response]という変数に入れたとすると、
`print(response.data['BTC']['name']) #BitCoin`というように辞書として扱える。

##Parameter
下の画像は関数に渡す引数を教えてくれている。
これはコインマーケットキャップ上のコインの情報を教えてくれる関数の引数である。
![スクリーンショット 2021-05-24 23.26.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1524076/6d61de8f-a5ff-0178-fd71-f0f4cac97c15.png)
例えばここのlimitの引数に5000を入れると5000種類のコインの情報が返ってくる。

```python:cmc_prams.py
from coinmarketcapapi import CoinMarketCapAPI, CoinMarketCapAPIError
​
cmc = CoinMarketCapAPI('{YOUR_API_KEY}')

r = cmc.cryptocurrency_map(limit=5000)
print(r)
```

実行結果は下のとおりだ。
![スクリーンショット 2021-05-24 23.37.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1524076/52de26ff-7170-0827-dd65-9536342064b8.png)
どうやらうまくとれているみたいだ。
あとはここから好きな情報を抽出して使ってください。
こんなふうに、PyPIから使えそうな関数を見つけてCoinMarketCapのドキュメントに飛ぶことでその関数の詳しい使い方を見ることができて、英語が苦手な自分でもなんとか情報を取得できるようになった。
ちなみに、引数の説明のところに「Default:」と書いてあるやつはオプションなので引数を付けてもつけなくてもよき。
以上！
あなたはもう自分で調べることができるようになりました！
頑張って英語を読みましょうｗ
【SwiftUI】○秒後にView切り替え

#1. はじめに
SwiftUIでアプリ作成する際、例えばゲーム画面から結果画面への遷移といったように○秒後にViewを切り替えたりメッセージを表示したい。というケースがあるかと思います。
今回はそういった場合のSwiftUIでの実装について備忘録の意味も込めて簡単な例でご紹介していきたいと思います。

#2.作るもの
今回最終的に作る画面はこちらです。
５秒カウントダウンした後Hello,worldが表示される簡単なアプリです。

![Simulator Screen Recording - iPod touch (7th generation) - 2021-05-24 at 23.50.04.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233342/f6a41b1a-ef22-26cc-cf28-1b56f6727ec6.gif)


#3.プログラム
それではコードの解説にうつります。まずは全文です。

```swift:ContentView.swift

struct ContentView: View {
    // カウントダウンする秒数
    @State private var count = 5
    // true:カウントダウン中　false:カウントダウン終了
    @State private var isCountDown = true

    var body: some View {
        VStack {
            Text("\(self.count)秒後にHello, worldと表示されます")
            if !self.isCountDown {
                Text("Hello, world!")
            }
        }
        .onAppear() {
            // 1.0秒おきに{}内を繰り返す
            Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) {timer in
                self.count -= 1
                if self.count == 0 {
                    // 現在のカウントが0になったらtimerを終了させ、カントダウン終了状態に更新
                    timer.invalidate()
                    self.isCountDown = false
                }
            }
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

```


###3.1. 状態変数の宣言

```swift
    // カウントダウンする秒数
    @State private var count = 5
    // true:カウントダウン中　false:カウントダウン終了
    @State private var isCountDown = true
```

こちらはコメント文の通りです。状態変数としてカウント秒数(今回は５秒）、カントダウン状態を保持する変数(trueの間カウントダウンし続ける）を宣言しています。
＠Stateなのでこの変数が更新されたタイミングでViewも再描画されます。

### 3.2. Viewの作成
メインのViewを作っていきます。
TextのViewをVStackで縦に並べているだけです。ただし、Hello, worldはカウントダウンが終了したタイミングで表示したいのでif文でisCountDownがfalseのときに表示するようにしています。

```swift
VStack {
            Text("\(self.count)秒後にHello, worldと表示されます")
            if !self.isCountDown {
                Text("Hello, world!")
            }
        }
```

### 3.3. タイマーを導入する

```swift
.onAppear() {
...
}
```
onAppear()メソッドを使っていますので、アプリ起動時にViewが描画されたタイミングでメソッド内のコードが実行されます。
今回はこの中にカウントダウンする処理を記載します。


```swift
Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) {timer in
 //withTimeIntervalの秒数ごとに繰り返される
}
```
こちらがカウントダウンする処理になります。TimerのscheduledTimerメソッドを使用します。
withTimeIntervalに指定した秒数カウントされ、repeatsがtrueは繰り返し、falseの場合１回のみカウントされますので
上記の場合１秒のカウントが永遠に実行されることになります。
やりたいことは5秒のカウントダウンですので状態変数で宣言したcountをデクリメントしていき0になったタイミングでtimer.invalidate()を呼び出しタイマーのカウントを終了させます。
また、カウントダウンが終了したので状態変数isCountDownもfalseにしてあげます。

```swift
self.count -= 1
   if self.count == 0 {
   // 現在のカウントが0になったらtimerを終了させ、カントダウン終了状態に更新
        timer.invalidate()
        self.isCountDown = false
    }
```

以上で終了です。
ほかにも秒数やTimer内の処理をアレンジしていろんな処理がかけるかと思います。
私はNavigationlinkでの画面遷移に採用したりしました。

# 4. おわりに
SwiftUIから入りiosアプリ開発を学び始めて１ヶ月程ですが、まだまだ情報が少なく辛い状況でした。。
今回のTimer処理も調べてもSWiftUIでの実装があまり見つからず記事にした次第です。（それとも当たり前すぎて誰も記事にしていないのかな。。）
やっぱりUIKitの勉強もしないといけないですかね。

もっとこうした方がいい等ありましたらコメントいただけると幸いです。
Cloud Deployment Managerを使ってみる

AWSでいうところのCloudFormationが、GCPではCloud Deployment Managerというサービスだそうなので、触ってみました。

まずはテンプレートファイル作成です。CloudFormationと同じくYAMLで書けます。GCEのインスタンス1台を立てるテンプレートです。

```sample.yaml
resources:
  - name: instance1
    type: compute.v1.instance
    properties:
      zone: asia-northeast1-b
      machineType: zones/asia-northeast1-b/machineTypes/n1-standard-1
      disks:
      - deviceName: instance1
        boot: true
        initializeParams:
          sourceImage: projects/ubuntu-os-cloud/global/images/family/ubuntu-2004-lts
      networkInterfaces:
        - network: projects/xxxxxxxx/global/networks/default # xxxxxxxxのところはプロジェクトIDを入れる
```

デプロイする前に、プレビューができるようです。 `gcloud deployment-manager deployments create` コマンドに `--preview` を付けます。CloudFormationよりも便利な予感。

```console
$ gcloud --project=xxxxxxxx deployment-manager deployments create sample1 --config sample.yaml --preview
...
NAME       TYPE                 STATE       ERRORS  INTENT
instance1  compute.v1.instance  IN_PREVIEW  []      CREATE_OR_ACQUIRE
```

テンプレートファイルを変更したら、再度プレビューを見るには、  `gcloud deployment-manager deployments update` コマンドに変わるらしいです。 `--preview` を付けるのは変わらず。

```console
$ gcloud --project=xxxxxxxx deployment-manager deployments update sample1 --config sample.yaml --preview
NAME       TYPE                 STATE       ERRORS  INTENT
instance1  compute.v1.instance  IN_PREVIEW  []      CREATE_OR_ACQUIRE
```

なぜ `update` にしないといけないのか。 `--preview` を付けるとリソースの作成はされないものの、CloudFormationでいうところのスタックは作られるということなのだろうか。この時点で `describe` というコマンドで様子を確認できました。

```console
$ gcloud --project=xxxxxxxx deployment-manager deployments describe sample1
---
...
NAME       TYPE                 STATE       INTENT
instance1  compute.v1.instance  IN_PREVIEW  CREATE_OR_ACQUIRE
```

`STATE` が `IN_PREVIEW` となっています。

`--preview` を外すと、実際にリソースが作成されます。この時はテンプレートファイル名を指定しないようです。

```console
$ gcloud --project=xxxxxxxx deployment-manager deployments update sample1
...
NAME       TYPE                 STATE      ERRORS  INTENT
instance1  compute.v1.instance  COMPLETED  []
```

もう一度 `describe`

```console
$ gcloud --project=xxxxxxxx deployment-manager deployments describe sample1
---
...
NAME       TYPE                 STATE      INTENT
instance1  compute.v1.instance  COMPLETED
```

`gcloud compute instances list` コマンドで、テンプレートファイルに指定した instance1 という名前のGCEインスタンスが生成されているのが確認できます。

次は、削除。

```console
$ gcloud --project=xxxxxxxx deployment-manager deployments delete sample1
The following deployments will be deleted:
- sample1

Do you want to continue (y/N)?  y
...
Delete operation operation-1621866485901-5c31437c3e6ca-c264c3ba-250a94a1 completed successfully.
```

GCEインスタンスも削除されました。
Rubyアルゴリズム（Water Bottles）

## 問題
Given numBottles full water bottles, you can exchange numExchange empty water bottles for one full water bottle.

The operation of drinking a full water bottle turns it into an empty bottle.

Return the maximum number of water bottles you can drink.

```
vInput: numBottles = 9, numExchange = 3
Output: 13
Explanation: You can exchange 3 empty bottles to get 1 full water bottle.
Number of water bottles you can drink: 9 + 3 + 1 = 13.
```

```
Input: numBottles = 15, numExchange = 4
Output: 19
Explanation: You can exchange 4 empty bottles to get 1 full water bottle. 
Number of water bottles you can drink: 15 + 3 + 1 = 19.
```

```
Input: numBottles = 5, numExchange = 5
Output: 6
```

```
Input: numBottles = 2, numExchange = 3
Output: 2
```


## 私の回答

```ruby
def num_water_bottles(num_bottles, num_exchange)
    drunk = []
    bottles = num_bottles
    if bottles < num_exchange
        drunk << bottles
    else
        while num_bottles >= 1 do
            #飲む
            drunk << num_bottles

            #交換する
            ex_bottle = (bottles / num_exchange).floor
            bottles = bottles % num_exchange + ex_bottle
            num_bottles = ex_bottle
        end
    end
    return drunk.sum
end
```
　

とりあえず今回も**Accepted!!**
OKではあるものの、やっぱりなんだかごちゃごちゃしている気がする。。

いくつかのパーツにわけて考えました。

- 最初から持っているボトルの数が、交換可能本数より少ない（交換できず飲んで終わり）
- 1回以上交換する場合
 - 飲む
 - ボトルを交換する

**下準備**

```ruby
drunk = []
bottles = num_bottles
```
飲んだ本数は[配列].sumで最後に足すためにdrunkにどんどん入れていきます。
num_bottlesは中身のあるボトルなので、中身の有無関係なくボトルを計算する変数bottlesを準備します。

**最初から持っているボトルの数が、交換可能本数より少ない**

```ruby
if bottles < num_exchange
    drunk << bottles
else
```
シンプルにそのまま飲みます。
ここはbottlesでもnum_bottlesでもいいんですが、ここから下の書き方と合わせた方が綺麗になるかなとbottlesで書きました。

**1回以上交換する場合**

```ruby
while num_bottles >= 1 do
   #飲む
   drunk << num_bottles

   #交換する
   ex_bottle = (bottles / num_exchange).floor
   bottles = bottles % num_exchange + ex_bottle
   num_bottles = ex_bottle
end
```
else以下に書いている全体がこちら。while num_bottles >= 1、つまり中身のあるボトルが1本でもある限り、この下の「飲む」アクションに行って欲しいのでこの条件を書いています。

分解していきます。

**①飲む**

```ruby
#飲む
drunk << num_bottles
```
中身のあるボトルの数を配列であるdrunkに放り込みます。

**②ボトルを交換する**

```ruby
#交換する
ex_bottle = (bottles / num_exchange).floor
bottles = bottles % num_exchange + ex_bottle
num_bottles = ex_bottle
```

ex_bottleが交換してでもらえたボトルの数です。
1 交換する本数をけいさん
2 全体のボトルの数を計算
3 次のアクションで「飲む」ために変数num_bottlesに中身のあるボトルの数を入れておく。

終了です。無事Acceptedだけど、もっと綺麗に書けるんだろうな〜。
【Unity 2D】オブジェクトをドラッグ操作で動かす

##完成イメージ
このような感じで、単純にオブジェクトをドラッグ操作で動かしたかったので色々調べて実装してみました。
![ezgif-3-f1d99d2b0af6.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290547/e7330582-fae8-a6a7-90fb-c503f862a6d9.gif)
が、私はまだUnityに浅いので完璧なものではない旨をご了承ください。内容的には初心者向けのものとなっています。
私の需要は満たせているので、とりあえず公開します。

##実際のスクリプト
このスクリプトを、動かしたいオブジェクトに付加すればとりあえず動かせると思います。
**注意：対象のオブジェクトにはBox Collider 2DとRigidbody 2Dの各コンポーネントを付加していて、Rigidbody 2DのBody TypeをDynamicからKinematicに変更していることを前提とします。**

```cs:ObjectDragTransform.cs
using System.Collections;
using UnityEngine;

public class ObjectDragTransform : MonoBehaviour
{
    //オブジェクトをクリックしてドラッグ状態にある間呼び出される関数（Unityのマウスイベント）
    void OnMouseDrag()
    {
        //マウスカーソル及びオブジェクトのスクリーン座標を取得
        Vector3 objectScreenPoint = 
            new Vector3(Input.mousePosition.x,Input.mousePosition.y,10);

        //スクリーン座標をワールド座標に変換
        Vector3 objectWorldPoint = Camera.main.ScreenToWorldPoint(objectScreenPoint);

        //オブジェクトの座標を変更する
        transform.position = objectWorldPoint;
    }
}
```
####スクリプトの解説
スクリプトの流れを言葉で簡単に説明すると、「オブジェクトをクリックしている間マウスカーソルのxy座標をオブジェクトの座標にします」という感じでしょうか。
途中でスクリーン座標だのワールド座標だの変換だのと難しそうなところがあります。
私も完全に理解したわけではないのですが、要するに、オブジェクトのワールド座標を保持するtransform.positionに対してマウスカーソルのxy座標と適当なz座標（スクリーン座標）をワールド座標として格納すれば、上記のgifのようにドラッグ操作しているように見えるという仕組みです。
マウスカーソルのxy座標と適当なz座標はスクリーン座標と呼ばれる座標なので、これをワールド座標を示すtransform.positionに直接格納することができない、そのために変換を行っています。

間違っていたらご指摘いただけると幸いです。

#####蛇足ですが
複数のオブジェクトに本スクリプトを付加することで、複数オブジェクトのドラッグ操作も可能です。


####懸念点
オブジェクトのz座標を定数で固定化するのはあまりよろしくないと思われます。2D視点だと基本的にオブジェクトのz座標がマイナスになったら画面から消えてしまうので、そういった不具合の原因になりかねません。私が実現したいアプリケーションにおいては問題ないので定数として適当に10と入力しています。
参考サイト欄にtransform.positionからオブジェクトのz座標を取得する方法を採用されている方のページを記していますので、心配な方はそちらをチェックしていただきたく思います。

##参考サイト
[【Unity C#】マウスをドラッグしてオブジェクトを動かす](https://futabazemi.net/notes/unity-mouse_drag/)
[Unityでオブジェクトをドラッグ＆ドロップにあわせて動かす（2D）](https://qiita.com/ReoNagai/items/1becdea9e6fa9b55c82a)
PHPのswitch文

#前提
PHPは未経験
PHPの学習を始めたため、アウトプットとして投稿
開発環境はXAMPP

#switch文の書き方

````
switch(式){
case(値1):
  処理
　break;
case(値2):
  処理
　break;
case(値3):
  処理
　break;
default:
  処理
}
````
まずswitch文では、式の値を評価して後続のcase句の値と照らし合わせ、
一致したcase文の処理を実行する。
default句はcase句に一致する値がなかった場合に実行される。

#実際に書いてみた。
```
<?php 
$tgt = 1;

switch($tgt){
  case 1:
    echo "数字は1です。";
    break;
  case 2:
    echo "数字は2です。";
    break;
  case 3:
    echo "数字は3です。";
    break;  
  default:
    echo "数字は1,2,3のいずれでもありません";
}
 ?>
```
実行結果はこうなる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1031387/3bc18737-2d7c-cb52-c00c-7cc9d10cab0c.png)

#まとめ
うーんほとんどjavaと同じだった（java経験1年）
Arduino UNOとGP2Y0A21YK(赤外線距離センサー)で6cmから10cmを求める。(参考用テスト結果)


x気になる人よう

目的
adcのテスト用
式が難しく、範囲が広いために分割してテストしてます。あしからず。
式が正しいことが分かった。



```c++


void setup() {
  Serial.begin(9600);
}

int sensorValue; //センサーの読み取り値
float Voltage;     //電圧
float ir_length;   //長さ

void loop() {

  sensorValue = analogRead(A0);
  Voltage = (float)sensorValue * ( 5.0 / 1024.0 );
  if (Voltage >= 0 && Voltage <= 2.2)   {Voltage = 2.2;}
  if (Voltage >= 3.22 && Voltage <= 5.0) {Voltage = 3.22;}

  if        (Voltage >= 2.3 && Voltage <= 2.75)  { //10-8
    
    ir_length = 1.0/ ( 0.1 + ( ( Voltage - 2.3) * (0.025/0.45) ) );
    
  } else if (Voltage >= 2.75 && Voltage <= 2.98) { //8-7
    
    ir_length = 1.0/ ( 0.125 + ( ( Voltage - 2.75) * (0.0179/0.23) ) );
    
  } else if (Voltage >= 2.98 && Voltage <= 3.12) { //7-6
    
    ir_length = 1.0/ ( 0.1429 + ( ( Voltage - 2.98) * (0.0238/0.14) ) );
    
  }
  
  //Serial.println(sensorValue);
  Serial.print("230");
  Serial.print(",");
  Serial.print( Voltage*100);
  Serial.print(",");
  Serial.print("312");
  Serial.print(",");
  Serial.print("60");
  Serial.print(",");
  Serial.print( ir_length*10 );
  Serial.print(",");  
  Serial.println("100");
  
  delay(10);
}


```

![com_1_9.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/d4e28a69-ba9f-706d-2ca9-cd4b57965cd2.jpeg)


配列化

```c++

#include <stdio.h>
int main(void){
    
    int ii;
    int s=0;
    
unsigned char oo[]={
100,99,98,98,97,97,96,96,95,95,
94,94,93,93,92,92,91,91,90,90,
90,89,89,88,88,87,87,86,86,86,
85,85,84,84,84,83,83,82,82,82,
81,81,81,80,80,80,79,79,78,78,
77,77,76,76,75,75,74,74,74,73,
73,72,72,71,71,71,70,70,69,69,
68,67,66,66,65,64,63,63,62,61,
61,60,60
};
    
    
    
    for(ii = 2300;ii <= 3120;ii=ii+10) {
        
        s=(ii-2300)/10;

        printf("%d \t %d \n",ii,oo[s]);
        
    }//ii
    
}//main



```

```

2300 	 100 
2310 	 99 
2320 	 98 
2330 	 98 
2340 	 97 
2350 	 97 
2360 	 96 
2370 	 96 
2380 	 95 
2390 	 95 
2400 	 94 
2410 	 94 
2420 	 93 
2430 	 93 
2440 	 92 
2450 	 92 
2460 	 91 
2470 	 91 
2480 	 90 
2490 	 90 
2500 	 90 
2510 	 89 
2520 	 89 
2530 	 88 
2540 	 88 
2550 	 87 
2560 	 87 
2570 	 86 
2580 	 86 
2590 	 86 
2600 	 85 
2610 	 85 
2620 	 84 
2630 	 84 
2640 	 84 
2650 	 83 
2660 	 83 
2670 	 82 
2680 	 82 
2690 	 82 
2700 	 81 
2710 	 81 
2720 	 81 
2730 	 80 
2740 	 80 
2750 	 80 
2760 	 79 
2770 	 79 
2780 	 78 
2790 	 78 
2800 	 77 
2810 	 77 
2820 	 76 
2830 	 76 
2840 	 75 
2850 	 75 
2860 	 74 
2870 	 74 
2880 	 74 
2890 	 73 
2900 	 73 
2910 	 72 
2920 	 72 
2930 	 71 
2940 	 71 
2950 	 71 
2960 	 70 
2970 	 70 
2980 	 69 
2990 	 69 
3000 	 68 
3010 	 67 
3020 	 66 
3030 	 66 
3040 	 65 
3050 	 64 
3060 	 63 
3070 	 63 
3080 	 62 
3090 	 61 
3100 	 61 
3110 	 60 
3120 	 60 


```
SSHとは

プログラミングを勉強していると、よく教材や記事に「SSH」という言葉が出てきます。
「SSH」ってなに？？という疑問をプログラミング初学者が解説てみました。
#SSHとは
SSHはSecure Shell（セキュアシェル)の略称で、プロトコルです。
セキュアということなので、安全で危険が少ないプロトコルなんだなと想像がつきますね。
※プロトコルとは、ネットワークにおいてコンピューター同士がやり取りするためのルールのこと

また、SSHはTelnetと異なり、送信する全てのデータを暗号化にするため、
外部から侵入されないようにサーバーに接続したい場合はTelnetではなく、SSHでアクセスすることが望ましいです。

SSHとTelnetについては[こちら](https://wa3.i-3-i.info/diff30telnet.html)を参照すると良いと思います。

#SSHの接続方法
SSHの接続方法には以下の２周類があります。
①パスワード認証
②公開鍵認証

①パスワード認証の方法は、IDとPassだけで接続できてしまうため、手軽に設定できますが、安全性は低くなってしまいます。
②公開鍵認証の方法は、「鍵」の保管を徹底することで第三者からの不正な接続を防ぐことができます。ただし、設定が大変です。

安全性を確保する上では、公開鍵認証の方法を利用するみたいですね。

#まとめ
SSHは安全なプロトコルで、現在においては、一般的にサーバーに接続するなど、遠隔操作を行う際はTelnetではなくSSHが使われているそうです。
コーディングについて～命名編 ① ～

私の参画しているプロジェクトにはコーディングルールが存在せず、
作成する必要を感じたため勉強をしました。
基礎中の基礎ばかりかと思いますが、自身の備忘録としてまとめることにしました。

# はじめに

本記事はJavaScriptをベースに記載していきます。

変数や関数の命名について大切なことは「何が入る変数なのか」、
「何をする関数なのか」ということが「一目でわかる」ということだと思います。
ですが、会社やプロジェクトで既にルールが存在するならば、
それに則るのが最も大切です。

# 変数名

## 基本的に名詞を使う

後に記載していますが、「～かどうか」のような状態を表す場合以外は名詞を使用します。

```Javascript
const name = "名前";
const id = "ID";
```

可能な限り具体的な変数名にするのがよいです。

```Javascript
const loginUserName = "名前";
const loginUserId = "ID";
```

## Bool 値の命名

「～かどうか」のような状態を表す場合はis●●やhas●●、can●●などを使って命名します。

```Javascript
let isEmpty = false;
let hasError = false;
```

このように、ある規則の元で命名される変数や関数は安易に命名される印象があります。
(とりあえずisがついただけのような)よくわからない変数や関数が大量生産されるので、
適切な名前をつけてあげる必要があります。

```Javascript
// NG：何が空なのかわからない
let isEmpty = false;
// OK
let isEmptyUserNameArray = false;
// NG：何のエラーなのかわからない
let hasError = false;
// OK
let hasMailFormatError = false;
```

## 否定形は避ける

以下のように否定形の変数名は避けましょう。
関数名も同様です。

```Javascript
let isNotEmpty = true;
let hasNotError = true;
```

# 関数名

## 先頭は名詞？動詞？前置詞？

何れのパターンもあり得ます。

■名詞が先頭パターン
処理というよりプロパティ系の場合に定義します。
今のところ私はこのパターンの関数は実装したことがありません。

```Javascript
function values() {
// 処理
}
```

■動詞が先頭パターン
一般的なパターンで処理を表す場合に定義します。

```Javascript
function createSession() {
// 処理
}
```

■前置詞が先頭パターン
動詞が先頭パターンで、先頭の動詞が省略可能な場合に定義します。

```Javascript
// convertが省略されている
function toString() {
// 処理
}
```


## 名前の長さ問題

エディタが補完してくれるので気にする必要はないです。
「何をするのか」が適切に表現されることの方が大切です。

## 処理内容に沿った命名

用途に応じた名前ではなく、処理に応じた名前を付けましょう。
例として数値を検索パラメータとして使用するために0埋めする必要があるとします。

```Javascript
// NG：用途で命名されており、単純に0埋めしたい場合に適していない名前となっている
function formatSearchParamForNumber() {
  // 0埋めする処理
};
// OK
function formatZeroPadding() {
  // 0埋めする処理
};
```

# 最後に
私自身これまでコーディングルールを意識することができていなかったため
記載内容の誤りやこうするべき、ということが含まれるかと思います。
おかしな点がありましたら今後のためにもご教示いただきたいです。


# 参考

[リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック](https://www.amazon.co.jp/%E3%83%AA%E3%83%BC%E3%83%80%E3%83%96%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%89-%E2%80%95%E3%82%88%E3%82%8A%E8%89%AF%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B8%E3%81%8F%E3%81%9F%E3%82%81%E3%81%AE%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%A7%E5%AE%9F%E8%B7%B5%E7%9A%84%E3%81%AA%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF-Theory-practice-Boswell/dp/4873115655/ref=sr_1_1?adgrpid=119615279927&dchild=1&hvadid=492487559976&hvdev=c&hvqmt=e&hvtargid=kwd-334758528225&hydadcr=27298_14361238&jp-ad-ap=0&keywords=%E3%83%AA%E3%83%BC%E3%83%80%E3%83%96%E3%83%AB+%E3%82%B3%E3%83%BC%E3%83%89&qid=1620528993&sr=8-1)
[真偽値を返す関数のネーミング](https://qiita.com/yskszk/items/5a7f99c974773f03a82a)
[モデルやメソッドに名前を付けるときは英語の品詞に気をつけよう](https://qiita.com/jnchito/items/459d58ba652bf4763820)
【JavaScript】Submit時のダブルクリック防止

Submit時にダブルクリックを防止するJSを書いたので共有。

筆者の環境ではChrome, FireFox, IE, Edgeで問題なく動いていました！（2021/05/21時点）

##JS本体##
```javascript
var dblClickFlag = null;

function ThroughDblClick() {
    // ダブルクリック（連続ポスト）の制御
    if (dblClickFlag == null) {
        dblClickFlag = 1;
        return true;
    } else {
        return false;
    }
}
```
##onSubmitから呼び出す##
onSubmit属性に記述することで、True/FalseからonSubmitするか判断できます。
Falseの場合はsubmitされません。

```html
<script>
var dblClickFlag = null;

function ThroughDblClick() {
    // ダブルクリック（連続ポスト）の制御
    if (dblClickFlag == null) {
        dblClickFlag = 1;
        return true;
    } else {
        return false;
    }
}
</script>

<form action="" method="post" onSubmit="return ThroughDblClick();">
   <input type="submit" value="送信">
</form>
```

注意点としてonSubmitでreturnを付けないと、普通にsubmitされます。

##2回目以降がFalseかテスト##
上のコードのままだとsubmitされて画面遷移してしまうので
type="button"にして、onclickからテストしてみます。


```html
<script>
var dblClickFlag = null;

function ThroughDblClick() {
	console.log(dblClickFlag == null);
    // ダブルクリック（連続ポスト）の制御
    if (dblClickFlag == null) {
        dblClickFlag = 1;
        return true;
    } else {
        return false;
    }
}
</script>

<form action="" method="post" onSubmit="return ThroughDblClick();">
   <input type="submit" value="送信">
   <input type="button" value="test" onclick="ThroughDblClick();">
</form>
```
<br>
ちゃんと動いています(´∀｀*)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1100934/45256481-5e08-8fae-eed3-301ea6b825a6.png)
SQL Boltの解答リンク（ろくろ猫さんのブログ）

SQL BoltでSQLの練習を始めました。
ろくろ猫さんのブログで解答を参考にしてたのですが一覧が見つからなかったので作りました。
ろくろ猫さん！有益なブログありがとうございます。

【SQL練習】SQL Bolt
https://rokuroneko.hateblo.jp/entry/2020/02/02/001858

【SQL練習】SQL Bolt lesson1
SQLBolt - Learn SQL - SQL Lesson 1: SELECT queries 101
https://rokuroneko.hateblo.jp/entry/2020/02/02/220919

【SQL練習】SQL Bolt lesson2
SQLBolt - Learn SQL - SQL Lesson 2: Queries with constraints (Pt. 1)
https://rokuroneko.hateblo.jp/entry/2020/02/09/120152

【SQL練習】SQL Bolt lesson3
SQLBolt - Learn SQL - SQL Lesson 3: Queries with constraints (Pt. 2)
https://rokuroneko.hateblo.jp/entry/2020/02/09/121908

【SQL練習】SQL Bolt lesson4
SQLBolt - Learn SQL - SQL Lesson 4: Filtering and sorting Query results
https://rokuroneko.hateblo.jp/entry/2020/02/09/142141

【SQL練習】SQL Bolt lesson5
SQLBolt - Learn SQL - SQL Review: Simple SELECT Queries
https://rokuroneko.hateblo.jp/entry/2020/02/11/102734

【SQL練習】SQL Bolt lesson6
SQLBolt - Learn SQL - SQL Lesson 6: Multi-table queries with JOINs
https://rokuroneko.hateblo.jp/entry/2020/02/11/102858

【SQL】WHERE句
https://rokuroneko.hateblo.jp/entry/2020/02/11/115458

【SQL】EXISTS句
https://rokuroneko.hateblo.jp/entry/2020/02/15/122733

【SQL】複数テーブルからのデータの取得
https://rokuroneko.hateblo.jp/entry/2020/02/15/125452

【SQL練習】SQL Bolt lesson7
SQLBolt - Learn SQL - SQL Lesson 7: OUTER JOINs
https://rokuroneko.hateblo.jp/entry/2020/02/22/180730

【SQL練習】SQL Bolt lesson8
SQLBolt - Learn SQL - SQL Lesson 8: A short note on NULLs
https://rokuroneko.hateblo.jp/entry/2020/02/22/180759

【SQL練習】SQL Bolt lesson9
SQLBolt - Learn SQL - SQL Lesson 9: Queries with expressions
https://rokuroneko.hateblo.jp/entry/2020/02/22/190917

【SQL】SUM関数
https://rokuroneko.hateblo.jp/entry/2020/02/22/191317
指定したカラムの合計値を取得する。

【SQL練習】SQL Bolt lesson10
SQLBolt - Learn SQL - SQL Lesson 10: Queries with aggregates (Pt. 1)
https://rokuroneko.hateblo.jp/entry/2020/02/27/205819

【SQL】MIN関数
https://rokuroneko.hateblo.jp/entry/2020/02/29/110458

【SQL】AVG関数
https://rokuroneko.hateblo.jp/entry/2020/03/01/112635

【SQL練習】SQL Bolt lesson11
SQLBolt - Learn SQL - SQL Lesson 11: Queries with aggregates (Pt. 2)
https://rokuroneko.hateblo.jp/entry/2020/03/04/104351

【SQL】COUNT関数
https://rokuroneko.hateblo.jp/entry/2020/03/04/104415

【SQL】HAVING句
https://rokuroneko.hateblo.jp/entry/2020/03/04/105036

【SQL】GROUP BY句
https://rokuroneko.hateblo.jp/entry/2020/03/04/105058

【SQL練習】SQL Bolt lesson12
SQLBolt - Learn SQL - SQL Lesson 12: Order of execution of a Query
https://rokuroneko.hateblo.jp/entry/2020/03/05/201304

【SQL】SQLまとめ
https://rokuroneko.hateblo.jp/entry/2020/03/05/213938

【JavaScript】正規表現
https://rokuroneko.hateblo.jp/entry/2020/03/10/221958

【SQL】ORDER BY句
https://rokuroneko.hateblo.jp/entry/2020/03/19/072205

【SQL練習】SQL Bolt lesson13
SQLBolt - Learn SQL - SQL Lesson 13: Inserting rows
https://rokuroneko.hateblo.jp/entry/2020/03/20/141253

【SQL練習】SQL Bolt lesson14
SQLBolt - Learn SQL - SQL Lesson 14: Updating rows
https://rokuroneko.hateblo.jp/entry/2020/03/29/141042

【SQL練習】SQL Bolt lesson15
SQLBolt - Learn SQL - SQL Lesson 15: Deleting rows
https://rokuroneko.hateblo.jp/entry/2020/04/10/123202
MRTK-Quest で躓いた時に読む記事

MRTK-Questを使用していると、思うように設定できない箇所があるので記録しておく。

# 初期ボタン配置
Oculus_CrossPlatform_Button2
Aボタン

Oculus_CrossPlatform_SecondaryIndexTrigger
右トリガー＆グリップ

Oculus_CrossPlatform_Button4
Xボタン

Oculus_CrossPlatform_PrimaryIndexTrigger
左トリガー＆グリップ

## Buttonを離したタイミングのイベントを設定する
ButtonオブジェクトのEventからInteractableOnPressReceiverを選択し、実行するメソッドを割り当てる。

# その他
MRTK(非-Quest)用のコントローラー機能を使用すると思うように動かないことが多々ある。
MRTKのハンドトラッキングの制御を記述する場所にコントローラーの機能を記述すると動作ことが多いので、行き詰ったら試してみる価値あり。