OmniAICreator/Qiita-1.07M huggingface dataset:
ゼロから始めるLeetCode Day27「101. Symmetric Tree」

#概要
海外ではエンジニアの面接においてコーディングテストというものが行われるらしく、多くの場合、特定の関数やクラスをお題に沿って実装するという物がメインである。

その対策としてLeetCodeなるサイトで対策を行うようだ。

早い話が本場でも行われているようなコーディングテストに耐えうるようなアルゴリズム力を鍛えるサイト。

せっかくだし人並みのアルゴリズム力くらいは持っておいた方がいいだろうということで不定期に問題を解いてその時に考えたやり方をメモ的に書いていこうかと思います。

[Leetcode](https://leetcode.com/)

[ゼロから始めるLeetCode 目次](https://qiita.com/KueharX/items/6ee2502c3b620c795b70)

前回
[ゼロから始めるLeetCode Day26「94. Binary Tree Inorder Traversal」](https://qiita.com/KueharX/items/13b85b716d185698d077)

基本的にeasyのacceptanceが高い順から解いていこうかと思います。

[Twitter](https://twitter.com/kueharx)やってます。


# 問題
[101. Symmetric Tree](https://leetcode.com/problems/symmetric-tree/)
難易度はeasy。
Top 100 Liked Questionsからの抜粋です。

問題としては二分木が与えられるので左右対称であるかを確認してください、というお題です。

```
For example, this binary tree [1,2,2,3,4,4,3] is symmetric:

    1
   / \
  2   2
 / \ / \
3  4 4  3
 

But the following [1,2,2,null,3,null,3] is not:

    1
   / \
  2   2
   \   \
   3    3
```


# 解法

```Python
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def isSymmetric(self, root: TreeNode) -> bool:
        if not root:
            return True
        return self.dfs(root,root)
    
    def dfs(self,left,right):
        if left and right:
            return left.val == right.val and self.dfs(left.left,right.right) and self.dfs(left.right,right.left)
        else:
            return left == right
# Runtime: 32 ms, faster than 71.25% of Python3 online submissions for Symmetric Tree.
# Memory Usage: 13.9 MB, less than 5.17% of Python3 online submissions for Symmetric Tree.
```

深さ優先探索で解きました。

きちんと左右対象のシンメトリーかを判定しなければならない点に注意しましょう。
あんまり書くことないですね・・・

良さげな解答があれば追記します。
rails 1対多 保存の方法 紛らわしいやつまとめ（メモ）


1対多のリレーションでも保存の方法の違いが紛らしいな

### 1番基本

- 1つ1つリレーションを作るパターン


```ruby
## リレーション

User 1 - * Post

## user.rb
has_many :posts

## post.rb
belongs_to :user

## controller

def new
  @post = Post.new

def create
  @post = Post.new(post_params)

private

def post_params

  params.require(:post).permit(:name, :body).merge(user_id: current_user.id)

## view
= form_for @post do |form|

  = form.label :title
  = form.text_field :title

  = form.label :body
  = form.text_field :body
  = form.submit '送信'

## 要点

1つ1つ userとpostの繋がりを作っていくパターン
```

## 複数一気に作るパターン

### パターン1（子要素のデータがある場合）

- xx_idsを使う

```ruby
## リレーション
User 1 - * Skill

## user.rb
has_many :skills

## skill.rb
belongs_to :user


## 子要素のデータ存在する

Skill
  id1 name: "筋トレ"
  id2 name: "イケメン"
  id3 name: "話術"

## controller

def new
  @user = User.new

private

def post_params

  params.require(:post).permit(:name, skill_ids: [])

## view

= form_for @user do |f|
  = f.label :name
  = f.text_field :name  
  = f.fields_for :skill_ids do |skill|
    = skill.collection_select :name, Skill.all, :id, :name  
  = f.submit "送信"

```



### パターン2（子要素のデータがない場合）

- accepts_nested_attributes_for使う

```ruby

## リレーション
User 1 - * Address

## user.rb
  has_many :addresses
  accepts_nested_attributes_for :addresses,allow_destroy: true
  
## address.rb
 - state
 - city
 belongs_to :user

## controller

  def new 
    @user = User.new
    @user.addresses.build

  private
  def user_params
      params.require(:user).permit(:name, addresses_attributes: [:id, :state, :city])
    end

## view
= form_for @user do |form|
  .field
    = form.label :name
    = form.text_field :name
  .fidle
    = form.fields_for :addresses do |address|
      = address.label :state
      = address.text_field :state
      = address.label :city
      = address.text_field :city
  .fidle
    = form.fields_for :addresses do |address|
      = address.label :state
      = address.text_field :state
      = address.label :city
      = address.text_field :city

```
OpenTripPlannerで異なるフィードの駅を結びつける

[OpenTripPlannerとGTFSを利用して独自の乗り換え案内を作ってみた](https://qiita.com/hiroa2/items/70770645f49d6fb18b0b)の関連記事です。
OTPをJavaライブラリとして使用して乗り換え案内サイト[欧亜大陸鉄道](https://ter.fun)を作った時のTips。
#はじめに
OSSの経路探索アプリケーションOpenTripPlanner(OTP)には、複数のGTFSファイルをフィードとして登録することができる。
このとき複数のフィードの中に同一駅を示すStopが個別に含まれていたらどうしたらいいのかという話。
#前提条件
通常OTPは、GTFSデータだけでなく地図データを登録するので、この場合駅間は徒歩移動として経路探索されるので問題ない。
また、複数のGTFSを一つに統合できるのであれば、それを読み込ませればいいので解決。
しかしながら、やんごとなき事情で複数のGTFSファイルが必要で、なおかつ地図データを登録しない場合にどうしたらいいのかというのがこの記事の内容。
要するに、かなりニッチな話ということ。
#結論
org.opentripplanner.routing.edgetype.FreeEdgeオブジェクトを使う。
OTPでは地図やGTFSの経路情報をEdgeオブジェクトの結びつきで保持しているが、この一種であるFreeEdgeは移動コストが0のエッジとみなされる。
よってこのFreeEdgeオブジェクトで２つのStopを結び付ければ、実質的に同一駅であるとみなされることになる。
## ソース

```java
// GraphオブジェクトからGraphIndexオブジェクトを取得
GraphIndex index = graph.index;

// 同一地点とみなす二つのstop情報を取得
Stop stop1 = index.stopForId.get(new FeedScopedId("nmbs", "aachen-hauptbahnhof"));
Stop stop2 = index.stopForId.get(new FeedScopedId("dr", "aachen-hauptbahnhof"));

// StopオブジェクトからVertexオブジェクトを取得
TransitStop ts1 = index.stopVertexForStop.get(stop1);
TransitStop ts2 = index.stopVertexForStop.get(stop2);

// FreeEdgeオブジェクトをインスタンス化するだけで結び付けられる
new FreeEdge(ts1, ts2);

// 反対方向も結び付けておく
new FreeEdge(ts2, ts1);
```

## 解説
StopオブジェクトはGraphオブジェクトから取得されるGraphIndexから取得できる。(詳しくは[こちら](https://qiita.com/hiroa2/items/9ac67c5ecfef1967cc0a)を参照)
EdgeオブジェクトはVertexオブジェクトを結び付けて経路を表しているのだが、StopオブジェクトはGTFSのメタデータを表すオブジェクトであり、Vertexではない。
そこで、GraphIndexのstopVertexForStopStopからStopをキーに対応するVertexオブジェクトを取得する。
これをFreeEdgeで結び付ければ完成。通常は、２つの駅間双方向で乗り換え可能となるので、逆方向もEdgeも作成しておく。
なお、FreeEdgeは、newするだけで経路として登録されるので、その後特に何もしなくてよい。
【Android Studio】「Emulator: PANIC: Cannot find AVD system path. Please define ANDROID_SDK_ROOT」の解決方法の落とし穴

## この記事を作成した動機

- ググったら、Stack Over flowの記事など、いろいろ出てきますが、簡潔な記事がなかったため。
- 解決方法に、落とし穴があったため。

## 現象

- 端末は、Windows10

- Android Studioで、「Run」>「Run 'app'」を実行すると、以下のメッセージが発生し、エミュレーターが起動しない。

```
Emulator: PANIC: Cannot find AVD system path. Please define ANDROID_SDK_ROOT
Emulator: Process finished with exit code 1
```

## 落とし穴

- デフォルトでインストールされているAVDと、自分でインストールしたAVDでは、参照する「ANDROID_SDK_ROOT」が違う。

## 解決方法

１. システム環境変数に、「ANDROID_SDK_ROOT」を設定する。

- 値は、以下の通り。

(1) デフォルトでインストールされているAVDを指定して、アプリを実行する場合

```
C:\Program Files (x86)\Android\android-sdk
```

(2) 自分でインストールしたAVDを指定して、アプリを実行する場合

```
C:\Users\<username>\AppData\Local\Android\Sdk
```

２. 【重要!!】Android Studioを再起動
３. Android Studioで、「Run」>「Run 'app'」を実行

## 最後に

- エミュレーターが起動し、対象のアプリケーションが表示されましたでしょうか？
- 参考になれば幸いです。
UnityのWebGLのPluginの機能を呼び出したら何か知らないけど404になった話

# 前置き
- Unity5系のプロジェクトを2018系に移行した際の話  
（結論Unityのverは関係なさそうだった）
- [twitterのtweetAssets](https://github.com/nir-takemi/UnityTweet)を自作してて、新しいゲームにimportしてみたが、何故かWebGLビルドでのみつぶやけなくなった（404になる）
- いくつかのゲームにimportした時は特に問題なく動作していた……
- WebGLのデバッグの仕方とか分からず絶望した

# 事象
- twitterのtweetAssetsを自作してて、新しいゲームにimportしてみたが、何故かWebGLビルドでのみつぶやけなくなった（404になる）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87713/d2e2d45d-4816-370a-c4bc-9eda82ec841e.png)
- エラー内容

```sh:error_message
Failed to load resource: the server responded with a status of 404 (Not Found)
```
  - どうにもリソースが見つからない模様。plugin呼び出しのタイミングだったので、pluginが見つからない感じ？


# 解決方法
- 正しい対処かは不明だが、plugin(.jslib)のguidを発行し直せば解消した！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87713/ed2bdcd8-32a7-1251-6dd0-b53780f874d6.png)
- 発行し直しは以下のような感じ。（.metaを削除して.metaを作り直すのはダメだった）
    - 該当plugin(.jslib)を複製
    - 複製元を削除
    - 複製したファイルを複製元の名前でリネーム
- guidを発行し直して、ビルドし直して起動して、エラーになってた部分の機能を呼び出すと直ってた！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87713/fc451577-0337-64d9-b7a7-9882b63708b6.png)

# 解決までの試行錯誤
- とりあえず `Google先生`
    - そもそも何で発生しているかが意味不明な状況。とりあえずそれっぽいキーワードでGoogle先生に聞いてみるも、良い感じのものが見つからなかった……
- `Chromeのデベロッパーツール` でlogを確認
    - そもそもデバッグのやり方が分からなかったが、Chromeで `表示 > 開発/管理 > デベロッパーツール` でデベロッパーツールを開き、ConsoleよりUnity側で出力したlogを確認することができた
- `.jslib` の出力設定
    - Inspector上でimportのsettingが確認できるが、そこは問題なかった
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87713/ac5a0326-33a9-ceaf-84d9-fbd9f23b3207.png)
- Unityのverを変えて試してみた
    - 大丈夫なprojectが今回のverよりも低い2018系だったので、そのverに合わせて実行とかビルドしてみた
    - 結果はダメだったりOKだったりと規則性がなく、よく分からない状態に……
- 試しに同じ処理を書いたpluginを追加して実行
    - 新しく追加したpluginは正常に呼び出された！
    - importし直しても結果は変わらずだった……
    - あれ、作り直せばいける？
    - 複製＆リネームで行けた！
    - そのままどんどん原因狭めていって、guidに行き着きました……

# 感想
- 慣れないplatformだと調査にも時間かかる……
マージされたAndroidManifest.xmlの内容を表示する

普段編集しているAndroidManifest.xmlがありますが、実際にapkに組み込まれるAndroidMaifest.xmlは外部ライブラリやFlavorのManifestとマージされた結果のxmlとなります。

AndroidStudioでAndroidManifest.xmlを開き、下のタブで `Merged Manifest` を選択することで、マージ結果のManifestを確認することができます。
左クリックから要素がどのManifestから来ているのか追うこともできます。
実行中のadb server/Unity組込み/Android Studio/環境変数からadbを探して実行するPowerShell関数

# はじめに

PCに複数のadbやAndroid SDKがインストールされている時に起動中のadb serverと違うバージョンのadbを実行するとadb serverが再起動してしまいます。そのため、なるべく同じバージョンのadbを実行するPowerShellの関数を作りました。

# スクリプト

PowerShellの`$profile`に以下のスクリプトを追加してadbを実行すると以下の順番でadbコマンドを探します。

1. 実行中のadb server
2. 実行中のUnityから一緒にインストールしたAndroid SDKのadb
3. Android StudioからインストールしたAndroid SDKのadb
4. 環境変数PATHのadb

```powershell
function FindAdb() {
    # find from process list
    $adbPath = Get-Process -Name "adb" -ErrorAction Ignore |
        Sort-Object Id |
        Select-Object -First 1 -ExpandProperty Path
    if ($null -ne $adbPath) {
        return $adbPath
    }

    # find from Unity in process list
    $adbPath = Get-Process -Name "Unity" -ErrorAction Ignore |
        Select-Object @{
            label="adb"
            expression={
                Join-Path (Split-Path $_.Path) "Data" "PlaybackEngines" "AndroidPlayer" "SDK" "platform-tools" "adb.exe"
            }
        } |
        Where-Object { Test-Path -Path $_.adb -PathType Leaf } |
        Select-Object -First 1 -ExpandProperty adb
    if ($null -ne $adbPath) {
        return $adbPath
    }

    # find from LOCALAPPDATA
    $adbPath = Join-Path $env:LOCALAPPDATA "Android" "Sdk" "platform-tools" "adb.exe"
    if (Test-Path -Path $adbPath -PathType Leaf) {
        return $adbPath
    }

    # find from path
    $adbPath = Get-Command -Name "adb" -CommandType Application,ExternalScript -ErrorAction Ignore |
        Select-Object -First 1 -ExpandProperty Source
    if ($null -ne $adbPath) {
        return $adbPath
    }

    # not found
    return "adb.exe"
}

function ExecAdb() {
    $adb = FindAdb
    & "$adb" $args
}
Set-Alias -Name adb -Value ExecAdb
```
コロナ対策のテレワーク成功事例紹介

## テレワーク移行3ヶ月目
弊社ではコロナ対策で3ヶ月前からテレワークに移行しました。
当初テレワークを導入すると、
__・生産性の低下__
__・意思疎通が困難__
__・モチベーション低下__
...etc
のような悪影響が起こると予想されていました。

しかし、テレワークに移行しても生産性は下がるどころか良くなり、
成功したのではないかと思うので発信してみたいと思います。

## キーアイテム

テレワークが上手く回った要因と思われるツールを紹介します。

### Discord
https://discord.com/
弊社のメンバーが推薦してくれて、__無料・高品質の音質・使い回しやすさ__を理由に導入しました。
このツールの導入が__一番効果的__だったと思います。
基本的に常に通話状態とし、話したいことがあった際に__プッシュトゥトーク__で発言する形を取っています。
~~エンジニア特有の悪態や~~生活音もプッシュトゥトークの活用でシャットアウトしてくれるのでイイ感じです。
ボリュームをメンバー単位で調整できるので、スピーカーのボリュームが自重していない人や声が小さすぎる人の調整をこっそり出来たりもします。
自宅が疑似的な職場状態となるので、良い緊張感・モチベの維持が出来ています。
ボイスチャンネルを部署や用途毎に分けているので、より職場に近い感覚を再現出来ています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285286/4daf08aa-3859-8b98-b2ce-97f1a348c678.png)

### GitLabのissue
https://about.gitlab.com/
元々バージョン管理でのみ利用しており、タスク管理はホワイトボードに付箋を貼って管理し、王道的なスクラム開発形式でした。
テレワークでは物理的なタスク管理は難しいので、GitLabのissueをタスク管理に用いるようにしました。
Trelloのようなカンバン形式で視覚的に分かりやすく、issueの機能としてissueレベルでbranchを切りやすかったりと利便性があり、
メンバー間のタスク交換も容易でお気に入りです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285286/05171231-5126-b362-57d3-567f2e7d996d.png)

## 心掛けている事

出社時より心掛けている点があります。
やはり顔が見えないので、コミュニケーション不足が否めず、話し合い決めました。

### 意識的に相槌を増やす

### ~~エンジニア特有の悪態や~~生活音が気になるのでプッシュトゥトークを活用

### 朝会夕会を通話で必ず行う

### 離席時は一言だけ報告し、必要以上に着席確認等無意味な監視はしない

### KPTを取り入れ、開発体制の見直しを毎週実施

顔が見えない分、何気ない発言で雰囲気が悪くなるので、言葉遣いもそうですが、お互いいつも以上にリスペクトし合う事を心掛けています。
結局成果がモノを言うので、お互いを必要以上に監視せず、ノビノビ仕事する事をモットーとしています。

思いつく限りですが、以上となります。

## 最後に

勿論、企業によって考え方も違うかと思いますが、弊社の開発チームでは現状この体制で成果が出ています。
コロナの影響でテレワークに移行しましたが、思いの他悪くないなと思いました。
Git Hub のリモートリポジトリに変更が更新出来ないとき

作ったアプリをリモートリポジトリにアップ出来たのはいいが、更新出来ない状況にはまってしまいました。

初歩的なこと過ぎて検索してもあまり出てこなかったので、独学で勉強中の方の参考になればと思い記事にしました。

Gitの練習でフォルダを作成し、ｔｘｔデータを更新したりしてましたが、ここにアプリデータを入れたらGit　Hubに上げられると思い

練習用フォルダにアプリデータを丸ごとコピーしてGit　Hubに上げることは出来ました、がその後いくらコード変更してadd から　commitして　pushしてもGit Hubに更新されません。

アプリのデータをコピーして入れていたので、コード変更してもコピーしたデータには当然反映されません。直接アプリフォルダで　Git　init　しましょう！
OpenTripPlannerのGraphからGTFSデータを取得する

[OpenTripPlannerとGTFSを利用して独自の乗り換え案内を作ってみた](https://qiita.com/hiroa2/items/70770645f49d6fb18b0b)の関連記事です。
OTPをJavaライブラリとして使用して乗り換え案内サイト・[欧亜大陸鉄道](https://ter.fun)を作った時のTips。
# はじめに
OpenTripPlanner(OTP)にはWebサービスがあり、その中の [IndexAPI](http://dev.opentripplanner.org/apidoc/1.0.0/resource_IndexAPI.html) を使えば、登録済みのGTFSデータを取得することができる。
ですが、アプリ内部でライブラリ的にOTP的を利用しているときはどのようにしてデータを取得すればよいのかという話。
# 結論
結論から言えば、IndexAPIのソース(org.opentripplanner.index.IndexAPI)を見れば一目同然。
それでは、身もふたもないので...。
## ソース

```java:
// GraphオブジェクトからGraphIndexオブジェクトを取得
GraphIndex index = graph.index;

// GraphIndexオブジェクトからGTFSデータを取得する
// route情報を取得
Route r = index.routeForId.get(new FeedScopedId("fid", "tokaido"));
// stop情報を取得
Stop s = index.stopForId.get(new FeedScopedId("fid", "tokyo"));
// trip情報を取得
Trip t = index.tripForId.get(new FeedScopedId("fid", "fuji1"));
```

## 解説
OTP上でGTFSの各要素を特定するためには、Feed IDとGTFS上のIDの組み合わせが必要。
複数のGTFSファイルを取り込むことができるOTPではデータ取り込み時に各GTFSファイルに一意のIDを付与するが、これがFeed ID。(詳しくは、[こちら](https://qiita.com/hiroa2/items/70770645f49d6fb18b0b)を参照)
このFeed IDとGTFS上のIDの組み合わせを表すオブジェクトがorg.opentripplanner.model.FeedScopedId。このオブジェクトを生成し、それをキーとして該当要素を検索する。
GTFSデータが格納されているのは、org.opentripplanner.routing.graph.Graphオブジェクトのindexプロパティから取得できるorg.opentripplanner.routing.graph.GraphIndexオブジェクト。
表にまとめると以下の通り。

| GTFSのファイル|対応するOTPのオブジェクト|取得できるGraphIndexのプロパティ|
|:--------|:------------|:---------|
|agency.txt|org.opentripplanner.model.Agency|agenciesForFeedId|
|stops.txt|org.opentripplanner.model.Stop|stopForId|
|routes.txt|org.opentripplanner.model.Route|routeForId|
|trips.txt|org.opentripplanner.model.Trip|tripForId|

なお、OTP 1.3以前では、GTFS関連のメタデータは、OneBusAwayの同名オブジェクトをしようしていた。パッケージは違うものの使い方は同じである。
NAS上でのTimeMachineの容量を制限する

#はじめに
NAS上にTimeMachineを設定すると、空き容量をすべて使い切ってしまうので、制限をかける。
Catalinaでバックアップファイルの拡張子が.sparsebundleから.backupbundleに変更されたので備忘録として書いておきます。

#参考サイト
[[macOS High Sierra]TimeMachineのバックアップに容量制限を設ける！](http://wfs.jp/timemachine-restriction)

#環境
macOS Catalina 10.15.4

使用したNAS
Buffalo LinkStation LS210D0201G

#手順
##1.バックアップファイルの作成
TimeMachineをNAS上に設定します。
この時点ではNASの空き容量をすべてTimeMachineが使ってしまう状態になっています。
<img width="600" alt="スクリーンショット 2020-05-03 15.43.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322618/7c7b4e27-5eaa-4c61-a8bd-9b4c76277886.png">

初回のバックアップが開始され、表示が[バックアップ中]となったらバツをクリックして、バックアップを中止する。
([バックアップを準備中]と出ている状態では中止しない。)
<img width="600" alt="スクリーンショット 2020-05-03 15.46.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322618/2e9524b2-50f0-9d9e-9358-3327bff0f195.png">
念のため、[バックアップを自動作成]のチェックを外しておきます。
Finderでバックアップ先を表示し、[Macの名前].backupbundleというファイルが作成されていればOK。


##2.ディスクユーティリティでbackupbundleのサイズを変更する
ディスクユーティリティを起動し、メニューバーの[イメージ]→[サイズ変更]を選択します。
<img width="578" alt="スクリーンショット 2020-05-03 16.08.17のコピー.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322618/4879ecbf-e60f-3159-6ff3-3b580b140d07.png">
先ほど作成した[Macの名前].backupbundleを選択する。
サイズを入力するウィンドウが表示されたら、新しく設定したい容量制限の数値を設定します。(この画面が表示されるまで少し時間がかかる場合があります)

##3. 変更内容を保護する
ディスクユーティリティでサイズ変更をしただけでは、バックアップを再度実行すると、上限が変更前の状態に戻ってしまいます。そのため、勝手に書き換えられないようにロックをかけます。

[Macの名前].backupbundleのパッケージの中身を表示させます。
<img width="607" alt="スクリーンショット 2020-05-03 17.26.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322618/0395556f-5449-0b2c-b2f6-d431a64bde25.png">
開いた後、Info.plistをロックします。(ロックができない場合は、Macを再起動してみてください)
<img width="690" alt="スクリーンショット 2020-05-03 17.37.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322618/bfa199ff-bc98-bccc-cc6f-24fbbb5d6f1f.png">


##4.再度バックアップを実行する
[バックアップを自動作成]のチェックをオンにして、初回のバックアップが完了するまで待ちます。(ディスクのアイコンの上で右クリックをするとすぐにバックアップを開始できます)
<img width="690" alt="スクリーンショット 2020-05-16 20.29.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322618/3bc94311-c89a-f901-7f68-ad271d79e950.png">

#完成
バックアップ中は表示が元の状態に戻ってしまっていますが、バックアップを実行していない間は設定した上限の表示になっています。
(バックアップを実行していない間でも表示が元の状態に戻ってしまう場合がありますが、バックアップや上限の設定に影響はありません)

<img width="432" alt="スクリーンショット 2020-05-04 9.58.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322618/596bf338-bb73-3445-4651-1e7b856cb471.png">
また、バックアップのサイズが設定した上限に達すると、古いバックアップはきちんと削除されていました。
Small pitfall when you invoke Lambda function with AWS CLI version 2

`--cli-binary-format raw-in-base64-out` is required to pass JSON string in command line.

```
aws lambda invoke --cli-binary-format raw-in-base64-out \
--function-name my-function --payload '{ "key": "value" }' response.json 
```

This change has been introduced from AWS CLI v2 globally.

https://docs.aws.amazon.com/cli/latest/userguide/cliv2-migration.html#cliv2-migration-binaryparam
rails リレーション色々


- 1対多

ツイート機能

```ruby
class User
  has_many :twees
end

class Twitter
  belongs_to user
end

## schema
users
 name:string

tweets
 body:string
 user:refrences
```



- 自己参照型

like機能

```ruby

class User < ApplicationRecord
  has_many :likers,foreign_key: "liker_id",class_name: "Like"
  has_many :likeds,foreign_key: "liked_id",class_name: "Like"
end

class Like < ApplicationRecord
  belongs_to :user, foreign_key: "liker_id", class_name: "User"
  belongs_to :user, foreign_key: "liked_id" , class_name: "User"
end

## schema
users
 name:string

likes
  liker_id:integer
  liked_id:integer
```

- 多対多 && accepted_nested_for

投稿記事とカテゴリー

```ruby
class Post
  has_many :post_categoris
  has_many :categories, through: :post_categoris
  accepts_nested_attributes_for :post_categoris, allow_destroy: true, reject_if: :all_blank
end

class Category
  has_many :post_categoris
  has_many :posts, through: :post_categoris
end

class PostCategory
  belongs_to :post 
  belongs_to :category
end

## schema
posts
- body
categoris
- name

post_categories
- post_id
- category_id

## 実装イメージ
どちらからも画面を作るときに、多対多になるのかも
=> カテゴリー主体の機能がなければ 1 - *でいいのではないか

投稿一覧機能

投稿1 カテゴリー1 カテゴリー2
投稿2 カテゴリー3 カテゴリー4

カテゴリー一覧機能

カテゴリー1 投稿数
カテゴリー2 投稿数
```

- ポリモーフィック（中々体に染み込まない）

Userが複数のタグをもつ
Postが複数のタグを持つ

```ruby
## 図
User 1 - * Tag（user.tags user.tags.first.tagable == user）
Post 1 - * Tag（post.tags post.tags.first.tagable == post）


class User
  has_many :tags ,as: :tagable
end

class Post
  has_many :tags ,as: :tagable
end


class Tag
  belongs_to :tagable, polymorphic: true
end


## schema

  "posts"
    t.string "name"
    t.string "desc"

  "tags"
    t.string "name"
    t.string "tagable_type"
    t.integer "tagable_id"

  "users"
    t.string "name"
    t.integer "age"
```
リーンスタートアップで個人開発の成功率を上げる

# 失敗してしまう個人開発

趣味の個人開発で過去にいくつものプロダクトを作ってきました。
ユーザがたくさんついて、ゆくゆくは収益化したいななどと思いながら作っていましたが、残念ながらどれも一瞬だけ少人数の人に使われるだけで、そのさきを描けずにいました。
「いいアイディアが思いついたからいきなり作り始めた」とか「顧客が不在のままとにかく作ってしまった」とかは個人開発でやりがちです。最初にアイディアや顧客について詰めていなかったために誰にも使われないで終わってしまう、というのはよくある失敗なのではないかと思っています。
趣味の開発や、技術力向上という意味ではそれでもいいのですが、あわよくばビジネスにしていきたいという思いがある時は一旦考え直す必要があるかもしれません。
誰も課題だと感じていない領域を攻めていたり、自分の解決策がユーザにとってお金を払いたいほど魅力的でない場合はユーザを定着させることはできないし、ましてや収益化も難しいでしょう。
プロダクトの成功率を上げるための方法論に**リーンスタートアップ**があります。
それを参考に実際に開発をする前にすべきことを列挙したいと思います。

# リーンスタートアップとは

リーンとは「ムダがなく効率的」という意味で、リーンスタートアップは事業家の思い込みで顧客にとって無価値な製品やサービスを開発してしまうことに伴う時間・労力・資源・情熱の**ムダをなくすための方法論**です。最低限のコストと短いサイクルで仮説の検証を繰り返しながらユーザのニーズを探り当てていくのが特徴になっています。

# プロダクトを開発する前にすべきことは？

## １、顧客を見つける

まず顧客が存在しなければ、サービスは使われません。顧客を見つけることから始めましょう。顧客がいる場所を探す必要があります。
自分たちの狙う顧客セグメントを決めて、数人で良いのでそのセグメントに属する人に**実際にコンタクトが取れる状態**にしましょう。

## ２、顧客のやらなければいけないこと(JOB)を見つける

顧客は何か**やらなければならないこと(JOB)**を持っています。そのために、何かに困っていたり、何かを欲したりするためニーズが発生するのです。
顧客のニーズは大抵は非言語状態にあるため、それを**インタビューによって探っていく**必要があります。
単刀直入に「欲しいものはありますか？」と聞いたり「私が考えているこのソリューションによってあなたは助かりますか？」という聞き方だとニーズを正しく理解できない可能性があります。
そこでインタビューでは顧客の**やらなければいけないこと(JOB)**について理解することから始めます。

- どんな課題があるか？
- 課題は重要か？なぜそう思うか？
- それによってどれだけの機会損失・コスト増加・ストレスなどの問題が起きているか？
- その課題に対して、今はどんなソリューションを使っているか
- そのソリューションは適切か？それ以外に選択肢があるか？
- 各ソリューションの満足度はどれくらいか？いいものと悪いものについて詳しく聞く

以上のような質問を行うことで、顧客が何をやらないといけなくて、どんな課題を抱えていて、現在はどんなソリューションを使っているのかがわかります。
ここから顧客の課題を解決するソリューションを考えていきます。

## ３、課題解決フィットを行う

顧客の課題を解決するソリューションを考えても、それが実際に解決できるものなのかは仮説でしかありません。
それが実際にお金を払っても使いたいとユーザに思わせなければ、課題を解決できていない可能性が高いです。
顧客に**オファー**をしたときにそれに合意をしてもらえるかどうかで判断します。
オファーは**３部構成**で提示します。最初にユーザが求めているものを**一言で提案**し、次にモックや動画などの**デモ**を見せて顧客の旅を実際に前進させることを提示し、最後に**価格モデル**を提示します。
オファーの提示をユーザーインタビューで繰り返して、実際に作る**MVP**を見定めましょう。

## ４、ビジネスモデルを描く

開発すべきサービスの方向性が決まったらビジネスモデルを描いてみます。
リーンキャンバスというフレームワークがあります
参考: https://ferret-plus.com/3175

リーンキャンバスでは次の９つの項目を埋めてビジネスモデルの全体像を把握します。

１、課題
２、顧客セグメント
３、独自の価値提案
４、ソリューション
５、チャネル(どうやってターゲットにアプローチするか)
６、収益の流れ
７、コスト構造
８、主要指標
９、圧倒的な優位性

# ５、実際に作っていく(製品市場フィット)

ここまでできてようやくサービスの開発を始めましょう！
この開発フェーズは**製品市場フィット**と呼びます。
その目的は「顧客がお金を払ってもいいと思うサービス」が**実際にお金を産むのかを実証するフェーズ**です。
とはいえ、ここで実際にお金を生み出さなければ失敗なのかというと必ずそういうわけではありません。ビジネスモデルによっては広告費やユーザが生成したコンテンツを金銭的価値に変換することもあり、これらはある程度のユーザ数がいないと金銭が発生しないものです。
そのため、他の代替した指標を利用しても構いません。例えばランディングページからの会員登録へのコンバージョン率や、ユーザの定着率などで、あなたのサービスが顧客に刺さっているかを確認できるでしょう。

ビジネスモデルの検証のために**大勢のユーザは必要ありません**。なので大規模な宣伝も必要ありません。工場の機械を新しく導入したときに、いきなりフル稼働させることはありません。最初は数件でテストをしてうまくいくことが分かってから生産量を段階的に引き上げていくやり方をとります。
Facebook は最初は全世界に公開するのではなくハーバード大学でだけでローンチしたそうです。ローンチする範囲を限定したことで製品の改善にフォーカスして、順々に使える大学を増やしていったそうです。
このように製品市場フィットのフェーズで**再現性を確認したらサービスを順次拡大していく**方法をとります。

# 最後に

今まで無邪気に、面白いものを作ればバズって大成功、などと甘く考えていた節があったため、このリーンスタートアップの方法論に出会って目から鱗が出ました。
現在、私は個人的にデザイナー1人エンジニア2人で旅行者向けのサービス[「トラベルスルー」](https://travel-thru.online)を作っていますが、こちらはどちらかというとビジネスモデルや顧客開発が甘い段階でプロダクトを作ってしまったと反省しています。
これからもう一度向き直りをして顧客の課題を見出し、ビジネスモデルの検討を一から作り直してみたいと思います。
皆さんもぜひ、参考にして楽しい個人開発をしていきましょう！
djangoのurl関数とpath関数

#プロローグ
djnagoのチュートリアルなどを勉強していると、urls.pyに出てくる関数で、urlとpath関数がある。
ネットの海はいろんな情報が出てくるので、調べていると古い情報にたくさん出くわしたりするので戸惑ったりすると思う。

#urlとpathの違い
1.1以前はdjango.conf.urls.urlという書き方一択だった。

```python
from django.contrib import admin
from django.conf.urls import url

urlpatterns = [
     url(r'^admin/', admin.site.urls)
]
```

しかし、django2.0以降にはdjango.urls.pathが追加で導入された

```python
from django.contrib import admin
from django.urls import path

urlpatterns = [
    path('admin/', admin.site.urls),
]
```

2.0以降でも、もちろんurlも使えるのだけど、個人的な理解としてはdjangoがstartprojectで自動生成するurls.pyの記述はpathだし、urlがあるのにpathがわざわざ追加されたわけなので、「2.0以降はpathを使う」という解釈で理解している。

古い記事などでurlを見かけたりするので注意である
AWSアーキテクチャー（疎結合化編）

AWSアーキテクチャーの5つの設計原則と11のベストプラクティス
具体的な説明は以下のリンクをご参考ください。
https://qiita.com/Jenny1025/items/ce55c8724daeef626201

<img width="1127" alt="スクリーンショット 2020-05-16 14.14.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457891/edab9093-6b93-cfc2-68b2-1650d7646af3.png">

##コンポーネントの疎結合化
コンポーネントの疎結合化というのは、コンポーネント間の依存関係を減らし、コンポーネントの変更や障害が発生する際に、影響を減少できるようなアーキテクチャーを作り上げることです。



|      関連するサビース 　　　　　　　|    説明   |
|:------------------|:------------------|
|             Lamba |サーバーインスタンスではなく、Lambaによるトリガー処理で連結すること。     |
|            SQS|SQSのキューイングを通信でインスタンス間関連を結ぶこと。|
|             ELB |サーバー間のトラフィック量を調整と連結をELBを起点により疎結合化を実現すること。|
|               SNS|SNSのアプリケーション間でインスタンス間関連を結ぶこと。|

## 密結合と疎結合設計のバターン比較
<img width="636" alt="スクリーンショット 2020-05-16 15.02.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457891/640938a9-17a3-cc24-92c7-e1ab57871f99.png">

## SQS
SQS: Amazon Simple Queue Service はポーリング型のフルマネーネジ型のキューサービスである。（60秒〜14日間データ保持する、ディフォルトで4日間保持可能）。
＊ポーリングとは、複数のプログラム間、一定時間内に問い合わせがあった場合（一旦中継所見たいなところでデータを貯めて）受信側がいいタイミングで通信を行う方式です。

## SNS
SNS: Amazon Simple Notification Service
フルマネージド型プッシュ型の非同期通信サービスである。

他のサービスと連携
Amazon CloudWatch:　Billing　Alertの通知
Amazon　SES:　Bounce/Complaintのフィードバックの通信
Amazon S3:　ファイルがアップロード時の通知
Amazon　Elastic Transcoder:動画変更完了/失敗時の通知

##SES
Amazon Simple Email Service
フルマネージド型Emailサービスである。

##Lambda
インフラに気にする事なくアプリケーションコードを実行できるデータ処理サービスである。

## CLI(SQS)
メモ：


```
キューの作成
aws sqs create-queue --queue-name ${SQS_NAME}

キューの確認
aws sqs list-queues --queue-name-prefix ${SQS_NAME}

メッセージ数の確認
aws sqs get-queue-attributes \
  --queue-url ${SQS_NAME} \
  --attribute-names ApproximateNumberOfMessages \
  --query 'Attributes.ApproximateNumberOfMessages' \
  --output text

キューの削除
aws sqs delete-queue --queue-url ${SQS_NAME}
```
Railsの基礎知識の備忘録

個人的に忘れやすいことをメモ的な意味で書きます。

# ActiveRecordクラス
テーブルから情報を取得するため位必要なメソッドを兼ね備えたクラス。
メソッド一例

# メソッド　用途
●全てのデータを取得する
使用例)postテーブルに保存されているデータの全てを取得して@postsにインスタンス変数し、ビューファイルに使用できるようになる。
```@post = Posts.all```
↓複数のデータを表示しようとするとエラーが出る。
```<h1>トップページ</h1>
<%= @posts.content %>
<%= @posts.created_at %>```
↓eachメソッドを使って順番に処理させることで解決。
```<h1>トップページ</h1>
<% @posts.each do |post| %>
  <%= post.content %>
  <%= post.created_at %>
<% end %>```

●テーブルのレコードの内、ある一つのデータを取得する
使用例)1番目のレコードのみ取得
```@post = Post.find(1)```

●クラスのインスタンス(レコード)を生成する
```post.new```

●クラスのインスタンス(レコード)を保存する
```post.save```

#ヘルパーメソッド
ViewでHTMLタグを出現させたりテキストを加工するために予めソッドが用意されている。

●投稿ページなどにおけるフォームの実装
```<%= form_tag('/posts', method: :post) do %> 
  <input type="text" name="content"> 
  <input type="submit" value="投稿する"> 
<% end %>```

●その他のパーツ
type="text" 1行テキストボックス
type="password" パスワード入力ボックス
type="checkbox" 複数選択可
type="radio" ラジオボタン(一つだけ選択)
type="submit" 送信ボタン

●リンクの実装
aタグの代わりに使用できる、リンクを仕込むためのヘルパーメソッド
```<%= link_to '新規投稿', '/posts/new' %>```

# ストロングパラメーターとプライベートメソッド

Railsではセキュリティ上の概念などから、ストロングパラメーターという技術を用いてデータを保存する。

●ストロングパラメーターとは
指定したキーを持つパラメーターのみを受け取るようにするもの。以下に記述することで特定のキーしか受け取れないようにする仕組みを構築する。
```def post_params
  params.permit(:キー名, :キー名)  # 受け取りたいキーを指定する
end```

●プライベートメソッド
クラス外から呼び出すことのできないメソッドで、ストロングパラメーターを記述したメソッドはprivate以下に記載して、プライベートメソッドとして扱う。
```private
  def post_params
    params.permit(:content)
  end```

★プライベートメソッドのメリット
# 1.classの外部から呼ばれたら困るメソッドの隔離
メソッドの中には、classの外部から呼び出されてしまうとエラーを起こすメソッドも存在します。そのような事態を事前に防ぐ事ができる。
#2.可読性
classの外部から呼び出されるメソッドを探すときに、private以下の部分は目を通さなくて良くなります。また、繰り返し使用するメソッドもprivate以下に集約する事で、コードをシンプルにできる。
アジアの人口とマルサスモデル

## 目的

目的は曖昧なのですが(おい、^^;)、今、ウィルス増加のモデルで使われているモデルを調べようと思い、基礎となる考え方を調べています。
多分、その最も基礎になるのは指数関数的に増える人口のモデルかな、と思い、書いてみようと思いました。株価のモデルにもつながるかな。

## マルサスモデル

ある時刻 t の人口 $y(t)$ (単位:人) は個体増加速度（マルサス係数） $\lambda $　(単位：時間$^{-1}$ <== 注意!!) により

```math
 \frac{d}{dt} y(t) = \lambda y(t)
```

と書けます。このようにマルサス係数を定義する、と言っても良いと思います。増加率は時間変化するのですが、一定とみなすと、初期条件(ある時刻の人口）をもとに任意の時刻の人口を解析的に計算できます。例えば、時刻 $t_n$ の人口が分かっている場合、増加率を$\lambda$とすると$t_{n+1}$の人口は、経過時間を $\Delta t = t_{n+1} - t_n$とおくと

```math
 y(t_{n+1}) = y(t_n) \exp( \lambda \Delta t) \approx y(t_n) + \lambda \Delta t y(t_n)
```

のように書けます。という書き方は自分流で、普通はもっと素直(?)に

```math
  y_{n+1} = (1 + r) y_n
```
のように書くようです。r は人口増加率で無次元量です。解析的には $r = \exp(\lambda \Delta t) - 1$ に対応しています。

## アジアの人口

実際の人口の変化がこの通りか、というと、そんなことは全然ありません。が、比較的これにちかいかなと思うのを適当に持ってきました。データは国連のサイトの[Download Data Files](https://population.un.org/wpp/) にあるエクセルファイルをダウンロードしました。

人口増加率を一年ごとの人口増加から簡単に年間人口増加率(annual population growth ratio) $r_n = \frac{y(t_n) - y(t_{n-1})}{y(t_{n-1})}$としてプロットしてみました。r は単位時間当たりの量なので、ここでは年間で計算しています。

![asia_population2020.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294040/c47d69e4-7c2f-b98e-8997-87b57ded17c1.png)

人口は２憶人から１３億人に増加していますが、その間の人口増加率は2% 台ですね。地域別や国際情勢など分析はいくらでもできるでしょうが、ざっくりと説明に使えそうな気もします。

### シミュレーション

というのは大げさなのですが、そう呼ばれるみたいなので。今後10年の年間人口増加率をr=2.5 %　として人口を計算すると、以下のようになりました。


![sim_asia_population2020.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294040/17a4c477-0f8b-e399-5b91-89af68cc4a95.png)

1970年より前は実際の増加率より低く、70年から90年台半ばまでは2.5% よりも高いので、実際の人口とシミュレーションでは差が出てきています。

2030年にはアジアの人口は16億人を越すと。専門家の予測と比較してみたいところです。おそらく、人口増加率は減少し、これほどは増加しないのではないでしょうか。
おまけに年間人口増加率 r = 2.0% として1950年から計算した例もありますが、かなり異なりますね。

### おわり

どこかでお話できる機会があると良いのですが。おじさんの自己満足ですが、用語の誤りでもコメントやご指摘いただけると幸いです。

この後、時間があれば
- ロジスティックモデル
- SIR モデル
というものも計算＋実装してみたいものです。

(2020/05/16)
【salesforce】Apexで項目レベルセキュリティを実装

with sharing キーワードでは共有ルールのみ適用される、
オブジェクトレベルセキュリティと項目レベルセキュリティ (FLS のように省略されていることが多い) を自分で実装する必要があります。
以下の項目レベルセキュリティの実装例となります。
（Lightning componentのコントローラ実装例となっていますが、APEXとしては汎用的に利用可能）

    @AuraEnabled
    public static List<Expense__c> getExpenses() {
        
        // Check to make sure all fields are accessible to this user
        String[] fieldsToCheck = new String[] {
            'Id', 'Name', 'Amount__c', 'Client__c', 'Date__c', 
            'Reimbursed__c', 'CreatedDate'
        };
        
        Map<String,Schema.SObjectField> fieldDescribeTokens = 
            Schema.SObjectType.Expense__c.fields.getMap();
        
        for(String field : fieldsToCheck) {
            if( ! fieldDescribeTokens.get(field).getDescribe().isAccessible()) {
                throw new System.NoAccessException();
            }
        }
        
        // OK, they're cool, let 'em through
        return [SELECT Id, Name, Amount__c, Client__c, Date__c, 
                       Reimbursed__c, CreatedDate 
                FROM Expense__c];
    }
基底クラスのgetterプロパティに派生クラスでsetterとdeleterを追加する場合の注意点


次の例は、基底クラス`Foo`のgetterプロパティ`x`に派生クラスでsetterを追加する方法です。

```python

class Foo:
    
    def __init__(self):
        self._x = "I'm Foo.x"
    
    @property
    def x(self):
        return self._x
    
class Bar(Foo):
  
    @Foo.x.setter
    def x(self, value):
        self._x = value 
```

実行すると、次のようになります。

```
>>> b = Bar()

>>> b.x
"I'm Foo.x"

>>> b.x = "I'm Bar.x"

>>> b.x
"I'm Bar.x"
```

さらに、deleterを追加する場合は、次のように書きます。

```python
class Foo:
    
    def __init__(self):
        self._x = "I'm Foo.x"
    
    @property
    def x(self):
        return self._x
    
    
class Bar(Foo):

    @Foo.x.setter
    def x(self, value):
        self._x = value 
        
    @x.deleter
    def x(self):
        self._x = "Nothing"
```
実行すると下記のようになります。

```
>>> b = Bar()

>>> b.x
"I'm Foo.x"

>>> b.x = "I'm Bar.x"

>>> b.x
"I'm Bar.x"

>>> del b.x
'Nothing'
```

最後のデコレータは、`@Foo.x.deleter`ではなく、`@x.deleter`である点が注意です。
`@Foo.x.deleter`とすると、setterが無いプロパティが生成されてしまいます。その理由は以下です。

setterのデコレータにある`Foo.x`は、`property`オブジェクトです。`Foo.x`は、getterしか持っていません。
`property`オブジェクトの`setter`メソッドは、引数の関数をsetterに追加した新たな`property`オブジェクトを返します。つまり、`Bar`の`@Foo.x.setter`デコレータで始まる定義で、`Bar.x`にはgetterとsetterを持つ`property`オブジェクトが生成され`Bar.x`に代入されています。


`property`オブジェクトの、`deleter`メソッドは、引数の関数をdeleterに追加した新たな`property`オブジェクトを返します。`@Foo.x.setter`デコレータで始まる定義で、`Bar.x`にはgetterとsetterを持つ`property`オブジェクトが生成され代入されているので、`@x.deleter`とすると、getterとsetterに加え、deleterが追加されます。(`@Foo.x.deleter`とするとsetterを持たない`Foo.x`から新しいプロパティオブジェクトを生成することになるので、`@Foo.x.setter`で作成したsetterを持つプロパティオブジェクトを上書きしてしまいます。)


(setterとdeleterの定義の順番が逆の場合、逆に`@Foo.x.deleter`と`@x.setter`とする必要があります。)

**参考**
* https://docs.python.org/3/glossary.html#term-descriptor
* https://stackoverflow.com/questions/15785982/python-overriding-getter-without-setter
* https://qiita.com/fumitoh/items/990a31decc53cc9efbcf
【vue】v-forでセレクトボックスに指定回数の表示と、10ずつの繰り返し処理

## `v-for`で1から10までの表示方法

この方法で1から10までが表示されます

```
<template>
  <div id="app">
    <ul v-for="n in 10" :key="n">
      <li>{{ n }}</li>
    </ul>
  </div>
</template>
```
**結果**
<img width="83" alt="スクリーンショット 2020-05-16 21.13.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472696/6ce35a35-46b0-b9dc-a2cc-37bbc559eb5c.png">

### `v-for`で10ずつ処理する方法

通常のfor文の場合だと、このように増やしていきます

```
    for (int i = 0; i < 10; i+10){
      sum += 2;
    }
```

しかし、vueの場合だと`i+10`のやり方ではうまくいかず
どのように10ずつ増やすのかがわからなかったです。

<br>
<br>
<br>
解決方法は本当に簡単で、この方法で10ずつ表示ができます

```
<template>
  <div id="app">
    <ul v-for="n in 10" :key="n">
      <li>{{ n * 10 }}</li>
    </ul>
  </div>
</template>
```
**結果**
<img width="75" alt="スクリーンショット 2020-05-16 21.23.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472696/d67ad8a0-ba0d-82e9-db50-c487286186ca.png">

### セレクトボックスで10ずつ表示する方法
さて、自分が対処方法をみつけるのに時間がかかってしまったのがセレクトボックスに10ずつ表示させる方法でした。
`{{ n * 10 }}`の方法を考えれば簡単なのですが、
どこに`i+10`の要素を書けばいいのかに固執してしまっていました。

セレクトボックスで10ずつ表示させる方法も本当に簡単でこのようにやります

```
<template slot-scope="hoge">
   <el-select 
      v-model="hoge" 
      placeholder="Select">
      <el-option 
        v-for="n in 10"
        :key="n"
        :value="n * 10">
      </el-option>
   </el-select>
</template>
```
 **結果**
<img width="120" alt="スクリーンショット 2020-05-16 21.59.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472696/0ccea62e-4415-7faa-fb4a-e57ec0bdea5d.png">


`:value`のところに同じようにかけばいいんですね。
`v-for`にかいたり `key`の部分に`i+10`の要素を入れようとしてまったくうまくいっていなかったです。

通常のfor文のやり方につられてしまい、ずっと`+`を使用して対処しようとしていたのもよくなかったです。


### 0から始める方法
ちなみに0から始める方法はこのようにやります

```
<template>
  <div id="app">
    <ul 
      v-for="n in 10" :key="n">
      <li>{{ (n - 1)  * 10 }}</li>
    </ul>
  </div>
</template>
```
**結果**
<img width="75" alt="スクリーンショット 2020-05-16 21.27.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472696/628ee8c8-d9f3-1cff-7214-6df622a33bfe.png">


### 参考記事
[v-forで配列を指定の回数だけループさせて出力させる](https://designsupply-web.com/knowledgeside/4827/)
pandas_datareaderインストール時のエラー

#1.この記事について

米国株式の実データを取得するPythonライブラリ「pandasa_datareader」をインストールすると下記のエラーが出力された。

```console:
root@2a1627805ea9:/home# pip3 install pandas_datareader
(途中略)

    src/lxml/includes/etree_defs.h:14:10: fatal error: libxml/xmlversion.h: No such file or directory
     #include "libxml/xmlversion.h"
              ^~~~~~~~~~~~~~~~~~~~~
    compilation terminated.
    Compile failed: command 'arm-linux-gnueabihf-gcc' failed with exit status 1
    cc -I/usr/include/libxml2 -c /tmp/xmlXPathInit_w7iprr1.c -o tmp/xmlXPathInit_w7iprr1.o
    /tmp/xmlXPathInit_w7iprr1.c:2:1: warning: return type defaults to 'int' [-Wimplicit-int]
     main (int argc, char **argv) {
     ^~~~
    cc tmp/xmlXPathInit_w7iprr1.o -lxml2 -o a.out
    error: command 'arm-linux-gnueabihf-gcc' failed with exit status 1

    ----------------------------------------
Command "/usr/bin/python3 -u -c "import setuptools, tokenize;__file__='/tmp/pip-build-6l7hbylz/lxml/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record /tmp/pip-ex8h4yqx-record/install-record.txt --single-version-externally-managed --compile" failed with error code 1 in /tmp/pip-build-6l7hbylz/lxml/



In file included from src/lxml/etree.c:692:0:
    src/lxml/includes/etree_defs.h:14:10: fatal error: libxml/xmlversion.h: No such file or directory
     #include "libxml/xmlversion.h"
              ^~~~~~~~~~~~~~~~~~~~~
    compilation terminated.
    Compile failed: command 'arm-linux-gnueabihf-gcc' failed with exit status 1
    cc -I/usr/include/libxml2 -c /tmp/xmlXPathInitnltnxexy.c -o tmp/xmlXPathInitnltnxexy.o
    /tmp/xmlXPathInitnltnxexy.c:1:10: fatal error: libxml/xpath.h: No such file or directory
     #include "libxml/xpath.h"
              ^~~~~~~~~~~~~~~~
    compilation terminated.
    *********************************************************************************
    Could not find function xmlCheckVersion in library libxml2. Is libxml2 installed?
    *********************************************************************************
    error: command 'arm-linux-gnueabihf-gcc' failed with exit status 1


```

対策
libxml2-dev libxslt1-devをインストールする。
libxml2-dev libxslt1-devインストール後、pandas_datareaderが無事にインストールできました。

```console:
root@2a1627805ea9:/home# apt-get install libxml2-dev libxslt1-dev
```
Generative Design with p5.js を読んでいく-vertex()-

#買っちった
![スクリーンショット 2020-05-15 20.48.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637821/053bd550-4342-a504-ccf4-62877c90e932.png)
*http://www.bnn.co.jp/books/9296/*より
![スクリーンショット 2020-05-15 20.46.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637821/8847a213-5418-522b-62ce-0e5c5239a700.png)
*http://www.bnn.co.jp/support/generativedesign_p5js/*より

この本やべえよ。美術の教科書の、授業ではやらないけどなんかスゲーのが載ってるページを永遠に見ているような興奮がある。

###Generative Designとは
>ここでは主にプログラムを打ち込んでコンピュータに絵を描かせる試み

###p5.jsとは
>1. Processingという描画ソフトを
>2. JavaScriptという言語を使って動かせるようにしたもの

〜以下覚え書き〜

##vertex(x座標,y座標)
**vertex**
<意味> **頂点**　最高点　頂上　

```javascript:qiita.js
  beginShape();
  
  vertex(100,100);//1
  vertex(100,200);//2
  vertex(200,200);//3
  
  endShape();
```
`draw()` 関数内で上のように書くと
![スクリーンショット 2020-05-15 21.35.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637821/8dccb407-b872-ab7a-3f24-f163f8ebacfb.png)
こうなる。　*注)数字は描画されません*

##コードの意味
```javascript:qiita.js
  beginShape();
  
  vertex(100,100);//1
  vertex(100,200);//2
  vertex(200,200);//3
  
  endShape();
```
- `vertex()`は`ellipse()`や`rect()`などといった特定の形状にとらわれず、**自由に**図形を描きたいときに使う。

- `vertex(x座標,y座標)`はその名の通り**頂点**の座標を表し、それらが繋がれることで図形を成す。

- `beginShape();`〜`endShape();`までの間は自由描画モード[^1] が発動しており、
`vertex()`は**その中でのみ**使うことができる。

###どう繋ごう
頂点の座標が定っても、それらの繋ぎ方は一通りではない。
繋ぎ方のルールは`beginShape(),endShape()`の引数として渡すことができる。

簡単なまとめ↓
![Frame 7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637821/63600cc9-4cb1-504f-a872-c5d16726057e.png)
![Frame 1 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637821/84902dee-bd9a-d0f1-333b-9a3492d4746d.png)
他にも`beginShape(QUADS,QUAD_SPRIT)`などがあるが
三角形→四角形になっただけで概念は一緒。
##作例
こんなのどうよ

https://www.openprocessing.org/sketch/897830
![vertex.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637821/4ef3bd93-3ec5-6497-9919-fbcb491a46f7.gif)
マウスのX座標：波の間隔
マウスのY座標：波の高さ
1~7のキーが押された時、それぞれに対応した繋ぎ方のルールに変更

##参考文献
[Generative Design with p5.js](http://www.bnn.co.jp/books/9296/)

p5.jsの公式リファレンス(日本語非対応[^2] )
↓↓↓
https://p5js.org/ 


[^1]: 名付けました。
[^2]: イキりポイント
【Swift】UIButtonにimageをセットしたが表示されない件

## UIButtonにsetImage()したけど画像の色が違う
UIButtonを画像にしたい＋`.normal`と`.selected`で画像を切り替えたいと思った時に躓きました。

##### ● 実装（Rx使ってます）

```swift
private func setButton() {
    button.setImage(R.image.grayCat(), for: .normal)
    button.setImage(R.image.purpleCat(), for: .selected)
    button.rx.tap.bind(to: buttonTapBinder).disposed(by: disposeBag)
}
    
private var buttonTapBinder: Binder<()> {
    return Binder(self) { base, _  in
    base.button.isSelected = !base.button.isSelected
    }
}
```

##### ● 使った画像
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305854/0df3b720-6db7-91c2-4225-038b3ef61adb.png" width=5%> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305854/0dbd7694-9f2e-30d7-2e47-73bc5876e68b.png" width=5%>

##### 実行画面
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305854/d80ff9e7-44f4-af76-f635-7bfd209a0734.png" width=20%> 

ボタンタップしたレイアウトもちがーーーーーーーーーーーう！！！！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305854/fca23e5b-333a-2f6d-c768-62670c657382.png" width=20%> 

### 解決策
私は普段`.xib`ファイルで部品の配置とAutlayoutの設定をしているのですが、その際の`ButtonType`が原因でした。
<img width="260" alt="スクリーンショット 2020-05-16 21.23.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305854/cbdc36c8-c065-e72f-9b56-dc197aba8c60.png">
これを`Custom`にすれば解決です！

この`ButtonType`は`get-only`なのでコードからは変更できません。
ちなみにレイアウト系もコードで実装している場合は、初期値が`Custom`なので特に問題はないです。
Javaのif文とswich文

###条件分岐
特定の状況のときだけある処理を行うです。
OOだったらXXするみたいな感じです。
例えば、天気予報が雨だったら傘を持っていくということです。
if文の場合

```Main.java
  if (条件式) {
   処理;
}
```
さっきの例に当てはめると

```Main.java
if (天気予報 == 雨) {
   傘を持っていく;
}
```
となります。
if文を数字に当てはめます。
true(正しい)の場合

```Main.java
int x = 10;
  if (x == 10){
    System.out.println("xは１０");
  }
```
上記の場合だと(x == 10)の条件分岐がtrueになるため、コンソールは**xは10**と表示されます。
false(間違い)の場合

```Main.java
int x = 20;
  if (x == 10){
    System.out.println("xは１０");
  }
```
上記の場合だと(x == 10)の条件分岐がfalseになるため、コンソールはなにも表示されません。
####else
if文のelseは「もし〜ならOO、そうでなければXX」という条件分岐ができるようになります。

```Main.java
int x = 10;
   if (x < 20){
     System.out.println("xは2０より小さい");
   } else {
     System.out.println("xは2０より大きい");
   }
```
上記の場合だと結果は**xは2０より小さい**と表示されます。

```Main.java
int x = 30;
   if (x < 20){
     System.out.println("xは2０より小さい");
   } else {
     System.out.println("xは2０より大きい");
   }
```
上記の場合だと結果は**xは2０より大きい**と表示されます。
####else if
ifとelse if、elseを組み合わせると、「もし〜なら◯◯、そうではなくてもし××なら△△、どちらでもない場合は□□」という条件分岐ができます。

```Main.java
int x = 25;
   if (x < 30){
     System.out.println("xは3０より大きい");
   } else if {
     System.out.println("xは2０より大きく、30より小さい");
   } else {
     System.out.println("xは2０より小さい");
  
```
上記の場合だと結果は**xは2０より大きく、30より小さい**と表示されます。
ひとつ注意することは複数の条件に合致しても、実行されるのは最初に合致した条件にのみになることです。
###swich文
条件分岐にはswitch文という構文もあります。
switch文は条件の値がcaseの値と一致するときに処理が実行されます。

```Main.java
swich(条件の値) {
  case 値1:
    処理;
    break;
  case 値2:
    処理;
    break;
  case 値3:
    処理;
    break;
}
```
上記のように記述します。caseの後ろはコロン（:）です。
break;はswitch文を終了する命令です。break;がないと、合致したcaseの処理を行った後、その次のcaseの処理も実行してしまいます。
実際のコードの例

```Main.java
int x=10
swich(x % 2) {
  case 0:
    System.out.println("偶数")
    break;
  case 1:
    System.out.println("奇数")
    break;
}
```
上記の例だと**偶数**が実行されます。
####default
どのcaseとも一致しなかったときに実行する処理を、defaultを用います。
【例】

```Main.java
swich(rank) {
  case 1:
    System.out.println("1位")
    break;
  case 2:
    System.out.println("2位")
    break;
  case 2:
    System.out.println("3位")
    break;
  default:
    System.out.println("4位以下")
    break;
}
```
上記の場合だと4位以下であれば、defaultが実行されます。
SpacemacsのMetalsで画面端に爆誕するtree-viewを止めたい

SpacemacsでScalaを書く時にlsp-metalsを使う。

画面の左端に何かが爆誕し続ける。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201962/c30f1ba2-e53c-e0c0-05fa-1ac3c66ca845.png)


いらないのにバッファを隠しても頻繁に爆誕し続け度々 `error running timer lsp-metals-treeview--buffer-changed`を吐かせてSpacemacsを撃沈する。しんどい :innocent: 

単純にlspの設定項目を見ているだけではわからなかったが、どうやら関連する設定は `lsp-metals-treeview-show-when-views-received`のようだ。user-config()内で直接オフにすると出なくなった :tada: 

```emacs-lisp:.spacemacs
(defun dotspacemacs/user-config ()

  ;;; lsp

  (setq-default lsp-metals-treeview-show-when-views-received nil)

)
```

あのバッファにも何か便利はあるのだと思うが、裏で勝手に色々やってくれているだけで十分便利だったので完
Effective Java 第2版 関連事項調査まとめ

# はじめに
<!-- 発端や概要を記載 -->
新人のころ[Effective Java 第2版](https://www.amazon.co.jp/EFFECTIVE-JAVA-Java-Joshua-Bloch/dp/4621066056)を購入したが2～3年積んだまま放置してしまった。
読み返してみると案外今でも知らなかったりふわっとしてて人に説明できない関連事項が結構多かったため、恥を忍んでこの記事に調査内容をまとめていく。
Javaの本であるが、本記事の筆者は現在C#を現場で使っているため、もしC#に同等の内容が存在すれば、C#の内容を記載することもある。
また、このシリーズは、Effective Javaの本筋を追うものではなく、理解の障壁となりうる関連事項の調査をまとめたものである。
Effective Javaの内容そのものに関しては、すでに先人たちの努力によって多様なサマリーがあちこち落ちているので参照されたし。

なお、本書は2020年5月現在[第3版](https://www.amazon.co.jp/Effective-Java-%E7%AC%AC3%E7%89%88-Joshua-Bloch/dp/4621303252)がすでに出版されているので、最新のEffective Javaが知りたい方はそちらを参照すること。
＃Lambda式とかtry-with-resource文とか追加されたらしい

# 目次
<!-- タイトルとアンカー名を編集 -->
- **第1章は「はじめに」のため省略**
- [第2章　オブジェクトの生成と消滅](#Chapter2)


<!-- 各チャプター -->
<a id="#Chapter2"></a>
# 第2章　オブジェクトの生成と消滅
- [インスタンス制御とは？](https://qiita.com/tkrtmy1031/items/7234ca99e2dc1012bfca)
インスタンス制御とは？

# はじめに
<!-- 発端や概要を記載 -->
Effective Java 第2版 P6に出てくる下記の内容について深堀する。

>static ファクトリーメソッドが、何度呼び出されても同じオブジェクトを返すことができることは、ある時点でどのようなインスタンスが存在するかを厳密に制御するのにも使用できます。この制御をおこなうクラスは **インスタンス制御されている** (instance-controlled)と言われます。

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [結局どんな状態？](#whatIsThis)
1. [具体例は？](#forExample)
1. [C#ではEnumでシングルトン作れないの？](#CSEnum)
1. [参考文献](#reference)

<!-- 各チャプター -->
<a id="#whatIsThis"></a>
# 結局どんな状態？

- 実行環境が、あるクラスのインスタンス数を制限している状態
 - 1個の場合もあるし、複数個の場合もあるが、**「このクラスのインスタンスはn個以上存在することはありません！！」**というのを保証している状態
- 同じインスタンスが1つだけしか存在しない
 - インスタンスが同じ(`a == b`)であれば、インスタンスの内容も同一(`a.equal(b)`)ということ
  - 上記の性質により、値比較の際`equal(Object)`の代わりに`==`演算子による比較が可能

<a id="#forExample"></a>
# 具体例は？
## シングルトン
インスタンスが**1個**であることが保証されているクラス。

下記はJavaでの記述例

```java:Singleton.cs
// Enumで実装したパターン
// sealedで継承不可クラスになる
public class SingletonClass
{
    // 外部から変更できないようにする
    private static final SingletonClass INSTANCE = new SingletonClass();

    // 外部から生成できないようにする
    private SingletonClass() { //初期化処理　};

    // インスタンス取得
    public static SingletonClass GetInstance() {return INSTANCE;}

}
```

下記はC#での記述例

```c#:Singleton.cs
// Singletonパターン
public class SingletonClass
{
    // 外部から変更できないようにする
    private static SingletonClass _singleInstance = new SingletonClass();

    // インスタンス取得
    public static SingletonClass GetInstance(){ return _singleInstance; }

    // 外部から生成できないようにする
    private SingletonClass(){ 
        //初期化処理 
    }
}
```



## Enum
インスタンスが**n個**であることが保証されているクラス。<font color="Red"> **※追記：Javaのみ** </font>

```java:Enum.java
enum Season
{
    Spring,
    Summer,
    Autumn,
    Winter
}
```

<font color="Red">追記：ただし、C#のEnumはインスタンスがn個であることが保証されて **いない。**
クラスとして実装されているJavaと違って、C#のEnumはCの列挙型のように、名前付きの整数に過ぎないので、Javaと同様の保証はされない。
詳細はコメント欄を参照。
</font>


<a id="#CSEnum"></a>
# C#ではEnumでシングルトン作れないの？
蛇足だが気になったので調査する。
Javaでは下記のようにしてEnumを使用してシングルトンを実装することができる。

```java:EnumSingleton.java

public enum Singleton {
    INSTANCE;

    public void execute (String arg) {
        // インスタンス取得など、お目当ての処理を実装
    }
}
```

同様にしてC#でもEnumでシングルトンを実装できないのか？というのが疑問である。
~~調査の結果、 **C#はEnumそのものにフィールドやメソッドを定義することができないため、Javaと同様にSingletonを作るのは難しいということが判明した。**
仮にEnumを使って実装するとしたら、下記のように **拡張メソッド** を使用する必要がある~~
<font color="Red">追記：コメントで指摘があったが、そもそもC#のEnumは名前付き整数に過ぎないため、インスタンス数の制限を保証できない。
そのため、**C#でEnumを利用したシングルトンの実装はできない**
</font>



<a id="#reference"></a>
# 参考文献
- Effective Java 第2版
- [Effective Javaを勉強します【第2章】](http://uu64.hatenablog.jp/entry/2017/04/23/201722)
- [[勉強会便り] Java の 列挙型](http://www.ndis.co.jp/blog/tech/2010/04/java-1.html)
- [C# で シングルトンパターン](https://qiita.com/rohinomiya/items/6bca22211d1bddf581c4)
- [列挙型 (C# リファレンス)](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/builtin-types/enum)
- [sealed (C# リファレンス)](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/sealed)
- [列挙型シングルトン](https://riptutorial.com/ja/java/example/1870/%E5%88%97%E6%8C%99%E5%9E%8B%E3%82%B7%E3%83%B3%E3%82%B0%E3%83%AB%E3%83%88%E3%83%B3)
- [C#のenumにフィールド・メソッドを定義したいとき【JavaからC#へ】](https://qiita.com/lilacs/items/167a73fbbfedf83eb51a)
- [C# と Java の列挙型の違い](https://qiita.com/masakura/items/68c31ecc718bdd9c08ab)
【初級編】JavaScript if文についてその２

前回の記事
https://qiita.com/furukouji/items/8d6bdad9d0c2fce011db

## 📗 簡単な条件記入例（サラッと書きます）

```javascript
const price = 99;

if (price >= 100){      //priceが100以上であるとき実行する
 console.log('値段は'+price+'円です');
};

if (price <= 100){     //priceが100以下であるとき
 console.log('お金が足りません。');
};

if (price != 100){       //！は否定形です。100ではないときコードを実行します。　また!==とすることで型の判定もできるので基本的にはこちらを使いましょう
 console.log('値段は'+price+'円です');
};
```
####AND,OR,三項演算子について
AND　＝　条件を両方満たす場合実行する。コード上は　　***&&***　と書くと前述と同義となります
OR　 ＝　どちらかの条件を満たす場合実行する。コード上は ***||***　と書きます。(フォントの関係で斜めになってます)
ということでコードを書いていきましょう。

```javascript
const signal_1 = 'red'
const signal_2 = 'yellow'

if(signal_1 ==='red' && signal_2==='yellow'){
 console.log('赤と黄色です。');
}

if(signal_1==='red' || signal_2 ==='yellow'){
 console.log('赤か黄色です');
}
```
AND,ORは基本的には記号が違うだけで使い方は変わりません！！

三項演算子について書いてきます。
三項演算子の基本の形は

条件　? 真 : 偽　

このような形になります。文字だけだと意味不明なので、実際にコードを書いていきます。

```javascript
const point = 100 ;

const player = point > 100 ? 'good' : 'not good';  //pointが100より大きかったらgoodが低ければ not good　が値として返ります。

console.log(player);
```

このように一文でスッキリと書くことができるのでおすすめです！

今回は短いですがこのへんで！

## 📗 まとめ
- AND = &&  OR = || 
- 三項演算子の基本形は 条件　？　真: 偽
- 三項演算子のメリットは一文でスッキリ書ける

## 📗 次回予告
次回は、内容未定です！
for文の内容にしようかと思っていますが
Node.jsの内容になるかもしれません！


****記事を見ていただいてありがとうございます。
ご指摘有りましたら編集リクエストまでドシドシお願いいたします!****
DjangoでMySQLを利用する

# はじめに

ここでは、djangoのデータベースとして、標準搭載されているsqliteではなく、MySQLを利用するための設定について解説します。
なお、MySQLは、MAMPでインストールしたものとします。


# 使用するデータベースの宣言

まず、`manage.py`で、MySQLを利用する旨を以下のように明記します。

```python:manage.py
import pymysql


pymysql.install_as_MySQLdb()
```


# 使用するデータベース情報の記述

そして、`settings.py`でデータベースの詳細情報を記述します。

```python:settings.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': データベース名,
        'USER': （使用するデータベースの）ユーザー名,
        'PASSWORD': （使用するデータベースの）パスワード,
        'HOST': '/Applications/MAMP/tmp/mysql/mysql.sock',
        'PORT': '8889'  # MAMPの場合,
    }
}
```