OmniAICreator/Qiita-1.07M huggingface dataset:
FPGAを少しずつ・・・

# 研究室らしく今回はFPGAについて勉強します。

今回はFPGAの原理と構成の本を読んでみました。
<img width="286" alt="スクリーンショット 2018-07-25 11.23.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/247551/885512d7-0a78-989b-5dc7-9882cb6df6d6.png">
(https://www.amazon.co.jp/FPGA%E3%81%AE%E5%8E%9F%E7%90%86%E3%81%A8%E6%A7%8B%E6%88%90-%E5%A4%A9%E9%87%8E%E8%8B%B1%E6%99%B4/dp/4274218643)

##１章　FPGAを理解するための基本事項。
FPGA(Field Programmable Gate Array) : 論理仕様をプログラムすることでユーザが望む論理回路を実現できる論理デバイス

<font color="Red">論理演算(ブール代数の公理)</font>や<font color="Red">ブール代数の定理</font>などを使うみたいです。
参考にさせていただきました。
(http://www.quant-ph.cst.nihon-u.ac.jp/~kuwamoto/kuwamoto/081028.pdf)

###組み合わせ回路とは
- 記憶素子を含ず、その時点での入力のみで出力(論理関数)が決まる。

###順序回路とは
- 記憶素子を含み、現在の出力だけでなく、過去の状態に影響され出力(論理関数)が決まり、中でも２種類に分けられる。
- <font color="Blue">ミーリ(Mealy)型順序回路</font>は内部状態と入力で決まり、回路規模は小さくなるが誤動作(ハザート)が起きやすい。
- <font color="Blue">ムーア(Moore)型順序回路</font>は内部状態だけで決まり、回路規模は大きくなり誤動作(ハザード)は起きにくい。後は<font color="Red">高速動作が可能。</font>

###略語
- PLD(Programmable Logic Device) : 論理仕様を記述して様々な論理回路を実現できるデバイス
- PROM(Programmable Read Only Memory) : 通常時はデータを読み出すだけで書き込む事ができないが、特定の手順で書き込みが可能なもの

とりあえず少ししかないけどここまでで！


#更新が遅くなってすみません。
7/28に立命館大学で行われたFPGAのセミナーに参加してきました。
FPGAの動かし方を１から教えていただきカメラの使い方なども学ぶことができました。
少しずつですが学べたことをここで上げていけたらと思います。
Pythonでスポーツ動作分析（野球・ピッチング編）

# はじめに
Pythonを使って、スポーツの動作を可視化していきたたいと思います。

前回はOpenPoseを使った[バッティングフォーム解析](https://qiita.com/nanako_ut/items/1a9ce5d4eca672b38d2d)をやりました。
今回は、ピッチングの動作解析です。前回と同じOpenPoseに加えて、OpenCV、Pandasを使って動作を可視化してきたいと思います。

**動作分析内容**

1. 骨格検出
1. 軌道（手首）の可視化
1. 角度変化（肩・肘・腰）の可視化

# 環境
- 撮影カメラ　自分のスマホ（HTC U11）
- 解析環境
    - windows10 home（64bit/CPU）
    - Google Colaboratory（python3/CPU）
- ライブラリ（DeNA/Chainer_Realtime_Multi-Person_Pose_Estimation）

# 骨格検出
ピッチングの動画から「DeNA/Chainer_Realtime_Multi-Person_Pose_Estimation」を使って、
骨格を自動で検出します。

## 骨格だけの動画を見てみる
今回も野球素人のピッチング動画です。ピッチングそのもののうまい下手はとりあえず・・・

![pitching_all.gif](https://qiita-image-store.s3.amazonaws.com/0/170139/5d5e3cfa-178d-a8a1-68d8-1f2e67bc5748.gif)

## 骨格の座標
検出した骨格のxy座標情報⇒[GitHub](https://github.com/nanako-ut/analyze-motion/blob/master/motion_data.csv)

# 軌道（手首）の可視化
## 画像に軌跡をプロット
右手首の軌跡を動画に重ねてみます。どのような軌道で投げているのか少し分かりやすくなりました。

![pitching_line.gif](https://qiita-image-store.s3.amazonaws.com/0/170139/aca559b7-c530-803a-8366-8afd04de7162.gif)

**実行ソース**
https://github.com/nanako-ut/analyze-motion/blob/master/1_draw_motion.ipynb

## 散布図で見てみる
右手首の軌道を散布図にしてみます。
![lmplot_0.png](https://qiita-image-store.s3.amazonaws.com/0/170139/b43778de-028a-05fd-d716-73532530fb34.png)

## 多項式回帰（３次）で見てみる
散布図と同時に、回帰式も見てみます。
軌道の大まかな傾向（？）が見えてくるような気がします。

![regplot_0.png](https://qiita-image-store.s3.amazonaws.com/0/170139/2ec60299-7257-1f78-a1ab-010a4c9cce46.png)

**実行ソース**
https://github.com/nanako-ut/analyze-motion/blob/master/2_prot_scatter_chart.ipynb

# 角度変化（肩・肘・腰）の可視化
## 折れ線グラフで見てみる
ピッチングの開始・終了までの肩、肘、腰の角度変化を見てみます。
肩（赤）と腰（青）は同じような角度変化をしているようです。
右肘（紫）は最初曲げており（角度が小さく）、だんだん伸びている（角度が大きく）なっていく様子が見て取れます。
![main_data_0.png](https://qiita-image-store.s3.amazonaws.com/0/170139/362ffe66-72a9-03c6-9c52-31cb2c196925.png)

**実行ソース**
https://github.com/nanako-ut/analyze-motion/blob/master/3_prot_line_chart.ipynb

## 相関関係を見てみる
肩・肘・腰の角度変化に相関関係があるか見てみます。
うーん、、、相関が見えるような見えないような・・・。

![pairplot_data.png](https://qiita-image-store.s3.amazonaws.com/0/170139/68ae84ab-4fe2-5e60-d830-ba40ed8667f0.png)

# ソースコード
csv、画像、Jupyter Notebook
https://github.com/nanako-ut/analyze-motion

- images.zip ・・・骨格検出後の画像
- motion_data.csv　・・・骨格のXY座標
- 1_draw_motion.ipynb　・・・　画像に軌跡をプロット
- 2_prot_scatter_chart.ipynb　・・・散布図と回帰
- 3_prot_line_chart.ipynb　・・・折れ線グラフ


# おわりに
選手１人分のデータを分析してみました。１人分のデータの中から何がしかの特徴はあまり見えてきませんでしたが、、複数選手を分析してみたら、選手個々人の特徴が見いだせそうな気もします。
軌道、角度は選手別に何がしかのグループ分けができそう。
java UTC時間からJST時間に変換

                // UTC時間
                SimpleDateFormat utcdatestr = new SimpleDateFormat("yyyyMMddHHmmssSSS");
                utcdatestr.setTimeZone(TimeZone.getTimeZone("UTC"));
                Date utcdate = utcdatestr.parse(dateOrg); 
                // JST時間
                SimpleDateFormat tokyoSdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");  
                tokyoSdf.setTimeZone(TimeZone.getTimeZone("Asia/Tokyo"));
                date = tokyoSdf.format(utcdate);
lumenのAPIをクロスサイトで実行できるようにする

## 問題
lumen(5.5)で作ったAPIをajaxなどでクロスドメインで実行しようとしても実行されない。

## 原因
ブラウザからpostやgetでAPIを実行するとまず、optionsでリクエストを投げます。そこでAPIがちゃんとアクセスできるかを確認してます。この機能のことをプリフライトリクエストと呼ぶらしいです。
そのレスポンスで200が返ってきたら、実際に実行したいpostやgetのAPIが実行されます。
ただレスポンスで200以外が返ってきた場合は、postやgetのAPIが実行されない。

laravelの機能で、optionsのリクエストを受けるとrouterに達する前に、405で返してしまいます。

## 解決策

以下のファイルを`\app\Http\Middleware`に作成する。

```php

<?php

namespace App\Http\Middleware;

use Closure;

class CorsMiddleware
{
    public function handle($request, Closure $next)
    {
        if($request->isMethod('OPTIONS')) {
            return response('', 200);
        }
    }
}
```

`\bootstrap\app.php`に以下を追加する。

```php

$app->middleware([
    App\Http\Middleware\CorsMiddleware::class
 ]);
```
([【Lumen】Lumen製APIに対してクロスドメインアクセスを行う（CORS）](https://qiita.com/sola-msr/items/708aaf1a45e3a3c4501e)の引用)

これを追加うすることでrequestがrouterに届くよりも前に、requestに対してCorsMiddlewareで処理をすることができる。なのでCorsMiddlewareでリクエストのメソッドがOPTIONSだった場合は200を返す処理を追加しています。
コメントアウトは禁止します。

# 前提条件
主語デカ釣りタイトル記事につき、最初に対象を限定しますが、差分とコメントが確認できるVCS(バージョン管理システム)を使っている開発環境を前提としています。
また、個人の検証コードなどで、他の人に見せないコードであれば好きにコメントアウトを活用すればよいと思います。

# 結論
処理のコメントアウトはせずに、その行は消して、消した理由をコミットコメントに記述せい。

# この記事を書いた経緯
- 個人的には当たり前だと思っていたのですが、普通にかましてくるエンジニアをちょこちょこ観測しているため。
- もしかしたら、コメントアウトを書いた方がいいケースもあるかもしれないため、それについての意見が欲しいため。
- コメントアウトの是非について述べている記事をあまり見かけないため。

# そもそもコメントアウトとは？
そもそもコメントアウトとは何か。
コメントアウトとは、処理をコメントによって、コンパイラないし、処理系に対し解釈させないようにして、その処理を無効化する事をさします。

```C
#include <stdio.h>
int main()
{
//   printf("Hello, World!");
   printf("Hello! Hello!");
   return 0;
}
```

# 結論の理由
- そもそも、コードの変更履歴管理はVCSの役割であって、コメントの役割ではない。
- シンタックスハイライトが効いてりゃいいが、効いてない環境で見た際にネストが深かったりするとコメントアウト行なのか処理行なのか判別しづらい。
- 処理を追ってくるときに無関係なコードが出てくるとうざくてかなわん。ましてや複数行など殺意が湧く。
- 本来の意味でのコメントと混ざる。
- エンジニアの手抜き以外のケースで使われているのを見たことがない。
[Python + tkinter] ttk.LabelFrame のスタイル変更

英語サイトにも困っている人が多かったので、拙い英語で書いておこう。
TLabelframeの"f"は小文字。
Character "f" in [ style.configure("TLabelframe",... ] must be lower case.
"TLabelFrame" does not work.

本題。ttk.LabelFrame のスタイル変更でハマってました。

```py
style = ttk.Style()
style.configure('Test.TLabelFrame.Label', font=('', 16,''))
lframe1 = ttk.LabelFrame(root,text="LabelFrame1", style='Test.TLabelFrame')
```
としていましたが、なぜか反映されず。どうやら

NG：style.configure('Test.**TLabelFrame**.Label', ...
OK：style.configure('Test.**TLabelframe**.Label', ...

のように、TLabelframeの"f"は小文字なんですね。

[割とよく参照するサイト](http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/ttk-style-layer.html) によると、fは大文字で書かれているのですが、これは誤字かも。
バージョンに依るのかな！？
Androidの開発でkotlin-stdlib, kotlin-stdlib-jre7, kotlin-stdlib-jdk7, kotlin-stdlib-jdk8どれ使えばいいの問題

だいたい以下の会話通りなんですが、記憶が薄れてきて忘れそうだったので軽くまとめておきます(だるまさん話していただいてありがとうございました :bow: )

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Kotlinのstdlib-jre7のdeprecate対応、AndroidはMinSdkが19以上だったらstdlib-jdk7を使うのがいいのかな？<br>stdlib-jdk8だとStream返す関数とか追加になっちゃうからだめで、stdlib-jdk7はMinSdk19未満だとAutoCloseableクラスがないからダメていう感じ👀</p>&mdash; takahirom (@new_runnable) <a href="https://twitter.com/new_runnable/status/1014840864139444226?ref_src=twsrc%5Etfw">2018年7月5日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

kotlin-stdlib-jre7はdeprecatedなので、それは除外で良さそうです。なにかツッコミあればください :bow: 

| Min Sdk Version | 使ったほうが良さそうなライブラリ |
|---|---|
| 24以上 | stdlib-jdk8 |
| 21以上 | stdlib-jdk7 |
| それ以下 | stdlib |

## stdlibとstdlib-jdk7とstdlib-jdk8の違い
それぞれstdlibをベースに入っている拡張関数が違います。
例えばstdlib-jdk7はJava7のAutoClosableクラスに対するuseメソッドが入っていたり、Java8のstdlib-jdk8ではStreamを返すような拡張関数が入っています。

## stdlib-jdk7がなぜ21以上？
stdlib-jdk7はほぼAutoClosableクラスに対するメソッドしか入っておらずAutoClosableクラスはSdk Versionが19なので、Sdk Versionが19であれば現状stdlib-jdk7にしちゃっても問題ありません。

---
![image.png](https://qiita-image-store.s3.amazonaws.com/0/27388/48951ba7-b2b8-1016-e3b5-d781bf7b74bf.png)

---

しかし例えばJava7のForkJoinPoolクラスなどはSdk Version21で追加されています。そのためそれを返すような拡張関数がバージョンアップで入った場合にクラッシュを引き起こしてしまうなどが考えられます。そのため、21以上としています。

---
![image.png](https://qiita-image-store.s3.amazonaws.com/0/27388/23dae230-fc9c-412a-b189-d99a9f4de0c7.png)

---
またAutoClosableクラスに対するメソッドについてはほぼ利用されることはなく、代わりにstdlibに入っているCloseableの拡張関数が利用できるのでstdlib-jdk7を使わないと困るという場面が現状ありません。
stdlib-jdk7に便利なメソッドが追加された場合にまた検討してみるのが無難そうです。


## stdlib-jdk8がなぜ24以上？
StreamがAPI Level 24なためです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/27388/59e655fe-cc58-7f5f-2925-e1dc75a13d54.png)
JetBrains製品にPower Mode IIを入れてブチアゲていくスタイル

あついよね。仕事したくないです。
でも仕事しないといけない風潮があるので、気分を無理やりブチアゲて楽しく仕事をしましょう。

私はWebStormやらPyCharmやらPhpStormやら、JetBrainsのAll-Products-Packを購入しているので、今回はJetBrains製品が対象です。
VS Coderな方は[こちら](https://qiita.com/daiki-onda/items/2b76e3c16f10de0ca274)の記事を参照ください。

## Power Mode II
今回紹介するプラグインはこちら！Power Mode IIです！
https://plugins.jetbrains.com/plugin/8251-power-mode-ii

早速インストールしていきましょう。

### インストール
1. `Cmd + ,` で環境設定を開く
2. Pluginsを選択し、 `power mode` で検索
3. No plugins found. Search in repositoriesが出る
4. `Search in repositories` をクリック
5. 無事でてくるので、選択して右Paneの `install` をクリック
6. IDEの再起動を促されるのでそのまま再起動


### こんな感じ
![pm2.gif](https://qiita-image-store.s3.amazonaws.com/0/73113/42009ed4-ed5a-6234-da02-6d18c5b43d37.gif)


### BAM!!

選択して削除や、貼付けをすると `BAM!` とワードアートみたいなのが出てきてアガっちゃいます。

![pm2bam.gif](https://qiita-image-store.s3.amazonaws.com/0/73113/27c9a251-acce-5a5f-5e80-adeeee4107c4.gif)


### 設定項目をいじってみる
- SHAKEをオフに
- アゲアゲージ（サイズ）を最大に
![pm2max.gif](https://qiita-image-store.s3.amazonaws.com/0/73113/c4209278-afbb-a99b-5ddc-10846fbb7ae1.gif)

他にもこんな設定いるのかってくらいたくさん設定項目があるのでお気に入りの設定を探してみてください！
ちなみに僕はインストールしてキャプチャとった時点でアンインストールしました。

Happy Coding!!
Highlight.jsの設定

## はじめに
Highlight.jsのファイルをダウンロードしてくる。
↓↓公式
[Highlight.js](https://highlightjs.org/)

解凍すると
[highlight.pack.js]というのと[styles]以下にいろんなスタイルが入っている。

## demoファイル作成
それでは、お決まりの[index.html]ファイル作っていきます。

今回は、styleのフォルダから[zenburn.css]を選びました。
とりあえず全部ぶっこんどけばファイルの名前を変更するだけで
スタイルを変えられます。

<>&の記号は、気をつけましょう。
htmlで特殊文字なので

```
< → &lt;
> → &gt;
& → &amp;
```
参照はこちら[HTML-特殊文字](http://pst.co.jp/powersoft/html/index.php?f=3401)

```html:index.html
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>HighLight test page</title>
    <link rel="stylesheet" href="./style.css">
    <link rel="stylesheet" href="./styles/zenburn.css">
    <script src="./highlight.pack.js"></script>
    <script>hljs.initHighlightingOnLoad();</script>
</head>
<body>
    <div class="post">
        <pre><code class="C">
#include &lt;iostream&gt;

int main(int argc, char *argv[]) {

    /* An annoying "Hello World" example */
    for (auto i = 0; i &gt; 0xFFFF; i++)
    cout &gt;&gt; "Hello, World!" &gt;&gt; endl;

    char c = '\n';
    unordered_map &lt;string, vector&lt;string&gt; &gt; m;
    m["key"] = "\\\\"; // this is an error

    return -2e3 + 12l;
}
        </code></pre>
    </div>

</body>
</html>
```

ちなみに一応ブログっぽくするために普通のCSSファイルもあります。

```css:style.css
body {
    background: #eee;
}

.post {
    margin: 20px;
    padding: 30px 0;
    background: #fff;
}
code {
    /* margin: 30px 0; */
    font-size: 16px;
    border-radius: 10px;/*角の丸み*/
}
```
Outlook for Mac で予定表を見れない(参照できない)

Outlook for Mac は Windows 版とは違い、予定表に参照権限が必要らしい。

人なら「参照権限つけてー」とお願いできるが、会議室などのリソースはそれができないので、PowerShell で頑張る必要がある模様。やったぜ！解決方法あるじゃん！(なんだこのクソめんどくさい仕様は...)

## 前提条件

* 実行者に Exchange Online の管理者権限があること
* 会議室などのリソースのメールアドレスを調べておく(今回は meetingroom@example.com とする)

## 閲覧権限の付与

```powershell

# 1. Exchange Online へ接続する

# Credential の生成
$UserCredential = Get-Credential

# Exchange Online へ接続、セッションを取得
$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://outlook.office365.com/powershell-liveid/ -Credential $UserCredential -Authentication Basic -AllowRedirection

# Exchange Online のセッションを、現在のセッションにインポートする
Import-PSSession $Session -DisableNameChecking

# 2. miyamiya@example.com に meetingroom@example.com への閲覧権限(Reviewer)を付与する
Add-MailboxFolderPermission -Identity "meetingroom@example.com:\Calendar" -User "miyamiya@example.com" -AccessRights "Reviewer"
```

成功すると次のような表示がでる

```powershell
FolderName           User                 AccessRights        SharingPermissionFlags
----------           ----                 ------------        ----------------------
Calendar             miyamiya              {Reviewer}
```

もし、「meetingroom@example.com:\Calendar が見つからない」旨のメッセージが出るなら、`Calendar` を `予定表` に変更して再度実行。

```powershell
Add-MailboxFolderPermission -Identity "meetingroom@example.com:\予定表" -User "miyamiya@example.com" -AccessRights "Reviewer"
```
@supportsがビルドされない

Edge対策でハックが必要になったのでSCSSに下記記述をしてビルドしても
出力されたCSSになぜか@supportsで囲われたブロックがきれいに消えるという現象。

## Hack for Edge

```css
@supports (-ms-ime-align: auto) {
  /* スタイルセット */
}

```

## 環境
package.json

```json
{
  "name": "localtest",
  "version": "1.0.0",
  "main": "index.js",
  "license": "MIT",
  "private": true,
  "engines": {
    "node": "8.11.3"
  },
  "browserify-shim": {
    "jquery": "$"
  },
  "browser": {
    "jquery": "./node_modules/jquery/dist/jquery.js"
  },
  "browserify": {
    "transform": [
      "browserify-shim"
    ]
  },
  "dependencies": {
    "browserify": "^16.2.2",
    "browserify-shim": "^3.8.14",
    "jquery": "~3.2.1"
  },
  "devDependencies": {
    "es6-promise": "*",
    "eslint": "*",
    "eslint-plugin-es5":"^1.3.1",
    "gulp": "*",
    "gulp-autoprefixer": "*",
    "gulp-clean-css": "*",
    "gulp-concat": "*",
    "gulp-load-plugins": "^1.5.0",
    "gulp-merge-media-queries": "*",
    "gulp-plumber": "*",
    "gulp-postcss": "^7.0.0",
    "gulp-rename": "*",
    "gulp-sass": "*",
    "gulp-sourcemaps": "^2.6.4",
    "gulp-stylelint": "^7.0.0",
    "gulp-uglify": "*",
    "postcss-reporter": "*",
    "postcss-scss": "*",
    "run-sequence": "^2.2.1",
    "stylelint": "^9.2.0",
    "stylelint-config-sass-guidelines": "*",
    "stylelint-config-standard": "*",
    "stylelint-scss": "*",
    "vinyl-buffer": "^1.0.1",
    "vinyl-source-stream": "^2.0.0"
  },
  "scripts": {
    "watch": "gulp",
    "sass": "gulp sass",
    "js": "gulp js",
    "deploy": "gulp deploy",
    "lint": "eslint src"
  }
}

```

## 原因
`gulp-merge-media-queries`でメディアクエリ記述をまとめていたのですが、これが`@supports`の部分を無視（？）してくれていたようです。

* 参考記事

[gulp media queries まとめる系プラグインで @supports が消えてる件](http://nakagaw.hateblo.jp/entry/2016/12/01/154517)

## 対策
記事にあるように`gulp-merge-media-queries`の代わりに`gulp-group-css-media-queries`を利用することで解決
Java 9+ 適用状況

Java 9+ (Java 9以降の総称) の適用状況について、JCP (Java Community Process ) EC (Executive Committee)が、6月中旬から7月中旬にかけて、アンケート調査を行いました。

#調査結果

回答数は約750で、結果は以下の通りです。(Q1とQ2は複数選択なので、足すと100%超えます)

##Q1: 開発環境でどのバージョンのJavaを使用していますか？
![Q1.png](https://qiita-image-store.s3.amazonaws.com/0/139252/fefb343e-2fac-ab89-ef29-e02f95715ba5.png)

##Q2: 運用環境でどのバージョンのJavaを使用していますか？
![Q2.png](https://qiita-image-store.s3.amazonaws.com/0/139252/26245819-e5f3-b67f-11c7-17e1edddd0b9.png)

##Q3: Java 9+ を使わない理由は？
自由回答で、４４０のコメント。

##Q4: Auto-Module-Nameを使用していますか？
![Q4.png](https://qiita-image-store.s3.amazonaws.com/0/139252/d80d16ed-9fee-9d2e-ff4b-5b9465179190.png)

##Q5: module-info.javaを使用していますか？
![Q5.png](https://qiita-image-store.s3.amazonaws.com/0/139252/3494c36a-ac6e-e699-e643-02c4c91947a7.png)


#回答分析

#Q1/Q2

Q1とQ2の違いは、開発環境と運用環境の違いですが、結果はおおよそ同じ傾向です。「現在使用中」の結果から、Java 9/10の適用は、１割前後にとどまっています。また、「使用しない」の結果から、Java 9/10への移行は３割くらいにとどまることになります。Java 11を「使用しない」も４割近くあり、当面は、Java 8の使用が主流になると考えられます。

#Q3

Q3では、Java 9+を使用しない理由(自由記述)を聞いています。理由を大別すると、次の２つになります。

```
  (A) LTS(長期サポート)でない
  (B) JPMS(Jigsaw)の否定
```
(A)は、Java 9/10を使用しない理由にはなりますが、Q1/Q2で、Java 11を「使用しない」という回答も少なからずあり、その理由は(B)の方だと考えられます。

(B)は、さらに、以下に分類されます。

```
  (B-1) 使用しているライブラリがJPMS対応していない
  (B-2) 使用しているアプリケーションサーバがJPMS対応していない
  (B-3) 非互換が大きい
  (B-4) 複雑、難しい、必要性がない
```

#Q4/Q5
 
Q4/Q5は、Java 9+を使用している人への質問ですが、Java 9+を使ってはいるが、JPMSを活用している人は少数にとどまっていると考えられます。
caliper-jsのインストール



[IMS Caliper](https://www.imsglobal.org/sites/default/files/caliper/v1p1/caliper-spec-v1p1/caliper-spec-v1p1.html)は学習支援システム（LMS）などの学習履歴，イベントのデータを保存，分析，利用するための共通仕様です。Caliperではデータを送出する側のインターフェースをSensor APIと呼びます。[caliper-js](https://github.com/IMSGlobal/caliper-js)はCaliper Sensor APIのJavaScript版の参照実装です。ここではcaliper-jsのインストールと簡単な例を紹介します。

##### インストール

インストールにはNode.jｓとnpmが必要です。先にインストールしてください。

まず，GitHubからクローンします。caliper-common-fixturesはテストに必要です。

```
git clone https://github.com/IMSGlobal/caliper-js
git clone https://github.com/IMSGlobal/caliper-common-fixtures
```
caliper-jsのディレクトリで[browserify](http://browserify.org/)と [grunt-cli](https://gruntjs.com/)およびcaliper-jsが依存するライブラリをインストールします。

```
npm install -g browserify
npm install -g grunt-cli
npm install
```

caliper-jsをビルドします。テストが走るときにcaliper-common-fixturesを使用します。

```
grunt
```

dist/caliperSensor-1.1.3.js のようにライブラリができているはずです。
【備忘録】iroha環境構築

以下ページの話。
http://iroha.readthedocs.io/en/latest/getting_started/index.html

###ディレクトリ移動
```
cd src
```

###Irohaネットワーク作成
```
docker network create iroha-network
```

###PostgreSQLコンテナ作成
```
docker run --name some-postgres \
-e POSTGRES_USER=postgres \
-e POSTGRES_PASSWORD=mysecretpassword \
-p 5432:5432 \
--network=iroha-network \
-d postgres:9.5
```

###blockstore作成
```
docker volume create blockstore
```

###Irohaネットワークのconfig設定
```
git clone -b develop https://github.com/hyperledger/iroha --depth=1
```
git cloneするが、ディレクトリは、srcでよい。src直下にirohaフォルダが作成される。


###Irohaコンテナ起動
```
docker run -it --name iroha \
-p 50051:50051 \
-v $(pwd)/iroha/example:/opt/iroha_data \
-v blockstore:/tmp/block_store \
--network=iroha-network \
--entrypoint=/bin/bash \
hyperledger/iroha:develop
```

####すでにコンテナを作成しているなら、以下。
```
docker start iroha
docker exec -it iroha /bin/bash
```

###irohaコンテナに入った状態で、Irohaデーモン（バックグラウンドで動作するプロセス）起動
```
irohad --config config.docker --genesis_block genesis.block --keypair_name node0
```
####怒られたら、以下を付け足す
```
--overwrite_ledger
```

###Irohaネットワークに入る
```
docker exec -it iroha /bin/bash
```

####別のターミナル画面を開いて
```
iroha-cli -account_name admin@test
```
アカウント：admin
ドメイン：test

###関係性
```
+--------------+  has  +---------+
|    Domain    |<------| Account |
+--------------+       +---------+
    |       | belong
    v       v
+------+ +------+
|Asset1| |Asset2|
+------+ +------+
    |       |
====================    
    |       |       +-----------------+
    |       └─------| smart contract2 |
    |               +-----------------+
+-----------------+
| smart contract1 |
+-----------------+
```
参考：https://github.com/hyperledger/iroha/issues/99
学習途中でストップさせる「ボタン」を作る(Jupyter)

#はじめに
epochを最初100回に設定して、学習をスタートしたときに、lossの状態から10回ぐらいで中身をのぞいてみて、また再開したいときなど、学習途中にストップさせる「ボタン」があると便利かもしれません。

以前に書いた
[Deconvolution 2Dの学習経過をjupyter上で描画(Bokeh)](https://qiita.com/samacoba/items/958c02f455ca5f3a475d)
にスタートとストップ「ボタン」を追加してみた動画↓になります。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">学習途中でストップさせる「ボタン」を作る(Jupyter) <a href="https://t.co/ArppKagoLi">https://t.co/ArppKagoLi</a></p>&mdash; さまこば (@samacoba) <a href="https://twitter.com/samacoba/status/1024884690740625408?ref_src=twsrc%5Etfw">2018年8月2日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

startボタンで学習をスタートさせて、途中10epochくらいで、stopボタンで停止させています。
途中ストップした状態で、Deconvolution2DのウェイトWをprintして確認してから再スタートさせています。

#説明
ソースは
https://github.com/samacoba/Mytest/blob/master/No_03_ipy_stop_learning.ipynb
においてあります。

```py
#トレーニング
def training():
    
    global epoch
    while epoch < 50:

        epoch = epoch + 1
        
        #1層のDeconvolutionを通してロスを計算しアップデート
        model.cleargrads()
        img_y = model(img_p)
        loss = F.mean_squared_error(img_y, img_core)
        loss.backward()
        optimizer.update()

        #画像・ロスデータをセット
        rend1.data_source.data['image'] = [img_p[0][0]]
        rend2.data_source.data['image'] = [img_y.data[0][0]]
        plt1.title.text='epoch = '+str(epoch)
        plt2.title.text='loss  = '+str(loss.data)
        push_notebook(handle = handle)#表示をアップデート
        time.sleep(0.5)
        
        if(stop_flag == True):#ストップフラグがTrueでトレーニング停止
            break
```
トレーニング関数の中にて、stop_flagをepoch毎にチェックして、stop_flagがTrueになるとループを抜けるようにしてあります。
  

```py
#ウィジェット
import ipywidgets as widgets
from IPython.display import display

start_button = widgets.Button(description="Start")#スタートボタンウィジェット
stop_button = widgets.Button(description="Stop")#ストップボタンウィジェット

#スタートボタンをクリック時の実行関数を定義
def on_start_button_clicked(b):
    global stop_flag
    if stop_flag == True:#2回押し防止用
        
        stop_flag = False
        
        #別スレッドでトレーニングを実行する必要がある
        import threading
        thread = threading.Thread(target = training)
        thread.start()#トレーニングスタート

#ストップボタンをクリック時の実行関数を定義
def on_stop_button_clicked(b):
    global stop_flag
    stop_flag = True

    
#ボタンをクリック時の実行関数をウィジェットに結びつける
start_button.on_click(on_start_button_clicked)
stop_button.on_click(on_stop_button_clicked)
```
jupyter widgetsを使ってスタートとストップボタンを作っています。
ストップボタンを押すとstop_flagがTrueに変わるので、実行途中のepochが終わるとループから抜け出します。
training関数は別スレッドで行わないとうまくいきませんでした。

ちなみにボタンを作らなくてもtrainingを別スレッドにしておけば、直接セルでstop_flag = Trueを実行にて停止できます。
VSCodeのPowerModeでハイテンションコーディング

今からお目覚めになる方も、おやすみになられる方もおはようございます。
お盆も近づいてきて、お仕事に気合い入らない毎日をお過ごしではないでしょうか。
僕はそうです。

そんなあなたにお届けするvscodeのプラグイン

*[PowerMode](https://marketplace.visualstudio.com/items?itemName=hoovercj.vscode-power-mode)*

ご紹介します。

# PowerMode

キーを打つだけで花火があがる！

![powermode.gif](https://qiita-image-store.s3.amazonaws.com/0/74698/b4b783a8-2876-6d65-ad39-ea5d83ffe696.gif)

これはテンションあげあげもんですね。


## 設定

VSCodeのプラグインから`Power Mode`で検索し、インストールしましょう。
`⌘,`で`setting.json`を開き以下を記述。

```json
{
    "powermode.enabled": true,
    "powermode.presets": "fireworks",
}
```

`powermode.presets` には他にも種類が色々あるので、自分の好みに合わせて変更しよう。

ちなみに`powermode.explosionSize` をいじることでパリピ感が加速します。

![power2.gif](https://qiita-image-store.s3.amazonaws.com/0/74698/3abd4399-9434-d283-bc30-1d924ae174fe.gif)


Happy coding!!



PowerMode: https://marketplace.visualstudio.com/items?itemName=hoovercj.vscode-power-mode 
JetBrains版は[こちら](https://qiita.com/shinichi-takahashi/items/dd2a1de137bf01e170d7)の記事を参照ください。
php 7.2インストール

CentOSにPHP 7.2をインストールする機会があったので、参考までに共有します。
##インストールコマンド
yum -y install --enablerepo=remi,remi-php72 php php-mbstring php-xml php-xmlrpc php-gd php-pdo php-pecl-mcrypt php-mysqlnd php-pecl-mysql php-zip
「yum -y install --enablerepo=remi,remi-php72 php インストール名は先頭のphp72を削除して実行する」

例:インストール後にphp-fpmをインストールするコマンド
yum -y install --enablerepo=remi,remi-php72 php php-fpm

例:インストール後にphp-zipをインストールするコマンド
yum -y install --enablerepo=remi,remi-php72 php php-zip

##extension_dirの場所確認コマンド
php -i |grep -i extension_dir
出力内容の例
extension_dir => /usr/lib64/php/modules => /usr/lib64/php/modules
sqlite3.extension_dir => no value => no value

##インストール済みextensionの確認コマンド
php -m
Windows Application Driver(WinAppDriver)の実行OSをUS keyboard layoutに変更する(『\』を入力できるようにする)

# WinAppDriverにsendkeyで『\』を送ると『]』と入力される

「な…何を言ってるのかわからねーと思うが、おれも何をされたのかわからなかった…」
俗に言うポルナレフ状態になったわけです。

さて、本題に戻りますとWinAppDriverにsendkeyで『\』を送ると『]』と入力されます。（2回目）
「はいばかー」で作業終了といきたいところですが、どうにかして自動化を進めなくてはいけない状況です。

[issue](https://github.com/Microsoft/WinAppDriver/issues/194)を確認すると予想通り同様の内容がありました。
他にもCloseされている内容など漁ると **Current Windows Application Driver only supports the standard US keyboard layout** とのこと。
※この記事書いているときは v1.1 です


# sendkeyで『\』を入力できるようにする

幸いテスト実行する環境は別だからUS keyboard layoutに設定すればOKでしょう！
以下の記事を参考に設定すると無事『\』を入力できるようになります！

[Windows10日本語版で英語配列キーボードを使用する](https://qiita.com/shimizu14/items/000cceb9e72a492b9176)

実業務のマシンとテスト環境のマシンが一緒の方は修正を待つしかない・・・かも:weary:
RAMユーザーにアクセスキー/シークレットキーを発行する

# はじめに
今回は
[AlibabaCloudのRAMユーザーを作ってみる](https://qiita.com/wa-ta-ru/items/ab4dacc67d787e0739fa)
のときのshinya-furuwata RAMユーザーにアクセスキーを
発行してみます。

# ドキュメントはこちら

[アクセスキー - API リファレンス| Alibaba Cloud ドキュメントセンター](https://jp.alibabacloud.com/help/doc-detail/29009.htm)

[RAM ユーザーの作成 - クイックスタート| Alibaba Cloud ドキュメントセンター](https://jp.alibabacloud.com/help/doc-detail/28637.htm)

# アクセスキー/シークレットキーを発行してみる

![6c7e1aac.png](https://qiita-image-store.s3.amazonaws.com/0/241104/c7f126c8-ba04-63d9-df7d-fc0f7fdabddc.png)

![d1b2e8d3.png](https://qiita-image-store.s3.amazonaws.com/0/241104/b31de536-3de7-8faa-ebd2-0282c5f05363.png)

![bd256c68.png](https://qiita-image-store.s3.amazonaws.com/0/241104/805e4da3-dcb1-7490-f7ae-49b9e9ded2c1.png)

発行したら保存しましょう。
このまま閉じると、使うことができなくなります。
閉じたら、削除して再発行しましょう。

![d6ccd01e.png](https://qiita-image-store.s3.amazonaws.com/0/241104/63bc043e-2ccb-7672-efb7-ced131e6ea90.png)

# 認証情報(CSV)はこんな形です。

```csv
"AccessKeyId","AccessKeySecret"
"AAAXXXXXXXXXXX","BBBXXXXXXXXXXXXXXXXXXXX"
```

# まとめ
RAMユーザーでの操作情報が取得できました。
これだけだとコンソールで、ダウンロードしただけですので
これから、CLIやSDKに触れてみます。

漏洩すると、最悪の場合
高いECSインスタンスを起動させられたりして
高い請求もあります。管理は徹底することをお勧めします。
githubやブログなど、公開されている場所へのアップロードしたりしないように注意しましょう。
Railsでメールアドレスのバリデーション

# Railsでメールアドレスのバリデーション

日本で使われているメールアドレスがRFCに準拠していないので、Railsで現実的な最低限のメールアドレスのフォーマットのバリデーションを追加するケースがよくあると思います。

```
wtf...email...address...validation...@example.com
```

上記のようなメールアドレスはRailsのデフォルトのメールアドレスのバリデーションでは弾かれますが、このようなメールアドレスを登録できるようにしましょう。

## 方針

メールアドレスの@よりも前の部分は雑にASCII印字可能文字(`0x20〜0x7E`)を許可し、ただしスペース（`0x20`）と@（`0x40`）は除きます。正規表現で表すと以下のようになります。

```
[\x21-\x3f\x41-\x7e]+
```

メールアドレスの@よりも後の部分は、ドメインですね。正規表現で表すと以下のようになります。

```
(?:[-a-z0-9]+\.)+[a-z]{2,}
```

2つの正規表現を@でつなげたのが目的の正規表現です。

```
[\x21-\x3f\x41-\x7e]+@(?:[-a-z0-9]+\.)+[a-z]{2,}
```

## Railsのカスタムバリデーションを作る

Railsのカスタムバリデーションを作りましょう。

```ruby:app/lib/validators/email_format_validator.rb
class EmailFormatValidator < ActiveModel::EachValidator
  # メールアドレスの@よりも前には、ASCII印字可能文字のうちスペース(\x20)と@(\x40)以外を許可する
  EMAIL_FORMAT_REGEX = /\A[\x21-\x3f\x41-\x7e]+@(?:[-a-z0-9]+\.)+[a-z]{2,}\z/i

  def validate_each(record, attribute, value)
    record.errors.add attribute, (options[:message] || :invalid_email) unless valid_email?(value)
  end

  private

  def valid_email?(email)
    email =~ EMAIL_FORMAT_REGEX
  end
end
```

これを、Rails起動時に読み込むようにします。

```ruby:app/config/application.rb
module Sample
  class Application < Rails::Application
    config.autoload_paths += %W[#{config.root}/lib/validators]
    config.eager_load_paths += %W[#{config.root}/lib/validators]
  end
end
```

あとはモデルでバリデーションを利用するだけです。

```ruby
class User < ApplicationRecord
  validates :email, presence: true, email_format: true
end
```
基盤地図情報XMLファイルからDXFに変換する手順

# QGISへの基盤地図情報XML読み込みプラグインインストール

## ダウンロード元

https://github.com/mugwort-rc/qgis-fgdloader

## 注記

* QGISのバージョンは、2.X系の必要があります。3.Xでは現状動作しません。

## 手順

1. 上記からダウンロードしたZIPを展開します。
2. 展開したファイルを以下の場所に配置します。

    ```
    C:\Users\(ユーザー名)\.qgis2\python\plugins
    ```
3. 配置する際は、fgd_loader.pyが以下となるように展開したファイルすべてを配置します。

    ```
    C:\Users\(ユーザー名)\.qgis2\python\plugins\qgis-fgdloader\fgd_loader.py
    ```


# QGISで基盤地図情報からDXFに変換

## 注記

* 変換したい範囲全部を読み込ませる
* ある程度レイヤを絞ったほうが良い
* 時間はかかるが読みだしたら速度は速い模様（環境次第）

## 手順

1. プラグインの画面で変換したい範囲のZIP全部を読み込ませる
2. プラグインの画面で表示対象を選択
3. レイヤ毎にDXFでエクスポート
HTML/CSSの実践を意識した書き方

#HTML/CSSの復習として

先輩より、HTML/CSSの書き方の講義を受けそのアウトプットを出します。
記憶が曖昧だった部分や忘れていたポイントをまとめました。
また、コードを書いていく際に気を付けるべきことにも触れています。

##HTML/CSSで覚えてなかった書き方
###HTMLにおいて

```html

<h1></h1>
<h2></h2>
<h3></h3>
<h4></h4>
<h5></h5>
<h6></h6>
<img src=””>
<a href=”リンク先”>
<link href=”リンク先”>
<input type=”password”>
<input type=”text”>など

//table
<tr>
<th>name</th>
<td>123</td>
</tr>
```

###CSSにおいて
line-height
text-align




#WEBサイトを作る過程で気を付けるべきこと
##流れ
１．サイト設計（デザイナーがやる場合が多い）
２．実際にコードを書く
注意点として
**いきなりコードをかかないということです。**

##コードを書く際に気を付けること
・きれいに書く
・誰が見てもわかりやすいように書く
・無駄を省く
・区切りを意識する
これらを意識して私はコードを書いていかなければいけないんだなと実感しました。
多くのメンバーが関わるということを考えると、自分だけの視点ではなく、全員で前に進みやすいようにWEBの開発をしていった方が効率が良いんだなと認識しました。
SSR（サーバーサイドレンダリング）とは

# SSR（サーバーサイドレンダリング）とは

本来JavaScriptで行う画面の書き換え処理などをサーバー側で実行させて、ユーザーの待機時間を短くすること。

PHPなどを使ってwebアプリケーションを作成した場合もSSRではあるが、
あえて「SSR」と呼ぶときは、上記のようにJavaScriptと対比させて表現することが多い。


## メリット
ユーザー側ではなく、サーバー側でJavaScriptを使ったHTML生成を行うため
ユーザー側でHTMLを生成する待ち時間がなくなる。

たまに見たことがありませんか？
ボタンや文章の位置が、ページ表示後にガチャガチャ変わるWebページ。
あのブラウザ側で行なっていた処理をサーバー側で行うため、
表示速度が圧倒的に上がります。


## 具体例

* PHP
* Java
* Python
* Nuxt.jsのSSR機能

などで作成されたwebアプリケーション
【拡張不要】 JS でスクロールするページ全体のスクリーンショットを撮る方法

ネタ記事です。下記記事にインスパイアされています。

- [【拡張不要】Chromeでスクロールするページ全体のスクリーンショットを撮る方法！](https://ischool.co.jp/2018-08-01/)

JavaScript で Web ページ全体のスクリーンショットを撮る方法を紹介します。目的のサイトを開き、Developer Tool を起動します。Console に下記コードを埋め込むとスクリーンショットが撮れます。簡単ですね！

```javascript
(() => {
  const src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/0.4.1/html2canvas.js"
  const sc = document.createElement("script")
  sc.type="text/javascript"
  sc.src=src
  sc.onload = () => {
    html2canvas(document.body, {
      onrendered: (canvas) => {
        const imgageData = canvas.toDataURL("image/png")
        const newData = imgageData.replace(/^data:image\/png/, "data:application/octet-stream")
        const element = document.createElement('a')
        element.setAttribute('href', newData)
        element.setAttribute('download', 'screen.png')
        element.style.display = 'none'
        document.body.appendChild(element)
        element.click()
        document.body.removeChild(element)
      }
    })
  }
  document.body.appendChild(sc)
})()
```

これで PNG ファイルがダウンロードされます。なお、サイトによってはセキュリティポリシーで実行できない場合があります。
Alertmanager のクラスター化

## Alertmanager のクラスター化
[ドキュメント](https://github.com/prometheus/alertmanager#high-availability)を読めば分かるとは思うのですが。
Hyper-V 上で動かしているうちの場合、NAPT しているので、下記のような設定が必要だった。

```
OPTIONS="--config.file /etc/prometheus/alertmanager.yml --cluster.advertise-address=<<外に晒しているIP>>:9094 --cluster.peer=対向先のIP:9094"
```

## 仲間募集中
[弊社](https://www.nittsu-infosys.com/)ではエンジニアを募集中です。インフラからアプリ、ユーザサポートまで幅広く業務を行ってます。
https://www.nittsu-infosys.com/recruit/2019/index.html
IReadOnlyList の使い方

C# のコードを読んでいると、ReadOnly のコレクションがあって、大体想像つくのだけど、使い方をためしてみた。

# ReadOnlyCollection

リードオンリーのコレクション。System.Collections.ObjectModel の名前空間に存在するので using をするときには注意すること。本名前空間には、ReadOnlyCollection, ReadOnlyDictionary をはじめ、ReadOnlyObservableCollection とかあるので、rx 用かな。詳しくはこちら

* [System.Collections.ObjectModel 名前空間](https://msdn.microsoft.com/ja-jp/library/system.collections.objectmodel(v=vs.110).aspx)


ちなみに、[ReadOnlyCollection](https://msdn.microsoft.com/ja-jp/library/ms132474(v=vs.110).aspx)のリファレンスを見ると、IReadOnlyCollection, IReadOnlyList などのインターフェイスを実装している。

実際のソースコードはこちら。単純に`Add(...)` などのメソッドが呼ばれたら NotSupportedExceptionをスローしてるっぽい。

* [ corefx/src/Common/src/CoreLib/System/Collections/ObjectModel/ReadOnlyCollection.cs
](https://github.com/dotnet/corefx/blob/master/src/Common/src/CoreLib/System/Collections/ObjectModel/ReadOnlyCollection.cs)

# 使い方

さて使い方ですが、例えば普通にリストを作って `AsReadOnly()` メソッドを呼ぶか、ReadOnlyCollection のコンストラクタに渡すとよいです。

```csharp
            List<int> list = Enumerable.Range(0, 1000).ToList<int>();
            IReadOnlyList<int> readOnlyList = list.AsReadOnly();
            IReadOnlyList<int> col = new ReadOnlyCollection<int>(list);
```

ちなみに、実装上は上記のは同じです。

```csharp
public ReadOnlyCollection<T> AsReadOnly()
=> new ReadOnlyCollection<T>(this);
```

* [corefx/src/Common/src/CoreLib/System/Collections/Generic/List.cs
](https://github.com/dotnet/corefx/blob/master/src/Common/src/CoreLib/System/Collections/ObjectModel/ReadOnlyCollection.cs)

# 注意点

予想通りですが、`readonly` 句などと同様に、こんなことをすると、書き換え可能です。

```csharp
    public class SomeClass
    {
        public string Value { get; set; }
    }
  :
            var somes = new SomeClass[]
            {
                new SomeClass { Value = "hello"}
            };

            IReadOnlyList<SomeClass> readOnlySome = somes.ToList().AsReadOnly();
            readOnlySome[0].Value = "world";
            Console.WriteLine(readOnlySome[0].Value);
```

## 実行結果

```
world
```

# 参考

* [ReadOnlyCollection](https://www.dotnetperls.com/readonlycollection)
* [意外と知らない！？ C#の便利なコレクション！](https://qiita.com/hiki_neet_p/items/75bf39838ce580cca92d)
Railsでサイトマップを作成する方法

### sitemap_generator
sitemap_generatorとは、XML形式のサイトマップを手軽に作成するためのGemです。

### サイトマップとは
サイトマップとはWebサイトのページをまとめたもので、Googleに自身のサイトの構造を伝えることができます。Googlebotなどの検索エンジンのクローラはこのサイトマップを読み込む事でサイト内をより効率的に巡回することができるようになります。

ちなみに、サイトマップには以下のような形式があります。

1. XML
2. RSS, mRSS, Atom 1.0
3. テキスト
4. Google サイト

どの形式でも、1つのサイトマップにはサイズが50MB（圧縮しない状態で）以下、URLが **50,000件以下** という制限があります。そのため、サイズが大きい場合や、URLが多い場合は、複数のサイトマップを作成する必要があります。

### 導入手順
以下のgemを追加します。

```ruby
gem 'sitemap_generator'
```

設定ファイルを作成するため、以下のコマンドを実行します。そうすると`config/sitemap.rb`が作成されます。

```
rake sitemap:install
```

`sitemap.rb`の中に以下のコードを記述します。

```ruby
# サイトマップ作成対象のサイト（sitemap_generatorは複数のhostにも対応可能）
SitemapGenerator::Sitemap.default_host  = "https://hogehoge"
# サイトマップの出力先を指定
SitemapGenerator::Sitemap.sitemaps_path = 'sitemaps/'

# メインの処理をここに書く
SitemapGenerator::Sitemap.create do

  sitemap_list.each do |hash|
    add root_path, :changefreq => 'daily'
  end

end
```

実際にサイトマップを作成する際は、用途に合わせて以下のいずれかのコマンドを実行してください。

- sitemapの作成を行いたい時

```
rake sitemap:create
```

- sitemapを更新してサーチエンジンに通知したい時

```
rake sitemap:refresh
```

- sitemapを更新してサーチエンジンに通知したくない時

```
rake sitemap:refresh:no_ping
```

- sitemapを削除したい時

```
rake sitemap:clean
```

`create`や`refresh`のコマンドを実行すると`public`にサイトマップが出力されます。デフォルトだと`public`直下に作成され、ディレクトリを指定した場合はそのディレクトリ内に作成されます。今回の例の場合、作成されるディレクトリは`public/sitemaps`です。また、サイトマップの拡張子は`.xml.gz`となります。
Jest で webpack の require.context() を使えるようにする

[`require.context()`](https://webpack.js.org/guides/dependency-management/#require-context "Dependency Management#require-context") は、[フォルダ内の全ファイルを一気に `require` 出来たり](https://qiita.com/jkr_2255/items/d23e66323857d3189a00 "Webpackでフォルダ内の全ファイルを一気にrequireする - Qiita")と非常に便利なため使う機会が多々ある。

しかし、 `require.context()` は webpack を使用したビルド中のみ動作する。
そのため、Jest をはじめとした他のツールで `require.context()` を使用すると以下のようなエラーが発生する。

> TypeError: require.context is not a function

これに関して、以下の通り Issue で議論されている。

* [require.context doesn't work in tests · Issue #517 · facebook/create-react-app](https://github.com/facebook/create-react-app/issues/517 "require.context doesn't work in tests · Issue #517 · facebook/create-react-app")
* [equivalent of require.context · Issue #2298 · facebook/jest](https://github.com/facebook/jest/issues/2298)

手っ取り早くこの問題を解決する方法として、[こちら](https://github.com/storybooks/storybook/tree/master/addons/storyshots/storyshots-core#configure-jest-to-work-with-webpacks-requirecontext "storybook/addons/storyshots/storyshots-core at master · storybooks/storybook#configure-jest-to-work-with-webpacks-requirecontext")にも記載されているが、 [babel-plugin-require-context-hook](https://github.com/smrq/babel-plugin-require-context-hook "smrq/babel-plugin-require-context-hook: Babel plugin to replicate Webpack require.context") プラグインを追加する方法がある。

```shell
$ npm install --save-dev babel-plugin-require-context-hook
```

Jest の `setupFiles` に以下を追記する。

```js:setupFiles
import registerRequireContextHook from 'babel-plugin-require-context-hook/register';
registerRequireContextHook();
```

`.bablerc` にプラグインを追加する。

```json:.babelrc
{
  "presets": ["..."],
  "plugins": ["..."],
  "env": {
    "test": {
      "plugins": ["require-context-hook"]
    }
  }
}
```

これで、 Jest でも `require.context()` が使えるようになった。
はてなダイアリー to Markdown > v0.7 > fix bug: C++のコメント行の誤変換を回避

[はてなダイアリー to Markdown > v0.6 > Verilog-HDLコードとVHDLコード表記対応](https://qiita.com/7of9/items/782780456d45579b6f7f)
の続き

v0.1は[こちら](https://qiita.com/7of9/items/4e5c586431871e24ad33)

### v0.6の問題


```
>|cpp|
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
```

上記のようなコードがあった時にリストとして変換される (下記)。


```
```cpp
//        -        -        -        -        -        -        -        -        -        -        -        -        -        -        -        -        -        -        -        -        -        -        -        -        -

#ifndef Unit1H
#define Unit1H
```

### code v0.7

上記の誤変換に関して対処した。

https://ideone.com/OWXJqB

```py
import sys
import re

# on Python 3.5

'''
v0.7 Aug. 02, 2018
   - conv_sublist() avoids converting C++ comment (e.g. //---)
v0.6 Jun. 22, 2018
   - conv_super_pre_notation() handles [vhdl]
   - conv_super_pre_notation() handles [verilog]
v0.5 May, 29, 2018
   - add conv_tex()
v0.4 Apr. 25, 2018
   - add conv_tableFormat()
v0.3 Apr. 25, 2018
   - conv_super_pre_notation() takes cpp notation
v0.2 Apr. 25, 2018
   - add conv_super_pre_notation()
   - add conv_sublist()
v0.1 Apr. 24, 2018
   - sub list is converted to Markdown style
'''


def conv_tex(intxt):
    if r"[Tex:" in intxt or r"[tex:" in intxt:
        wrk = re.sub('\[Tex:', r'```math\r\n', intxt)
        wrk = re.sub('\[tex:', r'```math\r\n', wrk)
        wrk = re.sub(r']', r'\r\n```', wrk)
       	return wrk
    return intxt


def conv_sublist(astr):
    if "//-" in astr:  # C++ comment
        return astr
    if "---" in astr:
        astr = astr.replace("---", SPACE4 + SPACE4 + "-")
    if "--" in astr:
        astr = astr.replace("--", SPACE4 + "-")
    return astr


def conv_super_pre_notation(astr):
    astr = astr.replace(">||", "```")
    astr = astr.replace(">|cpp|", "```cpp")
    astr = astr.replace(">|c|", "```c")
    astr = astr.replace("||<", "```")
    astr = astr.replace(">|verilog|", "```verilog")
    astr = astr.replace(">|vhdl|", "```vhdl")
    return astr


def getTableFormat(numVertical):
    wrk = "|"
    for loop in range(numVertical - 1):   # -1: except for first
       wrk += ":-:|"
    return wrk


def conv_tableFormat(astr):
    global countTbl
    if "|" in astr:
        countTbl += 1
        if countTbl == 2:
            num = astr.count('|')
            fmt = getTableFormat(num)
            return fmt + "\r\n" + astr
    else:
        countTbl = 0
    return astr
    
# read from stdin
lines = sys.stdin.readlines()

SPACE4 = "    "

countTbl = 0  # Table format counter
for elem in lines:
    wrk = conv_sublist(elem)
    wrk = conv_super_pre_notation(wrk)
    wrk = conv_tableFormat(wrk)
    wrk = conv_tex(wrk)
    print(wrk, end='')

```

### 使用方法

- 変換したいはてなダイアリーの内容をstdinに貼る
- 実行する
- 出力されるstdoutをMarkdownとして利用する

再実行する場合はstdoutの「Clear the output」で出力をクリアしてから実行する。

### 未対応の問題

VHDLのコードのコメント`-- 2to4デコーダー`の`--`は、はてなのリスト表記`--`と被る。

v0.7までは`--`はリストとして変換されてしまうので、あとで手直しが必要となる。
[180802]Gitlab の Merge Request から学ぶ

ここで取り上げたもの以外でもモデルが新しく追加されてて、これだけでかいプロダクトでもまだまだ追加したい機能があって、どんどん開発が続いてるのはすごいな！って改めて思った。

# [Search for label on project labels page by title or description](https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/20749/diffs)
`title` または `description` での検索機能追加。

GitLab では Finder ってディレクトリを切って、そこに model の検索とかソートとかをまとめてる感じ。

```diff
  def find_labels
    @available_labels ||=
-     LabelsFinder.new(current_user, project_id: @project.id, include_ancestor_groups: params[:include_ancestor_groups]).execute
+     LabelsFinder.new(current_user,
+                      project_id: @project.id,
+                      include_ancestor_groups: params[:include_ancestor_groups],
+                      search: params[:search]).execute
  end
```

# [Resource event model](https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/20606/diffs)
Label のつけ外し時の履歴を残すためのMR。

MR と issue に label を貼れるんだと思うけど、その際に label の追加・削除を一気に行うので `execute` で `added_labels` と `removed_labels` を引数として取ってる。

```ruby
module ResourceEvents
  class ChangeLabelsService
    attr_reader :resource, :user

    def initialize(resource, user)
      @resource, @user = resource, user
    end

    def execute(added_labels: [], removed_labels: [])
      label_hash = {
        resource_column(resource) => resource.id,
        user_id: user.id,
        created_at: Time.now
      }

      labels = added_labels.map do |label|
        label_hash.merge(label_id: label.id, action: ResourceLabelEvent.actions['add'])
      end
      labels += removed_labels.map do |label|
        label_hash.merge(label_id: label.id, action: ResourceLabelEvent.actions['remove'])
      end

      Gitlab::Database.bulk_insert(ResourceLabelEvent.table_name, labels)
    end

    private

    def resource_column(resource)
      case resource
      when Issue
        :issue_id
      when MergeRequest
        :merge_request_id
      else
        raise ArgumentError, "Unknown resource type #{resource.class.name}"
      end
    end
  end
end
```
PHPで配列の中身の型を保証する3つの方法

PHP5からはクラスと配列に限って引数の型を宣言できるようになり、PHP7からは`string`や`int`などのスカラ型も型宣言できるようになった。これにより、契約によるプログラミングや防衛プログラミングがより一層しやすくなった。

一方で、`array`は他の言語では配列、マップ、タプル、オブジェクトなどに細分化される型をどれも引き受けることができるため、`array`を受け取る関数を実装する側の防衛プログラミングは少々複雑な記述が必要になる。

## 防衛されていない実装

整数(`int`)の配列を受け取り、その合計値を計算する関数を想像してほしい。前述したとおり、`array`はその中身を制約することができないため、`int`以外の配列でも次のコードは動作してしまう。標準出力にWarningは出るがロジックが止まることはなく、0が計算結果になる。

```php
// ノーガードな実装
function sum(array $numbers): int
{
    $sum = 0;
    foreach ($numbers as $number) {
        $sum += $number;
    }
    return $sum;
}

assert(sum([1, 1, 1]) === 3); // 正常系
assert(sum(['a', 'b', 'c']) === 0); // Warning: A non-numeric value encountered
```

## 配列の中身を保証する方法

いくつかパターンがあるので紹介したい。

### assertion

```php
ini_set('assert.exception', '1');

// assertionでガードした実装
function sum(array $numbers): int
{
    foreach ($numbers as $number) {
        assert(is_int($number), '値は整数でなければなりません');
    }
    
    $sum = 0;
    foreach ($numbers as $number) {
        $sum += $number;
    }
    return $sum;
}

assert(sum([1, 1, 1]) === 3);
try { 
    sum(['a', 'b', 'c']);
} catch (AssertionError $e) {
    assert($e->getMessage() === '値は整数でなければなりません');
}
```

`assert`の使い勝手がPHP7で改良されるまでは`InvalidArgumentException`を投げる方法がよくあった。

### Adderメソッド

```php
class Numbers
{
    /**
     * @var int[]
     */
    private $numbers;

    /**
     * @param int[] $numbers
     */
    public function __construct(array $numbers)
    {
        foreach ($numbers as $number) {
            $this->addNumber($number);
        }
    }

    // adderがintでない型を検出する
    private function addNumber(int $number): void 
    {
        $this->numbers[] = $number;
    }

    public function sum(): int
    {
        return array_sum($this->numbers);
    }
}

assert((new Numbers([1, 1, 1]))->sum() === 3);
```

`array_walk`を使って簡略化することもできる。

```php

class Numbers
{
    ...
    public function __construct(array $numbers)
    {
        array_walk($numbers, [$this, 'addNumber']);
    }
    ...
}
```

### array_map + クロージャー

```php
class Numbers
{
    /**
     * @var int[]
     */
    private $numbers;

    /**
     * @param int[] $numbers
     */
    public function __construct(array $numbers)
    {
        $this->numbers = array_map(
            function(int $number) { // ここの型宣言で`int`じゃないものを検出できる
                return $number;
            }, 
            $numbers
        );
    }

    public function sum(): int
    {
        return array_sum($this->numbers);
    }
}
```

### 可変長引数 + 型宣言

以前に[ジェネリクスがないPHPでも配列中身のタイプヒントを可能にする「Splat Operator」](https://qiita.com/suin/items/781c35edc32aaafac01e)で取り上げた、可変長引数と型宣言を組み合わせる方法。最もシンプルに書けるが、他の方法と比べて使える状況が限られる。

```php
class Numbers
{
    /**
     * @var int[]
     */
    private $numbers;

    /**
     * @param int[] $numbers
     */
    public function __construct(int ...$numbers)
    {
        $this->numbers = $numbers;
    }

    public function sum(): int
    {
        return array_sum($this->numbers);
    }
}

assert((new Numbers(...[1, 1, 1]))->sum() === 3);
```
JSONからSwift、PHP、C＃、JAVAにモデルを生成する

# JSONからSwift、PHP、C＃、JAVAにモデルを生成する

JSONCafe：任意の言語（Swift、C＃、Java、VB、PHPなど）用の定型モデルクラスソースコードの作成を自動化するテンプレート駆動型ソースコードジェネレータ。

あらかじめ定義されたカスタマイズ可能なテンプレートを含むか、独自のテンプレートを作成して、必要な方法でコードを生成します。

定義済みのコードテンプレート
スウィフトクラス
Swift Codable
Swifty JSON
スウィフトストラクチャーグロス
スウィフトクラスグロス
Android用JAVA
Android用Java Gson
PHPクラス
C＃クラス

[ Click here to Generate Model ] (http://www.jsoncafe.com/)
Amazon Echoから家電を制御 1.25 ~node-red-contrib-alexa-localの日本語の情報が少ないのでもう少し調べてみる~

# こういうフローで試しました
私も以前使っていましたが、node-red-contrib-alexa-home-skillの情報はすでに十分ありますが、node-red-contrib-alexa-localの日本語の情報が少ないのでもう少し調べてみました。英語は読めないので検索にヒットしても読み飛ばしています。
<img width="613" alt="スクリーンショット 2018-08-02 10.38.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/231763/956aeeda-dfdb-f7a1-66a0-b2b049a69782.png">
node-red-contrib-alexa-localノードとdebugノードを繋いだだけです。

# alexaへの掛け声に応じたmsg.何某の値の変化

|msg.|on|on_off_command|payload|change_direction|bri|bri_normalized|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|つけて|true|true|"on"|0|100|1|
|けして|false|true|"off"|0|0|0|
|明るくして|true|false|"on"|1|74|0.74|
|暗くして|true|false|"on"|-1|24|0.24|
|大きくして|true|false|"on"|1|74|0.74|
|小さくして|true|false|"on"|-1|24|0.24|
|高くして|true|false|"on"|1|74|0.74|
|低くして|true|false|"on"|0|39|0.39|
|1にして|true|false|"on"|0|1|0.01|

後日、実験したら”1にして”が通りました。
もう何が何だかよくわかりません。

msg.briの値が24だったり39だったりする仕組みがよくわかりません。


# ここまで試してあることに気がつきます。
### 「alexa、仮想デバイスを1にして」
...
ん？
「alexa、仮想デバイスを1にして」
...
なんで？

### 「alexa、テレビを1にして」
はい
うん。だよね。
「alexa、テレビを小さくして」
テレビはその操作に対応していません
なんで？
「テレビ」と「仮想デバイス」の違いはなんだろう。

node-red-contrib-alexa-localノードには、名前をつけるくらいしか設定できるものはありません。
入力があったときに何かするチェックボックスはありましたが、今回は無視して良さそうです。
テレビも仮想デバイスもどちらとも同様です。


# もしかして
後に続くノードで受け付ける掛け声を分けてる？と考え、switchノードでmsg.briを分岐させてみました。
「alexa、仮想デバイスを1にして」
...
変わらない。


# と思ったら
「alexa、仮想デバイスを1%にして」
はい

|msg.|on|on_off_command|payload|change_direction|bri|bri_normalized|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|1%にして|true|false|"on"|0|1|0.01|
|50%にして|true|false|"on"|0|50|0.5|

%をつけたら認識してくれました。


# 謎が多い
今回の実験で新しくわかったことは、「わからないことがある」ということでした。
[こちらの方](http://tech.andhandworks.com/2018/04/amazon-echo-raspberry-pi-zero-w-node-red.html)もできない掛け声があったとのことですので、alexaがデバイス名をふんわり認識し、それに応じた掛け声をいい感じに解釈してくれる~~ことの弊害か~~と考えます。多分。
node-red-contrib-alexa-localノードはデバイス名を設定する以外に何もできないし、alexaからのコマンドを受け付けるだけなので、そういうことなのでしょう。
テレビが大きくしてを受け付けるのに、小さくしてが受け付けられないのは納得できませんけども。

### 同じ呼びかけ方で有効なデバイスとそうでないデバイスがある
alexaが判定している？node-red-contrib-alexa-localノードは仮想的にPhilips Hueをエミュレートしているだけならそうかも。

### できることとできないこと
過去、node-red-contrib-alexa-localはオンオフしかできない頃があったのでしょうか。そう書いてた記事を以前に読んだ記憶がありますが、少なくとも体感上20180802現在は同様のことができるようです。
node-red-contrib-alexa-localノードができないことは、現在値の取得、色、色温度の変更くらいかと思います。
それよりも問題なのはEcho Dotでしかデバイスを認識できないことかと。


# 結果
alexaの気分次第。


# Amazon Echoで遊ぼう
### 前提環境
[大凡1.5ｈで構築するraspberry pi + node-red + samba](https://qiita.com/tstkkmd/items/2c6dfde68ebbc90b0bb1)
### Amazon Echoから家電を制御シリーズ
[Amazon Echoから家電を制御 0 ~RMmini3 + python-broadlinkで学習~](https://qiita.com/tstkkmd/items/71db748dc75127a84fe8)
[Amazon Echoから家電を制御 1 ~node-red-contrib-alexa-local~](https://qiita.com/tstkkmd/items/10fb586be83de96bfe24)
[Amazon Echoから家電を制御 2 ~テレビを我が手中に収めてやった 基本操作編~](https://qiita.com/tstkkmd/items/75771caeac9f00f3b668)
[Amazon Echoから家電を制御 3 ~テレビを我が手中に収めてやった ch操作編~](https://qiita.com/tstkkmd/items/a8c7a5ab001d6e299366)
[node-red-dashboardでwebリモコンを作ってみた](https://qiita.com/tstkkmd/items/5d205c8aacf32b9e3ecf)