OmniAICreator/Qiita-1.07M huggingface dataset:
mdbook/Markdownの翻訳をサポートするツールを作った

# はじめに
Rustのドキュメントのうちいくつかは日本語に翻訳されていますが、それらは必ずしも最新の英語版と同期がとれているわけではありません。
最大の理由はもちろん翻訳のコストが高いからですが、英語版の更新をチェックしたり、更新があったときに日本語版にマージする作業も意外と大変ですし、モチベーション的にも辛いものがあります。
というわけで自動化できるところは自動化するようにツールを作ってみました。
いくつか[mdbook](https://github.com/rust-lang/mdBook)の独自拡張に対応している部分があるのでmdbook向けとしていますが、Markdownの文書全般に使えると思います。

https://github.com/dalance/mdbook-transcheck

# できること

まず前提として、翻訳されたMarkdownに原文がコメントアウトされて残っていることを仮定します。
その上で、以下の機能を提供します。

* 原文と「翻訳文中でコメントアウトされた原文」の一致確認
* 翻訳しなかった部分（ソースコードなど）の一致確認
* 原文が更新されていた場合の自動マージ

# 翻訳文の書き方
このツールは翻訳文の書き方に「原文の行はそのまま維持する」という制約を課します。

例えば

```markdown
Apple
Orange
Peach
```

は以下のように翻訳します。

```markdown
<!--
Apple
Orange
Peach
-->
りんご
オレンジ
桃
```

以下のようにしてもMarkdownのレンダリング結果としては同じになりますが、
正しく差分をチェックすることができなくなります。

```markdown
<!-- Apple
Orange
Peach -->
りんご
オレンジ
桃
```

# 使用例

Rustのドキュメントで使うことを想定しているのでcargoからインストールします。

```console
$ cargo install mdbook-transcheck
```

チェックする時は以下のコマンドです。

```console
$ mdbook-transcheck src tgt
```

`src`が原文のMarkdownがあるディレクトリ、`tgt`が翻訳文のあるディレクトリです。
差分がなければ表示はなく、戻り値0で成功します。

例えば上の例で翻訳した後に、`Lemon`が追加されたとします。

```markdown
Apple
Orange
Lemon
Peach
```

この状態でチェックをかけると

```console
$ mdbook-transcheck src tgt
Error: lines has been inserted to the source file
 source --> src/fruits.md:3
  |
3 | Lemon
  |
  = hint: The lines should be inserted at tgt/fruits.md:3
```

となって、原文側に`Lemon`が追加されたので`tgt/fruits.md`の3行目に挿入するようヒントが表示されます。

さらに`--fix`オプションを付けると

```console
$ mdbook-transcheck --fix src tgt
Insert: tgt/fruits.md:3
```

となって翻訳文側に`Lemon`が挿入されます。
この状態で`git diff`すると

```console
$ git diff
--- a/tgt/fruits.md
+++ b/tgt/fruits.md
@@ -1,13 +1,13 @@
 <!--
 Apple
 Orange
+Lemon
 Peach
 -->
 りんご
 オレンジ
 桃
```

と`Lemon`が挿入されたことが分かるので、`レモン`を追加すればいいわけです。

# CIでの実行

CIでは以下のようなことができる想定です。
（実際の運用はこれからRust-by-Exampleの翻訳プロジェクトで試す予定です）

* 各PR毎にチェック

これによって編集時のミスなどによりコメントアウトされた原文やソースコードが壊れていないことを確認できます。

* 定期的に原文の最新リビジョンとチェック

これによって原文側の更新によって翻訳文と差分が発生したかどうかが確認できます。
また、`--fix`オプションで更新分を自動で取り込んでPRを生成することもできると思います。
初めてのbootstrap導入(rails)

## はじめに
bootstrapを導入する時に手間取ってしまったので、初めて触ってみる人でもわかりやすく、導入手順を一からおさらいします:baby_tone1:超初級編です:baby_tone1:
bootstrapは簡単にgridレイアウトを実現できるので、使えるようになると便利です:information_desk_person_tone1:

## ① Gemfileの末尾にbootstrapを追加<br>

```ruby:Gemfile
gem 'bootstrap'
```

今回はバージョン指定はしません。
**この時、compass-railsというgemが追加されてあるとエラーを吐いてしまうので、なくて問題ないようなら削除します。**

## ② gemの更新<br>

```ruby:terminal
$ bundle install
```

## ③ application.cssにbootstrapを導入<br>
app>assets>stylesheet>application.css

```ruby:application.css
@import "bootstrap";
```
application.cssをapplication.scssに名前変更

## ④ application.jsにもbootstrapを適用
app>assets>javascripts>application.js

```ruby:application.js
//= require bootstrap
```

## ⑤ bootstrapを挿入
[bootstrap](https://getbootstrap.com/)から、好きなデザインを探し、適応させたいビューファイルに挿入します。
bootstrapトップページから、ヘッダーのDocumentation->左にあるCommponentsから探します。

e.g.) 今回は、headerにNavbarを使います。
app>views>layouts>application.html.erb<br>
<img width="1008" alt="bootstrap navbar.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604769/814497e5-ca85-9ae6-53c9-e542bb72e1d6.png"><br>



```ruby:application.html.erb
<header>
  ここにコピーしたコードを貼り付け
</header>
```

これで$ rails sでサーバーを起動させて該当ページを表示させると、下のようにbootstrapが適用されます。

<img width="1009" alt="bootstrap navbar適用後.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604769/4c68ffc7-3a20-7107-8e43-12dc48fe7636.png">

後はエディタのbootstrapをコピーした部分のリンクや表示させたい文字などを調節して完成です！やったね！
IntelliJ IDEAでブレークポイント設定しているのにデバッグで止まらないとき【Gradle】

## 要約
「Preferences」→「Build, Execution, Deployment」→「Build Tools」→「Gradle」
の「Build and run」の設定を「Gradle」から「IntelliJ」に変更する。

![スクリーンショット 2020-03-19 19.52.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120789/8d3c25e8-860a-5eec-dfa0-6413020eaa18.png)

---

IntelliJ IDEAを使っているが、Javaの開発とかにはそこまで慣れてない。
デバッグのためにブレークポイント設定して実行しても全然止まってくれない。
ということで調べた。

上記要約にある通り、IntelliJからの実行でないとプロセスにそのままアタッチできないとのことで、
実行が止まらない。
今回はGradleだったが、Mavenとかでも同じみたい。
（調べて見つけたのはMavenの記事だった）
JavaScriptの論理演算で値に対して「または」を使いたい時のTip

JavaScriptの学習中に、論理演算の課題に取り組んだ際に「または」の表現で悩んだので備忘録も兼ねてまとめます。
具体的には値について「または」を使いたい場合の考え方です。

以下の記事を参考にさせていただきました。
https://wp-p.info/tpl_rep.php?cat=js-application&fl=r6
https://wp-p.info/tpl_rep.php?cat=js-biginner&fl=r19

#課題内容
ジャンケンで、自分が出したい手(user_hand)をpromptに入力し、

1. グー・チョキ・パーが入力された際にはランダムに生成したJavaScript側の手(js_hand)との勝敗を出力
2. グー・チョキ・パー以外の文字列が入力されたときは、「グー・チョキ・パーのいずれかを入力してください」とアラートを出し、もう一度入力させる。
3. キャンセルボタンが押されたときは「またチャレンジしてね」を出力

別途、JavaScript側の手のランダム生成はgetJShand、勝敗の判定・出力はjudgeという関数を組んでいます。

#困ったこと
上記の条件2を記述する際に、「そういえばまたはの時には||が使えるんだったな」と思い出し以下の様に書いてみました。

```javascript

var js_hand = getJShand();

//ループ処理の判定用。終わるときはflagを1にしてwhileループから抜ける。
var flag = 0;

while(flag == 0) {
	var user_hand = prompt('ジャンケンの手をグー、チョキ、パーから選んでください。');
	if(user_hand == null) {
		alert("またチャレンジしてね");
		flag = 1;
	}else if(user_hand != "グー" || "チョキ" || "パー") {
		alert("グー・チョキ・パーのいずれかを入力してください。");
	}else{
		var judge = winLose(user_hand, js_hand);
		alert('あなたの選んだ手は' + user_hand + 'です。\nJavaScriptの選んだ手は' + js_hand + 'です。\n結果は' + judge + 'です。');
		flag = 1;
	}
}
```

・・・ご存知の方は「これはまずい書き方だ」と一瞬で気付かれるかと思いますが、これでは上手くいきませんでした。

具体的には、**グー、チョキ、パーが入力されても「グー・チョキ・パーのいずれかを入力してください」とアラートが出て、もう一度入力を求めてきます**。
つまり、上記の表記では文字を入力した場合はelse ifの箇所で**必ずtrueが返ってしまっている**ということです。

#原因
上記の記事をごらんいただければ原因は記載されていますが、こちらでもまとめておきます。
原因は**文字列(正確には特定の値)はtrueとして評価されてしまう**ことです。(上記2つ目の記事参照)
また、上記の1つ目の記事にもある通り、JavaScriptの||は他の言語と違った処理がなされます。
以下引用させていただきます。

>つまり、<font color="Red">『||』の場合は左側の式の評価が『true』扱いされるのであれば左側の式の評価結果が、左側の式の評価が『false』扱いされるのであれば全体の評価が『true』扱いになろうとも『false』扱いになろうとも常に右側の式の評価結果が返って来ます。</font>

と言うことで、上記の記法では以下の様なことが起こっています。

- 入力した文字が「グー以外」だった場合<br>
一番左の`user_hand != "グー"`が`true`になるので、true確定。
- 入力した文字が「グー」だった場合<br>
一番左の`user_hand != "グー"`は`false`扱いになるので右側の式へ<br>
→ <font color="Red">文字列"パー"は`true`として評価される</font>のでtrue確定

となり、(特定の)値を入力した場合は全て最終的にtrueとなります。

ただ単に解決するのであれば、横着せずに||の左右全てを条件式にしてあげればOKです。

```javascript
	}else if(user_hand != "グー" || user_hand !="チョキ" || user_hand !="パー") {
		alert("グー・チョキ・パーのいずれかを入力してください。");
```

#それでも横着がしたくて
さて、ようやく本題です。

今回の場合はジャンケンなので3パターンしかなくuser_hand != をそれぞれに書くのもそれほどの手間ではないのですが、より多くのことについて同様の記述をする際にはその手間も膨大になります。
なのでなんとか値について「または」を使う方法はないかと考えたところ、**配列を活用する方法**を思いつきました。
以下の通りです。

```javascript
var js_hand = getJShand();
const hands = ["グー", "チョキ", "パー"]; //これに含まれているかどうかで判断
var flag = 0;

while(flag == 0) {
	var user_hand = prompt('ジャンケンの手をグー、チョキ、パーから選んでください。');
	if(user_hand == null) {
		alert("またチャレンジしてね");
		flag = 1;
	}else if(!hands.includes(user_hand)) { //!を頭につけてuser_handがhandsに含まれて「いなければ」に変換
		alert("グー・チョキ・パーのいずれかを入力してください。");
	}else{
		var judge = winLose(user_hand, js_hand);
		alert('あなたの選んだ手は' + user_hand + 'です。\nJavaScriptの選んだ手は' + js_hand + 'です。\n結果は' + judge + 'です。');
		flag = 1;
	}
}
```

これで上手く行きました。(上記の通り、後の追加に対応するならpromptの中身の`'ジャンケンの手をグー、チョキ、パーから選んでください。'`のグー、チョキ、パーの部分も配列から取れる様にした方が良いですね。)

#あとがき
詳しく調べてはいないので分かりませんが、上記の配列を使う、という方法はjavascriptに限らず他の言語でも使えるかも知れないので、他の言語で論理演算する場合はまず試してみようと思います。
また、横着したい、と言う気持ちが工夫を生み出すと思うので、プログラミングに関してはめんどくさがりの姿勢を今後も貫いていきたいです。

p.s.
自分は前職教育系の仕事をしていたので、数学でも横着な子の方が成長早かったなぁと思い出したりしました。
数学とプログラミングってなんだかんだ必要な考え方が似てるところ多いな、と思います。
初心者から始めるJava、インターフェイス

#はじめに
この記事は備忘録である。
参考書レベルの内容だが、本記事に掲載するコードについては、
**間違えた**ものが中心となる。これは実際にコーディング中に間違えた部分を掲載し、自分で反省するために投稿するという目的によるもの。
また、後日にJavaSilver試験問題の勉強を兼ねて復習するため、深い部分の話はここでは触れない。

##環境
言語：Java11、JDK13.0.2
動作環境：Windows10

#インターフェイス
前回扱った**抽象クラス**と似た使い方をする、**インターフェイス**という機構がある。抽象クラスはクラスの一種だった、インターフェイスも似た目的で作られるがその宣言・実装方法は異なる。

```Java:declareInterface.java
interface Felidae
{
  String type = cats;
  void meetsCats();
}
```
いつもの`class`宣言がなくなり、代わりに`interface`になっている。クラス同様、フィールドとメソッドを持つことが出来る（**コンストラクタを持つことはできない**）が、
`Felidae cat=new Felidae();`のような**オブジェクトの生成はできない**。また`void meetsCats()`は抽象メソッドのため、`Felidae`インターフェイスを実装したクラスによってその**具象メソッドを用意する**必要がある（オーバーライド）。

`String type = cats;`はインターフェイスのフィールドだが、これは**定数**であり変更が効かない。インターフェイスのフィールドには、`public static final`がついていることと同じ状態であるためだ（なぜそうなっているか僕はまだ分かっていない）。

```Java:inplementedFlidae.java
class Housecat inplements Felidae
{
  void meetsCats()
  {
    System.out.println("猫を発見したよ。多分どこかのイエネコだと思う。");
  }
}
```
拡張の`extends`ではなく代わりに`implements`になっているが、形としては今までと変わりない。
##原則：スーパークラスはひとつだけ
なぜ抽象メソッド・インターフェイスが必要になるのか。すべてクラス拡張で済ませればいいと思うのだが、Javaは**複数のクラスによる多重継承を認めていない**。親であるスーパークラスは1つだけに制限されている。人間の考える系統図と同じように考えてはいけないようだ。
その理由を少し見たが、メソッド名がかぶったときの呼び出しとか菱型継承問題（diamond problem）とか、何やらここには深みがあるようだ。なお`C++`という別言語はこの多重継承を認めている。

しかし、一度用意したものを使えないのは厳しいものがある。そこで、クラスによる多重継承の代わりに、抽象クラスやインターフェイスによる部分的な多重継承のみを許すことで言語としてのシンプルさを保とうとしている。
**インターフェイスの実装は2つ以上で行うことが出来る**。また、**インターフェイス自体を拡張**し、サブインターフェイスにスーパーインターフェイスを`extends`することはできる。

#終わりに
拡張による継承が許される部分を追ってみると、Javaは演繹的な展開が得意な言語なのかなと感じる。すでに出来上がったクラス・インターフェイスを知り、その機能を継承しながら新しいクラスを組み上げることを想定しているということは、まず標準ライブラリが用意した機能を知るところからJavaの勉強は始まるのだろう。

#参考
出来るだけ自分で変数や式を書いてコンパイルしているので、完全に引用する場合はその旨記述する。



[やさしいJava 第7版](http://mana.on.coocan.jp/yasaj.html)
[Java SE11 Silver 問題集](https://book.impress.co.jp/books/1118101186)（通称黒本）
Goのwrap結局何がうれしいんや

#goのwrap結局何が嬉しいのか

先日go1.13から実装された[wrapについての記事](https://qiita.com/mochosan/items/eceacef3a8453cfdb3bf)を書いたのですが,自分で例とかも書きながら、これって本当にうれしいんか？というか何が嬉しいんやろという疑問がありました。そこで、自分の社内の先輩に嬉しいところを聞いてみたところ、なぁぁぁぁるほどぉぉぉというお答えを頂けたので、自分なりにまとめて書いてみようと思います。

#嬉しいところ

僕が前の記事でエラーをラップすると嬉しいこととして、下位の関数で発生したえらーを上位の関数にシンプルな形でエラーを返せるというような説明をしました。これは本当に嬉しいことでは無かったです。書きながら自分でも疑問だったのですが、結局unwrapするんだしwrapする必要あるのか？ということです。
本当に嬉しかった事としては、もし、下位の関数で定義したエラーを上位の関数に返してしまうと、上位の関数が下位の関数に依存してしまう事になります。ここで、エラーを上位の関数が定義したエラーでwrapする事で依存を防げるのですね。これが本当は嬉しい事だったわけです。

#実装してみる

　具体的にどうやって、実装するんや、という話です。
例えば、databaseとの接続部で出たエラーをcontroller層に返す時を考えます。まず、database側でこんなエラーを実装したとします

```go:dababase.go
type DataBaseError struct {
  err error
}

func (e dataBaseError)Error() string {
 return e.err.Error()
}
```
これをwrapせずにコントローラー層に返してしまうと、controller層が外側のdatabase層のDataBaseErrorを知ることになり、依存の方向が逆向きになってしまいます。(dao→controllerの依存のみ許します）この `DataBaseError` をWrapしてcontroller層に返すことで、 `*fmt.WrrapError` 型として返るのでcontroller層はDataBaseErrorのことを知らずにdaoからのエラーを扱えるようになります。
。。。。( ^ω^ )
ということを考えながら、自分で言ってて、これUnWrapできんやん、むしろ、AsとかIsとかをcontroller層でやろうとしたら、 `errors.Is(err, dao.DataBaseError)` とか書くことになって、結局依存解消できんやんとか自分で突っ込んでしまいました。どうしたもんか

#というわけで、自分なりにもうちょっと考えてみる
色々と調べてみて、考えてみたのですが、確かに、unwrapしない限りは下位の層で定義したエラーを渡さなくて済むのですが、一番嬉しいこととしては自分で定義しエラーを扱う時に、複雑なものなどが必要になったら、wrapしてあげると綺麗なわかりやすい形で渡せることなのかな、という結論に行き着きました。また、そう言った使い方をしている例が多かったように思います。（大半はラップの仕方だけで、嬉しいことはあまり書いてなかった、、）。
もしかしたら、うまく実装できればunwrapしても依存しない形を作れるのかなーとか思ったので、あったらコメントとかしていただけると嬉しいです。
新型コロナの感染者数を表示するBOTを作る

# 今回つくるもの
アルティメット優秀な人たちが
>都道府県別新型コロナウイルス感染者数マップ
https://gis.jag-japan.com/covid19jp/

というサイトを作っておられますが、私はそこまでつよつよではないので、感染者数の内訳を表示するBOTを作ってみようと思いました。

同じサイトに感染者数のデータがjsonファイルで置いてあったので、そちらを使わせて頂こうと思います。
>https://services6.arcgis.com/5jNaHNYe2AnnqRnS/arcgis/rest/services/COVID19_Japan/FeatureServer/0/query?where=%E9%80%9A%E3%81%97%3E0&returnIdsOnly=false&returnCountOnly=false&&f=pgeojson&outFields=*&orderByFields=%E9%80%9A%E3%81%97



# 環境
* windows10
* discord.py 1.2.3
* python 3.7.3



# 事前準備
discord.pyを用いたDiscord BOTの作成や基本は以下のサイトがわかりやすいです。
>
Pythonで簡単なDiscord Botの作り方
https://qiita.com/PinappleHunter/items/af4ccdbb04727437477f
Discord Bot 最速チュートリアル【Python&Heroku&GitHub】
https://qiita.com/1ntegrale9/items/aa4b373e8895273875a8



# 作成
まず上記のjsonファイルをダウンロードするプログラムを作ります。
**urllib**を使うと簡単にダウンロード出来ます。

```python:download.py
import urllib.request

def download():
    url = 'https://services6.arcgis.com/5jNaHNYe2AnnqRnS/arcgis/rest/services/COVID19_Japan/FeatureServer/0/query?where=%E9%80%9A%E3%81%97%3E0&returnIdsOnly=false&returnCountOnly=false&&f=pgeojson&outFields=*&orderByFields=%E9%80%9A%E3%81%97'
    title = 'COVID-19_data.json'
    urllib.request.urlretrieve(url, "{0}".format(title))
```
続いてBOT本体を作ります。

```python:main.py
import download
import json
from collections import defaultdict
import discord

TOKEN = '任意のトークン'
CHANNEK_ID = '任意のチャンネルID'
client = discord.Client()

# 起動時に表示
@client.event
async def on_ready():
    print('Logged in as')
    print(client.user.name)
    print(client.user.id)
    print('------')

# メッセージを受け取った時
@client.event
async def on_message(message):
    # botからのメッセージは無視
    if message.author.bot:
        return
    if message.content.startswith("!count"):
        #jsonファイルをロード
        download.download()
        json_open = open('COVID-19_data.json', 'r', encoding="utf-8_sig")
        json_load = json.load(json_open)
        jsn = json_load
        
        #居住都道府県名と数をdefaultdictで保持
        properties = defaultdict(int)
        for f in jsn['features']:
            property = f['properties']['居住都道府県']
            if property == '中華人民共和国' or property == '調査中' or property == '不明':
                continue
            if property not in properties:
                properties[property] = 0
            properties[property] += 1
        #一行ずつ出力すると時間がかかるので出力内容をあらかじめ保持
        say = ''
        for p in properties:
            say += p + ' ' + str(properties[p]) + '\n'
        await message.channel.send(say)

client.run(TOKEN)
```

以上が新型コロナウイルスの各都道府県の感染者数を表示するBOTのプログラムです。



#結果
ﾃﾞﾀｰ!!!!
![covid bot.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481328/f9bf5704-75c2-5c5c-0c5c-0566d98bdb3c.png)

実はもう少し出力されているのですが、キャプチャサイズの関係で入りきりませんでした。ご了承ください。



# おわりに
思いつきでざっと作ったものなので、ミスやスマートにできる場所があるかもしれません。その際はご指摘いただけると幸いです。
まだまだ新型コロナウイルスの猛威は止まりません。皆様お気をつけてお過ごしください。

Twitter
https://twitter.com/hasegawa2718
3D Solid State LiDARの環境構築（Ubuntu）

## はじめに
    
近年、LiDARは自動運転などにより普及が進み、価格が従来と比べて非常に安くなってきており、研究界隈でも注目されています。市場規模で言えば、2025年には約3,330億円規模に達すると予測されています。

今回はそんなLidarの中でも3D LiDARの1つである、「HPS-3D160-U Solid-State LiDAR」を触る機会がありましたので、その使用方法をまとめておこうと思います。


<img width="300" alt="aszzp-kth9y.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423218/773346bd-3de4-bde5-147b-26db396e2926.jpeg">


#### LiDAR とは

LiDARとは「Light Detection and Ranging」の略であり、レーザー光を走査しながら対象物に照射してその散乱や反射光を観測することで、対象物までの距離を計測したり対象物の性質を特定したりする、光センサー技術のことです。

#### ソリッドステート（Solid State）式 LiDAR とは

従来の3D LiDARは、360°全方位を検出する機械的回転方式が主流でした。そのため駆動部にモーターが必要で、小型化・軽量化が難しく、コストも高くなるので車載用としてはデメリットが多くありました。それらのデメリットを克服するために駆動部を廃し、半導体技術や光学技術で機構部を置き換えたものを「ソリッドステート（Solid State）式」と呼びます。
回転機構を持たないのでレーザー光照射角は限定されますが、小型なので設置場所の自由度が高く、複数のセンサを利用することで360°をカバーでき、車載用として主流になっています。

今回使用するLiDARは、このタイプのものを使用します。


## HPS-3D160-U Solid-State LiDARの基本情報

##### 特徴

ハイパフォーマンスプロセッサーとプロの数学のアルフォリズムにより、3Dポイントクラウドデートは、リアルタイムで生成され、高速通信インターフェースを通して送信されます。

##### 仕様

- モデル番号 : HPS-3D160-U
- タイプ：ニッケル
- 測定モード：ToF
- 解像度: 160960
- 最小深さ解像度：1mm
- FoV: 76*32度
- フレームレート：60Hz(調整可能)
- 測定範囲：0.25～15m
- 精度：±2cm
- 強力な光度：80,000ルクス
- 通信インターフェース：USB
- 動作温度：-10～+55℃
- 電源：9～12V
- 消費電力：3～5W
- 重量：195g
- サイズ：88×70×30mm

##### 接続

デバイスとの接続は、単純なUSBによるシリアル通信です。
しかし、電源は別途12Vの供給が必要です。

<img width="300" alt="a6f97-5ap0m.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423218/553ad406-17dc-0b83-9ef4-6ef94bfb689a.jpeg">


## Ubuntuでの環境構築

まず、公式のSDKを[ダウンロード](https://www.seeedstudio.com/HPS-3D160-Solid-State-LiDAR.html)します。

![スクリーンショット 2020-03-19 18.23.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423218/984134ac-85fe-72e6-9533-97c1fd74ccb7.png)

以下のコマンドで3D LiDARが接続されているか確認してください。
確認ができたら、実行権限を持たせておきましょう。

```
$ ls /dev/ttyACM*
ttyACM0

$ sudo chmod 777 /dev/ttyACM0
```

コンパイルの手順へと進んでいきますが、ここで以下のコマンドを用いてOSが何bitのものを使用しているか確認しておきましょう。それによって使用するライブラリがことなります。

```
$ ls /etc/os-release
```

先ほどダウンロードしたSDKには「libhps3d~.so」ファイルがありますが、

- libhps3d32~.so　32bit用モジュール
- libhps3d64~.so　64bit用モジュール

となっています。
対応するモジュールを/usr/local/libにコピーしましょう。
Jetsonなどのarm-OSを使用している場合は、以下の[github](https://github.com/NovaRoverTeam/lidar_ptcloud)から別途モジュールをダウンロードする必要があります。

```
$ sudo cp libhps3d~.so /usr/local/lib/
$ sudo chmod 777 /usr/local/lib/libhps3d~.so
$ sudo ldconfig
```

あとはソースコードをコンパイルして実行すればサンプルプログラムは動かせます。

```
$ gcc main.c -L./ -lhps3d~ -o app
$ sudo ./app
```


## おすすめの応用プログラム
[点群データを可視化してるれるプログラム](https://github.com/FelipMarti/HPS3D-160-PCL)
[ROSを使ったプログラム](https://github.com/NovaRoverTeam/lidar_ptcloud![a6f97-5ap0m.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423218/bb08b27e-17fa-b36b-8460-e583173acf54.jpeg)
)

## 追記
公式のSDKを見つけたので記載しておきます。
https://github.com/hypersen/HPS3D_SDK/tree/master/English
Flutterでテキスト内のURLをチェックする方法

ListViewでデータを表示する前にテキストの中にURLが含まれているかどうかのチェックをしてから、その結果に対しての表示を変更させるのに使いました。
調べた時に日本語の説明がなかったので短いですが備忘録として！

```
final urlRegExp = RegExp(
          r"((https?:www\.)|(https?:\/\/)|(www\.))[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9]{1,6}(\/[-a-zA-Z0-9()@:%_\+.~#?&\/=]*)?");
      final urlMatches = urlRegExp.allMatches(message);
      List<String> urls = urlMatches
          .map((urlMatch) =>
              message.substring(urlMatch.start, urlMatch.end))
          .toList();
      urls.forEach((value) {
        if (value != null) {
          // 処理
        } else {
          // 処理
        }
      });
```

## 参考文献
[RegExp class](https://api.flutter.dev/flutter/dart-core/RegExp-class.html)
[Flutter - Validating a string for URL](https://stackoverflow.com/questions/52975739/dart-flutter-validating-a-string-for-url)
【備忘録】JavaScriptでfilterに通る値とは ～ nullとかundefinedとか空文字とか～

###はじめに

JavaScriptで `filter` を使用しているときに「あれ？なんでこうなるんだ？」ってつまづいたところを備忘録として記載します。


###つまづいたところ

例えばこちらのコード

```javascript:例
var fruits = ['', null, undefined, 'mango', 'orange'];
var text = fruits.filter(value => {
    return value;
});
console.log(text);
```


```javascript:結果
["mango", "orange"]
```

`空文字` とか `null` とか `undefined` をfilterにかけるだけでそれらを抜かした配列ができている。。。。！！
ほぉーなんでだろーと調べました。

###説明

調べてみると、MDNサイトにちゃんと説明がのっていました。

[Array.prototype.filter()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/filter)

>filter() は、与えられた callback 関数を配列の各要素に対して一度ずつ呼び出し、callback が true と評価される値を返したすべての要素からなる新しい配列を生成します。callback は値が代入されている配列の添字に対してのみ呼び出されます。つまり、すでに削除された添字や、まだ値が代入されていない添字に対しては呼び出されません。callback によるテストに合格しなかった配列要素は単純にスキップされ、新しい配列には含まれないだけです。

つまり、値が代入されてない場合は勝手にスキップしてくれるよってことですね！なるほど～
そこで次なる疑問**「値が代入されてない」ってどういうことをいうの？？**

###値が代入されてない定義

上の説明から再度引用すると、
>callback が true と評価される値を返したすべての要素からなる新しい配列を生成します。

つまり、callback が false と評価される値を返した場合は配列を生成しない。

さらにつまり、値を条件式に入れたときに **ture** になるか **false** になるかってことで判断すればいいと理解しました。

###null・undefined・空文字を条件式に入れるとfalseになることを検証

####①null

```javascript:例
var value = null;
if(value){
 console.log('true!');
} else {
 console.log('false');
}
```

```javascript:結果
false
```

####②undefined

```javascript:例
var value = null;
if(value){
 console.log('true!');
} else {
 console.log('false');
}
```

```javascript:結果
false
```

####③空文字

```javascript:例
var value = "";
if(value){
 console.log('true!');
} else {
 console.log('false');
}
```

```javascript:結果
false
```

####おまけ：数字の 0 

```javascript:例
var value = 0;
if(value){
 console.log('true!');
} else {
 console.log('false');
}
```

```javascript:結果
false
```

※数値の 0 もfalseになっちゃうので注意しましょう

###まとめ
条件式に関して、たまに `(!str)` 的なものを見て、ふーん、？、と浅い理解にとどまっていましたが、今回のことでだいぶ理解が深まったと思います。

ご存じの方からするとそんなことも知らないのかって感じかもしれませんが、、、

こういった地道な理解が複雑なコードを理解したりするうえで大事と（勝手に）思っているので、日々勉強で頑張りたいと思います。
Tensorflow v2.x でCould not create cudnn handle: CUDNN_STATUS_INTERNAL_ERRORの対処

## 環境

### バージョン

- Tensorflow: 2.1.0
- Ubuntu: 18.04
- python: 3.6.8
- CUDA: 10.0.130
- cuDNN: 7.6.5

## 原因

TensorflowのGPUメモリ割り当ての問題。だと思う

## 対処

### 以下のコードでメモリ割り当てを制限している場合

```python
gpus = tf.config.experimental.list_physical_devices('GPU')
if gpus:
  # Restrict TensorFlow to only use the first GPU
  try:
    tf.config.experimental.set_visible_devices(gpus[0], 'GPU')
    logical_gpus = tf.config.experimental.list_logical_devices('GPU')
    print(len(gpus), "Physical GPUs,", len(logical_gpus), "Logical GPU")
  except RuntimeError as e:
    # Visible devices must be set before GPUs have been initialized
    print(e)
```

以下↓に変更することで治った。

```python
gpus = tf.config.experimental.list_physical_devices('GPU')
if gpus:
  try:
    # Currently, memory growth needs to be the same across GPUs
    for gpu in gpus:
      tf.config.experimental.set_memory_growth(gpu, True)
    logical_gpus = tf.config.experimental.list_logical_devices('GPU')
    print(len(gpus), "Physical GPUs,", len(logical_gpus), "Logical GPUs")
  except RuntimeError as e:
    # Memory growth must be set before GPUs have been initialized
    print(e)
```

[詳しく(Tensorflow公式Doc)](https://www.tensorflow.org/guide/gpu#limiting_gpu_memory_growth)

### 他

- コマンド実行: [エラー対処[Could not create cudnn handle: CUDNN_STATUS_INTERNAL_ERROR]](https://qiita.com/ysuzuki19/items/b727bbcb45f1cad37630)
- TF1系: [TensorFlowでCould not create cudnn handle: CUDNN_STATUS_INTERNAL_ERRORとエラーが出てしまった時の対処法](https://qiita.com/hiroshijsc16/items/d7226eae499e5ad7e5e9)
【Angular x Firebase】0から環境構築とプロジェクト作成、Firebase連携までの手順

# 1. 環境構築

エディターはインストール済みである前提で進めます。オススメは[VSCode](https://azure.microsoft.com/ja-jp/products/visual-studio-code/)です。

後述するコマンドは

- macなら「ターミナル」
- windowsなら「コマンドプロント」

を起動してコピペして叩いてください。

## 1-1. NVMをインストール
Angularを使う際にはNode.jsのインストールが必要です。
そのためにまず、バージョン管理を行うためのライブラリである**NVM (Node Version Manager)**をインストールします。

```zsh
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash
```

`v0.35.3`とありますが、バージョンはすぐに上がるのでこちらからコピペしてください。
https://github.com/nvm-sh/nvm#installing-and-updating
## 1-2. Node.jsをインストール
こちらは勝手に最新版をインストールしてくれます。
パッケージ管理の**NPM (Node Package Manager)**もセットで付いてきます。

```zsh
nvm install node
```

https://github.com/nvm-sh/nvm#usage
## 1-3. AngularCLIのインストール
`-g` を付けることでグローバルインストールといって、プロジェクトによらずその環境全体で使えるようになります。

```zsh
npm install -g @angular/cli
```

https://cli.angular.io/
## 1-4. FirebaseCLIのインストール

```zsh
npm install -g firebase-tools
```

https://firebase.google.com/docs/cli#install_the_firebase_cli
## 1-5. Gitのインストール
Gitを使うとソースコードのバージョン管理が出来ます。
ここからダウンロードしてフローに従ってインストールしてください。
https://git-scm.com/

# 2. プロジェクト作成

## 2-1. GitHubでリポジトリを作成
GitHubでソースコードをリモート管理します。
アカウント作成がまだの方はアカウントを作成後、リポジトリを作成します。
https://github.com/new
## 2-2. Angularプロジェクトを作成
```zsh
ng new プロジェクト名
```
## 2-3. GitHubと紐付けして初期Push
エディターでプロジェクトを開きます。

```zsh
# プロジェクトのあるパスに移動した後に
code.
```
先程作成したGitHubリポジトリとプロジェクトを紐付けします。
URLはGitHubでリポジトリを開くと表示されるものをコピペします。

```zsh
git remote add origin リポジトリのURL
```

<img width="1018" alt="SS 2020-03-19 17.27.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349873/26404e21-6786-63c1-1349-8d0d5e064d86.png">
> `HTTPS` が選択されている方は[こちら](https://help.github.com/ja/github/authenticating-to-github/connecting-to-github-with-ssh)を参考にSSH接続に変更してください。

**Angularの環境構築とプロジェクト作成はこれで完了です。**

# 3. Firebase連携

## 3-1. Firebaseプロジェクトを作成
こちらから作成できます。
https://console.firebase.google.com

作成が終わったら、使いたい機能を有効化していきます。
その際、[ロケーション](https://firebase.google.com/docs/functions/locations?hl=ja)を選択することになります。(選択後は変更不可なので注意)
東京の場合は `asia-northeast1`です。

## 3-2. Firebaseの初期化
プロジェクト側で叩きます。

```zsh
firebase login
firebase init
```
## 3-3. AngularFireのインストール
```zsh
ng add @angular/fire@next
```
このページのQuickstartの指示に従って、以下2点を行います。
https://github.com/angular/angularfire/blob/master/docs/install-and-setup.md

- `/src/environments/environment.ts` にFirebaseの認証情報を追加
- `app.module.ts` でAngularFireModuleとプロジェクトで使用するModuleをインポート

**以上ですべて完了です。**
php配列の中身を手っ取り早く確認する



#配列の中身を確認する

「配列の中身をパパっと確認したいんだけど！？」
ってなったので調べてみた。

`print_r()`と`var_dump()`って関数を使うといいっぽい。

##`print_r()`と`var_dump()`の違い
###print_r()で出力
- 配列であるという情報
- 各要素の値

###var_dump()で出力
- 配列全体の要素数
- 各要素のデータ型
- 各要素の値のバイト数
- 各要素の値


`var_dump()`はデータ型も加味した情報を確認したいときに便利みたい。

##print_r()で出力
####通常配列

``` php
$data = ['yamada', 'takahashi'];

print_r ($data);

//実行結果
Array (
 [0] => yamada
 [1] => takahashi
)
```

####連想配列

```php
$data = ['yamada' => 123, 'takahashi' => 456];

print_r ($data);

//実行結果
Array (
 [yamada] => 123
 [takahashi] => 456
)
```

####多次元配列

```php
$data = [
  [
    'name' => '山田',
    'age' => 123,
    'sex' => '男',
  ],
  [
    'name' => '高橋',
    'age' => 345,
    'sex' => '女'
  ],
];

print_r ($data);

//実行結果

Array (
 [0] => Array (
   [name] => 山田
   [age] => 123
   [sex] => 男
 )
 [1] => Array (
   [name] => 高橋
   [age] => 345
   [sex] => 女 )
)
```

##var_dump()で出力
####通常配列

```php
$data = ['yamada', 'takahashi'];

var_dump($data);

//実行結果
array(2) {
 [0]=> string(6) "yamada"
 [1]=> string(9) "takahashi"
 }
```
####連想配列
```php
$data = ['yamada' => 123, 'takahashi' => 456];

var_dump($data);

//実行結果
array(2) {
 ["yamada"]=> int(123)
 ["takahashi"]=> int(456)
 }
```
####多次元配列
```php
$data = [
  [
    'name' => '山田',
    'age' => 123,
    'sex' => '男',
  ],
  [
    'name' => '高橋',
    'age' => 345,
    'sex' => '女'
  ],
];

var_dump($data);

//実行結果
array(2) {
 [0]=> array(3) {
 ["name"]=> string(6) "山田"
 ["age"]=> int(123)
 ["sex"]=> string(3) "男"
 }
 [1]=> array(3) {
 ["name"]=> string(6) "高橋"
 ["age"]=> int(345)
 ["sex"]=> string(3) "女"
 }
}
```

##おわり
ブラウザだと改行が省略されて表示されるので、ソースを表示機能を使って確認すると見やすい。
本日の学習内容Part1

## 参考記事
mpywさんの[PHPでデータベースに接続するときのまとめ]
(https://qiita.com/mpyw/items/b00b72c5c95aac573b71)

## DBに接続する
```
 $db = new PDO('mysql:dbname=mydb; host=127.0.0.1; charset=utf8;', 'root' , '');
```
mydb-> データベース名
127.0.0.1->ローカルサーバIPアドレス
charset=utf8->文字セット
root->ユーザー名(管理者権限の場合はroot)
'(空)'->パスワードを状況によって設定

##DB接続した時の例外処理
```
 try{
   $db = new PDO('mysql:dbname=mydb; host=127.0.0.1; charset=utf8;', 'root' , '');
} catch(PDOException $e) {
 echo 'DB接続エラー:' . $e->getMessage();
}
```

##感想
try~catch句はなかなか使う機会が多そうなので、使いこなせるようにポートフォリオ作りにも積極的に使っていこうと思います。
PictMasterで「TripleDESによる暗号化に失敗しました」とエラー表示される時の対処

備忘録がてら、掲題についてポストします。

## 症状
PictMasterで組合せを生成しようとすると、「TripleDESによる暗号化に失敗しました」とエラーメッセージが表示され、組合せを生成できない。

## 想定環境

- Windows 10
- PictMaster 7.0.2J

## 対処

.NET Framework 3.5をインストールする

## 手順

[Microsoftのこちらのサイトを参照](https://docs.microsoft.com/ja-jp/dotnet/framework/install/dotnet-35-windows-10)のこと。

## 原因

PictMasterは、VBAから.NET Framworkを利用している箇所がある。VBAから.NET Frameworkを利用するには3.5以下のバージョンである必要があり、Windows 10のクリーンインストール環境だと、該当バージョンはデフォルトでは入っていない。そのため、CreateObjectした際にエラーが発生する。

以上。
RailsのformにAjaxを実装する前提


RailsにjQueryを使ったAjaxを適用するために色々調べました。
個人的な備忘録として残します。


#configを設定

``` config/application.rb
require File.expand_path('../boot', __FILE__)

module SampleApp
  class Application < Rails::Application
    config.action_view.embed_authenticity_token_in_remote_forms = true    # 追加
  end
end
```

#コントローラーの変更

```
class HogesController < ApplicationController
  def hoge
    respond_to do |format|
      format.html redirect_to hoge_path 
      format.js    # ※下
    end
  end
end
```

※ renderで指定しなければ`アクション名.js.erb`を探す



#テンプレートの変更

### `form_with`を使っている場合（推奨）
`remote`はデフォルトでtrueのでやることなし
（falseにしたい場合は`local: true`を追加）

``` app/view/hoges/hoge.html.erb
<div id="ajax-test">
  <%= form_with ... do |f| %>
    <%= f.submit "hogehoge" %>
  <% end %>
</div>
```

### `form_for, ` `form_tag`を使っている場合、
オプションに`remote: true`を付ける。

``` app/view/hoges/hoge.html.erb
<div id="ajax-test">
  <%= form_for ..., remote: true do |f| %>
    <%= f.submit "hogehoge" %>
  <% end %>
</div>
```

コントローラーで`render`しなかった場合、以下の点に注意して`ファイル.js.erb`を追加
・適用したいテンプレートと同じ場所に配置
・ファイル名はコントローラーのアクション名と同じ名前に設定

``` app/view/hoges/hoge.js.erb
$("#ajax-test").html("<%= 'さあ、遠慮なく私をhogeりなさい！' %>");
```

記述はjQueryで。

`.html("...");`の部分を

`.html("<%= escape_javascript(render('hoges/hoge')) %>");`
`.html("<%= j ( render('hoges/hoge') ) %>");`でも可
などとすると色々できる。
プロパティにItemを入れて表示させたい

QtQuick.Controls 2.xによく使われている、propertyにItemを入れる方法。
あれを自分でも実装したかったので、調べてみました。

#プロパティを用意する。
aliasでLoaderにぶち込めばうまく動きました。

```qml:MyButton.qml
Rectangle {
    property alias icon : loader.sourceComponent
    color: "gray"
    width: 100; height: 60; radius: 5

    Loader {
        id: loader
        anchors.centerIn: parent
    }
}
```

上記のようにLoaderのsourceComponentにaliasを設定しておきます。

#プロパティにItemを入れる。

```qml
    MyButton {
        x: 10
        icon: Text {//ボタンの中心に「アイコン」の文字を表示
            text: "アイコン"
        }
    }

    MyButton {
        x: 120
        icon: Rectangle {//ボタンの中心に赤丸を表示
            width: 20; height: width; radius: width/2
            color: "red"
        }
    }

    MyButton {
        x: 240
        icon: Image {//ボタンの中心にicon.pngを表示
            source: "qrc:/icon.png"
        }
    }
```

iconにはTextだったりRectangleだったりImageだったり自作QMLだったり、なんでも配置できるようになります。

#上記以外の方法。
関数でcreateObject()を使う方法とかあるみたいですけど、試してません…。
Nuxt.js (universal) で vuejs-datepicker を使う

```js
import DatePicker from 'vuejs-datepicker';
```
では `mode: universal` で動かないので、ひと手間加える

- nuxt 2.11.0
- vuejs-datepicker 1.6.2


## そのままでは動かない理由

import すると `vuejs-datepicker/dist/vuejs-datepicker.js` を参照するが、
`<head>` に css を注入するコードがある

```js:node_modules/vuejs-datepicker/dist/vuejs-datepicker.js
  var HEAD = document.head || document.getElementsByTagName('head')[0];
```

SSR 時に document は存在しないので、エラーになる


## 動くようにする

### stylus インストール

vuejs-datepicker はスタイリングに stylus を使用しているので扱えるようにする
下記のコマンドだけで大丈夫だった

```bash
yarn add --dev stylus stylus-loader
```


### import を変更

`vuejs-datepicker/src` 内の `.vue` を直接 import する

```vue:ExampleComponent.vue
<template>
  <date-picker />
</template>

<script>
import DatePicker from 'vuejs-datepicker/src/components/Datepicker.vue';

export default {
  components: {
    DatePicker,
  },
};
</script>
```


## おまけ: locale も src から読み込む

```vue:ExampleComponent.vue
<template>
  <date-picker :language="ja" />
</template>

<script>
import DatePicker from 'vuejs-datepicker/src/components/Datepicker.vue';
import ja from 'vuejs-datepicker/src/locale/translations/ja';
// 下記は、ja以外の言語もすべてバンドルされてしまうので推奨されない
// import { ja } from 'vuejs-datepicker/src/locale';

export default {
  components: {
    DatePicker,
  },
  data() {
    return {
      ja,
    };
  },
};
</script>
```


## おまけ: IE11 対応

基本的にライブラリ内のコンポーネントはコンパイルされず、IE11 に対応したコードが出力されない
nuxt.config.js の transpile に追加する

```js:nuxt.config.js
export default {
  build: {
    transpile: ['vuejs-datepicker'],
  },
};
```
Power BI Onpremise Data Gatewayを監視する【メモ】

#概要
下記のドキュメントにしたがって、Onpremise Data Gatewayのパフォーマンスレポートを確認します。

https://docs.microsoft.com/ja-jp/data-integration/gateway/service-gateway-performance

#注意点

##[パフォーマンスログを有効にする](https://docs.microsoft.com/ja-jp/data-integration/gateway/service-gateway-performance#enable-performance-logging)

ドキュメント上はわかりにくいが対象はこのファイルとなります。
"C:\Program Files\On-premises data 
gateway\Microsoft.PowerBI.DataMovement.Pipeline.GatewayCore.dll.config"


##パラメータを指定する
パラメータがログファイルの場所を指しますが、デフォルトだと設定されていないので、パラメータの編集→プルダウンで選択してあげましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/31cd0bd1-77b6-c807-ddf7-70e4d4b942bb.png)


#結果
抜粋ですがけっこう細かくだしてくれます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/0aad113c-ed79-5819-0b6e-fb7925f0bb78.png)

マシンの状態
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/1e90a6b0-4e11-5200-b690-7ff99f124e7b.png)

#補足

Power BI Service上で閲覧するときはデータソースを構成し、ソースの種類はフォルダを指定しましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/7abda783-9dcf-c2a2-253d-a4ac727a1b5c.png)
Arduino Fuse 一覧


## Arduino Uno

	Low Fuse = 0xFF
	High Fuse = 0xDE
	Extended Fuse = 0x05

## Arduino Duemilanove or Nano w/ ATmega328

	Low Fuse = 0xFF
	High Fuse = 0xDA
	Extended Fuse = 0x05
	
## Arduino Diecimila, Duemilanove, or Nano w/ ATmega168

	Low Fuse = 0xFF
	High Fuse = 0xDD
	Extended Fuse = 0x00

## Arduino Mega 2560

	Low Fuse = 0xFF
	High Fuse = 0xD8
	Extended Fuse = 0xFD

## Arduino Mega (ATmega1280)

	Low Fuse = 0xFF
	High Fuse = 0xDA
	Extended Fuse = 0xF5

## Arduino Mini

	Low Fuse = 0xFF
	High Fuse = 0xDD
	Extended Fuse = 0x00

## Arduino Fio

	Low Fuse = 0xFF
	High Fuse = 0xDA
	Extended Fuse = 0x05

## Arduino BT w/ ATmega328

	Low Fuse = 0xFF
	High Fuse = 0xD8
	Extended Fuse = 0x05

## Arduino BT w/ ATmega168

	Low Fuse = 0xFF
	High Fuse = 0xDD
	Extended Fuse = 0x00

## LilyPad Arduino w/ ATmega328

	Low Fuse = 0xFF
	High Fuse = 0xDA
	Extended Fuse = 0x05

## LilyPad Arduino w/ ATmega168

	Low Fuse = 0xE2
	High Fuse = 0xDD
	Extended Fuse = 0x00

## Arduino Pro or Pro Mini (5V, 16 MHz) w/ ATmega328

	Low Fuse = 0xFF
	High Fuse = 0xDA
	Extended Fuse = 0x05

## Arduino Pro or Pro Mini (5V, 16 MHz) w/ ATmega168

	Low Fuse = 0xFF
	High Fuse = 0xDD
	Extended Fuse = 0x00

## Arduino Pro or Pro Mini (3.3V, 8 MHz) w/ ATmega328

	Low Fuse = 0xFF
	High Fuse = 0xDA
	Extended Fuse = 0x05

## Arduino Pro or Pro Mini (3.3V, 8 MHz) w/ ATmega168

	Low Fuse = 0xC6
	High Fuse = 0xDD
	Extended Fuse = 0x00

## Arduino NG or older w/ ATmega168

	Low Fuse = 0xFF
	High Fuse = 0xDD
	Extended Fuse = 0x00
業務で使えるofficeのAI機能について


近年、AIというワードをよく耳にしますが、実際に身近でAIが使われているものって何がある？
って考えたとき、あんまり浮かんでこないのではないでしょうか？
（ちなみに自分はsiriくらいしか浮かびません）

世間で見れば、ロボットとか画像認識とかよく耳にしますが我々とは程遠く、言ってしまえば関係ないような感じがします。

実は、調べてみたところ、こんなのあるんだーとか、めっちゃ使えるやん、みたいなAIツールや機能はたくさんありました。知られていないだけで結構あるんですね。
そこで、今回は、SE向けに普段の業務で使えそうなものをピックアップして紹介していきたいと思います。

##Microsoft Office製品のAI機能
普段の業務では欠かせないExcelやWordといったMicrosoft製品にも実は多数のAI機能が搭載されています。特に「Office 365」は、機械学習をはじめとする人工知能（AI）技術を用いた、多数の機能を搭載し始めています。


####「Idea」機能の紹介
- [Excelのアイデア機能でグラフやピボットグラフを一発作成](https://www.ka-net.org/blog/?p=10908)
- [マイクロソフトがWord Onlineの文書作成支援にAIを導入](https://jp.techcrunch.com/2019/05/07/2019-05-06-words-new-ai-features-will-help-you-write-better/)
- [WordやExcelにもAIが搭載される Everyday AIでの発表](https://www.capa.co.jp/archives/21635)

上記の他にもいろいろとAI機能が搭載されています。
関連記事：[マイクロソフトがチラ見せ、Officeを｢天才｣にするAI機能](https://www.businessinsider.jp/post-192984)


また、ツールとしても便利なものがいろいろとあるそうです。
[Quick AI](https://www.quick-ai.com/introduction) のような、Excel上で使えるAI予測・判定ツールなどなど、意外と便利なものもあったりするのでぜひ調べてみてください。


## AIスライド作成ツール「Beautiful.AI」
AIが半自動でプレゼン資料を作成してくれるツール。
「AI」の力で誰でも・迷うことなく、デザイン性の高いスライドを作成することができます。
慣れてしまえば数十分で作成ができるそうです。
[Beautiful.AI](https://www.beautiful.ai/)

※Beautiful.AI 使用方法
　[AIが半自動でプレゼン資料を作成してくれる「Beautiful.AI」の使い方](https://mets-office.com/web-tool/beautiful-ai/)
　[もうプレゼン作成で迷わない！AIが資料レイアウト](https://seleck.cc/1177)

##まとめ
officeに限らず、調べてみるといろんなAIツールがあることがわかりました。
使ってみたらいままで何時間もかかっていた作業が簡略化されたりすることもあるかもしれませんね。

個人的に、Beautiful.AIは無料版でもかなり実用的そうです。（日本語版がでてほしいな☺）


-
constとconstexprについて

# はじめに
`const`と`constexpr`について、わかりづらかったので、記します。
アセンブリについて、実際に暑かったことはないので、誤解があるかもしれません。何かございましたらご指摘いただけたらと思います。

# const
変数を定数とする修飾子。
`const T name`(Tには`int`や`char`等, nameには変数名)のように宣言する。

```cpp:const_example
int a = 10;
a = 5; // OK!

const int b = 10;
a = 5; // NG!
```

# constexpr
コンパイル時定数の修飾子。上述の`const`を`constexpr`(`const expr`ではない)に書き換えるだけである。コンパイル時に決まっている値にしか用いることができない。
`const T name`(Tには`int`や`char`等, nameには変数名)のように宣言する。
`const`では、定数使用時にメモリにアクセスするのに対して、`constexpr`はコンパイル事にソースコード内に埋め込まれるらしい。

```cpp:const_example
int a = 10;
a = 5; // OK!

constexpr int b = 10;
a = 5; // NG!
```

# 本当？
ちょっと興味があり、アセンブリを見てみた(https://godbolt.org を使用)。コンパイラは`x86-64 gcc 9.2`

## C++のソースコード 〜main内で宣言〜
`int`、`const int`と`constexpr int`をmain文で宣言して、三値を足すプログラムを書いた。
今までの自分のイメージだと、`constexpr int c`はメモリ確保せずにソースコード内で`10`という値として扱われるものだと考えていた。

```cpp:main.cpp
int main()
{
    int a = 10;
    const int b = 10;
    constexpr int c = 10;

    int d = a + b + c;

    return 0;
}
```

## アセンブリ
### オプションなし
三値ともメモリ確保されているようである。（あれっ？）

```
main:
        push    rbp
        mov     rbp, rsp
        mov     DWORD PTR [rbp-4], 10
        mov     DWORD PTR [rbp-8], 10
        mov     DWORD PTR [rbp-12], 10
        mov     eax, DWORD PTR [rbp-4]
        add     eax, 20
        mov     DWORD PTR [rbp-16], eax
        mov     eax, 0
        pop     rbp
        ret
```

### オプション`-O`
変数を再利用していないため、最適化によってメモリ確保そのものが消えてしまった。

```
main:
        mov     eax, 0
        ret
```

ポインタに値を書き込むようにソースコードに`int* p; *p = d;`を追加すると、以下のようにあらかじめ和が算出された値で書き込まれていた。

```
main:
        mov     DWORD PTR ds:0, 30
        mov     eax, 0
        ret
```

## C++のソースコード 〜main外で宣言〜
定数の宣言をグローバルで行い、メイン内で計算をしている。今まででは、`constexpr`はメモリ確保されず、`const`はメモリ確保されると思っていた。

```cpp:main.cpp
constexpr int a = 10;
const int b = 10;

int main()
{
    int c = a + b;
}
```


### アセンブリ（オプションなし）
以下のように、定数は両者ともメモリ確保されておらず、代入ではあらかじめ和が算出された値となっていた。

```
main:
        push    rbp
        mov     rbp, rsp
        mov     DWORD PTR [rbp-4], 20
        mov     eax, 0
        pop     rbp
        ret
```


# おわりに
(最適化オプションなしにおける)`constexpr`を少し誤解していたので、気づけてよかったなと思いました。コンパイラがすごく賢くてびっくりです。
ただ、今回は変数の再利用がなかったため最適化されているだけかもしれないので、引き続き`constexpr`を使おうと思います。ただし、できるだけグローバルで宣言しようと思います。

また、アセンブリについて、実際に暑かったことはないので、誤解があるかもしれません。何かございましたらご指摘いただけたらと思います。
Linuxのパーティションをいろいろいじってみる

[前回](https://qiita.com/r_saiki/items/894de9660607af22ab2e)の記事でパーティションの分割をしたので、今回は分割したパーティション使えるようにする！

**設定項目**
①マウント
②ユーザーごとの容量の制限
③権限設定
④マウントポイントにシンボリックリンク設定

#①マウント
前回分割した拡張領域の/dev/sda5を以下の順番でマウントしていく。
1，/etc/fstabを編集
2, /dev/sda5にmountコマンドを実行

~~~
[root@localhost ~]# fdisk -l
・・・
・・・略
・・・
   Device Boot      Start         End      Blocks   Id  System
/dev/sda1            2048     2099199     1048576   83  Linux
/dev/sda2         2099200     8390655     3145728    5  Extended
/dev/sda5         2101248     4198399     1048576   83  Linux　←これ
~~~

現在のマウント状態の確認。mountコマンドをそのまま実行する。

~~~
[root@localhost ~]# mount
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime,seclabel)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
・・・
・・・略
・・・
＃/dev/sda5が無い
/dev/sda1 on / type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
~~~

## 1，/etc/fstabを編集
先にバックアップをとっておく。

~~~
[root@localhost ~]# cp -p /etc/fstab /etc/fstab.bak
[root@localhost ~]# vi /etc/fstab
~~~

行末に`/dev/sda5 /home2 ext4 defaults 1 2`を追加。

**各項目の意味**
/dev/sda5・・・マウントするデバイスファイル名
/home2・・・/dev/sda5と結びつけるディレクトリ(絶対パス)
ext4・・・ファイルシステムの種類（reiserfs、xfsなど他にもいろいろある）
defaults・・・マウントオプションはデフォルト
1・・・バックアップ必要かどうか（1：必要、2：不要）
2・・・fsckコマンドでチェックを行う時の順序

~~~:/etc/fstab

#
# /etc/fstab
# Created by anaconda on Sat Jun  1 17:13:31 2019
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=8ac075e3-1124-4bb6-bef7-a6811bf8b870 /                       xfs     defaults        0 0
/swapfile none swap defaults 0 0
/dev/sda5 /home2 ext4 defaults 1 2　←ここに追加
~~~

マウント先のディレクトリ/home2を作ってなかったので作成して、マウントコマンドを実行。

~~~
[root@localhost ~]# mkdir /home2
[root@localhost ~]# mount -a
mount: special device /dev/sda5 does not exist
~~~

あれ？無いって言われる。でも`fdisk -l`で出てくるので、デバイスファイルを確認してみる。

~~~
[root@localhost ~]# ls /dev/sda*
/dev/sda  /dev/sda1
~~~

デバイスファイルが無い。再起動したら、デバイスファイル作られるんじゃないと思って再起動。

~~~
[root@localhost ~]# systemctl reboot
grub rescue>
え！
~~~

OSが起動しなくなった・・・
[PC起動しようとしたら「unknown filesystem」って出て焦った](http://nothinganymore.blog.jp/archives/2017-01-14-grub-error-unknown-filesystem)を参考に対応したが直らず。
さらに調べたら、[自分と同じ状況の記事](http://hibitche.hatenablog.jp/entry/2015/07/17/012051)が見つかった。
どうやら、USBかDVDでOS起動して、OSのインストールをやり直すらしい。
今回は仮想マシンを使ってるので、vagrant upし直すことにした。

~~~
$ vagrant status
Current machine states:
これを消す
default                   poweroff (virtualbox)

The VM is powered off. To restart the VM, simply run `vagrant up`
$ vagrant destroy　←　削除する
    default: Are you sure you want to destroy the 'default' VM? [y/N] y
==> default: Destroying VM and associated drives...
7$ vagrant status
Current machine states:
削除された
default                   not created (virtualbox)
$vagrant up  ←　再度up
~~~

またふりだしに戻った・・・。次回こそは①〜④まで完成させたい！！
jQueryで直下の要素のみ取得する方法

# セレクタの直下の要素のみ欲しい

　セレクタの直下の要素って何？子要素と違うの？はい、違います。今回欲しい要素はコレです！

```we_need_parents.html
<html>
<header>
  <title>sample</title>
</header>
<body>
<div>親御さん<p>お子さん</p>（田中）</div>
</body>
</html>
```
　『親御さん（田中）』のみ取得したい。テキストのみではなく、NodeListで。なんでNodeListで欲しいのかというとテキストを書き換える需要があるからです。多分。
　よくよく考えてみると、この条件に合致する要素っていうのはTEXT_NODEのみなんですな。なので、それ前提の決め打ちコードを書きます。
　せっかくだからjQueryを拡張して書きます。

# これがソースコードだ！

```direct.html
<html>
<header>
  <title>sample</title>
  <script src="https://code.jquery.com/jquery-3.4.1.js"></script>
</header>
<body>
取ってきたよ -> <span id="output"></span>
<div>親御さん<p>お子さん</p>（田中）</div>
<div>親御さん<p>お子さん</p>（佐藤）</div>
<div>親御さん<p>お子さん</p>（山田）</div>

<script>
function display( divs ) {
  console.log(divs);
  var a = [];
  for ( var i = 0; i < divs.length; i++ ) {
    a.push( divs[ i ].text() );
  }
  $( "span#output" ).text( a.join(" ") );
}
jQuery.fn.extend({
  direct : function _(elem){
    let node,
        tmp = [],
        ret = [],
        i = 0;

    elem = elem ? elem : this;

    let nodeType = elem.nodeType;

    if ( !nodeType ) {
      while ( (node = $(elem).contents()[i++]) ) {
         tmp.push(_(node));
      }
    } else if (nodeType === Node.TEXT_NODE){
      return $(elem);
    }

    tmp.forEach((item, i) => {
      if(!$.isEmptyObject(item))
      ret.push(item);
    });

    return ret;
  }
});

display($("div").direct());
</script>
</body>
</html>
```

　これ再帰を使ってるんですけど、本当は$("div")の直下だけ取れればいいんだから再帰は使わなくてもいいんですよね。でもなんで再帰を使っているかというと、参考にした [jQuery.text()のソースコード](https://github.com/jquery/jquery/blob/4592595b478be979141ce35c693dbc6b65647173/src/core.js#L263-L297) が再帰だったってのと、この再帰を使うなら$("div")の直下のテキストとA要素のテキストのみ取ってくるってこともできるはずなのです。はず。
　今の所再帰なのに返り値を配列にしてしまっているので、少し潜ると多重配列になってしまってうまくいっていないのですが、再帰だからこそできるはず。もう少し頑張りたいです。

# 参考URL
[jQuery.text()のソースコード](https://github.com/jquery/jquery/blob/4592595b478be979141ce35c693dbc6b65647173/src/core.js#L263-L297)
[jQuery 子要素を含まない text() が欲しい時](https://qiita.com/Urushibara01/items/7b44a3de5cc40d8a10be)
[\[JQuery\] 直下のテキストノード(TextNode)の値を取得する](https://www.sukerou.com/2018/08/jquery-textnode.html)
[HTMLのある要素の直下のテキストだけを取り出す](https://nixeneko.hatenablog.com/entry/2016/05/29/025438)
[jQuery拡張の仕組み 〜 JSおくのほそ道 #013](https://qiita.com/hosomichi/items/29b19ed3ebd0df9361ae)
https://api.jquery.com/jQuery.fn.extend/
https://api.jquery.com/get/
cheerio-httpcli $(form-element).submitでactionを書き換える

# やりたいこと
formにactionが記載されておらずonclickのjavascriptでactionを書き換えるwebアプリをcheerio-httpcliでエミュレートする方法を説明する。

# 環境
cheerio-httpcli@0.7.4 

# cheerio-httpcliについて
Node.js用WEBスクレイピングモジュール。
htmlをパースしたり、web操作をエミュレートしたりできる。
https://github.com/ktty1220/cheerio-httpcli

cheerio-httpcliでエミュレートできるブラウザ操作は以下。「cheerioオブジェクトの独自拡張」
https://github.com/ktty1220/cheerio-httpcli#api%E7%9B%AE%E6%AC%A1

以下にも分かりやすくAPIの説明が乗っている。
https://qiita.com/ktty1220/items/64168e8d416d6d8ffb45

# actionを書き換える方法
```javascript
// documentInfo.urlをsubmitでpostしたいurlに書き換える
result.$.documentInfo().url = "https://google.com";
result.$("form[name=xxx]").submit();
```
formのaction属性が存在しない場合は、documentInfo.urlが使われる。詳細は以下参照。
https://github.com/ktty1220/cheerio-httpcli/blob/master/lib/cheerio/submit.js

# あとがき
- formのactionをjavascriptで書き換えるなんてほとんどないと思うが、古いアプリの操作で必要だったため。
- cheerio-httpcliすごく使い易かった！今後もweb操作が必要になったら使っていきたい。
[k8s] dry-run するなら dry-run オプションは使わない方がいい

:::note warn
本記事で紹介している `--server-dry-run` オプションですが、v1.18 以降では `--dry-run=server` への置き換えが必要です。
https://kubernetes.io/blog/2019/01/14/apiserver-dry-run-and-kubectl-diff/
:::

`kubectl apply` 実行時に `--dry-run` オプションを付けると、マニフェストファイルが適切かどうかをオブジェクトを作ることなく確認できます。

~~~shell
$ kubectl apply -f xxx.yaml --dry-run
~~~
しかし、このオプションはマニフェストファイルの文法チェックなど Local でのチェックしかしてくれず、kube-apiserver を通した挙動は確認できません。

そこで、代わりに `--server-dry-run` オプションや `kubectl diff` コマンドの使用をおススメします。

~~~shell
$ kubectl apply -f xxx.yaml --server-dry-run
$ kubectl diff -f xxx.yaml
~~~

※ 本機能は Kubernetes 1.13 以降でベータ版となっているものです。

## 実際に違いを検証してみた



例えば、以下のように `image` を故意にコメントアウトした deployment マニフェストファイルを用意します。

~~~yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          # image: nginx:1.17.9
          ports:
            - containerPort: 443
~~~

この状態で `--dry-run` と `--server-dry-run` / `kubectl diff` の挙動を比較してみると、

~~~shell
$ kubectl apply -f dryrun-nginx.yaml --dry-run
deployment.apps/nginx created (dry run)

$ kubectl apply -f dryrun-nginx.yaml --server-dry-run
The Deployment "nginx" is invalid: spec.template.spec.containers[0].image: Required value

$ kubectl diff -f dryrun-nginx.yaml
The Deployment "nginx" is invalid: spec.template.spec.containers[0].image: Required value
~~~
このように、`--dry-run` オプションでは異常は検知できず、`--server-dry-run` / `kubectl diff` では正しく検知できます。
`kubectl diff` コマンドでは、マニフェスト適用時に前回との差分出力までしてくれるので、場合によってはこちらの方が使い勝手がよいかもしれません。


## 参考資料
- https://kubernetes.io/blog/2019/01/14/apiserver-dry-run-and-kubectl-diff/
Pukiwikiのエンコードされた添付ファイルの名前をデコードする方法

##はじめに
今回、研究室内で使用しているPukiwikiのデータをお引越しさせる必要性がありました。
特に、添付ファイルには重要な資料がたくさんあるので、それをお引越しさせないとドエライ事になります。

今回の記事では、Pukiwikiのエンコードされた添付ファイルの名前をデコードする方法のアイデアをひとつ紹介します。

##Pukiwikiの添付ファイルの保存場所
PukiwikiはPHPのコードで動いていて、どこかにPukiwiki自体のコードがおいてあるはずです。
添付ファイルは、Pukiwikiのコードのattachという名前のディレクトリ下に保存されます。

## 問題
attachディレクトリに全ての添付ファイルが保存されており、そのディレクトリ内にあるデータをどこかで保存すればお引越し完了、のつもりでした。
しかし、全てのファイルが16進数表記でかつ拡張子無しという無残な姿になっていました。
このままデータを吸い出しても、（そのままでは）全く意味がありません。

**16進数表記にエンコードされたファイル名をデコードしてあげる必要があります**

## 解決方法
https://pukiwiki.osdn.jp/?Q%EF%BC%86A/%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3/attach%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3#o24658e2
いろいろ調べてみると、既に名前をデコードするツールはあります。
しかし、大量のデータを一つひとつツールにぶち込んでいるようでは日が何度暮れても時間が足りません。

まず、テストとして, Pukiwikiの「添付ファイルの情報」ページから格納ファイル名を調べます。

```python3
fileName = a5b9a5aba5a4a5d6a5eba1bc #格納ファイル名のアンダースコアより手前
```
これを整形します。

```python3
b'\xa5\xb9\xa5\xab\xa5\xa4\xa5\xd6\xa5\xeb\xa1\xbc'
```
「EUC_JP」という文字コードでデコードします。

```python3
b'\xa5\xb9\xa5\xab\xa5\xa4\xa5\xd6\xa5\xeb\xa1\xbc'.decode("euc_jp")
```
すると、出力はこのようになります。

```python3
'スカイブルー'
```
## 他に試した事
はじめ、これをPythonのライブラリの一つである**urllib**のparse.unquote()を使ってデコードしようとしました。
しかし、数字にデコードすることは可能でしたが、日本語にデコードすることはできませんでした。
頭を抱えましたね...

## さいごに
今回は、Pukiwikiのエンコードされた添付ファイルの名前をデコードする方法を紹介しました。
エンコードされたファイル名はPukiwiki上で見れますので、お困りならやってみてください。
やりたいことを最後まで実装しきれたら続きを書こうと思います。
bundle install時にffiがコケた

# 起きた問題
業務で開発を行っており、bundle installしようとしたときの話。

```
Using ...
...（略）
Fetching ffi 1.11.1
Installing ffi 1.11.1 with native extensions
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

current directory: /It/is/My Directory/my_project/vendor/bundle/ruby/2.5.0/gems/ffi-1.11.1/ext/ffi_c
/Users/undo/.rbenv/versions/2.5.5/bin/ruby -I
/Users/undo/.rbenv/versions/2.5.5/lib/ruby/site_ruby/2.5.0 -r
./siteconf20191220-44496-1pbyg9r.rb extconf.rb
checking for ffi.h... no
checking for ffi.h in /usr/local/include,/usr/include/ffi... no
checking for shlwapi.h... no
checking for rb_thread_call_without_gvl()... yes
checking for ruby_native_thread_p()... yes
checking for ruby_thread_has_gvl_p()... yes
creating extconf.h
creating Makefile

current directory: /It/is/My Directory/my_project/vendor/bundle/ruby/2.5.0/gems/ffi-1.11.1/ext/ffi_c
make "DESTDIR=" clean

current directory: /It/is/My Directory/my_project/vendor/bundle/ruby/2.5.0/gems/ffi-1.11.1/ext/ffi_c
make "DESTDIR="
/bin/sh: -c: line 0: unexpected EOF while looking for matching `"'
/bin/sh: -c: line 1: syntax error: unexpected end of file
make: *** ["/It/is/My Directory/my_project] Error 2

make failed, exit code 2

Gem files will remain installed in /It/is/My Directory/my_project/vendor/bundle/ruby/2.5.0/gems/ffi-1.11.1 for inspection.
Results logged to /It/is/My Directory/my_project/vendor/bundle/ruby/2.5.0/extensions/x86_64-darwin-18/2.5.0-static/ffi-1.11.1/gem_make.out

An error occurred while installing ffi (1.11.1), and Bundler cannot
continue.
Make sure that `gem install ffi -v '1.11.1'` succeeds before bundling.

In Gemfile:
  *** was resolved to *.*.**, which depends on
    *** was resolved to *.*.*, which depends on
      ohai was resolved to 8.26.1, which depends on
        ffi
```

bundle installでこける。依存gemのffi関連でこけてるっぽい。
こけてるところを見ると、

```
/bin/sh: -c: line 0: unexpected EOF while looking for matching `"'
/bin/sh: -c: line 1: syntax error: unexpected end of file
```
syntax error？
(´ε｀；)ｳｰﾝ…

# 結論
ffiは空白の入ったディレクトリ名を現在の仕様上許容していないっぽい。
同じ事例がgithubのissueとして上がっていた。
https://github.com/ffi/ffi/issues/623

ディレクトリ名を変更すると問題なくbundle installが進んだ。