OmniAICreator/Qiita-1.07M huggingface dataset:
kubernetesのDiscovery＆LBリソースの概要

# Discovery＆LBリソースとは
コンテナを外部公開するようなエンドポイントを提供するリソース

## CluusterIP
kubernetesクラスタ内からのみアクセス可能な仮想IP
これがデフォルトのServiceTypeとなります。

```yaml:sample-clusterip.yaml
apiVersion: v1
kind: Service # リソースの種類
metadata:
  name: sample-clusterip # Serviceの名前
spec:
  type: ClusterIP # Serviceの種類
  ports:
    - port: 8000 # ポート番号
      targetPort: 80 # 転送する先のポート
  selecter: sample-app # 転送先のPod
```

## NodePort
全てのKubernetes NodeのIPアドレスポートで受信したトラフィックをコンテナに転送する形で、外部疎通を確立するリソースです。

```yaml:sample-nodeport.yaml
apiVersion: v1
kind: Service # リソースの種類
metadata:
  name: sample-nodeport # Serviceの名前
spec:
  type: NodePort # Serviceの種類
  ports:
    - name: "http-port"
      protocol: "TCP"
      port: 8080 # ポート番号
      targetPort: 80 # 転送する先のポート
      nodePort: 30080
  selecter: sample-app # 転送先のPod
```

## LoadBalancer
Kubernetesクラスタ外のloadBalancerに外部疎通性のある仮想IPを払い出すことが可能。


```yaml:sample-lb.yaml
apiVersion: v1
kind: Service # リソースの種類
metadata:
  name: sample-lb # Serviceの名前
spec:
  type: LoadBalancer # Serviceの種類
  ports:
    - name: "http-port"
      protocol: "TCP"
      port: 8080 # ポート番号
      targetPort: 80 # 転送する先のポート
      nodePort: 30080
  selecter: sample-app # 転送先のPod
```

## ExternalName
Service名の名前解決に対して外部のドメイン宛のCNAMEを返します

```yaml:sample-ds.yaml
apiVersion: v1
kind: Service # リソースの種類
metadata:
  name: sample-externalname # Serviceの名前
spec:
  type: ExternalName # Serviceの種類
  externalName: example.sophia-s.co.jp
```
Arduino IDE sketch HIGH

Arduino IDEの「スケッチ」。そのファイル構造を知ろう。
https://www.fabshop.jp/arduino-ideのスケッチファイル操作/

```c:sketch_mar02.c
void setup(){
pinMode(LED_BUILTIN, OUTPUT);
}

void loop(){
  digitalWrite(LED_BUILTIN, HIGH);
  }
```

includeファイルの指定がなく、

LED_BUILTIN, OUTPUT, HIGH

を使っている。

IDEの作法なのか。
ファイルの拡張子が.ino。

Arduino IDE で作成した .ino ファイルを、C++コンパイラでコンパイルできる .cpp ファイルに
https://qiita.com/ajtajta_j/items/8a75072eb39ccaa1c565

> ＃include "Arduino.h" を .ino.cpp ファイルの先頭に。

なるほど、定義はArduino.hにあるんだ。
【メモ】JSUG勉強会 2019その7 ビズリーチにおけるSpringの活用

# JSUG勉強会 2019その7 ビズリーチにおけるSpringの活用

自分用にとったメモを共有します。

## クラウド時代だからspring-retryフレームワーク
[スライドはこちら](https://docs.google.com/presentation/d/1UjSUpSgSdicpTnQUziwe4_FzZFrNMQ7fcGt4gzv_SEk/edit#slide=id.g5d22b951f3_0_107)

### 自動リトライに向いているのは
- 数分レベルで復旧している可能性が高いなら自動リトライ
- そもそも通信過多の場合はスロットリング
クラウドを用いる場合は自動リトライとスロットリングについて頭に入れておかなければならない。

### RDSのフェイルオーバーとは
- 主系に障害が発生すると自動的に副系に変わること

フェイルオーバー後にCNAMEが切り替わる
→だからアプリケーションが勝手に起動する。

JVMが生きている間はDNS検索結果をずっとキャッシュするのがデフォルト
→なので、CNAMEが切り替わってもJVMがキャッシュのせいで理解しない
"-Dnetowrkaddress.cache.ttl=3"　デフォルトの-1から秒数を設定してあげる

### Spring Retry

AOPはわずかに遅くなる。
RetryTemplateを明示的に使うほうがわかりやすくて確実。

アプリケーション
↓　←ここに失敗した場合は××回までリトライする。
　　　間隔を指数関数的にリトライすることも可能
コネクションプール
↓
JDBCドライバ
↓
DB

### まとめ
- クラウドの向こう側の障害が90秒で回復しても、それに依存する自分のアプリケーションも90秒で回復するとは限らない。
- フェイルオーバー試験するしかない。
- リトライは(DBCPの設定がちゃんとできていれば)最悪、無くてもよい。

### 参考
- https://github.com/spring-projects/spring-retry
- https://qiita.com/kazuki43zoo/items/d9182c8ddb2b754f150f

## フレームワーク移行で学ぶ Spring Boot のつまづきポイント

### ニクリーチ
1年前にSpringへフレームワーク移行を実施。
Seasor, SAStruts, JSPから移行した。

### 移行作業
作業の大半はControllerとテンプレートの書き換え。

大きく異なる点 

- viewにデータを渡す方法
- Formクラスでの値の受け取り方

### viewにデータを渡す方法
Springは書き方がめちゃくちゃある
- Model
- ModelAndView
- @ModelAttribute
などなど・・・

とりあえずチーム内で渡し方のルールを決める
あらかじめHelperクラスを作っておけば、統一しやすい。

Springのコントローラーはデフォルトがsingletonなので注意
@Scopeアノテーションを用いることでコントローラークラスのインスタンス生成のタイミングを変えることができる。(デフォルトがsinglton)

### Formクラスでの値の受け取り方
注意点/つまづきポイント

- th:fieldとth:objectによるFormバインディングの際にはFormクラスにはgetter/setterが必要であることに注意が必要。
- SpringSecurityを有効にしている場合、csrfトークンを有効にしておかないと403になってしまう→th:actionを用いると解決される。

### SpringSecurityのつまづきやすい認証処理
SpringSecurityの場合
Controllerでパラメーターを受け取らない。必要なクラスをBean定義するだけ。

なぜわかりにくいのか

- 処理が隠ぺいされてしまっているから
- 認証がしっかりと抽象化されているから

### どういうところでつまづいたか
- 実装の選択肢が多い→viewにデータを渡す方法など
- 覚えることが多い→アノテーションの数,SpringSecurityなど
- フレームワークの隠蔽化がすごい→CSRFトークン,SpringSecurityなど

ではどうするか

- 実装の選択肢が多い→チームで共通化する。他のチームやプロダクトを参考にする
- 覚えることが多い→頑張る。必要なものは都度覚える
- フレームワークの隠蔽化がすごい→頑張る。

## これで怖くない！？コードリーディングで学ぶSpring Security
[スライドはこちら](https://www.slideshare.net/masatoshitada7/spring-security-meetup)

### SpringSecurityとは

- Springのサブプロジェクト
- 認証認可を中心にセキュリティにまつわる様々な機能を提供する
- 何重ものサーブレットフィルターで機能を実現している

数あるプロダクトの中でもかなり複雑

### アーキテクチャをざっくり理解する
従来のサーブレット版を前提に解説
フィルターはBeanとして管理されている。
application.propertiesでlogging.level.org.springframework.security = debug
とするとログで確認することができる。

### コードを読んで深く理解する
フィルターのコードから読むようにするとよい。

なぜThreadLocalを使うのか
実行中スレッドのどこからでもSecurityContext内のユーザー情報にアクセスできるため

LogoutHandlerは何をしているのか
SecurityContextLogoutHandlerが必ず最後に実行される

AuthenticationManagerとは
認証処理を行うインターフェース

### まとめ
Spring Securityは複雑だが、コードリーディングは楽しい

### 参考
https://github.com/spring-projects/spring-security

---

## 雑感
話を聞いた中では２人目の木下さんの話は共感できることが非常に多く、印象的でした。
特にまとめにあった

- 実装の選択肢が多い
- 覚えることが多い
- フレームワークの隠蔽化がすごい

は非常に共感できました。

また、Spring Retryの存在は初耳でしたし、難しいなぁと感じていたSpring Securityが他の人にとっても難しいものであるということを認識できたことも良かったです。
Lightsail インスタンスのスナップショットを日次で取得する

## まえがき
気がつくと Lightsail インスタンスがポコポコと立っており本番稼働しているといったことが人生にはしばしば起こりえます。
ちゃんとステートレスなサーバになっていれば良いのですが、得てして「Lightsail で安くシュッと Wordpress を動かしたい！」「ヨッシャ動いたから本番稼働させちゃおう！」といった勢いで Web サーバから DB までまるっと1インスタンスに詰め込まれがちです。

本来であれば Lightsail Database などを適切に用いて DB を分離すべきですが、Lightsail のスナップショットを定期的に取得しておくことで暫定対策とすることもしばしばあります。

しかし、残念ながら Lightsail には手動スナップショット機能はあっても定期的に自動でスナップショットを取得する機能は存在していません。Lightsail Database がリリースされた今では、実装される見込みも薄いように思えます。
ですのでさっくり Lambda で全インスタンスの日次バックアップの実装してしまいましょう。

## コード

```typescript
import * as AWS from "aws-sdk";
import { CloudWatchLogsEvent, Context, Handler } from "aws-lambda";
import { PromiseResult } from "aws-sdk/lib/request";

const AP_NORTHEAST_1: "ap-northeast-1" = "ap-northeast-1";

AWS.config.update({ region: AP_NORTHEAST_1 });
const lightsail = new AWS.Lightsail({ apiVersion: "2016-11-28" });

const createAllBackup = (instances: AWS.Lightsail.Types.Instance[] = []) => {
  return instances.map(instance => {
    const instanceName: AWS.Lightsail.Types.ResourceName | undefined = instance.name;
    const currentTime: Date = new Date();
    const params = {
      instanceName: `${instanceName}`,
      instanceSnapshotName: `${instanceName}-${currentTime.getTime()}`
    };
    console.log(`create backup for ${instanceName}...`);
    return lightsail.createInstanceSnapshot(params).promise();
  });
};

const getAllInstances = (): Promise<PromiseResult<AWS.Lightsail.Types.GetInstancesResult, AWS.AWSError>> => {
  return lightsail.getInstances({}).promise();
};

export const handler: Handler = async (event: CloudWatchLogsEvent, context: Context) => {
  try {
    const instancesResults: AWS.Lightsail.Types.GetInstancesResult = await getAllInstances();
    const result = await Promise.all(createAllBackup(instancesResults.instances));
    console.log("DONE");
    return "backup complete";
  } catch (err) {
    throw new Error(err);
  }
};
```

これを CloudWatch Events Schedule から毎日叩くようにすればいいですね、かんたん！

```hcl

```
アプリケーションを世界に公開するには

##なぜWebアプリケーションを利用できるのか

###リクエストとレスポンス
「サイトの情報を持ったコンピューター」を__サーバー__と呼びます。
そしてサービスを提供することができます。
そのサービスを受ける側を__クライアント__と呼びます。

__クライアント__側から__リクエスト__を送り
__リクエスト__に対応する__レスポンス__を__サーバー__が返すことでwebページが反映される仕組みになっています。


##デプロイする流れ
###デプロイとは
ここで言うデプロイとはサーバー内にアプリケーションのプログラムを置くこと。

###大まかなステップ
1.アプリケーションを開発する
2.アプリケーションをデプロイするためのサーバを用意する
3.実際にアプリケーションをデプロイする

ここの工程２で必要になってくるのが__AWS__です。
###AWSとは
Amazonが提供しているAmazon Web Servicesの略で
__クラウドコンピューティングサービス__の総称です。

###クラウドコンピューティングサービスとは
コンピューティングサービス(サーバー、ストレージ、データベース、ネットワーク、ソフトウェア、分析など) をクラウド経由で配信して、ネットワーク越しに提供する技術。
「必要な時に、必要な分だけ使う」事ができるので、コスト,スピード,生産性に優れている。
トレントクライアント

急流はダウンロードを管理する簡単な方法です。必要なのは、最高のMacトレントプログラムとアクティブなインターネット接続だけです。

Torrentファイルは、ゲーム、プログラム、音楽などのようなファイルにすぎません。標準のTorrentファイルには、この特定のTorrentファイルに関連するトラッカーとファイル情報を含む.torrent拡張子が付いています。 Torrent接続はP2P（ピアツーピア）ファイル共有プロトコルで機能し、ファイルをダウンロードするためにWeb経由でリモートピアに接続します。

[Folx](https://mac.eltima.com/torrent-client.html)はMac用のトップトレントアプリで、トレントファイルをダウンロードする便利な方法を提供します。優先順位を設定し、ダウンロードとアップロード速度を調整し、コンテンツをすばやく検索するためのダウンロードにタグを付けます。

Folxを使用すると、マグネットリンクを介してだけでなく、トラッカーから急流をダウンロードすることができます。マグネットリンクは、bittorrentコンテンツのダウンロードと共有を容易にするための一般的な方法です。

PROバージョンの機能
最高のトレント体験をするには、Folx 5 Proをチェックしてください。あなたは、上に提示されたすべての機能に加えて、すべてをはるかに簡単にしてユーザーフレンドリーにするオプションと機能の全体セットを手に入れるでしょう。

Mac OS X用のこのトップトレントクライアントのPROバージョンでは、アプリから直接トレントコンテンツを検索できます。そのため、複数のトレントトラッカーをブラウズする必要はありません。 Folxに検索語を入力するだけで、膨大な数のtorrentトラッカーの一覧が表示され、関連する結果が表示されます。

ダウンロードスケジュール
Folx 5では、ダウンロードの日時を都合の良いように設定できます。さらに、ダウンロードが完了したら、アプリに何をすべきかを伝えることができます。シャットダウン、スリープモードに入る、またはFolxを終了します。

iTunesにビデオや音楽を自動的に追加する
Folx BitTorrent 64 Macクライアントは、ダウンロードした音楽やビデオを、以前ダウンロードしたコンテンツに割り当てたタグの名前のプレイリストで、iTunesに自動的に追加します。

パスワードとログインを保存する
Folxは、ダウンロードに認証を必要とするさまざまなサイトのログインとパスワードを記憶できます。そのため、次回特定のWebサイトからダウンロードするときは、ユーザー名とパスワードを手動で入力する必要はありません。 Folxは、FTPまたはHTTP Webサイトのパスワードを保存して自動的にログインします。

YouTubeからビデオをダウンロードする
また、Folxは、YouTubeから直接ビデオや音楽をダウンロードできるという点で、市場で最も優れた[Mac用トレントクライアント](https://www.mac-downloader.com/)であることを証明しています。数回クリックするだけで、Folx 5を使ってあらゆる種類のYouTubeコンテンツのMP3ファイルまたはビデオを見ることができます。
LeetCode / Valid Parentheses

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

[https://leetcode.com/problems/valid-parentheses/]

Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the input string is valid.

An input string is valid if:

Open brackets must be closed by the same type of brackets.
Open brackets must be closed in the correct order.
Note that an empty string is also considered valid.

Example 1:
Input: "()"
Output: true

Example 2:
Input: "()[]{}"
Output: true

Example 3:
Input: "(]"
Output: false

Example 4:
Input: "([)]"
Output: false

Example 5:
Input: "{[]}"
Output: true

Parenthesesというのは括弧という意味らしいです。初めて知った。。。
括弧が正しい順序で閉じられているか判定する問題です。後入れ先出し（一番最後に始まった括弧をまず閉じなければならない）ですね。
小学生の頃、こんがらがった記憶があります。小学校のプログラミング教育 兼 算数教育に使えそう。

#### 回答・解説

##### 解法1
公式の解説はこちら。
listの変数stackにopenする括弧を格納しておき、closeする括弧が現れたら、最後にopenした括弧と対応しているかチェックします。
ほとんどの解法で、対応する括弧をハッシュテーブルに格納しておくのは共通です。

```python
class Solution(object):
    def isValid(self, s):
        stack = []
        mapping = {")": "(", "}": "{", "]": "["}
        for char in s:
            # closeする括弧が現れたら、最後にopenした括弧をstackから取り出しtop_elementとし、closeする括弧との対応をチェック
            if char in mapping.keys():
                # stackが空、つまりopenした括弧の中でcloseされていない括弧がないときにcloseする括弧が現れたら、'#'を格納（この後すぐfalseを返す）
                top_element = stack.pop() if stack else '#'
                if mapping[char] != top_element:
                    return False
            # openする括弧が現れたら、stackに格納
            else:
                stack.append(char)
        return not stack
```

##### 解法2
対応する括弧をハッシュテーブルに格納するのは同じですが、こちらはopenする括弧をkeyに、closeする括弧をvalueにとります。
計算量はさほど変わりません。

```python
class Solution(object):
    def isValid(self, s):
        mapping = {"(": ")", "[": "]",  "{": "}"}
        open_par = set(["(", "[", "{"])
        stack = []
        for char in s:
            if char not in open_par:
                if stack and char == mapping[stack[-1]]:
                    stack.pop()
                else:
                    return False
            else:
                stack.append(char)
        return not stack
```
【Django】FormクラスとModelFormクラス


## Form

```python:Form

from django import forms
from django.core.validators import RegexValidator


class UserForm(forms.Form) :
    CHOICE = (
    ('DB値', '任意'),
    ...
)
    account_id_regex = RegexValidator(regex=r'^[a-zA-Z0-9_@]+$', message='This format is not allowed.')

    select = forms.ChoiceField(label='...', widget=forms.Select, choices=CHOICE)
    volume = forms.DecimalField(label='...', max_digits=7, decimal_places=2)
    account_id = forms.CharField(label='...', validators=[account_id_regex])

    def __str__(self) : 
        return self.account_id
```

Fieldクラスを使って入力フィールドを定義することで簡単にバリデーションを実装できます。

ModelFormのようにデータベースをオブジェクトとしてバリデーションに引っ掛ける機能を実装したい場合は、ORMが提供しているQuerySet APIを使ってデータベースのレコードを取得し、View側で条件分岐などを駆使してバリデートします。

```python:views.py
from .models import User
from .forms import UserForm
...
def transfer(request) :
    params = {
        'message' : '',
        'form' : UserForm(),
    }
    if (request.method == 'POST') :      
        ...
        if (form.is_valid()) :

            if User.objects.all().filter(account_id=account_id):
...
    return render(request, 'transfer.html', params)
```
ここでは、QuerySetのallメソッドとfilterメソッドを使って、レコードをモデルのインスタンスとして全件取得した後、入力値とデータベースの完全一致検索をおこなっています。

このようにDjangoは、データベースに格納されているレコードをORMを使ってオブジェクトとして扱えるので便利です。

ちなみにDjangoはRailsと同じActive Recordパターンを採用したORMを使用しています。

## ModelForm

```python:ModelForm
from django import forms
from django.core.validators import MaxValueValidator, MinValueValidator
from .models import User
from django.core.validators import RegexValidator


class UserForm(forms.ModelForm) :
    CHOICE = (
    ('DB値', '任意'),
    ...
)

    account_id_regex = RegexValidator(regex=r'^[a-zA-Z0-9_@]+$', message='This format is not allowed.')

    select = forms.ChoiceField(label='...', widget=forms.Select, choices=CHOICE)
    volume = forms.DecimalField(label='...', max_digits=7, decimal_places=2)

    class Meta : 
         model = User
         fields = ['account_id']

    def __str__(self) : 
        return self.account_id

```

```python:models.py
from django.db import models
from django.forms import ModelForm
from django.core.validators import RegexValidator

class User(models.Model):
    account_id = models.CharField(max_length=50)
    # ...その他フィールド定義
```

ModelFormの場合、モデルのメタデータをMetaクラスにデータベースアクセスに関連する情報や機能を入れることができます。Metaクラスにexclude属性やfield属性を設定することで、指定したフィールドのフォームを生成したり弾いたりすることができます。
ここでは、selectフィールドとvolumeフィールドをUserFormクラスで定義して、account_idフィールドはデータベース（Model）から引っ張ってきているイメージです。

ただ、同一テーブルから複数のレコードを検索したい場合、どうやってModelFormを使ってバリデーションを組めばいいかわからないので、これからもっと色々試していこうと思います。

また、何かご指摘や質問等あればコメントしていただけると助かります、、！


## 参照
・[モデルからフォームを生成する - Django v1.0 documentation](https://djangoproject.jp/doc/ja/1.0/topics/forms/modelforms.html)
Windowsの右クリックメニューに「VSCodeで開く」を追加する

# TL;DR

* Windowsで右クリックメニューに「VS Codeで開く(Open With Code)」を追加するには、VS Codeをインストール時に「エクスプローラーのファイル/ディレクトリコンテキストメニューに[Codeで開く]アクションを追加する」にチェックを入れて、インストールする
* すでにVS Codeをインストール済みでも、上書きインストールして、上記の手続きをすればよい
* レジストリをいじる必要はない

# 手順

もう、TL;DRで言いたいことはいったんだけど、ググったらレジストリをいじる記事しか見つからなかったので。

WindowsでVS Codeを使っていて、「いまエクスプローラで開いているフォルダをVS Codeの「フォルダを開く」で開きたい」ということがよくある。この時、右クリックメニューに「VS Codeで開く」があると便利だ。もちろんレジストリをいじれば可能なのだが、実はVS Codeを再インストールするだけでできるようになる。

既にVS Codeをインストール済みでも、上書き再インストールしてしまおう。

https://code.visualstudio.com/

に行って、「Download for Windows」をクリックしてインストールを開始しよう。

<img width="374" alt="vscode.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79744/79762277-ba71-692e-4f74-4fbeabae7495.png">

インストーラで上記のような画面がでてきたら、「エクスプローラーのファイル/コンテキストメニューに[Code で開く]アクションを追加する」にチェックを入れて、「次へ」を押してインストールすればよい。

* 「ファイル」のコンテキストメニューに追加した場合、ファイルを右クリックしてでてくるメニューの「Open with Code」を実行すると、そのファイルを開けるようになる。
* 「ディレクトリ」のコンテキストメニューに追加した場合、ディレクトリを右クリックして出てくるメニューの「Open with Code」を実行すると、そのディレクトリをVS Codeで「フォルダを開く」で開う動作になる。

すでにVS Codeを入れて、いろいろ設定している場合でも、上書きインストールで設定は消えない……と思う。自己責任でどうぞ。

インストール後、適当なファイルなりフォルダなりで右クリックして、

<img width="175" alt="menu.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79744/a64f3ac6-25b1-7147-6e03-d5cf0ab203b6.png">

上記のように「Open with Code」が表示されていれば成功。
IPアドレス

##サーバーとは
IPアドレスについて理解するには最初にサーバーについて知っておきましょう。
サーバーとは何かに特化した機能自体のことです。ネットワーク上でデータを提供している側のことを言います。

##IPアドレスとは
ネットワーク上で通信相手を間違わないようにするために使われる住所みたいなものです。

##種類について
IPアドレスにはグローバルIPアドレスとプライベートIPアドレスがあります。

__グローバルIPアドレス__ 
機器（PC等）の一台一台に、一意に割り振られる番号になります。なので、同じグローバルIPアドレスが、世界じゅうで重複して存在することはありません。
また、グローバルIPアドレスのことをWANとも呼びます。


__プライベートIPアドレス__
「ルーター」を代表として「グローバルIPアドレス」を割り当てます。なので実際インターネットと通信しているのはルーター一台になります。
そのルーターから一台一台への通信をする際にどのパソコンやスマホへレスポンスを返せば良いのか...
この問題を解決するのが「プライベートIPアドレス」になるわけです。
また、プライベートIPアドレスのことをLANとも呼びます。


##ドメインとは
ドメインとは、IPアドレスを文字列に変換したものです。「IPアドレスを文字列化する仕組み」のことをDNS（Domain Name System）と呼びます。

(https://qiita.com/drafts)

このようなURLがあった場合ドメインに当たるのは*qiita.com*の部分になります。.（ドット）の前後で「qiita」と「com」に分けられます。
「com」をトップレベルドメインと呼びます。
「qiita」をセカンドレベルドメインと呼びます。
【Rails 】content_forとyieldの使い方

#はじめに
今回はRailsにおける`content_for`と`yield`の使い方について解説します！
コンテンツを1箇所に保存し、他のビューで使えるようにするためのものです！
ぜひご覧ください:woman_tone1:

#使い方
content_forを説明する前に…
まず例として、titleを各ページで変更しない場合について確認します。以下のように`application.html`に書けば良いですね。

```application.html
<title>タイトルだよ</title>
```

そうすると以下のようにタイトルが表示されるはずです。
この場合は`application.html`に書いてあるのでどのページでもタイトルが"タイトルだよ"と表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419062/2c5e4d39-0f6d-f5c1-97c3-dfd898ae33dc.png)

しかし、作成するサイトによっては、各ページごとにタイトルを変えたい場合がありますよね。
例えば映画のレビューサイトを作成するとしたら、トップページのタイトルには"サイト名"をつけて、
各映画の詳細ページのサイトにはそれぞれの映画の名前を入れたサイト名をつける、等。

そういった場合`application.html`とそれぞれのhtmlファイルに以下のように記載します。

```application.html
<title><%= yield(:title) %></title>
```

```test.html
<% content_for(:title, 'てすと') %>
```
このように書くことで、test.htmlがブラウザに表示された際にタイトルが"てすと"に変わります。

そしてデフォルト値を設定することもできます！その場合は以下のようにします。

```application.html
<title><%= content_for?(:title) ? yield(:title) : ”でふぉると"%></title>
```
この例だと、content_forでtitleが設定されていないhtmlファイルの場合は、タイトルが"でふぉると"と表示されます。


また、複数行にわたるような内容をcontent_forを使用して表示させる場合には、以下のようにします。

```application.html
<%= yield(:infomation) %>
```

```test.html
<% content_for :information do %>
    <ul>
        <li>最新のお知らせ</li>
    </ul>
<% end %>
```
このようにcontent_forをdo-endで記述し、ブロック内に呼び出したい内容を記載すれば良いです。

#さいごに
contetn_forとyeildを使用することで特定の場所への記述がとてもわかりやすくなります。
ぜひ活用してみてください！
最後までご覧いただきありがとうございました:relaxed:
アロー関数でasync/awaitしてみた備忘録（JavaScript）

Qiitaで記事読んでてawaitいいじゃん使ってみよってなって書いたのが以下。例えばFirestoreからデータを取って来るコード。async/awaitをアロー関数で即時実行するように使うとこんな感じ。

```Javascript
(async () => {
  const querySnapshot = await db.collection('users').get()
  if (!querySnapshot.docs.length) {
    throw new Error('Empty!')
  }
  console.log(querySnapshot.docs[0].data())
})().catch(error => console.error(error))
```

このコードだと何も恩恵はないけど、非同期処理でありがちなpromise.thenがネストしちゃう時は効果バツグンだと思います。
【vue.js ver2.6】Failed to mount component: template or render function not defined.　について

#バージョン
php:7.1
laravel:5.5
Vue.js:2.6

#ハマった
初期設定を行っていたのだが、

>[Vue warn]: Failed to mount component: template or render function not defined. (found in root instance)

と表示されてなぜかマウントできない

#解決方法

*before*

```ExampleComponent.vue
Vue.component('example-component', require('./components/ExampleComponent.vue'));
```

*after*

```ExampleComponent.vue
Vue.component('example-component', require('./components/ExampleComponent.vue').default);
```

#最後に
どうして.defaultが必要なのか未だに分からない
とあるトラブルプロジェクト


当社個別事情が大半なので、当社オウンドメディアへのリンク記載のみとします。

中央システム書庫
[とあるトラブルプロジェクト](https://www.chuo-system.co.jp/csclib/index.php/2018/11/01/change-3/)

ICT業界の片隅に生息する会社のドタバタと再生の記録です。
よかったら読んで下さい。
bundle installするとMySQL系のエラーが出る

railsでbundle installした後に出たエラーです。



##エラー文

```ターミナル.
An error occurred while installing mysql2 (0.4.10), and Bundler cannot continue.
Make sure that `gem install mysql2 -v '0.4.10'` succeeds before bundling.
```

##解決方法

１、エラー文通りコマンドを打ちます。

```ターミナル.
$ gem install mysql2 -v '0.4.10'
```

２、すると次のエラーが出てきました。。。
どうやらこの「no」と書いてある部分を「yes」にしなければいけないようです。

```ターミナル.
-----
checking for mysql.h... yes
checking for errmsg.h... yes
checking for SSL_MODE_DISABLED in mysql.h... no
checking for MYSQL_OPT_SSL_ENFORCE in mysql.h... no
checking for MYSQL.net.vio in mysql.h... yes
checking for MYSQL.net.pvio in mysql.h... no
checking for MYSQL_ENABLE_CLEARTEXT_PLUGIN in mysql.h... yes
-----
```

なのでこのコマンドを打ちました。

```ターミナル.
$ bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl/lib --with-cppflags=-I/usr/local/opt/openssl/include"
```

３、そして

```ターミナル.
$ bundle install
```

４、すると今度はまた違うエラー文が出てきました。
どうやらgemfileの記述を変えなければいけないようです。

```ターミナル.
Could not verify the SSL certificate for https://rubygems.org/.
There is a chance you are experiencing a man-in-the-middle attack, but most likely your system doesn't
have the CA certificates needed for verification. For information about OpenSSL certificates, see
http://bit.ly/ruby-ssl. To connect without using SSL, edit your Gemfile sources and change 'https' to
'http'.
```

５、gemfileの上ら辺に出ている記述の「s」を消しましょう。

```Gemfile改正前.
source 'https://rubygems.org'
```

```Gemfile改正後.
source 'http://rubygems.org'
```

６、最後にまたbundle installしたらうまくいきました。
工程２に関しては理解せずに教えてもらったコマンドなのでそれぞれ調べていただくことになりそうです。
今日の学習

##やったこと
・purogeでrailsIIを行った
・rails  チュートリアル第１章、２章（２.２.３）まで
・resorceについて
・Restについて
##学んだこと
・Restとは
→RESTとは、アプリケーションを構成するコンポーネント（Userなど）を、RDBMSのCRUD（Create/Read/Update/Delete）、HTTPRequestの各メソッド（GET/POST/PUT/DELETE）に対応させて、自由に作成/読み出し/更新/削除できるもの（リソース）として扱うアーキテクチャ。
SQLite3のエラー「sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 1, and there are 34 supplied.」の解決方法

#エラー内容
```
sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 1, and there are 34 supplied.
```

#間違ったコード

```python
c.execute("insert into Ttehai values (?)",(tehai_db))
```

#正しいコード
```python
c.execute("insert into Ttehai values (?)",(tehai_db,))
```
#原因
executeの第二引数にはタプルでないといけないので、項目が1個だけでも「,」が必要になる。

#参考サイト
https://www.takasay.com/entry/2015/07/04/010000
https://techracho.bpsinc.jp/baba/2010_07_16/2130
RubyMineのgrep検索で100件以上表示させる

RubyMineでgrep検索（Find in Path検索）すると、検索結果が100件で打ち切られる
100件よりも多く検索したいときの設定について

<img width="1040" alt="limit.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332643/3302bcfb-c750-99a8-d028-1a6e613cdd95.png">

## 手順
#### Registry... を選択
IDE上で Cmd + Alt + Shift + / で出てくるウィンドウから選択する
※Windowsは Ctrl + Alt + Shift + /

<img width="1250" alt="registory.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332643/de95b3e0-0ceb-3f44-ac6c-a11b48ebf3fe.png">

#### ページサイズの設定を更新
ide.usages.page.size で検索

<img width="898" alt="スクリーンショット 2019-07-12 9.45.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332643/6dcd764d-302c-bf36-4d96-1520b9f1ec99.png">

件数を任意の数値に変更

<img width="899" alt="スクリーンショット 2019-07-12 9.45.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332643/e0f5453d-cadd-ee1d-c550-59f1868dbde2.png">

#### 完了
上限が1000件に変わった
<img width="1194" alt="result.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332643/f55e73d5-ac2f-b5c7-ceb9-bcdf90bb5831.png">

#### 補足
JetBrainsのフォーラムを見る限り他のIDEでも同じ方法で設定できそう（未検証）
Alpine Linuxコンテナでtcpdumpしてパケットキャプチャする

# 背景

下記の記事を参考にDockerコンテナでtcpdumpしようと思ったのですが、Raspberry piでやろうと思ったのでなるべく軽いAlpine Linuxをベースに変えてみました。

[A Docker Container To Capture All Traffic From Host.](https://jerrygamblin.com/2016/05/28/a-docker-container-to-capture-all-traffic-from-host/)

# Dockerfile

元記事のFROMとapt-getを変更するだけです。

```dockerfile
FROM alpine
RUN apk update && apk add tcpdump 
RUN mkdir /pcap
RUN cd /pcap
WORKDIR /pcap
CMD tcpdump -G 900 -w '%Y-%m-%d_%H:%M:%S.pcap' -W 96
```

buildしたところ。115MBだったものが6MBと物凄く軽くなりました。

```sh
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
alpine-tcpdump      latest              f454eac0b1be        8 minutes ago       5.97MB
tcpdump             latest              3687337e2f4a        24 minutes ago      115MB
```

# ビルドと実行
メモ程度にビルドと実行についても記載しておきます。
ポイントは「--net=host」で、これによってホスト側のネットワークインターフェースをdockerにアタッチしています。

```sh
sudo docker build -t alpine-tcpdump .
sudo docker run -v ~/pcap:/pcap --net=host -d alpine-tcpdump
```

上記で実行するとホスト側の~/pcapに日付付きで.pcapファイルが保存されていきます。
try ~ exceptを使ったPythonのエラーの処理

#はじめに
[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしているにのみやです。

プログラミング初心者なので、間違いも多いと思います。
間違いがあれば、ぜひ教えてください。

# 例外処理の基本: try~except
例えば0での割り算が行われるとZeroDivisionErrorという例外が発生して処理が終了する。

```python

print(1 / 0)
# ZeroDivisionError: division by zero
```

この例外に対処するには以下のように記述する。

```python

try:
    print(1 / 0)
except ZeroDivisionError:
    print('Error')
# Error
```
react nativeで強制アップデートを実装してみる


APIサーバーから強制アップデートしろとフラグを受け取った時の実装です。
アプリを開きっぱなしな場合とかもあるので、いつでもストアに飛ばせるようにcomponentDidUpdateで処理します。

```App.js
componentDidUpdate() {
  if (this.props.forceAppUpdate) {
    Alert.alert(
      `${Platform.OS === "ios" ? "AppStore" : "Google Play"}へ移動します`,
      [{ text: "OK", onPress: () => this.forceAppUpdate() }]
    );
  }
}

forceAppUpdate() {
    let urlScheme = "";
    let url = ""
    if (Platform.OS === "ios") {
      const appID = 00000000;
      urlScheme = "itms-apps://itunes.apple.com/jp/app/id" + appID + "?mt=8";
      url = "https://itunes.apple.com/jp/app/id" + appID + "?mt=8";
    } else {
      const pkgName = "<package_name>";
      urlScheme = "market://details?id=" + pkgName;
      url = "https://play.google.com/store/apps/details?id=" + pkgName;
    }

    // URLの有効性チェック
    Linking.canOpenURL(urlScheme).then(supported => {
      if (supported) {
        // ストアアプリを開く
        Linking.openURL(urlScheme);
      } else {
        // ブラウザのストアを開く(ブラウザを経由してストアアプリを開く)
        Linking.openURL(url);
      }
    });
  }
```

Linkingは外部URLまわりで使います。
使うときはreact-nativeからimportします。

なお、テストするときはシミュレータだと失敗するので実機で行う必要があります。
【Rails】 enumとは? enumを用いてselectボックスを作ってみた

##はじめに
業務の際、Railsのモデル内でよく見かける`enum`。
何となく便利そうとは思っていたものの、使い方がイマイチわかっていなかったのでまとめてみます。
##enumとは
・日本語に訳すと「列挙型」というらしい。
・DBにはint型やboolean型で登録され、数値に対応する任意のキー名を付けることができる。
・アプリケーション側のソースコードでは、付けたキー名を用いることができる。
##どんなときに使う？
特定のカラムで用いる固定値がある程度決まっている際に用いると良いそうです。
例えば、有効無効などの状態を保存しておくカラム(`status`はよく見かけます)など、選択肢の数が決まっている場合に用います。
##実際に使ってみる
今回は本のタイトル、概要、本のカテゴリーを登録するフォームを作ります。
ジャンルは`enum`を用いて登録します。
####migrationファイル作成
まずは`rails g migration create_books`でmigrationファイルを作成します。
migrationファイルの中身はこのように記載。

```201907120725_create_books.rb
class CreateBooks < ActiveRecord::Migration[5.2]
  def change
    create_table :books do |t|
      t.string :title, null: :false
      t.string :overview, null: :false
      t.integer :genre, null: :false, limit: 1

      t.timestamps
    end
  end
end
```
ジャンルは数値でDBに登録されるため、今回は`int型`です。
`rails db:migrate`でDBを作成。

####モデルにenumを書いていく
bookモデルにenumを書きます。
`enum カラム名:{付けたいキー名:対応する数値}`でenumを指定していきます。

```book.rb
class Book < ApplicationRecord
  enum genre:{
    nobel: 0, #小説
    essay: 1, #エッセイ
    practical: 2, #実用
    comic: 3, #漫画
    other: 4 #その他
  }
end
```
以上でenum指定は完了。

##enumで使用できるメソッド
#####enumで設定したキー名を用いて、book1のジャンルを登録してみる
`rails c`でコンソールを起動し、book1を作成。

```ruby
book1 = Book.create(title:'book1', overview:'sample', genre: :comic)
   (0.0ms)  begin transaction
  Book Create (0.5ms)  INSERT INTO "books" ("title", "overview", "genre", "created_at", "updated_at") VALUES (?, ?, ?, ?, ?)  [["title", "book1"], ["overview", "sample"], ["genre", 3], ["created_at", "2019-07-12 08:36:47.823960"], ["updated_at", "2019-07-12 08:36:47.823960"]]
   (0.6ms)  commit transaction
=> #<Book id: 1, title: "book1", overview: "sample", genre: "comic", created_at: "2019-07-12 08:36:47", updated_at: "2019-07-12 08:36:47">
```
ジャンルをキー名で指定することができました。数値で指定することもできますが、どの数値が何を指しているのかわからなくなりそうなのでenumの方が便利です。

#####book1のジャンルがcomicか確かめてみる

```ruby
book1.comic?
=> true
book1.nobel?
=> false
```
`.キー名?`で真偽値が返ってきます。

#####book1のジャンルを変更してみる
```ruby
book1.essay!
   (0.1ms)  begin transaction
  Book Update (11.4ms)  UPDATE "books" SET "genre" = ?, "updated_at" = ? WHERE "books"."id" = ?  [["genre", 1], ["updated_at", "2019-07-12 08:47:00.093188"], ["id", 1]]
   (0.6ms)  commit transaction
=> true
```
`.キー名!`でジャンルが変更できました。

#####book1の現在のジャンルは何か確認する
```ruby
book1.genre
=> "essay"
```
enumを設定していないカラムと同様、`.カラム名`で確認できます。

#####if文でenumを使ってみた
いくつかbookのデータを保存し、ジャンルがessayの時だけ文章を出力します。

 ```ruby
def confirm_essay
  books = Book.all
  books.each do |book|
    if book.essay? 
      puts "#{book.title}はエッセイです"
    end
  end
end
#confirm_essayを呼び出した結果
book1はエッセイです
```
条件分岐の際にもキー名をそのまま使えるのは良いですね。

##enumを用いてselectボックス作成
```register.html.erb
 <%= select :genre, :name, Book.genres.keys.to_a, include_blank: true %>
 ```
erbファイルにこのように書き、できたselectボックスはこちら。
<img width="258" alt="スクリーンショット 2019-07-12 18.54.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379815/89b559c5-a2cd-b090-13d7-371ba2d23fdc.png">
enumで設定したキー名が選択できるようになりました。
`モデル名.カラム名複数形.keys`で設定したenumを呼び出しています。

##おわりに
自分なりにenumについてまとめてみました。
初心者ですので、間違っている点等あればご指摘いただけますと幸いです。

参照元：https://ruby-rails.hatenadiary.com/entry/20150710/1436461745
mac で eps 形式の図を作成する

# 本記事の概要

mac 環境で eps ファイルを作成する方法について書いてます．
Keynote で作成した図を pdf に書き出し，
それをさらに eps 形式に変換する方法を書いています．

# 執筆時点での筆者のソフトウェア環境：

- macOS 10.14.5
- Keynote 9.1
- TeXShop 4.27

# 手順

## 図を作成して PDF に書き出す

1. Keynote (または PowerPoint などでも可) で図を作ります．
2. [ファイル]->[プリント] をクリックします (または command+P)．
3. [ページ: 選択部分] にチェックを入れます．
4. 左下のプルダウンから [PDFとして保存] を選択し，任意の場所に保存します．

<img width="873" alt="1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154200/57f7e40f-2d4a-c71f-9579-2f7bb3af868a.png">



## 作成した PDF を TeXShop で開き EPS に変換する

1. 作成した PDF ファイルを TeXShop で開きます．
<img width="562" alt="2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154200/110764a0-2fce-9bcb-7d46-ea124ca94b99.png">

2. 矩形選択モードで EPS ファイルに変換したい部分を選択し，その状態で [プレビュー]->[選択部分をファイルに保存] をクリックします．
<img width="1182" alt="3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154200/1fc50851-5e08-d9bb-baa4-5e394c69e073.png">


3. [フォーマット: EPS] を選択し，任意の場所に保存します．
<img width="1177" alt="4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154200/a4df49d6-59cb-1aa3-2afc-8776133c9ca2.png">

## 完成

選択部分だけからなる EPS ファイルが作成されました．
文字オブジェクトも選択できる状態になっているはずです．
めでたしめでたし
IE11に対応させたくても、Nuxtでbabelが働かない。エラー内容すら変わらない。

# 問題
nuxtでアプリを作っていた時に、IE11に対応する必要があった。
babelやpolyfillを噛ませればいい感じにしてくれるらしいが、package.jsonやnuxt.configにそれっぽい記述をしても、一向にbabelが働いてくれてる気がしない。

# 試したこと
- [Nuxt.jsでIE11対応のPolyfill | Hypertext Candy](https://www.hypertextcandy.com/nuxt-ie11-polyfill)
- [nuxt.js(v2)でIE11対応をする（JS編） - Qiita](https://qiita.com/amishiro/items/db37c6a56ddf7e214144)
- [レガシーブラウザと向き合うNuxt.js](https://slides.com/kengooowaki/nuxt-js/#/12)

この他にも色々試しが、エラー内容すら変わらない

# 結局
`npm run dev`じゃbabelが働かないらしい
`npm run build`して`npm run start`したら、ちゃんとbabelが働いて、IE11でも表示することができた。
ちなみにその時の設定はこれ→[レガシーブラウザと向き合うNuxt.js](https://slides.com/kengooowaki/nuxt-js/#/12)


# おまけ（babelの色々なやつが何やっているか）
ここのページをgoogle翻訳しただけ→https://www.thebasement.be/working-with-babel-7-and-webpack/

@バベル/コア
このパッケージは、その名のとおり、コアパッケージです。このパッケージは、JavaScriptコードのコンパイルと使用可能なコードの出力を担当します。デフォルトではローカルの設定が使用されますが、後で詳しく説明します。

@バベル/登録
このパッケージは、私たちのWebpack設定でjavascriptの新機能を使うことを可能にします。だから私たちが出力しようとしているコードがBabelを通して走るだけでなく、Webpackのための私達のjavascript設定ファイルもそれを通して走るでしょう。

@ babel / preset-env
どのブラウザがどのJavaScript機能をサポートしているかを知ることは、コードを変換するのに不可欠です。これはpreset-envが入ってくるところです。それはあなた自身の入力に基づいて、どんな変換が適用されるべきであるかを取り扱います。あなたはBabelに「私はこれらのブラウザのサポートが必要だ」と言っています、そしてそれはあなたの提供するリストで動くようにあなたのjavascriptを変えます。

@バベル/ポリフィル
時にはあなたがサポートしたいブラウザが特定の機能のためにもう少し特別な助けを必要とします。 @ babel / polyfillは、どのブラウザをサポートしたいかに基づいて、注目の人たちにpolyfillを提供します。

バベルローダー
私たちはWebpackを使うので、このパッケージはBabelとWebpackを使ってコードを変換することを可能にします。
jpsonicをDockerでセットアップ


自分用メモ

#準備
```
作業ディレクトリに移動後

mkdir jpsonic
cd jpsonic
mkdir -p install/target/dependency
```

https://github.com/tesshucom/jpsonic/releases 
から最新版のjpsonic.warをゲットして、install/target/dependency/にコピー。

https://github.com/tesshucom/jpsonic/tree/master/install/docker 
にあるファイル一式をinstall/にコピー

#docker-compose

```docker-compose.yml
version: '2'

services:
  web:
    build: "./install"
    restart: always
    ports:
      - 4040:4040
    volumes:
      - ./music:/jpsonic/music
      - ./playlists:/jpsonic/playlists
      - ./podcasts:/jpsonic/podcasts
      - ./data:/jpsonic/data
    environment:
      - JAVA_OPTS="-Xmx512m"
    networks:
      - test-network

networks:
  test-network:
    external: true

```


#参考URL
JpsonicをDockerで動かす
https://soryumi.liliso.com/archives/3698
あなたは起業家精神を持っていますか？

#あなたは起業家精神を持っていますか？

私たちはみんな、潜在的に『起業家精神』を持っています。
「え、そんなわけないよ、会社なんて作ったことないし」
確かに事実としては、その通りかもしれません。
ただ、私たちプログラマーの日々の業務は、実は起業家のタスク工程と非常に似通っているのです。

以下に、共通点をまとめてみますね。

##1. 創造力：Creativity

両者ともに、ゼロから新たな価値を作り上げることを仕事としています。
そして、新たな価値を創造するためには「何をすべきか？」「どうすれば達成できるか？」を繰り返し自問自答しアウトプットし続ける必要があります。
比較検討した結果、答えが一つではないこともあるかもしれません。
私たちプログラマーも、開発を行うより前に「何を作るべきか」「言語は何を使うべきか」「工数はどれくらいかかるか」など、熟考すべきことはたくさんありますよね。

##2. 整理：Organization

　やるべきことが決まれば、次は「いつまでにやるべきか」ですね。
デッドラインの期日に間に合わせるため、戦略を練る必要があるでしょう。
　戦略を練る際に、必要な観点はいくつもあります。
例えば、
・「やるべきこと」と「やらなくても良いこと」
・「考え得るリスク」と「リスクヘッジの方法」　
・「最高の結果」と「最悪の結果」
・「工数」と「実現可能な日数」
・「チーム構成人数」と「メンバー選出」
など、挙げればキリがありません。

##3. 成果：Deliverable

要件定義、施工プランが決定すればあとは実装をするだけです。
その商品のスペックがきちんと期待されるレベルに達しているか、逐一確認をしながら、しっかりと計画に沿った実装を行い、約束した期日までに商品を作り上げます。
そしてあなたは遂に、リリースの日を迎えます。
あなたが責任を持って遂行した業務の結果は、ようやくこの日、命を宿すのです。

##4. 共感：Empathy

もちろん、ここで全てが終わるわけではありません。
成果をリリースした翌日、早速、あなたはお客様に連絡をします。
なぜか。
お客様が商品を見て、触って、使ってみた正直な感想を真摯に聴かなければならないからです。
お客様はあなたの成果を厳しい目でチェックしているはずです。
あなたはお客様の感想を聴き、それを吟味しつつ、新たな提案を行います。
・もしもユーザーが200人になると、今のスペックでは満足したサービスを提供できないのではないか？
・正確な情報を取得するための時間は、ユーザーにとって適切だろうか？

あなたは、これらの観点を持ちながらお客様とミーティングを行い、質問を受け付け、相互理解を深めます。
もっともお互いにメリットがある問題解決方法を模索するのです。

◯起業家精神を構成する重要な要素、それは『CODE』

>Creativity - 創造力
>Organization - 整理
>Deliverable - 成果
>Empathy - 共感

なぜCODEかって？　

当然です。

**私たちが『プログラマー』だからです。**

これ以上、多くを語る必要はないでしょう。
私はこれから数週間で、あなたが必ず持ち合わせているはずの起業家精神をより成長させるため、最適な方法を出来るだけ詳しく説明していきます。
もしよろしければ、ぜひ私の記事を読んで、記事内で提起されるあなたへの『宿題』を遂行してみてください！
そうすれば、あなたの『CODE』は飛躍的に進化するはずです！
宿題といっても、大きな労力を要するものではありませんから安心してください。
あなたが楽しみながら短時間で遂行できるように『宿題』は作られています。

突然ですけど、これから始めての宿題です：

>この質問を自分から聞いてと教えてください：
>**私の作業で本当に起業家精神がありますか？**

さてまもなく、あなたと私の大きな挑戦が始まりますね。
まずはCODEの『C』　ー　Creativity、創造力。

よろしくお願いします！
docker networkの削除ができない

ネットワークをリプレイスするために削除を試みたところ、なかなか削除がうまくいかなかったので、色々調べたのをここに備忘録残しておきます。

```bash:
docker network rm ネットワーク名
# Error response from daemon: error while removing network: network ネットワーク名 id ~ has active endpoints
```

どうやらネットワークがまだコンテナと結びついているため削除ができないみたい。
```docker network rm```に強制削除のオプションはないので、リソース間の結びつきを調べて未使用コンテナを地道に消していくという作業をやらないといけない。


```bash
# ネットワーク検証
docker network inspect ネットワーク名

# "Containers"に書かれているコンテナを停止
docker stop コンテナ名

# network削除
docker network rm ネットワーク名

# 確認
docker network ls
```



## 参考
[docker network rmコマンドの使い方（実例付）CE対応](https://www.memotansu.jp/docker/889/)
SQLアンチパターン-11章 幻のファイル-まとめ

## 画像はどうやって保存するべきなのか考えよう
自分自身、どの程度扱われているのかは分かりませんが
画像というものは、往々にして、あるサーバー上に画像ファイルとして保存されていると思います。
それはAWSのS3であったり、単純にアプリケーションサーバー上にあったりすると思います。

しかし、そもそも画像はデータなので、バイナリデータとして表すことも可能です。
そしてその値はDBに保存することが可能ですね。

## よく使われる（であろう）ケース
画像をどこかのサーバー上に置いて保存する場合、
DBにはどのような情報が入るでしょうか。


|image_id|alt|src|
|:--:|:--:|:--:|
|1|猫の画像|`https://example.com/hogehoge_1.jpg` |
|2|犬の画像|`https://example.com/hogehoge_2.jpg` |
|3|ペンギンの画像|`https://example.com/hogehoge_3.jpg` |

このようなテーブルが用意できると思います。
画像のソースは`src`で表されますね。

## デメリット
このパターンで運用する場合、どのようなデメリットがあるでしょうか。


### ファイルを削除した時は？
ファイルを削除する際は、まずDBから該当の行を削除することになると思います。
しかし、ファイルそのものが削除される訳ではありません。
該当のファイルが削除されるようなプログラムを自前で作成する必要がありますね。

また、該当の行を削除するタイミングと、ファイル自体を削除するタイミングの間で、データの齟齬が起きる可能性もあります。


### ロールバックをした時はどうなるのか
ファイルを削除する処理があったとします。
画像ファイルを削除した後に、該当行をDBから削除しようとして、ロールバックが起きた場合はどうなるでしょう。
DBの該当行は残ったとしても、画像ファイルは削除されたままです。
そのような問題を解決するための自前の処理を作成する必要がありますね・・・。


### バックアップはどうなるのか
DBのバックアップと、画像ファイルのバックアップを同時に行えるようなツールってあるんですかね・・・。
特に優れたツールがない限りは、DBのバックアップと画像ファイルのバックアップは別軸の作業として発生すると思います。


### データへのアクセス権限
DB上でのアクセス権限と、画像ファイル自体へのアクセス権限は別々で設定する必要があります。


### ファイルの整合性
あくまでDB上の保存されているデータは画像ファイルのパスであり、
そのパスを叩くことで画像ファイルが存在しているかどうかを保証はしていません。
アプリケーション側で、画像ファイルが存在しているかどうか確認する処理が必要になります。


## このアンチパターンを利用しても良いケース
扱う画像があまりにも多く、DBに負担がかかるほどであれば、外部のサーバーなどに画像ファイルを保存して置くのが良いでしょう。


## DB上で画像ファイルを保存するメリット
- 行の削除 = 画像削除になります。更新も同様で、値の整合性が保たれます。
- ロールバックも整合性を保って行われます。
- バックアップが一回の処理で済みます。
- 権限管理もDB上だけで不備なく行えます。 



## まとめ
大体のwebサービスはこのアンチパターンを利用することにはなるのだと思います。
しかし、考えとして`画像をBLOB型でDB上に保存する`という手法も設計をする際には常に選択肢として残しておくべきでしょう。デファクトスタンダードに無意識に流されるのではなく、いつでも自分の持っている情報で判断をして、意思決定をしましょう。
pyvimが見つからないエラー


## 現象

ちょっと前からdeniteを開こうとすると下記エラーが発生するようになってしまいました。

```
[vim-hug-neovim-rpc] failed executing: pythonx import pynvim
[vim-hug-neovim-rpc] Vim(pythonx):Traceback (most recent call last):  
```

## 原因

調べた結果、vim-hug-neovim-rpcが更新され、読み込むモジュールが`neovim` -> `pynvim`となっていました。
さらに、vimコンパイル時のpythonとPCのpythonのバージョンが異なっていた模様。

```
vim : python 3.6.4
PC  : python 3.7.4
```

だから、なんど`pip3 install pynvim`しても認識されなかったようです。


## 対応
macvim-kaoriyaをやめ、macvimをインストールし直しました。

```
brew uninstall macvim-kaoriya
brew install macvim
```

vimコマンドラインで確認

```
pyx print(sys.version)
=> 3.7.4 (default, Jul  9 2019, 18:13:23) 
```

無事deniteも動くようになりました。
AWS SDK (PHP) での認証なしの S3 へのアップロード

メモです。

パブリックで誰でもアップロードできる AWS S3 バケットにアップロードしたくて、[AWS SDK for PHP のサンプル](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/UploadObjSingleOpPHP.html)に沿って、次のコードをかいたとします:

```php:upload_public_bucket.php
<?php
require 'vendor/autoload.php';

use Aws\S3\S3Client;

$s3 = new S3Client([
    'version' => 'latest',
    'region'  => 'ap-northeast-1',
]);

try {
    $s3->putObject([
        'Bucket' => 'your-public-bucket',
        'Key'    => 'test.txt',
        'Body'   => 'test',
    ]);
} catch (Exception $e) {
    echo "failed to upload:" . PHP_EOL . $e->getMessage() . PHP_EOL;
}

```

これを特に認証情報も設定してない個人の環境で実行すると、認証情報が取れなくてエラーになります (オンプレとか個人 PC とか):

> Failed to upload:
> Error retrieving credentials from the instance profile metadata server. (Error creating resource: [message] fopen(http://169.254.169.254/latest/meta-data/iam/security-credentials/): failed to open stream: Connection timed out
[file] /tmp/s3/vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php
[line] 323)

特に認証情報プロバイダを指定しないと、環境変数やインスタンスメタデータを取りに行くようになっていて、最後のインスタンスサーバーに認証情報を取りにいこうとして、取れなくてエラーになる感じですね。

> Aws\Credentials\CredentialProvider::defaultProvider はデフォルトの認証情報プロバイダです。このプロバイダは、クライアントの作成時に credentials オプションを指定しなかった場合に使用されます。このプロバイダは、環境変数、.ini ファイル (.aws/credentials ファイルから .aws/config ファイルの順)、インスタンスプロファイル (EcsCredentials から Ec2 メタデータの順) の順で認証情報のロードを試行します。 

あえて認証情報を指定せずに匿名でアクセスする場合は `credential` に `false` を与えてクライアントのインスタンスを生成すればいいです:

```php
$s3 = new S3Client([
    'version'     => 'latest',
    'region'      => 'ap-northeast-1',
    'credentials' => false,
]);
```

案外 SDK のドキュメントに載ってなくて意外と調べないとわからなかったので地味なハマりポイントです。

実際のところはバケットポリシーで IP 制限するなりする用途の想定ですね。
複数UDID登録用テキストファイルのフォーマットが変わっていた件

# TL;DR
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135304/fb41c6da-a6ce-44ac-ce91-bb19fc141d07.png)
この右側の`Choose File`で複数のUDIDをまとめて登録できるのだが、そのフォーマットが変わっており以前使っていたファイルでエラーが出た。

# Before
```
Device ID    Device Name
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    hoge
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    fuga
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    foo
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    bar
```
※カラムの区切りはスペース4つ

# After
```
Device ID	Device Name	Device Platform
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx	hoge	ios
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx	fuga	ios
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx	foo	ios
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx	bar	ios
```
※カラムの区切りはタブスペース

# 対応
- スペース4つをタブに置換
- `Device Platform` のカラムを追加
JFreeChart-複数値チャート-DefaultMultiValueCategoryDataset


目次 ⇒ [JFreeChartサンプル](https://qiita.com/artery/items/3e9c63e5c14a9e965c97)

```java
package jp.avaj.lib.chart;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import org.jfree.chart.ChartFrame;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.Plot;
import org.jfree.chart.renderer.category.ScatterRenderer;
import org.jfree.data.statistics.DefaultMultiValueCategoryDataset;

/**
■ JFreeChart-複数値チャート-DefaultMultiValueCategoryDataset
・同一キーに複数の値があるDataset.
・ScatterRendererで表示する

 */
public class Chart13_00 {
  // 目次-DefaultMultiValueCategoryDatasetを利用したチャート
  A_Chart13 a_Chart13;
  // 目次-Artery-JFreeChart用のライブラリ
  A_Chart00 a_LibChartSampeContents;

  public static void main(String[] args) {
    // 表示データの作成
    DefaultMultiValueCategoryDataset dataSet = null;
    {
      final int ROW = 3;
      final int COL = 4;
      Random ran = new Random();
      dataSet = new DefaultMultiValueCategoryDataset();
      List<Double> list;
      for (int row=0; row<ROW; row++) {
        for (int col=0; col<COL; col++) {
          list = new ArrayList<Double>();
          for (int i=0; i<3; i++) {
            list.add((double)ran.nextInt(100));
          }
          dataSet.add(list,"ROW"+row,"COL"+col);
        }
      }
    }
    // 軸の設定
    CategoryAxis xAxis = new CategoryAxis("商品");
    NumberAxis yAxis = new NumberAxis("売上");
    // レンダラの設定
    ScatterRenderer renderer = new ScatterRenderer();
    // Plotの作成
    CategoryPlot plot = new CategoryPlot(dataSet,xAxis,yAxis,renderer);
    //
    JFreeChart jfreeChart = new JFreeChart("ScatterRenderer",(Plot)plot);
    ChartFrame cFrame = new ChartFrame("ScatterRenderer",(JFreeChart)jfreeChart);
    cFrame.pack();
    cFrame.setVisible(true);
  }
}

```
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278568/306ba159-014e-7c1c-f824-61805456e9d3.png)
Vue-CLIのdev serverでoptionの--httpsが効かない時にvue.config.jsを設定

vue-cliで立ち上がる開発サーバをhttpsにしたかったのですが、方法が分からずしばらく探し回ったのでメモしておきます。
※[@dojyorin](https://qiita.com/dojyorin)さんの『[vue-cliのdev-serverをhttps化する](https://qiita.com/dojyorin/items/a0af8a8445ec179f29e5)』に記載されている方法でも解決できるかもしれませんが、また別の方法です。

## 出てたエラー
[vue-cli-service serveのドキュメント](https://cli.vuejs.org/guide/cli-service.html#vue-cli-service-serve)に書いてあった `npm run serve --https`が効かなかった。Powershellで以下を実行するとエラーが出てました。

```
> npm run serve --https
npm WARN invalid config https-proxy=true
npm WARN invalid config Must be a full url with 'http://'
```

https://qiita.com/ymaru/items/cf513ab05fe0ebac7d3b などを見て、`npm config edit`で設定を変更したり、proxyやhttps-proxy、strict-sslの設定を変更したりしたのですが、上手くいかず。

## 解決策
[vueのフォーラムでの回答](https://forum.vuejs.org/t/vue-cli-serve-with-https/39359/4)に行きつき、以下の対応でhttps化できました。
vue.config.jsを作成して以下を記述。

```
module.exports = {
  devServer: {
    https: true
  }
}
```

vue.config.jsはpackage.jsonのあるディレクトリに追加。詳細は[vue.config.jsの公式ドキュメント](https://cli.vuejs.org/config/#vue-config-js)を参照。
写真にペイントするアプリを作成してみた

#写真にペイントするアプリを作成してみた
swiftを触りたかった一つに写真に簡単なペイントが出来るアプリを作ってみたい！
でしたので今回少しずつ作ってみました。

##写真をセット
info.plistにカメラとライブラリの設定を追加

<img width="375" alt="IMG_7512.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50979/d0fe510a-61e7-f537-544f-3802e3dee4fd.png">
撮影したスクショ
撮影ボタンを押すとカメラかライブラリを選択出来ます。
真ん中の赤いラベルは現在のペンカラー
シェアボタンを押すと
<img width="375" alt="IMG_7517.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50979/d87d5e09-d362-8515-8362-02744cc34ab1.jpeg">
このようになります。

##ペイント
UIImageViewを使用してペイントしてみました。
参考にしたサイト
[【swift】簡易ペイントを作成してみた。](
https://uruly.xyz/%E3%80%90swift%E3%80%91%E7%B0%A1%E6%98%93%E3%83%9A%E3%82%A4%E3%83%B3%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F%E3%80%82/)

##写真(UIimageView)とペイント(UIImageView)を合成
バラバラのため保存しても写真だけ保存されるので、合成することに

##ペンの色を変更
<img width="375" alt="IMG_7513.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50979/8ee064cf-8ce5-b668-1ae3-fcea242017dd.png">

編集ボタンを押すと編集画面が現れます。
<img width="375" alt="IMG_7514.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50979/23c0d14a-61ba-1477-60f4-fd495d84b1de.png">
RGBのsliderを設定画面に配置。
これでペンの色が変更可能
<img width="375" alt="IMG_7515.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50979/c0702f0c-eea3-c4bd-83f9-7389018ff2ba.png">
完了ボタンで選択したペンカラーが引き継がれて編集画面でペイント出来ます。
<img width="375" alt="IMG_7516.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50979/bf38e524-d24d-5f6b-bbbf-a71d5dccb8ed.png">
真ん中のラベルが設定画面で選択した色に変わっていますね。

##最後に
何とか写真にペイントすることが出来ました。
この後も引き続きレイアウト調整など入れて
リリースしようか検討中です

まだまだswift勉強中です
勉強会とか参加してみたい><b
PHPでゼロ埋めされた数値や文字列を比較してみた

業務でゼロ埋めされた日付を比較するときに、
ゼロ埋めされた文字列や数字の比較について気になったので、いろいろ比較してみました。

#ゼロ埋された、数値同士の比較

```
var_dump(02 > 01);  // TRUE
var_dump(2  > 01);  // TRUE
var_dump(02 >  1);  // TRUE
```

#ゼロ埋めされた、文字列の数値同士の比較

```
var_dump('02' > '01');  // TRUE
var_dump('2'  > '01');  // TRUE
var_dump('02' >  '1');  // TRUE
```

#ゼロ埋めされた数値と文字列の比較

```
var_dump('02' >   01);  // TRUE
var_dump(02   > '01');  // TRUE
var_dump('2'  >   01);  // TRUE
var_dump(2    > '01');  // TRUE
var_dump('02' >    1);  // TRUE
var_dump(02   >  '1');  // TRUE
```

# まとめ

PHPってゼロ埋めされた文字列と数値も比較できるのか〜（驚き）
[Laravel]メール確認の単体テスト

[Laravel]メール確認の単体テスト
### 環境
Ubuntu 18.04(WSL)
Laravel 5.8

`VerifiesEmails`トレイトの`verify()`メソッドを`VerificationController`でオーバーライドしたので単体テストが必要になりました。

```php:Controllers/Auth/VerificationController.php
protected $redirectTo = '/';

public function verify(Request $request)
{
    if ($request->route('id') == $request->user()->getKey() && $request->user()->markEmailAsVerified()) {
        event(new Verified($request->user()));
    }
    return redirect($this->redirectPath())->with('my_status', __('Registration completed.'));
}
```

メール確認に成功するとトップページにリダイレクトして
`Registration completed.`というフラッシュメッセージを表示します。

メール確認は`/email/verify/{id}?expires=xxxxx&signature=xxxxx`にGETまたはHEADでリクエストを送ると成功します。
{id}はメール確認をするユーザーのIDです。

expiresとsignatureがついたURLをどうやって作っているかは
`/vendor/laravel/framework/src/Illuminate/Auth/Notifications.php`に書いてあります。

```php:/vendor/laravel/framework/src/Illuminate/Auth/Notifications.php
/**
 * Get the verification URL for the given notifiable.
 *
 * @param  mixed  $notifiable
 * @return string
 */
protected function verificationUrl($notifiable)
{
    return URL::temporarySignedRoute(
        'verification.verify',
        Carbon::now()->addMinutes(Config::get('auth.verification.expire', 60)),
        ['id' => $notifiable->getKey()]
    );
}
```

`URL::temporarySignedRoute()`を使えばいい事が分かりました。
第一引数はルーティングの名前、第二引数はexipiresの数字、第三引数は`email/verify/{id}`の`{id}`に入れる文字列が値に入った配列です。

#### 参考
- [temporarySignedRoute()](https://github.com/laravel/framework/blob/5.8/src/Illuminate/Routing/UrlGenerator.php#L344)
- [URL生成](https://readouble.com/laravel/5.8/ja/urls.html)

#### 単体テストのコード

```php:/tests/Unit/VerificationControllerTest.php
<?php

namespace Tests\Unit;

use Tests\TestCase;
use Illuminate\Foundation\Testing\WithFaker;
use Illuminate\Foundation\Testing\RefreshDatabase;
use App\User;
use Illuminate\Support\Carbon;

class VerificationControllerTest extends TestCase
{
    use RefreshDatabase;

    /**
     * A basic unit test example.
     *
     * @return void
     */
    public function testExample()
    {
        $user = factory(User::class)->create(
            ['email_verified_at' => null]
        );

        $response = $this->actingAs($user)
            ->get(\URL::temporarySignedRoute(
                'verification.verify', 
                Carbon::now()->addMinutes(\Config::get('auth.verification.expire', 60)), 
                ['id' => $user->id]
            ))
            ->assertRedirect('/');
    }
}
```