OmniAICreator/Qiita-1.07M huggingface dataset:
オームの法則 with Python

#はじめに
Pythonを勉強していくうちに、複素数の計算が簡単にできそうということが分かったので、試しに電気工学で使われるオームの法則をPythonで本当に簡単に実装できるのかやってみました。

#オームの法則(直流)
電気工学では最も重要な法則のうちの一つで、一番初めに習う公式です。

```math
V = IR
```
※ $V$:電圧、$I$:電流、$R$:抵抗
上記、オームの法則をPythonで記述します。
$V$、$I$、$R$のうち、空で入力したパラメータに関して計算するように組みます。

```python:Ohm'sLawDC.py
# V = IR for DC circuit
print('Empty a parameter to calculate')

V = float(input('Input V : ') or 0)
I = float(input('Input I : ') or 0)
R = float(input('Input R : ') or 0)

if not V:
    V = R * I
elif not I:
    I = V / R
elif not R:
    R = V / I
else:
    print('Empty a parameter to calculate')

print('V =', V, '[V]')
print('I =', I, '[A]')
print('R =', R, '[Ω]')
```
最初の入力部分ですが、空で入力させたパラメータを計算する想定です。
そのため、以下のように入力をそのまま変換させると、空入力のパラメータで変換時にエラーが発生します。

```python
V = float(input('Input V : '))
```
そのため、一旦str型で入力させてから、入力が空でない場合のみ変換するように記述しました。
本当はもうちょっと簡単な記法ができたらいいな...
inputの初期値とか設定できないものか調べましたが、そういった引数は見つかりませんでしたorz

2019/11/10追記
以下のような記法ができることをコメントで教えていただきました。
こうするとif文なしで数値に変換できました。これはすごい！

```python
V = float(input('Input V : ') or 0)
```
or演算子というのは、実は左側の値を真偽判定して結果を返すそうです。深い、なるほど...
https://docs.python.org/ja/3/library/stdtypes.html#boolean-operations-and-or-not

結果は以下のように出力されます。

```
Empty a parameter to calculate
Input V : 100
Input I : 
Input R : 50
V = 100.0 [V]
I = 2.0 [A]
R = 50.0 [Ω]
```

#オームの法則(交流)
ここからが今回の本題です。
直流では複素数を全く使いませんでしたが、交流ではインピーダンス(Z)を加えた複素数を計算する必要が出てきます。

```math
v = iz
```
※ $v$:電圧、$i$:電流、$z$:インピーダンス

```math
z = \sqrt{(r^2+x^2)}
```
※ $r$:抵抗、$x$:リアクタンス


直流と違うところはパラメータに**$x$(リアクタンス)**が追加されています。
このリアクタンスが交流回路での虚数成分を表します。

それでは交流回路でのオームの法則をPythonで記述します。
$v$、$i$、$r$、$x$のうち、空で入力したパラメータに関して計算するようにします。

```python:Ohm'sLawAC.py
# v = iz for AC circuit

print('Empty a parameter to calculate')

v = complex(input('Input v[V] : ') or 0)
i = complex(input('Input i[A] : ') or 0)
r = complex(input('Input r[Ω] : ') or 0)
x = complex(input('Input x[jΩ] : ') or 0)*1j

if not v:
    z = (r ** 2 + (x / 1j) ** 2) ** (1/2)
    v = z * i
elif not i:
    z = (r ** 2 + (x / 1j) ** 2) ** (1/2)
    i = v / z
elif not r:
    z = v / i
    r = (z ** 2 - (x / 1j) ** 2) ** (1/2)
elif not x:
    z = v / i
    x = (z ** 2 - r ** 2) ** (1/2) *1j
else:
    print('Empty a parameter to calculate')

print('v =', v, '[V]')
print('i =', i, '[A]')
print('r =', r, '[Ω]')
print('x =', x, '[jΩ]')
print('z =', z, '[Ω]')
```

意外と詰まったのは入力は実数で入力させて、内部では実数から複素数に変換しなければいけないところが難しかったです。
「*1j」で実数→虚数へ変換できることさえ分かれば簡単です。

結果は以下のように出力されます。

```
Empty a parameter to calculate
Input v[V] : 10
Input i[A] : 2
Input r[Ω] : 3
Input x[jΩ] : 
v = (10+0j) [V]
i = (2+0j) [A]
r = (3+0j) [Ω]
x = 4j [jΩ]
z = (5+0j) [Ω]
```

複素数を使っても間違いなくオームの法則が計算できました。
入出力の部分とか、実数から複素数への変換方法など、時々つまずくところはあったものの、Pythonでの虚数の書き方さえ分かれば、あとは素直に計算式さえ書けば動作してくれるのでほとんど問題ありませんでした。
本当に簡単にできてしまったと思う。

やはり君はすごいぞ！Pythonくん！
pythonで画像の縁取りする　その1

## やりたい事ときっかけ
* 機械学習のデータセットづくりに輪郭を取る機会が多いけれどそれをなるべく自動化したい。
* openCV, numpy, matplotlib の学習
* ~~ミリオタ成分強めの主が魚雷の誘導法（ウェーキホーミング）を知ったので、それを使ってみたかった。~~ 色々いじっていくうちにウェーキホーミング関係なくなっちゃった。

まぁ、そんなこんなで色々やってみたことを備忘録を兼ねてまとめてみます。

## 環境

* ubuntu 18.04 LTS 
* Anaconda 1.7.2
* python 3.7.3
* openCV 3.4.2
* numpy 1.16.2
* matplotlib 3.03
* Jupyter Notebook 

## 前提となる知識
* pythonや各ライブラリの操作方法
* 極座標の数学


***

## テスト用の画像
![test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245455/6e483ec7-a0e1-3132-d8ab-9b26cc6902ea.png)

とりあえず画像処理を噛ませればRGB画像でもできそうだと思ったのでまずはバイナリ画像で。
中が抜けていたりして複雑な図形の縁を取るのに挑戦。

## コード
[Github Jupyter Notebook](https://github.com/McQotoCovayashi/closed_area_ditector/blob/master/closed_area_ditector.ipynb)

## 基本的な方針
1. 境界を取りたい物体の内部に点を打つ
2. その点から外に向かって線を引き、その線上のどこで色が変わるかを調べる。
3. その線を360度回転させることで境界を得る。

### 簡単な画像ではこんな感じ
↓検出対象
![test01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245455/d298d9d5-675d-993f-b0eb-d5cb6b8d68ca.png)
検出結果
![test01検出結果01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245455/8aad05a5-ab6c-53db-6a44-38c1d0c09a71.png)
だいたい取れてる。

ただし、点の位置によっては線の影になってこんな感じになる。
![test01検出結果02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245455/5e3b0f50-6001-2d48-ce10-22291488798d.png)

冒頭のあの画像が結構難しい課題である、ということは理解してもらいたいところ。

## テスト用画像の検出結果
![test検出結果01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245455/87481d3d-ba6e-8e2f-364f-0fed82c6c1d9.png)
![test検出結果02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245455/6fe084ba-41e8-8642-2a3d-98cc634bd293.png)
![test検出結果03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245455/a05695d5-3410-cc3d-ec99-9e3c5b7d6d35.png)
![test検出結果04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245455/5f1c6310-7534-8401-e93e-a40f42c593b9.png)
![test検出結果05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245455/c08716e5-99be-557c-2cd6-407ec2eceb20.png)

点が一つではどこにとっても影が出来て、見えないところができる。

#### 点が複数あれば影の問題は軽減されるはず。
![test検出結果06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245455/2b7941a7-5a08-f995-636c-3b8fbd75146b.png)

やりすぎたw

## まとめ
外側の縁取りはだいたい取れてる。
それでも内部の領域で取れてないところがあって、要改善。でもこれくらいあればペジエ曲線で縁取りするのは難しくないと思う。

今回はランダムに点を打ったので無駄打ちが多すぎたけれど、適切に点を動かして最小の点の数で縁を取りきるのも面白そう。強化学習とか使ってできないかな。次回以降の課題とします。
Ruby on Rails テーブル作成手順

Ruby on Railsでテーブルを作成する方法を記述します。

<h2>１：マイグレーションファイル作成</h2>
テーブルの設計図であるマイグレーションファイルを生成します。

テーブル名
User

カラム一覧

| カラム名           |データ形             |
|:-----------------|------------------:|
| id               |           integer |
| name             |            string |
| password         |            string |
| created_at       |          datetime |
| updated_at       |          datetime |


```console:console
rails g model User name:string password:string
```

*id、crated_at、updated_atは自動的に作られるので記述しない

作成されたマイグレーションファイルは、
db ⇨ migrateフォルダ内に、「(年月日時分秒)_create_モデル名（複数形）.rb」として生成されています。

<h2>２：マイグレーションファイルを反映させる</h2>
作成したマイグレーションファイルをデータベースに適用させます。

```console:console
rails db:migrate
```

以上でテーブルを生成することができます。
rails db:rollbackって一つずつしか差し戻せないんだよって話

先日、学習中のスクールで同期からテーブルのカラムを間違えてしまったので修正したい、どうすればよいかと聞かれ、即座にrollbackを使うんだよ！と答えられなかったことが悔しかったので備忘録として。


## そもそもrollbackとは？
rails db:migrateを行うことでマイグレーションファイルに記載の内容でデータベースのテーブルにカラムを反映させることができる。
が、カラム名を修正する際にはただマイグレーションファイルを編集してrails db:migrateを再実行するだけでは修正はされない。

その為、一度テーブルを差し戻し、マイグレーションファイルを修正してから再度rails db:migrateを実行する必要がある。
その差し戻しの際に使われるのが**rails db:rollback**である。

## 初めて知ったrollbackの仕様
rails db:migrate:statusでマイグレーションファイルの状態を確認。

    $ rails db:migrate:status
     Status   Migration ID    Migration Name
    --------------------------------------------------
       up     20191105052241  Devise create users
       up     20191106063303  Create groups
       up     20191106063350  Create group users
       up     20191107034603  Create messages

rails db:rollbackを実行し、再度rails db:migrate:statusを実行。

    $ rails db:migrate:status
     Status   Migration ID    Migration Name
    --------------------------------------------------
       up     20191105052241  Devise create users
       up     20191106063303  Create groups
       up     20191106063350  Create group users
      down    20191107034603  Create messages

直近のマイグレーションファイル1つしか差し戻せないんですよね。

今まで使う機会が全くなかったので見もしなかったんですが、rollback実行した時に１つしか差し戻されてないことはターミナルのログに記載がありました。

    $ rails db:rollback
    == 20191107034603 CreateMessages: reverting     
    ===================================
    -- drop_table(:messages)
       -> 0.0278s
    == 20191107034603 CreateMessages: reverted (0.0318s) 
    ==========================

何個分差し戻したいかとかで指定できたらいいのにって思うんですが、ありました。
**STEP=n**を付け加えればいいだけです。

    $rails db:rollback STEP=2
    ==省略==
    $ rails db:migrate:status
     Status   Migration ID    Migration Name
    --------------------------------------------------
      up     20191105052241  Devise create users
     down    20191106063303  Create groups     
     down    20191106063350  Create group users
     down    20191107034603  Create messages

現在の状態から+２つ分差し戻されました。

で、マイグレーションファイルの修正が終わったらいつも通りrails db:migrateを実行すれば全てstatusがupになりますと。こっちは全部のマイグレーションファイルが反映されるので１回でOK。
めでたしめでたし。

## 総括
一人で作業を行っている分には全く問題はないが、チーム開発でカラムの変更を突然行うと齟齬が発生し、迷惑がかかってしまう可能性しかないので気を付けなければならないって。
言われてみればそりゃそうだ(　´_ゝ`）
Xcodeが容量不足でアップデートできない

# 症状
App Store から Xcode をアップデートしようとするが，
容量不足のためアップデートできない．

# 環境
macOS Mojave ver.10.14.5

# やったこと
PC内を整理して30GB程度空き容量があるのに容量不足と言われるので，
調べました．

結局参考ページ3の記事を参考に，一度 Xcode を削除し，
App Store からではなく， Apple のデベロッパサイトから必要ファイルのみ
ダウンロードすることにしました．

理由は，参考ページ1,2を読んだ感じ， App Store 経由でダウンロードすると
空き容量とかが80GBくらい？いるような雰囲気だったからです．
私のPCは128GBなので，80GBも空けられません...買い替えどきなのか...

参考1：http://blog.livedoor.jp/tek_nishi/archives/10040328.html
参考2：https://qiita.com/noobar/items/06ea92fa2b8b2de3ddc9
参考3：https://monaga.site/technology/not-enough-disk-space-available-to-install-the-product

1. Xcode を削除
2. Apple のデベロッパサイト(https://developer.apple.com/download/)から，
   「Xcode 11.2」「Command Line Tools for Xcode 11.2」をダウンロード．
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287953/7ad8fb8e-fcb9-30cd-b368-9a2da487dcff.png)
   7.3GBあったので，ダウンロードに30分くらいかかりました．

なんとか Xcode を起動するとこまでこぎつけました．

以上．お疲れ様でした．
新しいmacでgitを設定（公開鍵作成〜SSH接続）

gitのインストール、
秘密鍵・公開鍵のペア作成からSSH接続までをメモ
無駄なものを省いたシンプルな設定


#Homebrewの導入(rudyを使う場合)
macOS用パッケージマネージャー
[Homebrew](https://brew.sh/index_ja.html)の導入

```
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

macのOSを大文字・小文字で区切っている場合、Warningメッセージが表示される

```
#導入できたか確認
brew doctor
```
「Your system is ready to brew.」と表示されれば完了

```
#Ver確認
brew -v
```
<img width="479" alt="スクリーンショット 2019-11-09 17.56.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224002/8d7b2a5d-e948-9e15-9b4c-26fc4952eeb3.png">


#gitのインストール
```
brew install git
```
```
#Ver確認
git --version
```
<img width="276" alt="スクリーンショット 2019-11-09 18.00.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224002/e3446d69-2830-0bf3-7e4b-23b44f7f5981.png">
#gitアカウントの登録
```
git config --global user.name
git config --global user.email
```
```
#確認
git config --list
```
#sshディレクトリの作成
ホーム配下に権限を付けて.sshディレクトリを作成

```
#現在のユーザーで作成
mkdir ~/.ssh 
#所有者に読み・書き・実行権限を付与
chmod 700 ~/.ssh 
```

```
#ディレクトリ間の移動
cd ~/.ssh
```

#SSH認証キーの作成
ssh-keygenで、RSA方式の暗号鍵を作成

```
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa
```

>
-t「鍵の種類を指定」
-b「生成する鍵のビット数を指定」
　　　RSA 鍵の場合、最小のサイズは 1024 ビットであり、デフォルトは 2048 ビット
-C「コメントを追加」
-f「鍵を格納するファイル名を指定」

macのパスを２回も止められるので入力
randomartにより鍵が作成される
<img width="146" alt="スクリーンショット 2019-11-09 18.18.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224002/25f92cb9-6175-7cb3-6cd5-beed7043347e.png">

```
#秘密鍵の確認はコレ
cat ~/.ssh/id_rsa
```

###秘密鍵のパーミッションを600に変更

```
chmod 600 ~/.ssh/id_rsa
```
ls-laで鍵の作成を確認

```
#確認
ls -la ~/.ssh/id_rsa
```
-rw----- で始まる表示があれば正しく作成されている

```
#.sshの中身を確認する場合
ls ~/.ssh
```

###~/.ssh/configに接続設定を追加

```
vi ~/.ssh/config

#以下を追加
Host *
  AddKeysToAgent yes
  UseKeychain yes

Host github
  HostName github.com
  IdentityFile ~/.ssh/id_rsa
  Port 22
  User git
```

#Gitへの接続を確かめる
公開鍵をgitに設定し、gitへの接続を確認する

```
#以下でコピーしてgithubへ設定
pbcopy < ~/.ssh/id_rsa.pub
```

```
ssh -T git@github.com
```
実行後に、以下の文が返ってきたら接続完了

Hi (アカウント名)! You've successfully authenticated, but GitHub does not provide shell access.


以上
Rのplotをfor文で書いてgifにしたい【R言語】

![TEST.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275572/5fdb3328-a93d-0c16-2432-c454c37aee9e.gif)

#plotをgifにしたい時
最小二乗法の更新していく過程をgifにしたかった
plotが追加されていく過程をわかりやすく図にしたい

パッケージの"animation"にお願いする

***注意!!! for文で200以上を超えると高確率でフリーズします***



```R
library("animation")

x<-sort(rnorm(1000,50,10))
y<-sort(rnorm(1000,30,8)) + rnorm(1000,5,5)
plot(x,y,xlab="面積[m^2]",ylab="値段[円]",xlim=c(0,90),ylim=c(0,70))
abline(lm(y~x),col="red")

bind_x<-NULL
bind_y<-NULL

saveGIF({

  for(i in 1:200){
    px<-rnorm(1,60,5)
    py<-rnorm(1,25,5)
    bind_x<-c(bind_x,px)
    bind_y<-c(bind_y,py)
    plot(x,y,xlab="面積[m^2]",ylab="値段[円]",xlim=c(0,90),ylim=c(0,70))
    points(bind_x,bind_y,col="red")
    lx<-c(x,bind_x)
    ly<-c(y,bind_y)
    abline(lm(ly~lx))
  }

}, interval = 0.5, movie.name = "liner_regression.gif")
```

これでgifに保存できている。

#基本構造

```r
saveGIF({

#for文をここに記述

}, interval = 0.5, movie.name = "liner_regression.gif")
```

intervalで画像の更新秒数
nameは保存名

#以上
JavaScript で日本標準時の Date オブジェクトを生成する

以下のコードで日本標準時の Date オブジェクトが生成される。

```js
const date = new Date("2019-10-30T19:04:22+09:00");
console.log(date); // Wed Oct 30 2019 19:04:22 GMT+0900 (日本標準時)
```

## 解説

1. `"2019-10-30T19:04:22+09:00"` は [ISO 8601](https://ja.wikipedia.org/wiki/ISO_8601) の拡張形式
2. `new Date(dateString)` -> [Date - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date) 参照 

ちなみに、ISO 8601 の基本形式で記述すると、

```js
const date = new Date("20191030T190422+0900");
console.log(date); // Invalid Date
```

## まとめ

JavaScript でタイムゾーンを含めた時刻を扱うときは、ISO 8601 の拡張形式で記述する。
Slackで全員を招待するためのメンションを生成するAPIを作る

#はじめに
こんにちは、アドベントカレンダー17日目担当の避雷です。所属サークルが各種インフラを整えないまま大量の新入生を迎えてしまい、情報の透明性が最悪なことになってしまいました。特にSlackのChannelによる情報の分断が大変悪質で、全員に周知が必要であろう情報が少数しかjoinしてないchannelで行われ、「聞いてないんだけど！？！？！？！？」みたいな現象が100万回ぐらい発生してしまいました。流石に業を煮やした僕は「チャンネルは基本全員招待する」というルールを設けようとしました。しかしここで問題が一つ。
Slackには自動でメンバー全員を招待する設定がありません。一般的に言われる一番楽に全員招待する方法は、

- `/who` をgeneralで打って全員分のメンション文をコピー
- 招待したいチャンネルでコピーしたメンションを送信
- 一括Inviteするかしないか聞かれるので肯定する

と言うものです。channel未加入のメンバにメンションを飛ばすと招待することができる、という仕様を利用した方法ですね。
これは一見合理的な手段に見えますが、一つ大きな問題があります。
「100人以上のメンバーがいるchannelだとメンバ表示が省略される」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256231/45ee300b-ced0-0db7-c3ed-1d6180c62972.png)
他39人のメンバーです！じゃなくてさ…という感じですが、だからと言って新しくbotを作るのも微妙に大変です。
しょうがないので、 `/who` と同じ感じでメンションを全メンバ分列挙した文章を生成する何らかの方法を考えましょう。Slackでは、ユーザーにAPIを提供していて、各ワークスペース毎の情報を取得することができます。僕はこの問題を解決するために、WebAPIを作ることにしました。

#使う技術

- SlackAPI … Keyを作成できれば全メンバの情報をjson形式でfetch出来る。
- Google Apps Script … JSでWebAPIを作ることができる。別個でサーバーを立てる必要とかもなく、書けばそのまま公開出来て、動く（すごい）

#実装
## SlackAPIを使う準備
まずはSlack API 用のAuthenticationをします。
###Legacy tokensの取得
https://api.slack.com/custom-integrations/legacy-tokens へ移動してSlack API 用のLegacyTokenを取得します。
Slackにログインすると自分がゲストではないすべてのワークスペースの一覧がこの下に表示されるので
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256231/2a70403a-9582-5c6b-5520-661072b7d05a.png)
Legacy、と書いてあるように古いVersionのようですし、何か個人用だよ、みたいなことも書いてあるけど、今回はあくまで狭い規模の利用なのでこれを使います。
その中から全メンバを取得したいワークスペースを選択してtokenを発行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256231/58ba954a-50a2-7405-a809-365a10ca3501.png)
上記のボタンを押すとパスワードの再入力を要求され、その後tokenが発行されます。これは後述のGoogle Apps Scriptで使うのでメモっておきましょう。

## Google Apps Scriptの実装

```js
function doGet(e) {
  //SlackAPIをたたく
  var URL = 'https://slack.com/api/users.list?token=【ここにTokenを代入】';
  //URLの取得
  var responce = UrlFetchApp.fetch(URL);
  //Jsonの生成
  var data = JSON.parse(responce.getContentText());
  
  var out = ContentService.createTextOutput();
  var resultText = "";
  for(var i = 0; i < data["members"].length; i++){
    resultText += "@" + data["members"][i]["profile"]["real_name"] + " ";
  }
  out.setMimeType(ContentService.MimeType.TEXT);
  
  out.setContent(resultText);
  return out;
  
}
```

やってることは一般的なWebAPIと同じで、ほぼJsonからデータを取り出すところでちょっとだけ複雑なコードを書いているだけです。メンションを生成するためには`@Hogehoge` に該当するHogehogeを上手く取得する必要があります。APIで吐き出されるjsonを読めばわかるのですが、それっぽいuser_nameっぽいものがたくさんありますが、その中でreal_nameを選択すると上手くメンション文を生成することができます。

#最後に
コレでアクセスすればメンション文が手に入るWebAPIが完成しました。平でURLにアクセスするのがはばかられるなら何か他のツールで包むと良いと思います。ウチのサークルではそのまま利用しています。
viewをimage化する方法

viewからimageを生成する機会がありましたので備忘録としてここに記す。
変数名やサイズ等はだいぶ適当にやっているのであしからず。

#View生成
```swift

   //viewを生成する
    func createView() {
        // view生成
        let view = UIView(frame: CGRect(x: 160, y: 200, width: 200, height: 200))
        view.backgroundColor = UIColor.white
        // ラベルを生成しviewに追加
        let view1 = UILabel(frame: CGRect(x: 0, y: 0, width: 50, height: 50))
        view1.text = "テスト1"
        view.addSubview(view1)
        
        let view2 = UILabel(frame: CGRect(x: 50, y: 0, width: 50, height: 50))
        view2.text = "テスト2"
        view.addSubview(view2)
        
        let view3 = UILabel(frame: CGRect(x: 0, y: 50, width: 50, height: 50))
        view3.text = "テスト3"
        view.addSubview(view3)
        
        let testReturn = createImage(view)
    }
```

#Viewのイメージ化
```swift

// viewのイメージ化
    func createImage(_ view: UIView) -> UIImage {
        UIGraphicsBeginImageContext(view.bounds.size)
        UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.isOpaque, 0)
        let context = UIGraphicsGetCurrentContext()!
        view.layer.render(in: context)
        let image = UIGraphicsGetImageFromCurrentImageContext()!
        UIGraphicsEndImageContext()
        return image
    }
 ```

以上を実行すると下記のように画像が生成される
<img width="608" alt="スクリーンショット 2019-11-10 0.04.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302540/3bfbb1a1-0c9f-2f5b-89e1-beaf80cdd39d.png">

文字途切れてるわ位置最悪だわでセンスが感じられない。。。

#締め
今回はViewからimage生成を行なったが**Xibからimage生成を行いたい**所存。
できるようになったら後日投稿したい。
参考になるサイト等がありましたら教えてください。

以下に今回作成するにあたって書いたコードを記す。

```swift

@IBOutlet weak var button: UIButton!
    override func viewDidLoad() {
        super.viewDidLoad()
        
    }
    
    @IBAction func buttonAction(_ sender: Any) {
        createView()
    }
    //viewを生成する
    func createView() {
        // view生成
        let view = UIView(frame: CGRect(x: 160, y: 200, width: 200, height: 200))
        view.backgroundColor = UIColor.white
        // ラベルを生成しviewに追加
        let view1 = UILabel(frame: CGRect(x: 0, y: 0, width: 50, height: 50))
        view1.text = "テスト1"
        view.addSubview(view1)
        
        let view2 = UILabel(frame: CGRect(x: 50, y: 0, width: 50, height: 50))
        view2.text = "テスト2"
        view.addSubview(view2)
        
        let view3 = UILabel(frame: CGRect(x:
            0, y: 50, width: 50, height: 50))
        view3.text = "テスト3"
        view.addSubview(view3)
        
        let testReturn = createImage(view)
    }
    
    // viewをイメージ化
    func createImage(_ view: UIView) -> UIImage {
        UIGraphicsBeginImageContext(view.bounds.size)
        UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.isOpaque, 0)
        let context = UIGraphicsGetCurrentContext()!
        view.layer.render(in: context)
        let image = UIGraphicsGetImageFromCurrentImageContext()!
        UIGraphicsEndImageContext()
        return image
    }
LC_TYPEがうんたら言われる

CentOS7のロケールの話。sshで接続とかするとのっけから

```terminal
 -bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or directory
```
とかって言われる。でも`locale`を叩いてみると

```terminal
# locale
 LANG=en_US.UTF-8
 LC_CTYPE="en_US.UTF-8"
 LC_NUMERIC="en_US.UTF-8"
 LC_TIME="en_US.UTF-8"
 LC_COLLATE="en_US.UTF-8"
 LC_MONETARY="en_US.UTF-8"
 LC_MESSAGES="en_US.UTF-8"
 LC_PAPER="en_US.UTF-8"
 LC_NAME="en_US.UTF-8"
 LC_ADDRESS="en_US.UTF-8"
 LC_TELEPHONE="en_US.UTF-8"
 LC_MEASUREMENT="en_US.UTF-8"
 LC_IDENTIFICATION="en_US.UTF-8"
```

いや〜ちゃんとできてるんですが...

## 解決策

`/etc/environment`が空だったので、以下を追加してみた

```terminal:/etc/environment
 LC_CTYPE=en_US.utf-8
```

んで`reboot`して再度`ssh`で接続すると、表示が消えました。Yay:)
【Ruby】すぐ出来る！`tr`メソッドによる簡単リファクタリング

## はじめに
先日、[【Ruby】すぐ出来る！`&:`による簡単リファクタリング - Qiita](https://qiita.com/terufumi1122/items/7492bcf602e4657890e5)という記事を書かせて頂きました。

今回も知っていると大幅に行数削減が出来る`tr`メソッドを使用したリファクタリング事例を記載します。:blush:

## この記事が役に立つ方
- とりあえず動くプログラムは作れる
- でもシンプルなコードを書く引き出しを持っていない
- Ruby初心者

## この記事のメリット
- `tr`メソッドの有用性を理解し、置換が必要なシーンに活用出来るようになる。

## 環境
* Ruby 2.6.3

## `tr`メソッドとは
RubyのStringクラスに標準搭載されている**文字列を置換する**メソッド。

↓Rubyリファレンスマニュアルはこちら。
[instance method String#tr (Ruby 2.6.0)](https://docs.ruby-lang.org/ja/latest/method/String/i/tr.html)

以下、Rubyリファレンスマニュアルの例を引用させて頂きます。

```ruby
p “foo”.tr(“f”, “X”)      # => “Xoo”
p “foo”.tr(‘a-z', ‘A-Z’)  # => “FOO”
p “FOO”.tr(‘A-Z’, ‘a-z’)  # => “foo”
```

この例では分かりづらいかもしれませんが、この`tr`メソッドのいいところは**「対象の文字がどの位置にあっても置換してくれる」**ということです。

例えば一番上の例では置換対象が`foo`でしたが、`ofo`でも`oof`でも、ちゃんと`oXo`、`ooX`のように置換されます。

以下で具体例を見てみましょう。

## 具体例
例として、以下のようなA,B,C,Dの４文字から構成される任意の文字列`string`があるとします。
文字列の長さは任意、使用文字だけが上記４文字に制限されていて、順番はランダムです。

そして、定義する`replace`メソッドでやりたいことは以下のような**文字列の置換**です。
1. A⇔B
2. C⇔D

さあ、皆さんならどう解きますか？
入力と出力の関係は以下のようになります。

```
“ADBBC”
# => “BCAAD”

“DBBCAAC”
# => "CAADBBD”
```

ちなみに`tr`メソッドを知らなかった自分の回答は以下の通りです…
**14行**もあります。

文字列を`split`で一旦配列にバラし、それぞれを`case`文で判定・置換してから`join`で配列を文字列に戻す、という内容。

**無駄に長い！**


```ruby:My_solution
def replace(string)
  string.split(“”).map do |s|
    case s
    when “A”
      s = “B”
    when “B”
      s = "A"
    when “C”
      s = “D”
    when “D”
      s = “C”
    end
  end.join
end
```

`tr`メソッドを使ったプロフェッショナルの回答は以下の通り！
**たった３行**！

11行も削減！
ポイントは**「対象の文字がどの位置にあっても置換してくれる」**ことですね。

```ruby:Pro_solution
def replace(string)
  string.tr(“ABCD”, “BADC”)
end
```


## おわりに
同じような置換メソッドで`gsub`がありますが、これは正規表現を使うシーンで有効らしいですね。

リファクタリングの鬼になりたいです。:relaxed:

## 参考にさせて頂いたサイト（いつもありがとうございます）
[Train with Programming Challenges/Kata | Codewars](https://www.codewars.com/)
[instance method String#tr (Ruby 2.6.0)](https://docs.ruby-lang.org/ja/latest/method/String/i/tr.html)
Visual Studio CodeでSalesforceの開発環境構築

# 必要なツール
- Visual Studio Code
- Java 8 Platform, Standard Edition Development Kit
- Salesforce CLI (バージョン 44.0 以上が必要)
- Visual Studio Code プラグイン「Salesforce Extension Pack」


# 手順
## 1.Visual Studio Code をインストールする
Visual Studio Code は、macOS、Windows、または Linux が実行されているコンピュータにインストールできます。システム要件はかなり低いので、ほぼどのマシンでも実行できます。

使用しているオペレーティングシステム用の [Visual Studio Code](https://code.visualstudio.com/) の最新バージョンをダウンロードしてインストールします。すでに Visual Studio Code がインストールされている場合は、再インストールする必要はありません。
Visual Studio Code を起動します。

## 2.Salesforce CLIをインストール
[この記事](https://developer.salesforce.com/docs/atlas.ja-jp.sfdx_setup.meta/sfdx_setup/sfdx_setup_install_cli.htm)に従って、Salesforce CLIをインストールする。

```
sfdx plugins --core
```
と入力した時にバージョン 44.0 以上ならばokです。

## 3.Visual Studio Code プラグイン「Salesforce Extension Pack」をインストール
VScodeの　`Code > Preference > Extentions` から「Salesforce Extension Pack」をインストールする

## 4.ローカルにプロジェクトを作成する
コマンドパレットを開き(Ctrl+Shift+P/Cmd+Shift+P)、 `SFDX: Create Project with Manifest` を選択します。

## 5.組織に接続
コマンドパレットから、 `SFDX: Authorize an Org` を選択し、組織の名称を入力(任意の名前でOK)します。接続する組織を自由に選択できるので、trailhead等で勉強する時にも安心です。

VSCodeで以下のように出力されていれば接続できています。

```
Successfully authorized xxxx@exmaple.com with org ID 00DXXXXXXXXXXXXXXX
You may now close the browser
```
年末まで毎日webサイトを作り続ける大学生 〜22日目 ワイヤーフレームを学ぶ〜

##はじめに
こんにちは！最近週末は温泉に通っている@70days_jsです！
webサイト制作でお金を稼ぐために年末まで毎日webサイトを作っております。
今日はワイヤーフレームという概念を学んで、2カラムレイアウトのサイトを作ってみました。
扱う技術レベルは低いですが、同じように悩んでる初心者の方を勇気付けられれば幸いです。
今日は22日目。(2019/11/9)
よろしくお願いします。

##サイトURL
- https://sin2cos21.github.io/day22.html


 ##やったこと
ネットにある記事を参考にワイヤーフレームを学びました。
構成を考えて、ワイヤーフレームを手書きして、そのあと作り始めました。
構成↓
![スクリーンショット 2019-11-10 0.04.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516248/45cbf5a5-d174-014f-4d27-9716d0f4bc21.png)


手書きワイヤーフレーム↓
![IMG_1116.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516248/ca86e511-658d-4954-652f-0e364655888e.jpeg)

本当はこの後にアプリ等を使ってデジタルのワイヤーフレームも作るらしいのですが、今回は初めということでその作業は飛ばしました。


作ったもの↓
![スクリーンショット 2019-11-09 23.44.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516248/9c677794-4c17-2e2e-b6e5-fd9db274b94e.png)

使った技術は特に新しいものはありません。headerとmain(その中にサイドバーあり）とfooterで分けて書きました。

```html

<body>
    <header>
        <div id="logo_wrapper">
            <span>東京散歩 ~毎日ワクワクお散歩日和〜</span>
        </div>
        <nav>
            <div id="nav_topic_wrapper">
                <div>TOP</div>
                <div>TOPIC 1</div>
                <div>TOPIC 2</div>
                <div>TOPIC 3</div>
            </div>
        </nav>
    </header>
    <div id="main_contents_wrapper">
        <main>
            <div id="article">
                <div>
                    <img src="pic.png" alt="記事1のサムネイル">
                    <div>
                        <h2>記事1のタイトル</h2>
                        <span>記事1の内容</span>
                    </div>

                </div>
                <div>
                    <img src="pic.png" alt="記事2のサムネイル">
                    <div>
                        <h2>記事2のタイトル</h2>
                        <span>記事2の内容</span>
                    </div>
                </div>
        </main>
        <aside id="sidebar">
            <h3>運営者name</h3>
            <img src="pic.png" alt="プロフィール画像">
            <span>fugafugafugafugafugafugafugafugafugafugafugafugafugafugafugafugafugafugafugafugafugafugafugafugafugafugafugafugafugafugafugafugafugafugafugafugafugafugafugafugafugafugafugafugafugafugafugafugafugafugafugafugafugafugafugafugafugafugafugafuga
            </span>
        </aside>
    </div>
    <footer>Copyright © 2019 @js70days, All rights reserved.</footer>
</body>
```

##感想
ワイヤーフレームの存在を知ったので、今後磨きをかけていいコンテンツを作れるようにします。確かに最初に構想を作るのと作らないのではやりやすさが違いました。

最後までお読みいただきありがとうございます。明日も投稿しますのでよろしくお願い致します。

##参考
1. HP作成の初心者でワイヤーフレームの作り方をよく知らない人へ (http://websae.net/wireframe-20150303/)
2. 神戸ポートタワーを望むシンメトリの世界｜無料の写真素材はフリー素材のぱくたそ (https://pakutaso.com/20191104309post-23997.html)

ワイヤーフレームについて参考になりました。ありがとうございます！
変数の説明を JSDoc で書く

## 概要

JavaScript の変数の説明を JSDoc で書き、VSCode でその変数にカーソルをあてると、ツールチップにコメントが表示される。

## 例

```js
/** ここにコメントが表示される */
const hoge = "hoge";
```

上のように書くと、以下のように表示される。

<img width="387" alt="スクリーンショット 2019-11-09 23.15.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235445/322f9341-cab2-55fc-5187-88b1ba4e7f49.png">

## その他

### 関数

関数の説明も同様、かつ引数の説明も表示される。

```js
/**
 * ここにコメントが表示される
 * @param fuga 第1引数のコメント
 * @param piyo 第2引数のコメント
 */
function hoge(fuga: string, piyo: string) {
  console.log(fuga, piyo);
}
```

<img width="757" alt="スクリーンショット 2019-11-09 23.43.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235445/d6ce90ec-9ddb-51eb-f2e7-b8063bf4356b.png">

### オブジェクト

```js
/** hoge のコメント */
const hoge = {
  /** fuga のコメント */
  fuga: "fuga" 
};

console.log(hoge.fuga);
```

`hoge` にカーソルをあてると、 `hoge` の上のコメントが表示される。

<img width="403" alt="スクリーンショット 2019-11-09 23.55.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235445/1da7042e-b488-fa3f-91ad-49655d065569.png">

`fuga` にカーソルをあてると、 `fuga` の上のコメントが表示される。

<img width="547" alt="スクリーンショット 2019-11-09 23.55.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235445/fd642df0-cc7d-3866-7d28-8d5f05f35f71.png">


## 使い所

原則、使わなくて済む方がいい。その際には、

- コメントなしで意味が伝わる命名をする
- 関数の引数は命名だけでなく、TypeScript の型で情報量を増やす
「たった30秒でREST APIのモックが作れ」なかった話

こんにちは、wattak777です。

必要に迫られREST APIを受け付けられるダミーサーバを作ることになりまして、出来るだけ
手抜きで
効率よく構築する手段はないものか、と構築しようとして
手抜きの目論見がバレたのか
少々ハマった話を展開しておきます。

当初手持ちのPCがWindows 10だったためLinuxをDockerかVirtualBoxに入れてやるか、と考えていたのですが、あまりしゃっちこばらず簡単に出来ないものか、と色々探して出てきたのがこれ（google先生は本当に便利ですね）。

<a href="https://tech.yayoi-kk.co.jp/entry/2018/06/25/120611">JSON ServerでRestAPIのモックを作成した話</a>

ここに書いてあるようにNode.jsをインストールし、npmでjson-serverを入れ、

```json:db.json
{
  "API_test": 
  {
    "param1": "Apple", 
    "param2": "Orange"
  }
}
```
```json:route.json
{
  "/api/test/mock/v1/API_test": "/API_test"
}
```

これらを組み、

`C:\work\Dummy_Rest> json-server db.json --routes route.json -p 12345`

とすることで別途DOSプロンプトより

`C:\test> curl http://localhost:12345/API_test`

コールすると無事取れたのですが、問題はここから。
本来はLAN上の別のPCから取ってくる仕組みが欲しかったので、このページに書いてあったserver.jsをくみ上げ、

```javascript:server.js
const jsonServer = require('json-server') ;
const server = jsonServer.create() ;
const router = jsonServer.router('db.json') ;
const middlewares = jsonServer.defaults() ;

server.use(jsonServer.rewriter({
  "/api/test/mock/v1/API_test": "/API_test"
}))

server.use(middlewares) ;

server.use(router) ;
server.listen(12345, function() {
  console.log('Dummy REST API is running.');
}) ;
```

とやっていざ実行。

```
C:\work\Dummy_Rest> node server.js
module.js:472
    throw err;
    ^

Error: Cannot find module 'json-server'
    at Function.Module._resolveFilename (module.js:440:15)
    at Function.Module._load (module.js:388:25)
    at Module.require (module.js:468:17)
        ：（以下略）
```

ん？あれ？
で、色々調べてたら、コレがヒントに。

<a href="https://github.com/typicode/json-server/issues/454">Cannot find module 'json-server' #454</a>

要はnpmで取ってきたjson-serverのパスがNODE_PATHに当たっていなかったってことか。
ってことで、改めて環境変数を取ることに。

```
C:\work\Dummy_Rest> npm root -g
C:\Users\wattak\AppData\Roaming\npm\node_modules
C:\work\Dummy_Rest> set NODE_PATH=C:\Users\wattak\AppData\Roaming\npm\node_modules
```

その後 `node` コマンドによる `global.module.paths` で上記設定されたパスが入っていることを確認すると。。。

```
C:\work\Dummy_Rest> node server.js
Dummy REST API is running.
```

と、無事起動しましたとさ。

もちろん、node.exeに対してのファイアウォール設定は大丈夫ですよね？
これがないと、他のPCから`C:\ClientPC> curl http://192.168.1.1:12345/API_test`とやってもつながらないのでお気をつけアレ。
さまざまな動きをするjQueryスライダーを作ってみた

jQueryの勉強のために昔作ったスライダーです。
そのころはまだレスポンシブとかあまりなかったので、デスクトップ表示しかありません。

##スライドのパターン
よく使う配布されているスライダーを見ると画像の動き方が何種類かあるので、今回は6種類作ってみました。

##デモ
[デモ](http://webdrawer.net/sample/js/sliders/index.html)

##HTML
```html
<div id="slide01">
  <ul>
    <li><a href="#"><img src="img/img01.gif" width="700" height="426" alt=""></a></li>
    <li><a href="#"><img src="img/img02.gif" width="700" height="426" alt=""></a></li>
    <li><a href="#"><img src="img/img03.gif" width="700" height="426" alt=""></a></li>
    <li><a href="#"><img src="img/img04.gif" width="700" height="426" alt=""></a></li>
    <li><a href="#"><img src="img/img05.gif" width="700" height="426" alt=""></a></li>
  </ul>
</div>
```

##CSS
デモからスライドに関係する箇所

```css
.sliders {
  position: relative;
}

.sliders li {
  overflow: hidden;
  list-style-type: none;
}

.sliders li a img {
  border: 0;
}

.pager {
  padding: 10px 0;
  text-align: center;
}

.pager li {
  display: inline-block;
  *display: inline!important;
  list-style-type: none;
  zoom: 1;
 }
 
.pager a {
  margin: 0 5px;
  display: block;
  width: 10px;
  height: 10px;
  background: url(img/pager_off.png) no-repeat left top;
  text-decoration: none;
  text-indent: -9999px;
  outline: none;
}

.pager a:hover,
.pager .current a {
  color: red;
  text-decoration: none;
  background: url(img/pager_on.png) no-repeat left top;
}

.prev {
  margin-top: -25px;
  margin-left: -450px;
  width: 50px;
  height: 50px;
  position: absolute;
  top: 50%;
  left: 50%;
  background: url(img/prev_off.png) no-repeat left top;
  text-indent: -9999px;
  z-index: 50;
  cursor: pointer;
}

.prev:hover {
  background-image: url(img/prev_on.png);
}

.next {
  margin-top: -25px;
  margin-left: 400px;
  width: 50px;
  height: 50px;
  position: absolute;
  top: 50%;
  left: 50%;
  background: url(img/next_off.png) no-repeat left top;
  text-indent: -9999px;
  z-index: 50;
  cursor: pointer;
}

.next:hover {
  background-image: url(img/next_on.png);
}
```

##JavaScript

```javascript
$(function(){
  $("#slide01").sliders();
});
```

##オプション
スライドの種類等ｊはオプションで設定できます。

```javascript
$(function(){
  $("#slide01").sliders({
    slideType:'selectAnimation',
    changeTime: 1500,
    showTime: 3000,
    allTime: 15000,
    animeType: 'linear'
  });
});
```

- slideType
スライドのタイプ。以下から選んで下さい。
 - fadeSlide　フェードイン
 - leftSlide　左にスライド（終わりまで行くと左へ戻る）デフォルト
 - leftSlideLoop　左にスライド（ループ）
 - leftSlideAnimation　常に左にスライド（ループ）
 - selectAnimation　左にスライド（前へ次への選択ボタンあり）
 - moveOn　現在表示されているものの上に右からスライド
- changeTime
次のスライドまでの移動秒数。デフォルトは1500
- showTime
表示秒数デフォルトは3000
- allTime
leftSlideAnimation用・常に左にスライド（ループ）専用の全体にかかる秒数。デフォルトは15000。
- animeType
アニメーションタイプ。デフォルトはswing。jquery.easing.jsを読みこめばそちらの値も使えます。 

スライダーはbxSliderなど配布されていたものを使っていたのですが、やはり自作できるといろいろ改造もできて楽しいです。

##転載元
[さまざまな動きをするjQueryスライダーを作ってみた](http://webdrawer.net/javascript/sliders.html)
よく使うgitコマンド備忘

gitコマンドをよく忘れてしまうので個人的な備忘です。

## リモートブランチからローカルブランチを作成
```
git checkout -b branch_name origin/branch_name
```
## 編集内容のリセット
```
git reset --hard
```

## マージコミットのリバート
```
git revert -m 1 72bcd57
```

## リモートリポジトリの作成
```
git init --bare --share
```
##### リポジトリの権限変更
```
chown -R git:git dir
```
[C#]非同期非対応APIを簡単に非同期にするクラスTaskCompletionSource

# 非同期に対応してないレガシーAPI
非同期に対応していない古いAPIは今どき困りものである。しかし.NETは簡単に非同期機能を追加できる便利な機構を持っている。拡張メソッドとTaskCompletionSourceクラスである。サンプル的な使い方はこんな感じ。

# 非同期に対応してないレガシーAPIを非同期に対応したモダンAPIに変えるサンプル
```c#
    class Program
    {
        static async Task Main(string[] args)
        {
            var oao = new OldApiObject();
            var a = await oao.DoAsync(true);
        }
    }

    static class OldApiEx
    {
        public static async Task<bool> DoAsync(this OldApiObject oao,bool flag)
        {
            var cs = new TaskCompletionSource<bool>();
            oao.Done += result => cs.SetResult(result);
            oao.Do(flag);
            //この時点でcs.Task.IsCompletedはTrue
            return await cs.Task;
        }
    }

    class OldApiObject
    {
        public event OldEventHandler Done;
        public delegate void OldEventHandler(bool flag);

        public void Do(bool flag)
        {
            Done(flag);
        }
    }
```

OldApiObjectが古いAPIである。DoneイベントとDoメソッドが用意されている。新たにOldApiExクラスを作成する。OldApiObjectに対して拡張メソッドを提供する。これにより使う側は古い新しいを意識せずに非同期機能を使うことができる。

今後、もうちょっとサンプルとか解説用意するかも
インデックスとデータのスキャン

# インデックスとデータのスキャン

## インデックスとは
  インデックスとはテーブルの情報を探す時に検索の対象としてよく使用するカラムの値だけを取り出して検索しやすいようにしておいたものです。
  
## インデックスの仕組
  検索に必要なキー項目とデータ行が格納されているROWIDだけど保管するため、大量のデータ群から簡単に対象のデータを検索できます。
  
## そもそも検索の方法は？
いろいろありますが、ここでは２つのパターンを紹介します。

### フルテーブルスキャン
　フルテーブルスキャンは、SQLで指定されたテーブルを頭から1行1行読み込んで検索条件を満たす行を検索する方法です。
 
 数十件程度のテーブルであれば、フルテーブルスキャンの方が早いです。
 
 
### インデックススキャン
インデックススキャンは、インデックスを使って、条件に該当するデータの場所を特定してから、表にアクセスする方法です。

インデックスには検索条件(where条件の項目)のキー項目とROWIDを保管しているため条件に該当するデータの場所(≒ROWID)を高速につきとめます。

使い方によって2時間かかってたSQLが2分で終わるとかざらにあります。


### インデックスのデメリット

- SQLの検索条件となっているキー項目で張らないと意味がありません
- 検索は早くなってもUpdate/Delete/Insertが遅くなる可能性があります
- インデックスのメンテナンスは必ず夜間バッチ完了後に実施しましょう

インデックスはちゃんと考えて作りましょう。
Clean Architecture 達人に学ぶソフトウェアの構造と設計 を読んで

今後の自分のキャリアを、クラウドネイティブを主にしたアーキテクト！
と決めた中で勉強本を探して出てきた１冊。
アーキテクトをとしてシステムを設計するための基本原則がまとめられており、評判どおり大満足の内容。
自分の備忘のためにも投稿、主観もかなり入っています。

1. 書籍の紹介
---
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319276/aba80d16-ef22-7000-a06e-7bd12ef193f4.png)

https://www.amazon.co.jp/Clean-Architecture-%E9%81%94%E4%BA%BA%E3%81%AB%E5%AD%A6%E3%81%B6%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%81%AE%E6%A7%8B%E9%80%A0%E3%81%A8%E8%A8%AD%E8%A8%88-%E3%82%A2%E3%82%B9%E3%82%AD%E3%83%BC%E3%83%89%E3%83%AF%E3%83%B3%E3%82%B4-%EF%BC%B2%EF%BD%8F%EF%BD%82%EF%BD%85%EF%BD%92%EF%BD%94-%EF%BC%A3%EF%BC%8E%EF%BC%AD%EF%BD%81%EF%BD%92%EF%BD%94%EF%BD%89%EF%BD%8E-ebook/dp/B07FSBHS2V

**著者**  
ロバート・C. マーチン(通称：アンクルボブ)  
→アメリカのソフトウェアエンジニア、cleancodrs.comの共同創始者、いくつかの設計原則の開発やアジャイル宣言の作者として有名  
https://en.wikipedia.org/wiki/Robert_C._Martin

2. 書籍の要約
---
**Ⅰ部　イントロ**
* ソフトウェアの２つの価値：振る舞い とアーキテクチャ
* アーキテクチャが崩れる可能性はたびたびある、四象限に分類し優先順位付
　→アイゼンパワーのマトリックス、下記順番で対応するのがよい
　　 1.重要緊急　２重要緊急ではない　３重要ではない緊急　４重要ではない緊急ではない

**Ⅱ部　プログラミングパラダイム**
* 構造化プログラミング 
　→go to 文を排除し、if/then/elseに：直接的な制御の移行に対する規律
* オブジェクト指向プログラミング 
　→カプセル化、継承、ポリモーフィズム：間接的な制御の移行に対する規律
* 関数型プログラミング 
　→代入の制約（参照渡しなど）：代入に対する規律 
* それぞれのパラダイムはプログラムに規律を課している、それぞれ、機能・コンポーネントの分離・データ管理に対応。
  
**Ⅲ部　設計原則**
* SOLID原則
1.  単一責任の原則　SRP 
　→クラスは単一の責任のみ保有するべき、クラスは責任の範囲で定義する
2. オープン・クローズドの原則　OCP 
　→変更の影響は受けにくく、システムは拡張しやすい。クラスの関係に対する方向の向きや、クラスの持ち方について
3. リスコフの置換原則　LSP 
　→継承の使い方の指針、RectangleとSquareの話
4. インターフェイス分離の原則　ISP 
　→そのまま。分けましょう
5. 依存関係逆転の原則　DIP 
　→OCPが成り立つように関係を定義する、抽象化の原則。プログラムの流れとクラスの関係が逆になるため、この名前  
　　**Abstract Factoryパターン**  

* コンポーネントの凝集性(Cohesion)  
  ※凝集性：情報工学においてモジュール内のソースコードが特定の機能を提供すべく如何に協調しているかを表す度合いである。
　　　　IPAが実施する情報処理技術者試験では、強度という言葉が使われる。凝集度は順序尺度の一種であり、「凝集度が高い」とか「凝集度が低い」といった言い方で使われる。

1. 再利用・リリース等価の原則（REP）  
2. 閉鎖性共通の原則（CCP）
　→同じ理由、タイミングで変更されるクラスをコンポーネントにまとめる、変更の理由やタイミングが異なるクラスは別コンポーネント  
　→SRPと類似
3. 全再利用の原則（CRP）
　→コンポーネントのユーザーに対して、実際に使わないものへの依存を強要してはいけない（ISPを一般化したもの）  

* コンポーネントの結合
1. 非循環依存関係の原則（ADP）  
　→コンポーネントの依存グラフに循環依存があってはいけない
2. 安定依存の原則（SDP）  
　→安定度の高い方向に依存させる 
3. 安定度・抽象度の原則（SAP）  
　→コンポーネントの抽象度は安定度と同程度でないといけない  
※依存性管理の指標  
* バンダリーを引く。ソフトウェアアーキテクチャとはバウンダリーを引く技芸
* クリーンアーキテクチャ  
　→フレームワーク非依存、テスト可能、UI非依存、データベース非依存、外部エージェント非依存  
　→１．ビジネスルール、２．アプリケーションのビジネスルール、３．インターフェイスアダプター、４．フレームワークとドライバー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319276/3defd948-e168-a7a8-c512-719b80715639.png)



3. 所感
---
原則の内容詳細は正直薄いが、アーキテクチャの全体感を捉える意味で良かった。ただ少し歴史を感じる。
あるべきはまさに示されている原則にしたがって実行するというのは理解できるが、Howが書かれていない。
これをどこまで咀嚼し実行できるか試されている気がします。
dbpediaの研究 その29

#概要

dbpediaが難解なので、手出してみる。
node.jsで、取得してみた。

#サンプルコード


```
process.stdin.resume();
process.stdin.setEncoding('utf8');

var http = require('http');
const querystring = require('querystring');

const HOST = 'ja.dbpedia.org';
const PATH = '/sparql';
let postData = {
    'query': 'SELECT DISTINCT * WHERE { dbpedia-ja:デ・トマソ dbpedia-owl:abstract ?abstract .}'
};
let postDataStr = querystring.stringify(postData);
let options = {
    host: HOST,
    port: 80,
    path: PATH,
    method: 'POST',
    headers: {
        'Content-Type': 'application/x-www-form-urlencoded',
        'Content-Length': postDataStr.length
    }
};
let req = http.request(options, (res) => {
  res.setEncoding('utf8');
  res.on('data', (chunk) => {
    console.log(chunk);
  });
});
req.on('error', (e) => {
  console.log('problem with request: ' + e.message);
});
req.write(postDataStr);
req.end();


```

#成果物

https://paiza.io/projects/5UX0bQUGTI0Ao7rD9wEyPA


以上。
Git認証情報をローカルに保存する

# Git認証情報をローカルに保存する

CodeCommitでリポジトリ管理をされる方が前提です。

 1. AWSにログインする

    ```
    https://xxxxxxxxx.signin.aws.amazon.com/console
    ```
    
 1. サービスからIAMを選択する

    検索窓に「IAM」と入力する

 1. 左列からユーザを選択する
    
 1. ユーザ名の一覧が表示されるので、自分のユーザIDを選択する。


 1. IAMユーザの「認証情報」タブを選択する


 1. AWS CodeCommit の HTTPS Git 認証情報の「生成」を行う
 
    下の方にスクロールすると、「AWS CodeCommit の HTTPS Git 認証情報」セクションがあるので生成を押下する。

　　 **<font color="red">注意!!</font>**
     　　 **Git認証情報は1ユーザにつき2個までです**
  
 7. Git認証情報をローカルに保存します
    
    「証明書のダウンロード」を押してGit認証情報を保存します。

     **<font color="red">注意!!</font>**
      **Git認証情報は必ず厳重に保存してください。**
ECSのARNとResource IDのフォーマット設定してなくてハマった

# これは何？

```terminal
InvalidParameterException: The new ARN and resource ID format must be enabled to add tags to the service. Opt in to the new format and try again.
```
ECSで遊んでみようとTerraformで遊んでいたら、
ECSのServiceリソースを生成する際に上記のようなリクエストエラーが返ってきた。
意外と知らなくて詰まったのでその対処方法。

# 環境
macOS Mojave 10.14.5
terraform: v0.12.13

# 対処方法

参考になったのは下記の2ページ。

https://docs.harness.io/article/rdk1j5s32z-ecs-troubleshooting#new_arn_and_resource_id_format_must_be_enabled

https://aws.amazon.com/blogs/compute/migrating-your-amazon-ecs-deployment-to-the-new-arn-and-resource-id-format-2/

AWSのブログのこの画像の通りですが、下画像のECSのアカウント設定ページで設定を行う必要がありました。結構書籍や実践例はこの設定を以前に行なっているユーザーでTerraformでリソース作成を行なっているのでは？？と今回思ったので初めてECSを触る人は多分ここでハマっているんじゃないか...と勝手に思いました。
![スクリーンショット 2019-11-09 22.29.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160142/c950041c-9463-b223-da43-dfeb24d3e6da.png)

このページに以下のような説明があり、Terraformでも設定用の記述を追加すれば大丈夫そうですが、今回はそこまで調べてないのでわかったら追加します。一旦今回はチェックボックスにチェックを入れ設定を更新しました。
> オプトイン設定を定義していない場合は、IAM ユーザーまたはロールがデフォルト設定になります。アカウントのデフォルト設定を変更するには、root ユーザーでオプトイン設定を変更するか、あるいはPutAccountSettingDefault API を使います。
注: Amazon ECS は、このほど新しい PutAccountSettingDefault API を発表しました。これによりユーザーやロールがAPI を使ってアカウントのオプトイン設定ができるようになりました。この PutAccountSettingDefault API は、AWS CLI または SDK で利用できます。詳細については、「ECS ドキュメント」ページを参照してください。

また、下記のようにあるので今回の例外の意味は
**「新しいARNのフォーマットにアカウントが設定されてないのに新しいフォーマットでECSのサービスリソースのARNが送られてきているよ、設定変えてね」** 
ということでした。
> Amazon ECS は ARN とリソース ID の新しいフォーマットを導入しました。タスク、コンテナインスタンス、およびサービスの ARN は、クラスター名が含まれているため長くなります。タスクとコンテナのインスタンス ID は、ハイフンを含まなくなったため、短くなりました

チェックボックスにチェックした後設定を更新し、もう一度`terraform apply`で無事ECSのサービスリソースが生成されALBとの紐づきが確認でき、ページが表示されました！

CloudFormationしか触ってこなかったのでこれからTerraformも触って色々試そうと思います〜。
PythonのRequestsのステータスコード

RequestsでHTTPリクエストを送ったあと、そのレスポンスのステータスコードを確認することはよくある。

```
import requests

response = requests.get(...)

assert response.status_code == 200
```

などである。
しかし、このときRequestsの定数を用いて、

```
assert response.status_code == requests.codes.ok
```

などと書くことができる。
こうすることで、200というマジックナンバー使わずに済む。
UE4でのカラコレ/グレーディングにちょっとひと手間かける

# UE4のカラコレ、グレーディング
UE4には標準のポストプロセスである程度カラーコレクション/グレーディングができますが、少し機能が足りない時があります。
映像系で使う方たちはUE4からの出力後、他のソフトで作業をすればいいのであまり問題にはならないかもしれません。
しかしながら、ゲームなどリアルタイムの物は出力をUE4で全てを完結しなければならないものが多いです。

そこで今回、ちょっとひと手間かけて作る事でリアルタイムでのカラコレ/グレーディングをサポートする機能(カスタムノード、マテリアル)をいくつか紹介します。

※基本的にはポストプロセスマテリアルの中の話です。


## その1　HSVとパラメータの範囲指定マスク
RGBと色相、彩度、明度を相互変換する機能と、値の範囲を選択する機能を作ります


まずは例として、この元画像に適用した例を示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502600/fa75f321-831c-7d48-f47d-013c8bf57d83.png)

### 色相環の特定の範囲だけ色相をシフトする。
色相環の赤に近い部分を選択し、青方向に色相をシフトしています
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502600/db5355e2-480e-8023-2d83-694fc696823f.png)

範囲指定で検出したマスク
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502600/86640e65-ba20-64c8-11c9-a633e87814f4.png)

### 明度が一定の範囲の部分の彩度を落とす
明度0.5以上の部分を選択し、彩度を落としています
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502600/6f6200b5-81f4-309d-a623-fd3939b1e346.png)

範囲指定で検出したマスク
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502600/e80a13b9-7ba1-b8b9-3bd5-f3796ff76ad6.png)


### 指定したの色相以外彩度を落とす
青い部分以外は彩度を落としています
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502600/5d3e325b-84d6-d0c0-d710-2df7f2bc1909.png)
範囲指定で検出したマスク
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502600/aec473b4-6fc9-74f2-4ee0-137773df286a.png)

### 実装　ノード
これらを実装する為にまず、RGBとHSVの相互変換機能が必要になります
偉大なサイト[t-pot](https://t-pot.com/program/112_HSV/index.html)を参考にカスタムノードを作ると簡単です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502600/a7e8089e-0fa5-7534-45b1-ee8e88b58e65.png)
上記のように相互変換のための2つのカスタムノードを作りました。

次に範囲を指定してマスクするノードを作ります。標準でSphereMaskなど似たようなものがあるかもですが一応作ってみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502600/0060dc7d-3fb3-d508-dd3f-fb3622d22c05.png)

現在の値Valueと目的の値および適用幅、フェード幅と比較をし、0.0~1.0の値を返します。

このノードがある事により、標準ではShadow、MidtoneHighLightの固定3段階しかない範囲指定をより細かく、トーン以外のパラメータで適用することができます。

### 実装　マテリアル
実際に色相をずらす例で組んだノードがこちらです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502600/7cb1f83c-c1d9-2547-2884-add96d36680b.png)
シーンカラーをHSVにして目当ての色相の範囲のマスクを作成し、該当している部分だけシフトし、RGBに戻して出力しています。

実際にはさらに”キャラクターだけ”や”背景だけ”などのマスクをさらに重ねることが多いです。

## その２　グレーディングノード
こちらはよく使うグレーディング機能が入った関数をつくりました。標準にある機能と重複していますが、関数化しているので、例えばRGBのチャンネル毎それぞれにこの関数を追加することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502600/d44b58b8-250c-5ef7-ba25-870482f5f72b.png)


標準との違いで大きいのはBlackPoint/WhitePointでしょうか、ヒストグラム上を見ながら、有効なコントラストを確認しながらBlackPointとWhitePointを設定すれば、コントラストを最大限に生かすなどの表現ができます。

BlackPoint0.1、WhitePoint0.9に設定してみた画像
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502600/4241a098-22d2-7a5d-c057-f453f35cfc6b.png)



## ※これらのノード作成の際に注意していること
これらのノードを実装するにあたって、clampなどで1～0に丸めたりしないようにしています。


例えば、図のように一度オフセットで白飛びさせた物にゲインをかけるノードを組んだ場合、中でクランプされていると、階調が失われてしまうからです。

## まとめ
以上のように、いくつかのノードを作るだけで、標準機能に比べれば自由度の高い調整ができるようになりました。ポストエフェクトマテリアル上での実装で、シェーダーを書くわけではなく、ノードベースなのでアーティストもとっつきやすいかと思います。

相変わらず記事用に適当に作ったものなので、実戦ではもう少し洗練する必要があるかと思いますが、何かの足しになれば幸いです。
EC2インスタンスのbashをzshに変更するまで

タイトルの通り。

```
$ chsh -l
bash: command not found: chsh
```

初期状態のamazon linuxでは`chsh`が使えない。

```
$ sudo yum install util-linux-user -y
```

`-y`は全ての確認にyesと答えるオプション。
zshをインストール。

```
$ sudo yum install zsh -y
```

```
$ chsh -l
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh
/usr/bin/zsh
/bin/zsh
```

OK、入ってる。
`-s`オプションで直接、パスを指定してあげる。

```
$ chsh -s /usr/bin/zsh
ec2-user のシェルを変更します。
パスワード:
chsh: 認証失敗
chsh: ユーザ属性の変更に失敗しました: Permission denied
```

ん？ec2-userにパスワードなんてデフォルトであったっけ？
とりあえず初期EC2はパスワードが未設定なはずなのでそこをつけてみる。

```
$ sudo su -
# passwd
```

rootに昇格。
新しいパスワードを設定。

```
# exit

$ chsh -s /usr/bin/zsh
ec2-user のシェルを変更します。
パスワード:
chsh: 認証失敗
chsh: ユーザ属性の変更に失敗しました: Permission denied

$ sudo chsh -s /usr/bin/zsh
root のシェルを変更します。
シェルを変更しました。
$ sudo su -
# echo $SHELL
/bin/zsh
```

rootは変更できるがec2-userはどうしたら？
よくわからんので新しくパスワードを持たせた一般ユーザを作ることに。
EC2の初期設定としてec2-userは消せってよく言うし。

```
$ useradd testuser
$ passwd testuser

$ sudo vi /etc/ssh/sshd_config
```

`PasswordAuthentication yes`として保存。

```
$ service sshd reload
$ sudo vi /etc/sudoers.d/90-cloud-init-users
```

末尾に`testuser ALL=(ALL) NOPASSWD:ALL`追記。

再接続。

```
$ logout

$ ssh -i xxx.pem testuser@xxx.xxx.xxx.xxx
testuser@xxx.xxx.xxx.xxx's password: 

% echo $SHELL
/usr/bin/zsh
```

sshで入る時にパスワードも要求されるようになってしまったがzshにできた。
(鍵認証に切り替えたいが今回の内容ではないのでこのまま)

試しにEC2インスタンスをrebootしてから接続してもzshでお迎えしてくれた。

おわり。

## 追記

`/etc/passwd`で確認できたらしい。一番最後がシェルの情報。

```
% cat /etc/passwd
testuser:x:1001:1001::/home/testuser:/usr/bin/zsh 
```
rails 発展その6　 n+1問題　HTTPリクエスト一覧とルーティングのコツ　 ActiveRecord::Baseメソッド一覧

重要情報と一覧情報が欲しかったので
その備忘録を書きます。

## n+1問題
処理の都合上無制限にデータが増えて行ってしまう問題

##  includesメソッド
n+1問題対策でincludesメソッドがあります。指定された関連モデルをまとめて取得することで、
SQLの処理を減らすことができます

```ruby:controller
# 例
    def index
      @items = Item.includes(:user)
    end
# これでitemテーブルに関連するuserテーブルまとめて取得しました。
```

## HTTPの一覧

主に使われる物はこちら

| メソッド | 役割 |
|:--|:--|
| get | ウェブサイトを閲覧する際にはこのメソッドが使われる。  |
| post | サーバーに情報を送信するために使われる。 |
| delete | データを削除するために使われる。  |
| patch | データを更新するために使われる。 。 |
| put | patchと同じ役割を持っている。rails3から4になる形で使われなくなった。 |

他にも種類はあります。
又下記のような便利なメソッドがあります。

## resourcesメソッド
Railsの基本となる7つのルーティングを自動で生成するメソッド

```ruby:controlle
Rails.application.routes.draw do 
  resources :items                     #items_controllerに対してのresourcesメソッド
  resources :users, only: [:show]       #users_controllerに対してのresourcesメソッド
end
```

## ルーティングのネスト
情報が二重に必要な場合このようなネストが必要です。

```ruby:routes
Rails.application.routes.draw do
  resources :items do
    resources :comments, only: [:create]
  end
end
# これでitemの中にコメントのルーティング情報が追加されるようになります。
```

## ActiveRecord::Baseメソッド
ActiveRecord::Base というクラスを継承して使用する。
Railsにデフォルトでインストールされている。
基本知識が増えれば随時更新予定

```ruby:
Item.all
#モデルからすべてのインスタンス取得

Item.new(name: "", text: "Hey")
#モデルに新規インスタンスを作成

item.save
#作成したインスタンスを保存

Item.create(name: "", text: "Hey")
#newメソッドとsaveメソッドを一気に行うことと同じ

Item.find(3)  #=> <Tweet id:1, name: "", text: "Hey" >
#モデルからidが3のデータをインスタンスとして取得　※該当するものがない場合はエラーになる

Item.find_by(name: "")
#条件に合うデータをidの若い順に1つだけ取得　※該当するものがない場合はnilを返す

Item.where(name: "")
#条件に合うデータを複数取得

Item.where(name: "").first_or_initialize
#whereメソッドとともに使用。
#検索した条件のレコードがあればそのレコードのインスタンスを返し、なければ新しくインスタンスを作るメソッドです。

Tweet.limit(10)
#モデルからidの若い順に10つのデータを取得

Tweet.order("created_at DESC") 
#データの作成日時が新しい順にソート。DESCは降順、ASCは昇順

item.destroy
#削除

item.update
#更新
```