OmniAICreator/Qiita-1.07M huggingface dataset:
Swiftでカメラキャプチャーするための最小コード

記事の内容はこちらを参照してください。
https://mishimay.github.io/07047755bc2aed1bdc9c/
<!--

## 準備
`Info.plist` に以下の設定を追加。

```xml
	<key>NSCameraUsageDescription</key>
	<string>[カメラ使用に関する説明]</string>
```

## コード
```swift
import UIKit
import AVFoundation

class CaptureViewController: UIViewController {

    private let previewLayer: AVCaptureVideoPreviewLayer = {
        let previewLayer = AVCaptureVideoPreviewLayer()
        previewLayer.videoGravity = .resizeAspectFill
        return previewLayer
    }()

    init() {
        super.init(nibName: nil, bundle: nil)

        let session = AVCaptureSession()
        previewLayer.session = session

        if let device = AVCaptureDevice.default(for: .video),
           let input = try? AVCaptureDeviceInput(device: device),
           session.canAddInput(input) {
            session.addInput(input)
        }

        let output = AVCaptureVideoDataOutput()
        output.setSampleBufferDelegate(self, queue: .global())
        if session.canAddOutput(output) {
            session.addOutput(output)
            output.connection(with: .video)?.videoOrientation = .portrait
        }

        session.startRunning()
    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        view.layer.addSublayer(previewLayer)
    }

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()

        previewLayer.frame = CGRect(origin: .zero, size: view.bounds.size)
    }

}

extension CaptureViewController: AVCaptureVideoDataOutputSampleBufferDelegate {

    func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
        // sampleBufferを処理する
    }

}
```

## 環境
Xcode 12.2

```
Apple Swift version 5.3.1 (swiftlang-1200.0.41 clang-1200.0.32.8)
Target: x86_64-apple-darwin19.6.0
```


-->
VisualStudioでプロジェクトを追加する方法

# はじめに
VisualStudioで作成済みのプロジェクトを追加し、エラーにならないための備忘録。

以下の順番で行う
①作成済みのプロジェクトを追加する
②アセンブリを参照する
③.Netのバージョンを一致させる

# ①作成済みのプロジェクトを追加する
ソリューションファイルを右クリック > 追加 > 既存のプロジェクト を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581044/23b66052-f9d2-be23-f97a-38a68877bad0.png)

追加したいプロジェクトの.csprojファイルを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581044/2868d938-04f2-eafd-cd27-230ff2212605.png)

プロジェクトが追加される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581044/9af18f48-9cee-91dd-e423-3544a5fea81b.png)

# ②アセンブリを参照する
参照元のプロジェクトの 参照 を右クリックし、参照の追加 を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581044/94a07c30-ef0e-9282-3338-6266cc81c10e.png)

参照先のプロジェクトにチェックを入れ、OKを選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581044/2e689d44-5323-30c3-6291-c3f79d93df0f.png)

基本はこれで他のプロジェクトが参照できる。
だが、どうしてもビルドが通らず、以下のエラーが出る。

```
error CS0246: 型または名前空間の名前 'Games' が見つかりませんでした (using ディレクティブまたはアセンブリ参照が指定されていることを確認してください)。
```

そんな時は.Netのバージョンがプロジェクトで異なっていることがある。

# ③.Netのバージョンを一致させる
プロジェクトのバージョンは、プロジェクトを右クリックして、プロパティから確認できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581044/9e421169-2c7b-fbdc-0452-e66154ba6c5f.png)

対象のフレームワーク の.NET Frameworkのバージョンについて、参照元よりも参照先の方が新しいと、上手に参照できない。バージョンを一致させるか、参照先の方を古いバージョンに変更する必要がある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581044/d308cb49-6813-7e24-5ba6-bc44b7d4465e.png)
TypeScript(Node.js)でテキストファイルを指定行数ごとに分割する

テキストファイルを分割したいときってありますよね。
例えばSQLの`INSERT INTO hoge VALUES`に続く行が数万行ある時とか (そんなにない)

個人的に上記をやりたいタイミングがあって、npmでいい感じのモジュールを探したんですが
意外とテキストファイルを「指定した行数で」区切ってくれるやつが無かったので泣く泣く自分で作りました。

あ、Nodeです。

Streamで順次処理してるので、でっかいファイルでもヒープアウトしないはず！

# Usage

```typescript:hoge.ts
import { FileSplitter } from "path/to/file-splitter"

// your-file.txtを100行ごとに分割する
const fileSplitter = new FileSplitter("/path/to/your-file.txt", 100)

// 分割開始！
fileSplitter.start()
```

# 御託は良いからコードを見せろ

```typescript:file-splitter.ts
import fs from "fs"
import path from "path"
import readline from "readline"

export class FileSplitter {
  private maxLines: number
  private identifier = 0
  private curLine = 0
  private lineReader: readline.Interface
  private currentWriteStream: fs.WriteStream
  private outputPath: string

  constructor(readFrom: string, maxLines = 500) {
    // 分割したファイル群を保存する先のディレクトリを作り、そのpathを保存
    this.setOutputDir(readFrom)

    this.maxLines = maxLines

    // 最初のWriteStreamを作っておく
    this.replaceWriteStream()

    // readlineに指定ファイルのReadStreamを食わせて行リーダーを作る
    this.lineReader = readline.createInterface({
      input: fs.createReadStream(readFrom)
    })
  }

  start() {
    this.lineReader
      .on("line", (line) => {
        // 現在の行数を保持 (1 ~ 指定行数 + 1までの値を取る)
        this.curLine++

        // ここ、もう少しうまくやりたかった人生だった
        const isOn = this.curLine === this.maxLines
        const isOver = this.curLine > this.maxLines

        if (isOver) {
          // 指定行数を超えたら新しいファイル向けのWriteStreamに切り替え、行数を1にリセットする
          this.replaceWriteStream()
          this.curLine = 1
        }

        if (isOn) {
          // そのファイル最後の行は改行無しにしている (が、例えば100行のファイルを30行とかで区切られると、最後のファイルには改行が入っちゃう。めんどくさくてこれ以上考えなかった)
          this.currentWriteStream.write(line)
        } else {
          this.currentWriteStream.write(`${line}\n`)
        }
      })
      .on("close", () => {
        // 一応掃除する
        this.closeWriteStreamIfExists()

        console.info("Done!")
      })
  }

  private setOutputDir(readFrom: string) {
    const extension = path.extname(readFrom)
    const fileName = path.basename(readFrom, extension)

    const splitFileBaseDir = `${path.dirname(readFrom)}/split-files`

    this.outputPath = `${splitFileBaseDir}/${fileName}`

    if (!fs.existsSync(splitFileBaseDir)) {
      fs.mkdirSync(splitFileBaseDir)
    }

    if (!fs.existsSync(this.outputPath)) {
      fs.mkdirSync(this.outputPath)
    }
  }

  private replaceWriteStream(): void {
    this.identifier++

    this.closeWriteStreamIfExists()

    const writeTo = `${this.outputPath}/file_${this.identifier}.txt`

    console.info(`Start writing to ${writeTo}.\n`)

    this.currentWriteStream = fs
      .createWriteStream(writeTo)
  }

  private closeWriteStreamIfExists() {
    if (this.currentWriteStream) {
      this.currentWriteStream.close()
    }
  }
}

```

# まとめ
readline標準モジュールにたどり着くまでの人生を無駄にした。

Streamをちゃんと考えて使ったことあんまりなかったのでちょっと楽しかった。
AutoHotKeyでソフトウェア起動時に意図しないOffice Online画面の抑止

# Win+Ctrl+Alt+Shiftの組み合わせ
Windowsのアップデート(1903)の影響で、Officeアプリが起動するショートカットキーに割り当てられたとのこと。

![office.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82414/36de0098-96f7-f6a4-9f87-846f93bc15c6.jpeg)

（画像サイズを縮小したいのだが・・・）

## [テラテイルで質問](https://teratail.com/questions/325307?whotofollow=#reply-450907)
私個人で解決できたわけではなく、ネットで質問したら回答が初めてついた。
で、その回答により、レジストリをいじることで、解決できるとのこと。

```terminal:コマンドプロンプト
REG ADD HKCU\Software\Classes\ms-officeapp\Shell\Open\Command /t REG_SZ /d rundll32
```

これを実行することにより、最初は何もキーが存在しない状態からキーを含むディレクトリが再帰的に作られた。

![登録前.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82414/16e23b85-cc64-25d7-8d56-8c169d5ff20e.jpeg)

以下、登録作業。

![command.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82414/71800924-3eff-ffc5-8f8e-d091f334b87a.jpeg)

以下が、登録後。

![登録後.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82414/47dc3e95-3433-a158-be87-a2c251183df0.jpeg)

おかげで抑止できたのはよかった。

プログラミング力やWindowsOS操作などよりも英語力が無ければ何も技術が身につかない・・・というより、問題を解決できないことを再実感した。
何より、日本語の[ヘルプ](https://support.microsoft.com/ja-jp/windows/windows-%E3%81%AE%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89-%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88-dcc61a57-8ff0-cffe-9796-cb9706c75eec)にないのは不思議だ。
以上。
Azureリソースグループ単位で予算を設定し、超えたらアラート通知する

Azureではある一定の利用額を超えたら通知する仕組みがあります。
サブスクリプション全体もできますが、リソースグループ毎に設定することもできるため、どのような通知になるのか試してみました。

# 予算作成
* AzurePortalの左バーより[コストの管理と請求]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/25f51bd8-80ed-24e4-9190-f248c38d1814.png)

* [コスト管理]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/4bdcb999-67e9-1da9-07ab-c37b515c7da9.png)

* [予算]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/f1f24692-1481-84df-d362-a1898442c9b6.png)

* [追加]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/33570cac-3989-3b0a-f9ff-5341ee3f95e9.png)

* デフォルトではサブスクリプションが選択されていますが、今回はリソースグループ単位で設定したいのでスコープを変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/42db04c8-ec9a-349e-020e-b84c9c9890dc.png)

* 予算管理したいリソースグループを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/c5555755-a6bf-252a-1721-e5c0affd50a0.png)

* 予算の名前を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/a78e083b-d617-5ac0-fef2-44055679daf6.png)

* リセット期間を選択します。今回は[課金月]を選択します。例えば請求が2/10～3/9の場合は、2/10時点で0円にリセットされることを意味しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/f315b261-6b74-8903-cc11-3ffdf4f348de.png)

* 予算評価を開始する月を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/317809df-6115-3154-0901-f4e0774ddfa2.png)

* いつまで予算評価するかを選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/036a6e86-dfe5-160a-5e60-6bd211edea38.png)

* 予算額を選びます。今回は5,000円にしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/06df4bd0-ef8c-e63a-9587-89c863fbc93e.png)

* [次へ]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/cddc35bc-7625-77b3-9b44-b9a7904e25ce.png)

# 通知設定

* 通知する予算の割合を選びます。今回は30%で設定しました。30%だと1,500円を超えたらアラートということになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/4866c619-9aff-801a-a0f6-8890f7a01b7d.png)

* [アラートの受信者]に通知先メールアドレスを指定します。（アクショングループを指定してもよいです。アクショングループの作成は割愛します）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/7051e3ea-ea74-1b2f-7f6c-ace6e448eb02.png)

* 言語を[日本語]に設定しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/098d6449-f6b6-1971-c1ae-6ff9b86c4ee9.png)

* [作成]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/43a88357-098b-e868-caf8-43e6310c78b1.png)

* 予算が作成されていればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/c25a6d85-0b7d-6770-c508-97a81e8ed2c0.png)

# 予算超過アラート
* 予算超過するとこんな感じでメールが届きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/4f412636-b59c-03d7-a6a2-b6fb724a4aac.png)

以上
【Scanpy, scRNA-seq】ScanpyのUMAPに再現性を持たせる

## 起きていた問題
Scanpyで描いたUMAPに再現性がない。
予想としてはPCAの部分で相違が生まれていそう。

## 環境

[こちら](https://hub.docker.com/layers/139333159/taowata/jupyterlab-scanpy/BBKNN-1.4.0/images/sha256-82b733309f1a0a0fc6c0b543c0291a2a1886f42d453337b2cb45e4a412b0cfe1?context=explore)のDockerイメージをスパコンのSingularityコンテナとして利用。
バージョン情報:

```
scanpy==1.7.0 anndata==0.7.5 umap==0.5.1 numpy==1.19.2 scipy==1.5.2 pandas==1.1.3 scikit-learn==0.23.2 statsmodels==0.12.0 python-igraph==0.9.0 louvain==0.7.0 leidenalg==0.8.3, 
```

## 解決方法
[#1187](https://github.com/theislab/scanpy/issues/1187)で議論されているように、環境変数`OMP_NUM_THREADS`を設定し、BLAS librariesが使用するCPU数を制限することで再現性が確保された。

```python
import os
os.environ['OMP_NUM_THREADS'] = '1'

import numpy as np
import pandas as pd
import scanpy as sc

〜以下省略〜
```

## 疑問・補足
ローカルのDockerコンテナおよびJupyterLab上では、同様にしても再現性を確保できなかった。
なぜ?

また今回は上記の環境変数`OMP_NUM_THREADS`のみの指定で再現性が確保されたが、
[#313](https://github.com/theislab/scanpy/issues/313)で取り上げられている通り、ハッシュランダム化を無効化する、

```python
os.environ['PYTHONHASHSEED'] = '0'
```
についても指定しておいたほうが良さそう。
bootstrap_ドロップダウンが表示されない

rails tutorial 8章をしていたところ、
ドロップダウンを表示させるのに手こずりましたので、メモに残しておきます。


#解決前


```_header.html.erb
<header class="navbar navbar-fixed-top navbar-inverse">
  <div class="container">
    <%= link_to "sample app", root_path, id: "logo" %>
    <nav>
      <ul class="nav navbar-nav navbar-right">
        <li><%= link_to "Home", root_path %></li>
        <li><%= link_to "Help", help_path %></li>
        <% if logged_in? %>
          <li><%= link_to "Users", '#' %></li>
          <li class="dropdown">
            <a href="#" class="dropdown-toggle" data-toggle="dropdown">
              Account <b class="caret"></b>
            </a>
            <ul class="dropdown-menu">
              <li><%= link_to "Profile", current_user %></li>
              <li><%= link_to "Settings", '#' %></li>
              <li class="divider"></li>
              <li>
                <%= link_to "Log out", logout_path, method: :delete %>
              </li>
            </ul>
          </li>
        <% else %>
          <li><%= link_to "Log in", login_path %></li>
        <% end %>
      </ul>
    </nav>
  </div>
</header>
```

```application.js
//= require rails-ujs
//= require jquery
//= require bootstrap
//= require turbolinks
//= require_tree .
```

チュートリアルに記載されているようにしたのにドロップダウンが表示されない。。。
jqueryとbootstrap読み込んでいるのに。

#解決後

```apprication.html.erb

<script src="https://code.jquery.com/jquery-3.4.1.slim.min.js" integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js" integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" crossorigin="anonymous"></script>

```

apprication.html.erbのhead部分に上記を加えるといけた。

ドロップダウンを使うなら、jquery、 popper.js、 bootstrap.min.js が必要ですよってことらしく、これはCDNから読み込んでいるらしい。


apprication.heml.erb でjqueryとbootstrapを読み込んだけど、アセットパイプラインに指示するのではだめだったのか？


難しい。
Android Studioに独自のキーボードショートカットを設定

Android Studioを用いてFlutter開発していると、定期的にコードを見やすくするために
右クリックしてReformat Code with dartfmtして、、、みたいなことを何回もやってたりしていました。

何回もやる作業なので、
Reformat Code with dartfmt
をショートカットキーに追加したい！と思い、誰かの参考になるかもしれないので残しておきます。

### 1. Android studio →　preference（⌘＋,）　→ keymap
AndroidStudioを開いた状態で、⌘＋,を押すとpreferenceが開くので、その中のkeymapの項目を見ます。
![スクリーンショット 2021-03-01 23.37.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/998564/6679b3b7-2336-0440-b569-58f075791966.png)


### 2. 設定したいキーを検索
設定するキーを検索画面で検索します。
reformatと検索すると下のようにReformat Code with dartfmtが出てきました。
![スクリーンショット 2021-03-01 23.44.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/998564/c6a6e4ec-fddf-7541-ee65-8e95bce645a1.png)

### 3. ショートカットーキーを設定
右クリックして「Add Keyboard Shortcut」をタップすると、ショートカットキーを設定できます。
自分の場合は、「control＋Shift＋F」に設定しています。
他のショートカットキーがすでに割り当てられている場合、メッセージが出てきますので、ダブらないキーを設定してください。
当初、自分は「shift＋R」を割り当てていたのですが、大文字のRが打てなくなってしまったので変更しました（苦笑）。

少しでも快適な開発ができますように。

※参考
https://developer.android.com/studio/intro/keyboard-shortcuts?hl=ja
playwright-pytestで失敗時の動画を撮っておく

## まえおき

playwright-pytest を使ってE2Eテストを始める方法については、以前に以下の記事で紹介した。

https://qiita.com/YusukeIwaki/items/149859a0a508933a8a64

ここでは、失敗時の画面キャプチャを撮る方法までは書いたが、実際に自動試験スクリプトを書いていると「どうしてそうなった？！」と思うことが稀によくある。（しかも、そんなテストに限って、じっと見張っていると何回やってもpassしたりするw）

不毛すぎるので、見張らなくてもいいようにエビデンス動画を残しておきたいと思うのがエンジニアである。

## playwright-pythonで動画を撮る方法

[playwright-python](https://github.com/microsoft/playwright-python) には、自動操作中の動画を記録する機能がある。

以下の記事でも言及されているように、 `browser.new_context()` もしくは `browser.new_page()` の引数に `record_video_dir: ./videos/` のように指定すればいい。

https://qiita.com/mainy/items/3a9de19f440991f67f34

ただ、これはplaywright-pythonの話であり、そのままplaywright-pytestでは運用できない。なぜかというと

* 成功時の動画はべつに要らない
* 失敗時の動画は「ディレクトリに置いてあるのを見ろ」だと面倒なので、Allureレポートに添付したい

（特に２つめの理由が大きい）

## playwright-pytest でAllureレポートに失敗時の動画を添付する方法

本題。

### 動画を撮る

テスト開始時に、そのテストが開始するか失敗するかはわからないので、動画の記録自体は無条件に行う。

playwright-pytestのソースを見ると、new_contextに渡す引数は `browser_context_args` でカスタマイズできるようになっているので、適当にconftest.pyあたりに以下を追加する。

```python
@pytest.fixture(scope="session")
def browser_context_args(browser_context_args, tmpdir_factory: pytest.TempdirFactory):
    return {
        **browser_context_args,
        "record_video_dir": tmpdir_factory.mktemp('videos')
    }
```

`record_video_dir` は一時ディレクトリを作って、テスト終了後には消える場所にしているのがポイント。

### テスト失敗時のレポートに動画を添付する

```python
def pytest_runtest_makereport(item, call) -> None:
    if call.when == "call":
        if call.excinfo is not None and "page" in item.funcargs:
            page: Page = item.funcargs["page"]

            # ref: https://stackoverflow.com/q/29929244
            allure.attach(
                page.screenshot(type='png'),
                name=f"{slugify(item.nodeid)}.png",
                attachment_type=allure.attachment_type.PNG
            )

            video_path = page.video.path()
            page.context.close()  # ensure video saved
            allure.attach(
                open(video_path, 'rb').read(),
                name=f"{slugify(item.nodeid)}.webm",
                attachment_type=allure.attachment_type.WEBM
            )
```

スクリーンショットを撮ったあとの video_path = ... からの処理が動画の記録部分。

Playwrightの動画記録は、BrowserContext#close したタイミングで書き込みが完了されるので、明示的にcloseを読んで動画ファイルを確定させてからattachしているのがポイント。
もし明示的にcloseを呼ばないと、0秒の動画が貼り付けられたり、手順の途中で切れた動画が添付されたりするので注意。

Allureレポートでは、以下のように、事象が起きたときの様子を見ることができる。

![playwright-pytest-recordvideo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74571/72b0bd96-1ba2-5613-ac1f-33941287b76f.gif)


## まとめ

Flakyテストを眺めるのがしんどくなってきたので、自動テストの動画を撮る方法を調べてまとめました。
これで自動テストを放置して、コンビニにコーヒーを買いに行ける！（笑）
【Swift5】UIScrollView上のUIButton上でスクロールできない


##事象
個人開発で、スクロールビュー上にUIButtonを配置して
ドロワーを実装した時、UIButton上でスクロールできない問題に
ぶつかったのでその時の解決策をメモ

##原因

まず、UIControlに準拠するUIButton上では、
スクロールイベントが発火しない。

>[UIScrollView touchesShouldCancelInContentView:] The default returned value is YES if view is not a UIControl object; otherwise, it returns NO.

https://developer.apple.com/library/ios/documentation/uikit/reference/UIScrollView_Class/Reference/UIScrollView.html#//apple_ref/occ/instm/UIScrollView/touchesShouldCancelInContentView

これはどういうことかというと、タッチ対象がUIControlオブジェクトの時、
UIButtonの時は、touchesShouldCancelがfalseで返ってくる。
つまり、タップイベントがキャンセルされない。

##解決

この問題を解決するには、UIScrollView上のUIButton上では
touchesShouldCancelInContentViewでtrueを返してあげれば良い

###カスタムクラスを作成

```Swift
class CustomScrollView: UIScrollView {
    
    /// ScrollView上のボタン上でドラッグした時、ドラッグを優先する(tagを1にしておく
    override func touchesShouldCancel(in view: UIView) -> Bool {
        if view.tag == 1 {
            return true
        }
        return super.touchesShouldCancel(in: view)
    }
}

```

###tagを設定しておく
カスタムクラスの

```Swift
view.tag == 1
```
を見ると、"tagが1の時"という条件がついている。
storyboard、もしくはコード上で対象のUIButtonオブジェクトのtagを1に設定しておくことで、
この条件式が使える。


##終わりに
壁にぶつかっている時はスムーズに開発できずに苦しいけど、
できることをやっている時は成長していない時だと思えば
壁に立ち向かいやすくなるかもしれない。
そうだ、SQLの勉強をしよう22

#はじめに
実際に業務で使っているテーブルを直接触るのは怖いと思っていたのですが、今日学習したビューを活用すれば、間違ええ値を変更したり、削除したりすることがなくなり、安心して分析ができそうです。


##ビューとは
仮想的に、テーブルを作り出すことができます。
元のテーブルの一部分を取り出して、そこに対してSELECT文を行うことができます。
ほぼ、SELECT文しか使えないため、検索して分析したいときに使うと、多少命令文が短くなって便利なのかもしれません。
イメージとしては、作業用のテーブルといった感じでしょうか。

##ビューの作成

```sql
CREATE VIEW 任意のビュー名 AS SELECT文
```
何度も検索にかける部分を取り出すときに使います。その部分をSELECT文に記述します。
例えば、○月の値など…

##ビューの削除

```sql
DROP VIEW ビュー名
```
主な使用目的が終了したら、削除しておいた方が容量を喰わなくて良さそうです。

##最後に
Railsでもビューという言葉が出てきたが、全く違うものだったので、使う文脈には気をつけたいと思います。
Microsoft Store に繋がらない環境でも WSL2 で Linux ディストリビューションを利用したい

WSL2、便利ですよね。任意の Linux ディストリビューションパッケージを Microsoft Store からインストールするだけで、気軽に「本物」の Linux 環境を構築できます。

一方でこの手順だと、Microsoft Store に接続できなかったり、アプリの購入・インストールが塞がれていたりする環境では導入できません。そこで、Microsoft Store を経由せず Linux ディストリビューションを導入する方法を探してみました。

## ディストリビューション パッケージを手動でダウンロードする

今回のようなケースを見越して、Microsoft はオフィシャルにページを用意しています：

[Linux 用 Windows サブシステム ディストリビューション パッケージを手動でダウンロードする](https://docs.microsoft.com/ja-jp/windows/wsl/install-manual#downloading-distributions)

上記のページから任意の Linux ディストリビューションパッケージをダウンロードしましょう。ダウンロードしたファイルを開くと下記のような画面が表示されるので、インストールします。

![debian-appx-wsl2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463374/cec4b8e6-2c3a-6a4c-ddb0-c013b5db70d3.png)

公式マニュアルでは `Add-AppxPackage` コマンドレットでインストールする方法が案内されています。

```powershell
Add-AppxPackage <ファイル名>.appx
```

## 手動で任意の場所にディストリビューションをインストールする

上記の手順でインストールに失敗した場合は、手動でのインストールに挑戦してみましょう。Appx・AppxBundle 形式のインストーラは [msix などと同様](https://qiita.com/yokra9/items/b5d1318f5474e0812c16)実態としては Zip 形式のアーカイブであり、適当な圧縮解凍ソフトで内容物を抽出できます。

![debian-7zip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463374/f20def27-35a0-4188-780e-28e6d70de518.png)

内容物を任意の場所に設置し、`<ディストリビューション名>.exe` を実行すると WSL2 でディストリビューションが起動します。このタイミングでディストリビューションの設置場所が WSL2 に登録されます。

## 「指定されたパスが見つかりません」エラーが発生した場合

このエラーは WSL2 に登録されているパスにディストリビューションが見つからないときに発生します。上記手順で試しに起動してから設置場所を変更したときなどに起こりえます。

このような場合は、手動で WSL2 から前回の登録を解除します：

```powershell
# 登録されているディストリビューションを一覧表示します。
PS> wslconfig /l
Linux 用 Windows サブシステム ディストリビューション:
docker-desktop-data (既定)
docker-desktop
debian

# ディストリビューションの登録を解除します。
PS> wslconfig /u <ディストリビューション名>
```

## インストールしたディストリビューションからインターネットに接続できない

ファイアウォールに邪魔されている可能性がありますので、一時的にオフにしてみましょう。特に Microsoft Store への接続を防ぐようなガチガチの環境だと第一に疑った方が健康に良いでしょう。もしファイアウォールが原因だと判明したら、[Windows 側で Squid や stone などを利用してプロキシサーバーを立てることで問題を回避できる可能性があります。](https://qiita.com/yokra9/items/6cf0068557ff62afb551)

## 参考リンク

* [Linux 用 Windows サブシステム ディストリビューション パッケージを手動でダウンロードする](https://docs.microsoft.com/ja-jp/windows/wsl/install-manual)
* [Can't launch Debian after downloading with curl - error 0x800704cf](https://www.reddit.com/r/bashonubuntuonwindows/comments/eng56k/cant_launch_debian_after_downloading_with_curl/)
* [Add symantec to the list of firewalls which blocks WSL #1046](https://github.com/MicrosoftDocs/WSL/pull/1046)
ハーバード大のWEB講座でRを使ったデータサイエンス入門をやってみる Part.2 Data型

これからガッツリ難易度上がってきそうな気がするので心折れないように学習していきたいと思います。今回はデータの型についてやるようです。

（[第一回](https://qiita.com/Wataru-Tanada/items/6c201d59d03ce3ea31d9)はこちら）

#1.データフレーム
どうもデータをひとまとめにエクセルっぽくまとめたものをデータフレームというらしいです。エクセルっぽくとかいうと怒られそうですが気にせず先に進めます。

```
#dslabsのライブラリを使えるようにする。
> library(dslabs)
# 関数dataにmurdersを読み込ませる
> data("murders")
# murdersのクラスを見る。データ型のこと？
> class(murders)
[1] "data.frame"
> 
```

murdersがよく出てくるので物騒に思われる方もいるかもしれませんが、これは統計の例としてアメリカの犯罪発生数をサンプルデータとしてインポートしてるからですね。続いてデータの中身を見てみましょう。

```
> str(murders)
'data.frame':	51 obs. of  5 variables:
```

strはストラクチャーのことです。51個（アメリカの州の数）のデータに5種類の項目があるようですね。そのうち頭の何個かのデータを出すのはheadでやるとのことです。names(murders)とかもあるようなので入力して試してみてください。

#2.データフレームの操作のしかた

```
> head(murders)
       state abb region population total
1    Alabama  AL  South    4779736   135
2     Alaska  AK   West     710231    19
3    Arizona  AZ   West    6392017   232
4   Arkansas  AR  South    2915918    93
5 California  CA   West   37253956  1257
6   Colorado  CO   West    5029196    65
```

次はアクセサを使って項目ごとにデータを見てみます。

```
> murders$population
 [1]  4779736   710231  6392017  2915918 37253956
 [6]  5029196  3574097   897934   601723 19687653
[11]  9920000  1360301  1567582 12830632  6483802
[16]  3046355  2853118  4339367  4533372  1328361
[21]  5773552  6547629  9883640  5303925  2967297
[26]  5988927   989415  1826341  2700551  1316470
[31]  8791894  2059179 19378102  9535483   672591
[36] 11536504  3751351  3831074 12702379  1052567
[41]  4625364   814180  6346105 25145561  2763885
[46]   625741  8001024  6724540  1852994  5686986
[51]   563626
```

#3.データフレームの一部を割当して操作する
次は変数に1つのカラムのデータを割当してそのデータの個数を見てみます。データのひとまとまりをVector（ベクトル？）というらしいです。

```
> pop <- murders$population
> length(pop)
[1] 51

#別の書き方
> pop <- murders[["population"]]
> length(pop)
[1] 51
```

VectorにはCharactor Vector とか Logical Vectorとかあるみたいですね。あとはFactor（別名：Categorical Data）です。levelsで見れるようです。

```
> levels(murders$region)
[1] "Northeast"     "South"         "North Central"
[4] "West"
```

Factorは文字じゃんって思うんですが、どうもLevelsでやった方が文字よりメモリ効率がいいので使うらしいです。計算量が多くなってくると違うんでしょうか...。

ここまででセクション1は終わりです。テストではいきなりtableを使いだしてびっくりしましたが、冷静に問題読んで慎重に解答すればだいたい解けると思います。あとはこの投稿の第一回と第２回を読んでもらいつつ、手元のRStudioで操作やり直してみたりするのもいいかもしれません。

（[第三回](https://qiita.com/Wataru-Tanada/items/68d122a408221ad53223)へ続きます）
プログラミング現場未経験者が開発現場でバリバリ働くプログラマーから学んだ事

現在オンラインプログラミングスクール、やんばるエキスパートにてRubyとRuby on Railsを学習中です。
開発現場でバリバリ働くメンターさんが仰っていた言葉と学んだエッセンスをシェアします。
今後、現場で働く時の参考になればと思います。

## エラー処理は切り分けが大事
エラー処理はどこまでが正常に動いていて、どこが問題になっているのかを切り分ける事が大事。

## １つ１つの行動の理由付けをする
１つの行動に対して理由が必要です。例えば、あるコードを消す・書くなどという時に、「なぜその行動を取ったか？」を説明できないといけないと仰っていました。「なんとなく」ではいけません。

## 素早くタスクをこなす為に必要なこと
埋め込みたいコードなど、わからない事はすぐにググります。考える時間を減らす事が大事です。
コードを手打ちできる事も大事ですが、知っているコードはコピペしてしまいましょう。
フォームを作成する時など、他の所から引っ張ってこれそうな部品があれば、流用しちゃいましょう。時間の短縮になります。
文字の修正などはなるべく、最小限の行動で行いましょう。例えば、全部書いてから消すのではなく、使える文字は消さずに間違っている所だけ修正するなどです。

## 画面を信じるな。ログを信じろ。
画面上では上手く表示されているように見えても信じてはいけません。裏側の処理を見る事が大事です。という事で、ログや走っているSQL文を見て、コードが上手く動いているのかを判断します。（但し、バックエンドの場合は！）

フロントエンドの場合は画面を信じましょう！

## まとめ
一番の感想は、現場でバリバリ働かれている方は行動に無駄が少ないと感じました。
コードを打つ、消す、引っ張ってくるにしても、全てにおいて無駄がない。
１つ１つは細かな事かもしれませんが、そうやって無駄を少なくしていく事が、
一流のプログラマーに近づく第一歩なのかなと思いました。
【学習メモ】 AWS　Aurora


#Aurora
高性能、低コストのDB。

特徴：
・高並列処理によるストレージアクセスのクエリを高速処理することできる。
・大量の書き込みor読み込みを同時に扱うことができる。
・DBの集約やスループット向上が見込まれる。
・MySQL／PostgreSQLと互換性がある。
・分散型なので、耐障害性&自己回復性、スケーラビリティがある。


##特徴：耐障害性&自己回復性
・3つのAZに2つのコピーを設置可能
・過去のデータをそのままS3に継続的に増分バックアップ
・リストア：差分適用がなく、どのタイミングでも安定リストアできる。

#Auroraの仕組み
![auroraの仕組み.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1082021/efd2ac9d-1d9b-d60a-7beb-5fc78c990294.png)


エンドポイントより接続し、書込みの場合はマスタに接続、読取の場合はレプリカに接続する。
また、マスタは障害が起きた時、レプリカにフェイルオーバーする。

MySQLやPostgreSQLのスナップショットからをAuroraに移行することできる。
CSSでアンダーバーが消えない時の対処法

link_to等リンク関連の記述をすると、どうしても文字の下にアンダーバーがでます。
それらの消し方を備忘録として書いていきます。


##解決方法

[例]

```
dog-name {
  text-decoration: none;
}
```

上記の記述で大抵は消えてくれますが、
**消えない場合**があります。

そんな時はこちら

```
a {
  text-decoration: none;
}
```

indexや他のhtmlで　**< a >タグ**　を使っていなくても
この記述で消えてくれました。

　　

カーソルを当てた時だけアンダーバーを出したい時は

```
a {
  text-decoration: none;
}
```

```
a:hover {
  text-decoration: underline;
}
```

この二つをセットで使うと
**hover時**に下線が浮かび上がります。
polymorphic: trueとなっているポリモーフィックなモデルを結合する方法

## 概要

ActiveRecordを用いて内部結合、外部結合をするためのjoins, left_joins, eager_load, includes, preload...などなど、さまざまな種類がありますね。

これらの細かい違いについては、ここでは解説を省略させていただきます。

下記に掲載したQiita記事は、僕も実際に参考にさせていただき、非常にわかりやすいと感じたので共有させていただきます。

https://qiita.com/k0kubun/items/80c5a5494f53bb88dc58

https://qiita.com/yuyasat/items/c2ad37b5a24a58ee3d30

https://qiita.com/ryosuketter/items/097556841ec8e1b2940f



では、本題に入りたいと思います。


## 今回やりたいこと

RailsのActiveRecordでポリモーフィックにしているモデルと別のモデルとを結合させて、両モデルからデータを取得したい


## 結論

ポリモーフィックなモデル（polymorphic: trueにしている）と別のモデルとを結合させたい時は、どうやら**preloadメソッド**一択らしいです。

下記のページには

>
This error is raised when trying to eager load a polymorphic association using a JOIN. Eager loading olymorphic associations is only possible with ActiveRecord::Relation#preload.
>

といった記述があります。

簡単に翻訳すると、「ポリモーフィックなモデルのアソシエーションを読み込みは、preloadでのみ可能です」といった感じです。

https://api.rubyonrails.org/v5.1/classes/ActiveRecord/EagerLoadPolymorphicError.html

## まとめ

今回はActive Recordのポリモーフィックのモデルの結合について書きました。

ポリモーフィックやらモデル結合らへんの話は、結構よくでてくると思うのでぜひ参考にしてください。
【初心者でもわかる】文字の縁取りにも使える！box-shadowやtext-shadowを太く濃くする方法

#どうも7noteです。影を太く、濃くする方法についての考察

cssで影を作るときに使われる、box-shadowとtext-shadowですが太さや濃さといった部分の調整って結構難しい。

そんな時の解決方法について考えてみました。

## 対処法①： 色を濃い色を使ってみる。

これはいうまでもなくですね。もし薄い色を使っているのであれば、単純に濃い色を使うことで解決できるかもしれません。色も濃い方がハッキリみえるので若干太くもみえます。

でも真っ白の影をより濃くしようとおもっても、なかなか難しいので、この方法では難しいかもしれません。

## 対処法②： 影を重複して書く

影を濃くしたい時に一般的に使われる方法がこれです。
cssの影はカンマ（,）でつなぐことで、複数指定することができます。

```sample.css
/* 例 */

text-shadow    : 
   2px  2px 1px #003366,
  -2px  2px 1px #003366;
}
```

## 対処法③： ツールを使う

わざわざ計算しなくても、ツールを使うことで簡単に影を作ることができます。
こちらのツールは文字の縁取りを簡単にできるツールです。
縁取りで太くなった分の字間まで自動調整してくれるすぐれものです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/7ce84629-7318-59e2-886c-c95ceeea73d1.png)

https://webparts.cman.jp/string/outline/

## まとめ

現状完璧に思い通りの太さや濃さの影を作るには少々クセを掴まないと作れません。
でもそこをカバーしてくれるのがツールなので積極的に使って時短をして、空いた時間はほかのところに使っていくのがいいのかなと思います。

#### おそまつ！
~ Qiitaで毎日投稿中!! ~
[【初心者向け】WEB制作のちょいテク詰め合わせ](https://qiita.com/7note)
SVN 基本コマンド 

#【SVN 基本コマンド】

SVNの基本コマンドを予習する必要があるためまとめました。
（SVNは極力使いたくない。。Gitと相違しているところもあるし。。）

##今後、使いそうなSVNコマンド

<strong>追加</strong>　svn add

<strong>削除</strong>　svn rm

<strong>移動</strong>　svn mv

<strong>更新</strong>　svn update

<strong>詳細確認</strong>　svn cat

<strong>状態確認</strong>　svn status

<strong>差分確認</strong>　svn diff

<strong>ログ確認</strong>　svn log

<strong>コミット</strong>　svn commit

<strong>マージ</strong>　svn merge

<strong>リポジトリ複製</strong>　svn checkout

<strong>ブランチ切替</strong>　svn switch

<strong>変更取消</strong>　svn revert
未経験からweb系自社開発企業内定までの過程の築き方と今後のキャリア形成

#この記事を書くにあたり

今私は契約社員ではあるが、
ベンチャー企業にて開発部門にて戦力になるべく奮闘中。
少し客観的な視点でここまでの道のりと今後の目標などを踏まえ、
反省点なども含め時系列で整理していこうと思う。
また、未経験スキルでの転職のリアル感が伝わればどんな感じで転職の道が進んでいくのか、
よりわかりやすいと思うのでその辺も書いていきたいと思う。

#簡単な経歴
- 高校を卒業してインフラ系の会社に入社。
 - 数年間、機械や装置を扱うオペレーターを担当、簡単なシーケンスなども作成。

- 1社目のインフラ系の会社を辞める半年前にプログラミングスクールに入校。
 - 選択した言語はJavaとSwift。

- 空白期間を経て、コールセンターへ入社。
 - 担当はテクニカルサポート。

- SES会社へ入社。
 - 緊急事態宣言の影響でどこへもアサインできず社内待機を過ごす。

- コールセンターへ入社。
 - 経験を生かしてテクニカルサポートを担当。

- テスター求人を見てベンチャー企業へ入社。
 - 現在に至る。

#全くの未経験期間

###プログラミングスクールを探すまで
今でこそ、転職のノウハウは良い意味でも悪い意味でも慣れた物だが、まず、10年もいた会社から転職するということが未知の世界であったため、何をして良いか分からない状態であった。
電車の中吊りで転職サイトの広告を見て気になるなと思う程度でその先はどうなっているのかすらわからないって感じ。
なので、転職について色々とググってみたりYouTubeを見たりしたものだった。

この状態では正しい情報を見つけ出すのって相当難しい。
少し端折るが、そんなこともありパソコンのスキルが相当落ちていたと実感し、先ずはスクールを探した。
結局は実際に校舎がある老舗のスクールへ入校した。
結果的には、当時の自分にとっては問題ない入校だった。
なぜなら、当時は分からなかったがパソコンのスペックもエンジニアが持つ物ではなかったので結果的によかったと思う。
その程度の知識であったのだった。

###入校後の受講プログラム
当時受講したのが、JavaとSwift。
正確に言えばAndroidとiPhoneアプリ作成コース。
なぜこのコースを選んだかといえば、単純にアプリを作ってみたかったからということと、
メジャーな言語であるJavaも習うことができるということ。
結果的にこのコースを選んだのは少し遠回りだった気もした。
Web制作コースやPHP、JSなどの言語を選んでおけばとも後々思ったりもしたが、
今の仕事をしている段階では全く役に立たないとも思ってはいない。
幅広い視点を持つことは全然問題ないことでもあるし、
情報系などの大学も出ていない私にとってJavaは言語の基礎を教えてくれたと言っても過言ではないだろう。
その後で、自分で調べて学べば良いという思考になったので、あとは何も問題ない。
話を戻すと、Javaを中心に受講させてもらい、オマケ程度にアプリ作成といった感じで半年ほどで受講を修了した。
コンパイルとは何か。
２進数、16進数、、、
機械語とは。
などなど
少しアカデミックなことを触れてコーディングに入っていき、
演習問題の繰り返しだった。

###初めての転職フェア
そんなこんなで1社目はさっさと辞めてしまわないと辞めづらく、精神的にももたないので、
転職ができなくても辞めるつもりでいた。
とはいえのんびり転職を待つのもよくないので、
先ずは転職フェアに参加してみることにした。
知っている人なら知っている転職フェア。
あれはいわゆるSESフェア。
まあ、わかるとは思うが行かない方が良い。
分からない人にとってはIT業界ってああいうところなんだと洗脳されかける。

面接を受けてみたり、エントリーをしてみるがが上手くいかない。

###コールセンター（テクサポ）へ
そんなこんなで仕事をしないのもよくないので、
コールセンターへ流れ着く。
転職後はほとんどをコールセンターで過ごすことになる。

###朝活でPHP
コールセンターにずっといるわけにもいかないので、
朝の喫茶店で毎日就業前にPHPの勉強をすることにした。



###緊急事態宣言を抜けてのベンチャーへ
色々あってコールセンターを行き来するのだが、
ようやくベンチャーでテスター業務から携わることになるわけだった。
それができたのも、
結局はReactでFirebaseにデプロイまで行けた知識を持てたということ。
コードを書いているだけでは話が薄っぺらくなってしまう。
そして、入社して思うのは実務経験に勝るものはないということ。
お金を貰いながらその業務に専念することでのスキルアップは格段に違う。
ようやく、ポジションに来れたのだから、
コーディングだけでなく、テストケースの作成、サーバー、インフラ側の知識、RDBやAPIのことなど、
いままで自分だけでは時間を割くことができなかったことにもやっていくことができるのではないだろうか。
周囲の優秀なエンジニアに囲まれて仕事ができることがいかに幸せなことか、
昨今の転職の大変さを聞いてよく身に染みる。

今も少しずつコーディングをしているが、
EC2ぐらいを使って繋げられたらと思っている。

JenkinsやCircleciを使って自動テストの知識についても増やしていきたい。
AWSを学ぶのならDockerもやりたいわけだ。

学ぶことは多い。
フロントの勉強をしていると、
限界を感じることが多く、
向上心があればどうしてもインフラ周りにいきたくなる。
なるほど、フロント側にフルスタックが多いのも納得と思った今日この頃。
Rails Slackへメッセージを送信

<h1>前提条件</h1>
・ruby 2.6.6
・Rails 6.0.3.2
・macOS Catalina バージョン10.15.7

<h1>概要</h1>
　webアプリ内で特定のアクションが起きた時にSlackへ通知する機能を実装したいと思い
実装の備忘録としてここに記す。
　思ったよりかなり簡単だったので、ぜひご自身のwebアプリに活用していただけると幸いです。

<h1>gem 'slack-notifier'の導入</h1>
　slackへ通知を送るにはgemを導入する必要があります。

```ruby:Gemfile
gem 'slack-notifier'
```
```ruby:ターミナル
bundle
```
これでgemの導入が完了します。

<h1>Slack側準備</h1>
　まずチャンネルのWebhook URLを取得するために、下記のURLにアクセスします。　

　https://slack.com/services/new/incoming-webhook

　ここでRailsからの通知を受け取るチャンネルを設定します。既存のチャンネル、もしくは新規にチャンネルを作ってもどちらでも可能です。
　チャンネルを入力後、Incoming Webhook インテグレーションの追加をクリック。
その後に表示される、Webhook URLを取得します。

<h1>Slackに通知を飛ばす</h1>
　飛ばしたいアクションの中に

```ruby
notifier = Slack::Notifier.new(
  'WEBHOOK_URL', 
  channel: '通知を送りたいチャンネル名',
  username: 'notifier',
)
notifier.ping 'ユーザーが投稿を作成しました！'
```
と書き込みます。
最後に先ほど取得したWebhook URLを'WEBHOOK_URL'に入力します。
これで実装が完了となります。実際にアクションを起こし確認してみてください。
また、そのままWEBHOOK_URLを書き込むより、gemのdotenv-railsを使用したりして
環境変数として設定するといいと思います。

<h1>参考文献</h1>
・RailsプロジェクトでSlack通知を実装する
https://tech.mof-mof.co.jp/blog/rails-slack-notifier/
Lightning Experience のナレッジの基本 ⇒ Lightning Knowledge の使用開始

１．知識ベースとは何ですか?
２．知識ベースで生産性を向上する方法はどれですか?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/4316ea36-35b7-d8a3-2e00-a9f61b65fa96.png)
40代おっさんNAT gateway 経由してEC2に繋げてみた


## 本記事について
本記事はAWS初学者の私が学習していく中でわからない単語や概要をなるべくわかりやすい様にまとめたものです。
もし誤りなどありましたらコメントにてお知らせいただけるとありがたいです。

## AWS作成図
![vpc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641940/b9dc8ad4-bba8-2910-9975-96abff578ad3.png)

VPC部分については
<https://qiita.com/kou551121/items/2535fe3de57a5c813687>
EC2部分については
<https://qiita.com/kou551121/items/56f2e075d33fbf345787>

## 構築手順
❶ private subnet にEC2インスタンスを設置

❷ public subnetにあるEC2インスタンスを踏み台にしてprivate subnetのEC2にログインする。

❸ NAT gateway を作成してNAT gatewayを通信の出口用としてprivate subnetのEC2インスタンスにログイン

## 1. private subnet にEC2インスタンスを設置

ではまずEC2ダッシュボードに画面遷移してください

![プライベートEC2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641940/2e805440-892d-e4ed-e501-ffa858e84341.png)

インスタンスを起動をクリック（赤枠）

![アマゾンlinux.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641940/f6bbc9ca-ac4d-b759-771c-d6daab96958f.png)

Amazon Linux 2 AMI (HVM), SSD Volume Type　を選択（赤枠）

![インスタンスタイプ選択.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641940/ab765b52-a518-04a5-7be1-e61b7a7e9328.png)

t2.micro　を選択（赤枠）
右下にある　「次のステップ：ストレージの追加をクリック」

![インスタンの詳細.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641940/193e5843-4f93-9a41-6717-36d5a9a5188d.png)

赤枠に自分の作ったVPC（自分はTest-VPC）を選択
青枠は自分の作ったサブネット（今回はTest-subnet-private)を選択
黒枠は有効にしてください
終わったら「次のステップ：ストレージの追加」（緑枠）をクリック

![ストレージの追加.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641940/c17b01f5-4f4c-016e-f4af-577a3a8b6d05.png)

ここは何もせずそのままで（必要あれば変えてください）「次のステップ：タグの追加」（赤枠）をクリック

![タグの追加.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641940/cfe40e96-1616-dfba-c401-6b5ff336322e.png)

赤枠にはNameを入れてください
青枠にはTest-EC2-privateを入れてください
黒枠「次のステップ：セキュリティグループの設定」をクリック

![セキュリティグループの設定.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641940/433c3079-4507-8dec-080b-e32b347c4f3b.png)

こちらは今回は何もせず右下の確認と作成をクリック
（必要であれば変えてください）

次の画面で確認を行い、問題がなければ右下の起動をクリック
![キーペア.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641940/af9f827d-e565-85a5-5cd6-7f4152baa24e.png)

今回はキーペアを作らず既存のキーペア（赤枠）を使用します。
Test-Key（青枠）を選択
終わったらインスタンスの作成（黒枠）をクリック

![インスタンス確認.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641940/5d62d4e4-accc-34f3-53c6-2fc3fdc91207.png)

このようにインスタンス（赤枠）ができていることを確認できます

##　最後に

このまま続けると長くなるため、構築手順❷から今度にしたいと思います。
今回はインスタンス作成の復習みたくなっています。
もしインスタンス作成をしっかり見たい方は
<https://qiita.com/kou551121/items/56f2e075d33fbf345787>
こちらを確認してください

またこの記事は AWS 初学者を導く体系的な動画学習サービス「AWS CloudTech」の課題カリキュラムで作成しました。
<https://aws-cloud-tech.com/>
[AtCoder]AtCoder Beginner Contest 130

# はじめに
* AtCoder Beginner Contestの過去問の解法及び提出したソースコードをまとめています。
* 基本的に自分が振り返ることを目的としておりますが、誤りや気になった点、その他質問等もお待ちしておりますので遠慮なくお願いします。

# コンテストページ
https://atcoder.jp/contests/abc130


# A問題
題意通りであるため割愛。

```c++
#include <bits/stdc++.h>
using namespace std;

int main()
{
    int x,a;
    cin >> x >> a;
    cout << ((x < a) ? 0 : 10) << endl;
    return 0;
}
```
# B問題
Lを座標移動距離と考えることができるので、座標移動の合計(=Lの合計)がXを超えない範囲の座標移動回数を求めればよいです。
ソースコードではXを超えるまでLを足し続ける回数を0未満になるまでXからLを引く回数と置き換えています。

```c++
#include <bits/stdc++.h>
using namespace std;

int main()
{
    int n,x;
    cin >> n >> x;

    int ans = 1;
    for(int i = 0; i < n; i++){
        int l;
        cin >> l;
        if((x -= l) < 0) break;
        ans++;
    }
    
    cout << ans << endl;
    return 0;
}

```
# C問題
長方形の中心を通る線を引くことで必ず長方形を二分割することができるので面積は長方形の面積/2です。
また直線の引き方は基本的に座標(x,y)と長方形の中心を通る直線に定まりますが、その二点が同一である場合のみ分割方法が無数に存在します。

```c++
#include <bits/stdc++.h>
using namespace std;

int main()
{
    int w,h,x,y;
    cin >> w >> h >> x >> y;
    int ans = (x == w-x && y == h-y) ? 1 : 0;
    cout << setprecision(16) << (double)w*h/2 << " " << ans << endl;
    return 0;
}
```
# D問題
部分列の和は累積和を用いて求めることができますが、それでもそのまま全探索しようとするとO(n^2)で間に合いません。
そこで部分列の左端を固定し、条件を満たす最左の右端を二分探索で求めてそれより右のものの個数を数えていくことでO(NlogN)となります。

```c++
#include <bits/stdc++.h>
using namespace std;
#define ll long long

int main()
{
    ll n,k;
    cin >> n >> k;
    vector<ll> a(n+1);
    vector<ll> sum(n+1, 0);
    for(int i = 0; i < n; i++){
        cin >> a[i+1];
        if(i==0) sum[1] = a[1];
        else sum[i+1] = sum[i] + a[i+1];
    } 

    ll ans = 0;
    for(ll i = 1; i <= n; i++){
        ll l = i-1;
        ll r = n+1;
        while(r-l>1){
            ll x = l + (r-l)/2;
            if(sum[x] - sum[i-1] >= k){
                r = x;
            }
            else l = x;
        }
        ans += n - r + 1;
    }

    cout << ans << endl;
    return 0;
}
```
# E問題(未AC)
まだ解いていません。

# F問題(未AC)
まだ解いていません。
【iOS】コードから端末のSizeClassを判断する（Swift）

## SizeClassとは
**SizeClass**とは、端末の縦横のサイズをそれぞれ`Compact`または`Regular`として指定し、その組み合わせによってレイアウトの変更ができるようにするための機能。
`Compact`が小さいサイズのときに使われ、`Regular`が大きいサイズとして使われます。
組み合わせは全部で４通りあります。

| SizeClass（Full） | SizeClass（略） | 主な機種 |
|:--|:--|:--|
| Compact/Compact | CC  |  iPhone8の横画面、iPhone12の横画面 |
| Compact/Regular  | CR  | すべてのiPhoneの縦画面  |
| Regular/Compact  | RC  | iPhone8Plusの横画面、iPhone11の横画面など  |
| Regular/Regular  | RR  | iPad（フルスクリーン）の縦画面、横画面  |
より詳しいパターンについては、公式ドキュメントをご参照ください。
https://developer.apple.com/design/human-interface-guidelines/ios/visual-design/adaptivity-and-layout/


## どうやって使うの？
#### StoryBoardから使う
簡単に説明すると、
SizeClassによって、制約を有効にしたり、Viewの表示非表示を切り替えることができます。
例1）ImageViewの高さを、SizeClassが「RR」のときは100px、「CR」のときは、60pxにするといったようなことができる。
例2）LabelをSizeClassが「RR」のときは非表示、「CR」のときは表示するといったようなことができる。

詳しい使い方については、下記の記事がわかりやすいと思いましたので、リンクを貼らせていただきます。
https://qiita.com/wnstjd0333/items/1c2ed3cec565f69cbb90

#### コードで使う
「UITraitEnvironment」プロトコルを実装しているクラスにおいて、`traitCollection`プロパティが利用可能です。
代表例として、UIViewControllerは「UITraitEnvironment」プロトコルを採用しているため、`traitCollection`が利用できます。

また、端末の回転やマルチタスキングへの切替によって、端末のSizeClassに変化があった場合、
`traitCollectionDidChange(_:)`というメソッドが呼び出されます。（`viewWillTransition(to:with:)`も呼ばれます。）
実際に使用したい場合は、どちらかのメソッドをオーバーライドして個々のViewControllerで利用していく感じです。

それらを活用して、現在の画面が、４パターンあるSizeClassのうちどれに当てはまるかをコード上から検知することができます。

この記事は、タイトルにもあるように、SizeClassの判断をコードで行うことが目的ですので、以下に書いていきます。

### SizeClassパターンの検知
おそらく、マルチデバイス対応、マルチタスキング対応を実施しようとするとすべてのパターンが必要になると思いますので、４パターンすべてを判定するロジックを載せておきます。

```swift:ViewController.swift
enum SizeClass: String {
    // width/height
    case CC = "Compact/Compact"
    case CR = "Compact/Regular"
    case RC = "Regular/Compact"
    case RR = "Regular/Regular"
}

class ViewController: UIViewController {
    // 色々と省略

    // viewWillTransitionでも代用可能です。previousTraitCollectionを使いたければ、traitCollectionDidChangeのが最適
    override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
        // SizeClassが変わった時に呼ばれるので毎回チェックしたい場合は、ここでチェックするメソッドを呼び出す。
        let sizeClass: String = returnSizeClass().rawValue
        print(sizeClass)
        // SizeClassが変わった時に、処理を書きたい場合はここに書く
    }

    func returnSizeClass() -> SizeClass {
        if traitCollection.horizontalSizeClass == .regular 
          && traitCollection.verticalSizeClass == .regular {
            return .RR
        } else if traitCollection.horizontalSizeClass == .regular {
            return .RC
        } else if traitCollection.verticalSizeClass == .regular {
            return .CR
        } else {
            return .CC
        }
    }
}
```
enumで4パターンを定義しておいて、画面の状態によって当てはまるSizeClassをリターンするという方法で実装しました。
おそらく、ご自身のViewControllerにこちらをコピペしていただくだけでも動くと思います。
読んでいただいた方のお役に立てれば幸いです。
スクラム・・・やろっか？

# 全てのスクラムをやってない人々へ
### 前置き
はじめまして（？）八流Androidエンジニアを名乗っているものです。
最近アジャイルコーチの元、アジャイルの勉強をし始めました。
「ちょっとわかってきちまったかもなぁー？！！！」と勘違いし始めたので、
皆様に共有しておこうかなと思い筆を執りました。

アジャイルは良いものだと思ってはいますが、銀の弾丸ではないのは確かです。
僕がアジャイルをやってて`これはいいな！`と思った、ツールや、考え方を紹介したいと思います。

## スクラムは良いぞ　基礎編

月に1回は以下を読み直すようにしましょう。
スクラムの柱（透明性・検査・適応）と言われてる中の検査が大切です。

* アジャイル基礎編
    * IPAのPDF[アジャイルソフトウェア開発宣言の読みとき方](https://www.ipa.go.jp/files/000065601.pdf)が出ています。
* スクラム基礎編
    * 日本語PDFで[スクラムガイド](https://www.scrumguides.org/docs/scrumguide/v2020/2020-Scrum-Guide-Japanese.pdf)が出ています。

時間と共に、理解の歪みや認識の齟齬はが生まれます。定期的に読み直しましょう！

コロナが終わってフルリモートが続いても（つづけ！）
安心して来年度を迎えられそうです。
これは、アジャイルの知識と経験があるからだと思っています。


## 人々がする勘違いアジャイル
アジャイルをしたことがある人とない人には、かなりの壁があります。
それは正しく理解していないことにあります。
類推してしまい、こういうもんでしょ？で片付けてしまうことが１番の原因です。

* リソース効率とフロー効率
    * 今までの話を聞いていてもリソース効率だけで考えてしまう人たちには理解できないことが多いと思います。
        * まぁ自分もそうだったんですが、戻りたいとは思いませんねぇ...
    * リソース効率というか何人日とかそういう考えが悪ということを言いたいわけではないです。
        * 個人的には多くの場合は、フロー効率重視の方がうまくいく気はします。

スーパーマンしかしない現場や、
使い捨ての社員を無限増殖させる考えや、
将来誰かが傷ついても仕方ない、という考えの場合はリソース効率でいいのではないでしょうか。
もしくは半年でサービス終了するプロダクトならそれでもいいとは思いますよ（乱暴）

### まとめ
アジャイルという一つのマインドで、解決できることが多岐に渡ることが想像できたと思います。
アジャイルには、学びも、楽しさもあるので、
チームで採用しないでも、個人で勉強しておいて損はないと思います。

##### 留意点として
アジャイルのマインドが素晴らしいのであって、スクラムすることが素晴らしいわけではないです。
また、完璧に右に倣えする必要があるわけではありません。
自分の組織（チーム）にあったやり方でカスタマイズすることは悪いことではないと思います。

変化をするのに色々な反応で抵抗してしまう人がいます。
ただ、今より良い状態になれる可能性があるのは事実です。
まず恐れずに、「スクラムのここの部分だけを１ヶ月やってみよう」というスモールスタートを繰り返して、
理解を深めながら取り入れていく工夫をしましょう。

スクラムには今回紹介しなかったような多種多様なツールがあります。
また、いいプラクティスは次々まとめられています。

アジャイル界隈はエンジニアの業界と同様に今も進化を続けていて、
最新の情報はキャッチアップしていった方がいいとは思います。（スクラムガイド更新されましたしね）

エンジニアのやることは益々増えそうですが、個人的には楽しいポイントが増えたので、
これからも続けてアジャイルの学習をしたいと思います！！:sunglasses:

### おまけのおすすめ
* [フロー効率性とリソース効率性について](https://www.slideshare.net/i2key/xpjug)
* [「反省」から「ふりかえり」へ](https://www.slideshare.net/kkd/from-hansei-tofurikaeri)
* [RSGT 2020 まとめ＆登壇してきた話（セッション編）](https://note.com/ffg_oig/n/nd1b8effee6df)
* [RSGT 2021再生リスト](https://www.youtube.com/playlist?list=PL-bvtmk0kdw6DENU_86qtzzodjI9pHbrC)
gravity sketchからblenderにOBJをインポート・下準備の方法

gravity sketchでの設定

・Model Unitをmに設定
・Single Sidedを選択
・Render meshを選択
・Up Axistをyに設定
・Mirror PlaneをYZに設定
→　OBJとしてエクスポート

blenderでの設定・準備

・エクスポートしたOBJをBlenderにインポート
・マージする
![スクリーンショット 2021-03-01 22.08.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1165391/7d7faade-87b8-bdd2-17b7-53ed88a14408.png)
・Pを押してBy Loose Partsを選択し分離する　

オプションにあるBackface Cullingを選択すると面が表裏になっていることが確認できる

・オブジェクトを全選択し、編集モードに移行
・alt + n でNormals windowを出し、flipかRecalculate Outsideを選択
→表面に設定完了
![スクリーンショット 2021-03-01 22.20.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1165391/82edfd05-9d14-313c-eac2-a99bb89f2fa1.png)

下準備完了

参考引用文献
https://www.youtube.com/watch?v=cqJzORdLtwA&t=172s
サーバーレス(FaaS)アーキテクチャーとは

###サーバーレスアーキテクチャとは##
***
仮想マシンを極力使わず、「イベント駆動型コード実行サービス」と呼ばれるサービスを利用してシステムを構築するアーキテクチャ。

###メリット
***

* インフラ運用の簡素化
* コンピューティングリソースの最適化
* 真の従量課金制
* スケーラビリティの向上
* マイクロサービスの実現
* ビジネス・アジリティの向上



###デメリット
***
- 実行時間や消費可能リソースの制約
- レイテンシー問題
UIとUXの違いってなんだ！！

なんとなくセットで覚えていたUI/UXデザインという言葉。
「User Interface = ユーザーが使いやすいようにデザイン・設計する」は知っていたが、もう一個のUXって何だったっけ？と何回調べても忘れてしまうのでQiitaにまとめてみる。

・[参考記事](https://digitalidentity.co.jp/blog/ad/uiux-design.html)
・[参考記事: UIとUXの違いをやさしく解説！上司に説明すべき3つのポイントとは](https://esaura.jp/ux-blog/what-is-the-difference-between-ui-and-ux)

#結論

UI : User Interface
UX : User Experience

ユーザー目線で使いやすく..を追求したデザイン・サービス(UI)によって「なんやこれめっちゃ使いやすいやん便利〜!！」っていう感情・体験がUX。
らしい。合ってるかな?

>UIはUXを高めるための要素のひとつ
UIとUXは対立関係でもなければ、相互補完する関係でもありません。質の高いUXを作り出すには、ユーザー心理を理解したユーザー目線のUIが重要不可欠です。
ではなぜ見出しで「要素のひとつ」と表現したのか、それにはきちんと理由があります。

>UXを作り出す方法はUIだけではない
へたれがCCNA(200-301)に一発合格した話

## はじめに
先日CCNA 200-301に合格したのでその備忘録として記事に残したいと思います。
CCNAは去年より新体系となり、出題範囲も出題形式も変わったのですが割と合格記事が少ない・・・ということでこいつも参考にしてもらえたら幸いです。

なお当時の筆者のスペックです。

- Webエンジニア１年目（AWS、Laravelなど）
- ネットワークの知識・・・応用情報の範囲ぐらい
- CCNA？　Ping-tあるし余裕っしょ！

## 試験概要

- 試験時間：120分
- 試験方式：CBT方式試験
- 問題数：102〜104問前後？（自分のときは104問でした）
- 合格点：825点(1000点満点)

※CCNAは通常のCBT試験と違い一度問題に回答したらもう戻れません！！一発勝負のスリリングな試験となっています。

## 出題範囲
- ネットワークの基礎
- ネットワークアクセス
- IP 接続
- IP サービス
- セキュリティの基礎
- 自動化とプログラマビリティ

## 出題形式

- 選択問題（択一問題）・・・複数の選択肢の中から1つ選択
- 選択問題（複数回答）・・・選択肢の中から複数を選んで回答
- ドラッグ&ドロップ・・・選択肢を対応するエリアにドラッグ&ドロップして回答する問題。個人的に鬼ムズでした

なお、旧体系にあった「コマンド入力問題」「シナリオ問題」「シミュレーション問題」は"おそらく"廃止になっています。ネット上では上の３つの問題形式しか出なかったという情報が多く、自分も例に漏れずそうでした（しかし公式サイトには出るよと言っている謎！！）。

## 勉強法

1. マスタリングTCP/IPを一周（1ヶ月）
 https://www.amazon.co.jp/dp/4274224473/ref=cm_sw_em_r_mt_dp_W68NSJJW0RJPTZWFWDAB

2. Ping-Tのやりこみ（1ヶ月）

これだけです！
まず名著「[マスタリングTCP/IP](https://amzn.asia/d/6ZzDRrk)」を読むことから開始しました。買ってみたとき、結構なボリュームで「読み終わるかな・・・」と不安でしたが、説明がとても丁寧でわかりやすいので、すらすら読めます。

その後、Ping-Tで問題を解きまくりました。全ての問題を金にして、模試で90%を3回ほどとった時点で試験当日となりました(レベル24くらい)。やりこみ具合で言うといままだまだって感じで、今思えばこれがまずかったかもしれない・・・。

## 受験結果と感想
合計８６０点でなんとか合格でした。当日の朝までPing−Tを回し、「これは正直余裕でしょう」とたかをくくっていたのですが、いざ試験が始まるとわからない問題が半分ぐらいでてきて死にそうになりました。
「ああこりゃダメだあ」と涙目で回答してましたが、結果発表で「pass」の文字見たときは発狂しそうなほど喜びました。以下反省点です。

### 1. 勉強時間が足りなかった
　Ping-Tを１ヶ月だけでやるのはいささか無謀だったかもしれません。ネットワークの業務未経験で、仕事をしながらであれば１ヶ月半ぐらいかけてPing-Tのレベル４０を目指したほうがいい気がしました。

### 2. Ping-Tの解説をあまり読まなかった。
　Ping-Tは問題ごとにとても親切な解説が載っています。時間がないからと解説に軽くしか目を通さなかったのですが、これがまずかったです。試験ではかなり細かいところまで聞いてくるので、可能であればPing-Tの解説もすべて覚えるくらいで取り掛かったほうがよいです。

### 3. シミュレータを一切使わず、実機のイメージがしずらかった
　これもよくなかったですね。試験では知識だけで解ける問題と、コマンドの結果や機器の接続状態をもとに推測して解く問題があります。自分は後者の問題にまったく自信を持って答えられませんでした。勉強時はCiscoが公式で出しているPacketTracerを使って必ずシミュレートしたいですね。

## 最後に
合格できたよかった〜って感じですが、実のところあまり身についた気がしておらず反省点の多い受験となりました。
次は４月にNWスペシャリストを受験するのですが、こちらは試験の参考書だけでなくネットワークの専門書も使って勉強し、より実践的な知識を身に着けたいと思います！！　また機会があればCCNPの受験も検討します。
とりあえず次の試験の結果がでたら記事にするのでよろしくお願いいします！
画面上には表示されないinput要素を作成

# type属性にhiddenを使おう

```html
<input name="名前" type="hidden" value=<%= current_user.id %>>
```

画面上には表示されないinput要素を作成する場合は、type属性にhiddenを使う。
input要素を隠したい時に頻繁に利用します。
多言語で Fizz Buzz ！

#はじめに
この記事では、FizzBuzzゲームのプログラミングコードを紹介する。とりあえず、Python、Fortran、C++で書いたコードを２つずつ見てみよう。

#目次
１．そもそもFizzBuzzゲームとは？
２．Python
３．Fortran
４．C++

#そもそも FizzBuzzゲームとは？ 
https://ja.wikipedia.org/wiki/Fizz_Buzz



#Python
```python:for文
for i in range(1, 101):
    if i % 15 == 0:
        print('Fizz Buzz')
    elif i % 3 == 0:
        print('Fizz')
    elif i % 5 == 0:
        print('Buzz')
    else:
        print(i)
```

```python:while文
i = 1
while i < 101:
    if i % 15 == 0:
        print('Fizz Buzz')
    elif i % 3 == 0:
        print('Fizz')
    elif i % 5 == 0:
        print('Buzz')
    else:
        print(i)
        
    i += 1
```

<a id="anchor2"></a>
#Fortran
```Fortran:条件分岐とループによるプログラム
! fizzbuzz.f90
! G95でコンパイル
! Fortran90/95では、複数行コメントは非サポート

program fizzbuzz
  implicit none
  integer i
  do i = 1, 100
    ! iが3の倍数かつ5の倍数
    if (mod(i, 3) == 0 .and. mod(i, 5) == 0) then
      print *, "FizzBuzz"
    ! iが3の倍数(かつ、5の倍数でない)
    else if (mod(i, 3) == 0) then
      print *, "Fizz"
    ! iが5の倍数(かつ、3の倍数でない)
    else if (mod(i, 5) == 0) then
      print *, "Buzz"
    ! iが3の倍数でも5の倍数でもない
    else
      print *, i
    end if
  end do
end program fizzbuzz
```

```Fortran:サブルーチンの再帰呼び出しによるプログラム
! fizzbuzz_rc.f90
! G95でコンパイル
! Fortran90/95では、複数行コメントは非サポート

program fizzbuzz_rc
  implicit none
  call fizzbuzz(100)
contains
  recursive subroutine fizzbuzz(n)
    integer n

    if (n > 1) then
      call fizzbuzz(n-1)
    end if

    ! nが3の倍数かつ5の倍数
    if (mod(n, 3) == 0 .and. mod(n, 5) == 0) then
      print *, "Fizz,Buzz"
    ! nが3の倍数(かつ、5の倍数でない)
    else if (mod(n, 3) == 0) then
      print *, "Fizz"
    ! nが5の倍数(かつ、3の倍数でない)
    else if (mod(n, 5) == 0) then
      print *, "Buzz"
    ! nが3の倍数でも5の倍数でもない
    else
      print *, n
    end if
  end subroutine
end program fizzbuzz_rc
```

<a id="anchor3"></a>
#C++
```C++:条件分岐とループによるプログラム
/*
  fizzbuzz.cpp
*/

#include <iostream>

using namespace std; 

int main()
{
  for (int i = 1; i <= 100; i++) {
    if (i % 3 == 0 && i % 5 == 0)  // iが3の倍数かつ5の倍数
      cout << "Fizz,Buzz" << endl;
    else if (i % 3 == 0)  // iが3の倍数(かつ、5の倍数でない)
      cout << "Fizz" << endl;
    else if (i % 5 == 0)  // iが5の倍数(かつ、3の倍数でない)
      cout << "Buzz" << endl;
    else  // iが3の倍数でも5の倍数でもない
      cout << i << endl;
  }
  
  return 0;
}
```

```C++:関数の再帰呼び出しによるプログラム
/*
  fizzbuzz_rc.cpp
*/

#include <iostream>

using namespace std; 

void fizzbuzz(int n)
{
  if (n > 1) 
    fizzbuzz(n-1);

  if (n % 3 == 0 && n % 5 == 0)  // nが3の倍数かつ5の倍数
    cout << "Fizz,Buzz" << endl;
  else if (n % 3 == 0)  // nが3の倍数(かつ、5の倍数でない)
    cout << "Fizz" << endl;
  else if (n % 5 == 0)  // nが5の倍数(かつ、3の倍数でない)
    cout << "Buzz" << endl;
  else  // nが3の倍数でも5の倍数でもない
    cout << n << endl;
}

int main()
{
  fizzbuzz(100);
  
  return 0;
}
```