OmniAICreator/Qiita-1.07M huggingface dataset:
RubyonRailsでtwitter風webアプリケーションの作成 STEP2:ユーザーの編集、削除

ユーザー一覧から詳細ページに移動する

```erb:app/views/users/index.html.erb
<div class="container">
<h1>twitter</h1>
<% @user.each do |user| %>
<p><%= link_to user.email,user_path(@user) %></p> #ここを変更
<% end %>
</div>
```
showメソッドの追加
editメソッドの追加
updateメソッドの追加
destroyメソッドの追加
update用のストロングパラメーター作成

```ruby:app/controllers/users_controller.rb
  def show
    @user = User.find(params[:id])
  end

  def edit
    @user = User.find(params[:id])
  end

  def update
    @user = User.find(params[:id])
    @user.update(user_update_params)
    redirect_to root_path
  end

  def destroy
    @user = User.find(params[:id])
    if @user.destroy
    redirect_to root_path
    end
  end
  
  private
  .
  .
  def user_update_params
    params.require(:user).permit(:email)
  end

```

showビューの作成

```erb:app/views/users/show.html.erb
<h2><%= @user.email %></h2>
<br>
<p><%= link_to "Eメールアドレスを編集する",edit_user_path(@user) %></p>
<p><%= link_to "このユーザーを削除する",user_path(@user),method: :delete %></p>
```

editビューの作成

```erb:app/views/users/edit.html.erb
<div class="row">
<div class="col-md-6 col-md-offset-2">
  <h1>ユーザーを編集する</h1>
  <%= form_for(@user) do |f| %>
  <p><%= f.label :email , "メールアドレス"%></p>
  <p><%= f.email_field :email %></p>
  <p><%= f.submit "更新する", class: "btn btn-primary" %></p>
  <% end %>
</div>
</div>
```
一旦ブラウザで確認

```ruby:コマンドライン
$ rails s -b 192.168.33.11 -d #192.168.33.11はipアドレスを確認してください
```

こんな感じです

![スクリーンショット 2019-05-22 21.51.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420746/9c84d64d-11cd-5cdb-1d3e-61274c5d7702.png)

![スクリーンショット 2019-05-22 21.51.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420746/7a6cb781-2e52-12cd-7953-7c5a643bb267.png)

![スクリーンショット 2019-05-22 21.51.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420746/a0c01d0d-ab97-7032-2c98-129f37e5d104.png)

今回はここまで

次はログイン、ログアウト機能の実装をしていきます。[コチラ](https://qiita.com/JUM22676603/items/f6b81a1422219cec275c)
AWS GPUインスタンスのスペック・価格比較

# ■ AWSのGPUインスタンスの種類について
- AWSのGPUインスタンスにはG系とP系が存在

### 〇 P系のインスタンス：機械学習や金融工学、分子モデルシミュレーションなどの処理向け
- 種類
 - p2.xlarge 
 - p2.8xlarge
 - p2.16xlarge
 - p3.2xlarge
 - p3.8xlarge
 - p3.16xlarge
 - p3dn.24xlarge

- 搭載GPU
 - P2インスタンス：NVIDIA Tesla K80
 - P3インスタンス：NVIDIA Tesla V100
 
### 〇 G系のインスタンス：3Dレンダリング、動画エンコーディングなどグラフィック処理向け
- 種類
 - g3s.xlarge
 - g3.4xlarge
 - g3.8xlarge
 - g3.16xlarge
 
- 搭載GPU
 - G3インスタンス：NVIDIA Tesla M60

# ■ GPUインスタンスのスペック・価格の比較(※2019/05/22の情報)
### 〇 P系のスペック・価格比較表
| インスタンス | GPUの種類 | GPU数 | クロック(MHz) | CUDAコア数 | GPUメモリ(GiB) | vCPU | RAM | 価格/時間(USD) |
|:------------------: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: |
| p2.xlarge | Tesla K80 | 1 | 560 | 2,496 | 12 | 4 | 61 | $0.9000 |
| p2.8xlarge | Tesla K80 | 8 | 560 | 19,968 | 96 | 32 | 488 | $7.2000 |
| p2.16xlarge | Tesla K80 | 16 | 560 | 39,936 | 192 | 64 | 732 | $14.4000 |
| p3.2xlarge | Tesla V100 | 1 | 1,245 | 5,120 | 16 | 8 | 61 | $3.0600 |
| p3.8xlarge | Tesla V100 | 4 | 1,245 | 20,480 | 64 | 32 | 244 | $12.2400 |
| p3.16xlarge | Tesla V100 | 8 | 1,245 | 40,960 | 128 | 64 | 488 | $24.4800 |
| p3dn.24xlarge | Tesla V100 | 8 | 1,230 | 40,960 | 256 | 96 | 768 | $31.2120 |

※ 米国東部 (バージニア北部)および米国西部(オレゴン)の価格

### 〇 G系のスペック・価格比較表
| インスタンス | GPUの種類 | GPU数 | クロック(MHz) | CUDAコア数 | GPUメモリ(GiB) | vCPU | RAM | 価格/時間(USD) |
|:------------------: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: |
| g3s.xlarge | Tesla M60 | 1 | 1,180 | 2,048 | 8 | 4 | 30.5 | $0.7500 |
| g3.4xlarge | Tesla M60 | 1 | 1,180 | 2,048 | 8 |  16  | 122 | $1.1400 |
| g3.8xlarge | Tesla M60 | 2 | 1,180 | 4,096 | 16 | 32 | 244 | $2.2800 |
| g3.16xlarge | Tesla M60 | 4 | 1,180 | 8,192 | 32 | 64 | 488 | $4.5600 |

※ 米国東部 (バージニア北部)および米国西部(オレゴン)の価格

### 〇 利用料金について
- AWSのGPUインスタンスの利用料金=GPUインスタンスの利用料金(上記)+Elastic Block Store(EBS：ストレージ)の利用料金
 - 参考：EBS汎用SSDボリュームの利用料金⇒1GBあたり月0.100 USD
iOSリリース のためにアーカイブを行う

iOSアプリをリリースする手順はAndroidよりも複雑です。
今回はファイルをアップロードする手順に特化して記載したいと思います。
iOSアプリをリリースする際にはファイルを作るだけでなく、アップロードまでxcodeでできてしまいます。

####①アーカイブ
ipaファイルとしてビルドする作業になります。
XcodeのProductからArchiveを選択して、ビルドを行います。

その時にArchieveが選択できない事象が起こることがありますが、エミュレータや実機を選択しているとなるので、「Generic iOS Device」を選択するとArchieveを選択できるようになります。
問題なくビルドできれば成功です。

<img width="279" alt="スクリーンショット 2019-05-22 21.06.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239560/65bc2c7b-22b0-2be1-9db9-9b87268334e7.png">

####②Validate App
次に、アップロードするファイルに問題がないかをチェックします。
アーカイブが成功すると、ファイルをアップロードする画面が表示されます。
もし、表示されなければ、Windows→Organizerを選択すれば、表示されます。

<img width="238" alt="スクリーンショット 2019-05-19 13.24.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239560/e88d8799-f42e-f540-ed34-e3f399587a61.png">

上記のValidate Appを選択します。
選択するとオプションが表示されます。

<img width="524" alt="スクリーンショット 2019-05-22 21.20.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239560/73301edf-6d2e-0b59-d6e2-252fd56283a6.png">

下記は「Automatically manage singing」を選択しました。
証明書やApp IDsを紐づけてくれるので、手動で行うより楽です。

<img width="527" alt="スクリーンショット 2019-05-22 21.22.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239560/ba47ceca-49db-53ea-3add-340d53451738.png">

Validateを選択し、SuccessFullyになればアップロードします。

ここで失敗するのはビルドのバージョンがあがっていない(更新の時)などがあるようです。

####➂Distribute App

ここまでうまくいけばあとはアップロードするのみです。
Distribute Appをクリックして、オプションを設定します。

<img width="441" alt="スクリーンショット 2019-05-22 21.28.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239560/977208e5-0294-b7ae-e576-c4260d95c7d7.png">

製品版であれば、「iOS App Store」を選択、開発版であれば、「Development」、リモートでのテスト用では「Ad Hoc」を選択など、用途によって選択します。

<img width="747" alt="スクリーンショット 2019-05-19 15.32.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239560/aa2c4f46-6f7a-86af-a366-74766642da26.png">

ここではUploadを選択します。

次からはValidate Appでも選択したオプション選択になるので、用途に合わせて、選択していきます。
ただ、「Automatically manage singing」は意識的に選択しました。

最後に、Uploadを選択すると、アップロードが開始され、成功すれば、successfully uploadedと表示されます。

Androidより手順が複雑で大変な印象ですね。
しかも、他にも証明書やアプリの登録など手順がまだまだあります。
それに関しては、他でまとめたいと思います。

####参照
[[iPhone] アプリ申請のためXcodeでアップロードする](https://i-app-tec.com/ios/app-upload.html)
Windows10での~/.kube/config

# そもそもkubectlがkubeconfigとして読み込む順番

[こちら](https://qiita.com/shoichiimamura/items/91208a9b30e701d1e7f2#kubeconfig%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E6%8C%87%E5%AE%9A%E6%96%B9%E6%B3%95)を参考にさせて頂きました
ありがとうございます

> 1. --kubeconfig フラグで指定されたパス
> 1. $KUBECONFIG 環境変数に指定されたパス一覧
> 1. ~/.kube/config

# Windows10での~/.kube/config

kubeconfig、Linuxでいう```~/.kube/config```
このファイルにkubernetesクラスタのクレデンシャル情報をそのまま突っ込んであげればよいはず
デフォルトはここ

```
%USERPROFILE%.kube\config
```

# kubeconfigの中身を確認する

```kubectl config view```で表示される内容が、```kubectl```打った時に読み込まれてるやつ
なので、オプション付けたり環境変数に設定を入れてなければ、```%USERPROFILE%.kube\config```と同じクラスタの情報になるはず
逆にこれで違うクラスタの情報が表示されたら、環境変数が怪しいということになる

```
PS C:\> kubectl config view
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: DATA+OMITTED
    server: https://xxx.com:6443
  name: cluster01
contexts:
- context:
    cluster: cluster01
    user: cluster01-xxx-user
  name: cluster01-context
current-context: cluster01-context
kind: Config
preferences: {}
users:
- name: cluster01-xxx-user
  user:
    token: 省略
```

# その他の似たようなコマンド

今のところ、あんまり役立った記憶は無いですが…

### kubectl config get-clusters

```
PS C:\> kubectl config get-clusters
NAME
cluster01
```

### kubectl config get-contexts

```
PS C:\> kubectl config get-contexts
CURRENT   NAME                CLUSTER     AUTHINFO                NAMESPACE
*         cluster01-context   cluster01   cluster01-xxx-user
```

### kubectl cluster-info

```
PS C:\> kubectl cluster-info
Kubernetes master is running at https://xxx.com:6443
KubeDNS is running at https://c-xxx.com:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
```
勉強メモ[2019/05/22]

# はじめに  
LINEの新宿ミライナタワーでやっていた「Google I/O 2019 Recap at LINE」というイベントに参加してきました。そのレポートについて書きます。

# このイベントについて  
Googleが主催する開発者会議「Google I/O 2019」の報告会でした。開催時期は5月7~9日だったそうです。イベントの概要については[このページ](https://line.connpass.com/event/126375/)を参照してください。    
カンファレンスで扱われるトピックスはAndroid,Web,機械学習などが主です。今年のメインテーマは[「Bulding a more helpful Google for everyone」](https://blog.google/technology/developers/io19-helpful-google-everyone/)でした。  

最初に全体的なお話がありました。機械学習では、応用やプライバシーについて重点が置かれていたという感じでした。（例として[Live Caption](https://www.androidauthority.com/google-live-caption-983562/)など）また最新の「Android Q」や「Pixel」についての話題もありました。またYoutubuにて[レポート動画](https://www.youtube.com/playlist?list=PL80ip6bOwQsLAJVbwxvsphcO7mobxwNYu)もあるそうです。以下は走り書きのメモです。

# Androidについての話
## Kotlinに関して
- プロ開発者の半数が「Kotlin」を使用している
  - これからは「Kotlin First」と言われている
- Dark Theme
  - 環境、バッテリーの削減、アクセシビリティを改善する仕組み
  - Androidが自動的に色を計算してくれる
  - night修飾子を使う
- Gesture Navigation
  - Backボタンを引っ張るという動作に変更
  - Google社内では好評
- Jetpack Compose
  - 宣言的なUIの作成キット
  - onCreate()で呼出し
  - 既存なコードとの完全な互換性

## Android Studioに関して
- System Health
    - メモリ設定の自動推奨（1.2GB以上）
    - [ビルド速度向上](https://developer.android.com/studio/build/optimize-your-build?hl=ja)
    - ウイルス対策ソフトによるパフォーマンスの低下の改善
    - エミュレータのコマンド追加（停止と再開）
- Feature Polish
  - Navigation Editorの変更

# Webについての話
## Google Assistant
- [Interactive Canvas](https://developers.google.com/actions/interactivecanvas/)
  - Smart Display
  - Simulatorがある
  - Canvas APIで開発

## Chrome 
- [Detection API](https://io.perceptiontoolkit.dev/)

## [Lighthouse](https://chrome.google.com/webstore/detail/lighthouse/blipmdconlkpinefehnmjammfjpmpbjk?hl=ja)
- Site Performance
  - Litewalletという新機能の追加

# Securityについての話
- Yutube, Google mapでもセキュリティモードが使用可能になった
- Privacy Checklist
- Jetpack Security
- Content Security Policy(CPC)
    - noceを使ってコンテンツの許可の管理が可能
- Content Security Policy
- Fetch Metadata
- Cross Origin Opener Policyb
  
# [Futter](https://qiita.com/BingSyu/items/5398e440b22c44aa1927)についての話
- Flutter app
  - Flutter DEVELOPER UQEST
  - KENKEN
- [Codelabs](https://codelabs.developers.google.com/)
- Webアプリへの対応
- Multi Platform
  - 多様なデバイスへの対応（ウォッチやタブレットも）
- iOS
  - OSごとのUIの違いにFlutterが対応
- Dart
  - Productive
  - Fast
  - Multi-platform
  - 宣言的なUI
  - UI as code
    - UIの位置の関係や構造がわかりやすい

# さいごに
ほとんど走り書きのメモになったので、単語を並べるだけで精一杯でした。まあそこは適宜ググってもらって、とりあえず今回の発表内容の雰囲気だけでも掴んでくれればいいなと思います。
リンクを親要素いっぱいに広げる方法

リンクを親要素いっぱいに広げるには

自分が忘れないように、メモとして書き残します。

[HTML]

```
<div class="linkbox">
  <a href="#"></a>

</div>
```

[CSS]

```
.linkbox{
  width:300px;
  height:300px;
  position: relative;
}

.linkbox a{
  display: block;
  position: absolute;
  top:0;
  left:0;
  width:100%;
  height:100%;
}
```

以上です。
割と簡単。
Python個人的メモその1：入力編～標準入力とファイルからの入力～

# はじめに
初投稿です．
今までなんとなくPythonを触ってきて，分からないことがあったら都度調べる，みたいなことをやってきたのですが
それが煩わしい+やっぱり自分の言葉でまとめたいので個人的なメモを兼ねて書いていきます．

[#Python](https://scrapbox.io/mizuOutput/Python) でプログラミングをするにあたって，まず知っておかないといけないのは入力を受け取る方法．
大きく分けて二つ種類があると思っています．
1. 標準入力(≒キーボードからの入力)を受け取る
2. ファイルからの入力を受け取る

この二つについてそれぞれ入力を受け取る典型的な方法を示します．

# 標準入力
だいたいこのケースだとは思います．
inputという関数を使います．基本的にこれをやると一行の入力を取ってこれます．
入力が複数行にわたる場合は複数回行えばよいです．
ただ受け取るだけだとstr型なので，int(input())として数字として扱えるようにします．

```python:input_std
#input は基本的に1行を取る　forで回すと複数行取る
n=int(input())
string_list=[input() for i in range(n)]
#スペース区切りされた入力を一行分取ってきてリストに(内包表記)
a = [int(i) for i in input().split()]
```

一行に複数の入力がスペース区切りで与えられることもよくあります．
その場合は`map(処理，複数の処理対象)`をすればよろしくやってくれます．そのままlist()で包むとリストにできます．

```python:input_std2
#スペースで区切られていてもこれで取ってこれる
b, c = map(int, input().split())
#リストにぶちこむことも可能．
listA=list(map(int,input().split()))
```

スペースで区切られた入力が複数行ある場合，一行ごとにlistに包んでさらに別のリストに入れます．

```python:input_std3
listA=[] 
while True:
    try:
        listA.append(list(map(int,input().split())))
    except:
        break;
```
これらを組み合わせて，
`これから続くデータの数n(行数)`
`1つ目のデータのパラメータ1 1つ目のデータのパラメータ2`
`2つ目のデータのパラメータ1 2つ目のデータのパラメータ2`
…
`nつ目のデータのパラメータ1 nつ目のデータのパラメータ2`
といった入力を二次元配列に入れるという処理を一行で書けます．

```python:input_std4
'''
例えばこんな入力
3
1 2
10 18
4 8
'''
param_list = [list(map(int, input().split())) for i in range(int(input()))]
print(param_list)  #[[1, 2], [10, 18], [4, 8]]
```

##inputとsys.stdin.readline
sysというライブラリに，stdin.readlineという関数があります．
これをinputの代わりに使うことも可能です．また，こちらの方が高速です．
組み込みのinputを上書きして使う場合，このようになります．

```python:stdin

import sys
input = sys.stdin.readline

N = int(input())  #書き方は同じ
```



# ファイルを開いてそこから入力を受け取る
あらかじめすべてのテストケースが与えられて，それを適宜保存して，入力として用いて実行して結果を貼り付けろ，という形式もまれによくあります．
その場合はファイルの場所を指定して，openを用います．
readline()で一行ずつ読み込むことが可能です．それ以外は標準入力とほぼ同じように扱えます．

```python:input_file
path = 'input.txt'
#読み取り専用でオープン
file_data = open(path,"r")
#一行読み込み
line = file_data.readline()
#intにしてから変数に格納
a=int(file_data.readline())
#スペース区切りされているときのやり方も同じ
b,c = file_data.readline().split()
```

# おわりに

入力を扱えないと問題以前の問題です．
こんなところで時間をかけずにさっさと問題を解くためのアルゴリズムを考えていきましょう．

追記：fileinputというライブラリがあるそうです．
importして，`fileinput.input()`とすると実行時に引数としてファイルパスを指定するとファイルから読み込み(複数指定可)，しないと標準入力を受け取るという便利なものです．@c-yanさんありがとうございます．


# 追記：コマンドライン引数
コマンドラインからプログラムを実行時，プログラムへの入力として引数を受け取ることもあります．
`main.py 3 5`
といった感じですね．
そのような引数は`sys.argv[1:]`で受け取ることが出来ます．


```python:argv_sample
import sys

def main(argv):
    for i, v in enumerate(argv):
        #処理
    
if __name__ == '__main__':
    main(sys.argv[1:])

```

ついでに，PythonのIDEの一つ，Spyderでプログラム実行時コマンドラインで引数を渡す方法を示しておきます．
1. `Ctrl+F6`でファイルごとの設定を開く
2. コマンドラインオプションにチェックを入れ，引数を入力（例：`1 2`）
基本情報最年少で合格しました(31年春)

# 動機
本屋に行ったら、基本情報の本があったから、面白そうだったので、その本を買って受けた。

# 勉強法
- とにかく参考書を読む
- 基本情報ドットコムをする

# 当日の流れ
- 前日にはしっかりと寝る
- 朝に復習
- マークシートの記述ミス(ズレ)がないかしっかりとチェック
- ご飯をしっかり食べる
- 終わったら早速「ipa」を見ながら自己採点
様々なブラウザでCookie（クッキー）を削除する方法　～ Chrome, IE, Firefox ～

様々ブラウザでCookie（クッキー）を削除する方法です。

##対象ツール
Google Chrome
InternetExplorer
Firefox

##手順

###Google Chrome
1. 右上の「Google Chromeの設定」を押下
2. 「その他のツール」 > 「閲覧履歴を消去」を押下
3. 「Cookieと他のサイトのデータ」にチェックを入れ（デフォルトで入っている）、「データを消去」を押下

###InternetExplorer
1.　右上の「ツール」を押下
2.　「インターネットオプション」を押下
3.　小ウィンドウが開いたら全般タブ（デフォルト）の「削除」を押下
4.　「クッキーとWebサイトデータ」にチェックを入れ（デフォルトで入っている）、「削除」を押下

###Firefox
1. 右上の「メニュー」を押下
2. 「オプション」を押下
3. 「プライバシーとセキュリティー」を押下
4. 「Cookie とサイトデータ」欄の「データを消去」を押下
5. 「データを消去」小ウィンドウが開いたら「Cookie とサイトデータ」にチェックを入れ（デフォルトで入っている）、「消去」を押下

##参考
[キャッシュと Cookie の消去 | Google アカウント ヘルプ](https://support.google.com/accounts/answer/32050?co=GENIE.Platform%3DDesktop&hl=ja)
[Cookie を削除してコンピューターに保存されたウェブサイトの情報を削除する | Support moz://a](https://support.mozilla.org/ja/kb/delete-cookies-remove-info-websites-stored)
[Internet Explorer で cookie ファイルを削除する方法 | Microsoft](https://support.microsoft.com/ja-jp/help/278835)
Swiftの型キャストPART1

# 型をダウンキャストする方法
Swift における型変換について調べました。
`as?` 演算子の基本です。

## こんな継承したAnimal型があって

````swift:Animal型とその継承クラス
class Animal {
    // 体重とか
}

class Dog: Animal {
    var name: String
}

class Cat: Animal {
    var boxSize: Int
}

class Bird: Animal {
    let featherColor: Color
}
````

## こんな関数があって

````swift:Animal型を返す関数
func getPet() -> Animal {
    // return the pet
}

let pet = getPet()    //petはAnimal型
````

この時点で、`pet` の具体的な型は不明。
`Dog` かも知れないし、`Cat` かも知れないし、`Bird` かも知れない。

````swift:ペットの種類に合わせたタスク
func walk(dog: Dog) {
    // お散歩させる
    print("Walking with \(dog.name)")    
}

func cleanLitterBox(cat: Cat) {
    // ネコ用トイレを掃除する
    print("Cleaning the \(cat.boxSize) litter box")    
}

func cleanCage(bird: Bird) {
    // 鳥かごをキレイにする
    print("Removing the \(bird.featherColor) feathers")
}
````

ペットに合わせたタスクを行う関数があるけど、定数 `pet` を引数にするとエラーになる可能性がある。


## ダウンキャストして、適切にタスクを実行する
`as?` と `if-let` ステートメントを組み合わせて、型キャストしつつオプショナルをアンラップする。

````swift:ダウンキャストの例
let pets = allPetAnimals()    //あらゆる種のペットを含んだ配列

for pet in pets {
    if let dog = pet as? Dog {
        walk(dog: Dog)
    } else if let cat = pet as? Cat {
        cleanLitterBox(cat: Cat)
    } else if let bird = pet as? Bird {
        cleanCage(bird: Bird)
    } else {
        print("The type of this pet is unknown.")
    }
}
````
【Unity】カウントダウンの作り方

# 概要

![CountDown.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164430/cf51eff4-79d8-ecd0-dab1-93f489466ca7.gif)

このようなよくあるカウントダウンをDOTweenを使って実装した方法を書きました。

# 環境

Unity 2019.1.3f1

DOTween 1.2.235

# コード

```cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;
using TMPro;

public class CountDownPlayer : MonoBehaviour
{
    private TextMeshProUGUI textMeshPro;

    private CanvasGroup canvasGroup; 

    private void Start()
    {
        textMeshPro = this.GetComponent<TextMeshProUGUI>();

        canvasGroup = this.GetComponentInParent<CanvasGroup>();

        PlayCountDown();
    }

    private void PlayCountDown()
    {
        var sequence = DOTween.Sequence();

        sequence
            .OnStart(() => UpdateText("3"))
            .Append(FadeOutText())
            .AppendCallback(() => UpdateText("2"))
            .Append(FadeOutText())
            .AppendCallback(() => UpdateText("1"))
            .Append(FadeOutText())
            .AppendCallback(() => UpdateText("START"))
            .Append(FadeOutText())
            .OnComplete(() => Debug.Log("Do something"));
    }

    //テキストの更新
    private void UpdateText(string text)
    {
        InitializeAlpha();

        textMeshPro.text = text;
    }

    //フェードアウトさせる
    private Tween FadeOutText()
    {
        return canvasGroup.DOFade(0, 1.0f);
    }

    //アルファ値の初期化
    private void InitializeAlpha()
    {
        canvasGroup.alpha = 1.0f;
    }
}


```

# 補足

ここでは、とある別々のGameObjectが2つあることを想定しています。

1つは空のオブジェクトに`CanvasGroup`コンポーネントがアタッチされているだけのGameObjectです。(ここでは`StartUI`という名前を付けます)

もう１つは`TextMeshProUGI`コンポーネントがアタッチされており、カウントダウンの数字を表示するためのGameObjectです。(ここでは`CountDownText`と名前を付けます)

この2つのGameObjectの関係は親子です。`StartUI`が親で`CountDownText`が子です。

<img width="174" alt="スクリーンショット 2019-05-22 午後8.41.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164430/186e6242-e5f6-23e7-ab34-81c613e534ef.png">


# 参考

- [DOTweenをふわっとまとめてみた](https://qiita.com/kagigi/items/bdf4d42835add07b0077#sequence)

- [CanvasGroupとDoTweenでお手軽フェードイン・フェードアウト](https://qiita.com/RyotaMurohoshi/items/dca738fb69548aae3cfb)
Pythonでアクセス元IPのwhois情報を取得する

#概要
サーバ側でアクセス元のIPアドレスを取得して、そのIPアドレスのwhois情報を取得する方法。
Flaskフレームワークでの例を紹介します。

#アクセス元IPアドレスを取得
`request.remote_addr`でリクエストの送信元IPアドレスを取得できます。

```python
from flask import request
from flask import jsonify

@app.route("/get_ip", methods=["GET"])
def get_ip():
    return jsonify({'ip': request.remote_addr}), 200
```

#ipwhoisのインストール

```
pip3 install ipwhois
```
私の環境ではdnspython-1.16.0とipwhois-1.1.0がインストールされました。
#アクセス元IPアドレスのwhois情報を取得

```python
from flask import request
from flask import jsonify
from ipwhois import IPWhois

@app.route("/get_whois", methods=["GET"])
def get_whois():
    obj = IPWhois(request.remote_addr)
    whoisInfo = obj.lookup_whois()
    return jsonify({'whois': whoisInfo}), 200
```


#参考文献
・[クイックスタート — requests-docs-ja 1.0.4 documentation](https://requests-docs-ja.readthedocs.io/en/latest/user/quickstart/)
・[ipwhois · PyPI](https://pypi.org/project/ipwhois/)
・[Python Flaskを使って訪問者のIPアドレスを取得する] 
 (https://codeday.me/jp/qa/20181202/26342.html)
有料ソフトがクラックされたらどうするか (DMCA Takedown)

# ソフトがクラックされた
脱獄(改造)されたiPhoneで使用できる有料アプリを販売していたのですが、海外のクラッカーにクラックされました。
まあ、有料ソフトがクラックされるのは常かと思いますが、働きたくないため、対抗してみることに。

## クラック対策してなかったの？
してました。
当該ソフトウェアは、ほぼ常時インターネット接続必須で、AESCryptorを使用し、サーバーと通信、ライセンス認証を行う仕組みでした。
バイナリをHopperやIDAなどに突っ込めば鍵は見えてしまうため、LLVM Obfuscatorを使用し難読化していましたし、クラックされるとは
正直思っておらず、寝耳に水状態。

<img width="1454" alt="Screen Shot 2019-05-22 at 8.09.23 PM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185096/2d81f3a1-4d0c-7edb-f3e6-06aed4aed7cd.png">


## それでもクラックされる
/usr/lib/libSystem.B.dylibをimportするようになっていたのですが、
そこを書き換えられcrack用のdylibをインジェクトされ、敢え無く陥落。
しょうがないので、Crackしたデータを配布しているサイトからパッケージを削除させる方向にシフトしました。

## DMCA Takedown
2000年にアメリカ合衆国で施行されたデジタルミレニアム著作権法のおかげで、
著作権侵害のあるサイトをGoogleやサーバー会社に報告、削除させることが可能になりました。
今回はこれを利用します。

###Google (日本語OK)
まず、敷居が低いGoogleから紹介します。
[著作権侵害による削除](https://www.google.com/webmasters/tools/legal-removal-dashboard)または[技術的保護手段を回避するコンテンツの削除](https://www.google.com/webmasters/tools/legal-removal-dashboard)からDMCA Takedownリクエストを送信できます。
この２つの違いが日本語のヘルプページに乗っていないので不明ですが、個人的にPatchのような形であれば後者、それ以外は前者なのかな、と理解しています。
後者が前者に内包されているイメージ。
今回の場合、12時間以内に検索結果から削除されましたが、審査はしているんでしょうか・・・。
ちなみに、会社名は入れておくことをおすすめします。適当は駄目だと思いますが、リクエストの送信者は誰でも閲覧可能なことに注意しましょう。
<img width="576" alt="Screen Shot 2019-05-22 at 8.24.42 PM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185096/68a4e6bb-6fcb-a75b-7b6f-158b4440c67b.png">


###Cloudflare (英語)
意外なことに、Cloudflareを使用しているサイトに対してもDMCA Takedownをリクエストできます。
正確には、Cloudflare→サーバー会社、というフローでリクエストが転送される形で、
まともなサーバー会社なら対応してくれると思います。
リクエストはCloudflareの[Abuse form](https://www.cloudflare.com/abuse/form)から送信できますので、
Copyright Infringement&DMCA Violationsを選択して、必要項目を埋めればOK。
今回の場合、運良くまともなサーバーだったらしく、Crackedなソフトウェアが削除された上、IPアドレスが開示されました。
<img width="616" alt="Screen Shot 2019-05-22 at 8.29.04 PM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185096/c100b5dc-d7df-d95a-ca29-34f798eb8041.png">

##まとめ
完全な駄文かつ内容が薄いですが、要するに「Cloudflare使っててもDMCA Takedownはリクエストできるよ」というお話でした。
客層が広いとこううまくはいかないでしょうが、アプリ系だと割と使える・・・かもしれないです。
MySQL業務でよく使うコマンド集

業務でほぼ週に1度は使用SQL文を叩いているのでまとめようと思い、メモ代わりに共有できたらなと思います。

## データベース管理ソフト
データベースの管理はこれらの管理ソフトを使用するといいかと思います。
MacOSとWindowsで異なるので注意してください。

### MacOSの方
[Squel Proダウンロードページ](https://www.sequelpro.com/)

### Windowsの方
[HeidiSQLのダウンロードページ](https://www.heidisql.com/)

# コマンド集

## カラムの合計値
### SUM

SUM関数を使用することで、列の値の合計値を求めることができます。

```
mysql> SELECT * FROM test_table2;
+------+-------+
| name | score |
+------+-------+
| 太郎 |    80 |
| 次郎 |    70 |
| 三郎 |    92 |
| 四郎 |    88 |
| 五郎 |    76 |
| 太郎 |    75 |
| 次郎 |    98 |
| 三郎 |   100 |
| 四郎 |    80 |
| 五郎 |    60 |
+------+-------+
10 rows in set (0.00 sec)

mysql> SELECT SUM( score ) FROM test_table2;
+--------------+
| SUM( score ) |
+--------------+
|          819 |
+--------------+
1 row in set (0.01 sec)
```

## 条件検索の設定
### WHERE

SELECT文では指定したテーブル（FROM句）に対して、検索条件（WHERE句）にマッチするレコード（行）の指定フィールド（列）を表示します。SELECTに続くのは列名、と覚えましょう。

```
mysql> SELECT title, price FROM book_list
    -> WHERE
    -> author = 'auth_A';
+--------+-------+
| title  | price |
+--------+-------+
| book_A |  1500 |
| book_G |   400 |
+--------+-------+
```

## テーブル結合

DBからデータを取り出す際、複数テーブルからデータを検索して取得するといったケースも多々あるかと思います。

### 内部結合と外部結合
まず、２つのテーブルを結合する方法として、大きく内部結合と外部結合というものが存在しています。

**内部結合**は、それぞれのテーブルの指定したカラムの値が一致するものだけを結合します。

**外部結合**は、内部結合のようにそれぞれのテーブルの指定したカラムの値が一致するものを結合するのに加え、どちらかのテーブルにしか存在しないものに関しても取得します。

### INNER JOIN(内部結合)

JOINした２つのテーブルを比較し、結合条件に一致した行だけを返すことができます。

```
mysql> SELECT purchase.id_g, name FROM goods 
    -> INNER JOIN purchase ON purchase.id_g=goods.id_g;
+------+--------------------+
| id_g | name               |
+------+--------------------+
|    1 | 饅頭               |
|    1 | 饅頭               |
|    1 | 饅頭               |
|    2 | みたらし団子         |
|    2 | みたらし団子         |
|    4 | 抹茶団子            |
+------+--------------------+
```

### LEFT JOIN(外部結合)

JOINの左側のテーブルが結合条件に一致しなくてもレコードを返すことができます。

```
mysql> SELECT purchase.id_g,name FROM goods 
    -> LEFT OUTER JOIN purchase ON purchase.id_g=goods.id_g;
+------+--------------------+
| id_g | name               |
+------+--------------------+
|    1 | 饅頭               |
|    1 | 饅頭               |
|    4 | 抹茶団子           |
|    2 | みたらし団子       |
|    1 | 饅頭               |
|    2 | みたらし団子       |
| NULL | 八つ橋             |
+------+--------------------+
```

### RIGHT JOIN(外部結合)
JOINの右側のテーブルが結合条件に一致しなくてもレコードを返すことができます。

```
mysql> SELECT purchase.id_g,name FROM goods 
    -> RIGHT JOIN purchase ON purchase.id_g=goods.id_g;
+------+--------------------+
| id_g | name               |
+------+--------------------+
|    1 | 饅頭               |
|    1 | 饅頭               |
|    1 | 饅頭               |
|    2 | みたらし団子       |
|    2 | みたらし団子       |
|    4 | 抹茶団子           |
+------+--------------------+
```

## データ結合

### UNION

複数のSELECT文をまとめることが出来ます。

```
mysql> SELECT 1  AS NUM
    -> UNION
    -> SELECT 2 AS NUM;

+-----+
| NUM |
+-----+
|   1 |
|   2 |
+-----+
```
WebViewとネイティブのメリットデメリット

iOS App内で動作する簡易ブラウザ(WebView)と通信からUIまでアプリ内で完結するネイティブアプリのメリットデメリットをまとめてみました。

# **■WebViewのメリット・デメリット**

## **メリット**

* **コストが安い**
Web上にコンテンツがあり、それを流用したい場合、新規で開発することなく同じコンテンツを表示できます。

* **アプリストアへの申請・審査の不要**
ネイティブアプリの申請や審査が不要になります。
※ただし、部分的なWebView表示の場合ネイティブと変わらないので審査は必要です。

* **アプリアップデートの不要**
アプリの保守をする必要がないため、アプリ自体のアップデートがありません。
※仕様が変更された時は、アプリの動作を変更する可能性があるため、一概ではないです。

## **デメリット**

* **課金ができない**
Apple Store審査ガイドラインの規約違反になり、リジェクトされる恐れがあります。
※Webブラウザでの課金は可能(リンクをブラウザへ飛ばす必要あり)
引用：[Apple Store審査ガイドライン：3.1.1 App内課金](https://developer.apple.com/jp/app-store/review/guidelines/#in-app-purchase)

* **レスポンシブ対応**
画面解像度に応じたUI設計の対応が必要。
Webの表示をそのまま、アプリに適応させると表示崩れが起こる可能性がある。

* **脆弱性**
    1. 自社以外の外部アクセス

        URL直打ちで、自社ではないサイトにアクセスできる場合、悪用される恐れがある。
        外部アクセスできるサイトに制限を設ける必要がある。
    2. 端末内のファイルストリームにアクセスできる

        「file://」で始まるURI(※URLではない)でアクセスすることで、端末内部のファイルにアクセスすることができる。
        アクセスログからユーザー情報が漏洩されてしまう。
    3. iOSは、Cookieを保存しない

        アプリが終了するとCookieが消えるので、永続化する必要がある
    4. XSSの恐れ

        攻撃スクリプトを入力できてしまう。
        サニタイジング(無害化)する必要がある。

* **通信エラー場合の表示**
通信エラー場合のWebView画面を表示する前に、レスポンスチェックを行い、ネイティブの別画面を表示させる。
WebViewは通信した結果の表示なので、真っ白になったり、URLエラーになったりしてUI的に作りが悪い。

* **環境によっては表示が遅い**
Web通信が伴うため、通信環境によっては表示が遅い場合があります。

* **導線が不可能**
WebViewの誘導はできない。
![alt](https://support.ebis.ne.jp/wp-content/uploads/2014/05/%E3%82%A2%E3%83%97%E3%83%AA%E8%A8%88%E6%B8%AC%E5%9B%B3.png)

# **■ネイティブ画面のメリット・デメリット**

## **メリット**

* **Webではできない画面設計・操作設計ができる**
アプリ内のUIを使用するため、自由に画面設計を行うことが可能

* **導線設計が可能**
アプリに誘導できる

* **セキュリティ**
URL直打ちではないため、外部のサイトへアクセスさせることはないです。

## **デメリット**

* **コストが高い**
iOS / Androidの開発者が必要
開発言語が異なるため、それぞれの開発者が必要

* **アプリストアへの申請・審査**
ネイティブアプリの申請や審査が必要です。

* **アプリアップデートが必要**
保守でアプリ修正があった場合は、アップデートが必要

* **課金**
App内課金を(30%)手数料(30%)が発生する

## **引用**
https://appbu.jp/webapps-nativeapps
https://ja.developer.box.com/docs/android-security-guidelines
https://appkitbox.com/knowledge/android/20130819-84
https://teratail.com/questions/100872
https://mexess.blog/2018/08/03/post-304/
https://qiita.com/noboru_i/items/240ffcb2036f3b5cbc3b
https://qiita.com/noboru_i/items/bc39d95638e9e55437fa#cookie%E3%81%AE%E8%A8%AD%E5%AE%9A
https://qiita.com/i_nak/items/be0fac91bdc68aa165db
https://backapp.co.jp/blog/11594/
https://support.ebis.ne.jp/search_service/15033/
今日、「お気に入りのQiita記事」を選びました。

Qiita Jobsに登録するのに、

お気に入りのQiita記事

を選ぶ必要があった。

今さらなぜCPUエミュレータを自作しようとおもったのか？ @kanetugu2018
https://qiita.com/kanetugu2018/items/d692e612c3d4d715c0ad

お気に入りの記事に選んだ理由

```
必要な機能を実現するために必要となる最小の取り組みで実現する姿勢と考え方に納得。小さいものは単純で、必要があれば拡張性を持たせることができる。

役にたつリンクの一覧もついている。
```

この記事は、自分が尊敬する次の事例と並んで、現在の仕事のあり方を示すものだと感じています。

本田晋也 TOPPERS/JSP SH版
https://www.toppers.jp/oldjsp-download.html

竹内良輔　教育用移植　Monitor task
https://www.toppers.jp/edu-begin.html

邑中 雅樹　Pizza Factory(Eclipse クロス開発環境)
https://www.monami-ya.jp

中村晋一郎 Natural Tiny Shell Task
https://www.cubeatsystems.com/ntshell/

斉藤直希 TOPPERS/SSP(Smallest Set Profile)
https://www.toppers.jp/ssp-kernel.html

田中和明　mruby, mruby/c
https://www.s-itoc.jp/report/reaserch_results/469

長島宏明 Echonet Light
https://www.toppers.jp/ecnl.html

本として知った事例では、

![51HYm-LUi3L._SX390_BO1,204,203,200_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51423/bfc7bc67-9bee-9618-e78f-d80de205565b.jpeg)


12ステップで作る組込みOS自作入門,　坂井 弘亮, カットシステム, 2010
https://www.amazon.co.jp/dp/4877832394
ISBN  9784877832391

![51ATDABNHEL._SX369_BO1,204,203,200_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51423/75912406-a86d-85e0-387b-baff18ddc2d1.jpeg)


CPUの創りかた　渡波 郁, 毎日コミュニケーションズ, 2003
https://www.amazon.co.jp/dp/4839909865
ISBN 9784839909864


#文書履歴(document history)
ver. 0.01 初稿 20190522
ver. 0.02 中村、斉藤　追記 20190423
無料オンラインコース

## 専門

[ロボット向け人工知能](https://www.udacity.com/course/artificial-intelligence-for-robotics--cs373) カルマンフィルタ
[機械学習入門](https://www.udacity.com/course/intro-to-machine-learning--ud120)
[強化学習](https://www.udacity.com/course/reinforcement-learning--ud600) 4か月 上級
[ディープラーニング用TensorFlow入門](https://www.udacity.com/course/intro-to-tensorflow-for-deep-learning--ud187) 2か月 中級
[コンピュータビジョン入門](https://www.udacity.com/course/introduction-to-computer-vision--ud810) 4か月 中級
[時系列予測](https://www.udacity.com/course/time-series-forecasting--ud980) ARIMA 3週間 中級
[クラスタリング](https://www.udacity.com/course/segmentation-and-clustering--ud981) 3週間 中級
[アルゴリズム入門](https://www.udacity.com/course/intro-to-algorithms--cs215) 社会ネットワーク グラフ解析 4か月 中級
[実践微分方程式](https://www.udacity.com/course/differential-equations-in-action--cs222) 2か月 中級
[固有ベクトルと固有値](https://www.udacity.com/course/eigenvectors-and-eigenvalues--ud104) PCA 1週間 初級 固有値、固有ベクトルの計算を小さな行列で行うだけ。すぐ終わる。

## 環境構築

[Gitによるバージョン管理](https://www.udacity.com/course/version-control-with-git--ud123) 4週間 初級

## 就職関連

[アルゴリズム面接入門](https://www.udacity.com/course/data-structures-and-algorithms-in-python--ud513) 
[機械学習面接入門](https://www.udacity.com/course/machine-learning-interview-prep--ud1001) 1週間 中級
[データサイエンス面接入門](https://www.udacity.com/course/data-science-interview-prep--ud944)
[履歴書作成入門](https://www.udacity.com/course/refresh-your-resume--ud243)
[就職用GitHub](https://www.udacity.com/course/optimize-your-github--ud247) 1日 初級
[カバーレター入門](https://www.udacity.com/course/craft-your-cover-letter--ud244) 1日 初級

[udacity コース一覧](https://www.udacity.com/courses/all)
【Excel VBA】私が業務で使用しているおすすめのマクロ(VBA)

# 保存前に実施するマクロ
### 全シートA1を設定する。
体裁が整う。

```vb:ホームポジション()
Sub ホームポジション()
    Sheets(1).Activate
    Dim i As Worksheet
    For Each i In Worksheets
        i.Activate
        Range("G7").Select
        Range("A1").Select
    Next
    Sheets(1).Activate
End Sub
```

### 全シートの表示倍率を100%で統一する
体裁が整う。

```vb:表示倍率を統一する()
Sub 表示倍率を統一する()
  Dim n As Long
  Dim i As Long
  n = ActiveSheet.Index
  For i = 1 To Sheets.Count
    Sheets(i).Activate
    ActiveWindow.Zoom = 100
  Next i
  Sheets(n).Select
End Sub
```

# 便利マクロ

### ワンクリックでオブジェクトの選択
リボンから普通に登録できますが、vbだと以下のように書けます。

```vb:オブジェクトの選択
Sub オブジェクトの選択()
   Application.CommandBars.ExecuteMso ("ObjectsSelect")
End Sub
```
設定値は以下からファイルをダウンロードして参照できます。（Office 2016の場合）
[Download Office 2016 Help Filesr](https://www.microsoft.com/en-us/download/confirmation.aspx?id=50745 "Download Office 2016 Help Files: Office Fluent User Interface Control Identifiers from Official Microsoft Download Center")

参考元：本ページ@nukie_53さんのコメント

### 印刷設定の適用

```vb:印刷設定の適用()
Sub 印刷設定の適用()
    'InputBoxのメッセージ定義
    Dim strPrintMessage As String
    strPrintMessage = "印刷範囲をマウスで選択してください"
    'InputBoxでセル入力後、OKでセル範囲を格納
    Dim inputCell As Range
    Set inputCell = Application.InputBox(Prompt:=strPrintMessage, Type:=8)
    
    'InputBoxでキャンセルが押されたときは、処理を抜ける
    If inputCell Is Nothing Then
      Exit Sub
    End If
    
  '印刷設定定義
  Application.PrintCommunication = False
  With ActiveSheet.PageSetup
       .Orientation = xlPortrait
       .LeftMargin = Application.CentimetersToPoints(0.5)
       .RightMargin = Application.CentimetersToPoints(0.5)
       .TopMargin = Application.CentimetersToPoints(1.5)
       .BottomMargin = Application.CentimetersToPoints(0.8)
       .HeaderMargin = Application.CentimetersToPoints(0.5)
       .FooterMargin = Application.CentimetersToPoints(0.5)
       .CenterHorizontally = True
       .FitToPagesWide = 1
       .FitToPagesTall = 1
       .LeftHeader = "&F"
       .CenterHeader = ""
       .RightHeader = "&A" & vbCrLf & "&D"
       .CenterFooter = "&P/&N"
       .PrintArea = inputCell.Address
  End With
  Application.PrintCommunication = True
  'プレビュー表示
  ActiveSheet.PrintPreview
End Sub
```
参考元：https://kosapi.com/post-988/

### 全てのブックを保存せずに閉じる
上手く機能しないかも

```vb:全てのブックを保存せずに閉じる()
Sub 全てのブックを保存せずに閉じる()
  Application.Quit
End Sub
```
Cloud9 エラー: No space left on device の解決 (実際にスペースがない場合)


No space left on device というエラー。容量がないことを示すエラーだが、容量が余裕なのにこのエラーがでる怪奇現象もある見たい。今回は、ちゃんと容量がない時の対処法を書く。

ファイル容量を確認
`$df -h`
> Filesystem            Size  Used Avail Use% Mounted on
 /dev/sda1              15G   15G     0 100% /
 none                  312M     0  312M   0% /dev/shm

100%容量使っています。
解決方法: 容量を増やします。

#解決の流れ

https://console.aws.amazon.com/
上記AWSコンソールから操作する。

###1 インスタンス停止 
公式 https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/Stop_Start.html
右側のナビゲーターペインで、、

>インスタンスを選択　→  容量を増やしたいワークスペースのアベイラビリティ(us-east-xx)を確認し、選択して、アクション→状態→停止 をしておく 


###2　ヴォリュームデタッチ
右側のナビゲーターペインで、、

>Volumeを選択　→　容量を増やしたいワークスペースのアベイラビリティ(us-east-xx)を確認し、選択して、アクション→ボリュームのデタッチ  
*あとで使うのでボリュームIDをコピーする

###3 ボリュームのスナップショットをとる
右側のナビゲーターペインで、、

>スナップショットを選択　→　スナップショットの作成
ボリュームIDをペースト、コメントは任意だけどワークスペース名とか入れると作業しやすい。

###4 スナップショットを使って新しいボリュームを作る
>そのままスナップショットの画面で、スナップショットを選択し、アクションから、ボリュームの作成を選択。
大きさはスナップショットより大きくなるようにする。
アベイラビリティゾーンは、該当ワークスペースのものを選択する。


###5 スナップショットのアタッチ
 公式 https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ebs-restoring-volume.html
右側のナビゲーターペインで、、

>ボリュームを選択　→　製作したスナップショットを選択し、アクションからボリュームのアタッチをする。このときのインスタンスIDは、アタッチ先のもので。手順1で訪れたインスタンスの画面から確認できる。
####注 この時重要なのが、デバイスがデフォルトで`/dev/sdf`となっているが、Cloud9なら、`/dev/xvda` としないと、インスタンスの起動に失敗する。  ( `/dev/xvdf` という情報があるが筆者は`/dev/xvda` でうまくいった) 

<hr>
状態がin-use になったら、ワークスペースにアクセスしてインスタンスを起動できるはず。
<footer>
参考 
https://stackoverflow.com/questions/6151695/ec2-instance-on-amazon-and-i-am-greeted-with-no-space-left-on-the-disk
</footer>
PDFSharpをVS2015で使う

久し振りにPDFSharpを使う機会があったので、メモ。

(1)NuGetにあった。

Visual Studio 2015 を使っているのだけど、NuGetで「PDF Sharp」を検索すると、取得できた。

(2)使えるフォントが減っていた。

前は、日本語としては「游明朝」、「游ゴシック」が使えたのだけど、今回「Error while parsing an OpenType font.」エラーが発生して、「游ゴシック」が使えなかった。

それではと思い立って、以下を書いてテストしたところ、日本語フォントは、ぱっと見たところ「游明朝」以外は全滅。
また、「HG丸ｺﾞｼｯｸM - PRO」などは、エラーにはならないけど日本語は文字化けで使えず。

```c#:c#
        protected void Button1_Command(object sender, CommandEventArgs e)
        {
            using(PdfDocument document = new PdfDocument())
            {
                PdfPage page = document.AddPage();
                page.Size = PageSize.A4; //用紙の大きさ
                page.Orientation = PageOrientation.Landscape; //用紙の向き
                XGraphics graphics = XGraphics.FromPdfPage(page);

                var sb = new StringBuilder();
                System.Drawing.Text.InstalledFontCollection ifc =
                    new System.Drawing.Text.InstalledFontCollection();
                FontFamily[] ffs = ifc.Families;
                foreach(FontFamily ff in ffs)
                {
                    string buf = "";
                    try
                    {
                        using(Font fnt = new Font(ff, 8))
                        {
                            buf = fnt.Name;
                            var pdf_ja_font_options = new XPdfFontOptions(PdfFontEncoding.Unicode, PdfFontEmbedding.Always);
                            var pdf_ja_font = new XFont(buf, 12, XFontStyle.Regular, pdf_ja_font_options);

                            graphics.DrawString("こんにちわ世界", pdf_ja_font, XBrushes.Black,
                            new XRect(0, 0, page.Width, page.Height), XStringFormats.Center);
                        }
                    }
                    catch(Exception ex)
                    {
                        buf += ":" + ex.Message;
                    }
                    sb.AppendFormat("{0}\n", buf);
                }
                string file = @"C:\work\フォント調査.txt";
                using(StreamWriter sw = new StreamWriter(file, true, Encoding.Default))
                {
                    sw.Write(sb.ToString());
                }
            }
        }
```

IPAexフォントは、明朝、ゴシック共に正しく表示されたっぽいので、これを埋め込むことにする。
https://ja.osdn.net/projects/ipafonts/

Noto Fontsも使えそうなのだけど、埋め込むとPDFのサイズがすごいことになるので
(やり方が悪いのかも知れないのだけれど600倍以上になった)、今回はパス。

使えるフォントがとても限られるので、ちょっと不安。
ArrayAccessでコード補完（PhpStormネタ）

`ArrayAccess`を使うとオブジェクトを配列のように使えます。

その際、いくつかメソッドを追加するのですが、返り値を指定することができます。
こんなコード。

```php
    /**
     * @param mixed $offset
     * @return Hi
     */
    public function offsetGet($offset) {
        ....
    }
```

するとコード補完ができた。

<img width="763" alt="スクリーンショット 2019-05-22 18.54.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31171/72276217-1754-0328-5134-8f48361604f3.png">

この「`e()`」が補完したいメソッド。

なお、`$this`ではだめだった。
PhpStormのバージョンは2019.1を利用。

### コード

一応、クラスとコード。

```php
class Hi implements ArrayAccess
{
    private $hi = '';
    public function e() {
        return $this->hi;
    }
    /**
     * @param mixed $offset
     * @return Hi
     */
    public function offsetGet($offset) {
        $this->hi .= $offset;
        return $this;
    }
    public function offsetSet($offset, $value) {}
    public function offsetUnset($offset) {}
    public function offsetExists($offset) {
        return false;
    }
}

$hi = new Hi();
echo $hi['h']['i']->e();
```
PDFsharp

この記事はVisualStudio2013の時の記事。
[VisualStudio2015の記事はこちら。](https://qiita.com/KazTag/items/a530b180f6f97fdbf5d0)

PDFsharpという、PDF編集ライブラリがある。
.NETからPDFを作成する事が出来る。命令で、文字も書けるし、線も引ける。
MITライセンスとの事で、同ライセンスは、Wikiによると、
“このソフトウェアを誰でも無償で無制限に扱って良い。ただし、著作権表示および本許諾表示をソフトウェアのすべての複製または重要な部分に記載しなければならない。”
“作者または著作権者は、ソフトウェアに関してなんら責任を負わない。”
との事なので、コピーライトを書けば、商用利用も可能なんじゃないかな。
多分。

ASP.NETからでも、参照設定にPdfSharp.dllを追加すれば使えたよ。
游明朝か游ゴシックにフォントを限れば、日本語の利用も可能。
以下、ASP.NET(C#)での、簡単な例。

```c#:c#
using PdfSharp;
using PdfSharp.Drawing;
using PdfSharp.Pdf;
using PdfSharp.Pdf.IO;

// 中略...

protected void Button1_Click( object sender, EventArgs e)
{
  PdfDocument document = new PdfDocument();
  PdfPage page = document.AddPage();
  page.Size = PageSize .A4; //用紙の大きさ
  page.Orientation = PageOrientation .Landscape; //用紙の向き

  XGraphics graphics = XGraphics .FromPdfPage(page);

  var pdf_ja_font_options = new XPdfFontOptions (PdfFontEncoding .Unicode, PdfFontEmbedding.Always);
  var pdf_ja_font = new XFont( "游明朝" , 12, XFontStyle.Regular, pdf_ja_font_options);

  graphics.DrawString( "こんにちわ世界" , pdf_ja_font, XBrushes.Black,
new XRect (0, 0, page.Width, page.Height), XStringFormats.Center);
  
  XPen pen = new XPen( XColors .Red, 4); //線を引く
  pen.DashStyle = XDashStyle .Dash;
  graphics.DrawLine(pen, 10, 20, page.Width - 10, 20);
  graphics.DrawLine(pen, 10, page.Height - 20, page.Width - 10, page.Height - 20);

  document.PageLayout = PdfPageLayout.OneColumn; //幅一杯に表示

  string filepath = @"C:\Users\..(中略)..\asp_pdf\asp_pdf\pdf" ;
  string filename = filepath + @"\HelloWorld.pdf" ;
  document.Save(filename);

  string openfilename = "./pdf/HelloWorld.pdf" ;
  Response.Redirect(openfilename); //PDFに遷移
}
```


------------------------------
Creator of PDFsharp is empira Software GmbH
Kirchstrase 19 53840 Troisdorf Germany
www.empira.de
PDFsharp (R) is a registered trademark of empira Software GmbH

------------------------------
昔別のブログに書いた記事なのだけど、珍しくアクセス数が多かったのでこちらにお引越し。
初出 2016-04-24
Pythonの特殊な引数 *args **kwargsの意味

# はじめに

Pythonのデコレータで、ラッパー関数の引数が`def wrapper(*args, **kwargs):`となっているのを見て、`*args`や`**kwargs`はどういう物？と思い、調べてみました。

# 関数の引数として使う `*args`や`**kwargs`

関数の引数で、`*args`や`**kwargs`を使うと、どんな引数でも受け取れる関数が作れます。
`*args`は任意の数の引数を許可し、`args`という名前のタプルに割り当てられます。
`**kwargs`は任意の数のキーワード引数を許可し、`kwargs`という名前の辞書(dict)に割り当てられます。

## サンプルコード

```py:python
def fn(*args, **kwargs):
  print("*args:", args)
  print("*kwargs:", kwargs)

#(1)任意の数の引数を指定
fn(11, "aa", ["ラーメン", "素麺"])
#-> *args: (11, 'aa', ['ラーメン', '素麺'])
#-> *kwargs: {}

#(2)任意の数のキーワード引数を指定
fn(key1=22, key2="bb", key3=["パスタ", "スープ"])
#-> *args: () 
#-> *kwargs: {'key1': 22, 'key2': 'bb', 'key3': ['パスタ', 'スープ']}

#(3)混在
fn(11, "aa", key1=22, key2="bb")
#-> *args: (11, 'aa')
#-> *kwargs: {'key1': 22, 'key2': 'bb'}
```

# アンパック引数として使う `*args`や`**kwargs`

別の使い方で、リストや辞書(dict)を引数として渡すとき、先頭に`*`や`**`をつけると、リストや辞書を分解して引数に渡せます。

## サンプルコード

リストをアンパックして、各要素の値を引数で渡す例

```py:python
def sample(p1, p2):
  print("p1=", p1)
  print("p2=", p2)

params = [111, "AAA"]
sample(*params)
#-> p1= 111
#-> p2= AAA
```

辞書(dict)をアンパックして、各要素の値をキーワード引数で渡す例

```py:python
def sample(foo, bar):
  print("foo=", foo)
  print("bar=", bar)

params = { 'foo': 222, 'bar': "BBB" }
sample(**params)
#-> foo= 222
#-> bar= BBB
```
Office365ではデフォルトで64Bit版がインストールされる

<h1>64Bitがデフォルトに</h1>
少し前までは「64BitOSでも32BitのOfficeが入る(デフォルトが32Bitだった)」仕様だったOfficeが、いつの間にか64Bitがデフォルトになったようです。

https://support.office.com/ja-jp/article/64-ビット版または-32-ビット版の-office-を選択する-2dee7807-8f95-4d0c-b5fe-6c6f49b8d261?wt.mc_id=scl_installoffice_home
>インストール プロセスを始める前に、明示的に 32 ビット版を選択しなければ、64 ビット版の Office が自動的にインストールされます。

<h1>ただし例外も</h1>
ただし、すでに32BitのOfficeがインストールされている環境の場合は32Bitが優先的にインストールされるようです。(64Bitと32BitのOfficeが共存できないため)

<h1>どちらがいいのか？</h1>
[先のリンク](https://support.office.com/ja-jp/article/64-ビット版または-32-ビット版の-office-を選択する-2dee7807-8f95-4d0c-b5fe-6c6f49b8d261?wt.mc_id=scl_installoffice_home)に双方のメリットが書いてあります。かつて「64Bitの能力を必要とするアプリはない」という話を聞いたことがあるので、それだけ進化したということでしょうか。
なお、ExcelのVBAやAccessで開発したものが存在する場合、64BitのOfficeでそのまま動かすことはできないために32Bitをインストールしたほうが手間がありません。
https://docs.microsoft.com/ja-jp/previous-versions/office/ee691831(v=office.14)
関数の記述を簡略化できる、アロー関数(=>)   by「JavaScript コードレシピ集」

# 0. 前提

[「JavaScriptコードレシピ集（技術評論社）」](https://gihyo.jp/book/2019/978-4-297-10368-2)の下記を参照しています。

>Chap1 JavaScriptの基礎
>>* 012 アロー関数(=>)で関数を定義したい


# 1. アロー関数とは？

```
// Syntax
(引数) => | 処理内容 |        // 関数を定義する
```

>関数を定義する方法は、function宣言の他にアロー関数というものもあります。アロー関数のメリットはふたつあります。

>>1. 関数を簡略化して記述可能
2. thisを束縛できる
(「JavaScript コードレシピ」P.44から引用)

## 2. アロー関数で関数を定義

```javascript:JavaScript

// 関数の定義
const calcSum = (a, b, c) => {
  const result = a + b + c;
  return result;
};
```

```javascript:JavaScript

// 関数の実行(functionと同じ)
calcSum(1, 2, 3);
```

## 3. アロー関数の省略記法

1. 引数が１つのときは「カッコ()」を省略できる<br>
(引数が0個か、2個以上のときは省略不可)

```javascript:JavaScript

// 関数の宣言
const myFunction = (a) => {
  return a + 2;
};

// 関数の宣言 | カッコを省略
const myFunction2 = a => {
  return a + 2;
};
```



2. アロー関数内の処理が1行のとき、{}とreturnを省略できる 

```javascript:JavaScript

// 関数の宣言
const myFunction3 = (a) => {
  return a + 2;
}

// 関数の宣言 | {}とreturnを省略
const myFunction3 = (a) => a + 2;
```
AutoLayoutとStackViewを駆使して、縦と横で異なるレイアウトを設定する。

iOSアプリを開発しているとき、縦と横でレイアウトがちょっと異なるアプリを作りたいときがあります。
ほとんどはAutolayoutを適切に設定すればなんとかなりますが、下記イメージのように、部品の位置が変わったり、縦のときは２行、横のときは１行にしたいなどの場合があり、設定に悩みます。
![たて.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30218/6781ab64-448d-8376-33ce-350dbc2702ff.png)縦イメージ
![よこ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30218/5d609349-f0d4-2e9e-b5b5-7a7b556d5487.png)横イメージ

今回、AutoLayoutとStackViewを駆使すればなんとかなったので、その設定方法を説明します。

まず縦画面状態で部品を配置します。
まだAutolayoutは設定していません。
![スクリーンショット 2019-05-22 18.00.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30218/cf642d26-1588-7e69-190b-5bae3aaa977f.png)

配置後、画面下の部品をStackViewに入れていきます。
縦StackView
- 横StackView
- - View
- - View
- - View
- 横StackView 
- - View
- - View
- - View

赤い警告がでていますが、一旦無視で進めます。
![スクリーンショット 2019-05-22 18.11.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30218/8fe54e66-5198-1ad3-94bf-ab8f696dbf9a.png)

画面下部のVary for Traitsを押し、Heightを選択し
AutoLayoutを設定していきます。
こうすることで、縦モード時のみ有効になる制約を設定できます。
![スクリーンショット 2019-05-22 18.22.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30218/931a51a9-1ecc-1ea0-c730-0fa4fb0570df.png)

続いて横モード時のみ有効になる制約を設定していきます。
Orientationを横にし、Very for TraitsはHeightを選択します。
![スクリーンショット 2019-05-22 18.24.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30218/500d8f05-8586-4a81-ef8c-1354386ec3a7.png)

外側のStackViewのAxis設定に、HeightがCompact時はHorizontalに設定します。
こうすることで、横モード時は横並びのStackViewにすることができます。
![スクリーンショット 2019-05-22 18.26.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30218/8e583d8e-04b3-4686-3cdd-969d5c1e5bc8.png)

一通りの制約設定とStackViewの設定が完了しました。
![スクリーンショット 2019-05-22 18.29.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30218/3413f811-fb01-eb4e-b7b1-704abe96772f.png)

動かしてみたところ
![May-22-2019 18-40-38.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30218/412d6b3d-4846-fe4f-6d35-462a4d706186.gif)
「プリミティブ型／オブジェクト型」データ型の意味を知る  (JavaScriptコードレシピ)

# 0. 前提

[「JavaScriptコードレシピ集（技術評論社）」](https://gihyo.jp/book/2019/978-4-297-10368-2)の下記を参照、データ型についてまとめました。

>Chap4 データについて深く知る
>>* 074 データの型について知りたい
>>* 076 データの型を調べたい

# 1. データの型について知る

|データ型|意味|
|---|---|---|
|プリミティブ型(基本型)|データそのもの|
|オブジェクト型(複合型)|データを参照するデータ|

>JavaScriptで取り扱う数値、文字列、真偽値、オブジェクトといった値はすべて「型」（データ型）という区切りで分けられます。その違いは、「データそのもの」か「データを参照するデータ」かです。プリミティブ型（基本型）は、数値、文字列などの「データそのもの」です。プリミティブ型はさらに6種類に分類されます。
(「JavaScriptコードレシピ集」P.174)

## 1.1 プリミティブ型 
|プリミティブ型|意味|データの例|
|---|---|---|
|Boolean|真偽値の型|true,false|
|String|文字列の型|'鈴木'、'田中'|
|Number|数値の型|1,30|
|Undefined|値が未定であることを示す型|undefined|
|Null|値が存在しないことを示す型|null|
|Symbal|シンボルの型|Symbol()|

```javascript

// データ100を「参照」
const num = 100;
```

```javascript

// データ'鈴木'を「参照」
const str = '鈴木';
```

## 1.2 オブジェクト型

|オブジェクト型|意味|データの例|
|---|---|---|
|Object|オブジェクトの型|プリミティブ型以外のすべて(Array、Object、Data等)|

```javascript
// [配列]
// データ1,2,3を参照するデータ
const arr = [1, 2, 3];
```

```javascript

// [連想配列]
// キーageでデータ18を、キーnameでデータ'鈴木'を参照するデータ
const obj = {
  age: 18,
  name: '鈴木'
};
```

```javascript

// [配列]
// 3つのオブジェクト(Object)を参照するデータ
// 各オブジェクトはさらに数値や文字列データを参照
const arr = [
  {id: 10, name:'鈴木'},
  {id: 20, name:'田中'},
  {id: 30, name:'田中'}
]
```

# 2. データの型を調べる

### Syntax

```javascript

typeof 値   //値のデータ型を調べる
```

|データ型|typeofの結果|データの例|
|---|---|---|
|Undefined|undefined|undefined|
|Null|object|null|
|Boolean|boolean|true,false|
|String|string|'松本','浜田'|
|Symbol|symbol|Symbol()|
|Number|number|1,10,20|
|Object(関数を除く)|object|[1,2,3],{id:10,name:’浜田’}|
|関数|function|function(){},class MyClass{}|

## 2.1 データ型の出力(console.log(typeof 値))

```javascript

console.log(typeof true); // 'boolean'

console.log(typeof 10);   // 'number'

console.log(typeof '鈴木'); // 'string'

console.log(typeof null);  // 'object'

console.log(typeof undefined); // 'undefined'

console.log(typeof Symbol())   // 'Symbol'

console.log(typeof [1,2,3]);   // 'object'

console.log(typeof {id: 10, name:'田中'});  // 'object'

console.log(
　typeof function() {
     console.log('test');
  }
); // 'function'

console.log(typeof class MyClass {}); // 'function'
```
Dockerの使い方

# Dockerの基本概念
Dockerとはアプリケーションを開発・移動・実行するためのプラットフォームです。
設計思想は開発者が簡単にアプリケーションを動かす環境を作る。

## Docker Container
- 実際動かすアプリケーションの環境
- コンテナ毎にリソースをもつ
- 仮想環境と同じような考え方ですが、コンテナはアプリケーション単位
- 整合性の高いアプリケーションや、それに関する環境設定を同じコンテナに設定すればよい

## Docker Image
- コンテナを実行するためのファイルシステム
- 仮想環境のイメージファイルと相当
- バージョン管理はGitlabなどのWebサービスを利用してもよいし、ローカルでも管理出来ます。

## Docker File
- イメージを作成するための設定ファイル。
- Imageの環境構築手順を書けます。
- ソースファイルと一緒に管理し、デプロイする度に呼び、該当バージョンのイメージを作成

## Docker yaml
- DockerFileとほば同じ役割
- DockerFileより、書きやすい
- その他は勉強中。。。

# Dockerのインストール
[最新版をダウンロード](https://docs.docker.com/docker-for-mac/install/)して、インストールだけ
検証手順：https://qiita.com/kurkuru/items/127fa99ef5b2f0288b81

# Docker Fileの作り方
- ファイル名「Dockerfile」としてファイルを新規作成
- `FROM`でベースになるイメージを指定
- `RUN `、`CMD`などで実行コマンドを必要に応じて追加

```
FROM python:3.6

COPY . /app
WORKDIR /app

RUN pip install -r /app/requirements.txt
CMD python DemoApp/src/run_server.py
```

# Docker Imageの使う方
#### DockerFileからイメージを作成する 
```
docker build -t admin/httpd .
```
現在のフォルダにあるDockerFileにより、「admin/httpd」という名前のイメージを作成する

#### コンテナからイメージを作成する
```
docker commit demo-container demo/img:qa 
```
コンテナ「demo-container」をベースに名前「demo/img」タグ「qa」のイメージを作成する

#### イメージ一覧の表示
```
docker images
```
現在ローカルにあるイメージの一覧を表示する

#### イメージの削除
```
docker rmi demo/img
```
名前「demo/img」のイメージをローカルから削除する

#### イメージの更新
```
docker pull demo/img
```
名前「demo/img」のイメージの最新版を取得

# Docker Containerの使う方
#### 既存コンテナの一覧を表示
```
docker ps
```
各コンテナの状態も見えます。

#### イメージファイルからコンテナを生成し、起動する
```
docker run admin/httpd
```
名前「admin/httpd」のイメージでコンテナを生成し、起動する

よく使うオプション：

- `--name` コンテナ名を指定
- `-d` 起動後にバックグランドで実行
- `-i` 起動時に STDOUT を開きっぱなしにしてくれる
- `-e` 環境変数の指定
- `-p` ポートの開放
- `-v` ホストディレクトリをコンテナにマウントする

#### 作成したコンテナに対する操作
- コンテナを起動

```
docker start admin/httpd
```
- コンテナを停止

```
docker stop admin/httpd
```

- コンテナを再起動

```
docker restart admin/httpd
```

#### コンテナを削除
```
docker rm admin/httpd
```
削除前に停止する必要があります。

# Docker yamlの作り方
学習中
https://qiita.com/yuta-ushijima/items/d3d98177e1b28f736f04
https://qiita.com/zembutsu/items/9e9d80e05e36e882caaa

# 参考リンク
https://qiita.com/curseoff/items/a9e64ad01d673abb6866
https://www.slideshare.net/zembutsu/docker-images-containers-and-lifecycle
https://qiita.com/tera_shin/items/8a43e904bd15990d3129#%EF%BC%97%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E4%B8%80%E8%A6%A7

# 後続の調査方向:Kubernetes
swagger-uiとredocをローカルで手早く動かす方法

Swagger, OpenAPIのドキュメント表示で一番使われてるやつ[^1] を手軽に手元で動かしたい時

## TL;DR

```sh
# docker-compose.yml取ってくる
wget -O docker-compose.yml https://git.io/fjEfu
# 起動
docker-compose up -d
# swagger-ui開く
open http://localhost:8080
# redoc開く
open http://localhost:8081
```

## 手元にある`openapi.json`を読み込ませたい時

```sh
# サンプルのopenapi.jsonをDLする
wget https://generator3.swagger.io/openapi.json
```

`docker-compose.yml`と同じディレクトリに`openapi.json`がある場合、こんな風に編集すればOK


```diff
    environment:
--      SPEC_URL: https://generator3.swagger.io/openapi.json
++      SPEC_URL: /openapi.json
++    volumes:
++      -  ./openapi.json:/usr/share/nginx/html/openapi.json
```

- nginxのデフォルトの公開ディレクトリ`/usr/share/nginx/html` にopenapi.jsonがマウントされるようにしただけ

[^1]: [DL数](https://www.npmtrends.com/bootprint-vs-redoc-vs-swagger-codegen-vs-spectacle-vs-swagger-ui)見る限りこの２つ以外は、飛沫状態だった