OmniAICreator/Qiita-1.07M huggingface dataset:
アプリをインストールせずに、オフラインでMarkdownをhtmlに変換してみる

最近では、ちょっとしたメモや手順書などもMarkdownで書くことが多いかと思います。
自分のPCでは、Visual Studio Codeを愛用しているのですが、
アプリのインストール、ネット上のサービスでの編集・閲覧が憚られるマシンでの作業でもMarkdownをプレビューしながらの編集ができないかと考えました。

今回、拙作の [Ménneu](https://github.com/shellyln/menneu) というライブラリーを使用します。
Ménneuは動的ドキュメントの生成を行うCLIアプリです。Markdownからhtmlへの変換も可能です。[Puppeteer](https://github.com/GoogleChrome/puppeteer)によるPDF化・画像化も行えます。
通常は[npm](https://www.npmjs.com/package/menneu)からグローバルインストールして使用しますが、今回はブラウザー用のビルドを使用し、[API](https://github.com/shellyln/menneu#apis)から利用します。

以下の方法でメモ帳とモダンブラウザーのみで、Markdownをプレビューしながらの編集ができます。

~~本当にインストール・ネット接続が憚られるマシンにはGUIが動いていないし、動いていてもIEしか入っていない(Windows Serverの場合)ですね。~~


### 手順

1. `menneu.min.js` を[ダウンロード](https://github.com/shellyln/menneu/releases)します。
2. 以下のコードを `app.js` として保存します。

```js
const start = (async () => {
    const buf = await menneu.render(document.getElementById('md').innerHTML, {}, {
        rawInput: true,
        inputFormat: 'md',
        outputFormat: 'html',
        title: 'Markdown example',
        markdownBodyStyle: 'font-family: "Yu Gothic Medium", YuGothic, meiryo, helvetica, arial, sans-serif;',
    });
    document.write(buf.toString());
    document.close();
});
```

3. `menneu.min.js`、`app.js` を `js/` サブフォルダーに保存します。
4. 以下のhtmlファイルを作成します。

```html
<!DOCTYPE html><head><meta charset="UTF-8">
    <script src="js/app.js"></script>
    <script src="js/menneu.min.js" async onload="start()"></script>
</head><body><h1>Please wait...</h1><script id="md" type="text/markdown">

ここにMarkdownを記述します。
# Hello!
## h2
### h3

</script></body>
```

以下のフォルダー構成になります。

```
articles/
 ├── js/
 │    ├── app.js
 │    └── menneu.min.js
 ├── article1.html
 │     ...
 └── articleN.html
```

5. 作成したhtmlをモダンブラウザーで開きます。
6. テキストを編集したら、F5で更新します。
    * ~~Firefox・~~Edgeでは、リロードで表示更新できません。
        * ~~Firefoxでは、アドレスバーに`Enter`を入力するか、`Alt + ←`ショートカットで前のページに戻ってください。~~
        * Edgeでは、アドレスバーに`Enter`を入力してください。
        * `document.write()`でページ全体を書き換えた時点でアドレスバーの表示とは別のページに遷移している、という扱いです。
    * Firefoxは、下記「[追記(2018/9/28)](#%E8%BF%BD%E8%A8%98-2018929)」のhtmlであれば、`F5`で更新できます。
7. 「形式：ウェブページ、完全」にて別名で保存すると、htmlに変換されて保存されます。

### 注意
* `script`タグ内に書いているので、`script`の閉じタグは`&lt;/script>`とエスケープする必要があります。
    * コードブロックでは`&lt;`がそのまま出力されるので、<code>&lt;/script&gt;</code>を表現できません。
        * `code` タグと実体参照を使用することはできますが、Markdownの変換時に構文解析されないので、`class="language-xxx"`を付けてもハイライトされません。

以上です。


### 追記 (2018/9/29)
validなhtmlに拘らなければ、htmlは少し短くできます。

```html
<meta charset="UTF-8"><script id="md" type="text/markdown">

# Hello!

</script><script src="js/app.js"></script>
<script src="js/menneu.min.js" onload="start()"></script>
```


### CDNから利用できるようになりました (2018/10/16更新)
以下のhtmlでリポジトリからファイルをダウンロードせずにお試しできます。

```html:Notebook.html
<!DOCTYPE html><head><meta charset="UTF-8"></head><body><script type="text/markdown">

# Hello!

</script>
<script src="https://cdn.jsdelivr.net/npm/menneu-md-notebook@0.0.2/articles/js/mkd.js"></script>
<script src="https://cdn.jsdelivr.net/npm/menneu-md-notebook@0.0.2/articles/js/menneu.min.js" onload="start({title: 'My Notebook 1'})"></script>
</body>
```
テスト（Rails）について

## ゴール

- 要求仕様通りに動作すること
- 要求するデザインになっていること

## 疑問点

- どこまでテストを書くべきか = 計画、分析、納期で決める
- どの優先度でテストを書けば良いか = 計画、分析、納期で決める
- どのようにテストを書けば良いか = フレームワークに合わせて決める

————-

## どこまでテストを書くべきか

### テストの種類

- Model = 単体テスト
- Controller = 結合テスト
- View = 受け入れテスト

## どの優先度でテストを書けば良いか

Railsの場合は設計思想が Skinny Controller なので、

1. Model
2. View
3. Controller

という優先度の場合が多い。

### その他の指標

1. 機能の重要性
    - 企業側の損失
    - ユーザ側の損失
    - 復旧の大変さ  
2. テスト実装のコスト

この辺りは直行表が参考になる。

## どのようにテストを書けば良いか

### rspecを使用する

- Model
- Controller
- View(js.e2e)
    - selenium-webdriver 3.6.0
    - Capybara 2.15.4
    - Chrome 62
    - ChromeDriver 2.33

### 関連ツール

- テストデータ生成 = FactoryBot
- テストデータ = Faker
- データの初期化 = DataBaseCleaner

### テストのリファクタリング

- 開発段階、開発終了後では必要なテストは変わる
- 特にE2Eのテストは、リリース前は粒度が高いが、リリース後はviewの変更などもあるため絞り込む必要がある
- Model > E2Eのテストのようになる必要がある. E2Eでバリデーション（エラー）の確認は行うべきでない

### Document

- Capybara
- Rspec
- FactoryBot
ZEAM開発ログ v.0.4.12 マクロからコンパイルエラーやウォーニングを生成する

ZACKYこと山崎進です。

fukuoka.ex もくもく会が終わった翌日も，もりもり創作意欲が湧いているので，書き綴ってみたいと思います。今回は小ネタで，マクロからコンパイルエラーやウォーニングを生成する方法について調べてみました。

[「ZEAM開発ログ 目次」はこちら](https://qiita.com/zacky1972/items/70593ab2b70d192813df)

# マクロからウォーニングを生成してみる

```elixir
defmodule Foo do
  defmacro raise_warn do
    :elixir_errors.warn __ENV__.line, __ENV__.file, "warning"
  end
end
```

結果

```elixir
$ iex -S mix
iex(1)> require Foo
Foo
iex(2)> Foo.raise_warn
warning: warning
  iex:2

:ok
iex(3)> 
```

# マクロからエラーを生成してみる

```elixir
defmodule Foo do
  defmacro raise_error do
    :elixir_errors.parse_error __ENV__.line, __ENV__.file, "error", <<>>
  end
end
```

結果

```elixir
$ iex -S mix
iex(1)> require Foo
Foo
iex(2)> Foo.raise_error
** (TokenMissingError) iex:2: error
    expanding macro: Foo.raise_error/0
    iex:2: (file)
iex(3)> 
```

エラーはちょっと「コレジャナイ感」がありますね。。。

次回は[「ZEAM開発ログ v.0.4.13 マクロを使って micro Elixir のフロントエンドを作ってみる (野望編)」](https://qiita.com/zacky1972/items/828ccfc4ce79e716541c)をお届けします。お楽しみに！
MacOSのvagrantにvagrant-libvirtプラグインをインストールする方法

MacOS上で `vagrant-libvirt` プラグインをインストールするとエラーが出て苦労してたんだけど、やっとインストール方法がわかったので自分用備忘録。

```bash
$ NOKOGIRI_USE_SYSTEM_LIBRARIES=1 CONFIGURE_ARGS="with-libvirt-include=/usr/include/libvirt with-libvirt-lib=/usr/lib/libvirt" vagrant plugin install vagrant-libvirt
```

これでいけます。

バージョン情報
MacOS: 10.13
vagrant: 2.1.5
vagrant-libvirt: 0.0.43
virtualbox: 5.2.18

細かいライブラリは `brew` でインストールしてください。
TPUがcolaboratoryで使えるらしいけど、TPUってなんだろう？

昨日、同僚の方より、colaboratoryでTPU使えるようになったらしいよ！と以下の記事をご共有いただきました。

[Google ColaboratoryのTPUを試してみる](https://qiita.com/koshian2/items/25a6341c035e8a260a01)

> 9/26夜、Google Colaboratoryユーザーに激震が走った。

はい、とても衝撃を受けました。（聞いた時は心の中で「マジで！？」と叫びつつ）
無料で使えるとか、どんだけ太っ腹なんだ・・

ただ、同僚の方と話していて思いましたが、TPU自体がGPUやらCPUなどと比べると馴染みが薄く、「なんだか凄そうだけどよく分からない」という方も多いと思います。

そこで、先日[Google Cloud Next in Tokyo '18](https://cloud.withgoogle.com/next18/tokyo)に参加した際に、TPUのセッションも聞いていたので、情報共有目的で少し記事にしておきます。

# 抑えるべきポイントを3行で表すと...

- Googleが作った、ディープラーニングなどの計算に特化したプロセッサ。計算できる領域が限られている代わりに、GPU以上にとても速くて消費電力が少ない。
- TensorFlowでしか今のところは使えない。（バックエンドをTensorFlowにしたKerasなら動かせる）
- 一部、TPU用に少しコードの調整が必要になったりする。チューニングなども場合によっては必要になってくる。

とりあえず、データを使ってお仕事をする上では、この辺りが重要かなと思います。

以降は、その他のセッションで触れられていた点などに関して、補足的に書いておきます。

# colaboratory以外でも、Cloud TPUとしてGCPで提供されているらしい

- colaboratoryとは異なり、有料にはなりますが、仕事などで使うためのものがクラウドで提供されています。
- 通常のものに加えて、途中で止まったりする可能性があって少し不安定だけど、安価なプランがあるそうです。（安い代わりに、TensorFlowのチェックポイントなどで途中で止まっても大丈夫なように制御しないといけない）

今回のcolaboratoryのアップデートで、事前に癖やコードの差異などをしっかり把握しておきたかったものの、検証のための予算を確保するのが手間だったのが、休日なとに研究的にcolaboratoryでTPUを試してみて、慣れてから仕事での導入を検討する、といったことができるようになりますね！:smiley:

# ボトルネック云々で、あまり速度が向上しないケースがあるらしい

- セッションでは、TPUの計算が速すぎて、データの読み込みがボトルネックになりがち、といったことが言われていました。（計算が終わるまでに、次のデータが間に合わない）
- そのあたりは、GCPのTPU Profilerなるもので、どこが遅いのかが調べられるようになっているそうです。（入力データ待ちが発生しているなど）
- 巷で言われている、GPUよりも数十倍速いよ！というところまで速度を出すためには、しっかりとこの辺りでチューニングしたり、使ってみて傾向を掴んだりが必要なのでしょう・・。

# 実際に速くなるの？

まだ、実際に使っていないので、後日機会があればcolaboratoryで使ってみないと・・な感じではありますが、セッションで挙がった実例では、ebayで100倍の速度、ドコモの実例でも20倍の速度向上といったレベルらしいです。（ドコモでは、コストも1/5になったとのことです。早く学習が終わる分、起動時間が短くて済むなどのメリットがあるのでしょう・・）

# コードをどう調整すればいいのか、分からないんだけど？

基本的な有名どころのモデルは、リファレンスモデルとして公開されているそうです。
（軽く検索してみましたが、[tpuのgithubリポジトリ](https://github.com/tensorflow/tpu)のことでしょうか・・？）

> Reference models and tools for Cloud TPUs. 

と記載があります。

まずはこれらで必要なものをカバーできないか、見てみてほしいとのこと。（領域分割モデルや質問回答モデルなど、少し発展的なものもあるようです）

それらの公開されているTPU用のモデルのPythonのコードを読んだり、動かしてみたり、もしくはベースにしてカスタマイズして要件を満たせそうであれば、手っ取り早くていいかもしれません。

リファレンスモデルがなければ、他を調べたり、独自実装になるので、少し大変かも・・しれません。

# スパコンレベルの「TPU Pod」なるものもあるらしい

colaboratory関係ないですが、複数のTPUで、且つ並列に処理しても効率が下がらず、リニアに速度が上がっていくTPU Podなるものもあるとのことです。（コスト的に、私は触る機会はないとは思いますが・・）

セッションではいつから提供している、といったことは触れられていませんでしたが、今年中にGCPで提供開始される？のでしょうか。

> さらにGoogleは、より大規模な深層学習計算のために、複数のTPUユニットを自社データセンターネットワークに接続したコンピュータ「TPU Pod」を構築している。TPU Podの性能は1ポット（16ユニット）あたりTPU v2で最大11.5ペタFlops、TPU 3.0のTPU Podでは最大100ペタFlopsを超えるという。年内には、TPU v2のTPU PodがGCPの製品として提供される予定だ。
> [ペタフロップ級！Googleの深層学習用カスタムチップ「TPU」が高性能な理由](http://ascii.jp/elem/000/001/706/1706551/)

# おまけ

colaboratoryに追従するように、Kaggle KernelでもGPUが使えるようになりましたが、その流れでそのうちKaggle KernelでもTPUが使えるようにならないかな・・！と期待しています。
もし使えるようになったら、現状Kaggle Kernelが数時間（6時間でしたっけ・・？）の制限があるので、もっとチューニングや重い計算など色々できそうで、楽しそうです！:smiley:
ブログ始めました

ブログを今日より開始することにしました。
残業が多い日以外はなるだけ毎日更新していきたいですね。

予定としては、転職までの学習内容をブログを使いながら理解していこうと思っています。

間違った内容を書いている可能性が非常に高いので、疑いの目を持ちながら記事を読んで頂けると。

未経験プログラマーの転職に関する記事も書くかも？


ほぼほぼ自分の知識向上の為のブログですが、たまに見ていただければ幸いです！

それでは。
Pythonを勉強しながらaws-cliツールを作ってみた

# Pythonを勉強しながらaws-cliツールを作ってみた

- Pythonについて
  - Python 3.6.5 と boto3(1.7.11)実装
  

- 準備
  - localでaws-cliを実行できるようにする 
  - python 3系をインストール
  - `$ git clone https://github.com/yhidetoshi/python-awscli-tool`
  - `$ pip install prettytable click boto3 json tqdm`
  - `$ cd python-awscli-tool`
  - awscli.pyをコマンドオプションをつけて実行する ( 実行オプションは以下に記載 )

 
- コマンド help1
  - **`$ ./awscli.py --help`**
 
```
Usage: awscli.py [OPTIONS] COMMAND [ARGS]...

  Subcommand click CLI

Options:
  -p, --profile TEXT
  --help              Show this message and exit.

Commands:
  asg      AutoScaling API
  ec2      EC2 API
  rds      RDS API
  route53  Route53 API
  s3       S3 API
```

- コマンド help2
  - **`$ ./awscli.py ec2 --help`**
 
```
Usage: awscli.py ec2 [OPTIONS] COMMAND [ARGS]...

  EC2 API

Options:
  --help  Show this message and exit.

Commands:
  create_ami           Amazon Linux Image Create API
  delete_ami           Amazon Linux Image Delete API
  describe_ami         Amazon Linux Image List API
  describe_instances   EC2 DescribeInstances API
  start_instances      EC2 RunInstances API
  stop_instances       EC2 StopInstances API
  terminate_instances  EC2 TerminateInstances API
```

- ソースコードはこちら
  - https://github.com/yhidetoshi/python-awscli-tool 

### EC2
```
■ Instance一覧
  > $ ./awscli.py ec2 describe_instances
    ■ profileの場合
    > $ ./awscli.py -p <PROFILENAME> ec2 describe_instances
  
■ Instance起動
  > $ ./awscli.py ec2 run_instances --instance-id=i-xxxxxxxxxxx

■ Instance停止
  > $ ./awscli.py ec2 stop_instances --instance-id=i-xxxxxxxxxxx

■ Instance削除
  > $ ./awscli.py ec2 terminate_instances --instance-id=i-xxxxxxxxxxx 

■ AMI一覧(作成順にソート)
  > $ ./awscli.py ec2 describe_ami

■ AMI作成(Register)
  > $ ./awscli.py ec2 create_ami --imageid=ami-xxxxxxx --aminame=NAME

■ AMI削除(Deregister)
  > $ ./awscli.py ec2 delete_ami --imageid=ami-xxxxxxx
```

### AutoScaling
```
■ AutoScaling情報一覧
  > $ ./awscli.py asg describe_asg

■ AutoScaling Maxの変更
  > $ ./awscli.py asg update_max --asgname=ASGNAME --max=NUM

■ AutoScaling Minの変更
  > $ ./awscli.py asg update_min --asgname=ASGNAME --min=NUM

■ AutoScaling Desireの変更
  > $ ./awscli.py asg update_desire --asgname=ASGNAME --desire=NUM
```

### RDS
```
■ インスタンス一覧
  > $ ./awscli.py rds describe_instances

■ インスタンス起動
  > $ ./awscli.py rds start_instances --name={DBInstanceIdentifier}

■ インスタンス停止
  > $ ./awscli.py rds stop_instances --name={DBInstanceIdentifier} 
```



### Route53
```
■ Zone一覧
  > $ ./awscli.py route53 describe_zones
■ Zoneid指定のレコード情報取得
  > $ ./awscli.py route53 describe_records --zone-id=ID
```

### S3
```
■ バケット一覧
  > $ ./awscli.py s3 list_buckets 
```

#### 参考
  - boto3
     - https://boto3.readthedocs.io/en/latest/
  - click
     - http://click.pocoo.org/5/api/
  - 同じくaws-sdk-goでも作ってみた
     - https://github.com/yhidetoshi/go-awscli-tool
CDN版のVue.jsでコンポーネントを別ファイルに分ける

## Vue.jsの初学者にはCDN版がオススメ
Vue.jsを始める際にCDNでやるべきか、webpackでやるべきか・・・と悩む人が多いと思います。個人的にはwebpack is 何？って人はCDNからやってVueの楽しさを知るべきだと思います！

公式のガイド読みながら手を動かしていくと、途中で「コンポーネント」の話が出てくると思います。main.jsの中に全部書いてもいいんですけど、別ファイルに分けたいな～って思ったときに良いやり方が見つからなかったのでシェアです！

## コンポーネントに分ける
想定するディレクトリ構成こんな感じです

```
index.html
src
├── QuerySearchContent.js
├── QuerySearchResult.js
└── main.js
```

```html:index.html
...
  <body>
    <div id="app">
      <query-search-content></query-search-content>
    </div>

    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script src="src/QuerySearchContent.js"></script>
    <script src="src/QuerySearchResult.js"></script>
    <script src="src/main.js"></script>
  </body>
...

```

```js:main.js
new Vue({
  el: '#app',
  ...
})
```

```js:QuerySearchContent.js

Vue.component('query-search-content', {
  ...
})

```

### その① scriptタグで読む
一番簡単なのはscriptタグで読む方法です！
コンポーネントが少ない場合はこちらの方がお手軽。main.jsを読み込む前に記述するようにしましょう。

```html:index.html
...
  <body>
    <div id="app">
      <query-search-content></query-search-content>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

    <script src="src/QuerySearchContent.js"></script>
    <script src="src/QuerySearchResult.js"></script>
    <script src="src/main.js"></script>
  </body>
...

```

### その② main.js内で動的に読み込む
基本的に①でいいんですが、コンポーネント数が多くなるとちょっと煩雑ですよね。
vueの公式でも紹介されているaxiosというAjaxっぽいことができるライブラリを使って読み込む方法を試してみましょう


```html:index.html
...
  <body>
    <div id="app">
      <query-search-content></query-search-content>
    </div>
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>

    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script src="src/main.js"></script>
  </body>
...

```

基本的にはjsファイルの場所を探してアクセスし、eval関数で解釈する方法です

```js:main:js
function getComponents (src) {
  axios
  .get(src)
  .then(response => {
    eval(response.data)
  })
}
getComponents('src/QuerySearchContent.js')
getComponents('src/QuerySearchResult.js')
getComponents('src/ContentTable.js')

new Vue({
  el: '#app',
  ...
})
```

この方法は動くんですが、デベロッパーツール上では以下のようなエラーが出ます（おそらくjavascriptの読み込み順の問題？）。

```:error
[Vue warn]: Unknown custom element: <query-search-content> - did you register the component correctly? For recursive components, make sure to provide the "name" option.

(found in <Root>)
```

試行錯誤したのですが、いい解決法が見つからなかったので、もし分かる方いれば教えていただけると幸いです＞＜


## 規模が大きくなってきたらvue-cliを使いましょう
今回紹介した方法は規模が大きくなったり本格的に開発する場合はオススメできません。
vue-cliというツールを使うことで、簡単にwebpack付きの開発・ビルド環境が整い、コンポーネント化もラクラクできるので、慣れてきたらそれを使いましょう！

[Vue.js を vue-cli を使ってシンプルにはじめてみる](https://qiita.com/567000/items/dde495d6a8ad1c25fa43)

とはいえコンポーネントに分割しておけば、vue-cliへの移行もスムーズにできると思うので、CDN使う場合でもコンポーネントに分けることをオススメします。

CDNを使う場合はプロトタイプとして使用して、本格的にデプロイする前にvue-cliなどでwebpackを導入してビルドするのが個人的にオススメです！
オフラインリアルタイムどう書くE26解

問題はこちら->https://cedretaber.github.io/doukaku/e26/#problem

解けてしまえばなるほど実力があれば一時間程度で解ける問題だったなとも思えますが、
私にとっては、未投稿のものを含めて今まで挑戦した「どう書く」の問題の中で一番の難問でした。
①まず小手調べに普通の総当たりのプログラムを書きましたが、せいぜい解けるのは2x2~3x3まで。
②問題と目標それぞれの全体の和の差と、ねじを回転させたとき、
　数が、隅では１、辺では2、中央では3増えることを利用した解き方では3x3まで。
③一列ごとの問題の和と目標の和の差と、その列の和に影響を与えるのが
　前後の列とその列の両端を除いた歯車であることを利用した解き方では4x4が限界。
④いい方法を思いつかず、最大81変数の方程式を考え、連立合同式というのを見つけましたが、
　行列式が0になるのと4が素数でないため失敗。
⑤一時間で書く解ではないと思いつつ、中央の行と列が重なった4つの部分に分けて
　③の変形を使って各部分を求め、重なった部分が一致するものを選ぶ方法で、
　5x5と7x7が有限の時間内に解けることは確認。9x9は無理そう。
⑥上記の検証中に、途中の列からは上の歯車を正しい位置にする動かし方のみのような気が
　していましたが、二列目からは一列目の状態により一意に決まるなら、
　一列目のみ総当たりにして、その中に正解があるか調べればよいことに気づき、
　9x9は無理かと思いつつ試したら解けました。
全問は検証していませんが、たぶん正しいとおもいます。
表示は、上が歯車の回転数、下が歯車の最後の向きです。
veri()は問題を解く部分とは別に答えを検証するために使っていた関数です。
solve()のなかの"if ans!=[] break end"をコメントアウトすれば別解も出ますが、
結構だらだら表示されます。

```Julia
const data=[[-1,0],[0,-1],[1,0],[0,1]]

const gears=[2 3 3 3 3 3 3 3 2
3 4 4 4 4 1 4 4 3
2 3 3 3 4 2 4 3 2
2 2 2 2 2 3 2 2 2
2 2 2 2 2 2 2 2 2
1 2 2 2 2 2 2 2 1
2 2 2 2 2 2 2 2 2
2 2 3 2 2 2 2 2 2
1 3 1 3 2 2 2 2 1]

function solve()
  function main(n)
       if n>w
            gear=copy(gears)
            rot[1,1:w]=tmp[1:w]
            for y in 1:w
                gear=calc(rot[1,y],1,y,gear)
            end
            for x in 2:w,y in 1:w
                v=mod(gear[x-1,y]-1,4)
                rot[x,y]=v
                gear=calc(v,x,y,gear)
            end
            if gear==final
                println(rot)
                println(veri(rot))
                ans=rot
            else
               ans=[]
            end
       else
            for i in 0:3
                tmp[n]=i
                ans=main(n+1)
                if ans!=[]
                    break
                end
            end

       end
       return ans
  end
  function calc(n,x,y,gear0)
      geart=copy(gear0)
      geart[x,y]=mod(geart[x,y]+n,4)
      for (cx,cy) in data
          x1=x+cx
          y1=y+cy
          if x1>0 && y1>0 && x1<=w && y1<=w
          geart[x1,y1]=mod(geart[x1,y1]-n,4)
          end
      end
      return geart
  end
  function veri(m)
      geart=copy(gears)
      for x in  1:w,y in 1:w
          geart=calc(m[x,y],x,y,geart)
     end
     return geart
  end

  w,w=size(gears)
  gear=copy(gears)
  final=similar(gears)
  rot=similar(gears)
  fill!(final,1)
  fill!(rot,0)
  tmp=Array(Int,w)
  ans=[]
  main(1)
end

@time solve()

```
Nucleo-F303K8でprintfを使う

目的
---
SW4STM32(System Workbench for STM32)にてARMセミホスティング機能を用いてprintfが利用可能な環境を整えます。

環境
---
| 項目 | 内容 |
|---|---|
| OS | Windows 10 Home 64bit |
| 開発環境 | SW4STM32, eclipse cdt oxygen, STM32CubeMX|
| ボード | Nucleo-F303K8 |


手順概要
---
1. STM32CubeMX設定
2. eclipse リンカ設定
3. eclipse コード修正
4. eclipse デバッガ設定


STM32CubeMX設定
---
* "New Project"から開発対象ボードを選択し(私の場合はNucleo-F303K8)て新規プロジェクトを生成します。
* "Pinout"タブから"SYS"の"Debug"部分にて"Serial Wire"を選択します。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/253656/89fadb2b-0f63-e178-ce84-a5eee52f85a5.png)

* "Project"->"Settings"にてプロジェクト名(printf_test)と、プロジェクト生成先開発環境"SW4STM32"を選択します。
![2.png](https://qiita-image-store.s3.amazonaws.com/0/253656/c3837a0b-5ab1-7b81-6cb5-7e4c884e67fe.png)

* "Project"->"Generate Code"でSW4STM32プロジェクトを生成します。

eclipse リンカ設定
---
ここではリンクオプションでセミホスティングを有効にします。

* "File"->"Import"->"General"->"Existing Projects into Workspace"でCubeMXで生成したプロジェクトを読み込みます。

![3.png](https://qiita-image-store.s3.amazonaws.com/0/253656/aa69d0ff-2cba-7534-88d6-9d2c2d576d3c.png)

* eclipse画面の左側のProject Explorerから"printf_test"プロジェクトを選択して、Alt+Enter (もしくは、右クリック->"Properties")で設定画面を開きます。

* "MCU GCC Linker"->"Miscellaneous"にて, Linker flagsに"-specs=nosys.specs -specs=nano.specs -specs=rdimon.specs -lc -lrdimon"と入力します

![image.png](https://qiita-image-store.s3.amazonaws.com/0/253656/f83556fa-07e3-8f4d-ff9c-606c5189f363.png)

* "printf_test"を選択後、右クリックして"Build Configurations"->"Build All"で再度ファームウェアをビルドします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/253656/5f22d115-bc62-6176-b98f-bf100d2acadb.png)

**通常の"Build"コマンドでは、セミホスティングを有効化する上記設定は反映されません。必ず"Build All"コマンドでビルドしてください**


eclipse コード修正
---
"main.c"ファイルを開いてコードを以下のように修正します。

* USER CODE 0に以下の文を追加します。(main関数の外側)

```c
/* USER CODE BEGIN 0 */
extern void initialise_monitor_handles(void);
/* USER CODE END 0 */
```

* USER CODE 1に以下の文を追加します。(main関数内側)

```c
/* USER CODE BEGIN 1 */
initialise_monitor_handles();
int count = 0;
/* USER CODE END 1 */
```

* USER CODE 3に以下の文を追加します。(while loop内側)

```c
 /* USER CODE BEGIN 3 */
	  printf("Count %d\n", count);
	  count++;
	  HAL_Delay(1000);
  }
  /* USER CODE END 3 */
```
1000[msec] (1[sec])毎に数値がカウントアップされてprintfにて表示されるプログラムです。

**改行文字"\n"がないと表示されないので忘れずに入れてください**


---

デバッガ設定でセミホスティングを有効にします。

* 虫マークをクリックした後、ポップアップウィンドウで"Ac6 STM32 C/C++ Application"を選択します。
 
![image.png](https://qiita-image-store.s3.amazonaws.com/0/253656/4824e158-1994-95c3-c0c8-b5080f661f81.png)

* いったん停止ボタンを押します。

* 虫ボタン横の下三角マークをクリックして、"Debug Configurations"を選択します。

* "Startup"のInitialization Commandsの欄に"monitor arm semihosting enable"と記入します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/253656/584aaac3-5bf4-f819-6ce3-b7dc7ebcc3d6.png)

* "Apply"ボタンを押した後、"Debug"ボタンを押します。


* プログラムにエラーがなければ、そのままデバッグが開始されてmain関数内で一時停止します。

* その後"Resume"ボタンを押すとプログラムの実行を進められます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/253656/400f1f84-92a1-84da-901e-e72694926223.png)


* 以下のように、"Console"に1sec毎にカウントアップして数字が表示されると成功です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/253656/f7276f35-edcd-8c36-04a2-cc6ecb98404f.png)
Firestoreのインデックス設定をローカルPCへ持ってきて編集して再びアップロードする

まず空のディレクトリを作成してその中で下記コマンドを実行。
作成された`firestore.indexes.json`にインデックスの設定を書き込む

```
$ firebase init firestore
```

下記のコマンドで`firestore.indexes.json`のみをFirestoreへデプロイする

```
$ firebase deploy --only firestore:indexes --project PROJECT_NAME
```

きちんと更新されたかFirestoreのインデックス設定を受信して確認する

```
$ firebase firestore:indexes --project PROJECT_NAME
```

終わったらディレクトリを削除して完了

**※インデックスの追加は出来たが削除は出来なかった**
Minecraft 1.12.2　エンドシティのスポーン座標決定のアルゴリズム


# はじめに

最初のエリトラ入手までの道のりは険しい。敵がほぼないとはいえエンドの空中をひたすら進まなければならない。

ワールドのシードが分かればローカルで同じワールドを作りスペクテイターで飛び回って最寄りのエンドシティを探せばいいが、それでもできればどのあたりを探せば見つかる可能性が高いかを知っておきたいものである。

シードが不明な場合は自分の足で歩き回ることになるので、なおさら目星は着けておきたい。

そこで例によってMCPを参照してエンドシティの生成アルゴリズムを調べた。

# 環境

- Minecraft 1.12.2 Java Edition
- forgeSrc-1.12.2-14.23.4.2705

# 調査

類似のことを次の記事で行っているので、共通する説明は省略する。

- Minecraft 1.12.2　村の座標決定部分のアルゴリズム - Qiita https://qiita.com/MirrgieRiana/items/0a3baee86bb661dc5f99
- Minecraft 1.12.2　ネザー要塞のスポーン座標決定のアルゴリズム - Qiita https://qiita.com/MirrgieRiana/items/e01a3db6fd7bf183fbbb

## 生成チャンク座標の決定

あるチャンクにエンドシティが生成されるか否かは次のメソッドが与えている。

- `net.minecraft.world.gen.structure.MapGenEndCity.canSpawnStructureAtCoords`

該当部分のコードは大体次のようなものである。

```java:
boolean canSpawnStructureAtCoords(int chunkX, int chunkZ)
{
	// (1)
	int chunkX2 = chunkX;
	int chunkZ2 = chunkZ;
	if (chunkX2 < 0) chunkX2 -= 19;
	if (chunkZ2 < 0) chunkZ2 -= 19;
	int regionX = chunkX2 / 20;
	int regionZ = chunkZ2 / 20;

	// (2)
	Random random = world.setRandomSeed(regionX, regionZ, 10387313);
	int chunkXExpected = regionX * 20 + (random.nextInt(9) + random.nextInt(9)) / 2;
	int chunkZExpected = regionZ * 20 + (random.nextInt(9) + random.nextInt(9)) / 2;

	// (3)
	if (chunkX == chunkXExpected && chunkZ == chunkZExpected) {

		// (4)
		if (endProvider.isIslandChunk(chunkX, chunkZ)) {
			if (getYPosForStructure(chunkX, chunkZ, endProvider) >= 60) {
				return true;
			}
		}

	}

	return false;
}
```

大まかには村と同じで、(1)でチャンク座標が所属する地域座標を求め、(2)でその地域においてエンドシティが生成される場所を求め、(3)で指定チャンクが想定位置か否かを判定している。その後(4)では追加でそこがちゃんとした地形かどうかを判断している。

村との大きな違いは(2)の`(random.nextInt(9) + random.nextInt(9)) / 2`である。エンドシティでは`(0～8の乱数 + 0～8の乱数) / 2`だが、distance=20の村では`0~11の乱数`となる。これによって、生成チャンク座標は20で割った余りが8を中心に偏った分布となる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/280627/092edade-c1c8-a75d-1d5b-2eb1052cd860.png)

この偏りはXZ両方にかかるので、1個の地域に注目すると次のような確率分布となる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/280627/5601ee6d-a8b5-662f-dcf0-10a28204f316.png)

地域のサイズは20なのでF3のチャンク座標表示から目視で判断しやすい。エンドシティが生成されるチャンクXZ座標は下2桁がだいたい8, 28, 48, 68, 88周辺である（座標がともに正の場合）。

これがタイル状に並ぶので、エンドシティもある程度規則正しく並ぶことになる。エンドシティを1個見つけたら座標軸に沿って320m移動すると、そこがちゃんとした土地なら近辺にエンドシティが見つかる可能性が高い。

座標が負の場合の扱いはよくわからないが、1個見つけたら同じ象限では網目状に並ぶはずである。

## エンドシップの生成

エンドシップが本当にエンドシティに紐づいているか疑問だったのでコードを調べたが、どうやらエンドシップはエンドシティの部屋の一つとして扱われているらしい。それを実証するかのように、エンドシティではエンドシップが存在する方向に向かって廊下が途切れている。

![2018-09-29_11.05.01.png](https://qiita-image-store.s3.amazonaws.com/0/280627/5c861f5c-eaca-e311-4832-ce3485a27503.png)

このゲートのような構造物は普通はその先に癒着するように部屋が生成され目立たなくなるが、船が生成された場合は何もくっついて生成されないためこのように"船着き場"のような特徴的な形になる。~~船と船着き場が微妙に1マスずれてるけどいいんか~~

![2018-09-29_11.05.31.png](https://qiita-image-store.s3.amazonaws.com/0/280627/1cb3a6b7-4fce-ea53-dbac-273e67e939cf.png)

船はエンドシティに伴って出現し、エンドシティが船を伴うか否かはエンドシティの構造の解析になるため単純には予測できない。そのためシード不明世界でエリトラを入手するのに利用できる知識は上記の確率分布までである。しかし目的の座標に移動してもそこが安定した地形であるか否かガチャと船が生成されるかガチャをしなければならないため実際には結構厳しい。
Qiitaの書き方[超基礎]

#qiitaを書く動機
　まず第一に備忘録、覚書である。
また、エンジニアの世界に触れ始めてから、ずっとqiitaには助けられ続けているので、もしかしたら同じように誰かの助けになればよいと思うのです。

#1.Qiitaの書き方
###１－１見出しの書き方
'#見出し'
とかくと下線がついた大きな見出しとなる。（例：1.Qiitaの書き方）
'###見出し'
とすると下線なしの中くらいの大きさの見出しができる（例：1-1見出しの書き方）

###１－２コードの挿入

```
import numpy as np
print('hellow qiita')
```

のようにコードを挿入するには、バッククオート三つでコードをかこみます。
' ``` 'です、ｐの隣とかです、shift+7 とかではありません。




つぎは
先頭を、"```python"のようにすると、

```python
import numpy as np
print('hellow qiita')
```
シンタックスハイライト（コードに色がついて読み易い）を追加。

このようにマークダウン記法が初めての人はプログラムっぽくて、とっつきにくく感じるかもしれないが、上記のような単純な要素の足し合わせなので、すぐに慣れるだろう。

ここらへんで、qiitaに投稿してみる。
テスト投稿

テスト投稿です。
Xcodeでコードを書いてる時に出てくる補完機能一覧の左にあるアイコンの意味がわからない。

<img width="535" alt="スクリーンショット 2018-09-07 18.14.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/280842/74f68f3b-8f67-ef5c-ae0a-edb640b122ec.png">
 
<br/>




#「本気ではじめるiPhoneアプリ作り(Xcode9,Swift4)」のToDoアプリを今やっています。
>https://www.sbcr.jp/products/4797394184.html


>>P247の④アラートダイアログの生成のコードで

```swift

 // アラートダイアログを生成
let alertContoroller = UIAlertController(title: "ToDoの追加", message: "ToDoを追加してください", preferredStyle: UIAlertControllerStyle.alert) 

```

だとエラーになる。


エラー内容
`'UIAlertControllerStyle' has been renamed to 'UIAlertController.Style'Replace 'UIAlertControllerStyle' with 'UIAlertController.Style'`



補完機能を使いFixすると
**UIAlertController.Style.alert**


[Apple公式ドキュメント](https://developer.apple.com/documentation/uikit/uialertcontroller/style)ではUIAlertController.Style

UIAlertController.Style が正しいのではないのか。


現在の正誤情報には記載されていない。
https://www.sbcr.jp/support/14393.html



【環境】
Xcode: 10.0
Swift: 4.2
サクラエディタで XML 用に正規表現キーワードを使用して色分けをする

# XML にも色をつけてあげて！
一旦、記号なしのラテンアルファベット以外の事は忘れる事にする。

## 要素名
```:for-STag-and-EmptyElemTag	
/(?<=<)[-_a-zA-Z0-9]+/k
```

```:for-ETag
/(?<=<\/)[-_a-zA-Z0-9]+/k
```

## 属性名
```:for-Attribute
/[-_a-zA-Z0-9]+(?==)/k
```
運用ツールとしてGo言語を使ってAWSの起動設定とAMI数を返すツールを作った

# 運用ツールとしてGo言語を使ってAWSの起動設定とAMI数を返すツールを作ってみた

- 背景
  - AWS環境でインフラCIとして、CodePipeline + CodeBuild + CodeDeployを使っている
  - CodeDeployでBlue/Greenデプロイをしていると起動設定がどんどん増えていく
  - CodeBuildでPackerを動かしており、AMIがどんどん増える

- 課題
  - AWSのリソース上限値に達するとデプロイにコケる..
  - 自動で削除することもできるが、AutoScalingGroupで指定している起動設定やAMIを削除すると困る
  - 週1程度でslackに通知して数が増えてきたら消すように運用者に促すようにする

ここでは、起動設定数とAMIの数を取得するツールの部分の紹介 ( 実際はLambdaで定期実行し出力を工夫してSlackに投稿している )

- 実行環境
  - Mac ( high sierra ) 
  - go version: go1.10.3
  - aws-sdk-go
  - ローカルにawsのapiを叩くために必要な情報をセットしている必要あり

 以下、作成したコードです。 (Goを勉強をしながら作成しています)



```main.go
package main

import (
	"fmt"
	"os"

	"github.com/aws/aws-sdk-go/aws"
	"github.com/aws/aws-sdk-go/aws/session"
	"github.com/aws/aws-sdk-go/service/autoscaling"
	"github.com/aws/aws-sdk-go/service/ec2"
)

const (
	PAGE = 4
)

var (
	config = aws.Config{Region: aws.String("ap-northeast-1")}
	svcEc2 = ec2.New(session.New(&config))
	svcAsg = autoscaling.New(session.New(&config))
)

type Get interface {
	GetAmiNums() int
	GetLCNums() int
}

type Nums struct {
	amiNumbers   int
	lcNumbers    int
}

func main() {
	n := &Nums{}
	fmt.Printf("AMIs %d\n", n.GetAmiNums())
	fmt.Printf("LCs %d\n", n.GetLCNums())
}

func (n *Nums) GetAmiNums() int {
	var owner, images []*string
	var _owner []string = []string{"self"}

	owner = aws.StringSlice(_owner)
	params := &ec2.DescribeImagesInput{
		ImageIds: images,
		Owners:   owner,
	}
	res, err := svcEc2.DescribeImages(params)
	if err != nil {
		fmt.Println(err.Error())
		os.Exit(1)
	}

	n.amiNumbers = len(res.Images)
	return n.amiNumbers
}

func (n *Nums) GetLCNums() int {
	pageNum := 0
	sumLcs := 0

	params := &autoscaling.DescribeLaunchConfigurationsInput{}
	err := svcAsg.DescribeLaunchConfigurationsPages(params,
		func(page *autoscaling.DescribeLaunchConfigurationsOutput, lastPage bool) bool {
			sumLcs += len(page.LaunchConfigurations)
			pageNum++

			return pageNum <= PAGE // MAX = 50 * PAGE
		})
	if err != nil {
		fmt.Println(err.Error())
		os.Exit(1)
	}
	n.lcNumbers = sumLcs
	return n.lcNumbers
}
```

- 実行結果

```
AMIs 3
LCs 1
```
docker-composeでPostgreSQLの環境を作る

# 更新履歴

|日付|内容|
|:--|:--|
|2021.08.14|記事の情報に一部追記|
|2018.09.29|初版|

# はじめに

やりたいこと

- DockerでPostgreSQLを構築したい
- DBviewerもDockerで構築したい -> pgAdmin 4
- 起動したPostgreSQLに自動で初期データも突っ込みたい
- docker-composeをGithubなどで他人(共同開発者)に公開したい

<details><summary>Qiitaマイルストーンで50LGTM突破したこの記事を紹介してもらいました :thumbsup:</summary><div>
[2021/08/13 09:40 from qiita_milestone
](https://twitter.com/qiita_milestone/status/1425980423675555843)
![50lgtm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106929/c7b5bc56-494f-1db2-eaa0-79f96e12023c.png)
</div></details>

2021年8月の最新バージョンで書き換えました。(ただしM1Macで未検証、おそらく動作しない

# docker-compose

```yaml:docker-compose.yml
  postgresql:
    image: postgres:13.4
    container_name: postgresql
    ports:
      - 5432:5432
    volumes:
      - ./postgres/init:/docker-entrypoint-initdb.d
    environment:
      POSTGRES_USER: root
      POSTGRES_PASSWORD: root
      POSTGRES_INITDB_ARGS: "--encoding=UTF-8"
    hostname: postgres
    restart: always
    user: root

  pgadmin4:
    image: dpage/pgadmin4:5.6
    container_name: pgadmin4
    ports:
      - 80:80
    volumes:
      - ./pgadmin:/var/lib/pgadmin/storage
    environment:
      PGADMIN_DEFAULT_EMAIL: root
      PGADMIN_DEFAULT_PASSWORD: root
    hostname: pgadmin4
    restart: always
```

# 初期データセットアップ

/postgres/init配下にsqlファイルを放り込んでおくと、  
postgres起動時に設定してくれる。

```sql:1_create.sql
/* DATABASEを作成 */
CREATE DATABASE pgtest;
```

# pgAdmin 4

1.http://localhost/にアクセス
2.ログイン

```lang:設定
EmailAdress:root
Password:root
Language:japanese
```

3.サーバーを追加

```lang:設定
ホスト名/アドレス:postgresql
ポート番号:5432
データベースの管理:postgres
ユーザ名:root
```
画面遷移時にJSがロードされないとき `turbolinks:load`イベントをバインドする

- Rails (5.1.6)
- turbolinks (5.2.0)
- turbolinks-source (5.2.0)

# 参考
- [\[Ruby on Rails 4\] Turbolinks 5 で JavaScript が発火しない問題の対処 \| deadwood](https://www.d-wood.com/blog/2017/01/26_8767.html)
- [Turbolinksを調べてみた](https://gist.github.com/saboyutaka/8727377#turbolinks%E3%81%A8%E4%BB%B2%E8%89%AF%E3%81%8F%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AB%E6%B3%A8%E6%84%8F%E3%81%99%E3%82%8B%E3%81%93%E3%81%A82)


# 解決手順
- `'data-turbolinks-track': 'reload'` を使用していた
- ページ遷移時、JSがロードされなかった
- `jquery:document.ready` で `turbolinks:load` イベントをバインドすることでJSのロードが必ず実行されるようになった

```haml:application.html.haml
= javascript_include_tag 'application', 'data-turbolinks-track': 'reload'
```
## 変更したところ `$(document).on 'turbolinks:load'`
以下は、マークダウンのプレビューを更新させるCoffee Scriptです。

1. マークダウン本文の`keyup`イベントを監視させて、
2. マークダウン結果を要求し
3. `#preview_by_ajax`を更新させる

のようなことをやっています。
`$.debounce` は `keyup`イベントの間引きをおこなってくれるjQueryプラグイン。便利です。


```diff:app/assets/javascripts/markdowns.coffee
- $ ->
+ $(document)
+    .on 'turbolinks:load', ->
      $('#item_body')
          .on 'keyup', $.debounce( 500, ->
              content = $(this).val()
              $.ajax({
                  url: "/markdown/preview",
                  type: "GET",
                  data: { content : content },
                  dataType: "html",
                  success: (data) ->
                    $('#preview_by_ajax').html(data)
              }))
```
xonsh[ptk]で、Suggestionを確定するキーバインドを設定する

ptkのフラグを付けてインストールしたxonshにおいて、Auto Suggestionのキーバインドを追加する。

```cmd
pip3 install xonsh[ptk]
```

xonsh で、Auto Suggestionを確定するキーはデフォルトでは右矢印である（他にもあるかも）。

これを、Ctrl-kに設定する場合、.xonshrc に以下のように追加する。

```python
from prompt_toolkit.keys import Keys
@events.on_ptk_create
def custom_keybindings(bindings, **kw):
    handler = bindings.add

    @handler(Keys.ControlK)
    def select_suggestion(event):
        if event.current_buffer.suggestion:
            event.current_buffer.insert_text(event.current_buffer.suggestion.text)
```

eventのcurrent_bufferのプロパティを見れば、大抵のことは設定できそう。

* https://python-prompt-toolkit.readthedocs.io/en/master/pages/reference.html#module-prompt_toolkit.buffer
* https://github.com/jonathanslenders/python-prompt-toolkit/blob/master/prompt_toolkit/buffer.py

Vimモードでinsertの場合のみ、適用するには以下の通り。

```python
from prompt_toolkit.keys import Keys
from prompt_toolkit.filters import Condition, ViInsertMode
@events.on_ptk_create
def custom_keybindings(bindings, **kw):
    handler = bindings.add
    insert_mode = ViInsertMode()

    @handler(Keys.ControlK, filter=insert_mode)
    def select_suggestion(event):
        if event.current_buffer.suggestion:
            event.current_buffer.insert_text(event.current_buffer.suggestion.text)
```

なお、環境は以下の通り。

```
+------------------+----------------------+
| xonsh            | 0.7.10               |
| Git SHA          | fe44f4a9             |
| Commit Date      | Sep 26 12:14:51 2018 |
| Python           | 3.7.0                |
| PLY              | 3.9                  |
| have readline    | True                 |
| prompt toolkit   | 2.0.4                |
| shell type       | prompt_toolkit2      |
| pygments         | None                 |
| on posix         | True                 |
| on linux         | False                |
| on darwin        | True                 |
| on windows       | False                |
| on cygwin        | False                |
| on msys2         | False                |
| is superuser     | False                |
| default encoding | utf-8                |
| xonsh encoding   | utf-8                |
| encoding errors  | surrogateescape      |
+------------------+----------------------+
```
Rails:「ActiveRecord::RecordNotUnique: Mysql2::Error: Duplicate entry '' for key 'index_users_on_unlock_token'」の対処方法

##発生した問題
cancancan、devise、rails_adminを使用した実装で、管理画面からUserモデルの属性の更新を行う際に

```
ActiveRecord::RecordNotUnique: Mysql2::Error: Duplicate entry '' for key 'index_users_on_unlock_token'」
```
というエラーに遭遇したため、対処方法記録として残したいとお思います。

今回参考にした、公式の文書です。
https://github.com/sferik/rails_admin/wiki/Fields#exclusion

今回参考にした記事です
https://stackoverflow.com/questions/21949125/index-users-on-unlock-token-unique-validation-error-in-rails-devise
https://github.com/starterkits/rails4-starterkit/issues/23

##結論【rails_admin.rbにコードを追加】

```Ruby:config/initializers/rails_admin.rb
config.model 'User' do
    exclude_fields :unlock_token
end
```

##今回の問題点
`unlock_token`がUniqueにも関わらず、`""`のStringが渡されていることでエラーが発生しております。
そのため、`exclude_fields :unlock_token`
とし、`unlock_token`を除外することでエラー回避を図りました。

ご参考になれば幸いです。
【AWSメモ③ 】CloudWatch 備忘録

## CloudWatch とは

以下のことが手軽にできる運用監視サービス

・異常な状態を検知して、自動で復旧
・メトリクスに応じてアラート通知、アクションの設定ができる

CloudWatch には以下の3つのサービスが存在する

・CloudWatch
　⇒ リソースを監視
　　 CPUやメモリなど複数項目をグラフ化してダッシュボードを作れる。
　　 よく使うものは標準のメトリクスとして用意されてる。
　　 監視するだけじゃなくてリソースの状況に応じて、メールの配送、AutoScaling などのアクションを実行する等にも利用できる。

　　標準のメトリクス　 ・・・ CPU使用率、ディスクのI/O、ネットワークトラフィック量、インスタンスステータス等
　　カスタムメトリクス ・・・ メモリ使用率、ディスク使用率等

・CloudWatch Logs
　⇒ ログの収集と監視
　　 EC2インスタンスにエージェントをインストールすることで利用できる。
　　 OS、アプリケーションのログを収集して、対象のキーワードのエラーログ書き込みをトリガーにサービス管理者宛にアラート通知(メールを配送)等に利用できる。

・CloudWatch Events
　⇒ APIのイベントをトリガーにアクションを実行する。
　　 ※ AWS の多くのサービスは処理をAPIで実行している(EC2の起動、停止、コンソールへのログイン等)。
　　 インスタンスの起動、停止、削除、コンソールへのログイン、Lambda、SNS、SQS 等のサービスをトリガーにアクションを実行できる(lambda等)。

[](https://qiita.com/Kento75/items/e1478fead92f70fb757e)
[](https://qiita.com/Kento75/items/3a84db0f55bef73eec6d)
[](https://qiita.com/Kento75/items/87c2ca4093ba65304216)
【Rails】better_errorsとbinding_of_callerで自分でエラーを解決できるようになろう【初心者向け】

# はじめに
今までテキストやRailsチュートリアルに沿ってアプリを作っていました。
現在は自分でオリジナルアプリを作成しています。
いざ、自分で作るとなると、どうしてもエラーを読み解く力が必要になるなと感じています。
そこで、**better_errors**と**binding_of_caller**というgemを使いこなすとエラーに対処しやすくなるので紹介してみます。


# better_errorsとbinding_of_callerとは
**better_errors**はデフォルトのエラー画面をわかりやすく成形してくれるgem。
**binding_of_caller**はそのエラー画面にirbをつけてくれるgem。

実際のエラー画面がこちらです。

<img width="1432" alt="スクリーンショット 2018-09-28 20.43.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/276589/8b2e93b7-4bde-d078-636f-770afbebcb55.png">

では、これから導入方法からエラー画面の見かたまで解説していきます。


# 導入方法
Gemfileの`group :development do`の中に2つを記述して`bundle install`するだけ

```ruby:Gemfile
group :development do
  gem 'better_errors'
  gem 'binding_of_caller'

```

`group :development do`の中に記述する理由は開発しているときのみ使えるようにするため。

```terminal
$ bundle install
```

これで導入完了です。


# エラー画面の見かた

![スクリーンショット 2018-09-28 20.43.46.png](https://qiita-image-store.s3.amazonaws.com/0/276589/4b78b1db-2c7c-aa83-7f90-ff48ad7762c6.png)



####○ エラーメッセージ 
いつものエラー文です。
これをもとにエラーの原因を探っていきます。


####○ トレース情報
わかりやすく説明するとコードが怪しいところの候補をいくつか挙げてくれるところです。
トレース情報をクリックすることで、隣の**irb**にコードを表示してくれます。

####○ irb
コードの怪しいところを表示してくれます。
下の入力欄はコンソールになっていて`rails c`と同じことができます。
わざわざターミナルの表示をしなくて良いので便利です。

####○ リクエスト情報
request時のパラメータを表示してくれます。

####○ ローカル変数情報
変数の中身を表示してくれます。

# まとめ

このように一画面ででてくる情報量やできることが格段に増えます。
エラーが出た時にエラー文をググるだけではなく、コンソールで変数の中身を見たり、パラメータの確認をして様々な角度から解決方法を考えていけるようになれます。
最初は難しいかもしれませんが、徐々に慣れていって使いこなせば、効率よく開発していくことができるでしょう。
ちょっとまって！Python3を使う前のバーチャル環境「venv」の設定

# 仮想環境とは

Pythonでライブラリをインストールするとき、
`pip install`コマンドを使いますよね？

このとき、仮想環境を利用していないと、
そのPCのPythonプロジェクト全てから参照できるようになります。

一見便利そうに見えますが、
● プロジェクトAはnumpyのバージョン1.2を使いたい。
● プロジェクトBはnumpyのバージョン1.0を使いたい。
となったときに、死が訪れます。

そうならないように、プロジェクト単位で仮想的に環境を作れるのです。
さあ、やっていきましょう！

※Windowsマシンでボクは作業してますが、Macでもできると思います！




# 仮想環境の構築

コマンドプロンプトで実行していきます。


## 仮想環境の準備

Pythonでプロジェクトを作成する前に、仮想環境を用意します。
Python3.2以降は、以下のコマンドが標準で入っており、自由に仮想環境を作ることができます。
以下のコマンドを、仮想環境を保存しておきたいディレクトリで実行します。どこでもいいです。
（ボクは、`D:\Python\vtest`で話を進めます。）

```
python -m venv 好きなフォルダ名
```

例えば、

```
python -m venv venv
```

とかですね！
この記事では、上記の`python -m venv venv`を実行した体で話を進めます。

さて、コマンドを実行すると、venvフォルダがカレントディレクトリに作成されたかと思います。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/63338/f41d129d-d999-7d6b-58dc-689bc861707a.png)



## 仮想環境の反映

コマンドプロンプトで、先程作成したvenvフォルダの中に作成されている、
`activate.bat`を実行します。

```
venv\Scripts\activate.bat
```

※macの場合は`source venv/bin/activate`かな？

うまく反映されると、コマンドプロンプトの前に`(venv)`という文字が付きます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/63338/e173ff04-6417-eb75-bd4d-120d9df74c84.png)

これで準備は完了です！


## 仮想環境を抜ける

別の仮想環境を使いたかったり、グローバルの環境を使いたい場合は、
現在の仮想環境を抜けなければいけません。
その時は

```
deactivate
```

をコマンドプロンプトに入力します。
すると、`(venv)`が消え、仮想環境が解除されます。



# なにか実験してみる
とりあえずせっかく仮想環境を作ったんで、なにか実験してみましょう。
スクレイピングとかでよく使う、`beautiful soup4`でも入れてみますか。

## 今回使うコード

先に今回利用するコードを書いておきます。
とりあえず、`test.py`という名前で保存しておきましょう。

```python
import urllib.request, urllib.error
import bs4

# example.comからHTMLコードを取得
html = urllib.request.urlopen("http://example.com")

# 取得したHTMLのDOMを解析
soup = bs4.BeautifulSoup(html, features='html.parser')

# きれいにフォーマットして出力
print(soup.prettify())
```



## 確認

beautiful soup（以下`bs4`と表記）はまだ入ってません。

**グローバル**
`python test.py`

![image.png](https://qiita-image-store.s3.amazonaws.com/0/63338/323a03b7-e4d0-557d-6b54-a5e57a644837.png)

bs4が入ってないのでエラー


**仮想環境**
`python test.py`

![image.png](https://qiita-image-store.s3.amazonaws.com/0/63338/dc8ca64b-52ba-4f7a-74a2-717d9a19c28d.png)

bs4が入ってないのでエラー



## 仮想環境にbs4を入れる

仮想環境がアクティベートされている（コマンドプロンプトの前に`(venv)`がついている）ことを確認し、
pip installします

```
pip install bs4
```

↓　実行結果

![image.png](https://qiita-image-store.s3.amazonaws.com/0/63338/85de4707-e5aa-3aaf-52ef-b1d47b488505.png)

入ったくさい。

再度test.pyを実行。

```
python test.py
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/63338/5d35183c-489a-bd68-3791-b83305c2f9e9.png)

取れましたね！

さて、グローバルの方ではいかがでしょうか？
`deactivate`を実行して、仮想環境から抜けます。

そして再度、`python test.py`を叩くと…？

![image.png](https://qiita-image-store.s3.amazonaws.com/0/63338/f5eca9d8-120e-d763-f403-7b07e0a77064.png)

見事にエラー！

仮想環境にだけbs4が入りましたね！
これで環境汚染がなくなる！！
バンザイ！！
静的ファイルの更新がブラウザのキャッシュで反映されない問題の対策

![chrome.png](https://qiita-image-store.s3.amazonaws.com/0/33674/d495ba21-9a14-c67c-ffc1-81bec4f18952.png)



javascriptやstylesheet、または上記のような画像ファイルを静的ファイルとして公開し、それを参照する場合
ブラウザのキャッシュによってサーバー上は更新されても表示が反映されないという問題に
度々ひっかかる。

この対策方法の一つとしてファイルのurlの最後に`?q=<ファイルの更新日時>`などとして
ファイルの更新日時を付与する方法がある。

Flaskではこうするといいよというスペニットがあったので紹介する。


# 具体的なコード

`app.py`の`override_url_for()`と`dated_url_for()`で
静的ファイルに対して`?q=<ファイルの更新日時>`を付与するコードを作っている。

`index.html`の` src="{{url_for('static', filename='img/20180926_0900_toyo_vs_suga.png')}}"`でそれが展開されるという仕組み。

```py:app.py
from flask import Flask, render_template, url_for
import os

app = Flask(__name__)

@app.context_processor
def override_url_for():
    return dict(url_for=dated_url_for)

def dated_url_for(endpoint, **values):
    if endpoint == 'static':
        filename = values.get('filename', None)
        if filename:
            file_path = os.path.join(app.root_path,
                                     endpoint, filename)
            values['q'] = int(os.stat(file_path).st_mtime)
    return url_for(endpoint, **values)

@app.route('/')
def index():
    # index.html をレンダリングする
    return render_template('index.html')

if __name__ == '__main__':
    app.run()
```

```html:layout.html
<!doctype html>
<html lang="ja">
  <head>
    <!-- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

    <!-- Bootstrap CSS -->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">

      {% if title %}
        <title>Hello, world!</title>
      {% else %}
        <title>Bootstrap 4.1.3 Template</title>
      {% endif %}
  </head>
  <body>
    {% block content %}{% endblock %}
    <!-- Optional JavaScript -->
    <!-- jQuery first, then Popper.js, then Bootstrap JS -->
    <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script>
  </body>
</html>
```

```html:index.html
{% extends "layout.html" %}
{% block content %}

    <img src="{{url_for('static', filename='img/20180926_0900_toyo_vs_suga.png')}}" class="img-fluid" alt="Responsive image">

{% endblock %}
```

# 参考

[FlaskでCSSのキャッシュを効かせなくする方法 \- Life is Really Short, Have Your Life\!\!](https://aroundthedistance.hatenadiary.jp/entry/2015/01/28/101902)

[static url cache buster \| Flask \(A Python Microframework\)](http://flask.pocoo.org/snippets/40/)
クリックやタッチを無効に出来るCSS「pointer-events: none;」

複雑なデザインを構築中に要素にかぶさってしまって、
クリックやタッチを無効にしたい時やリンクを無効化したい時などに有効。


```../assets/css/pc.css
button {
pointer-events: none;
}
```
php-master-changes 2018-09-28

今日はオブジェクト生成処理の誤りで SEGV が出る場合がある問題の修正があった！

# 2018-09-28
## nikic: Fixed bug [#76846](https://bugs.php.net/bug.php?id=76846)
- https://github.com/php/php-src/commit/45cdcb2d0be89fe7bc404dd150240ec83f5de401
- [7.1~]
- memory_limit を越えたメモリ確保でエラー終了する際、register_shutdown_function() のハンドラ内でのオブジェクト生成が SEGV を起こす問題の修正
- メモリマネージャーがエラーを検知して終了する際、zend_bailout() が呼ばれ、これは内部で longjmp() か、あれば siglongjmp() する奴
- オブジェクト生成で [EG(objects_store).object_buckets](http://www.phpinternalsbook-ja.com/classes_objects/internal_structures_and_implementation.html#id6) のリサイズが発生する際、先に EG(objects_store).size を 2 倍に更新してからメモリマネージャーに実際のリサイズをさせる、というのが元々の処理だった
- 結果、リサイズできず途中でベイルアウトしてシャットダウンハンドラがオブジェクトを確保しようとすると、オブジェクトストアの実際のサイズを超えて書き込もうとしてしまう
- EG(objects_store).size を 2 倍に更新するのをリサイズ成功後にして修正

## nikic: Fix test for release builds
- https://github.com/php/php-src/commit/fa84b8ebb4ab14ca841d7e479865548dadc5eb88
- [7.1~]
- ↑の修正のテストで期待する出力部分が間違ってたのを修正
Clova公式SDK(Node.js)をAWS Lambda上で動かす

## 前提
ClovaスキルをLambda上で動かしたい。

## 構成
**API Gateway + Lambda**
この構成の設定についてはこちらの記事が詳細に書いてくださっています。<br>[[入門]Clovaスキル(CEK)は作りながら覚えて行く（Lambda使ってコード実装編）](https://qiita.com/imajoriri/items/357026af6b0de0dfe330)

## 環境
**Node.js 8.10**
Lambdaで`async`を使えるのは8.10以降
参考: [AWS Lambda が Node.js v8.10 をサポート](https://aws.amazon.com/jp/about-aws/whats-new/2018/04/aws-lambda-supports-nodejs/?nc1=h_ls)

## コード
当初は[express](https://www.npmjs.com/package/express)を使う前提となっていた[Clova公式SDK(Node.js)](https://github.com/line/clova-cek-sdk-nodejs)ですが、[こちらのPR](https://github.com/line/clova-cek-sdk-nodejs/pull/5)によってexpressを使わずに`.lambda()`でシンプルに書けるようになりました。

[公式サンプル](https://github.com/line/clova-cek-sdk-nodejs)を`.lambda()`を使って書き換えるとこうなります。

```js
const clova = require('@line/clova-cek-sdk-nodejs');

exports.handler = clova.Client
  .configureSkill()
  .onLaunchRequest(responseHelper => {
    responseHelper.setSimpleSpeech({
      lang: 'ja',
      type: 'PlainText',
      value: 'おはよう',
    });
  })
  .onIntentRequest(async responseHelper => {
    const intent = responseHelper.getIntentName();
    const sessionId = responseHelper.getSessionId();

    switch (intent) {
      case 'Clova.YesIntent':
        // Build speechObject directly for response
        responseHelper.setSimpleSpeech({
          lang: 'ja',
          type: 'PlainText',
          value: 'はいはい',
        });
        break;
      case 'Clova.NoIntent':
        // Or build speechObject with SpeechBuilder for response
        responseHelper.setSimpleSpeech(
          clova.SpeechBuilder.createSpeechText('いえいえ')
        );
        break;
    }
  })
  .onSessionEndedRequest(responseHelper => {
    const sessionId = responseHelper.getSessionId();

    // Do something on session end
  })
  .lambda();
```


## その他
### 公式SDKの使い方
[Clova公式SDK(Node.js)の使い方まとめ](https://qiita.com/miso_develop/items/6b256c1e8757c0ace4a9)
公式SDKの基本的な使い方はこちらの記事がわかりやすいです。
(私自身、とても助かりました…！ありがとうございましたm(_ _)m)


### Lambda関数の作り方
[Clova公式SDK(Node.js)のAWS、Firebaseでの動かし方](https://qiita.com/miso_develop/items/bbf0f548d9d8c4ef2d5a)
使い方まとめと同じ方(@miso_develop )の記事。

### API Gateway + Lambdaの設定
[[入門]Clovaスキル(CEK)は作りながら覚えて行く（Lambda使ってコード実装編）](https://qiita.com/imajoriri/items/357026af6b0de0dfe330)
GUIでの設定方法。この方は公式ではなくオリジナルのSDKを使ってらっしゃいます。


## 参考
- [Clova Developer Center](https://clova-developers.line.me/#/): Clovaスキル開発コンソール
- [clova-cek-sdk-nodejs](https://github.com/line/clova-cek-sdk-nodejs): Clova公式SDK(Node.js)
Raspberry Pi Zero WH で「みちびき」対応 GPS を使う

# 参考
[Raspberry Piに「みちびき」対応GPSモジュールを接続（日記というほどでも）](http://denor.daa.jp/raspberry-piに「みちびき」対応gpsモジュールを接続#serialtty1)
[GPSのNMEAフォーマット（hiramine.com）](http://www.hiramine.com/physicalcomputing/general/gps_nmeaformat.html)

# 環境
* Raspberry Pi ZERO WH
* Raspbian 9.4 (Stretch)
* Python 2.7.13
* [「みちびき」対応 GPS](http://akizukidenshi.com/catalog/g/gK-09991/)

# Raspi と GPS をつなぐ
参考にさせて頂いた記事の手順に従って進めました。
が、gpsmon を動かす必要はなかったので途中までの手順です。

## GPIO ピンに GPS を接続する
接続はとっても簡単でした。
5V 端子から順に GPIO ピンに挿してあげるだけですね。
![IMG_6111.png](https://qiita-image-store.s3.amazonaws.com/0/169583/5106a482-4d3d-5152-2282-50e44044d003.png)

## コンソールを serial0 から tty1 へ変更する
serial0 のまま使う方法を御存知の方いたら教えてください。

### 1. /boot/cmdline.txt を編集する
いきなり編集するのは危険なので、事前にバックアップするようにしました。

~~~shell
$ mkdir -p ~/default/boot
$ sudo cp -p /boot/cmdline.txt ~/default/boot/
$ sudo vi /boot/cmdline.txt
~~~

記述する内容は次の通りです。
元の記述は [#] をつけてコメントアウトしています。

~~~
#dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=PARTUUID=94e60538-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles
dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
~~~

### 2. /boot/config.txt を編集する
こちらも事前にバックアップしました。

~~~shell
$ sudo cp -p /boot/config.txt ~/default/boot/
$ sudo vi /boot/config.txt
~~~

元のファイルに対して次の通り追記しました。

~~~
enable_uart=1
dtoverlay=pps-gpio,gpioin=18
~~~

### 3. /etc/module を編集する
こちらも事前にバックアップです。

~~~shell
$ mkdir ~/default/etc
$ sudo cp -p /etc/module ~/default/etc/
$ sudo vi /etc/module
~~~

追記した内容は次の通りです。

~~~
pps-gpio
~~~

以上で Python から GPS 情報を取得する準備が整いました。

# Python で GPS 情報を取得する
まずは動作確認です。
簡単な直接コードを実行して、値が取得できるか確認しました。

~~~python
import serial

s = serial.Serial('/dev/ttyS0', 9600, timeout=1)

for i in range(10):
    print(s.readline())
~~~

きちんと動いていれば、次のような結果が得られます。
NMEA フォーマットと呼ばれる形式のデータらしいです。

~~~shell
$ python tmp.py
$GPGGA,000331.000,3635.6925,N,13636.7993,E,1,7,1.14,47.6,M,34.9,M,,*6B

$GPGLL,3635.6925,N,13636.7993,E,000331.000,A,A*56

$GPGSA,A,3,17,08,03,22,01,194,193,,,,,,1.44,1.14,0.88*0C

$GPGSV,4,1,16,195,84,129,,03,67,123,26,28,66,250,25,22,57,072,15*4F

$GPGSV,4,2,16,01,49,042,15,193,44,173,23,17,43,315,21,11,41,068,*47

$GPGSV,4,3,16,18,24,059,,194,18,192,22,19,15,302,,08,14,112,18*4E

$GPGSV,4,4,16,06,14,256,,23,07,144,,30,05,222,,14,03,050,*7C

$GPRMC,000331.000,A,3635.6925,N,13636.7993,E,0.16,107.12,290918,,,A*68

$GPVTG,107.12,T,,M,0.16,N,0.30,K,A*3C

$GPZDA,000331.000,29,09,2018,,*5E
~~~

これで GPS ロガーを自作することができますね。
awkで始めるシェル芸

## 概要

awkとその周辺コマンドを使ってのシェル芸Tips記事

## awkを使ったシェル芸

| 組み込み変数 | 説明 | デフォルト値 |
------|----|-------
| FILENAME | 現在の入力ファイル名 | - |
| RS | 入力のレコード区切り文字 | 改行(\n) |
| FS | 入力のフィールド区切り文字 | スペース |
| ORS | 出力のレコード区切り文字 | 改行(\n) |
| OFS | 出力のフィールド区切り文字 | スペース |
| NR | 現在のレコード数 |  |
| NF | 現在のレコードのフィールド数 |  |
| $0 | 現在の入力レコード |  |
| $n | 現在の入力レコードにおけるn番目のフィールド |

``` bash
# 2行目のみを表示
$ cat hoge.txt | awk 'NR==2 {print}'

# フィールド区切り文字を指定して表示
$ cat hoge.txt | awk -F ":" '{print $1}'

# 行数と行全体を表示
$ cat hoge.txt | awk -F ":"  '{print NR}'
```

## grepでよく使うオプション

``` bash
# 複数単語へ一致させる
$ cat hoge.txt | grep -e "hoge" -e "fuga"

# 前後の行を表示させる
$ cat hoge.txt | grep -B 1 -A 1 "hoge"
```

## sedでよく使うオプション




## Tips集

```
```