OmniAICreator/Qiita-1.07M huggingface dataset:
弾の発射

オリジナルの弾の非表示　入力するスプライト：弾
![4-1.PNG](https://qiita-image-store.s3.amazonaws.com/0/214359/492e3f65-22ed-ecb3-d3ce-3f25fa0f728d.png)

弾のクローンを生成　入力するスプライト：弾
![4-2.PNG](https://qiita-image-store.s3.amazonaws.com/0/214359/5190f8cc-238f-a971-a0b6-62f33079a3e5.png)

弾の移動　入力するスプライト：弾
![4-4.PNG](https://qiita-image-store.s3.amazonaws.com/0/214359/e5293dd1-1af0-22c6-c601-651436274080.png)

[解説動画はこちら♪](https://www.youtube.com/watch?v=gf6tXl2SZwE&t=6s)

[目次に戻る](https://qiita.com/Getabako/items/fbb7d8b9ba7681b7191a)
PipedriveからAPI経由でデータを取得する

この記事は
===

* [Pipedrive](https://www.pipedrive.com/)というシンプルなSFA/CRMからAPI経由で取引情報を取得した際のメモです

手順
===

* rubyでアクセスします
* [pipedrive-ruby](https://github.com/GeneralScripting/pipedrive-ruby)というgemを使います

gemインストール
---

* 普通に入れます

```
$ gem install pipedrive-ruby
```

アクセス
---

* Pipedriveの画面からAPI用のトークンを取得しておきます
* READMEには記載がないですが、allというメソッドで全件取得ができます

```
require 'pipedrive-ruby'

token = 'xxxxx'
Pipedrive.authenticate(token)
deals = Pipedrive::Deal.all

p deals
```

* 取得されるデータは下記のような感じです

```
#<Pipedrive::Deal
  id=6,
  public_id=473900,
  creator_user_id={
    "id"=>3271440,
    "name"=>"Shota Onishi",
    "email"=>"xxx@example.com",
    "has_pic"=>false,
    "pic_hash"=>nil,
    "active_flag"=>true,
    "value"=>3271440
  },
  user_id={
    "id"=>3271440,
    "name"=>"Shota Onishi",
    "email"=>"xxx@exaple.com",
    "has_pic"=>false,
    "pic_hash"=>nil,
    "active_flag"=>true,
    "value"=>3271440
  },
  person_id=nil,
  org_id={
    "name"=>"Locus",
    "people_count"=>0,
    "owner_id"=>3271440,
    "address"=>nil,
    "cc_email"=>"xxx@pipedrivemail.com",
    "value"=>6
  },
  stage_id=2,
  title="Locus",
  value=50000000,
  currency="JPY",
  add_time="2017-11-21 04:55:55",
  update_time="2017-11-21 04:55:55",
  stage_change_time=nil,
  active=true,
  deleted=false,
  status="open",
  probability=nil,
  next_activity_date=nil,
  next_activity_time=nil,
  next_activity_id=nil,
  last_activity_id=nil,
  last_activity_date=nil,
  lost_reason=nil,
  visible_to="3",
  close_time=nil,
  pipeline_id=1,
  won_time=nil,
  first_won_time=nil,
  lost_time=nil,
  products_count=0,
  files_count=0,
  notes_count=0,
  followers_count=1,
  email_messages_count=0,
  activities_count=0,
  done_activities_count=0,
  undone_activities_count=0,
  reference_activities_count=0,
  participants_count=0,
  expected_close_date=nil,
  last_incoming_mail_time=nil,
  last_outgoing_mail_time=nil,
  cdca78a0b34a7869c0613f4045415ae9442ead3b=nil,
  df828efb37075639ec488d899cafe47b7bf7dd21=nil,
  stage_order_nr=2,
  person_name=nil,
  org_name="Locus",
  next_activity_subject=nil,
  next_activity_type=nil,
  next_activity_duration=nil,
  next_activity_note=nil,
  formatted_value="￥50,000,000",
  rotten_time=nil,
  weighted_value=50000000,
  formatted_weighted_value="￥50,000,000",
  owner_name="Shota Onishi",
  cc_email="xxx+deal6@pipedrivemail.com",
  org_hidden=false,
  person_hidden=false>
```

* ```cdca78a0b34a7869c0613f4045415ae9442ead3b```とか```df828efb37075639ec488d899cafe47b7bf7dd21```みたいな謎ハッシュ値の属性がありますが、これはカスタム項目みたいです
* カスタム項目を追加する時に発行されているIDのようなので、人によって異なるっぽいですね
Wordpressの管理画面ダッシュボードがエラーになる(攻撃された？っぽい)

表題のような問題が発生し、結果的に改修できたっぽいのでメモがてら
困ってる人へ共有

**レンタルサーバ**
Xサーバ
**Wordpressバージョン**
4.8.3
##症状##
ある日突然、管理画面のダッシュボード(ログイン直後の画面)がエラーとなり
ググる限りどこかの海外の方の記事がいくつか引っかかったものの
解決策らしきものが見つけられなかった
[https://wordpress.org/support/topic/wp-admin-index-php-keeps-changing/](https://wordpress.org/support/topic/wp-admin-index-php-keeps-changing/)
なので、サーバ上のwordpressフォルダと、ローカルにバックアップしておいたものの差分を取ると
以下のような差分が確認できた。

```
index.php //差がある
wp-load.php //差がある
wp-content/.htaccess //存在しなかったファイル
wp-content/index.php //差
wp-content/plugins/index.php //差
wp-content/plugins/.htaccess //存在しなかったファイル
wp-content/languages/admin-en_GB.mo //差
wp-content/languages/admin-en_GB.po //差
wp-content/languages/admin-network-en_GB.mo //差
wp-content/languages/admin-network-en_GB.po //差
wp-content/languages/en_GB.mo //差
wp-content/languages/en_GB.po //差
wp-content/uploads/index.php //存在しなかったファイル
wp-content/themes/index.php //差
wp-content/themes/[テーマフォルダ]/.htaccess //存在しなかったファイル
wp-content/themes/[テーマフォルダ]/404.php //差

wp-admin/includes/images.php //存在しなかったファイル
wp-admin/includes/index.php //存在しなかったファイル
wp-admin/maint/index.php //存在しなかったファイル
wp-admin/index.php //差
wp-admin/wp-load.php //存在しなかったファイル
wp-admin/ms-menu.php //存在しなかったファイル

wp-include/js/utilitis.js //ｃ
wp-include/js/cachexxxxxxxxxxxxxxxxxxx //存在しなかったファイル
wp-include/pomo/index.php //存在しなかったファイル
wp-include/pomo/so.php //存在しなかったファイル
wp-include/Requests/IPconfig.ini //存在しなかったファイル
wp-include/Requests/cachexxxxxxxxxxxxxxxxxxx //存在しなかったファイル
wp-include/Text/index.php //存在しなかったファイル
wp-include/Text/Tiff.php //存在しなかったファイル
wp-include/.htaccess //存在しなかったファイル
wp-include/class.wp-date.php //存在しなかったファイル
wp-include/functions.wp-date.php //存在しなかったファイル
wp-include/generalwtemplate.php //存在しなかったファイル
wp-include/template.php //差
```
上記、「差」と記載したものには怪しい記述などが追加されており、
「存在しなかったファイル」は、バックアップ時には無かったファイル

とくに
最上階層のindex.phpとwp-load.phpに変なファイルの読み込みが追記されているようで

```php:index.php
@include( dirname( __FILE__ ) . '/wp-includes/js/utilities.js' );
```
```php:wp-load.php
// Network host configuration. Not recommended edit this code!
@include ( ABSPATH . WPINC . '/Requests/IPconfig.ini' );
```
とりあえず、このへんの読み込み元、読み込み先のファイルを削除し、
問題の管理画面ダッシュボードの該当ファイルである
wp-admin/index.phpをバックアップ時のもので上書きすると
一時的にダッシュボードのエラーがなくなり、画面が表示された。**が、、、**

**サイトページを表示させ、もう一度、管理画面に戻ると
またエラーになる。**
(削除したはずのファイルも、また生成されている)

なので、
上記差分のあるファイル群全てを、削除・上書きすることにした

---

**[差があるファイル]**
→バックアップ時のファイルを上書き
**[存在しなかったファイル]**
→削除

---

すると、サイトを表示させてもダッシュボードがまたエラーになることはなかったので
wordpressを急いで4.9.1へアップグレード
まだ、再発しないか様子を見ている状況なので、なんとも言えないが
同様の症状で困ってる方のお役になれば幸いです。

最近、攻撃されたらしきwordperssの改修を何度か対応しましたが
「メールサーバを勝手に使われて、凄い数のスパムメールを送信する」というものだったが
今回の症状は初めてでした。
(内部的に何をされていたのか詳しいことはわかりませんが)
ステージの横スクロール

ステージのスプライトには以下の画像のようにスクロールする順番に別コスチュームとしてステージを読み込ませて下さい

![3-0.PNG](https://qiita-image-store.s3.amazonaws.com/0/214359/1362121b-de50-7481-b0a1-c8da38a4de9a.png)

※重要※
変数を作る時には「横スクロール」という変数は「すべてのスプライト用」にチェック、
「ステージのコスチューム」、「ステージの表示・非表示」という変数は「このスプライトのみ」にチェックして下さい
そうしないとバグります！！

ステージのコスチューム　入力するスプライト：ステージ
![3-1.PNG](https://qiita-image-store.s3.amazonaws.com/0/214359/496018d3-882b-1eca-66a2-527fa3d8f50b.png)

ステージの位置　入力するスプライト：ステージ
![3-2.PNG](https://qiita-image-store.s3.amazonaws.com/0/214359/33e0630e-24d2-1754-730d-bc37ffb8b9cb.png)

ステージの表示・非表示　入力するスプライト：ステージ
![3-3.PNG](https://qiita-image-store.s3.amazonaws.com/0/214359/cbd4a7ae-2ed7-7b84-b53b-0950dd3c2c36.png)

スクロールの移動　入力するスプライト：主人公
![3-4.PNG](https://qiita-image-store.s3.amazonaws.com/0/214359/c225d75b-6627-37cd-4730-53425bbc421a.png)

[解説動画はこちら♪](https://www.youtube.com/watch?v=8YBHHwcETEg)

[目次に戻る](https://qiita.com/Getabako/items/fbb7d8b9ba7681b7191a)
Xcode 9.1 のバグを踏んだ話（Playground コメントのレンダリング）

# はじめに
- 弊社では Swift 言語を学ぶ研修用のコンテンツを、 Xcode Playground として用意しています
- Swift 4 に対応しようと思い、 Xcode 9.1 でコンテンツを開いてみました
- そこには、バグが潜んでいました…

# 本来の挙動
- Playground では、特別なコメントを記述することによりページ間のリンクやリッチな表現が可能となります[^1]
- 画像では「Render Documentation」がチェックされており、正しくレンダリングされているのがわかります

    <img width="960" alt="playground_rendered.png" src="https://qiita-image-store.s3.amazonaws.com/0/100115/666fb132-ee5a-8930-7ede-730a6596e919.png">

[^1]: [Markup Formatting Reference: Markup Overview](https://developer.apple.com/library/content/documentation/Xcode/Reference/xcode_markup_formatting_ref/index.html#//apple_ref/doc/uid/TP40016497)

# Xcode 9.1 のバグ
- ページを移動すると、「Render Documentation」がチェックされているにもかかわらず、コメントがレンダリングされていません

    <img width="960" alt="playground_ bug.png" src="https://qiita-image-store.s3.amazonaws.com/0/100115/117943d7-6964-44a5-6ad8-4fdee419bc38.png">

# 対策
- 現状、ページを移動するごとに「Render Documentation」のチェックを付け直すしかなさそうです[^2]
- Apple も認識しているようなので、次のバージョンで修正されることを願うばかりです

[^2]: [Intro to App Development Playgrounds not operating | Apple Developer Forums](https://forums.developer.apple.com/thread/91163)
Maya | ネームスペースを全て削除する

図のようにネームスペースがたくさんあるときに、全てのネームスペースを簡単に削除できます。
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/52118/2c7bd25b-31da-32d6-f384-0486af801670.png)

```py
import maya.cmds as cmds

cmds.namespace(setNamespace=':')

for ns in reversed(cmds.namespaceInfo(listOnlyNamespaces=True, recurse=True)):
    if ns != 'UI' and ns != 'shared':
        cmds.namespace(moveNamespace=(ns, ':'), force=True)
        cmds.namespace(removeNamespace=ns)
```
ホワイトスペースと''の違い

<h1>ホワイトスペースと''の違い</h1>

・空文字とは、1文字以上の文字列。
・''は、空文字列（スペースすら入らない、0文字の文字列）です。
・NULLは、「文字列ですらない」もの。

いわゆるホワイトスペースは、スペースキーやtabキーを押してしまうとそれを1文字とコンピューターは認識する。
Kibela(情報共有ツール)が技術コミュニティ向けに無償化されたので導入した話

## はじめに
これは、[mohikanz Advent Calendar 2017](https://adventar.org/calendars/2578)の6日目の記事です。

mohikanzについては、[カレンダー1日目の記事](https://mohikanz.kibe.la/shared/entries/540aafc1-72b5-42a9-ba33-f49986faa22e)を御覧ください。

## 導入のきっかけ
私の所属する会社では、情報共有ツールに[Docbase](https://docbase.io/)を利用しております。 [esa](https://esa.io/)を使うグループも一部あったりはします。
私が入る前にはQiita:Teamを利用していた時期もあったようですが、どのような経緯で変更されたのかなどについては不明です。

mohikanzでは日々チャットで様々なことが話題に上がりますが、Slackのプランが無償である点や、チャットには即時的な効果がある反面、流れてしまうとあとから追っていくのが難しくなるというデメリットもあります。
技術的な話題であったり、あとから保存しておきたい話、mohikanzで開催するイベントの話など、pinだけではきりがない！ということが度々見受けられました。

そんな折、Kibelaの[こちらのブログ記事](http://blog.kibe.la/entry/2017/11/21/183214)を見つけ、特に後も先も考えずに申し込んでみたところ、承認していただけたという流れになります。

承認の流れに関する詳しい内容については、特に許可を受けているわけではありませんので割愛させていただきます。
気になった方は上記ブログ記事にしたがって申し込んでみてください。

## どういうことに使っているか
特別なことには使っていません。
今のところ、使い方のおおざっぱなガイドラインには以下のように記しています。

```
基本的にはエンジニアリングに関わることでも関わらないことでもなんでも良いです。

- イベントとか、残さないといけないメモ系が流れないようにする
- 社内の人にあんまり見せたくない系の個人のブログや日報として使う
- 何かコミュニティで共有したいことがあったら書き起こす
- アドベントカレンダーの記事起こし

などで使えると思います。

無料で使わせていただいているので、がしがし使っていきましょう！！
```

実際に投稿されている記事としては、アドベントカレンダーの記事のほか、
以前チャット内で話題に上がった`おすすめ池袋デートスポットまとめ`だったり、個人の作業用BGMをひたすらまとめた記事があったり、かなり自由な使い方をしています。
技術コミュニティのわりに全然技術っぽくないやん！ってなりそうですが、そのうち技術的なトピックも増えていくんじゃなかろうかと思っています。もしくは、これをお読みのあなたに書いていただいても全く問題はありませんよ！

## 今のところ技術的な話がないんだけど？
Slackに投稿通知のWebhookを設定してみた話をします。
1. https://myslackteam.slack.com/apps/manage/custom-integrations にアクセス
2. 着信Webhookに任意のチャンネルを設定し、URLをコピーする
3. https://myteamname.kibe.la/team/settings/outgoing_webhook にアクセス
4. 右部Webhookを追加するからSlackを選択し、SlackのWebhookURLを追加する

かんたん！

## 使ってみた感想(よかったところ、よくなかったところと要望)
### Pros
- プロダクション相当の機能が無償で使えるのは、単純にとてもありがたいし、ぜひとも続けて欲しい
- WikiとBlogを分けているのはDocbaseとかにはなくて良いなと思った。切り替えもとても簡単でよい
  - 例えばプロジェクトに関わる人に向けたドキュメントをグループ内でWikiとして投稿しつつ、日報は自分のブログとして投稿できる
  - こういう分け方をしてるサービスがあまり多くないので、ユーザーには最初わかりづらい側面もある ユースケースはサンプル投稿みたいな形で載せても良さそう
- Qiita:Teamとesaの記事インポート機能は便利っぽい
- G Suite認証に対応しているので、企業向けにも導入ができそう
- Blogは自分しか編集できなくて、Wikiは見れる人ならみんな編集できる is very good

### Cons
- 自分だけに公開する機能が下書きしかなさそう
- 登録がいまのところメールアドレスに直接招待メールを送るしか無いので、Slackのinvitationみたいな感じでいい感じに登録できるAPIがあったらいいな～って感じ
- APIもそもそも開発中みたいなので、これからに期待です
- Two Factor Authenticationあったらいいな(小声)
- 外部共有用の記事については、SNSで共有する機能があってもよさそう
- アナリティクス使いたい
- 投稿済みの記事を編集するボタンとかがわかりづらいので、工夫の余地はありそう

### その他コミュニティメンバーから上がった声
- 記事の並び順がわからぬ
  - ソートとか絞込はほしい
  - 会社でも使ってるのだが、前読んだ記事を探すときに探し方がわからなくなることが時々ある
- 『記事を書く』ボタンで、「記事、記事ってなんだ」となり、『▽』を押して Blog と Wiki しか無くて恐らくブログだろうなという予測が必要になったのが、気になりました。
- 記事の上の方に表示されてる「いいね」と「コメント」ボタン毎回押してしまう....
- 正直、オープンじゃないと見る気も登録する気も起きないなぁ  
→コミュニティの立ち位置的にオープンであるべきっていうのはまあわかる

## さいごに

全体的にまだまだこれから機能を追加していくみたいなので、これからに期待してます！
みなさんが所属するOSSや技術コミュニティ、研究室等でドキュメント共有ツールを導入したいと考えているのであれば、Kibelaも是非検討してみては！？というご提案です。

Qiita:Teamでもコミュニティ向けの無償利用のプランができたらいいなー、と期待しつつ記事を締めたいと思います。
ありがとうございました。
Project Euler Q33 【桁消去分数】

Project Eulerをワンライナーで解いてみる。
間違っていたらコメントください。


## 問題
$\frac{49}{98}$は面白い分数である.「分子と分母からそれぞれ$9$を取り除くと, $\frac{49}{98} = \frac{4}{8}$ となり, 簡単な形にすることができる」と経験の浅い数学者が誤って思い込んでしまうかもしれないからである. (方法は正しくないが，$\frac{49}{98}$の場合にはたまたま正しい約分になってしまう．)

我々は $\frac{30}{50} = \frac{3}{5}$ のようなタイプは自明な例だとする.

このような分数のうち, $1$より小さく分子・分母がともに2桁の数になるような自明でないものは, $4$個ある.

その$4$個の分数の積が約分された形で与えられたとき, 分母の値を答えよ.

## 解答

```bash
seq 12 98 |
awk '{for(i=10;i<$1;i++){if($1%11!=0&&i%11!=0){print i,$1}}}' |
awk '{for(i=1;i<=10;i++){printf $0" "};print ""}' |
awk '{for(i=1;i<=9;i++){gsub(i,"",$(2*i+1));gsub(i,"",$(2*(i+1)));print $1,$2,$(2*i+1),$(2*(i+1))}}' |
awk '$1$2!=$3$4&&$4!=0&&int($3/$4)==0' |
awk '$1==$3*$2/$4' |
awk 'BEGIN{a=1;b=1}{a*=$3;b*=$4}END{print a,b}' |
awk '{a=$1;b=$2;for(i=$1;2<=i;i--){if(a%i==0&&b%i==0){a/=i;b/=i}};print b}'
100
```

ちなみに対象の$4$つは、
$\frac{16}{64}$、$\frac{26}{65}$、$\frac{19}{95}$、$\frac{49}{98}$です。

※2018/01/22修正
最後の出力が答えだけになるように修正

## 答え合わせ
こちらのサイト様と一致していればOKとした。
http://kingyojima.net/pje/033.html
インスタンス運用アンチパターン

本記事はMastodon Advent Calendar 2017の4日目の記事です。

登録時に「インスタンス運用アンチパターン」などというキャッチーなタイトルをつけたものの、一体何を書くつもりだったのか忘れてしまったので、とりあえずインスタンスを運用していて思ったことなどを書きます。

# インスタンスの可用性向上は難しい
Mastodon本体は仮想サーバインスタンスに置くとして、マネージドサービスやオブジェクトストレージに機能分散したら可用性も処理性能も向上するんじゃないかと思ったら意外とそんなこともなかったりして、複数のサービスを使うと却って可用性が落ちるという事例を見てきました（サーバ単体で動かしてるインスタンスは案外強かったり、機能分散しているインスタンスは結構弱かったり）。可用性向上の知見がたまるまではサーバ単体運用最強なのかな・・・と思ったりします。

# 次々と変わる依存モジュール
Mastodonは今も活発に開発が進んでいるOSSなので、良い意味でも悪い意味でも枯れていません。バージョンが上がると必要な依存パッケージが増えたり、要求バージョンが上がったりします。これは結構苦労したなー。

# 証明書が更新されない？
MastodonのSSL証明書にLet's Encryptを使っている方も多いと思います。certbotのバージョンが上がって自動更新に失敗していたりしました。他を見れば、そもそも自動更新の設定を指定していなくて証明書の有効期限が切れたインスタンスが多くありました。Let's Encryptは証明書が切れるだいぶ前に警告メールを送ってくるので、ちゃんとチェックしましょう。

# Mastodon爆発的ブームの功罪
4月にバズったときに立てられて正しい運用管理がなされなかったインスタンスが多かったのかな、という気がしています。また、サーバをたてること自体がはじめて、という人も多かったように思います。頑張って運用してめきめきスキルを上げていった人もいれば、そもそもそこが目的じゃなかったので飽きて放置してアレアレしたケースも多かったのではないでしょうか。

# Mastodonの継続的発展のために
インスタンス運用の知見をためる、共有する仕組みが必要に感じます。この記事を書いている筆者は非エンジニアなのであまり難しいことはわからないですが、代わりに初心者向け記事を書くのを得意としています。自分が初心者だからこそ書けるのだと思います。今後もそういったかたちでMastodonに貢献していきたいと思います。
重力と主人公のジャンプ

重力とジャンプ　入力するスプライト：主人公
![2-1.PNG](https://qiita-image-store.s3.amazonaws.com/0/214359/eb69ed04-26df-b11d-d335-a39fb1a699e1.png)

[解説動画はこちら♪](https://www.youtube.com/watch?v=EZGaZR6NGq0)

[目次に戻る](https://qiita.com/Getabako/items/fbb7d8b9ba7681b7191a)
chrome拡張機能の審査を通した話

# 拡張機能の紹介(宣伝)
[isear (Integrated Search)]
(https://chrome.google.com/webstore/detail/isear/cihgmhbajkkbciealhbbfhbbnmgaekdj?hl=ja)
この拡張機能を作った時の話になります。
この拡張機能は、スムーズにページ内検索するための様々な機能を実装しています。
詳しい機能や操作方法などはリンク先にあります。
![Screenshot at 2017-12-05 09:54:29.png](https://qiita-image-store.s3.amazonaws.com/0/96468/a38c24d0-af8c-19bc-2c98-edef98e12d34.png)


# 審査の問題

isearのユーザー数が12人になった頃、GoogleWebStoreから審査が入りました。
ユーザー数10人を超えると審査が始まるのでしょうか...?

## 審査が通らない
審査では、拡張機能の説明に誇張表現がないか、ユーザープライバシーに配慮しているかなどいろいろ審査されます。
ただ、大まかにしか通知されません。

> 「関連性が無かったり、誤解を招くような文章が説明文やタイトルに含まれています」

大まかに、このような内容がメールで届きました...(ﾟДﾟ)ﾊｧ?
この時点で結構長い説明文を書いちゃってましたので、修正が大変そうだなぁと考えてたはず。

## 問題
細かい原因がわからないので、
<b>説明文を修正→再審査→修正→再審査→修正→再審査→修正</b>
のようにするしかありません。非効率です。

### 対策
これは連絡を取るしかない！と思いメールでChromeWebStoreサポートに非効率であることと、どこを修正すればよいのか詳細を教えてほしいことをメールで伝えました。

### 結果
審査が通りました(ﾟДﾟ)

しかも、審査対策のためにいろいろと修正を加える前の、初めて審査で弾かれたバージョンが。

### 考察
なぜ審査が通ったのか？
それは、「まともなメールが来たから」としか考えられません。
それまで何を試しても審査が通らなかったのに、メールをした途端審査が通りました。

# まとめ
メール以外に理由があるのかも質問してみたいですが、ChromeWebStoreサポートは定型文ばかり送信してくるのであまり期待はできないでしょう。
今回の件も、質問のメールに対して審査を通すという行動とその通知だけで、質問の答えは帰ってきませんでした。

釈然としませんが、こちらとしてみれば審査さえ通ればオールオッケーです。
DDDで考えるマイクロサービスのバリデーション

> この情報は古いです。リライトしました。
> http://hikouki.hateblo.jp/entry/2019/05/31/164944

この記事は [CrowdWorks Advent Calendar](https://qiita.com/advent-calendar/2017/crowdworks) 2017 の14日目です。

エンジニアリーダーの @hikouki です。

0からDDDでアプリケーションを立ち上げ中ですが、バリデーションの壁にぶち当たったので、
「バリデーション」はどう扱えばいいのか考えてみました。

## バリデーション

ここでは、ユーザー(外部システム)入力値に対する検証に限定します。

### どこでユーザー入力値を検証するべきか

ユーザー入力値のバリデーションは全て、Presentersion層で行うべきだと考えました。

理由は、「Application層に来た時点でユーザー入力値ではない」からです。
なので、Application層の引数が不正な場合は、例外(内部エラー)として扱うようにします。

### どこにバリデーションルールを定義するべきか

バリデーションルールには、業務知識を含むものと含まないものがあります。

例えば、以下のような感じです。

**業務知識**

- 注文番号は15桁
- emailは一意
- 名前は必須

**業務知識でないもの**

- 入力値Aの状態によって、入力値Bのルールが変わる（Presentersion層の都合）

まず、業務知識は ValueObject に定義して、
業務知識でないものはPresentation層に定義することを考えました。

業務知識をDomain層に書くことは正しいし、そうすべきです。

ですが、チームで話した結果、Domain層にバリデーションルールを定義しないことにしました。

理由は以下のような感じです。

- Presentation層と、Domain層でバリデーション定義が散らばる
- 場合によって、バリデーションルールが変わる（記事が下書きの時は、内容は空でも良いなど）

業務知識がドメイン層から染み出してしまうので、かなり悩みました。
ただ、コードの見通しや変更しやすさを優先しています。

## DBにアクセスする必要があるものはどう検証するか

これもどの層で検証するか議論が分かれます。

なるべく各層の依存関係をシンプルにしたいので、Presentation層からInfrastructure層を呼び出すことは避けたいです。

そこで、Application層で検証することにしてみます。

Application層で検証する場合、それはユーザー入力値ではないので、検証に失敗した場合、例外(内部エラー)を返します。

なので、APIの呼び出し元で事前に値を検証する必要がありそうです。

値を検証するためだけのAPIを用意して、検証した後で、呼び出してもらうような設計にしました。

重複しやすい値が高頻度で入力されるシステムの場合は、耐えられない気もしますが、
今のところ、そのようなデータを扱っていないので、この設計に落ち着いています。

## バリデーションエラーをどう表現するか

不正な入力値の場合、バリデーションエラーである旨、APIの呼び出し元に返す必要があります。

この記事では、「ある特定の社内サービスからgRPCで通信するマイクロサービス」を前提にします。

Viewを持たないので、リッチなメッセージを返す必要はなさそうです。

また、UXを良くする為に、エンドユーザーには早い段階で入力値の検証を行いたいことがあります。

その為、エンドユーザーへの入力値バリデーションは、マイクロサービスを使う側の責務としました。

マイクロサービス側は、期待していない値が入力された場合、例外(INVALID_ARGUMENT)として扱い、適切に障害通知して必要な情報をログに保存します。

APIの呼び出し元は、例外を受け取った場合、処理が継続不可能な状態として 「500エラー」の画面を表示させます。

## まとめ

チーム内でも意見が分かれる部分があり、かなり熱く議論しました。

DDD的な考え方から行くと、やっぱりDomain層にバリデーションルールを定義した方がいい気もしています。

ただ、メンバーの経験や、すでにある事例を参考にして意思決定を行いました。

バリデーションや例外の扱い方はアプリケーションの要件によって大きく変わる部分なので、一つの参考資料として見て頂けると幸いです。
MacBook Pro で esc が打ちづらい人のための、挿入モードからノーマルモードへの戻り方

## この記事は？
MacBook Pro は、esc がタッチバーに存在するため、打ったかどうかの判定が難しいです。
最初のうちは慣れればなんとかなるかと思いましたが、さすがに厳しい。
そこで、esc を使う以外で挿入モードからノーマルモードに戻る方法をまとめました。

## 解決案
#### 1. `Ctrl + 3` を使う
これは正統派ですね。元々 esc 使わなくてもこのコマンドでいけますので。

#### 2. .vimrc に `inoremap jj <esc>` を追加する
私はこれを使っています。
挿入モードの時に `jj` と押したらノーマルモードに戻ります。
何がいいって完全にホームポジションから手を動かさずに実行できるところですね。
二回キー入力をするので若干遅いかもしれませんが、それを補って余りある楽さがあります。

なお、コメントで教えていただきましたが `jj` じゃなくて `jk` にすると、遅いというデメリットが解消されて良さが高まりそうです。

### 追記

#### 3. `Ctrl-[` を使う
コメントにて教えていただきました。
apkから対応バージョンを探す方法

Android 6.0 に 調査用のapkファイルをインストールした所、INSTALL_FAILED_OLDER_SDKと言われた。
どうやらapkのバージョンがAndroid端末と合っていない事が原因の様だがapkが求めているバージョンが分からない。
このファイルを渡した人もどこかへ行ってしまって当分帰ってこない。
なのでapkから対応バージョンを探す方法を使って自分で確認しました。

`aapt d xmltree <apkファイル> AndroidManifest.xml | grep "minSdkVersion"`
`aapt d xmltree <apkファイル> AndroidManifest.xml | grep "targetSdkVersion"`


`appt`は各build-toolsの中にありました。
バージョン毎に存在していたのとパス通すのが面倒だったので直接フォルダに入りapptコマンドを叩いて呼び出しました。

```
C:\tools\android-sdk-win\build-tools\26.0.2>aapt d xmltree sample_v292_1.apk AndroidManifest.xml | grep "targetSdkVersion"
      A: android:targetSdkVersion(0x01010270)=(type 0x10)0x1a

C:\tools\android-sdk-win\build-tools\26.0.2>aapt d xmltree sample_v292_1.apk AndroidManifest.xml | grep "minSdkVersion"
      A: android:minSdkVersion(0x0101020c)=(type 0x10)0x18
```


targetSdkversion は 0x1a なので API:26
minSdkversion は 0x18 なので API:24

なのでAndroid6.0(API:23)では、このapkはインストール出来ない事が分かりました。
MyHDL との違い

「山が高いからといって、戻ってはならない」という諺があるらしい。Polyphony が登ろうとしている山はどれくらいの高さなのだろう？

MyHDLは Python から HDL を生成するツールだ。歴史も長く、多くのライブラリを持っている。使ってみる。

まずは定番 HelloWorld。iverilog などなくてもシミュレーションできる。その上、Verilog にも VHDL にも変換できるようだ(こっちが本来の目的だろう)。

```python:hello.py
from myhdl import Signal, delay, always, now, Simulation

def HelloWorld():

    interval = delay(10)

    @always(interval)
    def sayHello():
        print("%s Hello World!" % now())

    return sayHello


inst = HelloWorld()
sim = Simulation(inst)
sim.run(30)
```

LED strobe (いわゆるＬチカ）の [Tutorial](https://www.fpgarelated.com/showarticle/25.php)もあるようなので参考にされたい。

Polyphony と大きな違いは何だろうか？変数の扱いはその一つだ。例えば Tutorial の MyHDL の記述の一部は次の通りだ。strobe という信号に注目する。

```python:
 @always_seq(clock.posedge, reset=reset)
    def beh_strobe():
        # Generate the strobe event, use the "greater
        # than" for initial condition cases.  Count the
        # number of clock ticks that equals the LED strobe rate
        if clk_cnt >= cnt_max-1:
            clk_cnt.next = 0
            strobe.next = True
        else:
            clk_cnt.next = clk_cnt + 1
            strobe.next = False
```

strobe というオブジェクトは next を持ち、そこに値を入れる。その値は次のクロックで更新される値であり、すぐに反映されるわけではない。

一方、Polyphony ではどうか？

```python:
 def main(self):
        led:bit = 1
        while is_worker_running():
            self.led(led)
            led = ~led
            self._wait()
```

led という 1bit の変数は代入後、すぐにその値が反映される(ように見える Verilog-HDL コードを生成する)。

MyHDL は従来の HDL を尊重した書き方を重視しており、クロックを考慮した細かい制御が可能だ。その代り、多くの HDL 的な考慮が必要だ。変数の更新タイミングはその一例である。

Polyphony が目指す世界は従来のソフトウェア・コードをハードウェアになじませるにある。クロックはソースコードの後ろに隠れて見えてこない。その分、かゆいところに手が届かない部分もある。そういった部分は直接 Verilog-HDL を書くなり、MyHDL と連携するなりして補完していくことになる。
型推定:タイプヒントをつかう

Python にはタイプヒントというものがある。ヒントを与えるだけで Python のインタプリタとしてはなにもしない。

```python
def greeting(name: str) -> str:
    return 'Hello ' + name
```
PEP 0484 に詳しいが上のようなコードは name が文字列で戻り値も文字列であることを示している。示しているだけで、実行時には何ももしない。PEP の言葉を借りる。

「Python will remain a dynamically typed language, and the authors have no desire to ever make type hints mandatory, even by convention.」

型に関して Python がたどってきた道は奥が深い。Python2 から Python3 へバージョンアップする過程で int の解釈を変えている。

python2 のコードで次のようなコードを見かけたことがある。数字の最後に L の文字がある。python2 では整数がハードウェア依存の 32bit や 64bit に多少引きずられている。

```python:
a=0x12345678L
```

python3 では整数はより抽象的になった。int と long の区別はない。

```python:
python2
>>> print type(0x1000000000000000)
<type 'int'>
>>> print type(0x10000000000000000)
<type 'long'>

python3
>>> print(type(0x1000000000000000))
<class 'int'>
>>> print(type(0x10000000000000000))
<class 'int'>
```

Polyphony ではどうする？残念ながら Polyphony では int は任意のビット長にできるものの上限がある。対象がハードウェアなのでインタプリタのように数がある制限を超えたら領域を取り直して差し替える、と言ったことは出来ない。デフォルトでは 32 ビットになっている(64 や 128 に変更可能)。

ターゲットをどこにするかにもよるが、pynum でのハードウェアに引きずられた環境も歓迎されているところを見ると、現状で問題ないと踏んでいる。

一方、ハードウェア的な要求からビット幅を決定したいときがある。その時はどうしたらよいか？すでに Queue や Port で使用されているがその際には int64 や bit64 などを利用してもらいたい。数字は中途半端でもよい。例えば bit9 なども可能だ。uint は過去に導入したが deprecated とする方向だ。

これを使うとハードウェアの資源を抑えたコードを書くことが出来る。次に示すのは x_mem で内部的に使用されるメモリの宣言だ。

```python:
from polyphony.typing import List, bit, bit2, bit8

... 中略 ...

   def worker(self):
       block = [0] * self.max_block_n * BLOCK_SIZE # type: List[bit8]
... 後略 ...
```

変数の宣言にも使える。例をあげよう。

```python:
    data:bit8 = self.xmodem_in_q.rd()
```
```python:
    block_no:bit8 = 1
```

Polyphony は型推定を積極的に行っているので、書かなくてもよいところもある。例えば、上記の rd() から読み取った値を代入する変数は型推定で自動的に bit8 になる。
もっとライブラリを！import を使う

Python には import という便利な機能がある。これを使えばファイルを分割して管理できる。ちょっとしたライブラリが書けるというわけだ。

まずは簡単なところで定数をライブラリ化しよう。

```python:asicc_const.py
SOH = 0x01
STX = 0x02
EOT = 0x04
ACK = 0x06
DLE = 0x10
NAK = 0x15
CAN = 0x18
```
これは、次の記事で使う予定の xmodem が使うアスキーコード。必要なところだけを書いている。(おって、全部に対応する予定)

使う側は python と同じ方法で import 出来る。

```python:
from ascii_const import EOT, ACK, NAK, CAN
```

class や関数も同様に import 出来る。次の記述は x_mem という class と定数を import した例である。

```python:
from xmodem_mem import x_mem, CMD_NOP, CMD_WRITE, CMD_READ, BLOCK_SIZE

@module
class xmodem_m2q:
    def __init__(self):
        self.xmodem_in_q  = Queue(bit8, 'in',  maxsize=128)
        self.xmodem_out_q = Queue(bit8, 'out',  maxsize=128)
        self.mem = x_mem()

        self.idouk  = Queue(bit8, 'out')
        self.append_worker(self.worker)

...
後略
...
```

これはかなり強力だ。class から動的にオブジェクトを生成するとることは出来ないが、__init__ からであれば、それは静的に配置される。x_mem のコンストラクタを見てみよう。

```python:
@module
class x_mem:
    def __init__(self, max_block_n = 8):
        self.max_block_n = max_block_n

        self.bin_in_q = Queue(bit8, 'in', maxsize=128)
        self.bin_out_q = Queue(bit8, 'out', maxsize=128)

        self.cmd = Queue(bit2, 'in')
        self.cmd_busy = Port(bit, 'out', init=0)
        self.append_worker(self.worker)
...
後略
...
```
こちらでは Queue として bin_in_q や bin_out_q、cmd が生成されている。これらは外部と通信する口なので、外からアクセス可能である。つまり、自分のモジュールに x_mem を取り入れて、この Queue を使って通信することが可能なのだ。

この方式を使うとライブラリを使いまわすことが出来、一気に汎用性が増す。将来的に Polyphony が取り入れるであろう関数オブジェクトの機能が加わると、より汎用性は増す。
Firefox Quantum では FirePathが使えない！

Firefox 57 (Quantum)がリリースされ、Seleniumでテストケースを書く際にDOMを特定したりするのに便利に使っていたFirebugやFirePathなどのプラグインが使えなくなって困ってはいないでしょうか？
かくいう私もFirebugで頻繁に利用していたInspectに関してはFirefox Developer EditionにもInspectがあるので何とかなっているのですが、FirePathを使ってのDOMの検証については該当する機能が見つからずに困っていたのですが、InspectorをオープンしてConsoleタブから同等の操作を行なえることがわかりました。

```Console:XPathを使ってエレメントを検索
>>$x("XPathの文字列")
```

```Console:CSSを使ってエレメントを検索
>>$$("CSSの文字列")
```

こんな感じで…
![スクリーンショット 2017-12-04 19.17.02.png](https://qiita-image-store.s3.amazonaws.com/0/148717/41b932eb-4a04-8bae-783c-e363d9a224fe.png)

![スクリーンショット 2017-12-04 19.17.27.png](https://qiita-image-store.s3.amazonaws.com/0/148717/c500b479-7595-309d-ca7f-0e3e7decc7b6.png)
おひとりさまSlackのすすめ

本記事は[Slack Advent Calendar 2017](https://qiita.com/advent-calendar/2017/slack)の3日目の記事です。

Slackはチャットツールなので普通は複数人で使うもの、だと思いますが、僕は複数人で使うチームの他に「おひとりさまチーム」を持っています。

# ちょっとしたメモやURL備忘録に
Facebookとかで気になる記事のURLが流れてきたとき、シェアするとあとで発掘するのが大変なので、Slackに貼るようにしています。サムネイルが残るので何のリンクだったかわかりやすいのと、Twitterであれば全文サムネイルに残る（こともある）ので、魚拓にもなります。

# 通知用に
とはいえ上記は他のツールで容易に代替できてしまうもので、わざわざSlackを使うまでもないかもしれません。Slackであればwebhookを活用した通知や情報取得の自動化でしょう。

さくらインターネットの[シンプル監視](https://manual.sakura.ad.jp/cloud/appliance/simplemonitor/index.html)は、対象がさくらインターネットの保有するIPアドレスであれば無料で利用可能なため、個人ユーザーでも気軽に利用することができます。私用で運用しているサーバの監視の通知先としてSlackを使っています。

# Slackは環境
結局これが書きたかっただけなんじゃないのかというような見出しですが、Slackにはコミュニケーションツール以外の使い方もあるよ、ということです。
もっとアプリを！Xmodem にチャレンジ

パソコン通信と呼ばれるコミュニティには参加したことがなかったのでXMODEM もほとんど使ったことがない。スマホ時代の人も XMODEM なんぞ使う機会はないだろう。組み込みシステムの世界ではシリアル通信は今でも必要なのでTera Term を使ったことがある人は一定数いるに違いない。そして、Term Termにはちゃんとその機能 XMODEM がある。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/99921/e04180ed-9bec-0bce-3fda-e1adc7a0fdbd.png)

プロトコル詳細はウィキペデイアの XMODEMに譲るとして、ここでは polyphony を使用した XMODEM の設計についてフォーカスしよう。

#メモリのシミュレーション
XMODEM を FPGA に導入したいという動機はパソコン通信ではない。画像データなどをメモリへロード、メモリからセーブするのに利用することを想定している。対象相手は最終的には DRAM になるが、現時点では BRAM でシミュレーションすることにしよう。そして、そのシミュレーションも Polyphony で記述する。

x_mem がそのシミュレーションをするモジュールだ。NOP, WRITE, READ の cmd を受け付け BRAM に WRITE なら書きこみREAD なら BRAM から読み出す。実際のデータのやり取りは queue から行う。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/99921/2c82042d-7a91-5639-5b3c-f70f23d68eb0.png)

#XMODEM 書き込み:QUEUE からメモリへ
xmodem_q2m class は in_q から XMODEM のプロトコルを受け取り、out_q へ返事をする。そして、要求に応じて x_mem へコマンドを送信しデータを"アップロード"する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/99921/bf28f140-d10f-23b9-99ef-42a2b0f3c968.png)

さて、ソースはどうしたものか？gist に張り付けておくことにしよう。現時点では BRAM が対象なので実用性はない。近いうちに DRAM に対応することにしよう。

https://gist.github.com/ryos36/62d48e37346048b00f502ce12d29565f
https://gist.github.com/ryos36/cf50b30425a37b49f177fe8a827d37cd
https://gist.github.com/ryos36/cb07a8287a4a14f6532a3a8e29c1ec49
システムバス(Lattice ice40)につなぐ

文章を書くときは vim を使っている。30 年前はマイフェス(MIFES)と ATOK だった。OS は MS-DOS 3.1。未だに、出版社に原稿をあげるときも TeX だったりする。ほぼテキストなので文章は使いまわせる。Lattice のシステムバスにつなぐという話はインタフェースの 2018 年1月号に書いている。その記事を元に構成しなおそう。

ターゲットは Lattice iCE40 だ。iCE40 は内部にシステムバスと呼ばれるものを持っている。非常に簡単なバスでアクセスは比較的簡単だ。雑誌の記事では全ソース載せられてない。200 行を超えるので、ここでも一部としよう。

なお全文は [gist](https://gist.github.com/ryos36/1611dff6d106fad185891120d3351dc3) にデバッグの生々しいコメントアウトも含めてあげてある。

```python:read_spi_data16
   def read_spi_data16(self):
        debug_v:uint3 = 0

        debug_v = 4
        #self.debug.wr(4)

        self.write_data(0x06, 0x18)
        self.write_data(0x0A, 0xC0)
        self.write_data(0x0D, 0xFF)

        while True:
            irq_status = self.read_data(0x06)
            irq_trdy = (irq_status >> 4) & 1
            if irq_trdy == 1 :
                self.write_data(0x06, 0x10)
                break
        self.write_data(0x0D, 0xFF)
        #self.debug.wr(5)

        debug_v = 1

        while True:
            irq_status = self.read_data(0x06)
            irq_rrdy = (irq_status >> 3) & 1
            debug_v = 7 ^ debug_v
        #    self.debug.wr(debug_v)
            if irq_rrdy == 1:
                self.write_data(0x06, 0x08)
                break
        data0 = self.read_data(0x0E) << 8
        debug_v = 2
        #self.debug.wr(2)

        while True:
            irq_status = self.read_data(0x06)
            irq_rrdy = (irq_status >> 3) & 1
            if irq_rrdy == 1:
                debug_v = 4 ^ debug_v
                #self.debug.wr(debug_v)
                self.write_data(0x06, 0x08)
                break
        data1 = self.read_data(0x0E)
        #self.debug.wr(1)

        self.write_data(0x0A, 0x80)
        return (data0 | data1)
```

メソッド read_spi_data16 は PmodALS からデータを読み込むプログラムだ。write_data や read_data が実際にシステムバスと通信をしている。

```python:write_data
    def write_data(self, addr:uint8, data:uint8):
        self.rw(1)
        self.addr(addr)
        self.data_out(data)
        clkfence()
        self.stb(1)
        clkfence()
        wait_value(1, self.ack)
        clkfence()
        self.stb(0)
```

```python:read_data
    def read_data(self, addr:uint8):
        data:uint8 = 0
        self.rw(0)
        self.addr(addr)
        clkfence()
        self.stb(1)
        clkfence()
        wait_value(1, self.ack)
        data = self.data_in.rd()
        clkfence()
        self.stb(0)
        return data
```
clkfence という特別な関数が順序性の追い越しをしないように制御している。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/99921/4570f515-0cbc-24db-002a-ae19721af6bb.png)

Polyphony は将来的にもう少しこの辺を便利にしようかとも思っている。ただ、クロックという考え方と、コンパイラがパイプラインを生成するという発想は、著しく相性が悪いことはわかっている。この部分のブレイクスルーがあると次の世代の HLS に行きつくのかもしれない。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/99921/6a8de732-5d35-dc59-3c19-b611cad95c6d.png)
開発の過程では Arty Z7 をデジアナの代わりに。
主人公の表示、主人公の横移動

主人公の表示　入力するスプライト：主人公
![1-1.PNG](https://qiita-image-store.s3.amazonaws.com/0/214359/c5f775f8-db6d-3c32-3c5c-84957cb25ab3.png)

主人公の横移動　入力するスプライト：主人公
![1-2.PNG](https://qiita-image-store.s3.amazonaws.com/0/214359/ff14ab78-f7e5-5045-7d1b-14685c6ad85b.png)

[解説動画はこちら♪](https://www.youtube.com/watch?v=x3JP1xo-uns&t=137s)

[目次に戻る](https://qiita.com/Getabako/items/fbb7d8b9ba7681b7191a)
MySQL


参考URL
https://dev.classmethod.jp/etc/mac_mysql_install/

【TO DO】
・Workbench(GUIツール)をダウンロード
・MySQLサーバーをbrewでインストール


①まずMySQLをインストールする
ホームディレクトリで、コマンドを実行するとインストールが始まる。
`$ brew install mysql`
インストールが完了したら、MySQLを起動させる。
`$ mysql.server start`
インストール、起動が完了したら初期設定を行う。
`$ mysql_secure_installation`
・rootパスワード変更(8文字以上にしないと進めない)
・匿名ユーザーの削除
・リモートホストからrootログイン禁止
・テスト用データベース削除
・ユーザー権限が保存されているテーブルをリロード
などに関してYesかNoを入力する。基本Yesにして問題ない。

これでパスワードの設定が完了！
接続情報に関してはコマンドを入力して確認する。

接続を終了する
`quit`

接続する

`mysql -u root -p`


MySQLサーバー接続情報表示

`mysql> \s`

接続IDを取得

`mysql> SELECT CONNECTION_ID();`

現在のセッションの認証に使用されたユーザー名とホスト名を取得

`mysql> SELECT CURRENT_USER();`


現在のユーザー名とホスト名を取得

`mysql> SELECT USER(); `

サーバーが起動しているかどうか調べる

`C:\mysql\bin> mysqladmin ping `


ここで、
mysql> SHOW DATABASES; 　　　　　　　　　             //DBの確認
mysql> CREATE DATABASE データベース名;　             //DBの作成
mysql> USE データベース名　　　　　　　　            　//使用するDBの選択
mysql> CREATE TABLE test (id INTEGER,title text);  //tableの作成
など、queryを実行できるようになる。

現在のデータベース名を取得

`SELECT DATABASE();`




②MySQLWorkbenchを使ったDBと接続


postgresでいうpgAdminがMySQLのWorkbench(GUI)
なので、インストールして設定を行う。

まずはダウンロード
https://dev.mysql.com/downloads/workbench/

ダウンロードし、インストールして、Appを開く
開けたら、[ + ]と[レンチ]のボタンがあって、レンチの方のボタンを押す。

左下にあるNEWボタンを押して新規で接続するサーバーの設定を行う
Connection Nameを設定する。
以下のコマンドで確認可能。初期ではおそらく[localhost]になっている

mysql> \s
mysql> SELECT CURRENT_USER();

Connection Name：localhost

他は変更せずにTestConnectionボタンを押すとパスワードを入力する画面が出てくる。
[$ mysql_secure_installation ]の時に設定したパスワードを入力。
するとpgAdminのようにDBを操作できるようになる。
SublimeText3の検索でEnterで次の単語へ移動させる

## 内容
command + F で検索する際に検索窓でEnterを押すと改行されてしまい、次にヒットした単語に移動するにはcommand + Gでできるがこれが結構うざい。

なので、Enterをクリックして次にヒットした単語に移動するように変更したい。

## やり方
1. command + shift + P でコマンドパレットを開く
2. keybindと入力し、「Preferences: key bindings」を選択する
3. 設定ファイルが開くので、```// Find panel key bindings```の下3行のコメントアウトを外す

```
	{ "keys": ["enter"], "command": "find_next", "context":
		[{"key": "panel", "operand": "find"}, {"key": "panel_has_focus"}]
	},
```

## 問題点
以前あったらしい、日本語を検索したとき文字が消える不具合が復活する。。。
コピペだと一応消えないので、日本語検索が必要な時は別の場所に書いてコピペで対応してます。
この不具合発生させないのとEnterで次の単語へ移動するの両立する方法があったら教えて欲しいです(´・ω・｀)


SublimeTextは速いからサブエディタとして使ってますが、設定が面倒だったり日本語対応が微妙だったりでイマイチ・・・
エンジニアと協働するときにデザイナーとして気をつけていること

# はじめに
初めまして、@Aya_Furusawa です。
現在は株式会社トレタでデザイナーとして働いています。
１年半前から家庭の大黒柱として娘3歳と学生の夫と仲良く暮らしています。
(公共のサービスや支えてくれる家族、会社の仲間には感謝の気持ちでいっぱいです!)


最近デザインの記事をヲチしていて「デザイナーと組織」「デザイナー主導」などのキーワードを見ることが多くなってきたと感じています。
そこで自分なりに、エンジニアとプロジェクトを進めて行く時に気をつけている点をいくつか書いてみようと思いました。

※この記事はトレタ 2017アドベントカレンダーの12月5日の担当記事です。


## 改善のタネはいつも手の中に握っておく
![PAK69_penwomotunotedesu20140312_TP_V.jpg](https://qiita-image-store.s3.amazonaws.com/0/19185/57b6e30c-ae31-214c-9335-1432d21a10b9.jpeg)


あれやりたい、これやりたい、ということをこまめにエンジニアに雑談ベースで話しておくと、お互いに心づもりがしやすくなりますね。
すぐに改善したいことをプロジェクトの序盤などに１つ差し込んでおくことで自分の居場所を見つけやすくなります。
さらに改善されるユースケース（具体的なクレームや、どこの誰が言っている、なども良い）とそれによって改善される指標なども追加すると、より説得力が上がります。
顧客要望や社内で自分の関連するプロダクトに関する情報に常にアンテナをはると、改善のタネを発見しやすくなります。

## 見えないものを作る方法
![PB256850o_TP_V.jpg](https://qiita-image-store.s3.amazonaws.com/0/19185/06b1df4d-bc95-9801-f8c9-fa5675cf8c88.jpeg)

デザイナーは、まだ誰も見たことのないものを一番最初に形にします。
会議などでアジェンダを見ながら話すよりも、実際にデザインを見ながら話すほうがより具体的な話ができるようになります。
ワイヤーフレームをディレクターが描くケースもあると思いますが、実際デザインを作る段になると意外と色々なことがみえてくるものです。
情報が多すぎる、少なすぎる、想定しているターゲットがバラバラ、プロダクトの目的って何だっけ・・・？
こういう時は、デザイン案を何個か作って「これはないね」を全員で確認していくと良いと思います。

エンジニアに対しては、みんなこんな仕様だと思ってるよ、あと私はこうしたいよ、大丈夫？と伝えるためにも粗案を見せると有効だと思っています。
チームが課題にフォーカスするために捨て案を作ることも時には大事ですね。


## ユーザーの何を聞かれても答えられるように準備する
![YUKI86_musimegane15141124_TP_V.jpg](https://qiita-image-store.s3.amazonaws.com/0/19185/f3aa33ee-78f2-b544-d488-8b8c5bb62ab4.jpeg)

人は自分の知っていることしか知りません。しかしそれを知っているだけでもアクションを取ることができます。

トレタは幸いカスタマーサポートやセールスが同じフロアの中に居るので、私はよく分からないことを聞きに行っています。
どういう時にこの機能を使うのか、それは１日のうちでどれくらいの時間を締めるのか、そもそも毎日どんなルーチンワークがあるのか、そんな時にいやなケースはどんな事か、など。
２、３人でいいので、その人（ユーザー、あるいは元ユーザー）の生活が想像できるようになるくらいまで聞いてみると、結構なリアリティを持って開発チームにユーザー像やストーリーを語れるはずです。
そういった事情がわからないと、何のためにこの機能を実装するのか、どこまで想定しなくちゃいけないのか、予想する事が難しいので仕事も辛くなりがちです。
普段オフィスに籠もりがちなエンジニアには特にフレッシュな情報を共有するべきだと思っています。

現場を知っているスタッフからのホンネの引き出し方を身につけると、ぐっと仕事が楽になります。
また、ユーザーフローのどこに対して要望が生まれたのかを意識してヒアリングする事も大事にしています。　


## 意図と目的を何回も伝える
![OOK85_dorageb220150201192214_TP_V.jpg](https://qiita-image-store.s3.amazonaws.com/0/19185/d4bc1781-5482-daca-15f3-2b05668397c2.jpeg)
最近、社内でコニュニケーションの勉強会がありまして、その時学んだ事で次の日から役に立ったことがあります。
何故このデザイントーンなのか、何故この課題なのか、何故この機能なのか、などを何回でも説明するように心掛けています。
あと、説明した上でこちらの持っていったものが違うねの場合も全然ある事なので、べき論理詰めってつい「ふええ…」となりがちですがそういった場合でも顔に出さないように、一旦受け入れると平和でよいですね。


デザイナーだからって、パーフェクトにスマートにプロジェクトを引っ張ろうとしなくて良いと思います。
ケースバイケースで自分のできることを１つずつ増やしていくほうが、自分にとっても向いていること、向いていないことを確認しながら進めていけるのでよいです。

ただ、デザイナーが顧客調査をやることで、ユーザーへの共感をチームに持ち帰る事ができますし、その結果膨らまし過ぎた妄想に現実的に実現可能なラインというエッセンスを加えてくれるのもエンジニアさんなので、やはり早めにいろいろ相談できる関係は望ましいです。


結びに、エンジニアやプロジェクトマネージャーなど、それぞれの立場からみてどんなデザイナーがやりやすいか、のご意見もお待ちしておりますので、コメント欄で教えていただければと思います。
メリークリスマス。
AngularJS視点でAngular仕様を理解する

# イントロダクション

## 用語
- AngularJS : AngularJS バージョン1.x
- Angular : Angular バージョン2以降

## 目的
AngualarJSでの開発経験があり、Angular2以降を使えば実行速度も開発効率も上がっているのは分かるんだけど学習コストが。。。
という人向け

# 主な変更点

## Typescriptファースト
[Typescript Configuration](https://angular.io/guide/typescript-configuration)
TSで書きましょう

## コンポーネント指向
Component = Controller(ts)、View(html)を含む機能単位のパーツ
Angular CLIも初期設定でng g componentすると、コンポーネント単位でロジックやテスト、htmlやcssを作成する

## 定義の変更
AngularJSの基本であった、ng-appやng-controller、$scopeはなくなった

|                              | AngularJS         | Angular           |
|:-----------------------------|:------------------|:------------------|
| モジュール                    | angular.module    | @NgModule         |
| アプリ起動                    | ng-app            | bootstrapModule   |
| コンポーネント（コントローラ）  | ng-controller     | @Component        |
| スコープ                      | $scope            | this              |

## 記法の変更
ng-hoge →

- [hoge] : プロパティバインディング、属性ディレクティブ
- (hoge) : イベントバインディング
- [(hoge)] : 双方向バインディング
- *ngHoge : 構造ディレクティブ


|                              | AngularJS                         | Angular                          |
|:-----------------------------|:----------------------------------|:---------------------------------|
| スタイルクラス                | ng-class                           | [ngClass]                       |
| スタイルプロパティ            | ng-style                           | [ngStyle]                       |
| 表示／非表示                  | ng-show / ng-hide                  | [style.display] / [hidden]      |
| リンク／画像                  | hg-href / ng-src                   | [href] / [src]                  |
| イベントハンドラ              | ng-*event*                         | (*event*)                       |
| 双方向バインディング          | ng-model                           | [(ngModel)]                      |
| 条件分岐                     | ng-if                              | *ngIf                            |
| 多岐分岐                     | ng-switch                          | [ngSwitch]                       |
| 多岐分岐（要素）              | ng-switch-when / ng-switch-default | *ngSwitchCase / *ngSwitchDefault |
| 繰り返し処理                  | ng-repeat                          | *ngFor                          |


## Angular CLI

scaffold(yoとか)、タスクランナー（gulp、gruntとか）的なことをまとめてやってくれる管理ツール。
AngularJSの開発では雛形作るのにYeomanとか使っていたがその代わりという感じ。

プロジェクト作成

```
ng new my-app
```

コンポーネント作成

```
ng g component my-component
```
serialplotter　その3

#概要

serialplotter作ってみた。
c#で作ってみた。
Arduino-Schedulerに、書き換えてみた。
115200ボーで送る。
時間軸は、2ｍｓ

#写真
![ana.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/ef298eca-1e5b-6aaf-cfc3-ab6d8078524d.jpeg)


#サンプルコード

```
#include "Scheduler.h"

volatile bool bState = false;
volatile bool sState = false;
volatile bool flg = false;
volatile int count = 0;
volatile byte b0[20];
volatile byte b1[20];

void setup1()
{
}
void loop1()
{
	int i;
	int j;
	count++;
	if (count > 159)
	{
		count = 0;
		sState = !sState;
		flg = true;
	}
	i = count / 8;
	j = count % 8;
	if (digitalRead(2) == LOW)
	{
		if (sState)
		{
			b0[i] |= _BV(j);
		}
		else
		{
			b1[i] |= _BV(j);
		}
	}
	else
	{
		if (sState)
		{
			b0[i] &= ~_BV(j);
		}
		else
		{
			b1[i] &= ~_BV(j);
		}
	}
	bState = !bState;
	digitalWrite(13, bState);
	delay(1);
}
void setup()
{
	Serial.begin(115200);
	pinMode(13, OUTPUT);
	pinMode(2, INPUT);
	digitalWrite(13, LOW);
	while (!Serial);
	Scheduler.start(setup1, loop1);
	Serial.println("start");
}
void loop()
{
	if (flg)
	{
		if (sState)
		{
			Serial.write(b1[0]);
			Serial.write(b1[1]);
			Serial.write(b1[2]);
			Serial.write(b1[3]);
			Serial.write(b1[4]);
			Serial.write(b1[5]);
			Serial.write(b1[6]);
			Serial.write(b1[7]);
			Serial.write(b1[8]);
			Serial.write(b1[9]);
			Serial.write(b1[10]);
			Serial.write(b1[11]);
			Serial.write(b1[12]);
			Serial.write(b1[13]);
			Serial.write(b1[14]);
			Serial.write(b1[15]);
			Serial.write(b1[16]);
			Serial.write(b1[17]);
			Serial.write(b1[18]);
			Serial.write(b1[19]);
		}
		else
		{
			Serial.write(b0[0]);
			Serial.write(b0[1]);
			Serial.write(b0[2]);
			Serial.write(b0[3]);
			Serial.write(b0[4]);
			Serial.write(b0[5]);
			Serial.write(b0[6]);
			Serial.write(b0[7]);
			Serial.write(b0[8]);
			Serial.write(b0[9]);
			Serial.write(b0[10]);
			Serial.write(b0[11]);
			Serial.write(b0[12]);
			Serial.write(b0[13]);
			Serial.write(b0[14]);
			Serial.write(b0[15]);
			Serial.write(b0[16]);
			Serial.write(b0[17]);
			Serial.write(b0[18]);
			Serial.write(b0[19]);
		}
		flg = false;
	}
	delay(10);
}



```

以上。
【第一弾】git マスターになりたい

#gitを使いこなせるようになりたい。
仕事で初心者プログラマーとして働き5ヶ月目。依頼案件の実装を行うところまでは少し出来るようになってきた。しかし、gitの操作が危く最近注意される。根本から理解したい。

##■年内に力にしたいこと
- 開発環境でのmigration操作
- rebase, merge, fetchの根本理解
- git pull は不要説に対して意見ができる状態
- コマンドをミスった時にreset ORIG_HEADをすると怒られる(上司に)理由を徹底解析
- 手動でやっているリリース作業をjenkinsでGUIで行えるようにする（shell記述）

###■開発環境でのmigration操作
- 一発ですんなり実行できた試しがない。

###■rebase, merge, fetchの根本理解
今のとこの理解は以下。

- rebase： たとえばgit rebase masterだったら、masterを土台にして今いるブランチのコミットを上乗せするイメージ。その過程でConflictが起きたら修正する。
- merge：　ブランチで行ったcommitを時間軸でmerge先ブランチに突っ込んで合わせること
- fetch： ローカルの作業を、リモートブランチにて更新する
 
###■git pull は不要説に対して意見ができる状態
- 意見できない。pullはリモートのコードを引っ張ってくる。

###■コマンドをミスった時にreset ORIG_HEADをすると同僚に怒られる理由を徹底解析
-　間違えてcommitを遡りすぎてユーザーから「昨日まで使えていた追加機能が使えなくなった」というクレームになるから？

###■手動でやっているリリース作業をjenkinsでGUIで行えるようにする（shell記述）
-　Mysql文はjenkinsのshellコマンド部分に挿入してデータ抽出できたが、リリース作業はどうするのか。ssh ~ → /var/www/directory → git fetch → git checkout origin/branch を一括で行えるようにすればいいのか？
MacPCのアップデートでgcc/g++が使えなくなった時の対処法

# MacPCをUpdateした事でコンパイラがなんか使えない.......

```
which g++
```
その結果
```
/usr/local/bin/gcc
```
と表示される

```
sudo ln -sf /opt/local/bin/g++  /usr/local/bin/g++
```

**ln コマンド : ファイルやディレクトリにリンクを張る**
**-s : シンボリック・リンクを作成する**
**-f : リンク先に同名のリンク・ファイルがあるときも警告なく上書きする**


```
which g++
```
その結果
```
/usr/bin/g++
```

Updateでコマンド・ラインが使えなくなった時はぜひぜひ上の条件を試してみてください(^^)/
jailbreakを使ってExport不能な証明書をWindows10から抜く

# ツール

これを使うだけ→[iSECPartners/jailbreak: Jailbreak](https://github.com/iSECPartners/jailbreak)

ただ，使い方があんまちゃんと説明されてないのでメモを残しておく．
昔Windows7で使ってた時とちょっと使い勝手が変わった気がする．
なぜか，jbstore64ではなくjbstore32を使うと，うまく動作する．

# 使い方

1. このツール自体がマルウェア扱いされてて，環境によってはウィルス対策ソフトとかproxyとかで弾かれて管理者にログ送信されたりするので，環境の準備はよく注意しておくこと
1. cmdを管理者権限で開く
1. 証明書のSubject Nameを調べるため，一覧する

    ```bat:
    > jbstore32.bat -l
    ```

1. 表示したSubject Nameを使って，当該証明書のみを出力する

    ```bat:
    > jbstore32.bat -1 -n "Subject Name"
    ```

1. out.pfxが出力されるのだが，バイナリファイルのあるところ（binariesディレクトリ）に出力されるので，注意．  
   ちなみにパスワードは'password'
AWSをさわってみたのでつまずいた点などをメモ

本記事は[サムザップ Advent Calendar 2017](https://qiita.com/advent-calendar/2017/sumzap)の5日目の記事です。
昨日は@tomoriakiさんの[ゲームエンジニアが紙ヒコーキワークショップをやってみた](https://qiita.com/tomoriaki/items/cc12a8c06be1fae1dcbc)でした

## 前提

・ インフラ歴半年
・ 業務では主にGCPを使用
・ GCPでできることをAWSで再現
・ 基本的にはterraformで構築
・ 大体検証期間は2週間くらい

## 目指したこと

既存のプロジェクト(GCP)と同等の開発環境構築 


## 手順
※ 下記に記載する順番どおりに行ったわけではなく、記載上の問題で番号を振っています。

### 1. VPC構築

まずは何はともあれVPCとサブネット、サブネット配下にインスタンスを1台作成しました。

<font color="Red">つまずき1</font>
インスタンスにsshアクセスできない!
※ FWの設定(awsではセキュリティーグループ(sg)っていうのかな)はingress port:22許可したのに

<font color="Blue">原因と解決</font>
**インターネットゲートウェイ**(igw)ってものをサブネットにアタッチしないとprivateなサブネットになってしまい、アクセス出来ないとのこと。

---

### 2. VPCにpriveteとpublicのサブネット構築

1.でigwを置いたけどそもそも接続出来ない領域分けたいよね、ということでサブネットを2つ作ってigwをアタッチするpublicサブネットとアタッチしないpriveteサブネットを作成
それぞれにインスタンスを1台ずつ置きpriveteインスタンスにはpublicインスタンスからinternal接続する

<font color="Red">つまずき2</font>
privateサブネットに置いたインスタンスで`yum update`できない

<font color="Blue">原因と解決</font>
privateサブネットだと外へのアクセスもできないらしい
**NATゲートウェイ**(ngw)というものをpublicサブネットに配置して、それ経由でpriveteサブネットのインスタンスは外へのアクセスをできるようにした。

※ 最初は名前的に**Egress Only インターネットゲートウェイ**だと思ったけど、こちらはipv6らしい

<font color="Orange">TIPS</font>
S3への接続はなにもしないと外部経由になってしまうらしい
**エンドポイント**(ep)というものをVPCに配置するとinternalで接続できるのでVPCを作ったらとりあえず、epも配置しよう!!

---

### 3. プロジェクトと開発環境の構成

1,2でVPCはだいたい出来たけど、
・ プロジェクトが違う場合
・ 環境(development, staging, productionなど)が違う場合
どのようにネットワークを分けて構築すればいいかを考えた。


<font color="Blue">参考</font>
下記サイトでアカウントを分ける場合とVPCを分ける場合を分かりやすくまとめている
こちらを参考に本番と開発を分け(パターン4)、開発はVPCで分ける(パターン2-1)ように考慮した
https://dev.classmethod.jp/cloud/aws/account-and-vpc-dividing-pattern/

---

### 4. LBの作成

TCP, HTTP, HTTPSロードバランサの作成

<font color="Red">つまずき3</font>
terraformのmoduleロードバランサ関連多くてどれ使えばいいか分からん

<font color="Blue">原因と解決</font>

|terraform module名|awsでの呼び方                                 |備考                               |
|----------------:|-------------------------------------------:|----------------------------------:|
|elb              |classic ロードバランサ                          |                                   |
|alb              |application ロードバランサ                      |非推奨<br>(今後のバージョンアップで削除予定)|
|lb               |application ロードバランサ<br>network ロードバランサ|基本的にはこちらを使用する                |

<font color="Orange">TIPS</font>
application LBはマルチAZ構成を強制されているのでゾーンの違うpublicなサブネットを2つ用意する必要がある。

---

### 5. インスタンスのホスト名解決

gcpではinternalな通信にホスト名を使用できる。

<font color="Red">つまずき4</font>
awsだとホスト名がipでつけられそもそも分かりづらいので、ホスト名を設定しつつ名前解決をしたい。

<font color="Blue">原因と解決</font>
インスタンス登録時にtags:Nameにインスタンス名を設定し、そのインスタンス名とprivateIPをroute53でレコード登録する

サーバ自体はterraformのprovisionerで下記を実行

```
sudo sed -i -e "s/localhost.localdomain/[ホスト名]/g" /etc/sysconfig/network
sudo hostname [ホスト名]
```

---

## まとめ

・ awsはgcpに比べてやれることが多い分、使う側がネットワークの知識とか結構求められるな！という印象を受けました。terraformのコード量もgcpの2倍くらいになった気がする。

・ マルチAZ構成を考える際は結構パフォーマンスに注意する必要がありそう。別ゾーンへのアクセスはパフォーマンスが落ちるという検証結果が結構あるので、問題ないように構成を考えないといけない

・ あとはざっくりgcpはブラックリスト、awsはホワイトリストなセキュリティーな印象

## terraformのコード
https://github.com/bayguh/terraform_aws

---

明日は@Gaku_Ishiiさんの記事です。
Ubuntu 17.10でのIPアドレス変更（固定IPアドレス）

17.10から、IPアドレスの変更が/etc/network/interfacesを弄る方式から変わったようなので、メモとして残しておきます。

## interfaceの確認

`ifconfig`もしくは`ip addr`を実行して変更対象のinterface名を確認しておきます

```
root@localhost:~# ifconfig
eno1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
```

## IPアドレス変更

`/etc/netplan/01-netcfg.yaml`を開き、後はお好みでIPアドレスを変更していきます。以下は設定例になります

```yaml
root@localhost:~# cat /etc/netplan/01-netcfg.yaml
# This file describes the network interfaces available on your system
# For more information, see netplan(5).
network:
  version: 2
  renderer: networkd
  ethernets:
    eno1:
      dhcp4: no
      addresses: [192.168.1.3/24]
      gateway4: 192.168.11.1
      nameservers:
        addresses: [192.168.11.1,192.168.11.2]
      dhcp6: no
```

## IPアドレス変更の反映

`netplan apply`を実行して反映して完了です。再起動までは必要ないです

```
root@localhost:~# netplan apply
```

## 参考

[Configuring Static IP Addresses on Ubuntu 17.10 Servers – Website for Students](https://websiteforstudents.com/configuring-static-ips-ubuntu-17-10-servers/)
Redux でクソゲー作成60分チャレンジ 2時間目



先日は連打ゲーという面白くもないアプリを作ったのですが、今回はもう少しロジカルで遊べるゲームを追加しました。
[Redux でクソゲー作成60分チャレンジした \- Qiita](https://qiita.com/elzup/items/1536e7defaa83dd1dfc8)



# 作りたかったもの
16個数字を順番に押すゲーム(の9個バージョン)

# 作れたもの
それ
![pwaa-speed9.gif](https://qiita-image-store.s3.amazonaws.com/0/40717/e66eb04e-fe67-c9fa-90a2-21cf3da9f763.gif)

ページ: https://elzup.github.io/pwaa/#/speed9
コード: https://github.com/elzup/pwaa

**PC の場合は Window の幅を変えることで難易度を変えることができます。**


# 60分の作業動画
[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/Zo9RC898W9M/0.jpg)](http://www.youtube.com/watch?v=Zo9RC898W9M)

https://youtu.be/Zo9RC898W9M
今回はちゃんと撮れててよかったです :tada:

# 設計
昨日作った連打ゲームと実は設計が大きく違っいます。
前回はタイムもゲームの進行状態もすべて Redux で管理していたのに対して、今回はゲームのスコアのみ管理しています。React Component にロジックを詰め込むのは良い設計なのかよくわかりません。(そもそもゲームなのでよくわからない)

設計といってもなにも考えずタイムアタックなのでどう実装したかですが。
GoogleAppsScriptでの出力方法

# はじめに
はじめまして。
GAS歴1ヶ月の経験の浅い若輩者ですが、よろしくお願いいたします。

# GASにおいての『hello world!』の出力方法
GAS単体による出力は下のソースのように`Logger.log()`を使う方法、`Browser.msgBox()`を使う方法、`toast()`を使う方法の３つがあります。

```
function myFunction() {
  var message = "hello world";  

  // 以下出力方法
  Logger.log( message );
  Browser.msgBox( message );
  SpreadsheetApp.getActiveSpreadsheet().toast( message , 1 );
}
```

# それぞれの特徴
`Logger.log()` はAPIを使ってログファイルに保存しています。Command+Enterでログを確認することができます。 `Browser.msgBox()` はプログラムを一旦停止させ、入力待ちの状態になります。ユーザーの操作によって動作を変更したいときに向いています。 `toast()` はブラウザの右下にメッセージボックスが出てきます。トースト焼き器のように出てくるからこの名前がついたそうです。

# まとめ
出力方法それぞれに長所があるので、そこを生かして使い分けましょう。そのほかにもGASなら、googleドキュメントやgmailへの出力が簡単にできるので、自分にあった開発をしていけたらと思います。

それでは。
[MySQL5.7] データベース保存先を変更する

# はじめに
MySQLのデータベース保存先を変更する際に手間取ったのでマニュアル化。

# 環境
|項目|バージョン|
|----|----|
|**OS**|CentOS 7.4|
|**MySQL**|MySQL 5.7|
|**移行元**|``/var/lib/mysql``|
|**移行先**|``/database/mysql``|

# 概略
![image.png](https://qiita-image-store.s3.amazonaws.com/0/165355/c4325a64-13c2-5256-e4ee-355f6afbd523.png)

+ 当初、``/etc/my.conf``の中身を書き換えて参照先を変えようとしていた
+ アクセス権とか``socketファイル``とか諸々の問題が出てきてうまく行かなかった
+ 諸々：サービス自体は起動できてるのにクライアントからログインできないとか
+ 予定を変更して、シンボリックリンクを貼ることで対応した

# 手順

## 念のためデータディレクトリを確認する
```bash:console
mysql -u (user_name) -p
```

```mysql:console
show variables like 'datadir';
```

## MySQLサービスを止める
```bash:console
systemctl stop mysqld
```

## データディレクトリをコピーしてリネーム
```bash:console
cp -prf /var/lib/mysql /database
mv /var/lib/mysql /var/lib/mysql.org
```

## シンボリックリンクを作成してサービス起動
```bash:console
cd /var/lib
ln -s /database/mysql

systemctl start mysqld
```

## SELinuxとの関係性
何かエラーが発生した場合、とりあえずSELinux止めて動くかどうか確認してください。

# うまく行かなかった方法
[**こちら**](http://network.station.ez-net.jp/os/linux/db/mysql/datadir/centos/5.4.asp)の方法で対応したのですが、どうもうまく行きませんでした…。
他の文献を見ててもこのやり方で上手く行ってるので、こちらの設定が誤っている可能性がありますが…シンボリックリンク貼ったほうがお手軽でいいかな、と。
IDCFクラウドの、Vulsテンプレート

# この記事は？

IDCFクラウドさんでは、Vulsのテンプレートサーバが用意されています(コミュニティテンプレート、と呼ばれています)。これについて解説します。

# IDCFクラウドのテンプレート？

このテンプレートを使えば、簡単にVulsサーバを構築できるので、すぐに運用に乗せられる可能性があります。

- Dockerで構築すれば簡単という話もありますが…
- 月額500円で利用できる、サーバサイジングとしています
- 作ってくれたのは、IDCFのエバンジェリストの方

# どんな感じか

IDCFテックブログに、Vulsテンプレートを使う話が出ています。

- http://blog.idcf.jp/archive/category/Vuls
    - Vuls祭り#1 から記事があるので、古参？ですね

# 利用した感じ

必要に応じて、データ領域を増やした方がいいかもしれません。

- 対象サーバが多い、スキャン結果の保存期間を長期とする場合は、resultsディレクトリの増加が考えられるので、ディスクを追加して移動させた方が良いかもしれません。

アップデートスクリプトがありますが、自動化はやめた方がいいかもしれないですね。

- vulsは、時折、後方互換性のない大型アップデートがあります。過去データが見れなくなる場合があるので、確認してからアップデートしましょう

大幅バージョンアップも簡単かも

- 大幅バージョンアップのたびに Vulsテンプレートを更新して頂いてるようなので、新旧平行稼働をさせて移行/動作確認が可能。Vulsサーバ自体も、一般のクラウドサーバのように使い捨てて最新化できる。

# まとめ

Docker使えよ、という話もありますが、クラウド側のシステムを使う分にはVulsテンプレートは有用かもしれません。マカレルとも連携しているクラウドなので、一緒に監視も仕込めますし。

…という、まったく技術的ではない、Vulsの話でした。おわり。