OmniAICreator/Qiita-1.07M huggingface dataset:
Ubuntu MATE 19.04で突然Bluetoothが使えなくなった件

Ubuntu MATE 19.04をちょっと古めのMacBook Airにインストールしました。

諸般の事情でAndroidスマホとBluetoothで接続してテザリングしていました。
BTヘッドセットで音楽も聞いていました。

しかし突然BT接続ができない状態に。もちろんペアリングはしてあります。
性格に言うと、BTの電源を入れると一瞬(1秒くらい？)接続状態になるのですが、すぐに切断されてしまいます。bluetoothctlで見てると接続後切断しています。

原因がわからす難儀していたのですが....
bluetoothctlを実行してhelpしてみると、unblockと言うコマンドが。
試しにunblockを実行してみると....問題なく接続できました。
当然、blockなんて実行していませんし。

まぁ、良かったよかった。
コードサイニング証明書って何よ

###コードサイニング証明書とは
コードサイニング証明書は、ソフトウェアにデジタル署名を行う電子署名用の証明書です。
ソフトウェアの配布元を認証し、なりすましや内容の改ざんなどがされていないことを保証し、ユーザの手元に責任をもってソフトウェアを届けることができます。

- 誰が作ったのか
- 改ざんなどされていないこと

を保証するためのものなんですね。

###署名の手順
- コードサイニング証明書取得
- 配布するコードのハッシュ値を生成
- コードサイニング証明書の秘密鍵を使ってハッシュ値を暗号化
  ※デジタル署名という
- 配布するコード、デジタル署名されたハッシュ値、コードサイニング証明書のパッケージを作成

###ダウンロード時の検証手順
- コードサイニング証明書の有効性を確認
- コードサイニング証明書に含まれる公開鍵を取得
- コードと暗号化されたハッシュ値に分離
- 暗号化されたハッシュ値を公開鍵で複合
- コードのハッシュ値を作成
- 複合したハッシュ値とコードから作成したハッシュ値を突合
- 同一であれば改ざんがなく真正であることが証明される

なるほど、考えた人頭いい。

###タイムスタンプの取得が必須
- タイムスタンプ付きで署名されたコードは、証明書が有効期限切れになっても署名が有効。
- タイムスタンプなしでも署名はできるが、証明書の有効期限が切れると署名も無効になってしまいアプリケーションの利用ができなくなってしまう。



参考ページ
[コードサイニング (Codesigning) 証明書とは：DigiCert（デジサート）](https://rms.ne.jp/codesigning/howto-work.html)
[コードサイニング証明書とは？｜GMOグローバルサイン【公式】](https://jp.globalsign.com/service/codesign/knowledge/)
[コードサイニング証明書のタイムスタンプとは]
(https://knowledge.digicert.com/ja/jp/solution/SO23074.html)
[タイムスタンプとは何ですか](https://rms.ne.jp/digital-certificate-news/best-practices-timestamping)
ESP32でLM35DZ使ってみた

#はじめに
夏に祖母の家がめちゃめちゃ暑くなって危険なので温度を感知してLチカするやつ作りました。（手元にESP32－DevKitC-32Dしかなかったので、Wi-FiもBLEも使ってないですがESP32を使いましたw）
#こんなやつ
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">温度が30度を超えたらLEDがチカチカするやつ作りました。<br>おばあちゃん家に設置します。 <a href="https://t.co/Dmt9NvaKrp">pic.twitter.com/Dmt9NvaKrp</a></p>&mdash; しんぶんぶん@時間割bot (@shinbunbun_) <a href="https://twitter.com/shinbunbun_/status/1138749064810356736?ref_src=twsrc%5Etfw">June 12, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
#使用部品
- ESP32－DevKitC-32D
- ブレッドボード
- 抵抗（220Ω）
- ジャンパワイヤ ×4
- ACアダプタ
- MicroUSBケーブル
- LM35DZ

#回路
![Untitled Sketch_ブレッドボード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260292/2b571c8b-6a6f-78c7-af17-1fa30533f052.png)
4個繋ぐから大丈夫かなーと思ったけど、ちょっと怖かったので念のため抵抗挟みました。（計算するのは面倒臭かったw）
#コード

```c
void setup() {
  Serial.begin(9600);
  pinMode(4, OUTPUT);
}

void loop() {
  int sensorValue = analogRead(34);
  // esp32のアナログ入力は0~4096なので4096で割る
  float voltage = sensorValue * (5.0 / 4096.0);
  int temp = voltage*100;
  //Serial.println(temp);
  //温度が30度を超えた時
  if (temp >= 30) {
    digitalWrite(4, HIGH);
    delay(1000);
    digitalWrite(4, LOW);
  }
  delay(1000);
}
```

#ハマったところ
- ESP32はアナログ入力使用可能なピンが限られている（[詳しくはこちら](https://zoe6120.com/2018/11/09/128/)）
- なぜか0番ピンが反応しなかった
- 最初はDHT11でやろうと思ったが、プラスマイナスを逆につないでお亡くなりになった

#最後に
次回はLINEBotでエアコンを操作出来るやつを作る予定です。
【Laravel】配列からEloquentモデルを生成する（newInstanceとhydrate）

この記事は移行しました！[最新の内容はこちら](https://naoqoo2.github.io/blog/Laravel-%E9%85%8D%E5%88%97%E3%81%8B%E3%82%89Eloquent%E3%83%A2%E3%83%87%E3%83%AB%E3%82%92%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B-newInstance%E3%81%A8hydrate/)をご覧ください😀

## やりたいこと

DBに保存せずに配列をEloquentモデルにしたい。

例）Itemモデルにしたい

## 単一のとき

```
$item = [
    "name" => "商品A",
    "price" => "100",
];
```

### 普通にnewする

```
new Item($item);
```

ただしテスト書きづらくなるのでオススメしない。


### newInstanceを使う

```
Item::make()->newInstance($item);
```

※makeでいいのかわかってない。。makeはItemがインスタンス化されている場合は不要。

## 複数のとき

```
$items = [];
$item = [
    "name" => "商品A",
    "price" => "100",
];
$items[] = $item;
$item = [
    "name" => "商品B",
    "price" => "200",
];
$items[] = $item;
```

### hydrateを使う

```
Item::hydrate($items);
```

返り値はCollectionになる。
Delphi IDE の便利な機能 - キーボードショートカットなど

コードエディタ上で使えるキーボードショートカットは、いろいろありますが、ここでは個人的に良く使うものを紹介します

## Ctrl + クリック
コード参照、識別子の上でマウスの右ボタンをクリックし、「定義の検索」を選んでも同じ

Ctrl キーを押しながら、クラスとか変数とかメソッドとかプロパティなどの識別子をクリックすると、その識別子が宣言されている箇所のコードが表示されます
識別子によっては宣言が記載されている別のソースコードファイルが開き、表示されます

仕事柄ソースコードを追うことが多いので、これはよく使います
派生元のクラス等にブレイクポイントを設定するときなどにも使いますね
![KeyControl1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164551/1f088037-29f5-79b3-1661-f7685239e94f.gif)

あと、これと組み合わせて使うのが
![ide_x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164551/6e052794-d202-69ae-328c-a8b134b265d6.png)
の赤い枠で囲っているところの ← → のボタン Ctrl + クリックを連続で行った際の履歴を覚えていてくれて、前の履歴や選択したところの履歴に戻ったり、進んだりしてくれるのだ

ひとつひとつ移動させる場合は Alt + ←, Alt + → でも OK

##Ctrl + Shift + C
カーソル位置のクラス宣言に対するクラス補完を起動します。 

たとえば宣言文として

```pascal
 procedure hogehoge;
```

とか書いて Ctrl + Shift + C を押すと

```pascal
 procedure hogehoge;
 begin

 end;
```

を自動生成してくれるのだ
![KeyControl2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164551/27867ba0-d24e-88f2-6316-1bc87dddf593.gif)


##Ctrl + Space
コード補完
[Delphi IDE の便利な機能 - コード補完](https://qiita.com/CYonezawa/items/9cade021a8f1dd5b4e7c)
に詳細があるので、詳しくはこちらをご覧ください

##Ctrl + F
コード検索、IDE のメニューから [検索|検索] でも同じ
検索窓が表示されるので、そこに検索したい語句を入力すると表示されているコード内で検索を行ってくれる

![KeyControl4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164551/fc27bae4-fdd7-fac6-014c-ca2c7020ee58.gif)

んで、検索窓の横にある↑↓をクリックすると、前方検索・後方検索を行ってくれるのだよ(F3, Shift+F3でも検索移動します)

##Ctrl + Shift + F
ファイル検索、IDE のメニューから [検索|ファイル検索] でも同じ
指定された検索範囲のファイル内から、該当する語句を探してくれる
検索結果はメッセージペインに出力され、どのファイルの何処にあるかを教えてくれる

![KeyControl5.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164551/b49f8866-e0ba-347f-96a6-c2bfa68ce6db.gif)

検索結果のコードをクリックすると、該当するファイルの対象のコード位置を開いてくれるのだ

##Ctrl + /
コメント変換
コメントにしたい範囲を選択して Ctrl + / を押すと 先頭に // が付いてコメントに
コメントの行を選択して Ctrl + / を押すと // を外してくれるのです

試しでいろいろ書いているときに良く使います
あ、これコメントで残しといてダメだったら元に戻そうってときに重宝します

![KeyControl3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164551/f6669b4b-f321-f30c-6c8d-e6e98fb75e57.gif)

##Ctrl + C と Ctrl + V と Ctrl + X 
よくあるコピー(Ctrl + C)
メニューから [編集|コピー] を選んでも同じ

よくある貼り付け(Ctrl + V)
メニューから [編集|貼り付け] を選んでも同じ

よくある切り取り(Ctrl + X)
メニューから [編集|切り取り] を選んでも同じ

どれも範囲を選択してキーを押すのだ

![KeyControl6.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164551/38ddf11d-e3c8-2468-e2cd-6d1eaa05d024.gif)

##参考

[コード エディタのキーボード ショートカット](http://docwiki.embarcadero.com/RADStudio/Rio/ja/%E3%83%87%E3%83%95%E3%82%A9%E3%83%AB%E3%83%88%E3%81%AE%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89_%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88#.E3.82.B3.E3.83.BC.E3.83.89_.E3.82.A8.E3.83.87.E3.82.A3.E3.82.BF.E3.81.AE.E3.82.AD.E3.83.BC.E3.83.9C.E3.83.BC.E3.83.89_.E3.82.B7.E3.83.A7.E3.83.BC.E3.83.88.E3.82.AB.E3.83.83.E3.83.88)

[支援機能（IDE チュートリアル）](http://docwiki.embarcadero.com/RADStudio/Rio/ja/%E6%94%AF%E6%8F%B4%E6%A9%9F%E8%83%BD%EF%BC%88IDE_%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB%EF%BC%89)
LookingGlass Large のための画面ズレ対策

# 概要

2019/06/12現在、Makuake組で親子丼を頼んだら親だけ到着した。
開封の儀を簡単に済まし、今作ってるデモを映したところ、どうもオカしい。
- 像が微妙に歪む。
- 頭を左右に振ると、正面を中心に像がカクっと変わる。

公式サイト[how-it-works](https://docs.lookingglassfactory.com/Appendix/how-it-works/) にある [Quilt](https://docs.lookingglassfactory.com/Appendix/images/quilt.png)
を使って調べると、どうも Quilt の順番が怪しい。

Standardの場合は、一番左端から順に#0～#44まで並ぶ。
Largeでは一番端から#23～#44,#0～#22のように並ぶ。
同じQuiltを使っても異なって描画されるため、
SDKないしハードウェア周りの不具合と思われる。

# 対策
とりあえず対症療法で Quilt にコピーする際に然るべき順番に整列すれば正しく映る。
改造するファイルは ```Assets\Holoplay\Scripts\Holoplay.cs```
改造箇所は、```namespace LookingGlass```の```class Holoplay```の```LateUpdate()```の```for (int i;...```

```diff
                cam.Render();

+               int qi = (i + quiltSettings.numViews / 2) % quiltSettings.numViews;

                // note: not using graphics.copytexture because it does not honor alpha
                // reverse view because Y is taken from the top
-               int ri = quiltSettings.viewColumns * quiltSettings.viewRows - i - 1;
+               int ri = quiltSettings.viewColumns * quiltSettings.viewRows - qi - 1;

-               int x = (i % quiltSettings.viewColumns) * quiltSettings.viewWidth;
+               int x = (qi % quiltSettings.viewColumns) * quiltSettings.viewWidth;
                int y = (ri / quiltSettings.viewColumns) * quiltSettings.viewHeight;
                // again owing to the reverse Y
                Rect rtRect = ...
```

先頭の```cam.Render()```でカメラ撮影し、添え字計算を経て、貼り付ける矩形領域```rtRect```を計算してコピーが走る流れ。
quilt計算用の添え字ということで```qi```を作成し、半周期ズらして、レンジを正すと。
あとは```i```を参照している2ヶ所を```qi```に置き換えれば完成。


# 参考
- 公式サイトhow-it-works<br>
https://docs.lookingglassfactory.com/Appendix/how-it-works/
- 標準テストQuilt<br>
https://docs.lookingglassfactory.com/Appendix/images/quilt.png
Rubyの並列処理

# はじめに

最近、複数メソッドを並列で処理するコーティングを行い、concurrent-rubyについて学んだので簡単にまとめました。

# concurrent-rubyとは
[concurrent-ruby](https://github.com/ruby-concurrency/concurrent-ruby)は、並行処理のデザインパターンを元に作られたライブラリ。

# サンプル

concurrent-rubyは、様々な作法が存在しますが、ネットで検索すると、単数形のPromiseやFutureなどと色々な書き方が出てきます。最近、Promisesで統一されつつあるらしいので、`Concurrent::Promises`のサンプルを紹介します。

まずは、並列に実行したいProcオブジェクトを作成するメソッド（p1、p2、p3）を準備。今回は、それぞれのメソッドの中に、1secずつずらしたsleepを設けます。

```
def p1
  lambda {
    start_time = Time.now
    sleep 1
    return "p1 => start time: #{start_time}, finish_time: #{Time.now}s"
  }
end

def p2
  lambda {
    start_time = Time.now
    sleep 2
    return "p2 => start time: #{start_time}, finish_time: #{Time.now}s"
  }
end

def p3
  lambda {
    start_time = Time.now
    sleep 3
    return "p3 => start time: #{start_time}, finish_time: #{Time.now}s"
  }
end

pry(main)> p1
=> #<Proc:0x000055bb4bf3ad48@(pry):68 (lambda)>
pry(main)> p2
=> #<Proc:0x000055bb4bf16df8@(pry):75 (lambda)>
pry(main)> p3
=> #<Proc:0x000055bb4bef7660@(pry):91 (lambda)>
```

それぞれの処理を実行するスレッドを作成します。以下の状態では、`pending`となっており、まだ処理は実行されていません。

```
tasks = [p1, p2, p3].map { |p| Concurrent::Promises.future { p.call } }

=> [#<Concurrent::Promises::Future:0x000055bb4be2aac0 pending>,
 #<Concurrent::Promises::Future:0x000055bb4be29b20 pending>,
 #<Concurrent::Promises::Future:0x000055bb4be289f0 pending>]
```

`zip`とういうメソッドが用意されているのでそれを使用すると、同時にスレッドが実行され、それらの返り値が配列にまとめられます。

```
pry(main)> Concurrent::Promises.zip(*tasks).value! 
=> ["p1 => start time: 2019-06-12 18:23:01 +0900, finish_time: 2019-06-12 18:23:02 +0900s",
 "p2 => start time: 2019-06-12 18:23:01 +0900, finish_time: 2019-06-12 18:23:03 +0900s",
 "p3 => start time: 2019-06-12 18:23:01 +0900, finish_time: 2019-06-12 18:23:04 +0900s"]
```

`start time`は実行時刻。同じ時刻（2019-06-12 18:23:01 +0900）から同時に実行されたことがわかります。また、`finish_time`は1秒ずつずれています。逐次処理の場合は、sleepタイム毎に時刻がずれるため、これが並列処理で実行されていることがわかります。


# まとめ

簡単にですが、Rubyの並列処理についてまとめました。今回は、非常に簡単な例ですが、まともに使おうとするとかなり手こずると思います。Railsアプリケーションに組み込もうとして実装を試みましたが、実装が複雑化してデバックがしにくくなるため、導入を断念しました。正直、Ruby自体が並列処理に向いてなさそうです。Railsアプリケーションならば、Sidekiqなどを使用して無理せず実装した方が良さそうですね。
Javaの勉強　Timerを使って爆弾タイマーぽいものを

Googleの15分ルールをふと思い出したので
javaでタイマー的なのが記述できるのか挑戦してみました

現在読んでるスッキリわかるJava入門には今のところ出てきませんでしたのでAPIみたりQiitaを参考にしたり
javaを学習し始めて2週間くらいは経つのでコードを分割してみました

```java:Main

import java.util.*;

public class Main {
    static Scanner inp = new Scanner(System.in);
    public static void main(String[] args) {
        try {
            System.out.print("爆弾のタイマーを仕掛けてみよう(sec): ");
            int sec = inp.nextInt();
            BombTimer.Bomb(sec);
        } catch (InputMismatchException e) {
            System.out.println("入力が正しくありません。");
        } finally {
            inp.close();
        }
    }
}
```
```java:BombTimer

import java.util.*;

public class BombTimer {
    public static void Bomb(int sec) {
            System.out.println("爆発まで" + sec + "秒");
            Timer timer = new Timer();
            TimerTask task = new TimerTask() {
                int secCount = sec - 1;
                @Override 
                public void run() {
                    if (secCount > 0) {
                        if (secCount <= 60 && secCount % 10 == 0) {
                            System.out.println("残り" + secCount + "秒");
                        } else if (secCount == 5) {
                            System.out.println(secCount + "秒前");
                        } else {
                            System.out.println(sec);
                        }

                    } else {
                        System.out.println("どかーーーーーーーん");
                        System.exit(0);
                    }
                    secCount --;
                }
            };
            timer.sucheduleAtFixedRate(task, 1000, 1000);
        }
}
```

実行結果は以下の通り

```java:結果
爆弾のタイマーを仕掛けよう(sec): 13
爆発まで残り13秒
12
11
残り10秒
9
8
7
6
5秒前
4
3
2
1
どかーーーーーーーん！
```

今回わかったこと
- @Overrideは記述するもんだ
- Scannerはclose()するんだな
- APIリファレンス見ると使い方がなんとなくわかる
- System.exit(0)

参考にさせて頂きました
---
[【Java】タイマー処理実装方法](https://qiita.com/yacchi1123/items/9cc8301c9d28286295eb)

まとめ
---
なんとなくわかってきましたが記述の正解がいまだにわかりません
if文にするべきかswitch文にするべきか
例外処理は必須なの？
疑問が尽きません。。。

お気づきの点がありましたら遠慮なくご指摘お願いいたします。
プログラミング初心者がSQLに関する知識をアウトプットしてみた

今回は最近、勉強し始めたSQLについての知識をアウトプットしていこうと思います。
興味のある方はぜひ最後まで見てください！



##SQLとは
では、そもそもSQLとは何なのでしょうか。
検索してみたところ、SQLとはデータベースの定義や操作を行うことができるデータベース言語の一つといった感じです。
簡単にいうとデータベースに何かしら処理をしてほしいときに使う専用の言語みたいですね。



##SELECT
僕がSQLを勉強を始めて最初に出会ったのが「SELECT」です。
この「SELECT」を使うとデータベースから特定のデータを引っ張り出してくることができます。

```sql
SELECT * FROM  Database; 


SELECT カラム名　FROM テーブル名;
```
こんな感じに書いてデータを引っ張り出してきます。
ちなみにこれは「Databaseという名前のテーブルにあるデータを全部引っ張り出してこい！」という命令ですね。
そして「WHERE」を使用することで条件を指定できます。

```sql

SELECT * FROM Database
WHERE id > 5;


SELECT カラム名　FROM テーブル名
WHERE 条件;
```
上記のような感じで使用することができるはずです。
WHERE id>5　の部分で「idの数値が5よりも大きい」データを指定しています。
このように条件指定することができます。

##CREATE TABLE
はい、ではそもそもテーブルはどう作るのでしょうか。
その答えが「CREATE TABLE」です。
こいつで新しくテーブルを作ることができ、「テーブル名」、「カラム名」、「カラムのデータ型」などを指定することができます。

```sql

CREATE TABLE Database(
id int,
name text,
version float
);


CREATE TABLE テーブル名(
カラム名 データ型
);

```
上記のような感じで書くことができます。



##INSERT INTO 
新しいデータをテーブルに登録するときに「INSERT」を使用します。

```sql

INSERT INTO Database
VALUES(2,"Mirai Taro",2.3);


INSERT INTO テーブル名
VALUES(登録したいデータ);
```
上記のような感じで登録していきます。


##UPDATE
「UPDATE」はすでに登録されているデータの修正をするときに使用します。
こちらも簡単に使用法を紹介します。

```sql

UPDATE Database
SET
name = "Mirai Taro"
version = 8.4
where id = 2 ;


UPDATE テーブル名
SET
カラム名 = 変更データ
WHERE 条件;
```
上記のような感じで使っていきます。
上記では「id = 2の場所」のデータを変更しているわけですね。
今までやってきた「Hacker Rank」と比べると、とても簡単です。

##DELETE
ここらへんで最後にしたいと思います。
最後に登場するのが、「テーブルの中にあるデータを削除する」ときに使う「DELETE」さんです。

```sql

DELETE FROM Database
WHERE name = "Mirai Taro";


DELETE FROM テーブル名
WHERE 条件;

```
こんな感じで使います。
「nameがMirai Taro であるデータ」がこれで削除されるはずです。

##まとめ
今回はSQLについて学んだ知識をアウトプットしました。
学んだことは他にも多くありますが、今回はこんな感じで終わりたいと思います。
僕は初心者なので、書いた内容に間違いがある可能性が高いので、温かい目で見てもらえると嬉しいです(笑)
最後まで読んでいただきありがとうございます！！！
v-htmlでfiltersを使いたい！本当に使いたい？

**Vue.js（+ TypeScript）**で、文字列に対して動的に$\style{background-color:yellow;}{ハイライト}$をかけたいと思った時に調べた内容です。

ちょっとググると[**Vueのフィルタ**](https://jp.vuejs.org/v2/guide/filters.html)で[**出来る！**](https://stackoverflow.com/questions/37839608/vue-js-text-highlight-filter)と見つかったのですが・・・

# TL;DR
Vue.jsのフィルター機能は、(使い道によっては)普通のメソッドで書けるんじゃないの？

というお話です。
今回のようなハイライトかけたいような状況ではフィルター機能は使わなかったですね。

廃止するかどうかの熱い議論はこちら。
[\[Suggestion\] Vue 2.0 - Bring back filters please](https://github.com/vuejs/vue/issues/2756)

# 背景
まずはここ、こんな風にfiltersを定義できるんですねー。知見！
https://qiita.com/pokkur/items/e6c7b20852471a9eca29

で、それにに対して、TypeScript的に書こうとすると、

```ts
@Component({
  components: { MyForm, MyComponent },
  filters: {
    highlight(plainText: string, query: string): string {
      return plainText.replace(
        query,
        `<span style='background-color: yellow'>${query}</span>`
      );
    }
  }
})
export default class HogeHoge extends Vue {
  ...
}
```

と書けることがわかりました。
componentsに並列させて書くんですね。この辺り、ググってもあまり出てこない内容です。
　

が！！！
　

> これって、もはやメソッドじゃん！

　
というツッコミが入ったのは、（zoomで4人くらいで）モブプログラミングをしていた時でした。
上のやつでも機能するんですが、普段使い慣れているメソッドでも書けることが分かり、書き直したものが次のコードになります。

`highlight()`の中身は全く同じですよね。

```ts
@Component({
  components: { MyForm, MyComponent }
})
export default class HogeHoge extends Vue {
  ...
  highlight(plainText: string, query: string): string {
    return plainText.replace(
      query,
      `<span style='background-color: yellow'>${query}</span>`
    );
  }
  ...
}
```

ということで、検索対象のテキスト（plainText）に、検索文字列（query）を渡したら部分的にstyleが当たって、ハイライトがかけられるようになりましたー。

実際に試すとすぐ分かるのですが、例えばqueryとして渡している変数が`v-model`の変数だったら、レスポンシブにハイライト箇所が変わりますねー。

あとは、正規表現をうまく組み合わせることで、複数の同じ文字列に対してハイライトかけられました！
これでタスク終わり！

タスクも進み、新たな知見も得られて良い1日だった！

## 今回のタスクでVue.jsが初見殺しだと感じた内容
- コード内で、Mustache記法（**二重**中括弧, `{{ }}`）と**三重**中括弧(`{{{ }}}`)がパッと見だと見分けづらい
- フィルタでも書けるし、メソッドでも書ける
- Vueのバージョンにより、三重中括弧が`v-html`に置き換わっていた（上では特に触れていない内容です）

#その他、参考文献
- [vuejsの{{{波括弧３つ}}}が効かなかった｜廃止されていた](https://qiita.com/SwuBHj8aKGqBKHet/items/bdf456d0ecca1263794e)

（2重中括弧は`Mustache構文`などでググりやすいですが、3重中括弧って特に呼び方はついていないんですかね？名前のないものって、ググりにくいですよね。）
mysqlrouterのbootstrapで--user=mysqlrouterしか指定出来ない話(systemdで起動する場合)

#mysqlrouter素晴らしい
ここでは話しません、詳しくは[公式](https://dev.mysql.com/doc/mysql-router/8.0/en/)を参照お願いします。

#ハマったところ
掲題とおり、mysqlrouter以外を指定するとsystemctl startで起動できません。
何故かと言うと、yum installした時点で勝手に起動ユーザがmysqlrouterになっているから！！

```/usr/lib/systemd/system/mysqlrouter.service
[Unit]
Description=MySQL Router
After=syslog.target
After=network.target

[Service]
Type=simple
User=mysqlrouter
Group=mysqlrouter

PIDFile=/var/run/mysqlrouter/mysqlrouter.pid

ExecStart=/usr/bin/mysqlrouter -c /etc/mysqlrouter/mysqlrouter.conf

PrivateTmp=true

[Install]
WantedBy=multi-user.target
```

上記ファイルを修正して、daemon-reloadすれば解決しますが、気付かない。。

#ちなみに（ここも少しハマりましたが）
--direcotryオプションを使わなければ、デフォルトで以下の通りファイルが作られ、--userで指定したユーザオーナに変更してくれる（はずですがファイルのみなのでディレクトリ権限は要注意です！）。

```
4416099    0 drwx------   2 root     root           39  6月 12 17:33 /var/lib/mysqlrouter
4416102    4 -rw-------   1 root     root          120  6月 12 17:33 /var/lib/mysqlrouter/keyring
4416101    4 -rw-------   1 root     root          383  6月 12 17:33 /var/lib/mysqlrouter/state.json
92385013    0 drwxr-xr-x   2 root     root           81  6月 12 17:33 /etc/mysqlrouter
92385313    4 -rw-------   1 root     root         1212  6月 12 17:33 /etc/mysqlrouter/mysqlrouter.conf
92385314    4 -rw-------   1 root     root           86  6月 12 17:33 /etc/mysqlrouter/mysqlrouter.key
92385315    4 -rw-------   1 root     root         1610  6月 12 17:33 /etc/mysqlrouter/mysqlrouter.conf.bak
  2634    0 drwxr-xr-x   2 mysqlrouter mysqlrouter       29  6月 12 17:33 /var/log/mysqlrouter
  2649    4 -rw-r--r--   1 root     root         3762  6月 12 17:33 /var/log/mysqlrouter/mysqlrouter.log
```

#Tip
使っている方はご存じだと思いますが、

複数のAPPサーバ又はClientインスタンスに対して都度bootstrapする必要なく、
上記のlogファイル以外をコピーして、APPサーバ等に入れて起動すればmysqlクラスターへアクセス可能！便利！
結果的にこれは管理用ユーザを外部からのアクセスを許可しなくてもいいメリットがあります。（環境によりますが）
そうじゃなければbootstrap度に管理権限でDBにアクセスし、router_xxxxユーザを作ることになってしまう。。
Sketchで文字をアウトライン化してSVGを書き出す方法（2019年6月版）

Sketchの操作で手間取ったのでメモ。

#Sketchで文字をアウトライン化

![Alt text](https://gyazo.com/42701993dd367a5f334f80f427b728df/raw)

1. 右クリックして`Convert to Outlines`を指定すると
2. アウトライン変換可能です🙌

動画を見るとアラ簡単…。ですが、ここにたどり着くのに30分かかりました😥
Sketchの操作パネルがバージョンアップで頻繁に変わるようで、
いくつかググった情報は全てメニューがありませんでした。2019年6月はこの方法でバッチリです👌

#SketchでSVG書き出し

![Alt text](https://gyazo.com/f955af15e666d457f6f1ba5e4e587ac0/raw)

1. 右側パネルの `MAKE EXPOTABLE`をクリック
2. SVGを選択
3. `Export Selected`をクリックで書き出し完了です🙌

SVGの書き出し手順を覚えておくと便利ですね。
勉強になります〜〜😃

#こちらの記事の最新情報
メンテナンス済の最新記事をブログで公開してます。

WinMergeのようにMacで差分ファイルを比較する無料ソフト「CompareMerge」（2019年7月）｜エンジニアの日々効率化
https://keycode.digital/2019/07/586/
JNI C/C++の長い関数名を短くする

# JNIの関数名は長い

普段プログラミングするときは識別子が長くなりすぎないよう気を遣っている。
だが JNI(Java Native Interface) では、System.loadLibrary でC/C++関数を使えるようにするためにも長い関数名にせざるを得ないのだ。

```c:example
JNIEXPORT void JNICALL Java_com_example_araki_app_jniBridge_nativeOnSurfaceChanged(JNIEnv* env, jobject obj, jint height, jint width);
```
エディタを横に分割すると宣言が収まり切れなくなることがある。
関数宣言が途中で改行されると、ただでさえ読みづらいのに見栄えも悪くなる。

#解決策
C言語のマクロを使う。

```c:macro
#define JniFuncVoid(return_type, func_name)          \
JNIEXPORT return_type JNICALL                        \
Java_com_example_araki_app_jniBridge_##func_name     \
    (JNIEnv* env, jobject obj)

#define JniFuncArg(return_type, func_name, ...)      \
JNIEXPORT return_type JNICALL                        \
Java_com_example_araki_app_jniBridge_##func_name     \
    (JNIEnv* env, jobject obj, __VA_ARGS__)

JniFuncArg(void, nativeOnSurfaceChanged, jint height, jint width);
```
`return_type` 関数の戻り値の型
`func_name` 関数名の共通していない部分
`...` 関数の共通していない引数

`JniFuncVoid`は引数なし
`JniFuncArg`は引数あり

C++20で追加される `__VA_OPT__` が使えればマクロを一つにまとめられる。
Property [hoge] does not exist on this collection instance. と怒られたとき

##コントローラー

```
$user = DB::table('users')->where('id', $user_id)->get();
return view('index', ['user' => $user]);
```

##テンプレート

```
<p>{{ $user->name }}</p>
```

##エラー
```
Property [name] does not exist on this collection instance.
```

##原因
DB::table~get();
だと単一のプロパティではないです。

なのでgetではなくfirstとります。
下記のような感じで。

```
$user = DB::table('users')->where('id', $user_id)->first();
```

##usersのidが主キーなら
```
$user = DB::table(′users′)−>find($id);
```
findでとりましょう！
AWS S3のオブジェクト（GLACIERも）を丸ごとダウンロードする

# 概要

S3バケットに保管されているオブジェクト（標準・GLACIER）を丸ごとダウンロードするスクリプトです。
S3に保管しているオブジェクトがライフサイクルルールでGLACIERストレージクラスにアーカイブされてしまったので書きました。

# 使い方

サンプルのバケット名と保存ディレクトリ名を書き換え、スクリプト名を指定してPythonインタプリタを起動します。

```shell
$ python restore_n_download.py
```

GLACIERからの復元には通常3時間～5時間かかるとのことなので、このスクリプトを一回実行して復元を開始し、3時間～5時間後にもう一回実行すればダウンロードできます。ダウンロード済みのファイルは処理を飛ばしますし、オブジェクトが復元中かどうかも知ることができます。

```python:restore_n_download.py
import boto3
import os
from botocore.exceptions import ClientError

# 設定
CONFIG = {
    'bucket_name': 'awsexamplebucket',
    'filter_prefix': '',
    'base_dir': '/Users/name/awsexamplebucket',
    'restore_days': 1
}

def download_object(s3_client, bucket, key, base_dir):
    save_path = os.path.join(base_dir, key)
    if os.path.exists(save_path):
        print(f'Already exists: {key}')
        return

    os.makedirs(os.path.dirname(save_path), exist_ok=True)
    try:
        s3_client.download_file(bucket, key, save_path)
        print(f'Downloaded: {key}')
    except ClientError as e:
        print(f'Error downloading {key}: {e}')

def main():
    s3 = boto3.client('s3')
    
    paginator = s3.get_paginator('list_objects_v2')
    for page in paginator.paginate(Bucket=CONFIG['bucket_name'], Prefix=CONFIG['filter_prefix']):
        for obj in page.get('Contents', []):
            key = obj['Key']
            try:
                obj_info = s3.head_object(Bucket=CONFIG['bucket_name'], Key=key)
                storage_class = obj_info.get('StorageClass', 'STANDARD')

                if storage_class == 'GLACIER':
                    restore_status = obj_info.get('Restore', '')
                    if 'ongoing-request="true"' in restore_status:
                        print(f'Restoration in-progress: {key}')
                    elif 'ongoing-request="false"' in restore_status:
                        download_object(s3, CONFIG['bucket_name'], key, CONFIG['base_dir'])
                    else:
                        print(f'Submitting restoration request: {key}')
                        s3.restore_object(
                            Bucket=CONFIG['bucket_name'],
                            Key=key,
                            RestoreRequest={'Days': CONFIG['restore_days']}
                        )
                else:
                    download_object(s3, CONFIG['bucket_name'], key, CONFIG['base_dir'])
            except ClientError as e:
                print(f'Error processing {key}: {e}')

if __name__ == '__main__':
    main()
```

# 参照
- [S3 — Boto 3 Documentation](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html)
- [Amazon S3 Glacier](https://aws.amazon.com/jp/s3/storage-classes/glacier/)
- [Python boto3 でAWSを自在に操ろう ~入門編~ - Qiita](https://qiita.com/kimihiro_n/items/f3ce86472152b2676004)
pythonのpymatgenの使い方を頑張ってまとめてみる③

# はじめに
今回もpymatgenの使い方をまとめていきます。頑張っていきましょう。
***
###structureオブジェクトの作り方をもっと細かく
pymatgenのStructure.from_fileを用いれば、cifやjson、poscarなどのファイルを扱うことができますが、その細かいパラメーターを与える場合にはpymatgen.ioを用いる必要があります。以下に、cifファイルをioを用いて扱う方法を示します。

```.py
from pymatgen.io.cif import CifParser
parser = CifParser('data_1-ICSD.cif')
structure = parser.get_structures()[0]
```

このようにすれば、pymatgen.ioを用いてstructureオブジェクトを作成することができます。しかし、どのような違いがあるかいまいち分かりませんね。CifParserの定義をみていきましょう。

```.py
def __init__(self, filename, occupancy_tolerance=1., site_tolerance=1e-4):
```

つまり、第二引数や第三引数に値を与えれば全体やサイトの許容因子(tolerance)をいじることができるわけです。気を付けてほしいのは、parser.get_structures()の戻り値がリスト型になっていることです。そのままでは扱いずらいため、インデックス指定をして変換する必要があります。
***
poscarから同様にstructureオブジェクトを生成する場合は、以下のようにします。

```.py
from pymatgen.io.vasp import Poscar
poscar = Poscar.from_file("POSCAR")
structure = poscar.structure
```

このようにすれば、poscarからstructureオブジェクトを作成することができます。Structure.from_fileとの違いをみてみようと思って定義を確認したのですが、いまいち利点が分かりませんでした。多分、読む人にposcarファイルを読み取っていることを分かりやすくするためでしょうか（適当）。理解でき次第追記していきます。
***
###pymatgen.ioを用いたposcarとcifの変換
pymatgen.Structure.from_fileでstructureオブジェクトを作成し、structureオブジェクトのto
メソッドを使用して引数のfmtにposcarかcifをしていすれば各々のファイル形式を変換できますが、ioを用いても変換が可能です。具体例をみていきましょう。

```.py
from pymatgen.io.cif import CifWriter
from pymatgen.io.vasp import Poscar

poscar = Poscar.from_file("POSCAR")
w = CifWriter(poscar.structure)
w.write_file('mystructure.cif')
```

Poscar.from_fileでposcarオブジェクトを作成しています。poscarオブジェクトのstructure属性にはstructureオブジェクトが格納されているので、それをCifWriterクラスの引数に渡すと、cifwriterオブジェクトが生成されます。cifwriterオブジェクトのwrite_fileメソッドを用いることで、cifファイルを生成できます。CifWriterクラスの利点をみるために、定義を確認しましょう。

```.py
def __init__(self, struct, symprec=None, write_magmoms=False):
```

なんだかよく分からないのでArgsを確認しましょう。

>Args:
            struct (Structure): structure to write
            symprec (float): If not none, finds the symmetry of the structure
                and writes the cif with symmetry information. Passes symprec
                to the SpacegroupAnalyzer
            write_magmoms (bool): If True, will write magCIF file. Incompatible
                with symprec

どうやら、symprecに引数を与えるとcifファイルに対称性の情報を与えることができるようです。magmomsについてはよく分からないですね。今度時間があるときに教授に聞いてみます。

###structureオブジェクトの修正方法
structureオブジェクトの各サイトの原子を変換したり、変換した後に場所を指定したりもできます。具体例をみていきましょう。

```.py
structure[1] = 'F', [0.51, 0.51, 0.51]
print(structure.formula)
print(structure.frac_coords)
```

>Cr3 Te8 O22 F1
>
>[[0.3192 0.9981 0.8842]
>[0.51   0.51   0.51  ]...]

このようにサイト番号１の原子をFに置換した後に、その原子の位置を指定することもできます。


***

今回はここまでになります。ここまで読んでいただきありがとうござました。

[pythonのpymatgenの使い方を頑張ってまとめてみる①](https://qiita.com/renesisu727/items/bd7b0526784c26fa0f88)
[pythonのpymatgenの使い方を頑張ってまとめてみる②](https://qiita.com/renesisu727/items/b520f6def3a53b6be088)
Vimの編集あれこれ

Linux　CentOS7を触り始めて間もなく、Vimを使用しているときにあまりにも忘れてしまいがちなデリート/ヤンク/プットについて自分のために残しておきます。

デリート：d
ヤンク：y
プット：p

d$：行末までデリート
d0：行頭までデリート
x,dl：1文字をデリート
dw：単語を1つデリート
dgg：最初の行までデリート
dG：最後の行までデリート
p：プット
yy：現在カーソルのある行をヤンク
dd：現在カーソルのある行をデリート

u：アンドゥ (undo)
Ctr+r：リドゥ(redo)

dに相当する部分をy,pに置き替えることでヤンク/プットが可能になる。
dの後ろに相当する部分はカーソル移動のコマンドであり、それの組み合わせになっている。
HTMLの属性について

こんにちは。職業です。

今回は**HTMLの属性**について学んでみようと思います。

・まずは、**[id]**から。
h1をidつけていきます。
idは何かのタグに指定することが出来ます。

・次に**[class]**です。
classはidと違い、ファイル内に同じclass名を複数つけることが出来ます。

・次に**[div]**です。
divは~するといったときに使用されます。

・次に**[span]**です。
これは、見た目を変えたいときに使います。

今回は、**[id,class,div,span]**

属性系をやっていきました。

![属性.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427747/f0330fe1-00f4-8f21-ef23-e64657375e51.png)
![属性１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427747/f1d8a250-50d8-25f5-b22a-b1a6103f9772.png)



こんな感じになります。

それではまた！
【R言語】RでWebスクレイピングしてプロット表示するまでをやってみる

R言語のデータ加工にハマってまして、Webスクレイピングにも手を出してみました。

これからWebスクレイピングを行われる方の参考になれば幸いです。

流れとしましては、
①Webページから情報を取得
②Webページから必要な情報を抽出
③データ加工
④可視化
の順です。

今回、スクレイピング先のサイトとして、[東京電力パワーグリッド様が公開されている過去の電力使用実績データ](http://www.tepco.co.jp/forecast/html/download-j.html)を使用させていただきました。

###実装

まずはWebページから情報を取得します。
諸々のパッケージ宣言や変数宣言なども行っておきます。

```r:web_scraping.r
# ライブラリ -------------------------------------------------------------------


pacman::p_load(dplyr, tidyr, rvest, ggplot2,RMeCab,pipeR,readr,lubridate)


# ソース本文 -------------------------------------------------------------------


source_url <- "http://www.tepco.co.jp"
tar_url  <- "http://www.tepco.co.jp/forecast/html/download-j.html"

csv_all  <- data_frame()

#WebページのURLを指定し、データを取得
performance_html <- read_html(tar_url,encoding = "UTF-8")

```

Webページのデータを取得できたら、必要な情報を抽出します。
aタグに含まれるhref属性のデータを取り出し、その中から「/forecast/html/images/juyo-」を含む情報のみを抽出します。
これが今回必要な詳細情報です。

```r:web_scraping.r
#データ抽出
target_url_list <-
  performance_html %>>%
  html_nodes(xpath = "//a") %>>%  #aタグに格納されているデータ
  html_attr("href") %>>%          #href属性のデータ
  as.data.frame() %>>%            #データフレーム化
  filter(grepl("/forecast/html/images/juyo-", .)) #/forecast/html/images/juyo-〇〇〇〇に詳細情報が入る

```

詳細情報はCSVファイル形式で格納されています。
それぞれ毎に集計していくのは骨が折れるので、一旦ひとまとめにします。
先頭行が不要なので一工夫していますが、要は公開されているデータをひとつの変数として集約・保持するソースコードを書いています。

```r:web_scraping.r
#CSVファイル情報集約
for (i in 1:nrow(target_url_list)) {
  target_url <- paste0(source_url,target_url_list$.[i])
  
  #csvをファイル保存
  save_file <- paste0("download",i)
  download.file(paste0(source_url,target_url_list$.[i]),
                paste0(save_file,".txt"))
  
  #先頭の情報が余計なので一旦除いてから再保存する
  read_csv2(paste0(save_file,".txt")) %>>%
    write_csv2(paste0(save_file,".csv"),col_names = F)
  
  csv_tbl <- read.csv(paste0(save_file,".csv"))
  
  #データを順次追加
  csv_all <- bind_rows(csv_all, csv_tbl)
}

```

集約さえできればあとは加工するだけです。
データが日単位で集計されているとグルーピングができないので、
グルーピングしやすくするために年/月の列の情報を追加してサマります。

```r:web_scraping.r

#データ加工
data <- 
  csv_all %>>%
  mutate(year=year(DATE),month=month(DATE)) %>>%  #年/月に分ける
  group_by(year,month) %>>%                       #年/月でグルーピング
  summarise("pf" = sum(実績.万kW.))
  
```

最後に可視化を行います。
お好みで様々な可視化を行ってみるのも良いでしょう。

```r:web_scraping.r
ggplot(data,aes(x=year) ) + geom_histogram()
```

![ggplot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162354/3e571aa4-3739-0ad7-5d58-695ae1478456.png)

以上です。
ちょっと難しい技術でしたが、ハマると楽しいので機会があれば積極的に使っていきたいですね。
やっていきましょう。
【MovableType】テンプレートごとに表示させる内容を変える

##やりたいこと
テンプレート毎に表示させる内容を変えたい。

例）ページタイトル、CSSなど・・・

##解決方法
各テンプレートに任意の変数をセットする。

###例：title要素を変えたい場合

```mt:インデックステンプレート
<MTSetVar name="index_template" value="1">
```
```mt:ウェブページテンプレート
<MTSetVar name="page_template" value="1">
```
```mt:head（テンプレート）
<mt:If name="index_template"><mt:Ignore>----- ▼扉ページ -----</mt:Ignore>
    <title><mt:SiteName remove_html="1"> | <mt:WebsiteName> | 株式会社サンプルデスヨ</title>
<mt:ElseIf name="page_template"><mt:Ignore>----- ▼ウェブページ -----</mt:Ignore>
    <title><mt:PageTitle remove_html="1"> | <mt:WebsiteName> | 株式会社サンプルデスヨ</title>
</mt:If>
```

このように条件分岐させてあげれば、表示を変えることが可能です。
「このインデックステンプレートにだけCSSやJSファイルを読み込ませたい！」も可能です。
また、親サイト以下どのテンプレートでも使用可能です。（主に共通テンプレートに使用機会が多いかも）

###番外編：特定のウェブページのみ表示する内容を変えたいとき
それほど関係ないですが、各ウェブページに特別に何かを指定したい場合はフォルダー名を指定してあげればいいかと思います。

例：フォルダ「samplefolder」にCSSを読みこませたい場合

```mt:head（テンプレート）
<mt:Pages folder="samplefolder">
  <link rel="stylesheet" href="/samplefolder/css/style.css">
</mt:Pages>
```

予約変数というあらかじめ決められた変数名もありますが、自在に使えるし調べる手間も省けると思ったので自分は任意で命名したものを使用しています。
※やはり予約変数は使用したほういいのかな・・・。

任意で使用する場合は、命名ルールの統一・グローバル変数など記述するサイト内共通テンプレート（自分の場合はsite_config）などにコメントで明記しておくと分かりやすいかもしれませんね。
プログラミングの勉強を始めました。

#　はじめに
こんにちは。古橋研究室所属二期生の北野恭一朗です。
今回が初投稿になりますがタイトルにもある通り今週からプログラミングについての勉強を始めました。知識0からかつPCの操作自体苦手なアナログマ人間なので初手から大苦戦を強いられています。

##　使用物
言語はPythonの3で教材としてはオライリージャパンの入門3といくつかのサイトを利用している、する予定といった感じです。

###　始めてみての感想など
まず知らない用語が多く逐一調べないといけないので苦労しています。一応これからプログラミングを始める人向けの本を選んだつもりでしたがそのラインにすら立ててないのでは疑惑がありました。インストールや対話型インタープリターを出すだけでかなり苦戦しました。友人の教えなどもありテキストエディタにプリント関数｛print(61)ととても簡素なものだとではありますが｝を入力しターミナルウインドウを開き実行するところまではできました。
また、教材の前にこちらのサイト（https://www.codecademy.com/）を使って学習するのを進められたので始めていこうと思います。
PostgreSQLで日次、週次、月次の集計をする

# 前提：テーブル構成

**daily_active_users**

| date       | user_id |
|:-----------|:--------|
| 2019-01-01 | 100 |
| 2019-01-02 | 100 |
| 2019-01-02 | 111 |
| 2019-01-03 | 100 |
| 2019-01-03 | 111 |
| 2019-01-04 | 100 |
| 2019-01-05 | 100 |

# 各期間ごとに必ずデータがある場合

※日次なら毎日1件以上対象レコードがあり、集計結果に歯抜けが出ない場合

## 日次

### date型の場合

```sql
SELECT date,
       COUNT(DISTINCT user_id) AS dau
FROM daily_active_users
GROUP BY date
ORDER BY date
```

### timestamp型の場合

日付に変換してから利用します。

```sql
SELECT to_char(created_at, 'YYYY/MM/dd') as date,
       COUNT(DISTINCT user_id) AS dau
FROM daily_active_users
GROUP BY date
ORDER BY date
```

## 週次：日曜始まり

`date_part('dow', date)` で曜日の数字を取得し、 `date` から引くことで日曜日に変換しています。

```sql
SELECT date - INTERVAL '1 day' * date_part('dow', date) AS week,
       COUNT(DISTINCT user_id) AS wau
FROM daily_active_users
GROUP BY week
ORDER BY week
```

## 月次

```sql
SELECT to_char(date, 'YYYY-MM') AS month,
       COUNT(DISTINCT user_id) AS mau
FROM daily_active_users
GROUP BY month
ORDER BY month
```

# データが無い期間がある場合

上のSQLだとアクセスがない期間がある場合、結果が歯抜けになります。
※1/2のデータがなかった例


| date       | dau |
|:-----------|:--------|
| 2019-01-01 | 10 |
| 2019-01-03 | 20 |
| 2019-01-04 | 10 |

これを回避するために日次、週次、月次などのマスターデータを用意してそこにjoinしていきます。

## 日次のマスターを作る

```sql
SELECT generate_series AS from_date,
       generate_series + '1 days'::interval AS to_date
FROM generate_series('2019-1-1'::TIMESTAMP, '2019-1-3'::TIMESTAMP, '1 days')
```


| from_date       | to_date |
|:-----------|:--------|
| 2019-01-01 00:00 | 2019-01-02 00:00 |
| 2019-01-02 00:00 | 2019-01-03 00:00 |
| 2019-01-03 00:00 | 2019-01-04 00:00 |

`1 days` の部分を変更すれば週次、月次だけでなくx日毎なども作成可能です。

## 日次

```sql
SELECT from_date,
       COUNT(DISTINCT user_id) as dau
FROM
  (SELECT generate_series AS from_date,
          generate_series + '1 day'::interval AS to_date
   FROM generate_series('2019-1-1'::TIMESTAMP, '2019-1-3'::TIMESTAMP, '1 day')) AS time_ranges
LEFT JOIN daily_active_users
  ON from_date <= daily_active_users.date
     AND daily_active_users.date < to_date
GROUP BY from_date
```


## 週次

※開始日（例では2019-1-1）から7日毎になるため、日曜始まりにする場合は、開始日を日曜に指定してください

```sql
SELECT from_date,
       COUNT(DISTINCT user_id) as wau
FROM
  (SELECT generate_series AS from_date,
          generate_series + '7 days'::interval AS to_date
   FROM generate_series('2019-1-1'::TIMESTAMP, '2019-2-1'::TIMESTAMP, '7 days')) AS time_ranges
LEFT JOIN daily_active_users
  ON from_date <= daily_active_users.date
     AND daily_active_users.date < to_date
GROUP BY from_date
```


## 月次

```sql
SELECT from_date,
       COUNT(DISTINCT user_id) as mau
FROM
  (SELECT generate_series AS from_date,
          generate_series + '1 month'::interval AS to_date
   FROM generate_series('2019-1-1'::TIMESTAMP, '2019-3-1'::TIMESTAMP, '1 month')) AS time_ranges
LEFT JOIN daily_active_users
  ON from_date <= daily_active_users.date
     AND daily_active_users.date < to_date
GROUP BY from_date
```

# 参考

https://qiita.com/yskur/items/4e114a8143486914870c
Macの外部ストレージにあるプロジェクトでPod Initを利用

#外部ストレージのプロジェクトでCocoaPodsを利用

##はじめに
外部ストレージにあるxcodeプロジェクトに引用元のサイトにあるように
pod init
では上手く出来なかったので忘れないようにメモを残す

##実行環境
Cocoapods 1.61
Xcode 10.2.1 
プロジェクトがあるPath
/volumes/ストレージ名/プロジェクト名
##Pod initを実行してみる
ターミナルで外部ストレージにあるプロジェクトに移動し
$ pod initを実行すると以下のエラーが出る
>Multiple Xcode projects found, please specify one

どうやら対象のXcodeがプロジェクトが複数あるから指定しろと怒られている。
ディレクトリ内は以下の状態。
>
・TestImageApp
・TestImageAppTests
・TestImageApp.xcodeproj
・TestImageAppUITests

同じディレクトリ内の状態のものでデスクトップにあるプロジェクトでpod init
を実行すると問題なくPodfileが生成される。

##対応
以下のように initの後ろにプロジェクト名を指定して実行するとPodfileが生成される

$ pod init TestImageApp.xcodeproj

---
引用元
[Swiftで簡単にカレンダーを作ろう！(FSCalendar)](https://qiita.com/Koutya/items/f5c7c12ab1458b6addcd)
CircleCIのmacosでNode.jsのバージョンを変更する方法

React NativeアプリのデプロイをCircleCIに移行しています。
CircleCIのmacos(xcode10.2.1)のNode.jsのバージョンは12.1.0で設定では変更できません。
このバージョンではnpm installが失敗してしまうので、Node.jsのバージョンを変更する方法を調べました。

結論から言うと別のバージョンのNode.jsをインストールするだけです。
今回はNode.jsのバージョン管理ツール `n` を使って以下のようにジョブのstepsを定義することで無事にNode.js 8.16.0を使用することができるようになりました。

```yaml:.circleci/config.yml
- run: whoami
- run: which node
- run: node -v
- run: sudo npm install -g n
- run: sudo n 8.16.0
- run: sudo n use 8.16.0
- run: sudo chown -R $(whoami) ~/.npm
- run: which node
- run: node -v
```
【ffmpeg】シェルスクリプトで一括変換

# 一括でファイルをmp4からwav変換にできないのものか？
できました。
ShellScript万歳！

```sh:ffmpeg_all_change
for FILE in *.mp4
do
    FILENAME=`echo ${FILE} | sed 's/\.[^\.]*$//'`
    ffmpeg -i ${FILENAME}.mp4 -map 0:1 ${FILENAME}.wav
done
```
というファイルを用意した後

`chmod 755 ffmpeg_all_change.sh`
で実行権限を与えてあげて

`./ffmpeg_all_change.sh`
を実行してあげれば、一括で変換できます。

よかったよかった。
Segwitについて1

###malleability問題の解決策として
具体的な変更点はまだまだあるので後でまとめます。
今回はalleability問題の解決策としての項目をまとめました。

 
#署名スクリプトの管理
___

従来のトランザクション構造ではscript_sigの部分だけ署名されずにいた(署名データ自体を署名する意味はない)のでここを改竄することで、ビットコイン展性が生まれてしまっていた。そこで、Segwittではこのscript_sigを空にし、新たに**witness**という署名スクリプトの格納場所を設ける事で、仮に署名スクリプトが改竄されてもtxid自体は変化しないようになる。これで展性を防げる。
＊注意＊
・署名が不要になるわけではない。
・サイズやデータが変更されるわけでもない。
Responder + WebSocketで簡易チャットアプリ

# TL;DR
WebSocketをほとんど使かったことがなかったので使ってみた。
ユーザー認証のない簡易的なチャットアプリならすぐ作れそうだったので2018年にリリースされたばかりのPythonのWebフレームワーク[Responder](https://python-responder.org/en/latest/)を使って実装してみた。（そもそもResponderの情報が少なすぎる上にWebSocketを使っている記事などが皆無だったのでソースコード読んだりResponderのベースになっているStarletteのことも調べたりして結構大変だった…）

[Responder](https://python-responder.org/en/latest/)はPython界隈では有名な[Kenneth Reitz](https://github.com/kennethreitz)さん作([requests](https://github.com/kennethreitz/requests)や[pipenv](https://github.com/pypa/pipenv)作った人)

**完成品** : https://github.com/ksk001100/responder-websocket

# プロジェクト構成
```shell
$ tree
.
├── Pipfile
├── Pipfile.lock
├── app.py
└── static
    └── index.html
```

# プロジェクトの作成
今回も`pipenv`でプロジェクトを作成していきます。

```shell
$ mkdir responder-websocket-chat
$ cd responder-websocket-chat
$ pipenv --python 3.6.5
$ pipenv install responder --pre
```

# サーバー実装
`app.py`にサーバープログラムを書いていきます。

```python:app.py
import responder

api = responder.API()
clients = {} # 1

@api.route('/ws', websocket=True)
async def websocket(ws):
    await ws.accept()
    key = ws.headers.get('sec-websocket-key') # 2
    clients[key] = ws # 3
    try:
        while True:
            msg = await ws.receive_text()
            for client in clients.values(): # 4
                await client.send_text(msg)
    except:
        await ws.close()
        del clients[key] # 5

api.add_route('/', static=True)
api.run()
```

- **1**の変数`clients`は接続中のクライアントを格納する辞書。メッセージを受け取った時に全てのクライアントにメッセージをブロードキャストするために格納している。
-  **2**でリクエストヘッダーからキーを取得して**3**で**1**で宣言した辞書にクライアントを格納する。
- **4**の処理で接続クライアント全てにメッセージをブロードキャスト
- **5**の例外処理部分は接続が切れたりリロードされたりした場合辞書に接続されてないクライアントが溜まってメモリを圧迫するのでクライアントを削除する処理

# フロント実装
JSの処理部分だけ書きます。めんどくさいので実際は`static/index.html`にscriptタグを直接埋め込んでいます。

```js
const ws = new WebSocket('ws://localhost:5042/ws');

// メッセージを入力するinput要素
const textbox = document.getElementById('textbox');

// チャットのメッセージを表示するのul要素
const chat = document.getElementById('chat');

// 1
ws.onmessage = function (e) {
  
  // メッセージのli要素作成
  const li = document.createElement('li');

  li.textContent = e.data;
  chat.appendChild(li);
};

// 2
window.onload = function () {
  textbox.addEventListener('keypress', function (e) {

    // エンターキーが押された場合メッセージを送信
    if (e.keyCode == 13) {
      ws.send(textbox.value);
      textbox.value = "";
    }
  });
}
```

- **1**はサーバーからブロードキャストされたときの処理
- **2**はメッセージを入力してエンターキーを押したときの処理

# 実際の動作

![resp.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211748/d4ba8a8c-3960-5255-06ec-9baf0132e3b8.gif)
AnacondaのコマンドプロンプトをVSCodeのターミナルで開こう！

はじめまして！ひろちょんです。

今回はメモ程度に<strong>VSCode</strong>にて<strong>Anaconda(Python)</strong>のターミナルを開く方法を書いていきます。
※OSはWindows10です。

<h2>VScodeのターミナルにてAnacondaのコマンドを起動させる</h2>
今回の記事では、以下が前提条件です。

- VSCodeがインストール済み
- Pythonがインストール済み
- Anaconda3がインストール済み

<h3>設定画面からsetting.jsonを開こう！</h3>

↓まず画面の左下の歯車マークを押して設定を開きましょう！
![全画面.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436088/3bbe5fd4-2e20-8b64-a469-108313ef58c9.jpeg)

設定が開けたら、↓の<strong>ターミナル</strong>を選択してください。
![kategori.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436088/6e6ef3cf-f841-1e8d-2303-d89a3d5ad27f.jpeg)

<strong>ターミナルの設定画面</strong>が開いたら、どんどんどんどん下にスクロールしちゃってください～:relaxed:

↓この画面が出てきたらストップです！:raised_hand:
![windows.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436088/554994a9-9e65-5bc9-988c-cbd2c8e4edbc.jpeg)

<strong>setting.jsonで編集</strong>を押しましょう！

<h3>setting.jsonを編集しよう！</h3>
まずは<strong>Anacondaのコマンドプロンプト</strong>である<strong>cmd.exe</strong>がPC内のどこにあるかを調べる必要があります！パソコン内の検索などで<strong>cmd.exe</strong>が保存されているフォルダを調べられたら、<strong>絶対パスをコピー</strong>しましょう。
※ちなみに僕は『C:\Windows\System32』にありました。

VSCodeの画面に戻って、<strong>terminal.integrated.shell.windows</strong>を↓のように編集します。
※バックスラッシュ(円マークが2つ必要です。)

```setting.json
"terminal.integrated.shell.windows": "絶対パス\\cmd.exe",
```

ちなみに僕は↓のようになっています。

```setting.json
"terminal.integrated.shell.windows": "C:\\WINDOWS\\System32\\cmd.exe",
```

<b>そして必ず保存をしてください！！！！！</b>※忘れがち（笑）

<h3>ターミナルか開けているか確認</h3>
何かしらの<b>.pyファイル</b>を用意して、`CTRL` + `SHIFT` + `@`を押して、現在のフォルダ(ディレクトリ)のターミナルを起動させてください。
そしてpythonと打って、↓のように対話型インタプリタモードになっていたら成功している証拠です！

```
>>>
```

<h2>実際にPythonファイルを起動させてみる</h2>
今回僕は<b>Oshimen.py</b>というファイルを<b>この記事のためだけに</b>用意してきました。

さて、気になる実行結果は...
![oshimen.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436088/9ad0bdc5-e060-7c51-60a6-7b4b4962e925.jpeg)

成功ですね！

<h2>さいごに</h2>
実行結果でついつい乃木オタであることがばれちゃいました…（照）

参考にしていただけたら幸いです。:thumbsup:
Goでmapをjson文字列に変換する

POSTのリクエストを送る際にリクエストボディをmapをjsonの`[]byte`型に変換したかったので試したメモ

```go
package main

import (
	"encoding/json"
	"fmt"
)

func main() {
	body := map[string]string{
		"name": "konchan",
	}

	bytes, err := json.Marshal(body)
	if err != nil {
		fmt.Println("JSON marshal error: ", err)
		return
	}

	fmt.Println(string(bytes))
}
```

## Playground

https://play.golang.org/p/Ql9_E3yUWCm
C++でナップサック問題をDP法で解いてみた

# はじめに
「数理最適化問題を解きたいなー」と思い，昨日は[最急降下法を解いた](https://qiita.com/ysuzuki19/items/09d108ce92d16c2a0b44)のですが，まだ解きたかったのでナップサック問題をDP(Dynamic Programming)法を使って解いてみました．

# ナップサック問題とは
端的に言うと、

「２つの定数（満足感/値段 etc.）を持つ商品がいくつかあり，使える金額の中で満足感を最大にする問題．」

である．

# DP法
動的計画法の事．細かい説明はできないので，他のページをみて欲しい．一言で言うと，

「表を作ってそれまでの選択肢から最大値を求め，それを更新していき，最後に結果が出る．そのとき，常に条件（上限金額）を満たすようにする．」

である．

# 問題
果物(fruits)という配列があり，各果物の(名前，満足度，値段）がわかっているものとする．ここでの値は自分で決めたものなので，深い意味はない．

それぞれの果物の在庫は１つとし，使える金額は１０円とする．

このときの最大の満足度を求める．

# プログラム
解くために，`sack`という２次元配列を準備し，果物を順に(買う/買わない)場合について満足度と金額を追加していった．便宜上，`sack[0]`には空の配列を，格納した.

```cpp:KnapsackProblem.cpp
#include <iostream>
#include <fstream>
#include <vector>
#include <iomanip>
using namespace std;

constexpr int MAX_MONEY = 10;

vector<tuple<string, int, int>> fr{
  // tuple ("fruit_name", satisfaction, value)
  make_tuple("", 0, 0),
  make_tuple("Apple", 5, 4),
  make_tuple("Amelanchier", 3, 3),
  make_tuple("Shipova", 2, 2),
  make_tuple("Melon", 8, 4),
  make_tuple("Cherry", 1, 1),
};

void view(const vector<vector<int>>& vv){
  for(const auto& v : vv){
    for(const auto& e : v){
      cout << setw(3) << e << " ";
    }
    cout << endl;
  }
}

int main(){
  vector<vector<int>> sack(fr.size(), vector<int>(MAX_MONEY+1));
  for(size_t i=1; i<sack.size(); ++i){
    for(size_t j=0; j<sack[i].size(); ++j) sack[i][j] = sack[i-1][j];
    sack[i][get<2>(fr[i])] = max(sack[i][get<2>(fr[i])], get<1>(fr[i]));
    for(size_t j=0; j<sack[i].size(); ++j){
      if(sack[i-1][j]!=0){
        if(j+get<2>(fr[i])<sack[i].size()){
          sack[i][j+get<2>(fr[i])] = max(sack[i][j+get<2>(fr[i])], sack[i-1][j]+get<1>(fr[i]));
        }
      }
    }
  }
  view(sack);
  return 0;
}
```

これを実行した場合，以下となった．これは，更新していった結果の表である．

```bash:output
  0   0   0   0   0   0   0   0   0   0   0 
  0   0   0   0   5   0   0   0   0   0   0 
  0   0   0   3   5   0   0   8   0   0   0 
  0   0   2   3   5   5   7   8   0  10   0 
  0   0   2   3   8   5  10  11  13  13  15 
  0   1   2   3   8   9  10  11  13  14  15 
```

となり，最大の満足度は15となった．

# おわりに
なんとか解けました．
少し無駄がありそうなので，気が向いた時に更新します．（`tuple`を使わない方がいいかも）
`string`を結合するなどして，選んだ果物を確認できるようにしようかなとは思っています．
HPEバージョンアップ方法

個人的なメモとして残します。


HPEのOS変更
OS取得（hpeのサイトで型番で調べると早い）
https://h10145.www1.hpe.com/Downloads/ProductsList.aspx?lang=&cc=&prodSeriesId=

設定方法
※tftpで取得するときは特権モードでは駄目。
※boot-loaderで起動OS指定するときに「flash:/」でTABを使用すると余分な半角が入る為、削除してから反映させたいファイル名を記載する事。

https://milestone-of-se.nesuke.com/product/hp-switch/firm-update/
https://www.belpia.com/hp-irf-9/
・HPE 5940-CMW710-R2510P02 Release Notes（P54～）
xvideos閲覧時に強制的にサザエさんのキャラクター紹介ページに遷移させるchrome拡張を作りました

こんにちは、ニート([@emono_dev](https://twitter.com/emono_dev))です。
タイトルの通り[xvideos](https://www.xvideos.com/) (会社やカフェでの閲覧注意) を見た際に、サザエさん公式ホームページのキャラ一覧ページに強制的にリダイレクトする[xblock](https://chrome.google.com/webstore/detail/xblock/llajifecehalipnfbehdcjpappgdjkpf)というchrome拡張を作成しました。
禁欲したい男性陣は是非使ってみてください。

chrome拡張作ったのは初めてで手探りだったのですが案外とさっくりできました。
リリースまでの流れを備忘録的な感じでメモしたいと思います。


## 実施したかったこと
めっちゃシンプルです。

- `https://www.xvideos.com/*` のページかどうか判定する。
- 判定にかかっていたら、サザエさん公式ホームページの[キャラクター紹介ページ](http://www.sazaesan.jp/charactors.html)にリダイレクトする。

<img width="663" alt="スクリーンショット 2019-06-12 14.42.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116518/d36feb9b-e494-1cca-0fd0-611a36fc6883.png">

以上です。ソースコードは[こちら](https://github.com/emono/xblock)

## 公式ドキュメントとか参考にしたページ
https://developer.chrome.com/extensions です。
これ見ればだいたいわかります。
以下も参考にしました。
https://qiita.com/mdstoy/items/9866544e37987337dc79
https://qiita.com/guru_taka/items/37a90766f4f845e963e5

## フォルダ構成
今回の拡張は以下のフィルダ構成です。viewがなければだいたいこんな感じになるのかなと思います。

manifest.json
main.js
icons
|--icon_128.png
|--icon_32.png
|--icon_48.png

## 各ファイルについて
`manifest.json`： 各種設定を書く**必須**ファイル(名前・説明・バージョン)
`main.js`: 実行するスクリプト
`png`: アイコンのファイル


## マニュフェストファイル
必須な設定ファイルです。
https://qiita.com/mdstoy/items/9866544e37987337dc79 を参考にしました

```manifest.json
{
  "manifest_version": 2, // 最新版が2
  "name": "xblock",  // 名前
  "short_name": "xblock", // 略称
  "version": "1.0.0", // バージョン
  "description": "xvideos redirect for japanese anime(sazaesan)", // 説明
  "icons": { // アイコン
    "32": "icons/icon_32.png", // アイコンの相対path
    "48": "icons/icon_48.png", / アイコンの相対path
    "128": "icons/icon_128.png" // アイコンの相対path
  },
  "content_scripts": [
    {
      "matches": [ // urlが以下の場合に
        "https://www.xvideos.com/*" 
      ],
      "js": [
        "main.js"　// main.jsを実行する
      ]
    }
  ]
}
```

## 実行するスクリプト
ファイル名は、 `manifest.json` で定義した名前

```main.js
document.OnLoad = start();
// リダイレクトする
function start() {
  location.href = "http://www.sazaesan.jp/charactors.html";
}
```

## 動作確認してみる
- `chrome://extensions/`
- `パッケージ化していない拡張機能を読み込み` クリック
![スクリーンショット 2019-06-12 21.11.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116518/fc223fdb-bf4b-9bbf-c613-362ea6cf98cf.png)
- 該当のディレクトリの選択


## リリースする
- https://chrome.google.com/webstore/developer/dashboard
- developerアカウント登録(初回登録: $5)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116518/baddb29f-a80d-1e65-0352-b4bbe90d4d74.png)
- zipでフォルダを固めてアップロード

## 最後に
えぇ――――っ!!
xvideos見るとか暇人なのかい――――っ!!

<img width="152" alt="スクリーンショット 2019-06-12 15.46.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116518/a5bc781c-0edf-20bf-63ff-7851c2b8f6fb.png">