OmniAICreator/Qiita-1.07M huggingface dataset:
Rails Error `No template found for`

###No template found for AAController#BB
railsの`controller`にて特定のメソッドを定義したにも関わらず、設定したアクションが行われないケースにおいて、terminalを覗くとこのような記述がある場合の解決法

###BB.html.erbを作成

[Rails 5 No template found error](https://stackoverflow.com/questions/41915124/rails-5-no-template-found-error)より
>Rails looks for a view file to render when a action is called, and it's looking for a file with the same name as the action.

Railsはアクションが呼ばれた際にそれに該当する同名のファイルを探すので、ファイルをview directoryに作成すれば解決するとのこと。

###redirect_toの記述忘れ
僕の場合はこちらでした。
`update`アクションを記述する際に

```ruby
def update
    @cart = session[:cart].map { |item_id| Item.find(item_id) }
    @cart.delete(params[:id])
    redirect_to cart_index_path #ココ！
  end
```
メソッドを実行した際の戻り値？、帰るパスを設定し忘れていたので変化が発生せずにterminalにてエラーが出ていたようでした。
[Ruby][初心者] 例外処理について

## はじめに
例外処理について勉強しました。
実際の業務だとどんなところで使うんだろうか？
詳しい人教えていただきたいです！

## 例外とは？
プログラムのエラーにより継続して処理ができない異常
例外が起きると途中で処理が止まってしまうため、例外が起きる可能性がある場所においては適切に例外処理を行う必要がある


## 例
例外が発生する可能性のある箇所を begin ... rescue　で囲む。
例外が発生した場合は、rescueブロックの中の処理が実行される。

```ruby

begin
  val = 10 / 0
  put val
rescue
  puts '0で割ることはできません'
end
```

例外に関数情報が入った例外オブジェクトを取得するには次のように書く

```ruby
begin
  val = 10 / 0
  put val
rescue => e
  p e
end

#<ZeroDivisionError: divided by 0>
=> #<ZeroDivisionError: divided by 0> # 実行結果
```

## 例外オブジェクトにはエラーの原因を調べるための便利なメソッドが用意されている

- backtraceメソッド　

どのような順序でプログラムが実行されエラーに至ったかという情報を返してくれる

- full_messageメソッド

例外に関する整形されたメッセージを返すメソッド

## 例外によって処理を分ける

```ruby

begin
  val = 10 / 0
  put val
rescue　ZeroDivisionError => e
　　　　puts '0で割っては行けません';
rescue => e
  puts 'その他のエラー'
end

#<ZeroDivisionError: divided by 0>
=> #<ZeroDivisionError: divided by 0> # 実行結果
```

## rescueに入った後に何らかの処理を行いもう一度実行したい場合
retryを使う

retry時にエラーが解消されないコードを書いてしまうと、例外が発生し続け永遠にretryし続けるループに入ってしまう可能性がある

```ruby
num = 0

begin
  p 10 / num
rescue ZeroDivisionError => e
  p e
  num = 2
  retry
end
```

## raiseについて
raiseは明示的に例外を発生させたい時に使うもの

単純にraiseとした場合はRuntimeErrorという例外が発生する

```ruby
begin
  raise
rescue => e
  p e
end
```

raiseの後に書いたクラスの例外を発生させることができる

```ruby
begin
  raise ZeroDivisionError
rescue => e
  p e
end
```

独自で例外クラスを作成することもできる。
その場合は、独自のクラスにStandartErrorクラスを継承させて作る。

```ruby

class MyError < StandardError; end

begin
  raise MyError
rescue => e
  p e
end
```

## 例外は発生してもしなくても実行されるensure
begin ... rescueの最後にensureを入れることで例外が発生しても、しなくても実行される処理を書くことができる

```ruby
begin
  raise
rescue => e
  p e
ensure
  puts 'ensureが実行されました。'
end
```
ensureはbeginブロックで行なった処理の後処理が必要な場合に使用される
[Firebase] [Firestore] ログインしているユーザーのみに読み書きの権限を与える

##はじめに
先日、Firebaseの匿名ログインを使って見た時に、DBにルールを追加したのでその時のメモとして残します。
Firebaseはとても使いやすく、ドキュメントも揃っていてわかりやすいのでもっと勉強していきたいと思います。

間違い等あれば、どんどんリクエスト送っていただければ幸いです。
それでは始めます。

##DBルールを変更する

ログインユーザーのuidを確認して、uidが存在する場合のみFirestoreの書き換えを許可します。

１、コンソールにログインする
<img width="1349" alt="スクリーンショット 2018-08-24 16.15.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/222453/4799638f-7d3e-ed1f-e9ca-9e4fa58af778.png">

２、Databaseを選択
<img width="1350" alt="スクリーンショット 2018-08-24 16.16.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/222453/65bc1ce1-757e-dbe5-f3c6-b37e1405bcec.png">

３、ルールのタブを選択
<img width="1355" alt="スクリーンショット 2018-08-24 16.16.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/222453/cbfd9173-2942-3a08-a6ad-15364a077b1a.png">


### 下記のように変更します

```
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if request.auth.uid != null
    }
  }
}
```

以下の文を追加しました。

```
 if request.auth.uid != null;
```

## 最後に

僕自身まだ勉強中のため、オススメのチュートリアルや書籍など教えていただけると嬉しいです。
最後までお読みいただきありがとうござます。
IBM Watson Assistant (Conversation) 書き方 Tips


IBM Watson Assistant は簡単に説明するとチャットボット用のフレームワークですが、原理的にはこれまた簡単に説明すると「IF (条件・コンディション) THEN （レスポンス）」をひたすら書いていくのが基本です。

ただ、入力される自然言語テキストは当然ですが入力パターンが非常に多く、全部の入力パターンに対して（条件・コンディション）を設定していたのではキリがありませんし、AIっぽくもなんともないのです。そこで（条件・コンディション）部に機械学習の機能を入れ込んでいるのが、IBM Watson Assistantのよいところです。（※個人の意見です！w）

ところがコンディション部にはけっこういろいろな記述方法が用意されているので、そこの部分までまとめたのが以下の記事になります。



# コンディション部

## 入力が「A」に等しい

```javascript
input.text == 'A'
```

## 入力が正規表現「[0-9]」にマッチする

```javascript
input.text.matches('[0-9]')
```

## Intent がヒットする

```javascript
#intentname
#(日本語インテント名)
```

## Intent の確信度が0.5以上

```javascript
intents[0].confidence > 0.5
```

##ユーザーエンティティにヒットする

```javascript
@userentityname
```

## Context 変数に値がセットされている

例として「username」というContext変数とする

```javascript
context.username != null
context['username'] != null
```

## Context 変数の配列が値を含む

```javascript
$配列変数名.contains('ham')
```



。。。続きはまた今度。
matplotlibのフォントサイズ指定の怪

# 内容

* デジタル画像としての大きさの単位であるピクセルと物理的な長さを示すインチを混乱しないようにしよう。
* matplotlibで出力される画像の大きさは、ピクセル単位で表わすと、plt.rcParams["figure.dpi"] × plt.rcParams["figure.figsize"]で計算される。
* 一方matplotlib内のフォントサイズを表現する時にはポイントで指定する。ポイントとは、1/72インチなので物理的な長さの単位であり、ピクセルではない。
* そのため、図中の相対的な大きさを考えてフォントサイズを指定したい時には、plt.rcParams["figure.figsize"]で指定する値との大小のみを考えて指定する必要がある。

# 環境

matplotlib 2.1.1

# イントロ

matplotlibにはいつも大変お世話になっております。データのグラフ化などすごく簡単に素早く、場合によっては一部分を拡大してみたりできちゃったりして、ほんと大好きです。
…ただ、軸、タイトル、凡例などフォントのサイズを変える時に「！？」となることがしばしばでした。勿論これは、matplotlib様が悪いのではなく、僕がフォントのサイズ、dpi、matplotlibにおけるfigureのサイズの相互の関係についてちゃんと分かっていなかったことが原因なのですが、これについて少し調べてみたことを書いてみます。タイトルの怪はあくまで僕にとっての怪ということで。

# matplotlibにおけるピクセルとインチ

デジタル画像はピクセルで大きさが指定されているが、当然その実際の大きさはディスプレイの大きさやdpi(dot per inch、1インチあたりのドット数)で異なってくる。matplotlibで出力した図を`plt.savefig`などで保存する時も、その図の大きさはピクセル単位で表現されるものが出力される。

この時の縦横のピクセル数は、`plt.rcParams["figure.dpi"] × plt.rcParams["figure.figsize"]` で計算されることになる。

そのため、 dpi = 50, figsize = (4.8,3.6) のものと dpi = 100, figsize = (2.4,1.8)のものは出力される画像サイズは同じ大きさになる。imagemagickのindentifyというツールで画像サイズを確認してみる。

* dpi = 50, figsize = (4.8,3.6)

![inche_half_100dpi.png](https://qiita-image-store.s3.amazonaws.com/0/277647/491aa45e-9cb3-34eb-9739-8ed8c3ea389a.png)

```
identify inch_half_100dpi.png 
>inch_half_100dpi.png PNG 240x180+0+0 DirectClass 8-bit 6.2K 0.000u 0:01
```

* dpi = 100, figsize = (2.4,1.8)

![inche_norm_50dpi.png](https://qiita-image-store.s3.amazonaws.com/0/277647/5b1b48c1-6d6c-957a-a84c-d42c9704759f.png)

```
identify inch_half_100dpi.png 
> inch_half_100dpi.png PNG 240x180+0+0 DirectClass 8-bit 6.2K 0.000u 0:01
```

ということで、同じサイズ(240*180)になるのだが、上記を見て分かるように文字や線の太さなど微妙に違う。

# フォントなどのサイズ指定

上記図のような、画像サイズが一緒、もちろんフォントなどのサイズ指定も一緒なのに見た目の大きさに違いがでるのは、フォントや線などはポイントで指定していて、直接比較されているのはfigure.figsizeでインチで指定される長さであるから。

1ポイントは1/72インチと等しい。例えばfont.size=18の時、少なくとも日本語等幅フォントを使っている時、その一文字は`18*1/72=0.25`インチとなる。ここで、figsize=(4.8,3.6)(この数値はインチ)とfigsize=(2.4,1.8)の図のタイトルに文字がそれぞれ何文字入るのかやってみると、4.8の方は`4.8/0.25=19.2`、2.4の方は`2.4/0.25=9.6`となる。

* figsize=(4.8,3.6),dpi=100,fontsize=18の時のplt.titleでは「と」(19番目）まで。
![fontno_big.png](https://qiita-image-store.s3.amazonaws.com/0/277647/498e92ef-81e7-9142-ceeb-e729c5996a75.png)

* figsize=(2.4,1.8),dpi=200,fontsize=18の時のplt.titleでは「こ」(10番目）まで。
![fontno_small.png](https://qiita-image-store.s3.amazonaws.com/0/277647/f747d37d-33c0-84fe-efe0-3cfee6829949.png)

# どうすれば(特にフォントの大きさについて)思い通りに指定できるか

figsize=(4.8,3.6),dpi=100の時にタイトルを10文字で書いて、半分くらい2.4インチとしよう)に収まるようにしたい時何ポイントにしたらいいの？と思ったら、

```math
2.4(横に使えるインチ) \times (1/72)(1ポイントのインチ）/ 10（文字数) = 17.27
```

ということで、大体17とか18ポイントでいいことになる。以下のタイトルの文字は18ポイントで指定したもので、大体半分くらいの長さになっている。

![character_10.png](https://qiita-image-store.s3.amazonaws.com/0/277647/aa5ac3e8-c129-7e33-6e72-4225284913cf.png)

# 全体的な心つもりとして

* figsizeは縦横比を変える時に使用する。横の値は4.8で固定するなどする。
* 高精細にしたい時などはdpiを変化させる。figsizeを変えるとフォントの大きさの指定の感覚を失うことになりかねないのでやめた方がいい。
* フォントサイズはfigsize横サイズデフォルトの4.8を基準とする時は、18くらいは悪くない線。勿論微調整が必要な場合はある。matplotlibrcに書いてデフォルトを変えておこう。

# 最後に

色々間違っているかもしれませんがご指摘頂ければ幸いです。
Advanced Custom FieldsのRepeater Fieldを別のページに表示する

WordPressプラグイン「Advanced Custom Fields」を
トップページや他の固定ページで使いたい場合の解決コードです。

# Advanced Custom Fieldsを表示

## パターン1 ページidを指定して表示
通常のカスタムフィールドの表示はこれでいける。
フィールド名と固定ページidを以下のように記述します。

```php
<?php echo get_field ('★フィールド名★',固定ページid));?>
```

##パターン2 ページスラッグを指定して表示

ページスラッグを指定する場合はこちら。

```php
$page_id = get_page_by_path('固定ページスラッグ');
$page_id = $page_id->ID;
echo get_post_meta($page_id, 'フィールド名', true);
```

# Repeater Fieldを表示

Repeater Field（繰り返しフィールド）を表示する場合は、
以下のように固定ページスラッグを記載します。

```php
<?php
$page_id = get_page_by_path('★固定ページスラッグ★');
$page_id = $page_id->ID;
?>
<?php if(have_rows('★フィールドグループ★', $page_id)): ?>
<?php $page_counter = 2; ?>//表示件数
<?php while(have_rows('★フィールドグループ★', $page_id)): the_row(); ?>
<?php $page_counter--; ?>
//ループ内容
<?php the_sub_field('★サブフィールド★'); ?>

<?php if ($page_counter === 0) break;?>
<?php endwhile; ?>
<?php endif; ?>
```

## 参考URL

<a href="https://myscreate.com/customfieldvalue-into-frontpage/">カスタムフィールドの値をトップページなどで表示する – ma-ya's CREATE / WEB DESIGN</a>

<a href="https://hirashimatakumi.com/blog/30.html">Advanced Custom Fields のアドオン Repeater Field（リピーターフィールド）の表示方法 - by Takumi Hirashima</a>

- <a href="http://quoyui.jugem.jp/?eid=121" target="_blank">wordpress：固定ページのスラッグ名からページIDを取得してカスタムフィールドの値を別ページに出力する | Kagiana -blog-</a>

Special Thanks kuninori ogino
firebaseでcurrentUserが匿名ログインか調べる方法


`getIdToken`のレスポンスの`signInProvider`でログインプロバイダーがわかるので、その値がanonymousだったら匿名ログインと判別することができます。

```kotlin
val firebaseAuth = FirebaseAuth.getInstance()
firebaseAuth.currentUser?.getIdToken(true)?.addOnSuccessListener {
    when(it.signInProvider){
        "anonymous" -> {
            info { "匿名ログイン" }
        }
        "custom" -> {
            info { "カスタムトークンでログイン" }
        }
        else -> {
            info { "その他" }
        }
    }
}
```
ConoHaVPSを使ってみた記録　初期設定　SSH


#SSH接続がなんかうまくいかん
MacBookAirからssh-keygenで作ったパブリックキーをコピペしてるんだけどなあ。。。

##解決模索
[[SSH]Permission deniedとか出てきた時の対応]
(https://blog.adachin.me/archives/2054)
を参照。

いろいろ権限とか確認すべく、ホスト側のサーバコンソールで

```
~/.ssh/authorizedkeys
```

を開いてみると、
なんか、末尾に
Generated-by-Nova
ってあって、
自分で登録した公開鍵が置かれてないことが判明。そら接続できんわけだわ。

###原因
→コンソールの仕様勘違い
ConoHaコンソール上のパブリックキー追加は、それだけでは登録できなくて、VPS追加時にのみ選択可能だという。
ということで、ここ（root/.ssh/）に公開鍵を手動でアップロードしないといけない。

ちょっとめんどいので、サーバ再構築してみる。

##サーバ再起動したことでの問題発生

```
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
```
こんなんでました。

###原因
→以前とサーバ情報が変わってるから（再起動のため）

###解決方法
[SSH接続エラー回避方法：.ssh/known_hostsから特定のホストを削除する/削除しないで対処する3つの方法]
(https://qiita.com/grgrjnjn/items/8ca33b64ea0406e12938)
ここの一個目の方法で解決。

```
$ ssh-keygen -R remote_host_name
```

ということで、SSH接続できました〜。

その他諸々設定していきます。
React Suspense を試してみた

注意: これは実験的な機能なので、v17リリースまでにAPIが変更される可能性が高い。紹介する限り既に unstable_AsyncMode や resource.read のAPIは一度変更されている。

---

標準版 React の canary ビルドを入れる

```
yarn add react@canary react-dom@canary
```

```tsx
import "@babel/polyfill";
import React from "react";
import ReactDOM from "react-dom";
import { createResource, createCache } from "simple-cache-provider";

// cast any for typescript
const Timeout: React.ComponentType<{ ms: number }> = (React as any).Timeout;
const AsyncMode = (React as any).unstable_AsyncMode;

const cache = createCache();
const hn = createResource(async (id: number) => {
  const url = `https://hacker-news.firebaseio.com/v0/item/${id}.json`;
  const res = await fetch(url);
  await new Promise(resolve => setTimeout(resolve, 400));
  return res.json();
});

const HNStory = (props: { id: number }) => {
  const data = hn.read(cache, props.id);
  return (
    <p>
      {data.title}: {data.url}
    </p>
  );
};

class App extends React.PureComponent {
  render() {
    return (
      <div>
        <h1>Try suspense</h1>
        <button
          onClick={() => {
            this.forceUpdate();
          }}
        >
          reload
        </button>
        <hr />
        <Timeout ms={200}>
          {(didTimeout: boolean) => {
            if (didTimeout) {
              return <span>The content is still loading :(</span>;
            }
            return <HNStory id={8863} />;
          }}
        </Timeout>
      </div>
    );
  }
}

ReactDOM.render(
  <AsyncMode>
    <App />
  </AsyncMode>,
  document.querySelector(".root")
);
```


## 挙動

一旦は HNHistory のレンダリングはスキップされる。Hacker News の API 叩く。200ms を超えると Timeout children に与えた renderProp が `didMount: boolean` の情報を付与して発火し、プレースホルダが表示される。それまでに取得が完了されていれば、そのまま表示される。

reload のボタンを押すと強制リロードされるが、キャッシュ構築済みなのでプレースホルダが出ることなく表示される。

![](https://i.gyazo.com/1d02d41bcac0b63338e6cf9925ede782.gif)

AsyncMode を外した場合、初回レンダリング時から Timeout の children が発火する。

## 解説

- AsyncMode でラップすることで、非同期レンダリングを有効化する
- simple-cache-provider によって、cache と resource を生成する。
    - これは単にリクエスト時の引数に対してその結果をキャッシュするモジェール。なので simple-cache
- `resource.read(cache, key)` 時、キャッシュが無ければ `throw new Promise(...)` で例外処理に飛ぶ
- Timeout に実装された ErrorBoundary によって、catch される https://reactjs.org/docs/error-boundaries.html
- `resource.read(cache, key)` 時、キャッシュが構築されていれば動機的に返却する
- 正常処理を行う

Reactの render は同期でなければいけない、という縛りを、見た目上同期APIに見えつつ Promise を throw して ErrorBoundary で catch してフォールバックすることで実現している。なので、v17以降では、 **render の処理は最後まで走らないことがある** というのを認識しないといけない。さすがに、ここで副作用を起こすコードを書く人はいないはずだが…。


要は、Reactの世界観の中では、ライブラリ作者はレンダリングの優先度付けのために、自分で componentDidCatch を実装したカスタムな ErrorBoundary を使って、その復帰処理で好き勝手してもよいということになる。

ライブラリ作者は、行儀よくライブラリの邪魔をしないErrorを裏で生成しないといけない。うまくやらないと治安悪いライブラリ増えそうな気がする。
Delphi で Android Notification (通知)

通知って、よくあるアレですよアレ
こーゆーやつ
![scshot.png](https://qiita-image-store.s3.amazonaws.com/0/164551/5d48c849-e88a-5330-a243-530eb7fe97cd.png)

[Android Developer の通知のドキュメント](https://developer.android.com/guide/topics/ui/notifiers/notifications?hl=ja) を読むとコードで一生懸命書いていますが、Delphi の場合は TNotificationCenter コンポーネントがあり、プロパティの設定とメソッドを実行するだけで、楽に通知を行うことができます

## サンプルアプリケーション
使用した Delphi のバージョンは 10.2 Tokyo (release3) Community Edition を使っています
Android は Nexus 5 (Android OS 6.0.1) を使いました

ボタンを押すと通知を行なうという簡単なサンプルです
使うコンポーネントは 2 つ、TButton と TNotificationCenter のみ

新規でマルチデバイスアプリケーションを作成します（空のアプリケーションを選択します）
ツールパレットから TButton をフォーム上にドラックアンドドロップで配置します
ツールパレットから TNotificationCenter をフォーム上にドラックアンドドロップで配置します
設計画面はこんな感じです
![notice01.png](https://qiita-image-store.s3.amazonaws.com/0/164551/7df9bf6e-df5b-5b96-db12-68fa4862b309.png)

設計画面の Button1 をダブルクリックして、Button1 の OnClick イベントに以下のコードを記述します

```pascal
procedure TForm2.Button1Click(Sender: TObject);
// 通知メッセージは TNotification で作成します
var
  mNotice: TNotification;
begin
  mNotice := NotificationCenter1.CreateNotification;
  mNotice.Name := 'NoticeTest';
  mNotice.Title := '通知タイトル';
  mNotice.AlertBody := '通知内容';

// 通知
  NotificationCenter1.PresentNotification(mNotice);

  mNotice.DisposeOf;  // デストラクタ強制実行
end;
```

通知をタップした際の処理は、設計画面のNotificationCenter1 をダブルクリックして生成される TNotificationCenter の OnReceiveLocalNotification イベントに記述することができます
このサンプルでは簡単に ShowMessage を使ってタップされたことを表示します
また、パラメータで返却されている ANotification(TNotification) の Name プロパティを表示して、どの通知かわかるようにしています

```pascal
procedure TForm2.NotificationCenter1ReceiveLocalNotification(Sender: TObject;
  ANotification: TNotification);
begin
  showMessage(ANotification.Name + ':通知がタップされました');
end;
```

## ビルドして実行
設計したとおりの画面のアプリが起動します
![Screenshot_20180824-145111.png](https://qiita-image-store.s3.amazonaws.com/0/164551/8a4dcf7d-142d-d720-14b9-db0985c8406c.png)

ボタンを押すと通知が行なわれ、左上に通知があったことを示すアイコンが表示されます
![Screenshot_20180824-145132.png](https://qiita-image-store.s3.amazonaws.com/0/164551/bcfeb461-bf59-b669-31f6-61cd5d4321ab.png)

TNotification に設定したとおりの通知内容 
![Screenshot_20180824-145151.png](https://qiita-image-store.s3.amazonaws.com/0/164551/addb030e-42af-500a-c073-db8912915126.png)

この通知をタップすると
![Screenshot_20180824-145205.png](https://qiita-image-store.s3.amazonaws.com/0/164551/0fa4c9b0-f617-2352-0597-3ad93119ab80.png)
と ShowMessage で記載した内容が表示されます

## docwiki 上のドキュメント

- [モバイル チュートリアル：通知を使用する（iOS および Android）](http://docwiki.embarcadero.com/RADStudio/Tokyo/ja/%E3%83%A2%E3%83%90%E3%82%A4%E3%83%AB_%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB%EF%BC%9A%E9%80%9A%E7%9F%A5%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B%EF%BC%88iOS_%E3%81%8A%E3%82%88%E3%81%B3_Android%EF%BC%89)
- [通知の使用](http://docwiki.embarcadero.com/RADStudio/Tokyo/ja/%E9%80%9A%E7%9F%A5%E3%81%AE%E4%BD%BF%E7%94%A8)
tableViewの並び替えで他のSectionには行かせないようにする


TableViewで最初の3つのセルは並び替え不可、それ以降は並び替えできるようにしたく、Sectionを分けたが、Sectionを超えて並び替えできてしまった。

```ViewController.swift
override func tableView(_ tableView:UITableView, targetIndexPathForMoveFromRowAt sourceIndexPath: IndexPath, toProposedIndexPath proposedDestinationIndexPath: IndexPath) -> IndexPath {
	if (proposedDestinationIndexPath.section != sourceIndexPath.section) {
		return sourceIndexPath
	}
	return proposedDestinationIndexPath;
}
```

以上のようにすればSectionを超えた場合はうごかないように
PHPUnitのテスト結果を見やすくするプラグイン6選

## codedungeon/phpunit-result-printer

PHPUnit Pretty Result Printer

![sample.png](https://qiita-image-store.s3.amazonaws.com/0/889/d8829e98-84ae-de17-9d33-5f717dda419f.png)

:octocat: [mikeerickson/phpunit-pretty-result-printer](https://github.com/mikeerickson/phpunit-pretty-result-printer)

## whatthejeff/nyancat-phpunit-resultprinter

Nyan Cat result printer for PHPUnit.

![nyan.gif](https://qiita-image-store.s3.amazonaws.com/0/889/256147e0-c1f7-6d48-fbdc-d4d6af88fd6e.gif)

:octocat: [whatthejeff/nyancat-phpunit-resultprinter](https://github.com/whatthejeff/nyancat-phpunit-resultprinter)

## diablomedia/phpunit-pretty-printer

A PHPUnit result printer that shows per-file test progress and execution times.

Default output:

![d76eda8a-e6a9-11e5-8c6b-04b6ec9976eb.png](https://qiita-image-store.s3.amazonaws.com/0/889/4185a8d7-2d21-8398-10c9-41a0f77e0d4c.png)

Debug output showing time to run:

![e0a09986-e6a9-11e5-891a-08c7b6389fca.png](https://qiita-image-store.s3.amazonaws.com/0/889/dd00a609-8206-f315-e24e-678d180942ed.png)

:octocat: [diablomedia/phpunit-pretty-printer](https://github.com/diablomedia/phpunit-pretty-printer)

## limedeck/phpunit-detailed-printer

Detailed output formatter for PHPUnit tests.

![phpunit-pretty.png](https://qiita-image-store.s3.amazonaws.com/0/889/b6b92d90-4fd0-0a8e-122e-1026a1d2df1a.png)

:octocat: [LimeDeck/phpunit-detailed-printer](https://github.com/LimeDeck/phpunit-detailed-printer)

## coderabbi/phpumoji

PHPUnit Emoji Result Printer

![0_KVOesIaoUwNOUOpw.jpg](https://qiita-image-store.s3.amazonaws.com/0/889/9dd73630-6958-6de5-221f-ae06e8c17fd7.jpeg)

:octocat: [coderabbi/phpumoji: PHPUnit Emoji Result Printer](https://github.com/coderabbi/phpumoji)

## rpkamp/fancy-testdox-printer

Fancy testdox printer for PHPUnit 6.

The output of the test suite for this project using itself as a printer looks as follows:

![testsuite.png](https://qiita-image-store.s3.amazonaws.com/0/889/7aa50d34-732e-521c-e64b-142b51401807.png)

A possible output with failures, errors, etc looks as follows:


![example.png](https://qiita-image-store.s3.amazonaws.com/0/889/9027a980-fea3-7802-7693-e6d8682fd737.png)

:octocat: [rpkamp/fancy-testdox-printer](https://github.com/rpkamp/fancy-testdox-printer)
iLO5で JP配列のキーボードを使う方法

モニタとかが 用意できなくて 仕方なく iLOの HTMLコンソールで 作業してたときに
ascii配列キーボードの 認識になってて 困った。

キーボード レイアウトの変更方法を みつけたので メモしておく。

HTML５コンソールをお 起動して でてきた windowの 左肩に キーボードマークが 表示されているのに気が付いた。

そのメニューから keyboard layout → jp106 を 選択したら 日本語配列で 入力できるようになった。

知らなかっただけだったけど 同じように 困ってる人向けに メモ程度だけど 有効とおもうので書いておきますね。
C++のコンパイル時に型を使った自然数で1+1==2を確かめる

小ネタ. (0 = `zero`, 1 = `succ<zero>`, 2 = `succ<succ<zero>>`, ...)という風にネストしたクラステンプレートの実体を自然数に対応させて1+1=2を確認する. 数学に疎いので厳密な証明になっているかはわかりません.

```c++
#include <type_traits>

namespace nat {
struct nat {};

template <class T>
concept bool Nat = std::is_base_of_v<nat, T>;

/* 自然数0が存在する */
struct zero : nat {};

/* 全ての自然数にはその次の自然数が存在する */
template <Nat>
struct succ : nat {};

template <Nat, Nat>
struct plus;

template <Nat N, Nat M>
using plus_t = typename plus<N, M>::type;

/* 加法の定義 */
/* N + 0 = N */
template <Nat N>
struct plus<N, zero> {
  using type = N;
};

/* 加法の定義 */
/* N + succ(M) = succ(N + M) */
template <Nat N, Nat M>
struct plus<N, succ<M>> {
  using type = succ<plus_t<N, M>>;
};

} // namespace nat

auto main() -> int {
  using namespace nat;

  /* 1 := succ(0) */
  using one = succ<zero>;

  /* 2 := succ(succ(0)) */
  using two = succ<succ<zero>>;

  static_assert(std::is_same_v<plus_t<one, one>, two>, "1 + 1 == 2");
}
```

#### 検証(コンパイル)
自然数の制約にC++2aのconceptを使ったので適宜対応するオプションを与える. アサーションが失敗せずにコンパイルが通るはず.

```shell-session
$ g++-8 -std=c++2a -fconcepts peano.cpp
```
## おまけ
偶数を定義してみる

```c++
namespace nat {
template <Nat>
struct is_even;

template <Nat N>
constexpr bool is_even_v = is_even<N>::value;

template <Nat N>
concept bool Even = is_even_v<N>;

/* 0は偶数 */
template <>
struct is_even<zero> : public std::bool_constant<true> {};

/* 偶数の次の次は偶数 */
template <Even E>
struct is_even<succ<succ<E>>> : public std::bool_constant<true> {};

/* それ以外は偶数ではない */
template <Nat>
struct is_even : public std::bool_constant<false> {};
} // namespace nat

auto main() -> int {
  using namespace nat;
  using one = succ<zero>;
  using two = succ<one>;
  using three = succ<two>;
  using four = succ<three>;
  using five = succ<four>;

  static_assert(Even<zero>,   "0 is even");
  static_assert(!Even<one>,   "1 is not even");
  static_assert(Even<two>,    "2 is even");
  static_assert(!Even<three>, "3 is not even");
  static_assert(Even<four>,   "4 is even");
  static_assert(!Even<five>,  "5 is not even");
}
```
Coreserverでの仮想環境づくり（諦めました）

Djangoを利用してWebアプリを作ってみよう。
ということで、もう作るものは決まってるので、借りてるCoreserverにインストールしてその環境で作ってみます。

とりあえず、場所は以下。

```
 [python 2系]
 #!/usr/local/bin/python
 [python 3系]
 #!/usr/local/bin/python3 
```
環境の現状確認。コマンドはこちら
http://petitbit.blogspot.com/2012/05/coreserverpip.html

```
[p2nd@s99 ~]$ pip --version
pip 8.1.2 from /usr/lib/python2.7/site-packages (python 2.7)
[p2nd@s99 ~]$ python --version
Python 2.7.5
[p2nd@s99 ~]$ 
```
おろ？2系がデフォなわけね。

【参考】
・レンタルサーバにインストールする手順
http://ytaro-wps.blogspot.com/2017/08/xrea-django.html

・pythonの仮想環境どれつかえばいいの？
https://qiita.com/shibukawa/items/0daab479a2fd2cb8a0e7

なんかvirtualenvが良いらしい。
・リンクも充実。良記事。
https://qiita.com/Kodaira_/items/feadfef9add468e3a85b
・いろいろまとめ(長所、短所)
http://www.zopfco.de/entry/2017/04/03/233811

ということで、pyenv+virtualenv
でいきます。

あと、諸々あとで環境コピーとかしたいので、Docker使います。

CoreServerは、SUSELinux

```
[p2nd@s99 etc]$ uname -a
Linux s99.coreserver.jp 4.4.0-128-generic #154-Ubuntu SMP Fri May 25 14:15:18 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
```
違うじゃないかｗ

[Docker公式のインストール手順](http://docs.docker.jp/engine/installation/linux/ubuntulinux.html)

さて、sudo,root権限がないので、apt-getが使えない。。。
ソースゲットしてビルドしてみる。

https://docs.docker.com/install/linux/docker-ce/ubuntu/#install-using-the-convenience-script

```
local/bin
```
のフォルダ作って

```
$ curl -fsSL https://get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh
```
```
[p2nd@s99 bin]$ sh get-docker.sh
# Executing docker install script, commit: 36b78b2
+ su -c 'yum install -y -q yum-utils'
Password: 
su: Authentication failure
```
あれ、SSH用のパスワードじゃ動かんのか。。。

gitからインストールする方法もあったので試してみる。
http://d.hatena.ne.jp/embedded/20140626/p1
https://inokara.hateblo.jp/entry/2015/09/25/153841
https://qiita.com/kohga/items/0a8defe4fa9bf09a2177

```
[p2nd@s99 docker]$ pwd
/virtual/p2nd/local/bin/docker
```
よーわからんのでbin以下にフォルダ作成

```
[p2nd@s99 docker]$ git clone https://github.com/docker/docker-ce.gitCloning into 'docker-ce'...
remote: Counting objects: 359410, done.
remote: Compressing objects: 100% (18/18), done.
remote: Total 359410 (delta 3), reused 13 (delta 0), pack-reused 359388
Receiving objects: 100% (359410/359410), 144.42 MiB | 16.61 MiB/s, done.
Resolving deltas: 100% (184345/184345), done.
```
```
[p2nd@s99 docker]$ cd docker-ce/
[p2nd@s99 docker-ce]$ make deb
```

途中で引っかかった。proxy errorだとか

、、、
Rails5.2をCloud9(aws)で始める手順

環境：cloud9(AWS)

#初回のみ実行

**①Railsをインストール**

```
$ gem install rails -v 5.2.1
```
※バージョン指定しない場合は最新版が入る

**②使用できるRailsのバージョンを確認**

```
$ gem list rails
```
#Rails5.2をCloud9(aws)で始める手順

**①プロジェクトを作成**

```
$ rails _5.2.1_ new projectname --database=mysql
```
※上記はmysqlを使用する例です。細かいオプションはドキュメントなどで要確認！

**②プロジェクトに移動**

```
$ cd ~/environment/projectname
```

**③DBを作成**

```
$ sudo service mysqld start
$ rails db:create
```

**④サーバの起動**

```
$ rails s -p 8080
```
※ポートは8080番を使用する

**⑤「Yay! You’re on Rails!」の確認**

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/199403/38c2caa9-12be-6d28-0a30-f909cd218b4e.png)

Preview → Preview Running Application → Pop Out Into New Window
でRailsの画面が表示できれば成功です。

**⑥Gitイニシャライズ**

```
$ git init
$ git add .
$ git commit -m "init Rails Project"
```

あとは Model →　Router →　Controller → View と開発していくだけです！
貪欲法

貪欲にその場での最善を選択することを繰り返すというアルゴリズム設計技法
硬貨の問題
１円玉、５円玉、１０円玉、５０円玉、１００円玉、５００円玉がそれぞれC1,C5,C10,C50,C100,C500枚ずつあります。できるだけ少ない枚数の硬貨でＡ円を支払いたいと考えています。何枚の硬貨を出す必要があるでしょうか？なお、そのような支払い方は少なくとも１つは存在するとします。
大きな額の硬貨をできるだけ多く使う直感の通りに。

```
#include<iostream>
#include<algorithm>
using namespace std;

const int V[6] = { 1,5,10,50,100,500 };
int C[6];
int A;
int main() {
	cin >> A;
	for (int i = 0; i < 6; ++i)
		cin >> C[i];
	int ans = 0;
	for (int i = 5; i >= 0; i--) {
		int t = min(A / V[i], C[i]);
		A -= t * V[i];
	1	ans += t;
	}
	cout << ans;
}
```
区間スケジューリング問題
Ｎ個の仕事がある。各仕事は時間Ｓｉに始まり、時間Ｔｉに終わる。あなたは各仕事について、参加するか参加しないかを選ばなければなりません。仕事に参加するならばその仕事の始めから終わりまで参加しなければなりません。また、参加する仕事の時間帯が重なってはいけません。
できるだけ多くの仕事に参加したいです。何個の仕事に参加することができるでしょうか。
1<=N<100000
1<=Si<Ti<=10**9
これも貪欲法で解ける。選べる仕事の中で、終了時間が最も早いものを選ぶことを繰り返す。

```
#include<iostream>
#include<algorithm>
using namespace std;

const int MAX_N = 100000;
int N, S[MAX_N], T[MAX_N];
pair<int, int>itv[MAX_N];
int main() {
	cin >> N;
	for (int i = 0; i < N; ++i) {
		cin >> S[i] >> T[i];
	}
	//pairは辞書順で比較される
	//終了時間の早い順にしたいため、Tをfirstに、Sをsecondに入れる。
	for (int i = 0; i < N; ++i) {
		itv[i].first = T[i];
		itv[i].second = S[i];
	}
	sort(itv, itv + N);
	//tは最後に選んだ仕事の終了時間
	int ans = 0, t = 0;
	for (int i = 0; i < N; i++) {
		if (t < itv[i].second) {
			ans++;
			t = itv[i].first;
		}
	}
	cout << ans;
	return 0;
}
```

Best Cow Line
Ｎ文字の文字列Ｓが与えられ、Ｎ文字の文字列Ｔを作ります。はじめはＴは長さ０の文字列で、次にいずれかの操作が行えます。
・Ｓの先頭を１文字削除し、Ｔの末尾に追加する。
・Ｓの末尾を１文字削除し、Ｔの末尾に追加する。
辞書順比較でできるだけ小さくなるようにＴを作ってください。

これも貪欲法でとける。Ｓの先頭と末尾の、より小さいほうの文字をＴの末尾に付け加えることを繰り返す。が一見よさそうに思えるが、Ｓの先頭と末尾が同じの文字の場合が定義されていません。そのような場合、その文字の後にできるだけ良い文字を早く使いたいので次の文字を比較する必要がある。次の文字も一致しているかもしれない。よって、次のようにします。
・ＳとＳを反転させた文字列Ｓ‘を辞書順比較する。
・Ｓが小さいのであれば、Ｓの先頭を１文字削除し、Ｔの末尾に追加する。
・Ｓが大きいのであれば、Ｓの末尾を１文字削除し、Ｔの末尾に追加する。
（同じならばどちらでもよい）

```
#include<iostream>
using namespace std;

const int MAX_N = 2010;
int N;
char S[MAX_N + 1];
int main() {
	cin >> N;
	cin >> S;
	int a = 0, b = N - 1;
	while (a <= b) {
		bool left = false;
		for (int i = 0; a + i <= b; i++) {
			if (S[a + i] < S[b - i]) {
				left = true;
				break;
			}
			else if (S[a + i] > S[b - i]) {
				left = false;
				break;
			}
		}
		if (left)putchar(S[a++]);
		else putchar(S[b--]);
	}
	putchar('\n');
}
```
賢いな。putchar(a)はaを出力する。今知った。

Saruman`s Army
N個の点が直線状にあります。点iの位置はXiです。N個のうちのいくつかの点を選び、それらの点に印をつけます。N個のすべての点について、距離がR以内の場所に印を付けられた点がなければなりません。（自分に印が付いていれば、距離が０のところにあると考えます）。条件を満たすようにしながら、できるだけ印を付ける点を少なくしたいです。何個の点に印を付ける必要があるでしょうか。
・1<=N<=1000
・0<=R<=1000
・0<=Xi<=1000

```
#include<iostream>
#include<algorithm>
using namespace std;
int N, R;
const int MAX_N = 1010;
int X[MAX_N];
int main() {
	cin >> N >> R;
	for (int i = 0; i < N; i++)
		cin >> X[i];
	sort(X, X + N);
	int i = 0, ans = 0;
	while (i < N) {
		//sはカバーされていない一番左の点の位置
		int s = X[i++];
		//sから距離Rを超える点まで進む
		while (i < N && X[i] <= s + R)i++;
		//pは新しく印を付ける点の位置
		int p = X[i - 1];
		//pから距離Rを超える点まで進む
		while (i < N && X[i] <= p + R)i++;
		ans++;
	}
	cout << ans;
}
```
Re;dashでIP BANされてしまった場合の対処

# この記事について

Re;dashではFlaskLimiterという、API制限をかけたりするライブラリを内部的に使って、ログインページ（/login）へのアクセスを制限しているようです。デフォルトでは1時間50アクセス（REDASH_THROTTLE_LOGIN_PATTERNの設定値で変えられるようです）。GET,POST双方でカウントされるので、loginページをリロードしまくると再現できます。

これでBAN（BANとはちょっと違うかもしれませんが）されると429 Too Many Requestsが返されます。何らかの原因でこの状態になってしまった場合の対処法を軽く紹介します。1時間待てって？　それが正しいです。

# 対処法

1時間も待ちきれないぜというそこのあなたに向けた方法。もしかしたらボタンぽちーでできてしまったりするのかもしれませんが、、、

FlaskLimiterはIPなどのアクセス情報の保存先にRedisを利用しているようです。デフォルトではローカルホストをさしているので、Redashが動いているサーバでredis-cliコマンドをたたきましょう。

そしてkeysコマンドで保存されているキーを見るとそれっぽいのがあるかと思いますので削除しましょう。一気に全部削除もできますが、一応必要なものだけを消すようにしましょう。

```
$ redis-cli keys LIMITER*
LIMITER/xxx.xxx.xxx.xxx/redash.login/50/1/hour
...
$ redis-cli del LIMITER/xxx.xxx.xxx.xxx/redash.login/50/1/hour
```

これで/loginにアクセスできればokです。
ES6　アロー関数

アロー関数の書き方まとめ

```js:js
//普通のアロー関数
const addNumber = (x) => {return x + x}

//引数が１つの場合はカッコを省略可能
const addNumber = x => {return x + x}

//return文だけの場合は波括弧とreturnが省略可能
const addNumber = x => x + x;

//引数がない場合
const addNumber = () => x + x;
```


引数を｛｝で囲むと、チェーンを省ける

```js:js
const obj = {FirstName:Tatsumi,FamilyName:Makoto};

addName({FirstName}) { console.log(FirstName); };
```
パーティションが区切られてWindows上で認識できるサイズが小さくなったUSBメモリをもとに戻す

# 環境
Windows 10
USBメモリを挿しておく

# やり方
##### 1. 管理者権限でコマンドプロンプトを実行
windowsキー+X で 「コマンドプロンプト(管理者)」
(PCによっては「Windows PowerShell(管理者)」) を選択するか、
コマンドプロンプトから以下を実行。

```console
>powershell Start-Process cmd -verb runas
```

#### 2. diskpart を実行
1 で起動した管理者権限のコマンドプロンプトでdiskpartを実行。

```console
>diskpart

Microsoft DiskPart バージョン 10.0.14393.0

Copyright (C) 1999-2013 Microsoft Corporation.
コンピューター: *******

DISKPART>
```

#### 3. clean コマンド実行
list disk を実行して目的のUSBメモリが何番かを確認。
今回の場合は 「ディスク 3」。

```console
DISKPART> list disk

  ディスク      状態           サイズ   空き   ダイナ GPT
  ###                                          ミック
  ------------  -------------  -------  -------  ---  ---
  ディスク 0    オンライン          1234 GB      0 B        *
  ディスク 1    オンライン           567 GB      0 B
  ディスク 2    オンライン          7636 MB  7635 MB
```

select disk * を実行して目的のUSBメモリを選択、
list disk を実行して目的のUSBメモリが選択中であることを確認。
その後、cleanを実行。(clean all とするとゼロフィルも行われる）

```console
DISKPART> select disk 2

ディスク 2 が選択されました。

DISKPART> list disk

  ディスク      状態           サイズ   空き   ダイナ GPT
  ###                                          ミック
  ------------  -------------  -------  -------  ---  ---
  ディスク 0    オンライン          1234 GB      0 B        *
  ディスク 1    オンライン           567 GB      0 B
* ディスク 2    オンライン          7636 MB  7635 MB

DISKPART> clean

DiskPart はディスクを正常にクリーンな状態にしました。

```

#### 4. プライマリパーティションを作成してフォーマット
念のため、list par を実行してパーティションが無くなったことを確認し、
create partition primary を実行してパーティションを作成。

```console
DISKPART> list par

このディスクには表示するパーティションがありません。

DISKPART> create partition primary

DiskPart は指定したパーティションの作成に成功しました。

```

最後にドライブを右クリックするなりしてフォーマットすれば使用可能に。
![bandicam 2018-08-24 14-31-01-312.jpg](https://qiita-image-store.s3.amazonaws.com/0/119600/cfcc8a22-9e06-d490-e548-ebd332442d5e.jpeg)


# 参考
[Windowsで、diskpartのcleanコマンドを使ってディスクの内容を消去す](http://www.atmarkit.co.jp/ait/articles/1004/16/news101.html)
ゼロから作るDeep learning  MNISTデータセット方法　メモ

###ubuntu1604でMNISTデータセットをダウンロードする。

何故このような事を記述しようと思ったのか...
個人的に時間がかかっ(ry

方法としては、
まず
1.[https://github.com/oreilly-japan/deep-learning-from-scratch](https://github.com/oreilly-japan/deep-learning-from-scratch)でデータをDL
2.cd をつかってダウンロードまで移動しunzipで解凍
3.そしてch01 or ch02..～ch08に移動
4.本書のコードを記述...

★おわり★

ーーーーーーーーーーーーーーー
ダウンロード説明文の中に出ていた単語。わからなかったので調べた。
①スクリプト
→ソースコードを記述したら即座に実行できるようなプログラムのこと
②ディレクトリ
→ファイルを分類・整理することができる保管場所のことをディレクトリのこと
・カレントディレクトリ
→現在位置として指し示しているディレクトリのこと
AWSでhttps通信するマルチテナントのWebサービスに共通のメンテナンス画面を表示する

# 概要

　AWSでマルチテナントのWebサービスを提供していますが、システムメンテナンス時に各テナントに一律メンテナンス画面を表示するための方法を紹介します
　手っ取り早くWebサーバを立ち上げれば簡単に実現できるが、コスト（マシンコスト、管理コスト）がかかるので、極力マネージドサービス（S3、CloudFrontなど）で完結したい

# 凡例

説明がわかりやすくなるように以下の仮のドメイン名を説明文に含めています
実際の設定では環境に合わせて変更してください

- Webサービスのドメイン名「comefigo.com」
- テナントのサブドメイン名「tenant1.comefigo.com」、「tenant2.comefigo.com」 
- メンテナンス画面用のサブドメイン名「maintenance.comefigo.com」

# システム構成

各テナントはALBのリスナーのルーティングでサブドメイン(tenant1.comefigo.com / tenant2.comefigo.com)によって、遷移するインスタンスを振り分けている
![architecture.png](https://qiita-image-store.s3.amazonaws.com/0/30522/ef0589ee-3e72-efe8-2729-147ed8d03d31.png)

# メンテナンス時のシステム構成

1. Route53の各サブドメインの遷移先をメンテナンス用のALBに設定変更（API経由で）
2. メンテナンス用のALBのリダイレクト設定でメンテナンス用コンテンツ(maintenance.comefigo.com)にリダイレクトする
![mente_architecture.png](https://qiita-image-store.s3.amazonaws.com/0/30522/8d0db2cf-a202-1ee9-7508-cf6adeccd80f.png)

# 設定方法

1. メンテナンス画面用のS3バケットの作成とCloudFrontの作成方法は「[AWS S3でのhttps対応含む静的ウェブサイト公開](https://qiita.com/THHacker/items/11eadffe6b3ce3491e3b)」を参照してください
    **[補足]：**
    - CloudFrontと連携できるCertificate Managerは**バージニア北部リージョン**のみになるので、そのリージョンで新たに証明書を発行しておく必要がある（複数個所で同一ドメインに対する証明書を発行しても問題はない）
    - Route53のメンテナンス画面用のレコードセットの設定は以下になります  
      Type：「A-IPv4 address」  
      Alias Target：「CloudFrontで作成したDistributionsのDomain Name（xxxxxxx.cloudfront.net）」

設定が完了し、メンテナンス画面が表示できることを確認してください
例）メンテナンス画面用のドメイン名を「maintenance.comefigo.com」とした際は、「https://maintenance.comefigo.com 」で表示されること
2. Application Load Balancer（ALB）を作成
　[ステップ１ ロードバランサーの設定]：
　　・リスナーのロードバランサーのプロトコル：HTTP、ポート：80
　[ステップ２ セキュリティ設定の構成]：
　　・警告メッセージが表示されるが、そのまま次へ
　[ステップ３ セキュリティグループ]：
　　・外部通信できるHTTPS(443)ポートを開放したセキュリティグループを割り当て（**あえて443ポート**）
　[ステップ４ ルーティングの設定]：
　既存のターゲットグループ(80ポート)があればそれを選択し、なければ以下のように作成
　　・ターゲットグループ：新しいターゲットグループ
　　・プロトコル：HTTP
　　・ポート：80
　　・ヘルスチェックのプロトコル：HTTP
　[ステップ５ ターゲットの登録]
　　・そのまま次へ
3. 作成したALBが「active」になったことを確認し、作成されたリスナーを削除し、新たに「リスナーの追加」します
　ついでに前述で作成されたターゲットグループも削除しても問題ない！
　ここからが**肝**です！
　**ALBの新規作成時には選べないリダイレクト設定はALBを作成後に「リスナーの追加」からできるようになります！**
4. リスナーの追加
　・プロトコルはHTTPS、ポートは443
　・リダイレクト先を前述で作成したメンテナンス用ドメイン（maintenance.comefigo.com）
　・パスは「/」
　　一律リダイレクト先のルートに転送するようにしていますが、コンテンツの配置に合わせて変更してください
　・証明書はWebサービスが展開されているリージョンのものを使用します
![new_listener.png](https://qiita-image-store.s3.amazonaws.com/0/30522/b833fe42-a062-35ea-a30b-22ec27c46d9d.png)
5. ALBのDNS名で(HTTPS)アクセスし、メンテナンス画面に転送されることを確認してください
6. Route53で（メンテナンス用のドメイン以外）適当なサブドメイン(tenant1.comefigo.com)の「Alias Target」で手順2で作成したロードバランサーを選択する
7. 適当なサブドメイン名(tenant1.comefigo.com)でアクセスし、メンテナンス画面に転送されることを確認してください

以上！

本番運用時はAnsibleですべてのサブドメインの遷移先をメンテナンス用のロードバランサーに変更する
超初心者が考える複雑な処理を行うメソッドの命名

# はじめに
超初心者も超が取れてきた時期になってきました。とりわけ最近は業務で複雑な処理を読み書きする機会が増えてきました。
そんな矢先であったのがこんなメソッドです。

```php
private function addCreateNotChangeAppliedData(array $applyData): array
```

思わず ~~吐き気~~　寒気がしました。
この記事では、このメソッド名の 

* 何が問題なのか？ 
* どう解決すべきなのか？
* 最適な考え方は？

という点を初心者なりに考察してみます。
業務情報のため、内容をぼかしつつメソッドの中身についてまでは載せられませんことをご容赦ください。

# 問題点
## 【前提】処理について
そもそもこの処理は、業務の複雑性が生んだメソッドです。日本語でわかりやすく処理を要約すると、**原稿の追加申請時、以前までの申請中データのうち今回変更対象でない物をDBから取得**という処理です。
わけが分かりませんね。
もう少し噛み砕いていきましょう。
前提：一つのIDの下に紐づいてグループがいくつかある。今回はID1,グループ1,2,3という想定。

1. ID1のあるグループ1において原稿の追加申請が来る
2. ここでは申請対象ではない、グループ2,3のすでに申請中の情報を取得

という流れです。
つまり、メソッド名を分解すると、

* add　→　追加申請のこと
* Create　→　取得するよということ
* NotChange　→　申請対象でないという意味
* AppliedData　→　(申請対象ではないなかの)申請中の情報

ということになるかと考えられます。

## 問題点
まず最初に私がこのメソッドを拝見して感じたことは、*英文法的に動詞が多用されていて、処理を詳しく見ないと何がしたいか分からない*ということです。
この書き方では**add**,**create**,**change**の3種類の動詞が使用されており主目的がわからなくなっています。
また、助詞が使われていないことも上記の問題を生み出すと考えられます。

#解決策と考え方

上段で問題点をあげました。
では一つずつ潰していきましょう。

##動詞選定
英語では本来関係代名詞等を用いない簡単な文の場合、動詞は1文で1つになります。
今回の場合主たる目的は**DBからの取得**になっているため、動詞は取得することを表すもの1つにします。
また、 DBからの取得の場合**create**よりも**fetch**が最適と考えられるため、**fetch**を用いていきます。

##目的語選定
こちらは**appliedData**または申請中という意を込めて現在分詞を用いた**applyingData**でもいいかと思います。
現在、**fetchAppliyngData**まで出来上がりました。

##補語追加
追加申請を表す語については助詞の**for**を用いれば分かりやすくなるかと思います。また助詞の後の動詞であれば、それが略語なのか動詞として使用しているのかが一目で分かりやすいため、**forAdd**とします。
現在、**fetchAppliyngDataForAdd**まで出来上がりました。

##形容詞選定
個人的に今回のメソッド名を一層難しくしていると思う**申請対象ではない**という意味を表すものについて考えていきます。
まず、このメソッドが使われているクラスは申請関連にしか使われません。またこのクラスの申請は**add**と**update**を対象としています。
###解決策その１
追加対象外という意を込め**forNotAdd**または**forExcludedAdd**を用いる
###解決策その2
変更対象外という意を込め**NotChanged**または**NotTarget**を用いる
その場合は**change**や**target**の対象がわかるように**forAdd**は採用せず、**NotTargetOfAdd**などになり複雑になる。

##候補


**fetchAppliyngDataForNotAdd**
**fetchAppliyngDataForExcludedAdd**
**fetchNotChangedAddsAppliyngData**
**fetchNotTargetOfAddAppliyngData**

元祖
**addCreateNotChangeAppliedData**

#まとめ
メソッド名は長さよりも分かりやすさが何よりだと思うので元祖に比べればマシなものは完成したかなと感じる。
しかし、どれもしっくりするものではなく、これはメソッド名だけでなく、そもそもメソッドに処理が多すぎる可能性も否めないため、適切な処理量まで考えなきゃダメだと感じた。

##ポイント
* 動詞は1つ
* 現在分詞、受動態などを用いて情報を装飾
* 助詞forは結構使える


# 最後に
かなり書き殴りになり、完璧なものができたわけでもないので、「こういう考え方があるよ」「こうした方がいいんじゃない？」等のご意見があればぜひお待ちしております！

# 参考
[プログラミングでよく使う英単語のまとめ【随時更新】](https://qiita.com/Ted-HM/items/7dde25dcffae4cdc7923#%E5%90%8D%E8%A9%9E%E3%82%92%E4%BD%9C%E3%82%8B%E6%8E%A5%E5%B0%BE%E8%BE%9E)
erbファイルをSlimに一括変換するGemとfishワンライナー

Railsのテンプレートエンジンをslimにしたときに、erbをslimに変換する処理を毎度毎度ググってしまうので、もう書いておくことにする。

# html2slimのインストール

```bash
gem install html2slim -N
```

Gemをインストールすると、html2slimとerb2slimのコマンドが使えるようになります。

# app/views/以下の.erbを.slimに変換する

erbファイルをslimに変換後に、削除します。

```fish
for i in app/views/**/*.erb; erb2slim $i (dirname $i)/(basename $i .erb).slim; and rm $i; end
```

# 参考ページ

[[Rails4,Rails5] erbファイルをSlimに一括変換するGemとRubyワンライナー](https://qiita.com/mocchicc/items/abab4cdfac7b542742a6)
fastlane でビルド番号をインクリメントするときに increment_build_number では具合が悪い場合の方法

* 実行環境
    * Xcode 9.3
    * Swift 4.1
    * Ruby 2.5.0
    * fastlane 2.102.0

通常、ビルド番号の繰り上げには [increment_build_number](https://docs.fastlane.tools/actions/increment_build_number/) を使いたいところですが、`increment_build_number` はすべての Info.plist を更新するので、開発用とリリース用で Info.plist を分けている場合なんかには具合が悪いです。

そこで次の Action を組み合わせて対応しました。

* [get_info_plist_value](https://docs.fastlane.tools/actions/get_info_plist_value/)
* [set_info_plist_value](https://docs.fastlane.tools/actions/set_info_plist_value/)

※ `get_info_plist_value` と `set_info_plist_value` の代わりに [update_plist](https://docs.fastlane.tools/actions/update_plist/) を使ってもよい

```ruby
app_version = get_info_plist_value(path:'Info.plist のパス', key: 'CFBundleShortVersionString')
build_number = latest_testflight_build_number(app_identifier: 'Bundle ID', version: app_version)
build_number = (build_number.to_i + 1).to_s
set_info_plist_value(path: 'Info.plist のパス', key: 'CFBundleVersion', value: build_number)
```
Headless で リストで与えられたページを取り込む (python3)

リストで示された URL を取り込む方法です。

```py:fetch_html_list.py
#! /usr/bin/python
# ------------------------------------------------------------------
#
#	fetch_html_list.py
#
#						Aug/24/2018
# ------------------------------------------------------------------
import	sys
from selenium.webdriver import Firefox
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.support import expected_conditions as expected
from selenium.webdriver.support.wait import WebDriverWait

from selenium.webdriver.firefox.options import Options

# ------------------------------------------------------------------
def file_write_proc(file_name,str_out):
	fp_out = open(file_name,mode='w',encoding='utf-8')
	fp_out.write(str_out)
	fp_out.close()
#
# ------------------------------------------------------------------
def fetch_single_proc(url_target,file_html):
	sys.stderr.write("url_target = " + url_target + "\n")
#
	driver.get(url_target)
	driver.save_screenshot("out.png")
	html = driver.page_source

	file_write_proc(file_html,html)
#
# ------------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")
file_list = sys.argv[1]
fp_in = open(file_list,encoding='utf-8')
lines = fp_in.readlines()
fp_in.close()
#
options = Options()
options.add_argument('-headless')
driver = Firefox(executable_path='/usr/bin/geckodriver', firefox_options=options)
ttx = 100
wait = WebDriverWait(driver, timeout=ttx)
#
for line in lines:
	print(line)
	cols= line[:-1].split()
	print(len(cols))
	fetch_single_proc(cols[0],cols[1])
#
driver.quit()
#
sys.stderr.write("*** 終了 ***\n")
# ------------------------------------------------------------------
```

使い方

```bash
./fetch_html_list.py list_url.txt
```

```text:list_url.txt
https://example.com/aaa/ a001.html
https://example.com/bbb/ a002.html
https://example.com/ccc/ a003.html
https://example.com/ddd/ a004.html
```
enumから始めるテスト

以下のように、フィールドを持つenumを定義した場合のテストについて、私はこのようなテストを書くようにしています。

```kotlin:SampleType.kt
enum class SampleType(val id: Int) {
  AAA(1),
  BBB(2)
}
```

```kotlin:SampleTypeTest.kt
class SampleTypeTest {
  @Test
  fun idが重複しないこと() {
    val ids: Set<Int> = SampleType.values().map { it.id }.toSet()

    assertEquals(SampleType.values().size, ids.size)
  }
```

enumはよく追加されることもあり、その際コピペにより重複したidを持つenumが作られてしまうこともよくあると思います。enumの数が多くなると、余計に気づきづらいこともあるので、いいのではないかな、と思います。
idの重複を許す場合は考える必要がありますが…
【CSS】aタグのフォントカラーが変わらない謎【初心に返ろう】

#Q. 深く考えたことないけどなんでフォントカラーを全体に指定してもaタグの中は変わらないの？

なんかもう経験として知ってたからスルーしまくってたこの疑問。
あえて切り込んで調べてみることにしました！
暇だからじゃないよ。

#A. 各ブラウザ（IE、Google Chrome…）でaタグにあらかじめフォントカラーを設定してあるから。

なんと。そんな単純なことだったのか。
なんかがっかりした。
確かにIEのリンクといえば青文字にアンダーライン！とかあるもんねぇ。

ちなみに私はCSSを書くときに最初に

```css:CSS(はじめのほうに記述)
a{
   color:red;
   text-decoration:none;
}
```
とかなんとか書いてaタグ全体に反映されるようにします。
んで、イレギュラーで違う見た目にしたいときはクラスとかで細かく分けてた・・・んだけど、なにやら便利そうな記事を発見しました。

発見した記事 [CSS tips - a タグの色が変わらないときは color: inherit を指定しよう | phiary](http://phiary.me/css-tips-a-color-inherit/)

##color: inherit;

**inherit** の意味は、親要素のプロパティの値を継承すること。
つまり **color: inherit;** は親要素のカラーを継承するって意味になる。

例えば、ヘッダーの色を共通で赤くしたいとします。しかも特殊な赤。
いつもの私はこうしてました。

<p data-height="265" data-theme-id="0" data-slug-hash="NLqOXW" data-default-tab="css,result" data-user="kapeking" data-pen-title="aタグの便利な使い方" class="codepen">See the Pen <a href="https://codepen.io/kapeking/pen/NLqOXW/">aタグの便利な使い方</a> by かぺ (<a href="https://codepen.io/kapeking">@kapeking</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

まず全体反映用に **nav** に文字色指定し、**a** にも同じ色を指定します。

```css:css(上記から抜粋)
nav{ color:#ff0e29; }
nav a{ color:#ff0e29; }
```
でもこれ、ちょっと2度手間感あるしスマートじゃない。
そこで **inherit** を使うと・・・

```css:css(いい感じの記述例)
nav{ color:#ff0e29; }
nav a{ color:inherit; }
```
これでも結果は全く同じ！navで指定したカラーを継承します。
これなら後からリンク色変えても問題ないですね。

今度から私も **color: inherit;** をガンガン使っていこうと思います！
ArchlinuxでモナコインをビルドするとBigNumでエラーが出る

モナコイン（と、元のソースであるビットコイン）は、内部で使用する多倍長整数に、`<openssl/bn.h>`が持つ'BIGNUM'を利用しています。

このBIGNUMは、openssl 1.0ではクラスなのですが、1.1から構造体になりました。
そのため、標準のopensslが1.1であるArchlinuxなどでモナコインをビルドしようとすると、以下のようなエラーが発生します。

```c++:エラーメッセージ
bignum.h:56:24: error: invalid use of incomplete type ‘BIGNUM’ {aka ‘struct bignum_st’}
    class CBigNum : public BIGNUM
                        ^~~~~~ 
```

これを防ぐためには、openssl 1.1と共生できるopensslの1.0パッケージをインストールし、オプションでそちらを使うように指定します。

```sh
$ sudo pacman -S openssl-1.0
$ ./configure --with-openssl PKG_CONFIG_PATH=/usr/lib/openssl-1.0/pkgconfig
```



まあ、今はarithっていうbignumを使ってるみたいですね
AE　一行毎の文字数を制限して改行（全角半角区別付）

#やっている事
前の記事でも投稿していますが、スマホアプリLineのメッセージ画面の動きをAEでアニメートしています。
全てスクリプトで作成する過程で、相手のメッセージは1５文字で折り返し、自分のメッセージは26文字で折り返しという
感じにしたかったので、考えてみました。

#解説
まずはテキストの入ったstrを一度行毎にtemp(array)に入れます。
getLenメソッドで半角なら+1か全角なら+2でカウントします。(ネットで見つけました。作成者さんありがとうございます。)
指定のカウントが来るまでは、そのままtempArrayにプッシュ。指定のカウントになったら改行を入れます。
改行されたらカウントはまた0からスタートします。
そのあと配列を.replace(/,/g,'')+"\r";でresultStrに返しています。

スクリプトはこちら

```jsx
var str =
'hey!! friend. how are you today? im good today too.\
私の名前は山田花子です。生別は女性です。\
2018/08/24日に作成しています。\
hey what your name?\
my name is 「jecy」\
今日も天気が\
崩れたりしています。\
この時期は不安定な天気が続きますね';

function split(target,n){
    var resultStr = '';
    var tempArray;
    var temp = target.split(/\r\n|\n|\r/);
    for ( var i = 0 ; i < temp.length ; i++ ){
        var count = 0 ;
        tempArray = [];
        for ( var j = 0 ; j < temp[i].length ; j++){
            count = count + getLen(temp[i][j]);
            tempArray.push(new Array  ( temp[i][j]) );
            if ( count > n){
            tempArray.push(new Array  ( '\r' ) );
            count = 0 ;
            }
        }
    resultStr = resultStr + tempArray.toString().replace(/,/g,'')+"\r";
    }
    return resultStr;
}

$.writeln(split(str,20));

//global function

function getLen(str){
  var result = 0;
  for(var i=0;i<str.length;i++){
    var chr = str.charCodeAt(i);
    if((chr >= 0x00 && chr < 0x81) ||
       (chr === 0xf8f0) ||
       (chr >= 0xff61 && chr < 0xffa0) ||
       (chr >= 0xf8f1 && chr < 0xf8f4)){
      //半角文字の場合は1を加算
      result += 1;
    }else{
      //それ以外の文字の場合は2を加算
      result += 2;
    }
  }
  //結果を返す
  return result;
};


/*結果
hey!! friend. how are
 you today? im good t
oday too.
私の名前は山田花子です
。生別は女性です。
2018/08/24日に作成して
います。
hey what your name?
my name is 「jecy」
今日も天気が
崩れたりしています。
この時期は不安定な天気
が続きますね
*/

```

#追記
###長い文字列を制限して末尾に...を追加して省略する。

例えば「私の名前は山田太郎です」という文字列を「私の名前は...」に変換する。

```jsx
//global function
function getLen(str){
  var result = 0;
  for(var i=0;i<str.length;i++){
    var chr = str.charCodeAt(i);
    if((chr >= 0x00 && chr < 0x81) ||
       (chr === 0xf8f0) ||
       (chr >= 0xff61 && chr < 0xffa0) ||
       (chr >= 0xf8f1 && chr < 0xf8f4)){
      //半角文字の場合は1を加算
      result += 1;
    }else{
      //それ以外の文字の場合は2を加算
      result += 2;
    }
  }
  //結果を返す
  return result;
};

var str ='hey!! friend. how are you today? im good today too';
var str2 = '私の名前は山田太郎です。'

function textOvershort(target,n){
    var resultStr = '';
    var tempArray = [];
    var count = 0 ;
    for (var i = 0 ; i < target.length ; i ++){
        count = count + getLen(target[i]);
        if (count <= n){
            tempArray.push(new Array (target[i]))
        }else{
        tempArray.push('...')
        break ;    
        }
    }
resultStr = resultStr + tempArray.toString().replace(/,/g,'')
return resultStr;
}

$.writeln(textOvershort(str2,10));


```
CUDAのライブラリであるcuFFTのマルチスレッド実行と複数ストリーム実行について

#cuFFTを並列(マルチスレッド実行もしくは複数ストリーム実行)で実行する
CUDAの関数は大体が非同期的に実行されるため、マルチスレッド実行しても効果があるかどうかは謎ですが、実行するのには躓くポイントがありました。

##スレッドごとにplanを作る
これすごい大事なポイントです。これ知らないとエラーが出たり、実行結果が不定になります。
[cuFFTのドキュメント](https://docs.nvidia.com/cuda/cufft/index.html)によると、以下のように書いてあります。

>2.10. Thread Safety
>cuFFT APIs are thread safe as long as different host threads execute FFTs using different plans and the output data are disjoint.
>(私なりの意訳)スレッドごとに異なるplanかつ出力の変数が異なる限りcuFFTのAPIはスレッドセーフである。

これ読んでなくてplan同じものでやってました。
内部で作業領域とか取るので当たり前ですがそれぞれ別々にplanを作成しましょう。

##planにストリームを設定する。
何も指定しないとデフォルトのストリームになります。
```cufftSetStream()```関数を使いましょう。
これによって複数ストリームで実行されるようになります。
※1つのデバイスにおいて、CUDAの処理が実行される順番は待ち行列のようなものであるストリームに突っ込んだ順になります。そのため、単一のストリームにマルチスレッドで命令を発行する場合は並列で実行されません。(複数ストリームにしたら並列実行"される"可能性があるだけで並列かどうかはデバイスとリソースによる)
```cufftSetStream()```関数は第一引数にplanを、第二引数にストリームを指定します。

これで複数ストリームで実行することが可能になります。
昨今のURL事情

ウェブの進化に伴い、URLの扱いにいろいろと変化が生じているので、まとめます。ざっくりとしたまとめなので、厳密ではない記述もある点にご注意ください。

# URLとは何なのか？

ただのタグです。過去にはサーバー側のディレクトリ構造を表している、あるいはサーバー側のリソースと対応している、という理解でもよかったのですが、現在ではリソースに対するただのタグでしかありません。

# 誰がURLを処理するのか
URLが何を表しているのかは、誰がURLを処理するのかによって変わります。URLを処理しているものは、大きく分けて次の三つです。

* ブラウザ
* ウェブサーバー
* アプリケーションサーバー

なお、以下でサーバー、ウェブサーバー、アプリケーションサーバーという三つのサーバーが出てきますが、単に「サーバー」といった時には、その上でウェブサーバーやアプリケーションサーバーが走っているサーバーOSを指しています。

# ブラウザにおけるURL
ブラウザにおけるURLは、利用者に「現在の位置」を分かりやすく伝えるための標識です。
たとえば、URLが`https://qiita.com/`であれば、「トップページにいるんだな」とわかりますし、`https://qiita.com/xyz`であれば、「xyzさんのプロフィールページにいるんだな」ということが分かります。実際にはセキュリティ等の絡みでもう少し複雑ですが、基本的にはそれだけです。

これがどういうことかというと、ユーザーにとってURLは単にブラウザに「見せられている」だけのもので、そこから何らかの意味（例えばサーバー側のディレクトリ構造等）を読み取ることはできない、ということです。

試しに、`https://qiita.com/`でchromeのデベロッパーツールを開き、コンソールに`history.pushState(null, null, "xyz")`と打ち込んでみてください。ページが遷移しないまま、URLが`https://qiita.com/xyz`に変わったと思います。[^1]つまり、ユーザーが「見せられている」URLは、JavaScriptによって容易に書き換え可能であり、そのURLにどんな意味があるのかは、そのサイトの開発者によって自由に定めることができる、ということです。

# ウェブサーバーにおけるURL
ウェブサーバーにおけるURLは、HTTPリクエストをサーバーのディレクトリ構造とマッピングさせるためのものです。一般的に、URLと聞いて想像されるものは、ウェブサーバーにおけるURLなのではないかと思います。

ウェブサーバーの主な役目は、HTTPリクエストを受け取り、HTTPリクエスト内のURLに対応したファイルを取得し、HTTPレスポンスに入れて返すことです。[^2]

HTTPリクエストとは、以下のような単なるテキストで、ブラウザ等からサーバーへ送信されます。

```http
GET /about.html HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
Host: example.com
```

このようなリクエストであれば、`http://example.com/about.html`へアクセスした、ということです。

中心的な処理となるのが、HTTPリクエスト内のURLとサーバーのディレクトリ構造をマッピングさせる部分です。例えば、`http://example.com`というURLをファイルシステムの`/www`にマッピングさせる、という設定をしておけば、`http://example.com/about.html`というURLに対しては`/www/about.html`が返されます。[^3]

# アプリケーションサーバーにおけるURL
アプリケーションサーバーにおけるURLは、ブラウザと同じく、標識あるいはただのタグに過ぎません。

アプリケーションサーバーも（HTTPに限れば）HTTPリクエストを受け取りHTTPレスポンスを返すという点ではウェブサーバーと同じです。ただし、アプリケーションサーバーは、HTTPリクエストをプログラムで処理して返す、ということを前提にしています。そのため、アプリケーションサーバーにおけるURLはサーバーのディレクトリ構造とは無関係です。

例として、node.jsでアプリケーションサーバーを作成してみます。以下のコードを`sample.js`として保存してください。

```js:sample.js
const http = require("http");
const server = http.createServer();

server.on("request", (req, res) => {
  let msg;
  switch (req.url) { // リクエストのURLに応じて分岐
    case "/":
      msg = "top";
      break;
    case "/foo":
      msg = "foo";
      break;
    case "/foo/bar":
      msg = "bar";
      break;
    default:
      msg = "baz";
      break;
  }
  res.write(msg); // レスポンスにmsgを書き込む
  res.end();
});

server.listen(3000, () => {
  console.log(
    "サーバーを起動しました。 http://localhost:3000 にアクセスしてください。"
  );
});
```

シェルで以下のコマンドを実行すると、アプリケーションサーバーが起動します。

```shell
node sample.js
```

ブラウザでアクセスしてみると、以下のように表示されます。

* `http://localhost:3000`→top
* `http://localhost:3000/foo`→foo
* `http://localhost:3000/foo/bar`→bar
* `http://localhost:3000/baz`→baz
* `http://localhost:3000/foobarbaz`→baz

ここから分かるように、アプリケーションサーバーにおけるURLは、開発者にとって都合のいいように定められた、ただのタグに過ぎません。

[^1]: SPAにおいてURLが変わってもページの読み込みが発生しないのは、この仕組みを用いています。
[^2]: ApacheやNginx等のウェブサーバーは高機能なのでもっと色んなことができますが、ウェブサーバー（httpサーバー）の最小の要件はこれだけです。
[^3]: CGIはもう過去の遺物ということで省略させてください…。