OmniAICreator/Qiita-1.07M huggingface dataset:
SQL Server と Oracle の構成についての大雑把な理解

## はじめに

DBMSごとに概念や用語は微妙に違います。にもかかわらず、自分の知っているDBMSの概念をベースに会話をする人が多く、会話が微妙に噛み合わないことがあります。そこで、この機会に SQL SERVER と Oracle について構成概念をまとめてみました。

## SQL Server

### 構成

```
サーバ名
├ master
├ tempdb
├ ユーザーデータベース
│ ├ スキーマ.table
│ │ ：
│ └ スキーマ.table
└ ユーザーデータベース
  ├ スキーマ.table
  │ ：
  └ スキーマ.table
 ```

- サーバ名：インスタンス（PC名） or 名前付きインスタンス（PC名\インスタンスID）。

### SQL Server Management の接続情報との関係

- サーバ名：インスタンス（PC名） or 名前付きインスタンス（PC名\インスタンスID）。
- ログイン：サーバに対するログイン名。

### ポイント

- インスタンスごとに独立。（異なる ver も同居可能）
- スキーマ≠ユーザなので、１つのユーザーデータベースに複数のスキーマを作成することが可能。（一般的には、dbo or ユーザー名 で統一する。）<br/>＝
テーブルに対するアクセスの完全名：ユーザデータベース.スキーマ.テーブル

### 補足

- サーバー名（インスタンス）とユーザーデータベースをゴチャゴチャにして会話していることがあります。なので、データベースの作成を依頼された場合は、以下の２パターンが考えられます。
	- 既存のインスタンス内に新しいユーザーデータベースを作成する。
	- 新しいインスタンス＋ユーザーデータベースを作成する。

## Oracle

### 構成

```
データベース：インスタンス（≒SID, ＝NET_SERVICE_NAME）
├ SYS
├ スキーマ（≒ユーザ）
│ ├ table
│ │ ：
│ └ table
└ スキーマ（≒ユーザ）
  ├ table
  │ ：
  └ table
 ```

- Oracle は、データベースを示すものがいっぱいありまが、単純構成の場合は、以下の全てがデータベース（インスタンス）を示していると思ってほぼ問題ないです。

| 名前 | 説明 | 補足 |
|:--|:--|:--|
| DB_NAME          | データベース名。 |  |
| DB_UNIQUE_NAME   | プライマリDBとスタンバイDBは、DB_NAMEに対してこれを変更。 | 通常 DB_NAMEと同じ。 |
| SID              | システム識別子。インスタンスを識別するID. | 通常 DB_NAME と同じ。 |
| ORACLE_SID       | ローカル接続先 インスタンスを指定する環境変数。| 通常 SID と同じ。 |
| INSTANCE_NAME    | インスタンス名。 | 通常 DB_NAMEと同じ。 |
| SERVICE_NAME     | リモート接続（リスナ経由の接続先）を指定する名前。 | 通常 DB_UNIQUE_NAME と同じ。 |
| NET_SERVICE_NAME | SERVICE_NAME＋接続先情報。 | 通常 DB_NAME と同じ。 |

### SI Object Browser の接続情報との関係

- データベース：NET_SERVICE_NAME（tnsname.ora に定義されているSERVICE_NAME を含む接続情報）。
- ユーザID：スキーマ。

### ポイント

- インスタンスごとに独立。（異なる ver も同居可能）
- スキーマ＝ユーザとなり、SQL Server のユーザーテーブルという概念がない。<br/>＝
テーブルに対するアクセスの完全名：スキーマ.テーブル

### 補足

- データベース（インスタンス）とスキーマをゴチャゴチャにして会話しているがあります。なので、データベースの作成を依頼された場合は、以下の２パターンが考えられます。
	- 既存のインスタンス内に新しいスキーマを作成する。
	- 新しいインスタンス＋スキーマを作成する。
- ローカルPCの tnsname.ora の内容を他人と異なる設定にすると、同一の接続設定で、自分だけ異なるデータベースへ接続することになるので、会話が噛み合わなくなります。

## おわりに

なんとなく理解していて、そのまま会話しても、たいていの場合は問題ないのですが、極力、正確に理解したうえで、相手が何のことを言っているかを理解できるようになりたいですね。
Pythonのdatetimeを簡単に使いたいならpendulum

# なにをするか
pendulumの使い方を確認する
[Official](https://pendulum.eustace.io/)
[GitHub](https://github.com/sdispater/pendulum)

# pendulumってなに
pythonのdatetimeライブラリも提供している時間や日付の取り回しを遥かに良くした便利ライブラリ。

# 用例

```
import pendulum
```

## BETTER DATETIME : datetimeオブジェクトの改善

```python:タイムゾーンの設定など

# 自動でAsia/Tokyoを設定してくれるのでnow関数は引数不要？
>>> now = pendulum.now()
>>> print(now.timezone)
Timezone('Asia/Tokyo')

# 2019年5月1日0時0分0秒をAsia/TokyoとUTCで表示
>>> in_utc = pendulum.datetime(2019, 5, 1, 0, 0, 0)
>>> in_utc.timezone
Timezone('UTC')
>>> print(in_utc)
2019-05-01T00:00:00+00:00
>>> in_jpn = in_utc.in_timezone("Asia/Tokyo")
>>> in_jpn.timezone
Timezone('Asia/Tokyo')
>>> print(in_jpn)
2019-05-01T09:00:00+09:00

# python:5/2を表示する
>>> in_utc = pendulum.datetime(2019, 5, 1, 0, 0, 0)
>>> dt = in_utc.in_timezone("Asia/Tokyo")
>>> tomorrow = dt.add(days=1)
>>> print(tomorrow)
2019-05-02T09:00:00+09:00
```

## BETTER TIMEDELTA : timedeltaオブジェクトを改善

```python:15日を時間に換算したり
>>> dur = pendulum.duration(days=15)
>>> print(dur)
2 weeks 1 day
>>> print(dur.weeks)
2
>>> print(dur.days)
15
>>> print(dur.hours)
0
>>> print(dur.in_hours())
360
```

## DATETIME-AWARE INTERVAL : 日付に対応した期間計算

```python:期間を計算
>>> in_utc = pendulum.datetime(2019, 5, 1, 0, 0, 0)
>>> week_later = in_utc.add(days=7)
>>> print(period)
<Period [2019-05-01T00:00:00+00:00 -> 2019-05-08T00:00:00+00:00]>
>>> ### 2019.8.13時点、pendulum==2.0.5では↓はAttributeErrorになります
>>> period.in_weekdays()
```

## EASY TIMEZONES MANIPULATION : 簡単なタイムゾーン操作

```python:タイムゾーンの変換
>>> in_jpn = pendulum.datetime(2019, 5, 1, 0, 0, 0, tz="Asia/Tokyo")
>>> tz = pendulum.timezone('Europe/Paris')
>>> in_paris = tz.convert(in_jpn)
>>> print(in_paris)
2019-04-30T17:00:00+02:00
```

# おわり
- python標準のdatetimeと併用もできて、足りない機能は簡単に追加できる
- documentationがすこし不親切だが、標準ライブラリ（特にtimedelta）がなれるのに時間がかかる仕様と比較すると、感覚的に使えるpendulumは総合的にかなり親切設計。
コマンドでインデックス検索(複数キーワードに対応)

[コマンドでインデックス検索 - Qiita](https://qiita.com/sozaiya/items/70cb890c4bdbf87544d5)
の続きです。前回は引数に指定したキーワードを検索する仕組みでしたが、「検索したいキーワードが沢山あるから、一括検索したい！」という要望に対応してみました。

# スクリプト

vbsで実装しました。

```vb:test.vbs
Set objConnection = CreateObject("ADODB.Connection")
objConnection.Open "Provider=Search.CollatorDSO;Extended Properties='Application=Windows';"
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile(Wscript.Arguments(0))
Do While objFile.AtEndOfStream <> True
    keyword = objFile.ReadLine
    Wscript.Echo "【" & keyword & "の検索結果は…】"
    Set objRecordset = CreateObject("ADODB.Recordset")
    objRecordset.Open "SELECT System.ItemPathDisplay FROM SYSTEMINDEX WHERE Contains('" & keyword & "')", objConnection
    Do Until objRecordset.EOF
        Wscript.Echo objRecordset.Fields.Item("System.ItemPathDisplay")
        objRecordset.MoveNext
    Loop
    Wscript.Echo ""
Loop
```

# 使い方

キーワード一覧を作成します。

```text:list.txt
あいうえお
かきくけこ
さしすせそ
```

上記vbsファイルをcmdで実行します。引数にキーワード一覧を指定します。

```shell:cmd
C:\Users\xxxx\Desktop>cscript test.vbs list.txt
Microsoft (R) Windows Script Host Version 5.812
Copyright (C) Microsoft Corporation. All rights reserved.

【あいうえおの検索結果は…】
C:\ユーザー\xxxx\デスクトップ\あいうえお.txt

【かきくけこの検索結果は…】
C:\ユーザー\xxxx\デスクトップ\かきくけこ.txt

【さしすせその検索結果は…】
C:\ユーザー\xxxx\デスクトップ\さしすせそ.txt

C:\Users\xxxx\Desktop>
```
ちょっと便利に使えるかもしれません♪
【Java】Stream API　中間操作

###filter(抽出)
・条件に一致するデータをフィルタリングする。
・引数はbooleanが戻り値となる条件式を書く

``オブジェクト名.stream().filter(仮引数 -> 条件式);``

```java
public static void main(String[] args) {
		
	List<String> list = new ArrayList<>();
	list.add("apple");
	list.add("orange");
	list.add("banana");
		
	list.stream()
		.filter(i -> i != "apple");//listから"apple以外が抽出される"
}
```

###sorted(並び替え)
・Comparatable を実装していないプリミティブ型は昇順ソートしかできない
・Comparatable を実装した型（StringやIntegerなど）ならComparatorで昇順降順を指定できる
　なお、昇順の場合はComparator.naturalOrder()を省略することができる

``オブジェクト名.stream().sorted(昇順or降順);``

```java
public static void main(String[] args) {
		
	List<String> list = new ArrayList<>();
	list.add("lemon");
	list.add("orange");
	list.add("apple");
		
	list.stream().sorted(Comparator.naturalOrder());//昇順
	list.stream().sorted(Comparator.reverseOrder());//降順
}
```

###map()
・オブジェクト内の要素を変換する

``オブジェクト名.stream().map(仮引数 -> 変換処理);``

```java
public static void main(String[] args) {
		
	List<String> list = new ArrayList<>();
	list.add("apple");
	list.add("orange");
	list.add("banana");
		
	List<String> ret = list.stream().map(s -> s.toUpperCase());//小文字から大文字に変換
}
```
コマンドでインデックス検索

エクスプローラ右上の検索窓にキーワードを入力すると、ファイル名やファイルの中身、なんとエクセルファイルの中身まで検索してくれる優れもの！しかし、ヒットしたファイルパスを文字列で取得するのは難しいそう…

そんな時に使えそうなスクリプトを作ってみました。

# スクリプト

vbsで実装しました。

```vb:test.vbs
Set objConnection = CreateObject("ADODB.Connection")
objConnection.Open "Provider=Search.CollatorDSO;Extended Properties='Application=Windows';"
Wscript.Echo "[" & Wscript.Arguments(0) & "]の検索結果は…"
Set objRecordset = CreateObject("ADODB.Recordset")
objRecordset.Open "SELECT System.ItemPathDisplay FROM SYSTEMINDEX WHERE Contains('" & Wscript.Arguments(0) & "')", objConnection
Do Until objRecordset.EOF
    Wscript.Echo objRecordset.Fields.Item("System.ItemPathDisplay")
    objRecordset.MoveNext
Loop
```

# 使い方

上記vbsファイルをcmdで実行します。引数の文字列を検索してくれます。

```shell:cmd
C:\Users\xxxx\Desktop>cscript test.vbs あいうえお
Microsoft (R) Windows Script Host Version 5.812
Copyright (C) Microsoft Corporation. All rights reserved.

[あいうえお]の検索結果は…
C:\ユーザー\xxxx\デスクトップ\test.txt
C:\ユーザー\xxxx\デスクトップ\test.xls
C:\ユーザー\xxxx\デスクトップ\test.html

C:\Users\xxxx\Desktop>
```

インデックス検索なので、一瞬で終わります！！

# リンク
[コマンドでインデックス検索(複数キーワードに対応) - Qiita](https://qiita.com/sozaiya/items/4a8b2f4560820598db6c)
Kotlinでwebサーバーを作ってみた(1)

## 経緯

今G's Academyというところで勉強しているんですが、そこの課題でHTTP通信を扱った際にドはまりしまして。提出期限を大幅に過ぎてしまいました。

これはもう何となくで済ましてしまってはダメだということで、通信の勉強をやり直しています。

ただ、いきなりOSIがどうたらと言葉で言われてもイメージがつかず...。手を動かしながら学べる教材がないか探してみたところ、この本が見つかりました。

[基礎からのwebアプリケーション開発入門](http://kmaebashi.com/webserver/index.html "基礎からのwebアプリケーション開発入門")

サンプルコードがJavaなんで、Kotlinの勉強をかねてこの本の内容をKotlinで書いてみることにしました。

自分が書いたコードはGitHubにあげたので、記事の最後にリンクを張ります。

## 環境

Kotlin version 1.3.41-release-150 (JRE 1.8.0_151-b12)
IntelliJ IDEA 2019.2 (Community Edition)

## 現状

htmlファイルとそれに含まれているリソースをレスポンスとして返せるところまで来ました。
![kopache.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227939/a3780ba9-962e-25b5-c13f-573c4c39a953.gif)

## 工夫

ただサンプルコードをKotlinに置き換えるだけだとつまらないので、以下の点を工夫しながら焼き直しています。

- Kotlinならではの文法が使えそうな個所は積極的に使う(ifやwhenを式として使う、スコープ関数の活用、エルビス演算子を利用したnullチェックなど)
- 副作用を減らすために極力varではなくvalを使う
- 繰り返しで書くとvarを使わざるを得なくなる場合があるので、その際は再帰で書く←はまった点があるので後述

最近会ったインド人エンジニアにHaskellを勧めてもらいました。彼曰く"It's very difficult to write wrong code in Haskell(Haskellで間違ったコードを書くのは難しい)"とのこと。軽くHaskellと関数型言語についてググったのですが、副作用がないというのがバグを少なくできる一つの理由だそうです。

Kotlinでも副作用を意識して書いた方がいいんだろうなと思ったので最後の2つを足しました。今まで再帰で処理を書いたことがなかったので、練習するいい機会になりますし。

あと、ほら、再帰をサラッと使えるエンジニアってイケテル感じがするじゃないですか...こんな風に感じるのって私だけですか?

## はまった点

### 再帰のネストを深くしすぎて、StackOverFlowになった

上記の通り、再帰を使って書こうとしたんですが、本のサンプル通り1バイトずつ読み込む処理を書いていました。(書き直す前のが残っていないので、厳密にはこの通りじゃなかったかもしれません)

```Kotlin
private fun readByte(readBytes : String, input : InputStream) : String {
    val endOfFile = -1
    val byte = input.read().toChar()
    return  if (byte == endOfFile.toChar()) {
        readBytes
    } else {
        readByte(readBytes + byte, input)
    }
}
```
20KBの画像ファイルを読み込もうとしたら、20,000回この関数がネストすることになりますね。**スタックが足りるわけない**

バッファーを使った書き方に変えたら問題なく動きました...と言いたいのですがまだもう一つ問題が

### ファイアウォールを解除し忘れてた

本の方には「プログラムの初回実行時にファイアウォールの設定を聞かれます」と書いてあったのですが私の環境では何事もなく実行されました。

なのでコントロールパネルから自分でファイアウォールの設定をし、使っていたポートをプライベートネットワークのみに公開しました。

## 勉強になったこと(改めて実感したこと)

以下の2点はエンジニアとして知っていて当たり前だろってことなんですが、知識として知っていても実感としては持っていませんでした。

### クライアント・サーバー間であれ、ローカルのファイル間であれ、データをやり取りする方法には大差ない

「基礎からのwebアプリケーション開発入門」のサンプルコードを読んで一番驚いたのが、クライアントからのリクエストの受け取り方がファイルの読み取りとほぼ同じだった点です。

違うのは、ポートを指定してクライアントから接続されるのを待つか、読み込みたいファイルのパスを指定するかです。

**データの流れ=ストリーム(stream, 小川)の始端と終端さえ決めてしまえば、後は通信もファイル読み込みも全く同じ処理でできる** ということですね。

### テキストであれバイナリーであれ、ファイルの送受信に大差はない

もう一つ勉強になったのが、テキストもバイナリーも同じプログラムでレスポンスを返せるという点です。

上のgifで分かるよう、htmlやcssなどのテキストファイルだけでなくアイコンなどのバイナリファイルもレスポンスとして返していますが、両方とも全く同じ処理を行っています。

始端と終端が同じ小川に、泥水が流れてこようが原油が流れてこようが関係ない、意識する必要がないってことですね。

## OSIの意味が何となく見えてきた気がする

OSIで言えば、小川の始端と終端を決めるのがネットワーク層で、小川で流れてきた中身を使って処理をするのがアプリケーション層、処理結果をユーザーさんに見せるのがプレゼンテーション層みたいな感じになるのかなと

今ならOSIの本が理解できる気がする...!!!

## 参考資料

[基礎からのwebアプリケーション開発入門](http://kmaebashi.com/webserver/index.html "基礎からのwebアプリケーション開発入門")
[GitHubのレポジトリ](https://github.com/nagashimam/Kopache/tree/master "https://github.com/nagashimam/Kopache/tree/master")
JSFのHtml5Friendlyチートシート

JSFタグでも動くには動くのですが、混在しているのはあまり良くないらしいのでHTML5に寄せてコーディングしていきます。
基本的にHtml5Friendly寄せです。
前提条件はJavaEE7でJSF2.2

### h:messages
```
<span jsfc="h:messages" class="error_style" />
```

### h:commandButton 
```
<button jsf:action="#{bean.action}">
  次へ
  <f:param name="id" value="#{bean.id}" />
</button>
```

### h:button
```
<button jsf:outcome="next_page?id=#{bean.id}&amp;faces-redirect=true">
  次へ
</button>

// おまけ：サーブレットにGETアクセスさせる
<button onClick="window.location.href='login/service?id=#{bean.param1}&amp;status=#{bean.param2}'">
  ログイン
</button>
```

### h:inputText
```
<input jsf:id="name" type="text" jsf:value="#{bean.name}" />
```

### h:selectOneRadio
ラジオボタンやチェックボタンだけはまだJSFタグの方が推奨されるみたいです（2018年2月時点）

```
<h:selectOneRadio id="selectPrize" name="prizeName" value="#{entryFieldBean.prizeName}" styleClass="radio_list">
  <f:selectItems value="#{entryFieldBean.prizeList}" var="prize" itemLabel="#{prize.labelName}" itemValue="#{prize}" />
</h:selectOneRadio>
```
### rendered属性
```
// 一致
<div class="sample" jsf:rendered="#{bean.str == ''}">
</div>
// 不一致
<div class="sample" jsf:rendered="#{bean.str != ''}">
</div>
// nullと一致
<div class="sample" jsf:rendered="#{bean.str == null}">
</div>
// beanの変数で判定
<div class="sample" jsf:rendered="#{bean.isStatus}">
</div>
// andで複数条件
<div class="sample" jsf:rendered="#{bean.str == '' and bean.isStatus}">
</div>
// orで複数条件
<div class="sample" jsf:rendered="#{bean.str == '' or bean.isStatus}">
</div>
```

### ui:remove
コメントアウトはui:remove
通常のHTMLのコメントタグ<!-- -->だとJSFのタグは無効になりません。
文字コメントのみでもレンダリングに影響するっぽい（クラスタリング環境だけ？）ので基本コメントは書かないかui:removeで囲った方が安全です。
またweb.xmlにjavax.faces.FACELETS_SKIP_COMMENTSという設定項目がありますがui:removeの方が優先されるっぽいです。

```
<ui:remove>
    <!-- ※ライブラリの注意点とかメモ書き※ -->
</ui:remove>
```

### h:outputStylesheet
```
<link rel="stylesheet" type="text/css"
          href="#{bean.resourcesPath}/css/style.css" media="all" />
```

### h:outputScript
```
  <script type="text/javascript" src="#{bean.resourcesPath}/js/common.js" />
```
c++始めてみた：何から始めたらいいの？個人ノート1.2

#c++何から始めたらいいの？　その他の記事から学ぶ

0. 
この記事からは、c++を学習する上での目標、その際に陥るだろう挫折に対する心構えを学びました
[【初心者必見！】C/C++言語を学んではいけない理由と学ぶべき理由
](https://qiita.com/developerwaiwai/items/87a90cdb854b15a33309)

1. 
これは、c++の構造の解説が分かりやすかった、基本的なc++文法が分かってきたら、これについて深く学習してみたいです
[C/C++のビルド入門](https://qiita.com/deltaMASH/items/317a347204e1d5ff0a9f)

2. 
@suponjipic さんがc++を最近やり始めたらしいので、それに便乗、学ばせてもらう、それでもc++無知者（c言語も、c＃も、それ関係の本も読んだ事ない）にとっては結構難しいレベルです、ただ、@suponjipic さんが参考にしている「[ロベール](http://www7b.biglobe.ne.jp/~robe/cpphtml/)」というサイトもあるので、そのサイトも覗いてみる予定です
[はじめてのC++【1日目】](https://qiita.com/suponjipic/items/4067de145ef5bde496c3)

3. 
これは、1.を読んだ後に読むと、c++の構造の概念が分かりやすくなりました
ただ、この記事を全部読む、理解する為には、今の自分では知識不足だったので、多少成長してきてから
また戻ってきたいと思います
[ハローワールド徹底解説](https://qiita.com/kazatsuyu/items/478c55de0f75ea5904bd)
CentOS-7 に Brackets をインストール

Brackets はRPMで配布されていないので、Snapでインストールする。

```
$ sudo yum install epel-release
$ sudo yum install snapd
$ sudo systemctl enable --now snapd.socket
$ sudo ln -s /var/lib/snapd/snap /snap
```

ここで一度システムからログアウトするか、別のシェルを起動してインストールを続行する。

```
$ sudo snap install brackets --classic
```
OM3 / OM4と比較したOM5ファイバージャンパーの利点は何ですか？

光通信における「OM」とは、光ファイバーのグレードを示すマルチモードファイバーの標準である「光マルチモード」、光モードを指します。 現在、TIAおよびIECで定義されているファイバーパッチコード標準は、OM1、OM2、OM3、OM4、およびOM5です。

まず、マルチモードとシングルモードとは何ですか？ シングルモードファイバは、1つのモードの伝送のみを可能にする光ファイバで、コアの直径は約8〜9μm、外径は約125μmです。 マルチモード光ファイバを使用すると、コア径が50μmと62.5μmの単一のファイバでさまざまなモードの光を伝送できます。 シングルモードファイバは、マルチモードファイバよりも長い伝送距離をサポートし、100Mbpsイーサネットから1Gギガビットでは、シングルモードファイバは5000mを超える伝送距離をサポートできます。 マルチモードファイバは、中距離および短距離で小容量の光ファイバ通信システムにのみ適しています。
![32.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463940/96dfd3da-20f5-650e-9a33-671e7db6b3a6.jpeg)

OM1、OM2、OM3、OM4、OM5の違いは何ですか？
一般に、OM1は従来の62.5 / 125um、OM2は従来の50 / 125um、OM3は850nmレーザー最適化50umコアマルチモードファイバーであり、850nm VCSELを搭載した10Gb / sイーサネットでは、ファイバー伝送距離は300mに達します。 OM4はOM3のアップグレード版であり、OM4マルチモードファイバーは、高速伝送中にOM3マルチモードファイバーによって生成される差動モード遅延（DMD）を最適化するため、伝送距離が大幅に改善され、ファイバー伝送距離は550mに達します。 このラインは、TIAおよびIECによって定義されたファイバー径が50 /125μmのファイバーパッチコードの新しい標準です。OM3およびOM4ファイバーパッチコードと比較して、OM5ファイバーパッチコードはより高い帯域幅のアプリケーションに使用できます。 異なるレベルで送信する場合、帯域幅と最大距離は異なります。

OM5ファイバーパッチコードとは何ですか？
ワイドバンドマルチモードファイバーパッチケーブル（WBMMF）として知られるOM5ファイバーは、波長分割多重（WDM）の帯域幅特性を指定するように設計されたレーザー最適化マルチモードファイバー（MMF）です。 新しい繊維分類法は、850 nm〜950 nmのさまざまな「短い」波長をサポートするように設計されており、重合後の高帯域幅アプリケーションに適しています。 OM3およびOM4は、主に850 nmの単一波長をサポートするように設計されています。

OM3とOM4の違いは何ですか？
1.ジャケットの色が違う
異なるファイバージャンパーを区別するために、異なる色の外側シースが使用されます。 軍用以外の用途では、シングルモードファイバーは通常、黄色の外側ジャケットです。 マルチモードファイバでは、OM1とOM2はオレンジ、OM3とOM4は水色、OM5は水緑です。

![33.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463940/e1f33622-1e8d-10fb-8ff1-e9371930e4f7.jpeg)

2.異なる適用範囲
OM1およびOM2は長年にわたって建物に広く展開され、最大1GBのイーサネット伝送をサポートしています。OM3およびOM4ケーブルは一般的にデータセンターのケーブル環境で使用され、10Gまたは40 / 100Gファストイーサネットをサポートします。 道路の伝送。 OM5は、40Gb / sおよび100Gb / sの伝送用に設計されており、高速で伝送できるファイバーの数を減らします。

![37.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463940/0e17d795-04a4-46ac-3bdc-9fdc133654ff.jpeg)

OM5マルチモードファイバー機能

1.より少ない帯域幅がより高い帯域幅のアプリケーションをサポート
OM5ファイバーパッチコードの動作波長は850/1300 nmで、少なくとも4つの波長をサポートできます。 OM3とOM4の典型的な動作波長は850 nmと1300 nmです。 つまり、従来のOM1、OM2、OM3、およびOM4マルチモードファイバには1つのチャネルしかありませんが、OM5には4つのチャネルがあり、伝送容量は4倍に増加します。 短波長分割多重化（SWDM）とパラレル伝送技術を組み合わせたOM5は、8コアのワイドバンドマルチモードファイバー（WBMMF）のみを必要とし、200 / 400Gイーサネットアプリケーションをサポートし、ファイバーコアの数を大幅に削減します。 程度は低いですが、ネットワークの配線コストが削減されます。

2.さらなる伝送距離
OM5ファイバーの伝送距離は、OM3およびOM4の伝送距離よりも長くなっています。 OM4ファイバーは、100G-SWDM4トランシーバーで少なくとも100メートルの長さをサポートするように設計されています。 ただし、OM5ファイバーは、同じトランシーバーで最大150メートルの長さをサポートできます。

![38.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463940/a4af996e-5274-a2cc-9ce1-056370537c96.jpeg)

3.繊維損失が少ない
OM5ブロードバンドマルチモードケーブルの減衰量は、以前のOM3、OM4ケーブルの3.5 dB / kmから3.0 dB / kmに減少し、953 nmでの帯域幅要件が増加しました。

OM5のファイバーサイズはOM3およびOM4と同じであるため、OM3およびOM4と完全に互換性があり、既存の配線アプリケーションOM5で変更する必要はありません。 OM5ファイバーはよりスケーラブルで柔軟性があり、より少ないマルチモードファイバーコアで高速ネットワーク伝送をサポートできます。コストと消費電力はシングルモードファイバーよりもはるかに低いため、将来100G /で広く使用されます。 400G / 1T超大型データセンター。

HYC は、光通信用の受動部品のR＆D、製造、販売、およびサービスを専門とする国立ハイテク企業です。 同社の主な製品は、光ファイバコネクタ（データセンター高密度光コネクタ）、波長分割マルチプレクサ、光スプリッタ、およびその他の3コアの光パッシブ基本コンポーネントです。 インターネットデータセンター、防衛通信、その他の分野。http://www.hyc-system.com
インボイス方式が施行された後のフリーランスの影響


#結論
まず結論から。
インボイス制度が施行された後、免税事業者であるフリーランスは以下いずれかの境遇となります。

- 消費税を払って課税事業者となる
- エージェント会社や企業から消費税分の単価を減額される
- エージェント会社や企業と交渉して単価を据え置く

#インボイス制度とは
正式には「適格請求書等保存方式（インボイス制度）」と呼びます。
2019年10月から消費税が10%に上がり、同時に軽減税率も同時に施行されます。
課税の適正性や透明性を確保することを目的とし、「軽減税率の対象品目である旨」及び「税率ごとに合計した対価の額」を明記することを求めています。

適格請求書は適格請求書発行事業者として登録された事業者がのみが発行を行える請求書で、請求書には登録事業者としての番号を記載します。
仕入税額控除を行う場合は、このインボイス方式で発行された請求書しか認められなくなります。

#仕入税額控除とは
課税事業者は納付する消費税を計算する際、売上から消費税を計算し、そこから仕入れに支払った消費税を減算します。

＜例＞ある事業者が、110万(税込)で商品を仕入れ、220万(税込)の売上を出しました。（消費税=10%）

|売上額|消費税|
|---|---|
|200万|20万|

|仕入額|消費税|
|---|---|
|100万|10万|

本来納めるべき消費税は売上×消費税率である20万ですが、仕入税額控除を行うことによって仕入で納めた消費税を減額することができます。

この事業者が納付する消費税 = 200万×0.1 - 100万×0.1 = 10万

#インボイス方式の発行を行える事業者
適格請求書等保存方式で請求書を発行できるのは、**課税事業者**のみです。
免税事業者は従来の請求書でしか発行を行うことができず、従来の請求書では仕入元が仕入税額控除を利用することができません。

課税事業者：年間税込み1000万以上の売上がある事業者で、消費税を納める必要がある事業者
免税事業者：年間税込み1000万未満の売上がある事業者で、消費税の納付が免除された事業者

#フリーランスへの影響
前提としてインボイス方式が施行されたあと利益に影響が出るのは、免税事業者と課税事業者間で取引を行っている場合です。

|事業者|影響|
|---|---|
|免税事業者同士の取引|消費税を納める必要がなく、仕入税額控除は関係ないので影響なし|
|課税事業者同士の取引|インボイス方式の請求書を発行できるので影響なし|
|免税事業者と課税事業者間の取引|免税事業者から仕入れを行う場合は、仕入税額控除ができない|

もし、年間1000万を超えていないフリーランスがエージェント会社や企業から収入を得ている場合、以下に置き換えることができます。

課税事業者：エージェント会社や企業
免税事業者：フリーランス
課税事業者の仕入れ：エージェント会社や企業がフリーランスに払う報酬

エージェント会社や企業が仕入税額控除を行うことができなくなるため、結論で記載した結果となります。
LeetCode / Best Time to Buy and Sell Stock II @柏の葉コワーキングスペースKOIL

（[ブログ記事](https://mhiro216.hatenablog.com/entry/2019/08/13/120015)からの転載）

今日は柏の葉のコワーキングスペースに来てみました。

[https://www.31ventures.jp/ventureoffice/koil/]
![IMG_2132.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122973/0abb4a59-8f2d-e6b6-8d5c-dc5b23b75f9a.jpeg)
日本最大級らしいので、ここまでのクオリティが他でもあるわけではないと思いますが、
<b>1日(9時-23時まで)で1500円</b>
ということで、圧倒的なコスパに驚愕しております。

柏の葉ということで私の自宅からdoor2doorで1時間弱かかるんですが、移動疲れせず、ここまで来たらやってやろうと言う気持ちになる、ちょうど良い具合の立地です。
<br>
<br>
さて、今日の問題。

[https://leetcode.com/problems/best-time-to-buy-and-sell-stock-ii/]

Say you have an array for which the ith element is the price of a given stock on day i.

Design an algorithm to find the maximum profit. You may complete as many transactions as you like (i.e., buy one and sell one share of the stock multiple times).

Note: You may not engage in multiple transactions at the same time (i.e., you must sell the stock before you buy again).

Example 1:
<img width="624" alt="スクリーンショット 2019-08-13 11.33.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122973/2011458f-e6ea-deb4-c3de-5f0ae167b3de.png">
Example 2:
<img width="620" alt="スクリーンショット 2019-08-13 11.33.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122973/a3cd4a0c-4405-aba5-a4ea-f785f76c729e.png">
Example 3:
<img width="621" alt="スクリーンショット 2019-08-13 11.33.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122973/f42d84a0-1fda-baad-e636-dd29a738a4da.png">
[前回記事](https://mhiro216.hatenablog.com/entry/2019/08/12/185157)の類題です。
今度は1度切りの売り買いではなく、何度も売り買いを繰り返したとき、最大の利益はいくらになるか算出する問題です。
但し同日に売り買いすることはできないとします。

#### 解答・解説

##### 解法1
今回の問題は、<b>次の日に値が上がるか同じなら売らずに待ち、下がるなら売る</b>という最適な行動に気づけば、簡単です。
そして、また簡潔なコードとイマイチなコードを並べておきます。
まずは私のsubmitしたコード。

```python
class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        max_profit, sell, buy = 0, float('-inf'), float('inf')
        i = 0
        while i < len(prices):
            buy = min(buy, prices[i])
            if prices[i] > buy:
                sell = prices[i]
                while i < len(prices)-1 and sell <= prices[i+1]:
                    sell = prices[i+1]
                    i += 1
                max_profit += sell - buy
                sell, buy = float('-inf'), float('inf')
            i += 1
        return max_profit
```

<b>次の日に値が上がるか同じなら売らずに待ち、下がるなら売る</b>という行動をそのままコードに落としています。

##### 解法2

続いてSolutionをPythonに翻訳したコードです。考え方は上と同じですが、
<b>「値が下がるまで売らずに待つ」ときに得られる利益は、1日ごとの値の差分の和と同値である</b>
という関係性を使って、より簡潔なコードに落としています。
下図のイメージです。
<img width="549" alt="スクリーンショット 2019-08-13 11.29.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122973/05262c99-6ea8-bdba-85a3-8f7f8e31db75.png">

```python
class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        if len(prices) < 2:
            return 0
        else:
            profit = 0
            for i in range(len(prices)-1):
                if prices[i] < prices[i+1]:
                    profit += prices[i+1] - prices[i]
            return profit
```
angular+rxjs+firebaseでチャットを作ったときに、新しい発言があると過去分もすべて再読み込みされて困ったとき。

チャットの発言が格納されたcollectionをsubscribeしてると、発言が追加されると過去分まで全てsubscribeしてしまって画像とかが再描画されて嫌だったときにやったこと。

```ts:chat.component.html
<div *ngFor="let log of logs; let i = index ; trackBy: trackByLog">
```

```ts:chat.component.ts
trackByLog(index: number, value: ChatLog): string {
  return value ? value.documentId : null;
}
```

`value.documentId`が対象のオブジェクトで一意になる前提。
ngforがそのキーを元にまだ表示されてないものがなんなのかを識別してくれてるイメージ。

※タイトルに「rxjs+firebase」と書いたけど、単にangularの基本的な関数です…
【Java】関数型インターフェース

##関数型インターフェースとは
抽象メソッドを一つだけ持つインターフェース(staticメソッドやdefaultメソッドは無視される)

###◆Functio＜T,R＞###
・受け取った引数の値を変換する
・T=メソッドの引数の型、R=メソッドの戻り値の型
・抽象メソッドは R apply(T t)

```java
Function<Integer,String> func = f -> f + "になる";
String s =  func.apply(1);
System.out.println(s); //1になる
```

###◆Consumer＜T＞
・受け取った引数を使って処理を行う(戻り値なし)
・T=メソッドの引数の型
・抽象メソッドは accept(T t)

```java
Consumer<String> dog = e -> System.out.println("hello," + e);
dog.accept("柴犬");//hello,柴犬
```
ラムダ式を使わず書くと下記のようになる

```java
Consumer<String> dog = new Consumer<String>() {
	@Override
	public void accept(String name) {
				System.out.println("hello," + name);//hello,柴犬
	}
```

###◆Predicate＜T＞
・受け取った引数で判定を行いBooleanを返す
・T=メソッドの引数の型
・抽象メソッドは test(T)

```java
Predicate<String> result = c -> {return c.equals("dog");}; 
boolean animal = result.test("cat");
System.out.println(animal);//false
```
【Unity】再帰的に親のCanvasサイズを取得する

# TL;DR

大体の場合は`rectTransform.rect.size`を使えばいい

# はじめに

uGUIで要素の大きさを取得する方法は2つあります。

- [RectTransform.sizeDelta](https://docs.unity3d.com/ja/current/ScriptReference/RectTransform-sizeDelta.html)
    - アンカー間の距離と比較した`RectTransform`のサイズ
    - アンカーが一致していれば要素のサイズと同じ
    - アンカーが離れている場合(Stretch)は親との相対距離
- [RectTransform.rect](https://docs.unity3d.com/ja/current/ScriptReference/RectTransform-rect.html)
    - Transform のローカル空間で計算された矩形 

大体の場合は`rectTransform.rect.size`を使えばいいのですが、[何らかの影響](https://twitter.com/nkjzm/status/1161088350050123776)で取得できない場合がありました。uGUIでAnchorが一致していない場合(=Stretch)は親の座標から相対的にサイズが決定するため、再帰的に自身の大きさを取得するコードを書いてみました。

# コード

```.cs
    static Vector2 GetRectSize(RectTransform self)
    {
        var parent = self.parent as RectTransform;
        if (parent == null)
        {
            return new Vector2(self.rect.width, self.rect.height);
        }
        // 枝切り処理。これはない方がよい場合もある。
        if (parent.anchorMin == parent.anchorMax)
        {
            return parent.sizeDelta;
        }
        var parentSize = GetRectSize(parent);
        var anchor = self.anchorMax - self.anchorMin;
        var width = (parentSize.x * anchor.x) + self.sizeDelta.x;
        var height = (parentSize.y * anchor.y) + self.sizeDelta.y;
        return new Vector2(width, height);
    }
```

# 最後に

あんまり使うことないと思いますが、折角書いたのでよかったら使ってください…。CC0です。
【Unityアセットアドカレ2019】 I2 Text Animationで綺麗なテキスト演出を作ろう


この記事は[Unity アセット真夏のアドベントカレンダー 2019 Summer!](http://assetstore.info/eventandcontest/adventcalendar/eventandcontestadventcalendarasset-adventcalendar2019summer/)、14日目の記事になります。

昨日は[トマシープ](https://twitter.com/tomasheep)さんの
「Unity1Weekのゲームに使えそうな無料のボタンUIを探す【AssetStore】」でした。

本日ご紹介したいアセットはI2 Text Animationです。
UIテキストのアニメーションを簡単に実装できるアセットです。

[I2 Text Animation](https://assetstore.unity.com/packages/tools/gui/i2-text-animation-95580?utm_source=jppt&utm_medium=20190814)
![01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473769/51c35312-c802-f7ac-288a-c7c9f2d11c19.jpeg)




## 概要
I2 Text Animationはテキストコンポーネントの拡張です
カスタムエディターでシーケンスを編集できて、様々な演出ができます

**使えるテキスト：**
・ Unity UI 
・ TextMeshPro 
・ NGUI



## 使い方法
私はUGUI主に使うのため、UGUIで基本的な部分を説明させていただきます。
<img width="452" alt="スクリーンショット 2019-08-10 13.22.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473769/f2a8970c-0fc1-ae93-4b5d-555efefcd74c.png">


**On Enable Play**
オブジェクトが有効なときに再生されるアニメーション（ある場合）を定義できます。ポップアップには、アニメーションセクションで選択または作成されたすべてのアニメーションが含まれます。
**コールバック**
ここでは、アニメーションが終了したときに呼び出される関数を設定できます。
オプションのパラメーターとして、完成したアニメーションを取得します。
**シーケンス**
テキストアニメーションはシーケンスで構成されます。
変更可能な要素：位置、色、スケール、回転など

### 基本機能で実装した演出のサンプル
Level Up
<img width="452" alt="スクリーンショット 2019-08-10 13.23.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473769/0894707e-1dce-56c7-a4d8-11a5a26b7bfe.png">
![1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473769/c2285540-610b-4b8f-6e1a-352be5239e82.gif)

Game Over
<img width="449" alt="スクリーンショット 2019-08-10 13.22.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473769/c4211dc1-eee0-0863-fe5c-e70d0bf9f15d.png">
![2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473769/53654a8b-d873-982c-5254-253e1ec9c665.gif)

Loading
<img width="452" alt="スクリーンショット 2019-08-10 13.22.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473769/5c1ef919-99a1-eebe-bc8b-0a4f379e1936.png">
![3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473769/63d7f176-3cd1-1483-c315-580d3889f89b.gif)


## 最後
カスタムエディターの操作はとてもシンプルのため、ドキュメントを読まなくても簡単に使いこなせるアセットと思います。自作のゲームテキスト演出もこの３つのアニメションでほぼ満足した。

明日は[坂すたじお/sakastudio](https://twitter.com/sakastudio_)さんの「低価格でも高クォリティな最強アセット13選！」です。
ubuntu 18.04 にyarn をインストールする

yarnの公式サイト
https://yarnpkg.com/ja/docs/install#alternatives-stable
に書かれている通り

```bash
$ curl -o- -L https://yarnpkg.com/install.sh | bash
```

を実行したがSSL署名がうまくいかなかった。
-kコマンドを付与して証明を無視させたがこれでもダメだった。

###対策
まずYarnのレポジトリを有効化する。レポジトリのGPGキーをcurlコマンドを使って取得する。(debianはubuntuと互換性がある)


```bash
$ curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
```

次にYarnのAPTパッケージレポジトリを自分のシステムに追加する。 teeコマンドを使って書き込み。


```bash
$ echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
```

レポジトリがシステムに加えられたらパッケージリストをアップデートしてからYarnをインストールする

```bash
$ sudo apt update
$ sudo apt install yarn
```

Yarnのバージョンを確認

```bash
$ yarn --version
```
###参考
https://linuxize.com/post/how-to-install-yarn-on-ubuntu-18-04/
webarenaでubuntu その8

#概要

webarenaでubuntu18.04やってみた。
bindやってみた。
zone書いてみた。

#named.confの修正

```
zone "hoge.com" {
	type master;
	file "/etc/bind/hoge.com.zone";
};
zone "192.192.192.192.in-addr.arpa" {
	type master;
	file "/etc/bind/192.192.192.192.rev"; 
};
```

#named.confの検証

```
named-checkconf
```
#zoneファイルを作る。

```
$TTL	86400
@	IN	SOA 	hoge.com. root (
	2019081302
	10800
	3600
	604800
	86400
)
@	IN NS ns.hoge.com.
@	IN MX 10 mail.hoge.com.
@	IN A 192.192.192.192
ns	 IN A 192.192.192.192
www	 IN A 192.192.192.192
mail IN A 192.192.192.192
```

```
$TTL	86400
@ 	IN 	SOA 	hoge.com. root (
	2019081301
	10800
	3600
	604800
	86400
)
@	IN NS ns.hoge.com.
@ 	IN PTR hoge.com.
```

#zoneファイルの検証

```
named-checkzone hoge.com /etc/bind/hoge.com.zone
```

#確認

```
dig @ns.hoge.com hoge.com
```
以上。
MagicOnion で複数ポートから別々の通信を受け付ける

# はじめに

MagicOnion については[こちら](http://tech.cygames.co.jp/archives/3181/)をご覧ください。
MagicOnionにおいて通常のユーザー用RPCとは別に、管理者用コマンドを受け付けたいケースがあります。
(例: static変数にキャッシュした内容のクリア)
そういう場合は管理者用コマンドだけを別ポートから受け付けるようにすると楽です。

# 実装

Interfaceを定義します。

```csharp
public interface IAdminService : IService<IAdminService>
{
    UnaryResult<Nil> ClearCacheAsync();
}
```

実装します。このとき、ユーザー用サービスとは別のDLLで作っておくと後で楽です。

```csharp
public class AdminService : ServiceBase<IAdminService>, IAdminService
{
    public UnaryResult<Nil> ClearCacheAsync()
    {
        // Cache.Clear(); 的なコード
    }
}
```

MagicOnion サーバーの起動時に、どのサービスを使うかを指定することができるので、
ユーザー用ポートでは自身の Assembly を、管理者用ポートでは AdminService を指定します。
※ユーザー用ポートに AdminService を含まないよう注意

```csharp
public class Program
{
    public static async Task Main(string[] args)
    {
        await MagicOnionHost.CreateDefaultBuilder()
            // ユーザー用
            .UseMagicOnion(
                new[] { typeof(Program).Assembly },
                new MagicOnionOptions(true),
                new ServerPort("0.0.0.0", 8080, ServerCredentials.Insecure)
            )
            // 管理者用
            .UseMagicOnion(
                new[] { typeof(AdminService) },
                new MagicOnionOptions(true),
                new ServerPort("0.0.0.0", 9999, ServerCredentials.Insecure)
            ).RunConsoleAsync();
    }
}
```

# 通信方法

この方法だと管理者用コマンドの呼び出し側でも MagicOnion が必要になるので [MicroBatchFramework](https://github.com/Cysharp/MicroBatchFramework) かなにかでバッチを作っておくと良いでしょう。以下サンプルです。

```csharp
public class Program : BatchBase
{
    static Task Main(string[] args) => new HostBuilder().RunBatchEngineAsync<Program>(args);

    [Command("clear_cache")]
    public async Task ClearCacheAsync()
    {
        var channel = new Channel("0.0.0.0:9999", ChannelCredentials.Insecure);
        await MagicOnionClient.Create<IAdminService>(channel).ClearCacheAsync();
    }
```
JSの実行するタイミング色々

# はじめに

jsを実行するタイミングが大きく分けて3つあります。

- 今すぐ実行
- DOMツリーが出来上がってから実行※DOMContentLoaded
- 画像の読み込み等が終わり、最後に実行※onload

これらを意識しながら適切なタイミングで処理を行うことが重要になります。

# 問題例

### DOMを操作する場合
今すぐ実行してしまうと、scriptタグの後ろに記述した内容がロードされていない状態で処理を行ってしまうため、エラーになることがあります。操作対象をscriptタグの前に記述するか、DOMContentLoaded以降に処理を行う必要があります。

### DOMツリーが出来上がってから処理を行いたい
onloadで実行しても処理的には問題ないですが、画像のロードを待ってから処理が開始されるため、処理に時間がかかってしまいます。画像ロード前に行える処理ならば、DOMContentLoaded以前に行うべきです

### ロードが終わってからローディング画像を消したい
DOMContentLoadedに書いてしまうと、画像の読み込みが終わっていないのにローディング画像が消えてしまいます。このような時はonloadで実行するべきです。

#  サンプル
私は新規でjsを書く時、下記をコピペして、処理の流れを意識しながらコーディングするようにしています。

```js:js
//グローバル変数の宣言、代入
//変数のスコープがややこしくなるので、ここにはできるだけ処理を書かない

//今すぐ実行する処理
(function() {

}());

//DOMツリーが出来上がったら実行※画像読み込み前
document.addEventListener('DOMContentLoaded', function() {

});

//最後に実行※画像読み込み後
window.onload = function() {

};
```
laravelでDBにエスケープされてはいってしまうとき


DBに入れる時や、APIとしてjsonを返す時などは,
laravelでは最後に勝手にjsonに変換しているようす。


なので、「jsonで返したり、DBにjson入れようとしても、どうやってもエスケープされている！！」という時は、arrayに変換してから返却なり、DBに挿入なりしよう。


勝手にjsonに変換してくれるので、jsonを渡す必要はなし。

arrayを渡せばOK

例えば、factoryを使い、DBにこんな値をいれたいとする。placeにjsonでいれたいつもり。

```php.sample.php

$factory->define(Mission::class, function () {
    return [
        'place' =>'[
                {"lat":35.710250,"lng":139.719645},
                {"lat":35.695874,"lng":139.744136},
                {"lat":35.662947,"lng":139.730149},
             ]'
    ];
});

```

こんな時は、最初からjsonにしていると、エスケープされてしまうので、arrayで渡してあげる

```php.sample.php

$factory->define(Mission::class, function () {
    return [
        'place' =>'[
                ["lat"=>35.710250,"lng"=>139.719645],
                ["lat"=>35.710250,"lng"=>139.719645],
                ["lat"=>35.710250,"lng"=>139.719645],
             ]'
    ];
});


```
AtCoder Beginner Contest 061 D - Score Attack(bellman ford法)

# AtCoder Beginner Contest 061 D - Score Attack(bellman ford法)

https://atcoder.jp/contests/abc061/tasks/abc061_d


```python


from collections import defaultdict, deque, Counter
from heapq import heappush, heappop, heapify
import math
import bisect
import random
from itertools import permutations, accumulate, combinations, product
import sys
from copy import deepcopy
import string
from bisect import bisect_left, bisect_right
from math import factorial, ceil, floor
from operator import mul
from functools import reduce


sys.setrecursionlimit(2147483647)
INF = 10 ** 20
def LI(): return list(map(int, sys.stdin.buffer.readline().split()))
def I(): return int(sys.stdin.buffer.readline())
def LS(): return sys.stdin.buffer.readline().rstrip().decode('utf-8').split()
def S(): return sys.stdin.buffer.readline().rstrip().decode('utf-8')
def IR(n): return [I() for i in range(n)]
def LIR(n): return [LI() for i in range(n)]
def SR(n): return [S() for i in range(n)]
def LSR(n): return [LS() for i in range(n)]
def SRL(n): return [list(S()) for i in range(n)]
mod = 1000000007



n, m = LI()
G = [[] for _ in range(n)]
for a, b, c in LIR(m):
    G[a - 1] += [(b - 1, c)]

# 負の閉路がなかったら高々n-1回で更新は終わるはずn回目に更新が起こったとしたら負の閉路がある。
def bellman_ford(G, s=0):
    dist = [-INF] * n
    dist[s] = 0
    v_nows = {s}
    for _ in range(n):
        v_changeds = set()
        for u in v_nows:
            for v, ci in G[u]:
                if dist[u] + ci > dist[v]:
                    dist[v] = dist[u] + ci
                    v_changeds.add(v)
        v_nows = v_changeds
    dq = deque(v_nows)
    while dq:
        u = dq.popleft()
        if u == n - 1:
            return "inf"
        for v, _ in G[u]:
            if dist[v] != INF:
                dist[v] = INF
                dq += [v]
    return dist[n - 1]



print(bellman_ford(G))

```
githubのプルリクエスト上で[?w=1]で半角スペース無視が便利な件

ソフトタブとハードタブが混在している場合、
ほとんどのエディター上ではきれいに整形して表示されますが、
あくまでテキストデータなのでgithub上はタブと半角スペースがそのまま表示されます。
なのでインデントが見辛くなることもしばしばです。
（本来はそうならないようにコーディングするのがベターですが）

そんな時にプルリクのURLの後ろに`?w=1`というGETのパラメータをつけると
半角スペース・タブのみの差分を無視して表示されます。

`https://github.com/aki/XXXXX/pull/5/files?w=1`

コード中のインデント揃えだけするようなこともありますが
差分としては表示したくないこともあります。
そんな時に地味に便利な機能です。

また、現在のgithubでは設定でwhitespace無視のオプションが追加されているのでパラメータをいじる必要はなくなりました。
<img width="233" alt="スクリーンショット 2019-08-13 10.20.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/7bde33a8-f779-f612-66b5-d1d8366f24d1.png">
.zshrcをちょっと書き換えて起動を3倍速くした話

rubyを使っている方々、 `rbenv` を使っているのではないでしょうか。
k8sを使っている方々、 `kubectl` は必需品ですよね。 `kubesec`, `helm` もよく使うかもしれません。

それらの設定を `.zshrc` にそのまま書いていませんか？僕は書いていました。

チューニング前の簡易なベンチマークの結果がこちらです。

```shell
$ for i in {1..10} ; do time ( zsh -i -c exit ); done
( zsh -i -c exit; )  0.59s user 0.19s system 115% cpu 0.677 total
( zsh -i -c exit; )  0.65s user 0.13s system 111% cpu 0.699 total
( zsh -i -c exit; )  0.60s user 0.19s system 107% cpu 0.735 total
( zsh -i -c exit; )  0.63s user 0.17s system 101% cpu 0.780 total
( zsh -i -c exit; )  0.57s user 0.22s system 103% cpu 0.760 total
( zsh -i -c exit; )  0.63s user 0.15s system 109% cpu 0.713 total
( zsh -i -c exit; )  0.72s user 0.19s system 96% cpu 0.950 total
( zsh -i -c exit; )  0.61s user 0.19s system 108% cpu 0.734 total
( zsh -i -c exit; )  0.69s user 0.21s system 99% cpu 0.899 total
( zsh -i -c exit; )  0.64s user 0.15s system 101% cpu 0.775 total
```

だいたい 0.7~0.9秒ほどかかっていますね。
別に何か大きな損失があるわけではないですが、ターミナルを開いてワンテンポ遅れてプロンプトが表示されるのが気になっていました。

そんな `.zshrc` をチューニングした結果がこちらです。

```shell
$ ( zsh -i -c exit; )  0.14s user 0.03s system 72% cpu 0.232 total
( zsh -i -c exit; )  0.15s user 0.02s system 68% cpu 0.237 total
( zsh -i -c exit; )  0.13s user 0.03s system 70% cpu 0.232 total
( zsh -i -c exit; )  0.13s user 0.04s system 72% cpu 0.232 total
( zsh -i -c exit; )  0.13s user 0.05s system 36% cpu 0.466 total
( zsh -i -c exit; )  0.15s user 0.07s system 64% cpu 0.338 total
( zsh -i -c exit; )  0.13s user 0.03s system 71% cpu 0.226 total
( zsh -i -c exit; )  0.13s user 0.04s system 69% cpu 0.248 total
( zsh -i -c exit; )  0.13s user 0.04s system 61% cpu 0.279 total
( zsh -i -c exit; )  0.15s user 0.03s system 70% cpu 0.251 total
```

0.2~0.3秒ほどになりました。3倍前後の高速化です。

今回は長々と難しいチューニングをすることなくお手軽にzshの起動を速くする方法を紹介します。
と言ってもほぼ受け売りなんですけど。

## kubectl, kubesec, helmの補完設定の遅延化

`kubectl` は `source <(kubectl completion zsh)` で入力補完の設定ができます。 `kubesec`, `helm` も同様です。
zshrcのプロファイリングをしたところ、この3つの実行に多くの時間がかかっていました。

そこで [zshの起動が遅かったので早くできないかチャレンジした \- hatappi\.blog](https://blog.hatappi.me/entry/2019/06/01/112358) を参考に

```shell
if type kubectl > /dev/null 2>&1; then
   source <(kubectl completion zsh)
fi
```

を

```shell
kubectl() {
  unfunction "$0"
  source <(kubectl completion zsh)
  $0 "$@"
}
```

と書き換えました。

関数化することで最初に `kubectl` を呼ばれた時に補完設定を行っています。
また、 `unfunction` を使うことで二回目以降は直接 `kubectl` を呼んでいます。

同様の書き換えを `kubesec`, `helm` でも行いました。

## rbenv init の遅延化

同様に `rbenv init -` の部分も書き換えたいところですが、 `rbenv init -` では PATH の設定も行っています。そのため、一行書き加えました

before:

```shell
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"
```

after:

```shell
export PATH="$HOME/.rbenv/bin:$PATH"
export PATH="/home/tech/.rbenv/shims:${PATH}"
rbenv() {
  unfunction "$0"
  eval "$(rbenv init -)"
  $0 "$@"
}
```

## おわり
以上4箇所の書き換えで3倍ほど高速化しました。
前述の記事をそのまま自分の `.zshrc` に適用しただけですが、簡単に速くなったのと、手法がとても面白かったので書きました。
日頃意識していること

在宅ワーカーの私が日頃意識していることを紹介します。

# 日課
- [ ] Qiita投稿
- [ ] 早起き
- [ ] 規則正しい生活※週末の寝溜め厳禁
- [ ] 朝食を取る
- [ ] 1時間散歩※スーパー早歩き
- [ ] 湯船に浸かる

# 技術選定
好奇心がありすぎてなんでもかんでもチャレンジしたくなってしまうため、新しい技術を取り入れようとした時に、下記のようなフィルターを行っている。

- [ ] マルチプラットフォーム※VBとかSwiftとかは興味があっても後回し
- [ ] 各分野シェアNO1はプロフェッショナルに※ブラウザはFirefox派でもChrome操作はプロになる
- [ ] 各分野シェアNO2は一人前に※Windows派でもMACも一人前程度には使えるように
- [ ] 各分野シェアNO3以降は必要に応じて※NO1~2が極まっているなら、先に他の分野を習得する
- [ ] 各分野のシェアは国内ではなくグローバルレベルで判断※Linuxの国内シェアはCentOSが高いけど、グローバルではUbuntuが高い

# マインド
- [ ] なりたい自分を強く意識しまくる※できるだけ具体的に

# 端末操作
- [ ] タイピングは遅くてもいいから、ミスを0にする
- [ ] マウス操作は必要最低限にする

# 字
- [ ] 遅くてもいいから、丁寧に書く
- [ ] メモは手書きを心掛け、その日のうちに清書する

# その他
また色々書き足します。
SNSのサブスクリプションフィルターポリシーを使ってみた

#1.SNSトピックを作成する#
設定はデフォルトでよいので、トピックを作成する。
entertainment
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/7484fe19-12ea-5236-2592-f6b513b0eead.png)


#2.SQSキューの作成#
標準キュー、設定はデフォルトでよいので、3つのキューを作成する。
music-Q
movie-Q
all-Q
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/12a84129-8aff-7a34-5638-fd76835954b5.png)


#3.キューをトピックにサブスクライブする#
3つのキューを選択し、SNSトピックへのキューのサブスクライブする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/a1300750-f927-246d-fd73-28afc16f5f03.png)


#4.SNSサブスクリプションにフィルターポリシーを設定する#
サブスクリプションから、エンドポイントがmusic-Qのものを選択。サブスクリプションフィルターポリシーを以下の通りに編集します。

```
{"entertainment_type": ["music"]}
```

同じく、movie-Qのものも以下の通りにします。

```
{"entertainment_type": ["movie"]}
```

all-Qはデフォルトのままにします。


#5.トピックへのメッセージの発行#

以下のとおり、トピックへのメッセージの発行をする。

---

件名：entertainment_Quote_Request_1
本文：namie_amuro、can_you_celebrate
タイプ：string
名前：entertainment_type
値：music

---

件名：entertainment_Quote_Request_2
本文：marvel、Avengers
タイプ：string
名前：entertainment_type
値：movie

---

件名：entertainment_Quote_Request_3
本文：other、other
タイプ：string
名前：entertainment_type
値：other

---


#6.メッセージの配信を確認する#

music-Q では、entertainment_Quote_Request_1 だけが受信されているはずです。

movie-Q では、entertainment_Quote_Request_2 だけが受信されているはずです。

all-Q では、、entertainment_Quote_Request_1 2　3　すべてが受信されているはずです。
Ruby-FFI は --enabe-system-libffi 明示した方が良さそう

# 注記の追記

Windows だと本家の libffi は（一部）誤動作するようです。
Ruby-FFI が引用する libffi fork は [Windows 向け fix](https://github.com/larskanis/libffi/commit/024800a1331d38794c24cf191cd74b70af1078a1) が入っていて、[本家にも PR してる](https://github.com/libffi/libffi/pull/465)けど、2019-08-13 現在まだ merge されていません。


# 要約

- AWS A1 Instance で Ruby-FFI が seg fault したよ
- Amazon Linux 2 の libffi-devel を使ったら seg fault しなかったよ
- Ruby-FFI は内部に支流の libffi を持ってるよ
- Ruby-FFI はシステムに libffi-devel 等が無い場合、内部の libffi をリンクするよ
- Ruby-FFI では --enable-system-libffi を付けるとシステムの libffi の利用を強制できるよ


# 解法

### with bundler

```
$ bundle config build.ffi --enable-system-libffi
```


# ところで

### 支流の libffi とは

Ruby-FFI の [.gitmodules](https://github.com/ffi/ffi/blob/d9e07ce7085ca12d0b54d78f15c05f2e64630247/.gitmodules#L3) に書いてあるリポジトリが http://sourceware.org/libffi/ に書いてあるリポジトリと違うので、支流と呼んでみました。
（前者は後者を fork したもののようです。）


### --enable-system-libffi について

[extconf.rb](https://github.com/ffi/ffi/blob/d9e07ce7085ca12d0b54d78f15c05f2e64630247/ext/ffi_c/extconf.rb#L31) にて `enable_config()` で参照されています。
[changelog](https://github.com/ffi/ffi/blob/master/CHANGELOG.md) によれば 2019-05-17 に追加されたようです。デキタテホヤホヤ。


### なぜ初手で libffi-devel をインストールしなかったのか

[数年前に Rails セットアップの最小手順を模索した際](https://github.com/matsueoss/hiyaoroshigo/wiki/Minimal-steps-to-install-our-Rails)に、各 devel パッケージを yum install から除外してみて不都合ないか確認した結果、libffi-devel 要らねってなったのです。
当時は nokogiri に --use-system-libraries つけてなかったり、まぁ、トレンドは変わるのですね。
googleのwordpress用のプラグインである「Site kit」をインストールしてみた

wordpressのダッシュボードにGoogle analyticsなどのgoogleサービスを表示することができるプラグイン「Sitekit」をインストールしてみた。ナビゲーション通りにはうまくいかなかったので、メモしとこう。


1. https://sitekit.withgoogle.com/ から、プラグインのデータをダウンロード
2. Wordpressにインストール
3. Wordpressの管理画面のナビゲーションのSiteKit→Dashboardを選択 
4. developers.google.com/web/sitekitをクリックし、Redirect URIをメモしとくか、開いたウィンドウをそのままにしとく。「Get oauth credential」をクリックしてと説明されているけれども、うまく連携できなかったので、違う方法でやってみた。<img width="815" alt="スクリーンショット 2019-08-13 9.40.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21623/21292a12-0c8e-1bfe-5a99-7659c845d17e.png">
5. [Sitekit](https://developers.google.com/web/site-kit/)に直接アクセスして、「Get oauth credential」をクリック<img width="952" alt="スクリーンショット 2019-08-13 9.49.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21623/d3d28321-9db8-e58e-aedd-edee96b6a45c.png">
6. API Projectを選択し、NEXTをクリック<img width="676" alt="スクリーンショット 2019-08-13 9.52.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21623/a5f95b69-a067-9319-d937-f99a6bf5e44f.png">
7. WebServerを選択し、Authorized redirect URIsに４で取得したRedirectURLを記述し、CREATEをクリック<img width="654" alt="スクリーンショット 2019-08-13 9.56.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21623/6c204ef5-9458-33dd-95d2-d32c99bab2b7.png">
8. Client configurationが表示されるので、それをコピーし、３のページのClient configurationに貼り付けて、PROCEEDをクリック
9. あと、指示通りに進めば設定完了


※ベータ版なので、都度変わる可能性がありますので、ご注意ください。
Nuxt.jsのプロジェクトでnuxt-i18nを使ってi18n（国際化）対応する方法

Nuxt.jsのプロジェクトに[nuxt-i18n](https://nuxt-community.github.io/nuxt-i18n/)を導入し、i18n（国際化）対応する方法を紹介します。

## nuxt-i18nとは
nuxt-i18nは、Nuxt.js用のi18nライブラリです。
Vue.js用のi18nライブラリである[vue-i118n](https://kazupon.github.io/vue-i18n/)にいくつかの機能が追加され、Nuxt.jsでの使用に特化しています。

## パッケージをインストール
[nuxt-i18n](https://www.npmjs.com/package/nuxt-i18n)パッケージをインストールします。

```sh
$ npm i -D nuxt-i18n
```

## 言語ファイルを作成
ここでは、`lang`ディレクトリにJSON形式で英語と日本語の言語ファイルを作成します。

```json:lang/en.json
{
  "HELLO_WORLD": "Hello World"
}
```

```json:lang/ja.json
{
  "HELLO_WORLD": "こんにちは、世界"
}
```

わかりやすさのためにキーをアッパースネークケースにしていますが、別にキャメルケースでもかまいません。[^1]

## nuxt-i18nの設定ファイルを作成
nuxt-i18nの設定をオブジェクトとして記述します。
`nuxt.config.js`ファイルに直接書いてもいいのですが、それなりに長いので別ファイルに切り出します。

```js:nuxt-i18n.config.js
export default {
  locales: [
    {
      code: 'en',
      iso: 'en',
      file: 'en.json'
    },
    {
      code: 'ja',
      iso: 'ja',
      file: 'ja.json'
    }
  ],
  defaultLocale: 'en',
  lazy: true,
  langDir: 'lang/'
}
```

nuxt-i18nには多くの[設定項目](https://nuxt-community.github.io/nuxt-i18n/options-reference.html)がありますが、ここでは最小限のもののみを指定しています。

* `locales`：使用する言語のリスト
    * `code`：URLなどに使用される識別子
    * `iso`：ISO形式の言語コード（詳細は後述）
    * `file`：言語ファイルのファイル名
* `defaultLocale`：デフォルトの言語
* `lazy`：言語ファイルを使用してレイジーロードをするか
* `langDir`：言語ファイルのディレクトリ

### ISO形式の言語コード
ISO形式の言語コードは、以下のいずれかの形式で指定する必要があります。

* [ISO 639-1](https://ja.wikipedia.org/wiki/ISO_639-1%E3%82%B3%E3%83%BC%E3%83%89%E4%B8%80%E8%A6%A7)のコード（言語コード）
    * `en`
    * `jp`
* ISO 639-1のコード（言語コード）と[ISO 3166-1 alpha-2](https://ja.wikipedia.org/wiki/ISO_3166-1)のコード（国名コード）をハイフンで結合
    * `en-US`
    * `ja-JP`

## プロジェクトにモジュールを追加
`nuxt.config.js`ファイルの`modules`に、`nuxt-i18n`とオプションオブジェクトを配列として追加します。

```js:nuxt.config.js
import i18n from './nuxt-i18n.config'

export default {
  modules: [
    ['nuxt-i18n', i18n]
  ]
}
```

ここでは、さきほど作成した設定ファイルをインポートしてオプションとして使用しています。
`nuxt.config.js`ファイルが肥大化するのを許容できるのであれば、以下のようにリテラルで書いてもいいでしょう。

```js:nuxt.config.js
export default {
  modules: [
    ['nuxt-i18n', {
      locales: [
        {
          code: 'en',
          iso: 'en',
          file: 'en.json'
        },
        {
          code: 'ja',
          iso: 'ja',
          file: 'ja.json'
        }
      ],
      defaultLocale: 'en',
      lazy: true,
      langDir: 'lang/'
    }]
  ]
}
```

## コンポーネントで使用
nuxt-i18nの言語ファイルで定義したリソースは、コンポーネント内では`$t(キー)`という形式で使用します。

```vue:pages/index.vue
<template>
  <div>
    <span>{{ $t('HELLO_WORLD') }}</span>
  </div>
</template>
```

こうすることで、表示中の言語に対応する文字列が表示されます。

### 英語
![https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132608/76f61bc1-c3ab-2db3-9613-7d89359b7dd5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132608/76f61bc1-c3ab-2db3-9613-7d89359b7dd5.png)

### 日本語
![https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132608/c62737f7-fc3c-9c40-2757-1398de3260e6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132608/c62737f7-fc3c-9c40-2757-1398de3260e6.png)

## 例
* [munierujp/nuxt-i18n-example](https://github.com/munierujp/nuxt-i18n-example)

[^1]: [プログラミングにおける識別子の表記法まとめ🐫🐍⛓ - Qiita](https://qiita.com/munieru_jp/items/c150f5e8865d5c075d37)
【AWS】インフラエンジニアでなくてもできるアクセス負荷対策



こんにちわ、スタートアップで働く**サーバーサイドエンジニア**です。
メインはサーバーサイドですが、スタートアップなのでインフラやフロントについても担当させて頂く機会が多いです。
そこで今回はTV放送に耐えられるように行った負荷対策とその結果について書いていこうと思います。

AWSなどのクラウドサービスを使えば、インフラ専門の方でなくても随分な対策ができてしまいます。
ぜひサーバーサイドメインでインフラわからないよって方の参考になればと思います！

# ①アクセス数の予測
  放送される番組の視聴率や放送範囲からアクセス数を予測しました。
  (視聴がわからない場合は番組担当者の方に直接聞いたり[週間高世帯視聴率番組10 - ビデオリサーチ](https://www.videor.co.jp/tvrating/)、[テレビ視聴率ランキング | インターネットTVガイド](https://www.tvguide.or.jp/ranking/program)が参考になりました)

計算内容はこちら(参考: [カウル Tech Blog](http://techblog.housmart.co.jp/2016/03/03/prepare_for_wbs/))

```
# 総アクセス数を求める公式
総アクセス数 = テレビ局のリーチ人数 × 視聴率 × Web検索する人の割合 (=総アクセス人数) × 一人あたりの平均閲覧ページ数
```

```
総アクセス数 = 4,000万(テレビ局のリーチ人数) × 5%(視聴率) × 1%(Web検索する人の割合) × 2(一人あたりの平均閲覧ページ数) = 4万アクセス
```

```
出演時間のQPS = 4万アクセス ÷ 60秒 = 平均 666 QPS
* OPS(平均リクエスト数)
```

**666 OPS(平均リクエスト数)**と予想されます！
(↓のAuto ScalingでこのOPSをもとにインスタンス数を決定しています)



# ②行った負荷対策

###1. コンテンツのキャッシュ

TOPページのコンテンツについてキャッシュしました。キャッシュの方法は
①TOPページには**[アクションキャッシュ](http://yamakichi.hatenablog.com/entry/2017/03/09/000951)**を適用(rails)しました。
　→TOPページは最も瞬間アクセスが多いところだと思います。画像などの静的コンテンツだけでなく動的コンテンツもあったので適用させたのは**非ログインユーザー**のみにしました。

②CDN([Cloudfront](https://dev.classmethod.jp/cloud/aws/cloudfront-multioriginbehavior/))を、**使い方**、**会社概要**ページについて適用

　→こちらの2つについてもアクセス数が多く、CDNによるキャッシュをしました。
###2. Auto Scaling(インスタンス数の最適化)
普段はEC2、RDS、ALB、R53で運用しています。EC2は以下のようにスケールアウトしました。

| 変更前 |    変更後   |
|:-----------------:|:------------------:|
| t2.medium×2~5(通常2台稼働) |   t2.medium×5~10(通常5台稼働)   |


   こちらの5台稼動したのは
   > EC2とRDSで動く Rails x MySQL の構成で、**[1vCPUあたり100[QPS]程度のリクエストを捌くことが可能](https://qiita.com/chase0213/items/b5ecd4377f60605332e1#%E3%81%BE%E3%81%A8%E3%82%81)**
   
[(各インスタンスタイプのvCPU)](https://aws.amazon.com/jp/ec2/instance-types/)
   
の内容を参考に

```
t2.medium = 2vCPU×5 = 1000 OPS > 666 OPS(予測)
```

という見立てに基づいています！
　　

# ③結果

  **約180req/sec(google analyticsで測定)**でした(笑)。サーバーも重くなることも、もちろん落ちることもありませんでした。
　**1000req/sec**の想定で予想の半分も行かない結果とはなりましたが、アクセス予測→予測をもとに負荷対策の実施を一通り経験できたのでインフラに対する知識は少しは深まったかと思います。今後サービスが大きくなるにつれて、DBの対策の方もしていかなくてはと思います。(それはまた後ほど)

またかなりさらっと触れてしまいましたが、**会社概要**や**使い方**ページは熱量の高い初回訪問ユーザーが訪れるページでもあるので、しっかりと登録の導線を設置しておきましょう！(会社概要ページは難しいかも)


前回はスタートアップで働いていることを活かした記事も書きました！もし実際こういうのどうなの? なんてことあればぜひお聞きください!
[スタートアップで働いて得られた開発tips](https://qiita.com/free_man/items/e47ec5b136a7a8622855)
webarenaでubuntu その7

#概要

webarenaでubuntu18.04やってみた。
bindやってみた。
log取ってみた。

#named.confの修正

```
logging {
	category "default" { 
		"default_debug"; 
	};
	channel "default_debug" {
		syslog daemon;
		severity info;
	};
};
```

#named.confの検証

```
named-checkconf
```

#確認

```
cat /var/log/syslog | grep named
```

以上。