OmniAICreator/Qiita-1.07M huggingface dataset:
テスト10

```vb

'以下の作業をテスト用のファイルで行う
'1.複数条件で表示した列を「データ」タブ＞「重複の削除」で一意のデータだけ表示する
'2.重複削除した列をコピー、別シートを作成してそこに貼付(貼り付けた列の書式を「文字列」にするのを忘れない)
'3.以上の処理ができたら、以下のコードを実行すると別シートに貼り付けた項目以外が表示されるフィルターが実行される

Sub フィルター()
Dim a

'------------------------------------------------------

'すべてのデータを表示
If Sheets("Sheet5").FilterMode Then
    Sheets("Sheet5").ShowAllData
End If

'------------------------------------------------------

MaxRow = Rows.Count
a = Application.Transpose(Sheets("Sheet5").Range("J2:J20").Value)
i = 1
Do Until Cells(i, 1).Value = ""
    a = Filter(a, Sheets("Sheet6").Cells(i, 1).Value, False)
    i = i + 1
Loop

Sheets("Sheet5").Range("A:J").AutoFilter Field:=10, Criteria1:=a, Operator:=xlFilterValues

'------------------------------------------------------
'別ブックにシートをコピーする
Dim bk As Workbook
Workbooks.Open "C:\Users\user\Desktop\実験用\BBB.xlsm"
Set bk = ActiveWorkbook
Workbooks("テーブルスクレイピング.xlsm").Sheets("Sheet5").Copy After:=bk.Worksheets(2)

End Sub

```
AOJ こたつがめを燃やさないで

https://onlinejudge.u-aizu.ac.jp/beta/room.html#RitsCamp19Day2/problems/E

# AOJ こたつがめを燃やさないで


壁を8つ消すことをどう処理しようか悩んだ。しかし、「8マス消す」と考えずに、隣りあう座標に壁があったらa+bのコストで、なかったらaのコストで移動していくと考える。スタートのコスト0から全探索でコストを更新していく。ただし、自分のマスとその周り9つのいずれかに爆弾があったら壁に移動はできないことに注意する。

気をつけなければならないのは壁を消したあとの斜めの移動だ。周りの壁全てを消せるので、壁を一気に2つ消して斜めのマスに移動する時は2a+bのコストで移動できる。これは壁を1つずつ消すよりも小さいコストで移動できるので、上のパターンとは別途考える必要がある。

壁があった場所に移動する場合は壁を消して１回の移動をして、もしくは2回（斜め）の移動で行くが、最短経路だけを探索するに当たってそれ以降は消した8マスのいずれの場所にも行くことはない。だから壁消しをしたかどうかで場合分けは必要ない。壁を消すときは壁に手を加えないままでいい。


```python

from collections import deque
import numpy as np
from itertools import product


raw_input='''
3 3 10 1
g..
##.
s..
'''


h,w,a,b=list(map(int,raw_input.split()[:4]))
maze=list(map(list,raw_input.split()[4:]))
maze=[i+[0] for i in maze]+[[0]*(w+1)]
# 爆弾がないか探す時にこれを追加しとかないとlist index outになってしまう。
for i in range(len(maze)):
    for j in range(len(maze[i])):
        if maze[i][j]=='s':
            sy,sx=i,j
        if maze[i][j]=='g':
            gy,gx=i,j


dist=[[np.inf for i in range(w)] for j in range(h)]
que=deque()
que.append((sy,sx))
dist[sy][sx]=0
while que:
    y,x=que.popleft()
    for p in (1,-1):
        for i,j in ((1,0),(0,1)):
            ny,nx=y+p*i,x+p*j
            if not (0<=ny<h and 0<=nx<w):
                continue
            if maze[ny][nx]=='#':
                if any(['*'==maze[x+i][y+j] for i,j in product((1,0,-1),(1,0,-1))]):
                    continue
                cost=a+b
            # 壁消して1移動する場合
            else:
                cost=a
            # 壁消さずに普通に移動
            if dist[ny][nx]>dist[y][x]+cost:
                dist[ny][nx]=dist[y][x]+cost
                que.append((ny,nx))
        for i,j in ((1,1),(1,-1)):
            # 壁消して斜めに移動する場合
            ny,nx=y+p*i,x+p*j
            if not (0<=ny<h and 0<=nx<w):
                continue
            if maze[ny][nx]=='#' and (maze[ny][x]=='#' or maze[y][nx]=='#'):
                if any(['*'==maze[x+i][y+j] for i,j in product((1,0,-1),(1,0,-1))]):
                    continue
                if dist[ny][nx]>dist[y][x]+2*a+b:
                    dist[ny][nx]=dist[y][x]+2*a+b
                    que.append((ny,nx))

print(dist[gy][gx])
```
seedsファイルで西暦テーブルを作りたい

[前記事](https://qiita.com/sui625/items/3fb4d7df199d533c1487)で下の画像のミニアプリを実装しようとした際、optionタグ用に1900年から2019年までのレコードを作ろうとして七転八倒したので共有します。　
![qiitad.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465210/bedcfa3c-d865-cdf9-11a1-87db73df9ffa.gif)

## seeds.rbっていうぐらいだからruby式が使えます
[qiita seedデータの投入方法](https://qiita.com/ihatov08/items/e1fdc66537120a095840)
[【Rails入門】seedの使い方まとめ | 侍エンジニア塾ブログ（Samurai Blog) ](https://www.sejuku.net/blog/28395)
seedsファイルのデータ投入方法について検索すると出てくる上記のリンクでは下記のようなコードを紹介しています。

```ruby:(例)seeds.rb
2019.times do |number|
  Year.create(year: number)
end
```
yearsテーブルのyearカラムに0~2019年までのデータを入れるというコードです。
しかし、このコードだと0年からレコードが作られてしまいます。
僕は、ずっとこの式じゃないとデータ投入ができないという固定観念があったので、これでどうやって1900年からだけ入れればいいんだと悩みました。
しかし、seeds.rbでは普通のruby式が使えるので以下のコードでいけます

```ruby:(正解)seeds.rb
num = 1900
while num < 2020
  Year.create(year: num)
  num += 1
end
```
これでもいけます

```ruby:(正解)seeds.rb
2019.times do |number|
  Year.create(year: number) if number >= 1900 
end
```
## 干支も一緒に登録する
話はミニアプリに戻りますが、当初は以下のコードでユーザーの選んだ年に対してリアクションを返そうとしていました。

```javascript:js
$(function(){
  $(".daigo-main__year__select").on("change", function(){ //optionタグを選択すると発火
    var ment = $(this).val();//値を入手
    if (ment % 12 == 0) {
      $(".demon").text("あなたは申年ですね。これが").fadeIn(4000, function(){
        $(".demon2").text("メンタリ○ムです").fadeIn(2000);//値 ÷ 12のあまりが0なら申年
      });
    }
    else if (ment % 12 == 1) {
      $(".demon").text("あなたは酉年ですね。これが").fadeIn(4000, function(){
        $(".demon2").text("メンタリ○ムです").fadeIn(2000);//値 ÷ 12のあまりが1なら酉年
      });
    }
    else if (ment % 12 == 2) {
      $(".demon").text("あなたは戌年ですね。これが").fadeIn(4000, function(){
        $(".demon2").text("メンタリ○ムです").fadeIn(2000);//値 ÷ 12のあまりが2なら戌年
      });
    }
  });
});
.
.
.
.
```

書くのがだる過ぎて干支をテーブルに登録できないか考えました。
テーブルに保存していれば下記のコードを全ての干支で使いまわせますからね。

```javascript:(正解)js
$(function(){
  $(".daigo-main__year__select").on("change", function(){
    var ment = $(this).val();
    $(".demon").text("あなたは"+ ment +"年ですね。これが").fadeIn(4000, function(){
      $(".demon2").text("メンタリ○ムです").fadeIn(2000);
    });   
  });
});
```
それを可能にしたのが以下のコードです。

```ruby:seeds.rb
num = 1900
zyuunishi = ["申", "酉", "戌", "亥", "子", "丑", "寅", "卯", "辰", "巳", "午", "未"]
while num <  2020
  Year.create(year: "#{num}", eto: "#{zyuunishi[num % 12]}")
  num += 1
end
```
配列の中の要素は`配列名[番号]`で入手することができます。それを利用してjQuery側で行なっていた干支の仕分けを自動でしてくれるというわけです。

### 完成!

<img width="496" alt="スクリーンショット 2019-08-04 18.32.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465210/979cdccb-7315-6179-d5ff-0a6767f66a3e.png">
【Python3】pandasのversion0.25.0でimportエラーが起きる

現時点(2019/08/04)で最新のpandasをinstallすると，version0.25.0がインストールされる．

ただそのままpandasをimportするとエラーがでたので共有します．

## 環境
ec2 amazon-linux2
python 3.6.8

## エラー文

```
>>> import pandas as pd
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/miyano/.pyenv/versions/3.6.8/lib/python3.6/site-packages/pandas/__init__.py", line 55, in <module>
    from pandas.core.api import (
  File "/home/miyano/.pyenv/versions/3.6.8/lib/python3.6/site-packages/pandas/core/api.py", line 24, in <module>
    from pandas.core.groupby import Grouper, NamedAgg
  File "/home/miyano/.pyenv/versions/3.6.8/lib/python3.6/site-packages/pandas/core/groupby/__init__.py", line 1, in <module>
    from pandas.core.groupby.generic import (  # noqa: F401
  File "/home/miyano/.pyenv/versions/3.6.8/lib/python3.6/site-packages/pandas/core/groupby/generic.py", line 44, in <module>
    from pandas.core.frame import DataFrame
  File "/home/miyano/.pyenv/versions/3.6.8/lib/python3.6/site-packages/pandas/core/frame.py", line 88, in <module>
    from pandas.core.generic import NDFrame, _shared_docs
  File "/home/miyano/.pyenv/versions/3.6.8/lib/python3.6/site-packages/pandas/core/generic.py", line 71, in <module>
    from pandas.io.formats.format import DataFrameFormatter, format_percentiles
  File "/home/miyano/.pyenv/versions/3.6.8/lib/python3.6/site-packages/pandas/io/formats/format.py", line 47, in <module>
    from pandas.io.common import _expand_user, _stringify_path
  File "/home/miyano/.pyenv/versions/3.6.8/lib/python3.6/site-packages/pandas/io/common.py", line 9, in <module>
    import lzma
  File "/home/miyano/.pyenv/versions/3.6.8/lib/python3.6/lzma.py", line 27, in <module>
    from _lzma import *
ModuleNotFoundError: No module named '_lzma'
```

いろいろ試しましたが，うまく行かず．．

# 解決策


なので現時点ではpandasのversionを1つ下げてinstallするといいです．（本質的な解決ではありませんが）


```shell
pip install pandas==0.24.1
```

```
>>> import pandas as pd
>>> 
```

これでしばらくはなんとかなります．version0.25.0での本質的な対処法がわかり次第，またここで共有させていただきます．



# 追記(20200207)

@nakkun さんからコメントをいただきまして，


pyenvの再インストール後，

```shell
pyenv uninstall 3.6.8
sudo yum install -y xz-devel # macの場合は brew install xz
pyenv install 3.6.8
```

で解決します．

macの場合のソースは以下

https://github.com/pandas-dev/pandas/issues/27532#issuecomment-517259553
React×Redux×Typescriptにおける環境開発で、初っ端からこけた際の対処法

新しくReactをTypescriptで起動し、Reduxを導入しようとするとビルドできなくなるというエラーに突然ぶち当たりました。
とても簡単に解決できたので、備忘録として残しておきます。

いつも通り下記でReactアプリケーションをTypescriptで構築します。

```bash
npx create-react-app sample-ts-react-app --typescript

# この時点ではちゃんとビルドする
cd yarn
yarn build
```

ここで下記の手順で、reduxを導入すると突然エラーが出るようになりました。

```bash

npm install --save redux react-redux
npm install -D @types/react-redux
yarn build

#エラー文
TypeScript error in /sample-ts-react-app/src/App.tsx(1,19):
Could not find a declaration file for module 'react'. '/sample-ts-react-app/node_modules/react/index.js' implicitly has an 'any' type.
  If the 'react' package actually exposes this module, consider sending a pull request to amend 'https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/react`  TS7016
```

ドキュメントなどを読んで調べてみると、原因はtsconfigにあるようでした。
したがって下記をcreate-reaxct-appで生成されたtsconfig.jsonに追加するだけで、ちゃんと起動することができるようになりました。

```json
    "noImplicitAny": false,
```


# 参考記事
https://medium.com/@amandeepkochhar/typescript-error-could-not-find-a-declaration-file-for-module-xyz-dfbe6e45c2bd
MacでAWS CLIのインストールからS3への接続までやってみた


# 目次
- 1. ゴール設定
- 2. 前提
- 3. AWS CLIのインストール
- 4. IAM 管理者のユーザーおよびグループの作成
- 5. IAM 管理者のユーザーのアクセスキーを作成
- 6. AWS CLIからS3への接続設定
- 7. AWS CLIからS3へ接続
- 8. まとめ

# 1. ゴール設定
AWS CLIを使用して、自分で作成したS3バケットに接続すること。

# 2. 前提
- 実施環境
  - 実施日：2019/8/4
  - 端末：Mac Book Pro（2019/7/10購入）
  - OS：MacOS Mojave バージョン10.14.6
- ルートユーザーでS3バケットを作成済み

# 3. AWS CLIのインストール
[macOS に AWS CLI をインストールする](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-macos.html)の手順を元に実施。

```
$ python --version
$ curl "https://s3.amazonaws.com/aws-cli/awscli-bundle.zip" -o "awscli-bundle.zip"
$ unzip awscli-bundle.zip
$ sudo ./awscli-bundle/install -i /usr/local/aws -b /usr/local/bin/aws
$ aws --version
```

# 4. IAM 管理者のユーザーおよびグループの作成
私の場合、IAMのユーザーを作成していなかったので、本手順が必要でした。。。
すでにIAMユーザー作成されている方は、本手順はスキップしてください。

[管理者 IAM ユーザーおよびグループの作成 (コンソール)](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/getting-started_create-admin-group.html#getting-started_create-admin-group-console)に従ってIAM 管理者のユーザーおよびグループの作成を行う。

↓ユーザーとグループを作成確認画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288770/d72087b0-0494-52f9-be7c-ccfe2be045f2.png)

↓作成完了画面
※ ユーザーの認証情報を「csvダウンロード」もしくは「Eメール送信」で控えておきましょう。
　控えておかないと作成したユーザーでログインできないので、要注意。。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288770/f18f69d3-6898-6190-ee88-8fbefa1186b7.png)

# 5. IAM 管理者のユーザーのアクセスキーを作成
1. 先の手順で作成したユーザー（AWS CLIで使用するユーザー）でAWSコンソールにサインインし直す。
1. アクセスキーを、[IAM ユーザーのアクセスキーを作成するには](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-configure.html#cli-quick-configuration-creds)の手順を元に作成。

※ 作成されたアクセスキーは、必ずcsvダウンロードして控えておきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288770/5f1eddf8-d050-1d7a-ba74-81afae6dd274.png)


# 6. AWS CLIからS3への接続設定
[AWS CLI のかんたん設定](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-configure.html#cli-quick-configuration)の手順を元に実施。
※ デフォルトの接続先リージョンは、東京リージョンにしています。

```
$ aws configure
AWS Access Key ID [None]: {{先に取得した「アクセスキーID」をここに入力}}
AWS Secret Access Key [None]: {{先に取得した「シークレットアクセスキー」をここに入力}}
Default region name [None]: ap-northeast-1
Default output format [None]: json
```

# 7. AWS CLIからS3へ接続
いよいよ、S3へ接続です。
以下のように、S3に作成したバケット名が表示されれば接続成功です。

```
$ aws s3 ls
2019-08-04 15:41:26 xxxxx
```

# 8. まとめ
いかがでしたでしょうか？
AWSの公式ドキュメントに丁寧に記載されているので、特に迷うことなく進めることができました。

今回はロール周りをあまり意識せず管理者ユーザーで設定しましたが、
開発で本格的に使うときは開発者毎にユーザーを分けて、適切なロールを割り当てることが必須だと感じました。

今後は、AWS CLIを駆使して開発効率化や自動化をいきたいなーと思っています。
では！
GitHub の便利機能メモ

https://github.com/tiimgreen/github-cheat-sheet から個人的に厳選してメモ。

## 差分の比較
### branch 間
[https://github.com/ReactiveX/rxdart/**compare/master...bloc-example**](https://github.com/ReactiveX/rxdart/compare/master...bloc-example)

### tag 間
[https://github.com/ReactiveX/rxdart/**compare/0.22.0...0.22.1**](https://github.com/ReactiveX/rxdart/compare/0.22.0...0.22.1)

### [期間](https://help.github.com/en/articles/comparing-commits-across-time)
* [https://github.com/ReactiveX/rxdart/**compare/master@{3.week.ago}..master**](https://github.com/ReactiveX/rxdart/compare/master@{3.week.ago}..master)
* [https://github.com/ReactiveX/rxdart/**compare/master@{2019-07-01}..master**](https://github.com/ReactiveX/rxdart/compare/master@{2019-07-01}..master)

## 差分の表示オプション
### [空白の無視](https://github.blog/2018-05-01-ignore-white-space-in-code-review/)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159680/adefb4bc-cfe7-2e6d-2cd5-463bf4dfe206.png)

### タブ幅の調節
[https://github.com/mjibson/goon/blob/master/cache.go<b>?ts=4</b>](https://github.com/mjibson/goon/blob/master/cache.go?ts=4)

### プレーンテキストで表示
[https://github.com/ReactiveX/rxdart/compare/master...bloc-example<b>.diff</b>](https://github.com/ReactiveX/rxdart/compare/master...bloc-example.diff)

## 特定ユーザーが author の PR, Issue を表示
[https://github.com/flutter/flutter/<b>issues?q=author:sensuikan1973</b>](https://github.com/flutter/flutter/issues?q=author:sensuikan1973)

## 特定ユーザーの commit だけを表示
[https://github.com/flutter/flutter/commits/master<b>?author=sensuikan1973</b>](https://github.com/flutter/flutter/commits/master?author=sensuikan1973)

## [短縮 URL](https://github.com/blog/985-git-io-github-url-shortener)
[Git.io](https://git.io/) を使って生成できる。

## ショートカットキー
`?` を押すとチートシートが出てくる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159680/db023020-399b-c208-f542-18a1f246a9df.png)

## commit
### 鉛筆 PR
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159680/3b4e624d-d084-0d0a-80d3-cb1f37bbce7e.png)

### コメントの diff を元に
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159680/d7a88efd-c5a7-e960-182f-aa181a808061.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159680/893c0677-651b-b52c-c186-d5fd5ef6a5a5.png)


## コードの指定行を強調
Shift を押しながら2つの行をクリックして `Copy permalink` すればいい。
[https://github.com/flutter/flutter/blob/beta/analysis_options.yaml<b>#L35-L40</b>](https://github.com/flutter/flutter/blob/beta/analysis_options.yaml#L35-L40)

## 絵文字
[チートシート](https://www.webfx.com/tools/emoji-cheat-sheet/) や [検索サービス](https://emoji.muan.co) を見ると楽
FirebaseのRealtimeDatabaseでobserveSingleEvent取得結果で0件だったときの判定方法

# FirebaseのRealtimeDatabaseでobserveSingleEvent取得結果で0件だったときの判定方法

## はじめに
[FirebaseのRealtimeDatabaseから新規追加されたデータを逐次取得する](https://qiita.com/From_F/items/20406a16d1eb658ac1a1) でデータ取得でデータベースに未登録のことをどう判定すればよいのかわからないことがありました。
単純だったのですが、気づかなかったので共有します。

## データの一括取得でデータが存在しないってどう判定すればいいの？
Firebase公式ドキュメントの [データの1回読み取り](https://firebase.google.com/docs/database/ios/read-and-write?hl=ja#read_data_once) を見ると一見簡単に一括取得できそうです。
しかしながら、データがないときはどうればいいのでしょうか？

[value イベントのリッスン](https://firebase.google.com/docs/database/ios/read-and-write?hl=ja#listen_for_value_events)という項目に答えがありました。

> データが存在しない場合、スナップショットから返されるのは、`exists()` を呼び出した場合は `false` で、`value` プロパティを読み取った場合は `nil` です。

データが存在しない場合は、**nil**となるでした。

前回の[インデックス用のデータ取得](https://qiita.com/From_F/items/20406a16d1eb658ac1a1#%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9%E7%94%A8%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E5%8F%96%E5%BE%97)のサンプルコードを例にすると `guard let 〜 else { return }` のreturnルートに入るとデータが存在しないことになります。
サンプルコードを少し修正して `print` 文を加えてみました。

```Swift
fireDatabase.child("index").observeSingleEvent(of: .value, with: { (snapshot) in
    // Get user value
    guard let values = snapshot.value as? [String:Any] else {
        print("データは存在しない")
        return
    }
    values.forEach({ (key,value) in
        guard let record = value as? [String:Any] else { return }
        guard let timeInterval1970 = record[self.keyDate] as? TimeInterval else { return }
        let date = Date(timeIntervalSince1970: timeInterval1970)
        guard let uuid = record[self.keyUUID] as? String else { return }
        // ここに何か処理を書く
    })
}) { (error) in
    print(error.localizedDescription)
}
```

## 最後に

ARKitとFirebaseを組み合わせて空間にメッセージを共有できるSNSアプリ [ARIZAR](https://apps.apple.com/jp/app/arizar/id1473208636) を開発しました。
この [ARIZAR](https://apps.apple.com/jp/app/arizar/id1473208636) 開発時に取得完了タイミングがわからなくて調べました。
また時間ができたら他の技術要素でシェアしていきたいと思います。
分かるようで分からないちょっと分かるようになるvimの正規表現の最短/最長一致

訛りがきつくて毎回混乱するので自分で表にまとめて無理やり覚えるやつです。

| N 以上 | M 以下 | 最長一致 | 最短一致  | (参考) 最長一致 |
|:------:|:------:|:---------|:----------|:----------------|
| 0      |        | `*`      | `\{-}`    | `\{}`           |
| 1      |        | `\+`     | `\{-1,}`  | `\{1,}`         |
| n      |        | `\{n,}`  | `\{-n,}`  |                 |
| n      | n      | `\{n}`   | `\{-n}`   |                 |
| n      | m      | `\{n,m}` | `\{-n,m}` |                 |
| 0      | m      | `\{,m}`  | `\{-,m}`  |                 |

## 特記事項

- 量指定は(magicモードなら)`*`以外は全部エスケープがいる
- 「最短一致を表現するのに負の数字を使う」というより、波括弧に修飾がついた`\{-`が最短一致を表す
- 「0以上」と「m以下」の場合は省略出来るけど、以上/以下の表現のためにコンマは必要。0以上最短一致の`\{-}`だけはコンマもいらない
- 以上/以下の指定がない場合もコンマは不要
OpenAPI仕様共有プラットフォームとして、Apicurio Studioがめちゃくちゃ優秀だった件

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321850/d4628787-cde4-4b28-ab45-eba688b3f15d.png)

# はじめに
こんにちわ。Wano株式会社エンジニアのnariと申します。
突然ですが、皆さんはopenAPI仕様共有ツールに何を使っていますか?

Swagger周辺のツールを使っている方が多いのではないかなと思います。

**しかし、フロント側やビジネス側の人間にも確認してもらいたかったり、いじってもらいたい場合、ymlやjsonベースのソースをいじってもらうのはなかなか難しいことも。。**

そこで現在はGUIでいじれるApicurioというツールを試していて、かなり優秀だったので紹介させていただきます。
前回のツール選定の記事は[こちら](https://qiita.com/fukubaka0825/items/1fd54cea4153abd0987f)
# [Apicurio Studio](https://www.apicur.io/)とは
**Design beautiful, functional APIs with zero coding, using OpenAPI**がテーマ。
(https://www.apicur.io/　より抜粋)
**Web Based,Code-optional Design**を特徴としたOSSです。
# Apicurio Studioのここが凄い
## 1.基本機能を無料で使用できるプラットフォームである
OSSとして提供されており、基本機能は完全無料で使うことができる
他のプラットフォーム系ツールが基本的に**1メンバー平均20ドルくらいかかること**を考えると、かなり素晴らしいです。。(Swagger-hubが月に90ドル（５メンバー）)

## 2.ソースリポジトリとのsyncが可能
- 現在github,bitbucket,gitlabに対応している
<img width="1436" alt="スクリーンショット 2019-08-04 17.16.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321850/51d1147f-aff9-a133-5877-f12e6530f6f2.png">
- コラボレイターも招待でき、複数人での管理ももちろん可能
<img width="1435" alt="スクリーンショット 2019-08-04 17.21.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321850/351aab15-ff78-c8d3-f146-98950d57fc8c.png">

## 3.GUIぽちぽちでOpenAPI仕様が作れる
- 以下のように、query parameterやpayloadの設定をGUIで設定できる(独自型も設定可能)
<img width="1427" alt="スクリーンショット 2019-08-04 17.19.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321850/7d83e036-c93d-7202-65e0-efc3a820ae42.png">
- もちろん直接ソースをいじることもできる
<img width="1429" alt="スクリーンショット 2019-08-04 17.18.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321850/6240da44-5a09-e8a5-4051-2ff9dada1d50.png">

## 4.DocumentのUIが綺麗
- 他のOpenAPIツール同様Documentも生成できますが、そのUIがすごくみやすいです。(以下のimage参照)
  - それぞれのapiの詳細とexampleを一見して見ることができる
<img width="1436" alt="スクリーンショット 2019-08-04 17.18.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321850/2b403071-9fb5-fc1a-f2cd-f1df90de789a.png">

# Apicurio Studioの弱いところ
## mockAPIの生成ができない
[Roadmap \| Apicurio Studio](https://www.apicur.io/roadmap/)
によると将来的にできるようになるようですが、現在はできないので代替のものを使用する必要があります
その際、[apisprout](https://github.com/danielgtaylor/apisprout)のdockerコンテナを自社サーバーに立てておいて、apicurioから吐き出したopenapi.ymlを読み込ませると、簡単にmockAPIを立てることができてお勧めです。
# 終わりに
Swagger一強と思われていますが、正直最終的にymlが吐き出せればなんでも良いのでGUIツールなんかを検討してみてもいいのかなと思います。
他にこんなツールがおすすめだよ、などあればぜひぜひ教えていただきたいです。
[Django] CreateViewにおいてformで指定していないfieldにデータを追加する方法

## 環境
- Python: 3.7.2
- Django: 2.0.13

## 実装
- modelを定義し、modelformを作る。

```project/app/models.py
from django.db import models

class SampleModel(models.Model):
    field1 = models.CharField(verbose_name='フィールド１', max_length=200)
    field2 = models.CharField(verbose_name='フィールド２', max_length=200)
    field3 = models.CharField(verbose_name='フィールド３', max_length=200)
    field4 = models.CharField(verbose_name='フィールド４', max_length=200)
```

```project/app/forms.py
from django import forms
from .models import SampleModel

class SampleCreateForm(forms.ModelForm):
    class Meta:
        model = SampleModel
        fields = ('field1', 'field2', 'field3')
```

- fieldsに含まれていない field4を自分で設定したい

```project/app/views.py
from django.views.generic import CreateView
from django.shortcuts import redirect

from .models import SampleModel
from .forms import SampleCreateForm

class SampleCreateView(CreateView):
    model = SampleModel
    form_class = SampleCreateForm
    def post(self, request, *args, **kwargs):
        context_object_name = 'sample_create'
        form = self.form_class(request.POST)
        if form.is_valid():
            obj = form.save(commit=False)
            obj.field4 = 'ここに値を書き込む'
            obj.save()
            return redirect('sample_detail', pk=obj.pk)


sample_create = SampleCreateView.as_view()
```

- save() を commit=False で呼び出すと、データベースに保存する前のモデルオブジェクトを返してくれるらしい

- 他にいい方法があったら教えてください><
Herokuでアプリをデプロイしたら「”We're sorry, but something went wrong.”」のエラーが出た　　　【Rails】

Herokuでアプリをデプロイしようとしたら、「”We're sorry, but something went wrong.”」というエラーが出た

![スクリーンショット 2019-08-04 16.46.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417196/43f0073f-7412-e75e-c156-a25ace08a315.png)


1 ググるとlogフォルダ内のdevelopment.logに表示された原因が書かれているとの事だったので、調べるが特に問題が見当たらず。
2 次にheroku デプロイ　We're sorry, but something went wrong.　としてヒットした記事を参考に```heroku run rails db:migrate```をターミナルで実行すると解決した。

## ```heroku run rails db:migrate```とはなんなのか
Heroku上でデータベースを初期化していないので、このままHeroku上のWebアプリケーションにアクセスするとエラーが発生してしまう。そこでheroku runコマンドを用いることにより、Heroku上でRakeコマンドが使えるようにするということなのかな？
備忘録 入門-MQL5のTimerオブジェクトに関して-

# 概要
MQLの仕様が良く解っていない私が自動売買のシステムを作成するにあたって、
OnTimerで複数処理を呼び出したいと思い検証した内容を記す

理由として、MQL5のリファレンスに下記が記載されていた

```
通常、この関数は OnInit() 関数またはクラスコンストラクタで呼ばれるべきです。タイマーからくるイベントを処理するために，エキスパートアドバイザーはOnTimer() 関数を持つべきです。

エキスパートアドバイザーならびに指標は、全て独自のタイマーで動作しそこからのみイベントを受けとります。作成されたタイマーは EventKillTimer() 関数で無効にされていない限り MQL5 プログラムの操作の終了時に強制的に破壊されます。

プログラムでは複数のタイマーを実行することは出来ません。各MQL5アプリケーションとチャートは、新たに到着したイベントが配置されるイベントの独自のキューを持っています。タイマーイベントがキューに存在するまたは処理中の場合、新しいタイマーイベントは MQL5 プログラムのキューに加えられません。
```

一つのソースからは単一のイベントしか起動出来ない、、、、
という事は、複数のチャートへそれぞれEAを動かした場合どうなるのだろうと思い試した内容を記す。

# 結果
結果としては、複数のチャート画面にそれぞれEAを設定さえすれば複数の時間起動システムを実行する事は可能だった。

##　試験方法
①15秒置きにログが出力されるEAを作成
②適当なチャート２つにそれぞれEAを設定する。

##　試験判定方法
ログ出力画面に15秒より短い頻度でコメントが出力されるかを判定

## 使用したEAのソース
出す程の物では無いが一応

```
int OnInit()
  {
//--- create timer
   EventSetTimer(15); ①15秒毎にonTimerを実行
   
//---
   return(INIT_SUCCEEDED);
  }
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();　③EA終了時にTimerイベントを終了
   
  }
void OnTimer()
  {
//---
   printf("hahaha");   ②時間が来たら適当に笑え
  }
```
Dockerのイメージ更新のチェック

#####備忘メモ

Dockerはオプションなしで実行したとき、ローカルに一致するイメージ名:タグがある場合はリポジトリのイメージの更新をチェックしない。

検証ソース
https://github.com/tky-k/docker/tree/master/docker_tag_test

Dockerは特にオプションなしでrunによって実行した場合はリポジトリの更新をチェックしないようです。
リポジトリの更新チェックのオプションがありそうな気がするんですが、調査中。。。
git/github 覚書

気になっていてそのままだったgit/githubをやっとこさ触ってみました。
Atomで使うことを前提に色々調べながらやりました。個人的に躓いたところとかをメモ代わりに記載していきます。

後々連携する場合は事前準備として先にgithubにリポジトリを作成しておくこと。

プロジェクトディレクトリを作成、移動。そして

```
git init
```
空でコミットしておく。この方がAtomと連携する場合に良さそうです。

```
git commit --allow-empty -m "First Commit"
```
先に作成したgithubのリポジトリを登録。
**※atomを開く前にリモートリポジトリ登録しておかないと「No Remote」という表示が出てどうにもならなくなる。**

```
git remote add origin https://github.com/XXXXX/XXXXX.git
```
ローカルとリモートを同期させる意味でfetch。

```
git fetch
```
ここまで来たら無事にAtomでgit/githubを扱えるようになったので。

```
atom .
```

pushに失敗した時は

```
% git fetch && git merge origin/master
```
この時

```
fatal: refusing to merge unrelated histories
```
と表示されマージに失敗した時は

```
% git merge --allow-unrelated-histories origin/master
```
とすると

```
Merge made by the 'recursive' strategy.
 README.md | 2 ++
 1 file changed, 2 insertions(+)
 create mode 100644 README.md
```
というコメントと共にマージすることができる。
ModelSimでプロジェクトのソースを相対パスで参照

# 問題点
ModelSimのプロジェクトファイル(\*.mpf)では、使用するソースが**絶対パス**で保存される。
プロジェクトを他の人と共有するのが面倒なので、相対パスで保存したい。

# 解決策
Location Mapping機能でプロジェクトのソースを相対パスで参照する
ロケーションマップファイルでルートディレクトリを指定すると、プロジェクトファイルにはプロジェクトのルートディレクトリからの相対パスで保存される
詳細はModelSim User's ManualのAppendix B Location Mappingに記載されている

# 手順
ModelSimがロケーションマップを認識する方法は以下の2通りある

1. 環境変数MGC_LOCATION_MAPで指定  
環境変数MGC_LOCATION_MAPにファイルへのパスを設定する
1. 環境変数が無い場合  
mgc_location_mapというファイルを以下の優先順で検索  
  - カレントディレクトリ
  - ユーザーのホームディレクトリ
  - ModelSimバイナリがあるディレクトリ
  - ModelSimのインストールディレクトリ

プロジェクトを使う場合はプロジェクトディレクトリ(\*.mpfファイルと同じディレクトリ)がカレントディレクトリになるので、\*.mpfと同じディレクトリにmgc_location_mapというテキストファイルを作成する

* mgc_location_map内容

```
$PRJ
c:\vhdl\project_dir
```
$PRJからの相対パスで保存される
$PRJは絶対パスで指定する必要がある

* mgc_location_map自動生成BAT  
生成したいディレクトリで実行する

```
REM mgc_location_mapを生成する  

cd %~dp0

set MGC_LOCATION_MAP=%~dp0\mgc_location_map

echo $PRJ > %MGC_LOCATION_MAP%
cd >> %MGC_LOCATION_MAP%

```

* ModelSimでのプロジェクト設定  
Project SettingsでLocation mapのConvert pathnames to softnamesにチェックする  
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/256050/bf77070f-78a7-df94-92be-f7f370863f1a.png)
cURLを使って外部サービスのAPIを叩く

PHPで組んだシステムからAPIをぶっ叩いて外部サイトとあれやこれややり取り出来る機能を追加してほしいというお題をもらったので、cURLを利用して外部APIを叩く勉強をした。
そのときの備忘録

#目的
社内チャットにchatworkを使用しているので、社内システムから業務に必要な申請があった時、管理者にchatworkへ「申請があったよ」ってタスクを登録してあげたりする機能を追加したい。


##cURLの使い方

###基本

```php
$url = "叩きたいAPIのURL";
$ch = curl_init(); //初期化
```

###オプション設定

```php
curl_setopt($ch, CURLOPT_URL, $url); //URLの指定
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); //返り値が欲しい
```


###実行

```php
$response = curl_exec($ch);
curl_close($ch); //終了
```


基本的にはこんなところ。
あとはやりたい動作毎にメソッドを指定してあげる。

###GETメソッド
APIを叩いてデータを取得したい場合。ユーザー情報とかroomIDとか。
特に設定は必要なく、上記の基本部分だけの記述でOK。


###POSTメソッド
何かしらのデータ登録的な処理を行ってほしい時。メッセージの投稿やタスクの設定など。

```php
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
```
まずPOST処理をしたいことを設定。
その後、設定するためのパラメータを配列形式で指定する。設定する内容は行いたい処理によって様々なので、使いたいAPIのドキュメントを参照して設定する。

今回の場合だと、タスク登録時に発行されるタスクIDが後々の処理で必要になるので、POSTの場合でも返り値を受け取る設定をしておいた。


###PUTメソッド
変更などの処理を行ってほしい場合。今回だと、タスクステータスの自動変更など。

```php
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
```

POSTメソッドとは、メソッドの指定の仕方が違う。
オプションにCURLOPT_PUTがあったので、これを指定すれば動きそうと思ったら動かなくて、上記の方法でPUTメソッドと指定してあげないとダメ。
ついにで今回はPOSTもPUTも記述を統一したので気にしてなかったが、PUTする場合はパラメータもhttp_build_queryで変換してあげないとダメらしい。
POST時に返り値で貰えるタスクIDがあれば、そのタスクIDをURLの中で指定し、タスクのパラメータをAPIで自動的に切り替える機能も盛り込むことが出来た。



あとはDELETEメソッドもあるが、今回は使用しなかったのでここでは割愛。

とりあえず、これらの方法で無事外部サービスとの連携機能を実装することが出来た。
Firestoreお役立ちリンク

RDB出身者の私にとって、Firestoreはとっつきにくかったので参考になったページをリンク集形式でまとめました。

## データの読み込み

- [Cloud Firestore でデータを取得する](https://firebase.google.com/docs/firestore/query-data/get-data?authuser=0)

- [Cloud Firestore で単純なクエリと複合クエリを実行する](https://firebase.google.com/docs/firestore/query-data/queries?authuser=0#query_limitations)

- [Cloud Firestore でのデータの並べ替えと制限](https://firebase.google.com/docs/firestore/query-data/order-limit-data?hl=ja)

## 基本的なデータの読み書き

- [Cloud Firestore にデータを追加する](https://firebase.google.com/docs/firestore/manage-data/add-data?authuser=0)

- [トランザクションと一括書き込み](https://firebase.google.com/docs/firestore/manage-data/transactions?hl=ja)

-  [Cloud Firestore からデータを削除する](https://firebase.google.com/docs/firestore/manage-data/delete-data?hl=ja#collections)

- [Firebase Cloud FirestoreのTransactionについて考える](https://qiita.com/1amageek/items/2eff436fb69bea5875ea)

## リアルタイム処理

- [Cloud Firestore でリアルタイム アップデートを入手する](https://firebase.google.com/docs/firestore/query-data/listen?hl=ja)

## Firebase Cloud Function

### 公式

- [スタートガイド](https://firebase.google.com/docs/functions/get-started?hl=ja)

- [Cloud Functions による Cloud Firestore の拡張](https://firebase.google.com/docs/firestore/extend-with-functions?hl=ja#wildcards-parameters)

- [Firestoreでコレクションの要素数をカウントする方法](https://www.sukerou.com/2019/08/firestore.html)

### ローカルでのデバッグ

- [ローカルでの関数の実行](https://firebase.google.com/docs/functions/local-emulator?hl=ja)


## データ設計

- [Cloud Firestoreの概要とデータベース設計について](https://qiita.com/keito_jp/items/3a9a14c9e0fb951152f7)
php-master-changes 2019-08-03

今日は strip_tags() のバグ修正があった！

# 2019-08-03
## cmb69: Fix [#78346](): strip_tags no longer handling nested php tags
- https://github.com/php/php-src/commit/a87ef5e3ddfdb3083c2b62bb25835b74d9a3d083
- [7.3~]
- [strip_tags()](https://www.php.net/manual/ja/function.strip-tags.php) で PHP タグをネストした場合に除去がうまくいかなくなっていた問題の修正
[jQuery]optionタグを発火点にしたい




ユーザーの選択に対してリアクションを返す機能を実装しようとした際、selectタグ内の
optionタグを発火点にしようとして四苦八苦したので共有します。

selecrtタグ?美味いの?と思う方は以下のリンクを読んでみてください
[<SELECT>－HTMLタグリファレンス - HTMLクイックリファレンス] (http://www.htmq.com/html/select.shtml)

## optionタグは発火点にできない
結論から言うとoptionタグは発火点にできません。しかし、selectタグ自身を発火点にすることができます。

```javascript:js
$(function(){
  $(selectタグ).on("change", function(){
   したい処理
  });
});
```

selectタグの中身が変わる(optionタグがクリックされる)たびに発火しているのですね。
ちなみに作ったのはこんなものです。
![qiitad.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465210/9fee77af-51d9-2afd-53f0-244cd784db32.gif)

## 実装に当たって苦労したこと
[seedsファイルで西暦テーブルを作りたい](https://qiita.com/sui625/items/1ba429a8ddf8a55241f8)
PyMC3がうまくいかない場合(numpyのモジュールがないといわれたときの解決法)

# 概要
ベイズ推論の考え方の説明とそれを行うことのできるPythonライブラリPyMC3を使ってみようとしたらうまいことできなかったため，その対処法を載せる．ちなみにインストール方法は以下に書いてあります
https://docs.pymc.io/

# 各種バージョン
・OS:windows10
・anaconda環境下
・editor:jupyter notebook

・numpy:1.16.4
・pandas:0.24.2
・pymc3:3.6

後に記述するが

・theano:1.0.3

# インストール
インストールは上記に載せたURLの通り

```ruby:
conda install -c conda-forge pymc3
```

と，anaconda promptを使ってインストールした．(pipとconda混ぜるな危険，windowsユーザーはcondaで入らないときは積極的にconda-forgeを使いましょう)

# 今回の問題
よーし，これでベイズ推論の検証ができるぞとばかり思い，以下のコードを実行してみた

```python:
import numpy as np
import scipy.stats as stats
import pymc3 as pm

import warnings
warnings.simplefilter('ignore')

# 乱数のseed固定
random_state = 0

np.random.seed(random_state)
n_trials = 4
theta_real = 0.35
data = stats.bernoulli.rvs(p=theta_real, size=n_trials)
data

# withブロックの内側すべてが一つのモデル
with pm.Model() as model:
    # モデリング
    theta = pm.Beta('θ', alpha=1., beta=1.) # 事前確率
    y = pm.Bernoulli('y', p=theta, observed=data) # 尤度
    
    # 推論
    trace = pm.sample(1000, random_seed=random_state)
```

すると，以下のエラーが出てきた．

```python:
AttributeError: module 'numpy.core.multiarray' has no attribute '_get_ndarray_c_version'
```
pm.Model()でエラーが出た．
どうやらnumpyで関連で怒られているらしい…
調べてみると，https://github.com/pymc-devs/pymc3/issues/3340 ここで言われているようにいろんな人に起きてるみたい．読んでみると，theanoというパッケージを1.0.3から1.0.4にあげないとダメとのことで，やってみた．
```
conda install theano==1.0.4
```
これでもダメそう…

結局，numpyを入れ直し，pymc3を3.6から3.7に無理やりあげるとうまくいった．また，pandasやnumpyのバージョンはこれでないといろんなところでエラーが出たので，けっこうデリケートな設計だなPyMC3って感じでした．
DockerでYii2の開発環境を作った時にハマったこと -2-

DockerでYii2のfrontend, backendなどのコンテナを作ると、そのままではgiiが使えないです。

なぜなら、デフォルトではlocalhostからのアクセスしかgiiは認めていないから。

ということで、backend側のmain-local.phpを編集する。

    $config['modules']['gii'] = [
        'class' => 'yii\gii\Module',
    ];

ここに

        'allowedIPs' => ['192.168.*'],               

を追加してやる。

これでOK。実際に設定するIPアドレスは、各自の環境に合わせてください。
spring boot Ajax通信成功後、ファイルダウンロード（form）

メモ用のための記録です。

index.html

```java

 <!DOCTYPE html>
 <html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<script type="text/javascript" th:inline="javascript" th:src="@{/js/sampleJs.js}"> </script> 
<title>Hello Page</title>
</head>
<body>
	<button type="button" id = "ajax_btn">DOWNLOAD</button><br />
	 outputData：<span id="output_data"></span>
	 <form action="/download">
	 <input type="submit" value="GO! Download!!">
	 </form>
</body>
</html>


sampleJs.js
$(function() {
    // Ajax通信テスト ボタンクリック
    $("#ajax_btn").click(function() {
        // outputDataを空に初期化
    	alert(1);
        $("#output_data").text("");
        $.ajax({
            type        : "GET",
            url         : "getTestData",
            dataType    : "text",
            success     : function(data) {
                            success(data);
                        },
            error       : function(XMLHttpRequest, textStatus, errorThrown) {
                            error(XMLHttpRequest, textStatus, errorThrown);
                        }
        });
    });
});
   // Ajax通信成功時処理
   function success(data) {
	console.log("success:" + data);
 
    $("#output_data").text("");
    $("#output_data").append("data:" + data + ";");

    var url = "/download";
    var fileName = "20190804.txt";
    var form = $("<form></form>").attr("action", url).attr("method", "get");
    form.append($("<input></input>").attr("type", "hidden").attr("name", "fileName").attr("value", fileName));
    form.appendTo('body').submit().remove();
}
 
// Ajax通信失敗時処理
function error(XMLHttpRequest, textStatus, errorThrown) {
    console.log("error:" + XMLHttpRequest);
    console.log("status:" + textStatus);
    console.log("errorThrown:" + errorThrown);
}

java

@Controller
public class WebSiteController {
	@RequestMapping(value="/download", method = RequestMethod.GET)
	public void fileDownload(String fileName,HttpServletResponse response){
	    try (InputStream is = new FileInputStream("d:\\"+fileName);
	    	OutputStream os = response.getOutputStream();) {
	    		byte[] fileByteArray = IOUtils.toByteArray(is);
	    		response.setContentType("application/octet-stream");
	    		response.setHeader("Content-Disposition", "attachment; filename="+fileName);
	    		response.setContentLength(fileByteArray.length);
	    		os.write(fileByteArray);
	    		os.flush();
	    } catch (IOException e) {
	        e.printStackTrace();
	    }
	}
}
NiosII通常割り込み(IIC)とVICの応答時間を比較する

VIC(Vectored Interrupt Controller)を使用すると、割り込み応答性能が良くなると聞いたので、
通常割り込みからどの程度速くなるのか比較してみる。

参考書：[AN595: ベクトル割り込みコントローラの使用およびアプリケーション](https://www.intel.co.jp/content/dam/altera-www/global/ja_JP/pdfs/literature/an/an595_j.pdf)


#環境
Quartus Prime 18.0
Modelsim INTEL FPGA EDITION 10.5b

#通常割り込み(IIC)
## Platform Editor
入力ポートとしてpio_0を追加して、立下りエッジでNiosに割り込みをかけるように設定する。
出力ポートとしてbusyを追加して、処理の開始と終了がみれるようにする。
![pf_normal.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415756/01a6cf1b-e166-52b1-cef8-1eab40c58634.png)


##Eclipse
適当なプロジェクトを作って以下のコードを書く。

```test.c
#include <stdio.h>
#include "system.h"
#include "altera_avalon_pio_regs.h"
#include "sys/alt_irq.h"

//割り込み発生時のコールバック関数
void pio_0_callback(){
	IOWR_ALTERA_AVALON_PIO_SET_BITS(BUSY_BASE, 0x01); //出力ポートBusyを1にする。
	IOWR_ALTERA_AVALON_PIO_CLEAR_BITS(BUSY_BASE, 0x01);　//出力ポートBusyを0にする。
	IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PIO_0_BASE, 0x0000); //エッジキャプチャのリセット
}

//割り込みのための初期化
void init() {
	IOWR_ALTERA_AVALON_PIO_IRQ_MASK(PIO_0_BASE, 0x0001); //PIO初期化
	IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PIO_0_BASE, 0x0000); //エッジキャプチャのリセット
	alt_ic_isr_register(PIO_0_IRQ_INTERRUPT_CONTROLLER_ID, PIO_0_IRQ, pio_0_callback, (void *)0, (void *)0); //割り込みハンドラ登録
}

int main()
{
	init();
	while(1); //割り込み待ち受け
	return 0;
}
```

##Modelsimでの時間測定結果
Niosが起動するタイミングを探るためpio_0に200us周期のクロック入れてみた。800usあたりでbusyに出力があるのでこの辺でプログラムも起動してるらしい。pio_0のパルスは850us～850.1usにいれてみる。
`force -freeze sim:/display_qsys_tb/display_qsys_inst_pio_0_external_connection_bfm_conduit_export St0 0`
`force -freeze sim:/display_qsys_tb/display_qsys_inst_pio_0_external_connection_bfm_conduit_export St1 850000000`
`force -freeze sim:/display_qsys_tb/display_qsys_inst_pio_0_external_connection_bfm_conduit_export St0 850100000`
`run 1ms`
・・・じっくり待つ・・・
pio_0立下り(割り込み発生)からbusyの立ち上がり(処理開始)まで4550ns　(　´_ゝ｀)ﾌｰﾝ
![normal.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415756/eaee7598-e80f-595f-d420-8e0027a68f92.png)

#VIC(Vectored Interrupt Controller)使用
##Platform Editor
通常割り込みの構成のほかに、VICを追加するのと、Nios2→AdvancedタブのGeneral-Interrupt controllerをInternalからExternalに変更する。
![pf_vic.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415756/ca5d01c9-ae9e-fa74-9d45-83ada500e7ed.png)


##Eclipse
通常割り込みのときと同じ

##Modelsimでの時間測定結果
通常割り込みのときと同じくpio_0にパルスいれる設定をする。実行する。じっくり待つ・・・。
pio_0立下り(割り込み発生)からbusyの立ち上がり(処理開始)まで1570ns　通常に比べて3倍速い！
![vic.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415756/781d36c0-4a12-a305-59ef-4e1719766c3a.png)

#まとめ
通常にくらべてVICを使用すると、割り込み応答時間が約3倍速くなった。
参考書では「4～5倍良い割り込み性能」とうたってるけど、他にチューニングがある？
変数に入れてない整数を桁数表示する方法(JavaScript)

## できない

```js
3.toFixed(1); //Uncaught SyntaxError: Invalid or unexpected token
```

## できる

```js
3.0.toFixed(1); //3.0
(3).toFixed(1); //3.0
```

~~理由についてはわからないので聞かないで下さい~~
コメントいただきました。
前者の場合は`3.`の段階で小数点として解釈されてしまいエラーが起きるみたいです。
Ubuntu16.04でpyenv-virtualenvによる環境構築

## はじめに
研究に用いていたubuntu16.04で，ディレクトリごとにpython3.7.3の環境を切り替えられるようにした.
意外とハマるポイントが多かったので，備忘録のためにもまとめておく．
章立ては以下の通り．  

- pyenvのインストールをする
- pyenv-virtualenvのインストール
- sudo pyenvを使えるようにする
- pyenvのバージョン切り替えが反映されない時の対処法
- matplotlibで図が描画できない問題

各項目についての詳細は，参考のリンクに飛んだほうが分かりやすいかも．

## pyenvのインストール
githubからリポジトリをcloneしてくる．  

```
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
```
.bashrcに以下を追記し，pathを通す．  

```
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
```
さらに，.bashrcを再度読み込むことで設定を適用． 
 
```
source ~/.bashrc
```

## pyenv-virtualenvのインストール
pyenvだけでは，同一バージョンで複数のpython環境を管理することができない．
具体的には，python3.7.3とpython3.5.2を分けて管理することは可能だが，同じpython3.7.3の環境を別々に管理することはできないという問題がある．  
そのため，pyenv-virtualenvをインストールし，python3.7.3の環境をディレクトリごとに切り替えられるようにする．

```
git clone https://github.com/pyenv/pyenv-virtualenv.git $(pyenv root)/plugins/pyenv-virtualenv
```
さらに，.bashrcに以下を追記する．

```
eval "$(pyenv virtualenv-init -)"
```
ここで.bashrcを再度読み込んでおく．

```
source ~/.bashrc
```


## sudo pyenvを使えるようにする
sudoする時のpathが引き継がれず，`$sudo pyenv`でエラーを吐くことがある．  

`$sudo visudo`で設定ファイルを以下のように編集する．

```
# Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin  コメントアウト
Defaults    env_keep += "PATH"  # 追加
Defaults    env_keep += "PYENV_ROOT"  # 追加
```

## pyenvのバージョン切り替えが反映されない時の対処法
.bashrcに以下を追記することで解決できる．

```
export PATH="$HOME/.pyenv/shims:$PATH"
```

これでディレクトリごとの環境切り替えができるようになったはずなので，簡単にpyenv-virtualenvの使い方を書く．  

まず，必要になるツールをインストールしておく．

```
sudo apt install -y gcc make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev
```
python3.7.3をインストールする．

```
sudo pyenv install 3.7.3
```
新しい環境`sample`を作成する．

```
sudo pyenv virtualenv 3.7.3 sample
```
当該ディレクトリに環境を適用．

```
sudo pyenv local sample
```
正しく適用されているかどうかは，`$sudo pyenv versions`で確認できる．

## matplotlibで図が描画できない問題
python3.7.3で，matplotlibで図を描画しようとすると以下のようなエラーメッセージが出ることがある．

```
UserWarning: Matplotlib is currently using agg, which is a non-GUI backend, so cannot show the figure.
```
この方法が最適かどうかは微妙だが，GUIをPyQtに変更すると描画できるようになる．  
まず，PyQt5をpython環境にインストールする．

```
sudo pip install PyQt5
```
さらに，matplotlibのmatplotlibrcファイルの該当箇所を以下のように書き換える．

```
backend: Qt5Agg
```
これでmatplotlib.pyplot.show()で描画できるようになる．

## 参考
- [pyenv と pyenv-virtualenv で環境構築](https://qiita.com/Kodaira_/items/feadfef9add468e3a85b)
- [linuxに、root userでも使えるpyenv環境の構築](https://qiita.com/u_kan/items/d7e602bf1cf52f6b0935)
- [pythonのバージョンが切り替わらない](https://qiita.com/mckyhrs/items/94a2db3506287df0420e)
- [Macで使うmatplotlibのbackendエラー](https://qiita.com/typecprint/items/0d4bea1251ab3f816303)
Component is extended by {Composite, Leaf, GrandComposite}

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235834/24b37ab3-1df7-d467-287c-629af78cc871.png)

```
keys@looseTt@grandNonTerminal: {
    c,
    c_s,
    d,
    e_f,
    e,
    f,
    f_s,
    g,
    g_s,
    a,
    b_f,
    b
}
```

```
keys@tt@ooNonTermial: {
    rat,
    ox,
    tiger,
    rabbit,
    dragon,
    sneak,
    horse,
    goat,
    monkey,
    rooster,
    dog,
    pig
}
```

```
// Functor ooNonterminal to do when gets 〔Give keys@rat@tt〕
() => (GreekAlphabet.listAll();)

```
Timer優良記事まとめ[Swift]

**・[【Swift】加算型Timer（ストップウォッチみたいな）の作り方 〜Timerの基本的な使い方〜│RC-Code](https://rc-code.info/ios/post-167/)**
**・[【Swift】Timerがズレる (遅延する) 時の原因と対処法│RC-Code](https://rc-code.info/ios/post-172/)**
**・[【Swift】Timerの強参照が破棄できない時の対処法（deinit での破棄方法）│RC-Code](https://rc-code.info/ios/post-184/)**
Azureのリソースを消し忘れて課金が発生していた話

この間、[こんな記事](https://qiita.com/KjumanEnobikto/items/ae7e8dbe99479a55b7e4)を書いた私ですが、https://www.microsoftazuresponsorships.com/ にアクセスしてみたところちまちまと課金が発生していました。
幸い、私が使っているのはAzure for Studentsサブスクリプションなので財布をオープンする事態には陥らなかったのですが、意味不明な課金にサブスクの100ドルを消費されるのも癪なので、調べてみました。

### これまでにAzureでやってたこと
二回、テスト用にVMを建てた。実際にアクセスした。
その後使ってないのに課金されたくないので、VMを消した。Virtual Machinesのところからは全部消えた。

### 調べた方法
https://www.microsoftazuresponsorships.com/Usage からログをDL(JsonとCSVがある)して、何に課金されていたのかを調べた。

### 何が原因だったのか
VMに付随してできたパブリックIPアドレスやバーチャルネットワーク等がまるまるリソースとして残っていたために課金されていた。VM消しても残るんだね、知らなかったよ…。

### 対処方法
Azureポータル上でAll Resorcesのページを開き、使っていないリソース(自分の場合は全てのリソース)を選択して削除する。

### まとめ
試しにVM作るぞ！って意気込んでる初心者はへたに放置して課金されないよう気をつけてください。
DroidVimとGboardの組み合わせでちょっとだけ楽をしたい

楽しいですよね、[DroidVim](https://play.google.com/store/apps/details?id=com.droidvim&hl=ja)。……いや正直ただのオモチャにしている感じなんですがまぁ、楽しんでいます。ただ、フルキーを駆使するのが前提のVimをタッチデバイスで扱うのは流石にストレスを感じることも多いんです……特に記号とか、特に記号とか！というわけで、少しでも改善できそうな方法を探して、何とかしてやろうというやつです。というよりまたスクリプトを増やしてしまいました。

## OLLIE

最近DroidVimに少しだけ変更がありまして、IMEの処理に`iminsert`が使えるようになりました。それに伴い、ファンクションバー[^1]に`<C-^>`をアサインすることが出来るようになり、マニュアルには[Gboardの為のコンフィグの例](https://droidterm-e8a40.firebaseapp.com/droidvim/ja-JP/#h62)まである感じで……これ自体はモード遷移での恩恵なんですが。

ノーマルモード中の`<C-^>`はデフォルトで「代替ファイルの編集」がマップされており、ノーマルモード中のIME処理に影響はなく、またそもそもこのマップを知らなかったので、必要なときには`:e #`を使っています。むしろモードに気が付かずにバッファが変わってしまうのに苛立ちを……まぁ誤爆して苛立つキーなら潰すまではともかく、より使いたい機能をマップしてしまえばいいわけですよ。**例えば`<C-^>[a-z]`でgboardの右肩の記号がロングタップなしで打てる**とか。

[^1]: キーボードの近くに、ある程度カスタマイズできるオンスクリーンキーが……この説明やぼったいなぁ。Playストアからスクショ見てください。マニュアルで言うところの`◇`を活用したいという話をしています。

## スケボーキング

```plugin/gboard.vim
scriptencoding utf-8

function gboard#map(IFSize) abort
	for l in keys(g:longTap)
		execute 'map <C-^>'.l g:longTap[l][a:IFSize]
		execute 'omap a<C-^>'.l 'a'.g:longTap[l][a:IFSize]
		execute 'omap i<C-^>'.l 'i'.g:longTap[l][a:IFSize]
		execute 'vmap a<C-^>'.l 'a'.g:longTap[l][a:IFSize]
		execute 'vmap i<C-^>'.l 'i'.g:longTap[l][a:IFSize]
	endfor
endfunction

function gboard#unmap() abort
	for l in keys(g:longTap)
		try
			execute 'unmap <C-^>'.l
			execute 'ounmap a<C-^>'.l
			execute 'ounmap i<C-^>'.l
			execute 'vunmap a<C-^>'.l
			execute 'vunmap i<C-^>'.l
		catch /E31/
			continue
		endtry
	endfor
endfunction

function gboard#main(isBang,...) abort
	if a:isBang !=? '!'
		if a:0 > 0 && a:1 =~? '^\(large\|small\)$'
			if a:1 ==? 'large'
				let IFSize = 1
			else
				let IFSize = 0
			endif

			call gboard#map(IFSize)
			if v:vim_did_enter
				echo printf('[gboard]: Mapped for %s display.', tolower(a:1))
			endif
		else
			echo '[gboard]: Maps from gboard.vim'
			nmap <C-^>
		endif
	else
		call gboard#unmap()
		echo '[gboard]: Unmapped.'
	endif
endfunction
```

```plugin/gboard.vim
scriptencoding utf-8

if !exists('g:longTap')
	let g:longTap = {
		\ 'q': ['%',  '^' ],
		\ 'w': ['\',  ',' ],
		\ 'e': ['\|', '\|'],
		\ 'r': ['=',  '=' ],
		\ 't': ['[',  '[' ],
		\ 'y': [']',  ']' ],
		\ 'u': ['<',  '<' ],
		\ 'i': ['>',  '>' ],
		\ 'o': ['{',  '{' ],
		\ 'p': ['}',  '}' ],
		\ 'a': ['@',  '@' ],
		\ 's': ['#',  '#' ],
		\ 'd': ['$',  '$' ],
		\ 'f': ['_',  '_' ],
		\ 'g': ['&',  '&' ],
		\ 'h': ['-',  '-' ],
		\ 'j': ['+',  '+' ],
		\ 'k': ['(',  '(' ],
		\ 'l': [')',  ')' ],
		\ 'z': ['*',  '\' ],
		\ 'x': ['"',  '%' ],
		\ 'c': ['''', '*' ],
		\ 'v': [':',  '"' ],
		\ 'b': [';',  ''''],
		\ 'n': ['!',  ':' ],
		\ 'm': ['?',  ';' ],
		\ '.': ['/',  '/' ],
		\ '<C-^>': ['<C-^>', '<C-^>']
	\ }
endif

command -nargs=? -bang Gboard call gboard#main('<bang>', <f-args>)
```

まぁ、アルファベット全部に`map`するわけで必然的にやぼったい設定が必要になります……仕方ないね。

### METHOD

基本的にforループをブン回して`map`するだけなんですが、gboardの仕様が画面サイズによってロングタップの文字が変わるので、両方の設定に対応できるようにしています。正直「他は知らん」でも良かった気がするのですが、一応カスタム出来るようにしておきました。ちょっとした気の利かせ的に`.`のロングタップで出せる、というより何故かロングタップしないと出せない`/`を`<C-^>.`で打てる気遣いをしているんですが、`/`自体はDroidVimのファンクションバーにアサインできるので必要ないかもしれないです。一応`<C-^>`のもとの機能は`<C-^><C-^>`に振り直しています。
AWS Session Managerを用いたsshレスオペレーションを、ユーザーデータでのブートストラッピングで実現する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321850/ad9aeb84-bbd3-2052-f623-2748d8c0f258.png)

# はじめに
こんにちわ。Wano株式会社エンジニアのnariと申します。
**突然ですが、どんなec2インスタンスでもsshレスにオペレーションしたい。。**
今回は、 **オペレーションサーバーの場合と、ec2コンテナインスタンスの場合でのユーザーデータの設定**を備忘録として記録しておきます。
## 前提知識
*SSM エージェント は、デフォルトでは、2017 年 9 月以降の Amazon Linux 基本 AMI にインストールされます。SSM エージェント は、デフォルトで、Amazon Linux 2 AMI にもインストールされます。*

*Amazon ECS 対応の AMI のようにベースイメージではないその他のバージョンの Linux では、手動で SSM エージェント をインストールする必要があります。*
**([Amazon EC2 Linux インスタンスに SSM エージェント を手動でインストールする - AWS Systems Manager](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/sysman-manual-agent-install.html#agent-install-al)より抜粋)**

## オペレーションサーバーの場合
- **AMIをAmazon Linux 基本 AMIかAmazon Linux 2 AMIにすれば、ssmエージェントをインストールを記述する必要はない(前提より)**
- よって、ユーザーデータでは、dockerをinstallし、起動することでECSで使用しているimageなどを動かし検証できるようにするだけでok

### ユーザーデータの設定
```user_data.sh
#!/bin/sh
amazon-linux-extras install -y docker
systemctl start docker
systemctl enable docker
```

## ecsコンテナインスタンスの場合
- **Amazon ECS 対応の AMIはssmエージェントをインストールする記述を書く必要がある(前提より)**

### ユーザーデータの設定

```user_data.sh
#!/bin/bash

echo "ECS_CLUSTER=${cluster_name}" > /etc/ecs/ecs.config

//以下の記述で、ssmエージェントをインストールする
# Get the current region from the instance metadata
region=$(curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | jq -r .region)

# Install the SSM agent RPM
yum install -y https://amazon-ssm-$region.s3.amazonaws.com/latest/linux_amd64/amazon-ssm-agent.rpm
```
Theme My Loginでユーザー登録時のHTMLを操作する

ThemeMyLoginで個人情報入力欄を増やしたりなんだり。

ただ追加するだけなら[Cimy User Extra Fields](http://www.marcocimmino.net/cimy-wordpress-plugins/cimy-user-extra-fields/)でポチポチやればよい。
ただHTMLがイケてなかったり、inputとは全く関係ない文言をぶち込んだりしたいことがあるよね。

下記を参考にやったらいけた。

https://docs.thememylogin.com/article/122-tmlgetformfield
https://docs.thememylogin.com/article/83-making-forms-bootstrap-compatible
https://docs.thememylogin.com/article/104-function-tmladdformfield

#コード
function.phpにぶち込んでやればOK
あとは煮るなり焼くなり。
今回はsubmitの前に追加したかったので、submitを取得してる。

```php
function modify_tml_forms() {
    // To modify a single form
    if ( $register_form = tml_get_form_field( 'register','submit' ) ) {
        // Add content before the form
        $register_form->render_args['before'] = 'This is above/before the form!';

        // Add content after the form
        $register_form->render_args['after'] = 'This is below/after the form!';
    }
}
add_action( 'init', 'modify_tml_forms' );
```

# 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35278/5b56eaff-fe1c-5d03-ebbd-7b5fde150a87.png)

要素さえ出来ちゃえばJSでどうとでもなるね
特定ワードが入っていたら Git にコミットできないようにする

## やりたいこと

デバッグ中に一時的に入れたコード等を間違えてコミットしてしまわないようにファイル中に `NEVER_COMMIT` という文字が入っていたら Git コミットできないようにする。

動作を確認した Git クライアントのバージョン → `git version 2.20.1 (Apple Git-117)` 。

## 個別の Git プロジェクトディレクトリのみで設定

`.git/hooks/pre_commit` を作成。内容は以下のような感じ。

```shell
#!/bin/sh
NG_WORD="NEVER_COMMIT"

git diff --cached -U0 | grep ${NG_WORD}
if [ $? -eq 0 ]; then
  echo "[ERROR] Can't commit because ${NG_WORD} is detected"
  git grep --cached $NG_WORD
  exit 1
else
  exit 0
fi
```

実行権限が必要なので付与しておく。

```shell
$ chmod +x .git/hooks/pre-commit
```

## ローカルでグローバル設定化（テンプレート化）

ローカルでグローバルって**新鮮な古米**みたいな響きだけど

```shell
$ mkdir -p ~/.git-templates/hooks
$ git config --global init.templatedir '~/.git-templates'
$ vim ~/.git-templates/hooks/pre-commit
（スクリプト貼り付ける）
$ chmod +x ~/.git-templates/hooks/pre-commit
```

これで今後ローカル（PC内）で `git init` や `git clone` すると作成される Git のプロジェクトディレクトリに自動的にスクリプトがコピーされる。

## 一元管理

お察しの通り、前項の方法だと既に `git init` `git clone` 済みのプロジェクトに適用されない。さらにスクリプトを書き換えてグローバルに（全プロジェクトに）適用したいときにコピー済みの全ファイル全部書き換え直す必要があって**手間かかること山の如し**なので

```shell
$ git config --global init.templatedir '~/.git-templates'
```

じゃなくて

```shell
$ git config --global core.hooksPath ~/.git-templates/hooks
```

ってしておいたほうがおすすめ（**最初からそう書けばいいのにね**）。

この場合 `.git-templates/hooks` という名前は微妙なので `.git-hooks` とかそれっぽいものにすると良い。

## シェルスクリプト（というより主に Git コマンド）の説明

`git diff` は何もオプションを指定しないと `git add` されていないワーキングコピーの差分のある行とその前後を表示する。 `--cached` を指定すると `git add` されているファイル（staged files）のみを対象とする。差分表示時に差分の前後行の diff は必要ないので -U0 で差分行のみを抽出している。表示された結果にNGワードが含まれていればその行が取得される。

`$?` は直前に実行したコマンドの結果が取得できる。diff があるときは正常終了 = 0 となっているはずで、もしNGワードがコミット対象に含まれていれば 0 と比較して等しくなる。

どのファイルにNGワードが含まれているのかわかりやすいように `git grep` で該当ファイルと該当行を表示している。ここもやはり `git add` 済みのファイルだけを対象としたいので `--cached` オプションを付与している。

`exit 0` なら正常終了なのでコミットは続行され、 `exit 1` なら異常終了なのでコミットは実行されない。

ちなみに `git add` せず `git commit -a` などとしたときもシェルスクリプト内の `--cached` オプションは対象ファイルを `git add` している場合と同様に動く。

# それはともかく

`git add` するときに `-p` 付けるとか、 `git commit` する前に `git diff --cached` 見て意図していないコードが含まれていないか見ろよって話ですよ。