OmniAICreator/Qiita-1.07M huggingface dataset:
最強の図面作成ツールは「モノ」撮影だ。怠惰なエンジニアのためのお絵かき術・説明術。

# たとえばQiitaに絵・図入りで記事を書きたいと思う時

- ハードルが高すぎる。
- 僕らエンジニアにはお絵かき・図面作成センスなんかない。
- それでなんど絵の掲載、図面掲載を諦めたことか。

# そもそもソフトウェアと絵・図面の親和性が低い

- どんなお絵描きツール、図面作成ツールも一長一短。
- MacBookじゃお絵かき出来ない。マウスでお絵かきとかいつの時代。
- モニタでお絵かきできるWindowsもあるかもだけど、指紋ベタベタになりそう。

# ソフトウェアで絵や図を書くのは一瞬では出来ない

- タブレットもアプリを開くのに時間がかかる。
  - 持ち歩くのも重い。
- たったひとつの、頭に思いついた絵を描くだけにしては、初動スピードがおそすぎる。
- 紙と鉛筆はその面は本当に優れている。

# 紙やホワイトボードなんか持ち歩けない。物理世界にも限界を感じる。

- 言わずもがな。
- 僕らエンジニアですし。


# スマートフォンで出来ることをしたい。

- スマートフォンなら誰でも持ち歩いている。

# モノを撮影する

- 物事の説明がうまい人は、よくモノを使うじゃない。
- それを絵や図面作成にも適応すれば良い。
- あとはテキストで説明をつければ良い。

# モノ撮影の実例

- これがスタックだ！
- 撮影したのはスターバックスだ！
- 的な。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/bf2a5e85-73a6-1d06-29e2-bcdfb6635a1e.png)


![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/01af19c5-f9dd-a931-6573-e9215f85dff9.png)


# スマホとPCは爆速で同期させておく。

- GooglePhotoの同期がおすすめ
- iPhoneのカメラロールとも同期できる
- 何らかの方法で爆速同期されるようにしておこう

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/12407fc8-8e56-e3f7-c108-c6f7db675a8d.png)

# 手や指や体も使える

- 僕らの身体も物理アイテムじゃないか。
- 神レベルで柔軟すぎるでしょう。このインターフェイスを神様ありがとう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/e9e48aea-eb9a-b43d-b303-9588d3248ff0.png)

# あわせて書きたい

- スマホとPCの写真を爆速で共有させるための試行錯誤。

# Hello new world

- [yumainaura 図 - Google Search](https://www.google.co.jp/search?q=yumainaura+what&oq=yumainaura+図&aqs=chrome..69i57j69i60l3j69i64l2.5499j0j4&sourceid=chrome&ie=UTF-8)









<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
rails チュートリアル　7章について

#  rails チュートリアル　7章　
rails チュートリアルを一周して、まだ不安な章をもう一回勉強。その時のメモ書き。自分なりに忘れそうなところしか書いてないです。

## デバッグ
```
<%= debug(params) %>
```
このコードをapplication.html.erbのbody部分に書くと、常にデバッグが表示される。
基本的にデバッグ情報は開発環境だけに表示されれば良いので（逆に本番環境では表示させたくない）

```
<%= debug(params) if Rails.env.development? %>
```

このようにif文を入れて開発環境だけでデバッグ表示することが多い。

またこの方法はviewにしか出ないのでcontrollerやmodelのデバッグはわからない。
view以外の方法は、pry-byebugやbyebugというgemを使う方法がある。（この章ではbyebugを使っている。）

byebugはdebuggerメソッドを使ってデバッグを確認する。使い方は簡単で、debuggerというコードを気になる箇所に書くだけ。（Ctrl-Dで抜け出せる）

## Gravatar
Gravatarとは無料で画像とメールアドレスを結びつけるサービス。画像のアップロードの手間を省いたり、画像の保存先に適している。

使い方はhelperでメールアドレスや画像を設定してそれをviewで表示させる感じ。7章を見ればだいたい使い方はわかる。

## form_forについて

何も考えずに使いがちなform_forですが改めて。

```
 <%= form_for(@user) do |f| %>
      <%= f.label :name %>
      <%= f.text_field :name %>
 <%= f.submit "Create my account" %>
```
この時に大事なのは　form_forの引数である@user。
全てのRubyオブジェクトは自分のクラスを知っているので、railsは@userのクラスがUserであることを暗黙でわかっている。（これがいわゆるオブジェクト指向）
これにより、@userがUserクラスにないならcreateアクション。@userがUserクラスにあるならupdateアクションに振り分けられる。

## 　Strong Parameters

```
@user = User.new(params[:user])
```
このようにして新規ユーザーを作成しようとすることは間違っていないが、この書き方だとセキュリティの面で良くない。
その理由は、paramsハッシュを初期化する行為は、admin(Webサイトの管理者かどうかを表す属性)を簡単に書き換えることができてしまうからである。

なのでそれを阻止するために、paramsハッシュではuser属性を必須とし、名前、メールアドレスの属性を許可しそれ以外を許可しないように設定する。

```
params.require(:user).permit(:name,:email)
```


さらにuser_parmamsはUsersコントローラーのみで使用されweb経由で外部に晒されないため、privateキーワードを使って外部から使えないようにする。

## その他

1.empty?メソッドとany?メソッドは互いに補完しているメソッド。

2.pluralizeはhelperオブジェクトを通して使える。（引数に対して単数形や複数形にするメソッド）

```
>> helper.pluralize(2, "woman")
=> "2 women"
>> helper.pluralize(3, "erratum")
=> "3 errata"
```

3.flashに対するcssを書くときは、content_tagを使うと綺麗に書ける。



以上です。
間違っているとことや気になるところあればご指摘お願いします。

raisl チュートリアル　7章

>https://railstutorial.jp/chapters/sign_up?version=5.1#cha-sign_up
Mew in days ～ Mew のリファイル済みフォルダから日数以内に整理したものを集めます

# update 2022-02-19
自作の Mew 用ユーティリティの洗い直しで見たとき、 無い関数を呼んでいたので手直ししました。

# Mew のリファイル済みフォルダから日数以内に整理したものを集めます

自分の主な用途としては、リファイルしてしまってから、どのフォルダに整理されたか判らなくなったメールを探すために使います。

[mew-builtin-search](https://qiita.com/s-fubuki/items/ea748215336e7ffd48bf) を作っているときに副次的に作って、最初組込もうと思ったのですがキーワード検索とは引数が違ってインターフェイスも変わり Source も共有しきれない等の理由で外されたものです。
でもどちらかというとこちらの方が使う場面があるので整理して一応公開しておきます。

# インストール

必要なファイルはひとつです。
[本体](https://gist.github.com/s-fubuki/8578c4a7879214dd3c346330ce3905b4)を DL し `load-path` の通った処に置き、適宜バイトコンパイル等して `.mew.el` か `init.el` に以下の1行(キーバインドするなら2行)を追加します。
ソース内でキーバインドはしていないので必要により以下のように空いている好みのキーに requare とは別にしてください。例では `kD` の2ストロークからなるキーにバインドされます。

```emacs-lisp:.mew.el
(requare  'mew-indays)
(add-hook 'mew-summary-mode-hook #'(lambda () (local-set-key "kD" 'mew-indays)))
```

# 使い方

`kD` にバインドした体で例を書きます。

`kD` とすると 1日以内に整理したメールが集められます。
メールの日付ではなくファイルのタイムスタンプで比較します。

`C-u kD` とプレフィクスを付けて実行すると 7日以内になります。

`C-u 3 kD` 等のように日数が指定できます。指定できるのは整数のみです。

各デフォルト値は `mew-indays-default` と `mew-indays-prefix-default` で設定できます。

```emacs-lisp:.mew.el
(setq mew-indays-default        3)
(setq mew-indays-prefix-default 1)
```

trash フォルダ等すべてのメールフォルダを検索します。

# 作成とテストに使った Emacs と Mew のバージョン

> Emacs - "GNU Emacs 26.1 (build 1, i686-w64-mingw32) of 2018-05-31"
> Mew - "Mew version 6.8"

以上です。
それでは楽しんでください!
Windows10でcurl使ってファイルのDL

#したい

## やり方
Windows PowerShellを使う(スタートボタン右クリックで出てくる)
1.curlにかかってるエイリアスを消す

```bash
del alias:curl
```
2.curl が普通に使えるか確認する

```bash
curl
```

3.普通にcurlコマンド叩く

ちなみにファイルをDLするためのオプションは`-oか-O`
分かりやすくほかのオプションまとまってる記事
→https://qiita.com/takayukioda/items/edf371b3566bea64d046

自分用に作ったcurlコマンドジェネレーター→https://dafu.cf/tools/pages/curl.php

```bash
curl -O DLしたいファイルのURL
```

#やったぜ。
vbsの作法 その6

#概要

vbsの作法、調べてみた。
バイナリーファイルを表示してみた。

#写真

![image.png](https://qiita-image-store.s3.amazonaws.com/0/18104/e859549e-3be9-f6c1-4226-15a2aa07f82d.png)


#サンプルコード

```
Dim App1
Dim Appflg
Dim Stream
Dim Bytes
Dim Chars
Dim c
Dim k
Dim buf

Set App1 = Createobject("OHIcompo6.srv")
WScript.ConnectObject App1, "App1_"

Sub App1_exit()
	Appflg = 2
End Sub

Sub App1_ok()
	Msgbox App1.text
End Sub

buf = ""
Set Stream = CreateObject("ADODB.Stream")
Stream.Open
Stream.Position = 0
Stream.Type = 1
Stream.LoadFromFile "hexread0.vbs"
Bytes = Stream.Read(-1)
Chars = ""
For k = 1 To LenB(Bytes)
	If k Mod 16 = 1 Then
		buf = buf & "     " & Chars & vbcrlf
		Chars = ""
	End If
	If k Mod 4 = 1 Then
		buf = buf & " "
	End If
	c = AscB(MidB(Bytes, k, 1))
	buf = buf & Mid(Hex(256 + c), 2)
	If (c < 32) or (c > &h7f) Then
		c = 32
	End If
	Chars = Chars & Chr(c)
Next
App1.text = buf
Set Stream = Nothing
Appflg = 1
Do
	WScript.Sleep(100)
	App1.ping
Loop until Appflg = 2
Set App1 = Nothing

```

以上。
C#でAnalytics(Reporting)APIを利用する（参考URL集）

タイトルのとおりです。
個人的なメモとして書いていますので、くだらない記事を読んだと怒らないようお願いします。

v3はAnalytics API、v4はAnalytics Reporting APIらしい？

#APIの有効化
https://haniwaman.com/google-analytics-api/

#APIの仕様
https://developers.google.com/analytics/devguides/reporting/core/v3/?hl=ja

#C#のAPI
これはv3の使い方↓
https://blog.shibayan.jp/entry/20140803/1407059293
認証はjsonではなくp12を使っている

v4の使い方↓
https://st40.xyz/one-run/article/514/
認証にjsonを使う方式。今はjsonが推奨と思われる。

#Googleによるサンプルコード
https://developers.google.com/analytics/devguides/reporting/core/v4/samples?hl=ja
PHPとcURLでのHTTP通信について

CURLで下記の処理をしたところ、エラーします。

curl http://localhost:80/test.php --data-urlencode shukka_no=1234&shukka_date=19980401 -XPOST

'shukka_date' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

<?php
  if(isset($_GET['shukka_no'])){
 	$shukka_no = $_GET['shukka_no'] ;
 	echo $shukka_no;
 }
?>
何がわるいのでしょうか？
多作で創造性の高いエンジニアは、Qiitaにいかに大量記事を生産するか。

# @YumaInaura 

とにかく多作。

昔のアカウントも含めると700個ぐらいはQiitaに記事を書いている。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/604de84b-c878-a4bc-aeb8-d40601300c7f.png)


# いかに見出しをつけるか。コンテンツを分離するか。

- 見出しを最小の単位に区切る。
- コンテンツの分離度は高いほど良い。

# いかにスライド作成に学ぶか。箇条書きするか。

- 見出しや箇条書きだけですべてを伝える。
- 分かる人に分かれば良い。
- 分かる人には分かるような書き方をする。

# いかに迷わないか。編集度を下げる工夫をするか。

- たとえば「箇条書き」だけで全てを終わらせれば、なにか変更が必要になっｔめお、1行だけの修正で済む。
- 編集度が高くなるほど苦労は増える。ハードルは上がる。
- 戦場は小さければ小さいほど良い。戦略家になれ。

# いかに外部テクノロジに頼るか。Googleをこき使うか。

- 「あわせて読みたい自分の記事」とかはGoogleへのリンクにすれば良い。
- Qiitaだけで全てを終わらせるな。
- 僕たちはもっと自由になれるはずさ。レッドブル翼をさずける系エンジニアになろう。

# いかにポエマーになるか。名言ジェネレーターになるか。

- 全ての見出し、箇条書きが名言チックであってほしい。
- 1行だけで全てが伝わるような表現で、すべての要素を構成したい。
- 出版物、本の見出しみたいなQiita記事であってほしい。

# いかに無になるか。自己評価を気にしないか。

- 「自分が人からどう見えるか」を気にすると、もう記事は書けない。
- 「自分を天才」だと呼んだって良い。受け取り方は読む人次第。
- 批判コメントが来たら「本当ですね！」「ごめんね！」って言えば良い。

# いかにツールを準備するか。刀を磨くか。

- 我々は武士エンジニアじゃないか。
- MacのAlfredのクリップボード履歴とか。
- ツールが手足のように使えるのはエンジニアの最大の幸福である。

# いかに捨てるか。ゴミ箱を空にするか。

- 自分が面倒くさいことをいかに減らせるか。
  - 義務感を感じて完全な記事を書くより、いいかげんで役立つ記事を書けるか。(ただし非技術系の記事に限る)
  - 贅沢に関連リンクとか貼ろうとしたりしない。

# いかに忘れるか。記憶力を減らすか。

- いちど書いた記事のことはすっぱり忘れる。
  - タイガー・ウッズ・エンジニアになる。
  - コメントとかいいねが付いた時に思い出す。
- 記事を書き終わった後に「いいねが付かないかな？」とか考えてる時間が本当に無駄。
  - 投稿ボタンの魔法。
- 悩む時間があったら新しい記事を書きたい。
  - 永遠に楽しめる。無限機関。

# いかに熱するか。冷まさないか。料理の温度管理をするか。

- 書きたい時に書かないと料理は冷めてしまう。
- だからこそスピード感、ホット感が命だったりする。
- Qiitaなどのサービスは固定されているけれど、僕らの脳の状態はホットになったりクールになったり、常に変動している。
  - 脳に優しいQiitaしよう。

# エンジニアリングにも役立つ

- 上で上げたようなことは全て、クラス設計、サービスの粒度設計にも役立つ。
- 我々はマイクロサービスでしょう。

# ノイズが増える論を信望？

- 僕は「最終的にはGoogle先生が全部フィルタリングしてる論」を信望。
- Qiitaの記事数が全部で何個あるかは知らないが、ひとりが書ける記事の量など、いくら頑張ってもたかが知れている。
- 量は質に転換する。大量アウトプットしてクオリティ上げて行こうぜ。

# Hello new world

- [yumainaura 創造性 - Google Search](https://www.google.co.jp/search?q=yumainaura+%E5%89%B5%E9%80%A0%E6%80%A7&oq=yumainaura+%E5%89%B5%E9%80%A0%E6%80%A7&aqs=chrome..69i57j69i60l3j69i64l2.2487j0j7&sourceid=chrome&ie=UTF-8)
- [yumainaura 箇条書き - Google Search](https://www.google.co.jp/search?q=yumainaura+%E7%AE%87%E6%9D%A1%E6%9B%B8%E3%81%8D&oq=yumainaura+%E7%AE%87%E6%9D%A1%E6%9B%B8%E3%81%8D&aqs=chrome..69i57j69i60j69i64l2.2224j0j7&sourceid=chrome&ie=UTF-8)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
djangoのHP開発環境構築 備忘録

# 手順
1. [python開発環境の事前準備](#python開発環境の事前準備)
2. [Djangoのインストール](#djangoのインストール)
3. [開発のあれこれ](#開発のあれこれ) (記述中)

# python開発環境の事前準備
- [python](https://www.python.org/) - 3.7.1 (2018/11/17現在)
- [pip](https://pypi.org/project/pip/) - 18.1 (2018/11/17現在)
- pyenv - 1.2.8 (2018/11/17現在)
- [Homebrew](https://brew.sh/index_ja) - 1.8.2 (2018/11/17現在)

ここはあくまで事前準備なので適当に...

### Homebrewのインストール
```
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```
最新のコマンドはHPを参照

### pyenvのインストール
```
$ brew install pyenv
```

### pythonのインストール
```
$ pyenv install [version]
```
[version]にはインストールしたいpythonのバージョンを記載
`$ pyenv install 3.7.6` みたいな

### pipのインストール
```
$ pip --version
pip 18.1 from /hoge/fuga/~~~/pip
```
プリインストールだとどういう風に表示されるかわからんけどget-pip.pyでインストールするとこんな感じ

```
$ wget https://bootstrap.pypa.io/get-pip.py
hogehoge保存されました~~~みたいな表示
$ python ./get-pip.py
```
wgetはHomebrewか何かで別途インストール `brew insatll wget`

### 参考文献
事前準備だしいらないよね？

# Djangoのインストール
- [Django](https://www.djangoproject.com/) - 2.1.3 (2018/11/17現在)

```
$ pip install django
hogehoge~~~~~~
Successfully installed django-2.1.3 pytz-2018.7
```
インストール自体はこれで終わり
以下，導入確認

```
$ python
Python 3.7.1 (default, Nov 17 2018, hh:mm:ss) 
[Clang 10.0.0 (clang-1000.10.44.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import django
>>> print(django.get_version())
2.1.3
```

### 参考文献
[Django - クイックインストールガイド](https://docs.djangoproject.com/ja/2.1/intro/install/)

# 開発のあれこれ
不定期で記述中

### 参考文献 (予定)
[Django - はじめての Django アプリ作成](https://docs.djangoproject.com/ja/2.1/intro/tutorial01/)
Vagerantでよく使うコマンド

# 仮想マシンの削除
##仮想マシンのＩＤを確認
```
ser@user-Latitude-E6530:~/MyVagrant/ikunobu_CentOS$ vagrant global-status
id       name    provider   state  directory                           
-----------------------------------------------------------------------
58712d7  default virtualbox saved  /home/user/MyVagrant/CentOS         
69a2738  default virtualbox saved  /home/user/MyVagrant/ikunobu_CentOS 
 
The above shows information about all known Vagrant environments
on this machine. This data is cached and may not be completely
up-to-date (use "vagrant global-status --prune" to prune invalid
entries). To interact with any of the machines, you can go to that
directory and run Vagrant, or you can use the ID directly with
Vagrant commands from any directory. For example:
"vagrant destroy 1a2b3c4d"
```
##IDを指定して削除
```
user@user-Latitude-E6530:~/MyVagrant/ikunobu_CentOS$ vagrant destroy 69a2738
    default: Are you sure you want to destroy the 'default' VM? [y/N] y
==> default: Discarding saved state of VM...
==> default: Destroying VM and associated drives...
```
PyTorchの蟻と蜂の転移学習チュートリアルをGoogle Colabで実行したときにやったこと

Macbookでpytorchのチュートリアルを参考にして、転移学習による画像の2クラス学習をおこなったところ、学習時間が1時間を超え、CPUの発熱もハンパなかったので、このままやり続けるとMacこわれるのでは、と怖くなりました。Google ColabでGPU使えると知り、実行したところいくつかつまずいたので、その対応など投稿します。
＜参考にしたページ＞
・[pytorchチュートリアル](https://pytorch.org/tutorials/beginner/transfer_learning_tutorial.html)
・[【秒速で無料GPUを使う】TensorfFow/Keras/PyTorch/Chainer環境構築 on Colaboratory](https://qiita.com/tomo_makes/items/f70fe48c428d3a61e131)

##pytorchインストール
pytorchをimportすると「このコードでpytorchをインストールしろ」と親切に教えてくれます。

##Google Driveのマウント
以下のコードでマウントします。
実行すると、「このURLでauthorization codeを取得しろ」と言われます。Googleアカウントを持っていれば、アカウントを選択するだけであっさりcodeを取得できます。

```
# google driveのマウント
from google.colab import drive
drive.mount('/content/gdrive')
```
##画像処理ライブラリのインストール
よくわからないのですが、おそらくdataloadersからbatchを取り出すときにエラーがおこるようで、以下追加インストールしました。Pillowは最新版だとうまくいかず、4.0.0指定でうまくいきました。

```
# google colabで追加インストール
!pip install Pillow==4.0.0
!pip install image
```

##画像保存ディレクトリの指定
「Data augmentation and normalization for training」のセルの画像保存ディレクトリを指定します。

```
data_dir = '/content/gdrive/My Drive/画像を保存しているフォルダ名'
```

##その他
・インストールおよびドライブのマウントは、ランタイムが切れると消えるので、毎回実行します。
・Google Driveのゴミ箱に同名のファイルがあるとエラーになるようなので、ゴミ箱は常にカラにしてます。

毎回のインストールや、ちょくちょくランタイムが切れるなどありますが、CPUでは困難な学習ができるのでぜいたくはいえません。
MacBookで1時間以上かかった画像100枚程度の学習が数分で終わりました。画像を2000枚ほどに水増しすると、Google Colabでも1時間弱かかりましたので、Macだったらむりだったなあと思いました。
エンジニアのSlack分報駆動開発 (TODOリスト編)


# Slack分報にTODOリストを書く

- 1行に1個ずつ。
- 僕の場合は仕事とプライベートを問わずに書いたりする。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/e7d5f10f-7fc1-aa0f-2fba-d4f6f3b417c4.png)

# 絵文字リアクションをつける

- テーマが分かりやすいようにする絵文字。自分の注意力を引くもの。視認性アップ。
- Doneの絵文字 ( :thumbsup: )
- 「これは注意」絵文字 など

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/6248966b-c42d-0081-c26d-1215866d5c4e.png)


# 結果を報告をSlackスレッドに書く

Qiitaに記事を書いたので、スレッドに結果報告を書いた例。

こうするとTODOリストをきれいに保ったまま、詳細もリンクできる。Doneの証にもなる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/17f56505-c789-ec0b-8d13-a36e42b76bb2.png)

# 重複項目があっても良い。腐らせるな。熱せよ。

- 重複を許す。寛容なTODO運用をする。マリアのように。
- たとえ1日分でも、リストが長くなってくると、管理が難しくなってくる。
- 「あれ書いたっけ？」「書かなかったっけ？」で悩む時間がもったいない。神のTODO術が台無しに。

# 後出しTODOリストでもOK。じゃんけんはズルくなるが勝ち。

- TODOリストに書いてないのに先に完了したのは、後から追加しても良い。
- TODOリストとしての意味はないが、歴史を残す意味はある。
- TODOリストという名前の一覧というか、歴史書というか。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/a20f9b84-e7ca-f0f4-5903-72e907656bf4.png)



# 何故Slack分報？

- 「フラッシュアイディア的なTODO作成」に向いているから
- 他の人が見える場所にあることで、実現度が高まる
  - 「人が見てる」大事
  - 人間は社会的動物

# 「ユーザーのアテンション」「注意力」的に三角形のイメージ

- ちょっと新しいタイプのTODOリスト。フラットではなくピラミッド形式。
  - フローとストックの間で愛を叫ぶ。
- 上がピラミッドの頂点。クール。自分も忘れかけている。
- 下がピラミッドの底辺。ホット。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/001ce7b4-9445-0dba-3ef4-055e4bbe72f7.png)

# あわせて書きたい

- 全く新しいTODOリストアプリの夢想
- エンジニアリングの図を描くのは面倒くさいし、自分の手で表現してみれば良いじゃない

# Hello new world


- [システムエンジニアの朝は「神のTODOリスト」で始まる。アイディアの教科書。 - Qiita](https://qiita.com/YumaInaura/items/3ee3d0f3c1e10bcb99e2)
- [yumainaura slack todo - Google Search](https://www.google.co.jp/search?q=yumainaura+slack+todo&oq=yumainaura+slack+todo&aqs=chrome..69i57j69i60l2j69i64l2.2218j0j7&sourceid=chrome&ie=UTF-8)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
システムエンジニアの朝は「神のTODOリスト」で始まる。アイディアの教科書。

# Slack分報の例

僕は朝起きたら、自分のSlack分報にTODOリストを書き込んで行く。

仕事やプライベートに限らず、なんでも思いつくことを1行ずつ。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/4770687b-18fe-50b6-7cce-0500bd3f68b1.png)

# 一番創造性が高いタイミングにアイディアをメモする

多くの場合、それは朝。

# 朝の儀式は「スマホで瞬間TODO作成」

「今日見た夢」を覚えているぐらいの瞬間にスタートする。

# なぜプライベートのことも書くの？

- 仕事はプライベートに還元され、プライベートは仕事に還元される。
  - シームレスな境界線の方が優れている実感。
  - 色々な境界線を曖昧にしていこう。
  - カメラを止めるな。
- 仕事とプライベートのTODOを別に管理すると思うだけで死にそうになるから。
  - 仕事とプライベートを分けたくない、融合したい人にはおすすめ。

# 管理しないTODOリスト

「TODOリスト」と「アイディアノート」の半分ぐらいのイメージ。

# 今日だけのTODOリスト

もう明日になったら思い出せなくても良いやつ。

本当に「今日やりたいこと」「思い浮かんだこと」を書く。

# つづきから始める

ピン留め機能などを使って思い出せるようにしても良い

# 実現性が1234%増

俺比。

いつも業務に押し流されて結局できない系のことが出来る。

# 退勤ボタンを押した後に、Slack 絵文字を追加した例。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/b92c825f-4cae-d5cc-3a71-897a4a10594c.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/0b1c6f0c-27af-419b-9ee1-d2d42493de24.png)

ホイミスライムの肖像権保護のため画像は割愛。

# ホイミスライム？

ホイミスライム絵文字がSlackにあることで生産性は5%高くなるので、業務に還元される。


# あわせて書きたい

- Slack分報駆動TODO開発
  - [エンジニアのSlack分報駆動開発 (TODOリスト編) - Qiita](https://qiita.com/YumaInaura/items/2d399f2a11bb503fee3c)
- Slack分報でPDCAを回す方法

# Hello world

[yumainaura slack - Google Search](https://www.google.co.jp/search?q=yumainaura+slack&oq=yumainaura+slack&aqs=chrome..69i57j69i60l3j69i59l2.1705j0j4&sourceid=chrome&ie=UTF-8)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
SpigotAPI-1.13.1における私の備忘録（随時更新）

# 概要
また同じことをした時に忘れないように調べたことをメモしました。
参考になれば幸いです。

# 環境
SpigotAPI-1.13.1-R0.1-SNAPSHOT
kotlin 1.3.10

# 芝生の増殖を抑止

```kotlin
    @EventHandler
    fun cancelSpreadGrass(event: BlockSpreadEvent) {
        if (event.isCancelled) return
        if (event.newState.type != Material.GRASS_BLOCK) return
        event.isCancelled = true
    }
```

# 砂等落下ブロックの落下キャンセル

```kotlin
    @EventHandler
    fun cancelFallBlock(event: EntityChangeBlockEvent) {
        val block = event.block ?: return
        val fallingBlock = event.entity as? FallingBlock ?: return
        val material = fallingBlock.blockData.material
        if (block.type == material) {
            event.isCancelled = true
        }
    }
```

# 液体が流れ出さないようにする
提供:@unicroak

```kotlin
    @EventHandler
    fun cancelFlowLiquid(event: BlockFromToEvent) {
        event.block ?: return
        event.isCancelled = true
    }
```
Google Chrome 拡張機能の兼ね合いで Web アプリのショートカットキーが動かないときの切り分け・原因特定

Webアプリで指定されているショートカットキーが Google Chrome のブラウザ上で発火しないということにハマり、割と困ったことがありました。

その時は Google Chrome の拡張機能のショートカットキーが競合していたことが原因だったのですが、そこでやった切り分け・原因特定の方法を簡単ですが紹介します。

## 切り分け：ゲストモードで原因を切り分ける

Google Chrome にはシークレットモードの他に、ゲストモードがあります。

[ゲストとして Chrome を使用する](https://support.google.com/chrome/answer/6130773?co=GENIE.Platform%3DDesktop&hl=ja)

こちらのモードを使うと、自分のアカウント情報が何も入っていない状態のブラウザを起動することができます。そのため、**自分のアカウントで使っている Google Chrome 拡張機能が入っていない状態のブラウザ**を利用できます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/222030/b375da85-1d92-b937-b7e6-f27bc5d425dd.png)


こちらのゲストモードで Web アプリのショートカットキーが動けば、Google Chrome 拡張機能のショートカットキーが影響しているかもしれない、という切り分けができます。

## 原因特定：Google Chrome 拡張機能のショートカットキー一覧を表示する

Google Chrome の URL バーに、`chrome://extensions/shortcuts` と入力してみましょう。

Google Chrome 拡張機能に割り当てられたショートカットキー一覧が表示されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/222030/e5a716e7-f78e-7c86-24b5-bc99d3a365ca.png)

この一覧から、Web アプリのショートカットキーと競合しているキーがあるかどうかを確認することができます。

もし競合していれば、拡張機能のショートカットキーを変更するか、削除するといいかもしれません。

## 終わりに

今回書いたのは2つだけなのですが、見つけるのが難しかったり、情報が散らばったりしていたのでまとめてみました。だいぶニッチなところだと思いますが、参考になれば幸いです。

## 参考 URL

* [Chrome Extension Keyboard Shortcuts – Tim Leland](https://timleland.com/chrome-extension-keyboard-shortcuts/)
GCP の Deep Learning VM に vncserver をインストールする

こんにちは、chlochanです。いつの日か仕事に生かせる事を目指して、休日とかにDeep Learning の勉強をしています。"NVIDIA Visual Profiler" を使いたいので vncserver をインストールします。

まず、ファイアウォール ルール
default-allow-vncserver
を作って、"プロトコルとポート" に tcp:5901 を設定します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/307576/cbf216b0-94db-f01b-24f4-3419d51f8285.png)
次に、"ターゲット" を ”ネットワーク上のすべてのインスタンス” にします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/307576/0ea8c040-fc81-422f-e4f6-ded43eb99a89.png)
次に必要なパッケージをインストールします。ここでは mate をインストールします。親戚筋の cinnamon と gnome もインストールしておきます。Qt 好きなので KDE もインストールします。ついでに LXDE と xfce もインストールします。

~~~bash
$ sudo apt-get update
$ sudo apt-get install mate -y
$ sudo apt-get install cinnamon-desktop-environment -y
$ sudo apt-get install gnome-core gnome-panel -y
$ sudo apt-get install task-kde-desktop -y
$ sudo apt-get install lxde -y
$ sudo apt-get install task-xfce-desktop -y
$ sudo apt-get install vnc4server
~~~
vncのパスワードを設定します。

~~~bash
$ vncpasswd 
~~~
~/.vnc/xstartup　を作って以下を記載します。

~~~bash
#!/bin/bash
#
exec /usr/bin/mate-session &
~~~
vncserverを起動します。

~~~bash
$ vncserver :1 -localhost no 
~~~
ウインドウの大きさをディフォルトから変更したい場合は以下の様に大きさを指定します。

~~~bash
$ vncserver :1 -geometry 2460x1340 -localhost no
~~~
以上で vncserver が起動していますので、クライアント側から接続します。
vncserverを停止する場合は以下を実行します。

~~~bash
$ vncserver -kill :1 
~~~

#Tcp SSH Forwarding で接続する
vncの通信は暗号化されていないので非常に危険です。よって以下の方法で Tcp SSH Forwarding で接続します。
https://qiita.com/chlochan/items/b5911a841d8fd8d487dd
Arduino で C++ とか

やはり我々 現代人としては Arduino でもオブジェクト指向で書きたいですよね。

ということで、散々既出と思われますが C++ でテスト的なのを。

# LEDクラスのテスト

```C++:class_test.ino
class Led {
  private:
    byte pin;
    byte cnt;

  public:
    Led(byte pin_num)
    {
      pin = pin_num;
      pinMode(pin, OUTPUT);

      cnt = 0;
    }

    void On()
    {
      digitalWrite(pin, HIGH);
    }
    
    void Off()
    {
      digitalWrite(pin, LOW);
    }

    void Toggle()
    {
      byte lv = (++cnt % 2)? HIGH:LOW;

      digitalWrite(pin, lv);
    }
};

Led* LedGreen;

void setup()
{
  const byte PIN_LED = 7;   // DIGITAL PIN

  Serial.begin(115200);
  LedGreen = new Led(PIN_LED);

  if(LedGreen == NULL) {
    Serial.println("failed");

    while(1) {}          // system down -_-;
  }
  else {
    Serial.println("succeeded");

    LedGreen->On();
    delay(2000);
    LedGreen->Off();
    delay(2000);
  }
}

void loop()
{
  LedGreen->Toggle();
  delay(100);
}
```

# でもですね

サンプル的には動くものの、実際にバリバリ書くにはどうなん的なのもあります。

- OSがないので`new`したときにRAM使い果たしてるとどうなるのか[^1]
- オブジェクトをグローバル変数にしてるのがモサい[^2]

[^1]: まあ、ローカル変数でスタック使い果たすのと同じことですが、メソッドはさらにかさばりそうですし、手計算なんて無理っす
[^2]: `setup()`と`loop()`に別れているので、`new`したオブジェクトを共有できない。`setup()`とか`loop()`よりも`main()`でいいのに

などありますが、
ごめんなさい。あまりいいアイデアがないのでひとまず、ここまで。
2019年のaipoの祝日カレンダーを作った

aipoカレンダーのダウンロード版のカレンダーです。

公式の方ではASP版の方しか更新していないみたいなので、先日GWの閣議決定もされたみたいですし、来年のカレンダーを更新してみました。

# aipoの2019年の祝日

休日については以下となります。
ポイントは以下の二つかと。

・「12/23の天皇誕生日」がなくなっていること。
・「5/1が即位の日」になったため、4/30と5/2が休みになっている。
・「10/22が即位礼正殿の儀」で休みになっている。

少し変則的な年ですね。

```
元日,2019-01-01
成人の日,2019-01-14
建国記念の日,2019-02-11
春分の日,2019-03-21
昭和の日,2019-04-29
退位の日,2019-04-30
即位の日,2019-05-01
国民の休日,2019-05-02
憲法記念日,2019-05-03
みどりの日,2019-05-04
こどもの日,2019-05-05
振替休日,2019-05-06
海の日,2019-07-15
山の日,2019-08-11
振替休日,2019-08-12
敬老の日,2019-09-16
秋分の日,2019-09-23
体育の日,2019-10-14
即位礼正殿の儀,2019-10-22
文化の日,2019-11-03
振替休日,2019-11-04
勤労感謝の日,2019-11-23
```

## 設定について

・ファイルのバックアップ

```
# cp holidays_default.properties holidays_default.properties.bk.2018
```

・休日の設定

```
# vi holidays_default.properties
```
上記の休日を貼り付けます

・aipoの起動と停止

```
# /usr/local/aipo/bin/shutdown.sh
# /usr/local/aipo/bin/startup.sh
```

設定はこんな感じで反映されます。

## 参照

こちらを参照しています。

・内閣府 [国民の祝日について](http://www8.cao.go.jp/chosei/shukujitsu/gaiyou.html)
・HUFFPOOST [2019年ゴールデンウィーク10連休へ 「5月1日、即位の日＝休み」閣議決定](https://www.huffingtonpost.jp/2018/11/13/10-days-holiday_a_23587944/)
vbsの作法 その4

#概要

vbsの作法、調べてみた。
書式指定してみた。

#写真

![image.png](https://qiita-image-store.s3.amazonaws.com/0/18104/6d9cdc2d-dce6-f963-e988-4cf6a391276a.png)

#サンプルコード

```
Set stb = CreateObject("System.Text.StringBuilder")
stb.Append_3 "    "
for i = 1 to 9
	stb.AppendFormat "   {0:d}", i
next 
stb.Append_3 vbcrlf
for i = 1 to 9
	stb.AppendFormat "  {0:d}", i
	for j = 1 to 9
		if i * j < 10 then
			stb.AppendFormat "   {0:d}", i * j
		else
			stb.AppendFormat " {0:d}", i * j
		end if
	next
	stb.Append_3 vbcrlf
next
msgbox stb.ToString


```

以上。
Apache Camel 処理中のメッセージ数を取得する

# Apache Camel 処理中のメッセージ数を取得する

※とりあえずメモとして残す。後でまともな記事に編集するかも。他サーバから処理中のメッセージ数を取得する等を書きたい。

Inflight Exchange = routeで処理中のメッセージ

InflightRepositoryインターフェースのsizeメソッドで、routeで処理中のメッセージ数(Inflight Exchange)を取得できる。
定時処理バッチで、前回バッチの処理が終了していない場合はスキップする必要がある場合は、メッセージ数が0でなければ処理を開始しないなどの処理ができそう。

```TestProcessor.java
package sample;

import javax.annotation.Resource;

import org.apache.camel.CamelContext;
import org.apache.camel.Exchange;
import org.apache.camel.Processor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

@Component
public class TestProcessor implements Processor {
	Logger logger = LoggerFactory.getLogger(TestProcessor.class);

	@Resource
	private CamelContext context;

    @Override
    public void process(Exchange exchange) throws Exception {
    	logger.info("TestProcessor start ");

    	int size = context.getInflightRepository().size("parentRoute");
    	logger.info("Inflight Size = {}", size);
    }
}

```

1秒間に1メッセージずつルートに投入すると以下のように出力される。

```
[2018-11-17 10:22:52.504], [INFO ], s.TestProcessor, Camel (camel-1) thread #2 - timer://runwatch, sample.TestProcessor, Inflight Size = 1
[2018-11-17 10:22:53.484], [INFO ], s.TestProcessor, Camel (camel-1) thread #2 - timer://runwatch, sample.TestProcessor, Inflight Size = 2
[2018-11-17 10:22:54.485], [INFO ], s.TestProcessor, Camel (camel-1) thread #2 - timer://runwatch, sample.TestProcessor, Inflight Size = 3
[2018-11-17 10:22:55.484], [INFO ], s.TestProcessor, Camel (camel-1) thread #2 - timer://runwatch, sample.TestProcessor, Inflight Size = 4
[2018-11-17 10:22:56.486], [INFO ], s.TestProcessor, Camel (camel-1) thread #2 - timer://runwatch, sample.TestProcessor, Inflight Size = 5
```
iOSアプリの証明書の管理

#前書き
アプリをApp Store Connectに登録自体は何度か経験しましたが複数人でアプリを開発する際に証明書周りでハマったので、ここに書き記しておきます。

#アプリをApp Store Connectへ登録するのに必要なもの

- CertificateSigningRequest「CSR」「証明書署名要求」
- 証明書「開発用or配布用」
- AppID
- Provisioning Profile
- アプリ名.mobileprovision

#CertificateSigningRequest.(CSR)の入手
<img width="1804" alt="スクリーンショット 2018-11-12 9.43.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/255984/4941ff9a-2ad6-19b2-61c2-77314df56b10.png">
[これ](https://qiita.com/guitar_char/items/7dbd7e2bc35a1fc9e5a0)によると、秘密鍵と公開鍵も同時に作られるらしい。
~~どこになんて名前で作られるんだろう🤔~~
キーチェーンの鍵のとこにあるケルベロスってやつ？

#AppIDsの登録
アプリの識別子。
この次のProvisioning Profileの作成に必要。

> AppIDの登録時にアプリ内で使用するサービスをApplication Servicesの中から選択していくんですが、大体は後から編集可能ですが、課金処理は編集不可でした。

#Provisioning Profile作成
[これ](https://qiita.com/guitar_char/items/7dbd7e2bc35a1fc9e5a0)がとても参考になる。
 
- AppID
- 開発機識別子
- 証明書

の情報が入っている。

#CertificateOrganizeDevelopmentProfile.mobileprovision
なるものが生成されるので、ダウンロードしてダブルクリック。

#後書き
とてもやねこいですね。
そして、fastlaneなんかを使うとどこからどこまでを自動でやってくれるんですかね。
Laravel Broadcasting (Echo)とReact Nativeの連携


[この記事](https://qiita.com/zaburo/private/34289d4573f39113b25a)や[この記事](https://qiita.com/zaburo/private/b2d80dc274447ec07da2)の続き。というかメイン。
Laravel BroadcastingはReactNativeともスムーズに連携可能です。

## 準備

私はexpoを使ってます。

```bash
expo init echo-react
cd echo-react
```
### 必要モジュールのインストール

```bash
npm install --save laravel-echo socket.io-client
npm install
```

## 実装

今回はApp.jsに全てのコードを書きます。

### App.js

基本的にReactと同じなのですが、接続情報に　client: Socketio,　が追加されています。

```js
import React from 'react';
import { StyleSheet, Text, View } from 'react-native';

import Echo from 'laravel-echo/dist/echo';
import Socketio from 'socket.io-client';

export default class App extends React.Component {

  constructor() {
    super();
    this.state = {
      public_message: 'aaa',
      private_message: 'bbb',
    }
  }

  componentDidMount() {

    window.Echo = new Echo({
      broadcaster: 'socket.io',
      host: 'http://localhost:6001',
      client: Socketio,
      auth: {
        headers: {
          'Authorization': 'Bearer hogehoge',
        }
      }
    });

    window.Echo.channel('public-event')
      .listen('PublicEvent', (e) => {
        // console.log(e);
        this.setState({
          public_message: e.message
        });
      });

    const user_id = 1;
    window.Echo.private('private-event.' + user_id.toString())
      .listen('PrivateEvent', (e) => {
        // console.log(e);
        this.setState({
          private_message: e.message
        });
      });

  }

  render() {
    return (
      <View style={styles.container}>
        <Text>Event</Text>
        <Text>Public Message: {this.state.public_message}</Text>
        <Text>Private Message: {this.state.private_message}</Text>
      </View>
    );
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: '#fff',
    alignItems: 'center',
    justifyContent: 'center',
  },
});
```

## 動作確認

動作確認してみます。

### 初期状態

stateに設定した値が表示されています。

![スクリーンショット 2018-11-17 7.18.39.png](https://qiita-image-store.s3.amazonaws.com/0/55188/63e81675-7265-a37c-f6f8-0acccbd5aff2.png)


### Event発生

Public, Privateのイベントを発生させると表示が更新されます。便利。

![スクリーンショット 2018-11-17 7.18.50.png](https://qiita-image-store.s3.amazonaws.com/0/55188/6cfaa9e6-3f94-b94d-00d0-db943b01114b.png)
Laravel Broadcasting (Echo)とReactの連携


[こちらの記事](https://qiita.com/zaburo/private/34289d4573f39113b25a)の続きです。

Laravelにてプリセット環境がReactになっていること想定。


```bash
php artisan preset react
npm install
npm run dev
```

## 実装

### Event.jsの作成

resources/js/components以下にEvent.jsを作成します。
既にExmaple.jsが存在するので、それをコピーして利用します。

とりあえず下記のようにしました。以前の維持ではbootstrap.jsに記述していたchannel(), private()をcomponentDidMount()等に移します。また、イベントが通知されたタイミングでthis.setState()を実行し、stateをアップデートし、表示させます。

```js
import React, { Component } from 'react';
import ReactDOM from 'react-dom';

export default class Event extends Component {

    constructor(){
        super();
        this.state = {
            public_message: 'aaa',
            private_message: 'bbb',
        }
    }

    componentDidMount(){
        window.Echo.channel('public-event')
            .listen('PublicEvent', (e) => {
                // console.log(e);
                this.setState({
                    public_message: e.message
                });
            });

        const user_id = 1;
        window.Echo.private('private-event.' + user_id.toString())
            .listen('PrivateEvent', (e) => {
                // console.log(e);
                this.setState({
                    private_message: e.message
                });
            });
    }
    
    render() {
        return (
            <div>
                <h1>Event Contents</h1>
                <div>Public Message: {this.state.public_message}</div>
                <div>Private Message: {this.state.private_message}</div>
            </div>
        );
    }
}

if (document.getElementById('event')) {
    ReactDOM.render(<Event />, document.getElementById('event'));
}

```

### bootstrap.js（抜粋）

bootstrap.jsにおける記述は接続情報のみとなりました。

```js
//for Echo
import Echo from 'laravel-echo';
window.io = require('socket.io-client');

window.Echo = new Echo({
    broadcaster: 'socket.io',
    host: 'http://localhost:6001',
    auth: {
        headers: {
            'Authorization' : 'Bearer hogehoge',
        }
    }
});
```


### app.js（抜粋）

app.jsでは作成したEvent.jsを読み込んでいます。

```js
require('./components/Event');
```

### welcome.blade.php（抜粋）

とりあえず、welcome.blade.phpに表示させてみます。bodyの最後に\<div id="event"></div>として表示させます。

```php
<div id="event"></div>
<script src="{{ asset('js/app.js')}}"></script>
</body>
```

## 動作確認

### 初期状態

左下に初期stateが表示されています。

![スクリーンショット 2018-11-17 6.58.53.png](https://qiita-image-store.s3.amazonaws.com/0/55188/a31a6924-12e0-9f0a-8095-fd76e6f674b0.png)


### Event発火状態

Public, Privateイベントを発火させると値が適宜反映されます。

![スクリーンショット 2018-11-17 6.59.23.png](https://qiita-image-store.s3.amazonaws.com/0/55188/b39fcce6-d048-f310-d0fd-aef296071654.png)

以上です。

## 関連

* React Native版は[こちら](https://qiita.com/zaburo/private/c1a250c3d396d3c3ea1e)。
iOS12からApp Storeの開発者ページへのURLが変わってる件

iOS版が最近ダウンロード落ちてるなーって思ってたら、アプリ内に設置してる「この開発者の他のアプリを見る」メニューが機能しなくなってた。

どうやらiOS12からAppStoreの開発者ページのURLが変わったみたい。

# 修正

Before

```
itms-apps://itunes.apple.com/artist/開発者名/id開発者ID
```

After

```
itms-apps://itunes.apple.com/developer/id開発者ID
```

artistからdeveloperに変更。開発者名は前から省略できたのかな。

#備考
iOS11でもAfterのURLで遷移できた。iOS10は端末ないからわかんない。

#参考
- https://forums.developer.apple.com/thread/104915
EC2の忘れがちな内容のメモ書き

## たまに忘れる
- Login UserはOSによる。ec2-user一択ではない(centos,ubuntuだとか)
- EIPを付与しなくてもインスタンス起動時に自動割り当て（サブネット設定）で設定可能
  - サブネット設定で割り当てたPublicIPはインスタンス再起動では変わらないが、停止・起動だと変わる(PravateIPは変わらない)
- T2ファミリーよりT3ファミリーの方が安い。
- PublicIPの確認
  - リモートからAWSCLIを使うとき(Nameタグ使用ケース)
 
```
aws ec2 describe-instances --filter 'Name=tag:Name,Values=hogehoge*' | grep -i publicip
```
  - ローカルから確認  

```
curl 169.254.169.254/latest/meta-data/public-ipv4
```

- EIPはインスタンスにアタッチして、そのインスタンスが稼働していたらコストはかからない
  - インスタンスが停止していたり、そもそもアタッチしていなければコストがかかる

- Primary PrivateIPは変更不可。Secondary PrivateIPを使用するか、ENIを付与する。

- boot volumeのサイズを大きくして起動させても、OS側で拡張する必要がある
  - windows https://aws.amazon.com/jp/premiumsupport/knowledge-center/expand-ebs-root-volume-windows/

- EC2インスタンス(windows)で接続用の公開鍵が同じものを使ったとしてもRDPで必要となるパスワードは異なる
アウトプットにBacklogを使ってナレッジをためていけば捗るんじゃね？

はじめまして。小太りな鳩です。
早速ですが、皆さんはナレッジ管理ってどうやってますか？

昨今、エンジニアにとってアウトプットが重要だ大切だと言われていますね。
アウトプットを行うということはナレッジを貯めることにも繋がります。

どんどんやっていきたい！よし、やっていこう！！
っと思っては見るものの中々実行に移せないという方も多いのではないでしょうか？

今回は『Backlog』というプロジェクト・タスク管理ツールを使用したナレッジマネジメントを実践してみて意外と良かったので紹介していきたいと思います。

# この記事の対象読者
- 無料でナレッジ・アウトプット管理を行いたい人。
- 日々アウトプットの癖をつけたい人。
- Backlogの使い方を模索している人。

#　Backlogとは
![alt](https://gyazo.com/da1f430b3019e1a8248fe809c0e026ea/raw)

皆さんは『Backlog』というプロジェクト・タスク管理ツールをご存知ですか？
仕事で使用されている方も多いかもしれません。

『Backlog』とは株式会社ヌーラボが提供するプロジェクト・タスク管理で、プロジェクト管理・課題管理・ドキュメント管理・バージョン管理などが行えるツールです。

しかし今回は、プロジェクト管理ツールとして使うのではなく、**Backlogの機能の一つWikiを主に使用した**内容となっております。

# こういうツールが欲しかった
これまでは、PCローカルのメモ帳やEvernoteに作業メモとして記録を残しておいたのですが、ローカルファイルだとPCを閉じてしまったらメモが書けなくなり、Evernoteについてはノート数が多いのか容量が圧迫され（このあたりはなにか解決策あるかもですが・・・）

私が望んでいたツールは

- オンラインでの編集が可能。
- どのデバイスからでもアクセスが可能。
- コードブロックが使える
- Markdown記法が使える
- 非公開なスペース
- 簡単に使用できる

っという内容がクリアできれば良いものなのですが、中々良いものが見つからず。

仕事用のBacklogでWikiを書いているときに気づきました。

………:thinking::thinking::thinking:

**あれ？BacklogのWikiって意外とアウトプットに使えるんじゃないか？**



# 調べてみた
それまで仕事用で使っていたので気づかなかったのですが、Backlog個人でも使えます。
**しかも無料で**（ただし機能制限はある）
登録方法は[プランと料金画面](https://backlog.com/ja/pricing/)にて、右下にあるフリープランのボタンを選択。


![alt](https://gyazo.com/def402bd451c6a5137cd7188fcf6e3aa/raw)

※右下の【フリープラン】ボタンを押すと登録フォームへ飛びます。

これで使い始めることができます。

# Backlogの良いところ

### オンラインであればどのデバイスからでもアクセスできる
専用アプリもあるので見やすい。一応モバイルからでもWikiに登録はできる。（整形はPCで行ったほうが楽）

### コードブロック・Markdown記法が使える
![alt](https://gyazo.com/426a599df29181059ff54ffa4f9db054/raw)
問題なく使えます。専用エディタもあり。
Backlog独自のBacklog記法という書き方もあります。

### 非公開なスペースである
自分で招待しない限りは一人で使用できます。（10人まで招待可能）


# Backlogの使いやすい・使いにくい所
### 使いやすいところ
**1.書きやすい**
前述にあるエディタもあり書きやすいです。タグなども一発で挿入できたりもします。

**2.強力な検索機能**
![alt](https://gyazo.com/2aa4aef18ce4e072a184a9d206423d82/raw)
wiki内での検索・タグによる検索・階層化したWikiなど検索しやすいメニューが揃っています。
とくにwikiの階層化は使いやすかったです。

そのほかにも、課題や共有ファイルへの検索なども行えます。
![alt](https://gyazo.com/218fb667d96059bba7b6dfea8cc13c42/raw)



**3.タスク管理機能（チケット）、Git管理機能も使える。**
→Wikiとは関係ないですが、自分でタスクにチケットを発行して期限を決めればダッシュボードに期限順にタスクが並びます。これで忘れることなくタスクも進められます。
![alt](https://gyazo.com/dd712ce9613b104ba9405b7269fbda21/raw)


### 使いにくい所
1.容量問題
→スペース全体で100MBしか使えない（2018/11/17現在）ため、重いファイルなどは別サービスで管理しなければならない。ファイルであれば『googoleドライブ』、画像であれば『Gyazo』などのサービスを使う。
GyazoであればWikiなどにもそのまま読み込むことが可能。

2.一部機能の制限
これは仕方ないですが、無料版では一部機能の制限がされています。
ただし、主にWikiを使用する目的であればそんなに気にすることはありません。

# 使用例
私が普段どのように使っているかをまとめました。

### ナレッジ（備忘録）用に
自分のナレッジを貯めて備忘録として使うことが主です。
業務で調べた内容を、一旦wikiに記載して後でまとめるという使い方もしています。

### 1次アウトプットとしての利用
Qiitaやブログに書く前に情報をまとめたいと思ったときは、BacklogのWikiを新しくたててそこに情報を集約させるようにしています。
こうすることで、『書く』という行為へのハードルが下がり習慣化しやすくなる気がします。また、文章の書き方の練習や情報のまとめ方の練習にもなって一石二鳥です:sunglasses:

### 技術書典などで本を書くときの一時
みんなで集まって1冊の本を書く場合Backlogは便利です。そのままプロジェクトマネジメントツールとしても使えますしWikiで情報をまとめておくこともできます。
更にGitも使用できるので、原稿などのバージョン管理なども可能です。


今更な内容だったかもしれませんが、もしまだ使ったことのない方は試してみてはいかがでしょうか。
他にもBacklogこんな使い方してるよーなどあればコメント下さい！
個人的に守って欲しい「3つのコーディング規約」

#はじめに

時にコーディング規約はめんどうですが、
何か一定の指針がなければカオスになりがちです。

守らなくてもいいけど、できれば守って欲しい、
極めて個人的な**3つのコーディング規約**をご紹介します。

#3つのコーディング規約

## ネストは3つまでに収める

深いネストはコードの可読性を低めます。

クラスやメソッドのネストは無視してもかまいませんが、
if文やfor文などの**ネストは３つ**ぐらいにしましょう。

## 1メソッドは画面に収める

具体的な数値だと、フォントサイズによりますが、
**行数は40行**ぐらいにしましょう。

1画面で見られない処理コードは可読性が低いと思います。

## 1行で見えるように収める

PCの大画面化に合わせてか、
最近はとても長いコードを書く人が増えた気がします。

私のテキストエディタは「右で折返す」設定がオンなので、
折返しが起こらない長さでコードを書いていただきたいです。

「右で折返す」設定がオフの場合は、
サイドバーが出ない長さを目安に書いてください。

**1行の文字数は半角80文字**ぐらいでお願いします。

#さいごに

この３つの規約は、もともと１つの規約でした。

それは「**画面に収まる**ようにコードを書いて」というものです。

しかし、これだと抽象的すぎて伝わらないので、
**３つの「収める」規約**にわけて具体的な数値目標にしました。

ちなみに、このコーディング規約は、
私が考えた理想のコーディング規約に沿って書いています。

何かの参考になれば幸いです。
プログラミング勉強の仕方

初学の方がどのように学習を進めるのがいいのか考えてみました。私はコラム的な記事を書くのには向いてない気がしていますが…結局のところ、作るしかないのです。

#楽しめること

目的意識なんかなくてもいいと思います。私が初めてコンピュータに触れた時は新鮮で感動の連続でした。世の中には様々な技術があります。自分なりの考え方や目的意識が育つまでは、色々触れるくらいの気持ちでいいのではないでしょうか。また、キャリアのために何々がx年で十分ということもありません。好きなことを好きなだけやるのが一番幸せです。まずは楽しめること。楽しめなければ長続きしませんし、帰るところがなければつまずいたときに辛いだけで不安しか残りません。経済的な側面だけではなく精神面の安定に気を使ってください。まずは色んな技術に触れて自分が共感できるものを探し、その環境で色々なものを作ってみましょう。

#手を動かすこと

db設計だけでプログラミングができないなど上流工程に特化した方に出会うことが偶にあります。机上の空論とはよく言ったもので、下流工程を知らずに上流工程だけではうまく回すのは難しいように思います。簡単な既存のソフトウェアのパクりでもいいので、まずは作ってみましょう。

#嫌いなこともやること

基礎は大事です。基礎が出来ていない人が応用を語ることはできません。ハードウェア的にどのような仕組みで動作しているのかを知ることはソフトウェア開発には有益ですし、数学的な概念を知ることはその理解に役立ちます。もし何をすればいいのか迷っているならば情報処理技術者試験の基本情報をお勧めします。実際の業務で役に立たないという評価もありますが、ソフトウェア技術者の中では取得している人も多くコミュニケーションの道具になることもあります。

#まとめ

ものを作ること。基礎を勉強すること。
macOSのgnuplotでpngcairoを使う

gnuplot 5.2.5 からcairoが必須になったようで、単に

```sh
brew install gnuplot
```

とすれば、`pngcairo`が有効になったgnuplotがはいります。

既にhomebrewでgnuplotを入れている場合は、

```sh
brew upgrade gnuplot
```

ではいります。

upgradeする場合、installしたときにつけていたオプション（`--with-aquaterm`など）は自動的に引き継がれるようです。

`pngcairo`は使えるようになったものの、出力されるpng画像は相変わらず微妙・・・（中途半端にアンチエイリアスが効いている）
MAMPでPHPからMySQLに接続するためのPDOの書き方

MacとMAMPの環境でPHPを学習するという方も多いと思います。

私が、上記の環境で学習していてPHPからMySQLに接続する時、ちょっとハマってしまった点があったのでこちらに忘備録も兼ねて記載しておきます。
#PDOの引数

PHPでPDOのオブジェクトを生成してデータベースに接続する際には、引数として以下のように3つ必要です。

```php
new PDO('接続文字列','ユーザー名','パスワード')
```

実際にMacとMAMPの環境で、PHPからMySQLのmydbという名前のデーターベースに接続する場合は、

`'接続文字列'`のところには接続するための情報として`mysql:dbname=mydb;host=localhost;charset=utf8`を、`'ユーザー名'`、`'パスワード'`として`root`を記入します。

完成するとこんな感じ。

```php
new PDO('mysql:dbname=mydb;host=localhost;charset=utf8','root', 'root');
```
　
　
ちなみに、XAMPPを使用した環境でデータベースに接続する際は、

```php
new PDO('mysql:dbname=mydb;host=127.0.0.1;charset=utf8','root', '');
```
と書きます。

PHP関連の書籍や動画教材などでXAMPPを使った環境で説明がされている場合もよくあります。
そのままコードを書き写しても、MAMPでは正しく接続できないということもありますので注意が必要です。

接続文字列のところで、MAMPでは`host=`に続くのが`localhost`なのに対して、XAMPPでは`127.0.0.1`になっています。
またパスワードがMAMPでは`'root'`と入力するのに対して、XAMPPでは`''`（空文字）であるというのが具体的な違いです。(MAMPもXAMPPもユーザー名もパスワードも、"初期値"の場合なので、自分で変更したりしたら変わります。)

#最後に
私は、XAMPPで解説している情報をもとにMAMPで学習しており、接続文字列の`127.0.0.1`と`localhost`の違いのところでハマっていました(汗)
【Live2D】開発言語やSDK / IDEの情報まとめ【Cubism/Euclid/2次マ】

#はじめに

この度、[**株式会社Live2D**](http://www.live2d.com/ja/)さんから**開発**に関する情報を
お聞きしたので、まとめていきます。

#[Cubism](http://www.live2d.com/ja/products/cubism3#dl)

[![lc.png](https://qiita-image-store.s3.amazonaws.com/0/213065/5ff7d165-694f-5dcb-15bf-ed9b2b0bec90.png)](http://www.live2d.com/ja/products/cubism3#dl)

###主要開発言語

|言語|バージョン|
|:---|:---|
|**Kotlin**|**Cubism 3**|
|**Java**|**Cubism 2.1**|

###Cubism SDK

|言語|プラットフォーム|
|:---|:---|
|**C#**|**"Unity"**|
|**C++**|**"Cocos2d-x"** / iOS / Android / Windows / Mac|

#[Euclid](http://www.live2d.com/ja/products/euclid#dl)

[![le.png](https://qiita-image-store.s3.amazonaws.com/0/213065/f60d0450-7529-1e2e-6056-a982d9092365.png)](http://www.live2d.com/ja/products/euclid#dl)

###Euclid SDK

|言語|プラットフォームやエディタ|
|:---|:---|
|**C#**|**"Unity"**|
|**C++14**|**"Qt5.6"**|

###統合開発環境(IDE)

|IDE|バージョン|
|:---|:---|
|**Visual Studio**|**2015**|

#[2次マ](https://nizima.com/)

[![image.png](https://qiita-image-store.s3.amazonaws.com/0/213065/547ede41-f807-674f-0816-073a762911c1.png)](https://nizima.com/)

|IDE|バージョン|
|:---|:---|
|**Visual Studio**|**2017**|
SPARQL覚書：プロ野球選手系のもろもろ

DBPedia Japanからデータをいろいろとってくる。
DBPedia Japanに反映されている情報を元にしているので、最新のデータと乖離があるかもしれないのはご容赦くださいませ。

## 全球団からHR打った選手一覧

```
PREFIX dbo: <http://dbpedia.org/ontology/>
SELECT DISTINCT ?name (group_concat(DISTINCT ?teamName; separator = ",") AS ?teams) (group_concat(DISTINCT ?positionName; separator = ",") AS ?positionNames)  ?battingSide ?throwingSide ?comment 
WHERE {
?link dbo:wikiPageWikiLink <http://ja.dbpedia.org/resource/全球団から本塁打>;
        <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://dbpedia.org/ontology/BaseballPlayer>;
 rdfs:label ?name;
dbo:position ?position;
dbo:battingSide ?battingSide;
dbo:throwingSide ?throwingSide;
rdfs:comment ?comment;
dbo:team ?team.
?team rdfs:label ?teamName;
dbo:wikiPageWikiLink <http://ja.dbpedia.org/resource/日本プロ野球>.
?position rdfs:label ?positionName
}
order by rand()
```

## MVPとった選手

```
PREFIX dbo: <http://dbpedia.org/ontology/>
SELECT DISTINCT ?name (group_concat(DISTINCT ?teamName; separator = ",") AS ?teams) (group_concat(DISTINCT ?positionName; separator = ",") AS ?positionNames)  ?battingSide ?throwingSide ?comment 
WHERE {
?link dbo:wikiPageWikiLink <http://ja.dbpedia.org/resource/最優秀選手_(日本プロ野球)>;
        <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://dbpedia.org/ontology/BaseballPlayer>;
 rdfs:label ?name;
dbo:position ?position;
dbo:battingSide ?battingSide;
dbo:throwingSide ?throwingSide;
rdfs:comment ?comment;
dbo:team ?team.
?team rdfs:label ?teamName;
dbo:wikiPageWikiLink <http://ja.dbpedia.org/resource/日本プロ野球>.
?position rdfs:label ?positionName
}
order by rand()
```

## 阪神タイガースの永久欠番

```
PREFIX dbo: <http://dbpedia.org/ontology/>
SELECT DISTINCT ?name (group_concat(DISTINCT ?teamName; separator = ",") AS ?teams) (group_concat(DISTINCT ?positionName; separator = ",") AS ?positionNames)  ?battingSide ?throwingSide ?comment 
WHERE {
?link dbo:wikiPageWikiLink <http://ja.dbpedia.org/resource/野球界の永久欠番>;
        <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://dbpedia.org/ontology/BaseballPlayer>;
 rdfs:label ?name;
dbo:position ?position;
dbo:battingSide ?battingSide;
dbo:throwingSide ?throwingSide;
rdfs:comment ?comment;
dbo:team <http://ja.dbpedia.org/resource/阪神タイガース>;
dbo:team ?team.
?team rdfs:label ?teamName;
dbo:wikiPageWikiLink <http://ja.dbpedia.org/resource/日本プロ野球>.
?position rdfs:label ?positionName
}
order by rand()
```
ライブラリとフレームワークの違い

ライブラリとフレームワークの違いがよくわからなかったので調べたことをまとめようと思います。
#ライブラリとは
ライブラリは特定の処理をするためのプログラムを集めたもの。
何か処理を行いたいとき、自分で０からプログラムを書かなくても、ライブラリが存在していれば、そのライブラリで代行できる。
#フレームワークとは
アプリケーションを作成するときに土台となるプログラムのこと。
アプリケーションを作ると似た処理がいくつか出てくるため、それらの共通処理を書かなくてもいいようにまとめたもの。
要するに骨組み。プログラマはこの骨組みにほしい機能を肉付けしていく。
#共通部分
ライブラリもフレームワークも労力を削減し時間を省いてくれる。
#ライブラリとフレームワークの違いは？
ライブラリはユーザーコード（ユーザが記述したコード）によって呼び出されます。
つまりユーザの意思で使いたいときに取り出すことができる便利な道具です。そのためライブラリはユーザから指示を受けて動くため、ユーザ自身がルールとなります。

しかしフレームワークはフレームワーク内のルール上で書いたユーザプログラムがフレームワークによって呼び出されます。
フレームワークがアプリのライフサイクルである、初期化から実処理、終了までの流れを管理しており、その要所要所で「なにをするべきか」をユーザプログラムに記述します。

要するにライブラリがユーザの書いたプログラムの歯車なのに対して、フレームワークはユーザーが歯車となりフレームワーク内のルールに沿ってプログラムを書きます。

この逆転プログラム実行の主体が逆転する性質のことを**制御の反転（主従の逆転）**という。
Macで映像を収録しつつ、同時に音声を確認できる方法

macOS Mojaveから画面収録、スクリーンショットがすごく簡単になりました。
`⌘+Shift+3`スクリーンショット
`⌘+Shift+4`選択部分スクリーンショット
`⌘+Shift+5`スクリーンショットか画面収録を選べる
この`⌘+Shift+5`が**やばい**。
## 今までのOS
- Launchpad or Spotlight or Alfredを起動(1 step)
- Quicktimeplayer(2)→file(ファイル)(3)→New Screen Recording（新規画面収録）を選択(4 step)
<img width="290" alt="Screenshot 2018-11-17 at 00.10.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/181534/62ebe293-1953-5e3c-8b10-8cc1e6baee55.png">
(完璧に余談だがこれは`⌘+Shift+4`からスクショを撮って直接編集できるようになった。)

- 赤丸の部分を選択して(5)、出力するデバイスを選択(大抵はsoundflower)(6 step)
- 真ん中の録画ボタンを押して(7)、クリック(全体収録)orドラッグ(部分収録)(8 step)


## Mojave以降のOS

- ⌘+Shift+5を押して(1)、全体収録か部分収録を選択し（2)、部分収録の場合は画面をドラッグして選択(3 step)
- optionで出力先を選択(4)、Record(収録)ボタンをクリック(5 step)

更に一度設定したところは変更しなくていいので最小で
- ⌘+Shift+5を押して(1)、Record(収録)ボタンをクリック(2 step)
### なんと2stepで行けてしまう!!これは神！

さて、本題に入ろう

# 手順
### Soundflower(音声録音ソフト)をインストールする
- [ここ](https://github.com/mattingalls/Soundflower/releases/)からdmgファイルをインストール

### Audio MIDI Setupの設定

- Audio MIDI SetupはMacにデフォルトで入ってるアプリなので普通に開く
- 左下の+ボタン→Create Multi Output Deviceを押す
- UseのチェックボックスでBuilt-in OutputとSound Flower(2ch)の2つにチェックを入れる
- System Preference(環境設定)→Sound(サウンド)のOutputでMulti Output Deviceを選択

![Screenshot 2018-11-17 at 00.53.26.png](https://qiita-image-store.s3.amazonaws.com/0/181534/91dc759a-a4c1-7e3b-0a8e-48d702685b85.png)


### 実際に収録する
- 撮りたい画面へ移動
- ⌘+Shift+5
- Record(収録)
- 撮れてるか確認
- 喜ぶ

これだからmacOSから離れられないのだ。。。
[参考記事](https://qiita.com/kidapu/items/4fcc7950a7f3e0478903)
macOS で再起動しても ssh agent に秘密鍵を保持させ続ける二つの方法

## 背景

まず前提知識として、ssh agent に秘密鍵を登録するには、通常次のようにする

```shell
$ ssh-add ~/.ssh/id_rsa
```

マシンを再起動すると消えるので、その場合、再度 ssh-add する必要がある。

macOS の ssh agent には特別に keychain に秘密鍵を登録する -K オプションがあり、それを使うと再起動のたびに ssh-add する手間を省くことができる。

```shell-session
$ ssh-add -K ~/.ssh/id_rsa
```

以前はこれだけで良かったのだが、Sierra (10.12) 以降では keychain に保存はされるものの、再起動時に自動では読み込まれなくなったので解決方法を記す。

## 1. .ssh/config に macOS 特有設定を書く

以下のような設定を .ssh/config に書いておくと、初回 ssh 時に keychain から自動で読み込まれるようになるのでお使い頂ける。

```.ssh/config
Host *
  UseKeychain yes
  AddKeysToAgent yes
```

## 2. ssh-add -K を打ち込む

```
ssh-add -K
```

のように秘密鍵の指定なしで打ち込むと、Keychain から読み込まれるので、これを `.bashrc` にでも書いてシェル起動時に読み込まれるようにすれば解決できる。

## 所感

個人的には 1. がオススメです。
「libpq-fe.h が見つけられない。」の解決法でも上手く行かない場合

## 問題の概要
①Amazon LinuxでPostgreSQLインストール後、bundle installしたら、pqエラーが発生
②下記のQiita記事を参考に、コマンドを入力したが、解決出来ず。

```
$ sudo yum install postgresql-devel
```
参考URL:[libpq-fe.h が見つけられない。](https://qiita.com/s_osa/items/9b72643c9f7185736395)
③発生したエラーは以下の通り

```
$ bundle install --path vendor/bundle

Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

checking for pg_config... yes
Using config values from /usr/bin/pg_config
checking for libpq-fe.h... no
Can't find the 'libpq-fe.h header
*** extconf.rb failed ***

An error occurred while installing pg (1.1.3), and Bundler cannot
continue.
Make sure that `gem install pg -v '1.1.3' --source 'https://rubygems.org/'`
succeeds before bundling.
```

##解決法
下記のサイトで同様の質問があり、回答通りに解決方法を試したら、無事に動作しました。
https://forums.aws.amazon.com/thread.jspa?threadID=268964

```
$　　sudo yum install postgresql96 postgresql96-server postgresql96-libs postgresql96-contrib postgresql96-devel 
```
##最後に
同じような問題に悩んでいる方に役立てられればと思い、今回の記事に纏めました。
依存リレーションシップとサロゲートキーとナチュラルキー

#はじめてのテーブル定義作成
初めて独力でウェブアプリを作成するので、テーブル定義書を作成したが、うまく作れなかった。
特に、外部キー（FK）に関する理解が薄くER図が作れなかった。
（親エンティティの主キー（PK）にしか外部キーを張れなかった。）
先輩のエンジニアやネット上で相談したところ、

* 依存リレーションシップ
* サロゲートキー
* ナチュラルキー

について理解するように指導して貰ったので、学んだことをアウトプットする。

##サロゲートキー
連番となるような、（例えば自動採番する）カラムを用意して主キーとする。これを**サロゲートキー**と呼ぶ。
**ナチュラルキー**には、別途、***ユニーク制約を付与する。***

##ナチュラルキー
業務的にそのテーブルをユニークにするキー
「患者名＋部屋番号＋ベッド番号」のように、**サロゲートキーと違い**、項目の内容自体が意味を持つ。

##依存リレーションシップ
親エンティティが存在しなければ、子エンティティが存在しえないもの。
言い方を変えれば、親エンティティのPKをたどると、子エンティティが参照できるもの。
また、依存リレーションシップでは、ER図を書く際には、PKにFKを指定しなければならない。

##なぜER図が作れなかったのか
ER図の作成には、ツールの「A5:SQL Mk-2」を用いてxamppのphpMyAdminで作ったDBからER図をリバース生成した。
A5:SQL Mk-2では、カーディナルのプロパティに**☑依存（親ー＞子）**のチェックボックスがあり、
チェックされた状態では、PKにしかリレーションを張れない。
なので、PKに指定されていないキーにFKを張ろうとしたのに、PKに貼られてしまうという事態が生じた。

##解決方法
カーディナルの依存のチェックを外すか、PKでないキーに対してリレーションを張ればよいが、わたしのミスはもっと単純で、本来FKを張るべきでないエンティティに対して、FKを張ろうとしていたので、対する誤ったエンティティーのPKにリレーションが張られていた。

###下記のサイトと先輩の言葉を参考にしました。
* http://dbflute.seasar.org/ja/manual/topic/dbdesign/surrogatekey.html
* https://thinkit.co.jp/free/tech/31/2/1.html
* http://d.hatena.ne.jp/simply-k/20100709/1278665985

ありがとうございました。
シンプルなPhoto Galleryを作ってみた

# Simple Photo Gallery

最近，flickrの写真をデータセットとして集めてます．🤔
しかし，莫大な量がありローカルにはダウンロードできないため，サーバー上で収集してます．

そこで不都合だったのが，写真はバイナリなのでターミナル上から確認できないこと．テキストならcatやlessでいいんだけど．．．
まあ，NASとかに落としても良いんだけど量が多いと中身が確認しずらいし，VNCは何か色々操作しずらいので好きじゃない．．．

そこで，簡単に確認できるものを作ろうと思ったのでシェアします．
パッと作ったので多少ガサツなのはあしからず．．．セキュリティとかは気にしてないです笑．

## 開発について

- 開発言語
    - Backend: php
    - Frontend: html, css, javascript (jquery)
- ポリシー: 楽で手軽に写真をcheckしたいのでシングルファイル

## 使い方

PHPで作ってるのでまずPHPはインストールお願いします．まぁ，MacとかUbuntuなら最初から入ってると思う．

上記にもあるように単一のPHPファイルのみにまとめました．以下のURLからダウンロードして，写真がまとめられてるディレクトリの１階層上に置けば準備完了．

[Simple Photo Gallery](https://github.com/ty-edelweiss/photo-gallery/releases/download/v1.0.2/gallery.php.gz)

配置が終わったら解凍して以下のコマンド叩けばok．

```
php -s 0.0.0.0:<port> gallery.php
```

スクリプトと同じ階層にあるディレクトリを，写真のコレクションとしてタブ分割して表示します．
ディレクトリ追加すれば自動でタブも増えます．

一応，キャッシュファイルが自動的にスクリプトのあるディレクトリに出来ます．別の何かをインストールするのが嫌なのでテキストで．．．
/tmpディレクトリでなくカレントディレクトリに出来ます笑(；´Д`A

あと，1000枚以上読み込むとPHPのビルトインサーバが，Momoryエラー出したのでランダムに1000枚ずつ読み込むようになってます．その都度ブラウザ更新して下さい．

まあ，これである程度簡単にサーバとかで沢山の写真が見れると思う．
用途としては，ザッと中身をみたい時とか，データ整形した沢山の写真を確認したい時とかに使ってみて下さい．👍

**最後に，他に何かこういう時に良いアプリ知ってたらコメントとかで教えて下さい〜**