OmniAICreator/Qiita-1.07M huggingface dataset:
Rails5.1.4でfullcalendarによるカレンダービューを実装

#gemのインストール
Gemfileに`momentjs-rails`と`fullcalendar-rails`を追記します。

```css:Gemfile
source 'https://rubygems.org'

gem 'rails', '5.1.4'
.
.
.
gem 'momentjs-rails'
gem 'fullcalendar-rails'
.
.
.
```

momentjsは日付処理に用いるgem（多分）で、fullcalendarは今回実装したいカレンダーの本体です。

追記したらインストールします。

```
> bundle install
```


続いて、app/assets/javascript/application.jsの`//= require_tree .`の前に、`//= require moment`と`//= require fullcalendar`を追記します。

```app/assets/javascript/application.js
.
.
.
//= require moment
//= require fullcalendar
//= require_tree .
```


最後に、app/assets/stylesheets/application.css.scssの先頭に以下のように`*= require fullcalendar`を追記します。
（自分の環境ではここがscssファイルだったのですが、cssファイルの方は記法が異なると思います。こちらを参考にどうぞ：https://qiita.com/Ryunosuke38/items/7ab24caf13ea0ca1f49c ）

```app/assets/stylesheets/application.css.scss
/*
 *= require fullcalendar
 */
.
.
.
```

ここで、サーバーを起動している場合は一度再起動を行ってください。


#calendarコントローラーの作成
railsコマンドからcalendarコントローラーを作成します。

```
> rails generate controller calendar
```

これにより生成されるapp/assers/javascripts/calendar.coffeeに以下のように編集します。

```app/assers/javascripts/calendar.coffee
$(document).on 'turbolinks:load', ->
  $('#calendar').fullCalendar {}
  return
```

これで表示する準備が整いました。

<details><summary>ちなみに...</summary>
<div>fullcalendarの使い方を調べていたら、ほぼどこでも以下のコードように紹介されていました。

```coffeescript:なんかおかしい挙動
$(document).ready ->
  $('#calendar').fullCalendar {}
  return
```

しかし、Rails5ではturbolinksというgemのせいで`$(document).ready`がうまく動かないらしいです。
具体的には、カレンダーを表示するページに遷移してから1度更新しないとカレンダーが表示されません。ここで小一時間費やしてむかついたので書いておきます。
以下のサイトで解決しました、感謝です。https://qiita.com/hiroyayamamo/items/b258acbaa089d9482c8a
</div>

##※追記
上記のcoffeeスクリプトですと、他ページからブラウザバックなどによって戻ってきた場合、2回描画が行われていまうバグを発見しました。
（https://teratail.com/questions/81758） を参考に、以下のように修正したところ、解決しました。

```app/assers/javascripts/calendar.coffee
$(document).on 'turbolinks:load', ->
  $('#calendar').fullCalendar {}
  return

$(document).on 'turbolinks:before-cache', ->
  $('#calendar').empty()
  return
```

#viewの作成
カレンダーを表示したいテンプレートに以下のhtmlコードを追記します。

```html:app/views/hoge.html.erb
<div id="calendar"></div>
```
ページを確認するとご覧のようなカレンダーが表示されているはずです。
![スクリーンショット 2018-03-06 17.17.36.png](https://qiita-image-store.s3.amazonaws.com/0/241589/1fd7015f-ae05-96e3-67ae-6d87554ddd73.png)


#おわりに
今後、このカレンダービューにスケジュールなどを入力し、データベースに反映させる実装を行いたいと考えています。

javascriptは全く勉強せず直感でやってるのでつらい




#参考URL
[FullCalendar](https://fullcalendar.io/)
[Ruby on Railsとfullcalendar pluginでGoogleカレンダークローンを作る(1)](https://qiita.com/siguremon/items/73651af19babd22fe012)
[application.scssにrequireなんちゃらを記述する際の方法](https://qiita.com/Ryunosuke38/items/7ab24caf13ea0ca1f49c)
[Rails5でjqueryを動かす方法](https://qiita.com/hiroyayamamo/items/b258acbaa089d9482c8a)
電子回路入門　７セグメントLED

#**はじめに**
[書籍](https://www.amazon.co.jp/%E9%9B%BB%E5%AD%90%E9%83%A8%E5%93%81%E3%81%94%E3%81%A8%E3%81%AE%E5%88%B6%E5%BE%A1%E3%82%92%E5%AD%A6%E3%81%B9%E3%82%8B-Raspberry-Pi-%E9%9B%BB%E5%AD%90%E5%B7%A5%E4%BD%9C%E5%AE%9F%E8%B7%B5%E8%AC%9B%E5%BA%A7-%E7%A6%8F%E7%94%B0/dp/4800711614)に沿って引き続き進めていきます。

#**7セグメントLEDとは**
こんなもの　↓　(Fritzingより)
![7セグメント.png](https://qiita-image-store.s3.amazonaws.com/0/195542/33d790fa-66de-3405-76ce-79de8d1ff948.png)
7つの数字を表すLED + 「.」のLED用のピン計８ピンと
上下真ん中のコモンピン２つのピンから成り立っています。

簡単に言うと８個のLEDが１つになったもの。

２種類のLEDがあり、カソード(-)がコモンになっているもの(図上)、アノード(+)がコモンになっているもの(図下)があります。
ちなみに今回はカソードコモンを使用します。

![7セグ_回路図.png](https://qiita-image-store.s3.amazonaws.com/0/195542/0d9189c4-2a72-b140-ff5a-13eb33f73633.png)

#**使用部品**
- PSoC 5LP
- 抵抗(100Ω)
- [74HC4511](http://akizukidenshi.com/catalog/g/gI-08878/)
  → 取り扱っていない？[TC4511BP](http://akizukidenshi.com/catalog/g/gI-14057/)でも代用できるはず。
- [7セグメントLED(カソードコモン)](http://akizukidenshi.com/catalog/g/gI-04125/)

#**0を表示してみる**
プログラム無しでとりあえず表示させてみます。
![０_ブレッドボード.png](https://qiita-image-store.s3.amazonaws.com/0/195542/14549621-6d09-05d9-7860-99f497e5de7a.png)
![０_回路図.png](https://qiita-image-store.s3.amazonaws.com/0/195542/664c7949-2511-f4fa-0d81-2087034b2588.png)

#**7セグドライバーを使用してみる**
ドライバーを使用すると、２進数を変換して表示できます。
下図で74HC4511の下から出ている線４本が2進数の信号になっています。
(0=GND, 1=5V)

| オレンジ | 緑 | 黄 | 茶 | 表示 |
|:-----------:|:------------:|:------------:|:------------:|:------------:|
| 0 | 0 | 0 | 0 | 0 |
| 0 | 0 | 0 | 1 | 1 |
| 0 | 0 | 1 | 0 | 2 |
| 0 | 0 | 1 | 1 | 3 |
| 0 | 1 | 0 | 0 | 4 |
| 0 | 1 | 0 | 1 | 5 |
| 0 | 1 | 1 | 0 | 6 |
| 0 | 1 | 1 | 1 | 7 |
| 1 | 0 | 0 | 0 | 8 |
| 1 | 0 | 0 | 1 | 9 |
…オレンジだけカタカナ

今回も0を表示させます。
![75HC_ブレッドボード.png](https://qiita-image-store.s3.amazonaws.com/0/195542/8b76c28a-14cc-0383-a1f7-02dc8bdfbbaa.png)
![74_0_回路図.png](https://qiita-image-store.s3.amazonaws.com/0/195542/46e4eeff-4537-0017-df3b-5885ffbcef58.png)

#**PSoCで制御する**
先ほど出ていた４本をPSoCへ接続します。
![7_ブレッドボード.png](https://qiita-image-store.s3.amazonaws.com/0/195542/0f2c6249-9384-be28-c123-724d199ecf87.png)

PSoCの設定を追加
TopDesign.cysch → Degital Output Pin → Number of pins を4へ変更してください(私は8にしましたが…８でも大丈夫です。)
![input.png](https://qiita-image-store.s3.amazonaws.com/0/195542/6497fc0a-0d49-b4c7-ec6a-b4c31b079023.png)

2を表示させるプログラム

```c
#include "project.h"
#include "stdio.h"

int main(void)
{
    CyGlobalIntEnable;
    for(;;)
    {
        LED_1_Write(2);
    }
}

```

すごく簡単です(o^―^o)
配線は大変ですが(´・ω・`)
Visual Studio Codeのテーマ毎にハイライト色を設定する

紺色の背景が好きなのでVSCodeで[Tomorrow Night Blue](https://github.com/Microsoft/vscode/tree/master/extensions/theme-tomorrow-night-blue)というテーマを使用しています。
選択文字列のハイライト色がわかりにくかったので設定変更しました。
そのときのメモです。

`Command+,`でユーザー設定を開き、こんな感じで設定を書く。

```json:settings.json
{
    "workbench.colorTheme": "Tomorrow Night Blue",
    "workbench.colorCustomizations": {
        "[Tomorrow Night Blue]": {
            "editor.selectionHighlightBackground": "#ffff0070",
            "editor.selectionBackground": "#00ff0060"
        }
    }
}
```

設定項目は見ればわかると思いますが、カラーコードの下2桁は透明度です。
数値が大きいほど不透明に近く、小さいほど透明度が高くなります。

変更後はこんな感じ。
<img width="771" alt="スクリーンショット 2018-03-06 17.16.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/54083/5c12bec4-c313-3de4-965d-b2ee4825acc0.png">


設定項目について詳しくはこちら。
https://code.visualstudio.com/docs/getstarted/theme-color-reference

テーマのカスタマイズについてはこちら。
https://code.visualstudio.com/docs/getstarted/themes#_customizing-a-color-theme
Homebrew で vim のかわりに macvim をターミナル上で使う

Homebrew にはターミナル版の vim と別に、GUIをサポートした macvim というパッケージも入っています。

実は macvim はコマンドラインでも動作します。GUIで動くかターミナルで動くかはコマンド名で判断しているので、 mvim のかわりに vim というコマンドで起動すればターミナル版が起動します。

両方インストールしている人は、 vim をアンインストールして vim -> mvim というシンボリックリンクを作れば少し軽量化することができます。

```
$ brew uninstall vim
Uninstalling /usr/local/Cellar/vim/8.0.1553_1... (1,429 files, 22.9MB)
$ cd /usr/local/bin
$ ln -sf ./mvim vim
```

これで vim を起動して、 `:version` を確認してみましょう。

```
VIM - Vi IMproved 8.0 (2016 Sep 12, compiled Mar  1 2018 23:02:28)
macOS version
Included patches: 1-1522
Compiled by Homebrew
Huge version with MacVim GUI.  Features included (+) or not (-):
...
```

ちなみに、 vim は ruby と perl に依存していますが、 macvim は依存していません。なので、 vim が使いたいだけで ruby と perl は macOS が提供するもので構わない人は、 `brew uninstall ruby perl` することができます。

```
$ brew info vim
...
==> Dependencies
Required: perl ✘, ruby ✘
Recommended: python ✔
Optional: gettext ✔, lua ✘, luajit ✔, python@2 ✘
...

$ brew info macvim
...
==> Dependencies
Recommended: cscope ✔, python ✔
Optional: lua ✘, luajit ✔, python@2 ✘
...
```
Q# 開発環境の構築とサンプル実行

# Q#とは
　量子コンピューティング用のプログラミング言語であり、2017年にマイクロソフトによって実装されました。Quantum Development Kitに含まれており、開発環境としてVisual Studioを利用できます。

# Quantum Development Kit（QDK）とは
　Microsoftから公開された量子コンピューター向けの開発キットです。キットには以下のものが含まれています。

- プログラミング言語「Q#」
- 量子コンピューティングのシミュレータ
- サンプルやライブラリなどのリソース

# 前提条件
　最低限以下の要件を満たしている必要があります。

- AVX拡張命令セットに対応したCPU
- Windows 64ビット環境

（ここではWindows環境を前提にしていますが、[QDKダウンロードサイト](https://www.microsoft.com/en-us/quantum/development-kit)にはfor macOS and Linuxがあるのでこれらの環境でも可能だと思います。）

# 環境構築
## 1.VisualStudio2017のインストール
　ここでは、学生や個人の開発者向けであれば無料で使用できるVisual Studio Community 2017を使用します。[VisualStudioダウンロードサイト](https://www.visualstudio.com/ja/downloads/)からダウンロードしてインストールしてください。
**※注意**：インストール時のワークロード選択画面で、「ユニバーサルWindowsプラットフォーム開発」と「.NETデスクトップ開発」の2つに必ずチェックをつけてインストールしてください。![TakeCareOfVisualStudio2017Install.png](https://qiita-image-store.s3.amazonaws.com/0/226319/bd091293-0b19-c55e-73f7-f8597382822c.png)

## 2.Quantum Development Kitのインストール
　[QDKダウンロードサイト](https://www.microsoft.com/en-us/quantum/development-kit)より、"Download for Windows"をクリック。
![Microsoft Quantum Development Kit1.png](https://qiita-image-store.s3.amazonaws.com/0/226319/9d614a27-9211-5200-0c8f-05f51be6c3e7.png)

　クリックすると下のようなページに移動するので、さらに"Download"をクリックすると、"QsharpVSIX.vsix"のDownloadが始まります。
![Microsoft Quantum Development Kit.png](https://qiita-image-store.s3.amazonaws.com/0/226319/e567b7a6-1697-e7ba-431e-135c13844531.png)

　Downloadが完了したら、"QsharpVSIX.vsix"を実行してインストールしてください。

　以上で環境構築は完了です。

# サンプル実行
　[GitHub Microsoft/Quantum](https://github.com/Microsoft/Quantum)のリポジトリをCloneやDownload ZIPなど任意の方法でDownloadして、VisualStudio2017のファイル ＞ 開く ＞ プロジェクト/ソリューションから"QsharpLibraries.sln"を開いてください。
　開いたら下図のように、ソリューションエクスプローラー ＞ Samples ＞ 0.Introduction ＞ TeleportationSample　で右クリック ＞ スタートアッププロジェクトに設定　をクリックして設定してください。
![TeleportationSample.png](https://qiita-image-store.s3.amazonaws.com/0/226319/294698c6-4928-d4fd-bf8f-94183b92e276.png)

設定後はソリューションを実行（F5）で実行するとテレポーテーションのサンプルが実行され、図のような結果がでれば成功です。（True or Falseは実行タイミングによって異なりますので気にしなくてOKです。）
![TeleportationSampleExecution.png](https://qiita-image-store.s3.amazonaws.com/0/226319/88dbc063-9630-49ff-a62b-876a1ebd3b61.png)

#まとめ
　特に複雑な設定もなく、インストーラーに従うだけで環境を構築することができました。みなさんも是非お試しあれ。
Firebase Cloud Functions


Firebase を使うとサーバ側のコードを書かなくても色々な事が出来るが、機能が足りない時に [Cloud Functions](https://firebase.google.com/docs/functions) というのを使ってちょっとした処理を行う事が出来る。試しに Firebase Admin API を使って JSON Web Token を発行してみた。

## 事前準備: 秘密鍵の発行

Cloud Functions だけなら必須ではないが、Firebase Admin API を使うために秘密鍵を発行する。

* Firebase Console > Settings (歯車) > SERVICE ACCOUNTS
* Generate New Private Key 
* Private Key がダウンロードされるので serviceAccountKey.json という名前で保存する。

## 環境のセットアップ

Cloud Functions にも firebase-tools が必要なので確認。

    npm install -g firebase-tools

現在のディレクトリに Cloud Functions プロジェクトを作る。

    firebase init functions

すでに現在のディレクトリで Firebase hosting を使っている場合は `firebase.json` に Cloud Functions の設定を追加してくれる。上書きで消される事は無い。言語として TypeScript を選ぶと適当に TypeScript 環境を設定してくれる。プログラムは functions/src/index.ts に関数を書く。

## JSON Web Token を発行する例

とりあえず何も考えず発行する。../config/serviceAccountKey.json に秘密鍵が置いてあること前提。

```typescript
import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';
const serviceAccount = require('../config/serviceAccountKey.json');

admin.initializeApp({
    // ...functions.config().firebase,
    credential: admin.credential.cert(serviceAccount),
});

let serial = 0;

export const getToken = functions.https.onRequest((req, res) => {
    serial++;
    const uid = `user-${serial}`;
    admin.auth().createCustomToken(uid, {})
        .then((token: string) => {
            console.log(token)
            res.send(token);
        })
        .catch((error: any) => {
            console.log("Error creating custom token:", error);
        });
});
```

テスト実行

    cd functions
    npm run build
    firebase serve --only functions

これで http://localhost:5000/physeter-idpoc/us-central1/getToken あたりにアクセスすると動作確認出来る。

hosting と functions 同時にローカルでテストしたい場合は

    firebase serve --only functions,hosting

のようにすると良い。localhost に functions hosting それぞれ別のポートでサービスが立ち上がり便利。

~~注意点としては、以前に Firebase hosting を `firebase serve` でテストした事がある場合、http://localhost:5000 にアクセスして Crtl + Reload でキャッシュをクリアする必要があった。キャッシュをクリアしないと古いコンテンツが見えてしまう。~~

デプロイ

    firebase deploy --only functions

ここで表示された URL にアクセスすると結果が表示される。

## コツ

functions/tsconfig.json に 以下のような typeRoots を入れないと親ディレクトリまで参照して面倒な事になる。-> ややこしいので hosting と functions は完全に分けるべきか。

```
  "compilerOptions": {
    ...
    "typeRoots": ["./node_modules/@types"]
    ...
  }
```

参考

* [Cloud Functions for Firebase](https://firebase.google.com/docs/functions)
PHP: A4 の PDF をマージして A3 にする

次のバージョンを使います。
>tcpdf 6.3.2
>FPDI 2.3.6

FPDI のダウンロード

```bash
wget https://www.setasign.com/downloads/2921760/FPDI-2.3.6.tgz
```

```php:pdf_merge.php
#! /usr/bin/php
<?php
// --------------------------------------------------------------------
/*

	pdf_merge.php

					Jun/09/2021


*/
// --------------------------------------------------------------------

use setasign\Fpdi\TcpdfFpdi;
use setasign\Fpdi;

require_once '/usr/share/php/tcpdf/tcpdf.php';
require_once 'FPDI-2.3.6/src/autoload.php';

error_reporting(E_ALL);
ini_set('display_errors', 1);

$pdf_in_a = $argv[1];
$pdf_in_b = $argv[2];
$pdf_out = $argv[3];

fputs (STDERR,"*** 開始 ***\n");

$pdf = new TcpdfFpdi('L', 'mm', 'A3', true, "UTF-8" );


if ($pdf instanceof \TCPDF) {
	$pdf->SetProtection(['print'], '', 'owner');
	$pdf->setPrintHeader(false);
	$pdf->setPrintFooter(false);
}


$pageCount = $pdf->setSourceFile($pdf_in_a);

$pageNo = 1;
$pdf->AddPage('landscape', 'A3');
$pageId = $pdf->importPage($pageNo, Fpdi\PdfReader\PageBoundaries::MEDIA_BOX);
$pdf->useTemplate($pageId, 0, 0, 210, 297);
$pdf->Rect(0, 0, 210, 297);

$pageCount = $pdf->setSourceFile($pdf_in_b);
$pageId = $pdf->importPage($pageNo, Fpdi\PdfReader\PageBoundaries::ART_BOX);
$ss = $pdf->useTemplate($pageId, 210, 0, 210, 297);
$pdf->Rect(210, 0, $ss['width'], $ss['height']);

$pdf->Output($pdf_out,'F');

fputs (STDERR,"*** 終了 ***\n");
// --------------------------------------------------------------------
?>
```

実行コマンド
入力 in01.pdf in02.pdf (A4)
出力　/tmp/out01.pdf (A3)

```bash
./pdf_merge.php in01.pdf in02.pdf /tmp/out01.pdf
```

実行するフォルダーに次のフォルダーへのシンボリックリンクが必要です。

```text
FPDI-2.3.6
```
Git Bashでfirebase loginする

# 問題点
Git Bashから`firebase login`しようとすると、以下のようなエラーが出力される。

```
$ firebase login

Error: Cannot run login in non-interactive mode. See login:ci to generate a token for use in non-interactive environments.
```

非インタラクティブモードでは`login`コマンドが実行できないっぽい。

# 対処法
`login`コマンドの後ろに`--interactive`をつけて以下のようにする。

```
$ firebase login --interactive
```

これでうまくいく。

ちなみに、ホスティングを中止するために`hosting:disable`コマンドを実行するときも同様で、

```
$ firebase hosting:disable
Error: Missing required options (confirm) while running in non-interactive mode:
- confirm Are you sure you want to disable Firebase Hosting?
  This will immediately make your site inaccessible!
```

上記のようなエラーが出る場合は

```
$ firebase hosting:disable --interactive
```

とする。

# 余談
firebaseの設定で以下のように選択する箇所がある。

```
 Which Firebase CLI features do you want to setup for this folder? Press Space to select features, then Enter to confirm your choices. (Press <space> to select)
>( ) Database: Deploy Firebase Realtime Database Rules
 ( ) Firestore: Deploy rules and create indexes for Firestore
 ( ) Functions: Configure and deploy Cloud Functions
 ( ) Hosting: Configure and deploy Firebase Hosting si
 ( ) Storage: Deploy Cloud Storage security rules
```

Git Bashだからなのかはわからないが、書いてある通りスペースを押しても選択できない。
そういう時は、数字で選択するといいっぽい。
例えば、`Hosting`を選択したいときは、`4`を入力する。

この方法だと直感的じゃなくて分かりにくいので、他の良い方法を教えてほしい...
Mint１８をe200haにインストールした際に行ったことの覚書

###まえがき
- 先日Mintをインストールし、いろいろセッティングをしたのでそれのメモ
[先日の記事](http://happy-internettu.hatenablog.com/entry/2018/02/09/221935)

#本体の設定
## はじめに
### 各種アップデート
- なによりも先にリポジトリを日本に変更
- ミントメニュー -> システム設定 -> ソフトウェアソース -> [ 公式リポジトリ ]

- まずはアプリの取得元を変更した後諸々のアップデート

```shell
sudo apt update && sudo apt upgrade
```

### ちゃちゃっと日本語化
```shell
wget -q http://packages.linuxmint-jp.net/linuxmint-ja-archive-keyring.gpg -O- | sudo apt-key add -
sudo wget http://packages.linuxmint-jp.net/sources.list.d/linuxmint-ja.list -O /etc/apt/sources.list.d/linuxmint-ja.list
sudo apt-get update
sudo apt-get dist-upgrade
```

### 日本語フォントをインストール
```shell
sudo apt-get install fonts-migmix fonts-ipamj-mincho fonts-horai-umefont fonts-takao xfonts-mona fonts-kouzan-mouhitsu fonts-konatsu
```
### ホームディレクトリのフォルダを英語表記に
```shell
LANG=C xdg-user-dirs-gtk-update
```

## e200haの音が出るように(e200ha以外はやらなくておｋ)
- インストールの際にコーデックをインストールのチェックを入れすでにインストールしている想定。してないのであれば

```shell
sudo apt-get install ubuntu-restricted-extras libavcodec-extra
```

- 自分の環境だとgit cloneができなかったので[ここ](https://github.com/Grippentech/Asus-E200HA-Linux-Post-Install-Script)からダウンロード解凍して,
- [Alt]+[Ctrl]+[T]でターミナルを開き
```shell
cd Downloads/Asus...
sudo chmod u+x e200ha_with_sound.sh
sudo ./e200ha_with_sound.sh
```
- これで再起動まで自動でやってくれる
- あとはミントメニュー ->サウンド ->ハードウェア->Intel~をオフにして,出力のコネクターをスピーカーかイヤホンに選択すればok


## 必須ソフト各種のインストール
- vim       :テキストエディタ。vim外でもvimのコマンドで移動しようとする体になってしまうのでダメ
- guake     :ドロップダウン型のターミナル。上からシュッと出てきて嬉しい
- shutter   :スクショツール。ショートカットを設定すると捗る。http://moebuntu.blog48.fc2.com/blog-entry-819.html
- glipper   :クリップボード拡張。履歴を表示したりできるらしい、履歴表示しか使ってないからほかはわからない。

## タッチパッドの感知範囲を設定する
- 自分の手だとタイピング中に手がタッチパッドに触れてしまいストレスだったので感知範囲を設定する。
- 
ここを参考にした。
https://qiita.com/uchan_nos/items/ccc4ef7e319cb6200cc9

## 各種ソフトのインストール（インストールしたソフトの覚書) 
- zsh
- tmux
- なんか適当にそのへん　oh-my-zshも入れたけどviをヌルサクで動かしたかったのでとっぱらった

## .vimrcの編集
- vim-plugを導入してから各種プラグインを導入。
- プラグインの導入

### vim-plug の導入
```shell
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
    https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
```
[ここを参考にした](https://qiita.com/jiminko/items/f4b337ab41db751388f7)

## wineを用いてKindle for PCの導入
- ここで躓いていろいろゴッチャになって手がつけられなくなったので初期化。

編集提案？ありがとうございます。Qiiiaこんなのもあるんですね...すごい...
Unreal Engine 4メモ：Worldを取得する

#GetWorldメソッドが無いオブジェクトでも取得したい
GetWorldメソッドを持たないオブジェクトは下記で取得可能ですが受け渡すObject引数は何でも良いのでしょうか？
world contextでなければならないとドキュメントには書いてあります。

```c++:Sample.cpp
UWorld * World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull);
```

#world contextとは
world contextとはずばりワールドに配置されたオブジェクトです。Unreal Engineで使用するインスタンスは大きくオブジェクトとアクタの2種類に分けられ、特にワールドに配置するものを「アクタ」と呼んでいます。
つまり、world contextとは「アクタ」の事です。

さて、GetWorldを持っているオブジェクトってどんなだっけ？というとやはり「アクタ」なオブジェクトの事です。
つまりワールドに配置しているオブジェクトだからワールドの情報を取れるということですね。結局のところアクタが無ければワールド情報は取れません。

#参照
[UEngine::GetWorldFromContextObjectChecked](https://docs.unrealengine.com/latest/INT/API/Runtime/Engine/Engine/UEngine/GetWorldFromContextObjectChecked/)
[UE4 ANSWER HUB / Timer crashes in Blueprint classes inherited from Object](https://answers.unrealengine.com/questions/362928/timer-crashes-in-blueprint-classes-inherited-from.html?sort=oldest)
zPlugの入力補完が熱すぎる

[ZPlug](https://github.com/zplug/zplug)
まずは上記にしたがってダウンロードとインストール

```
# path to export rbenv
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init - zsh)"

# path to export pyenv
export PYENV_ROOT=$HOME/.pyenv
export PATH=$PYENV_ROOT/bin:$PATH
eval "$(pyenv init -)"

# configuration for compress
fpath=($(brew --prefix)/share/zsh/site-functions $fpath)
autoload -U compinit
compinit -u

# zplug
source ~/.zplug/init.zsh
zplug 'zplug/zplug', hook-build:'zplug --self-manage'
# theme (https://github.com/sindresorhus/pure#zplug)　好みのスキーマをいれてくだされ。
zplug "mafredri/zsh-async"
#zplug "sindresorhus/pure"
# 構文のハイライト(https://github.com/zsh-users/zsh-syntax-highlighting)
zplug "zsh-users/zsh-syntax-highlighting"
# history関係
zplug "zsh-users/zsh-history-substring-search"
# タイプ補完
zplug "zsh-users/zsh-autosuggestions"
zplug "zsh-users/zsh-completions"
zplug "chrissicool/zsh-256color"
# Install plugins if there are plugins that have not been installed
if ! zplug check --verbose; then
  printf "Install? [y/N]: "
  if read -q; then
    echo; zplug install
  fi
fi
# 「ユーザ名/リポジトリ名」で記述し、ダブルクォートで見やすく括る（括らなくてもいい）
#zplug "zsh-users/zsh-syntax-highlighting"
#zplug "zsh-users/zsh-history-substring-search"

# Then, source plugins and add commands to $PATH
zplug load

# added alias
alias updatedb='sudo /usr/libexec/locate.updatedb'

# add more rows
HISTSIZE=10000
SAVEHIST=$HISTSIZE

# aws auto complete
autoload -U bashcompinit
source /usr/local/bin/aws_zsh_completer.sh
```
footerを常に最下部に固定する方法(簡単)

コンテンツ量が多い時も少ない時も、footerを常に最下部に持ってきたい。
そんな所で結構つまづいてしまったので自分用にメモ。

html・cssの記述は以下

```html:test.html
<body>
  <div id="wrapper">
    <main>
 
      　<!--コンテンツの記述-->
 
    </main>
 
    <footer>
 
      　<!--フッターの記述-->
 
    </footer>
  </div>
</body>
```

```css:test.css
body,
#wrapper {
  display: flex;
  flex-direction: column;
  min-height: 100vh;
}
 
footer {
  margin-top: auto;
}
```

他にもやり方は色々あると思いますが
このやり方だといじる所も少なくて簡単にできました。
chrome で帯域制限を行う

デベロッパーツールを呼び出す
![image.png](https://qiita-image-store.s3.amazonaws.com/0/242268/78a89218-ca50-e25c-12b6-6b2582b26418.png)

デベロッパーツールのSettingsを選ぶ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/242268/96346f5b-9429-d34b-8a87-18eeb00ec3fd.png)

SettingsのThrottlingを選ぶ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/242268/3df01712-c725-fe3a-d812-fa92392dc8a5.png)

プロファイルを作成する。ダウンロード速度、アップロード速度、レイテンシー（遅延）の値を設定する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/242268/35345a45-069b-2d84-5170-08e5b5bc86e9.png)

ここでは適当に My test というプロファイル名にした、Add で作成
![image.png](https://qiita-image-store.s3.amazonaws.com/0/242268/6bfca4bd-7acf-6718-be5e-4bce35154110.png)

My test というプロファイルが作成されると以下のような表示になる
![image.png](https://qiita-image-store.s3.amazonaws.com/0/242268/94e88249-dd1d-0d88-a888-2053af76cf99.png)

デベロッパーツールに戻って、幅を広げて、ネットワークタブ、Onlineを選ぶ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/242268/5fa17445-54b2-d029-f754-3c34221c6544.png)

トラフィック制限をかける
![image.png](https://qiita-image-store.s3.amazonaws.com/0/242268/6e9e9a45-ca07-8b65-ed71-ba1f072fdaf9.png)
SwiftyJSON 3系 → v4.0.0 にshimを

# tl;dr

[JSON(data:options:)](https://github.com/SwiftyJSON/SwiftyJSON/pull/833)の挙動が変わったが、前の挙動を再現する[`extension`](https://gist.github.com/execjosh/f9efb7a66f70ed8b4d343a476a610534)を作る事でコードベースを変更しなくてよく済んだ。

# 武勇伝

## プロジェクトの現状

- Swift 3
- SwiftJSON v3.1.4 固定
- コードベースがデカい

```
$ pod outdated
The following pod updates are available:
- SwiftyJSON 3.1.4 -> 3.1.4 (latest version 4.0.0)
```

やっぱり最新版を使いたい。

## 取り敢えず上げる

- Podfile編集
- `pod update SwiftJSON`

OK。ビルドしてみよう。

```
Call can throw, but it is not marked with 'try' and the error is not handled
```

## コンパイルエラーは出まくる

なんでやねんｗｗｗｗ

まあ、そうやなぁ、メジャーバージョンアップやもんな。

## 何が変わった？

> SwiftyJSON now use throws for error handling

`JSON(data:options:)` がこれまでは例外を握り潰していたらしい。しかし、それではよくないと。例外をスルーするから `try` を使わなければいけないと。

なるほど。

レガシーなコードベースで `JSON(data:options:)` が `nil` を返さない前提で作られているから、やたらと `(try? JSON(data: data)) ?? JSON(jsonObject: NSNull())` を振り回してみても直ぐ数百箇所のdiffががが、、、、、、

## そうだ `extension` を作ろう！

一旦、以前の挙動を維持する為に `extension` を活かすことにした。

不幸中の幸い、 `options` 引数を一切使っていないので新規に生やすのがとても簡単だった。

```swift:SwiftyJSONExtensions.swift
import SwiftyJSON

public extension JSON {
    // Compatiblility shim for updating to SwiftyJSON v4.0.0
    // See changes introduced by: https://github.com/SwiftyJSON/SwiftyJSON/pull/833
    init(data: Data) {
        do {
            try self.init(data: data, options: [])
        } catch {
            self.init(jsonObject: NSNull())
        }
    }
}
```

# おわり

こういう時に `extension` がテラ便利だよな！変更箇所が少なく済んでよかった。ちょっとずつ新しい挙動に乗り換える余裕ができた。
ubuntu16.04LTS/apache2/django で wsgi

いつもながら apache2 / wsgiで django app を起動設定するのに苦労したのでメモ。

症状
- httpsで繋がらない。 HTTP 500エラーが帰る。

確認手順
1) firewallでブロックしていないか`sudo ufw status`で確認する。 `443                        ALLOW       Anywhere`などがあれば、通常のHTTPアクセスが可能。 なければ、ポートを使えるように設定する。(`sudo ufw allow from any to any port 443`)
2) /var/log/apache2/error.log や /var/log/apache2/access.logにエラーがないか？　あればそれを調べる。
3) port 443 (HTTPS)をlistenしているプロセスがあるか`sudo lsof -i4TCP`で確認する。 443で聞いているプロセスがない場合は、wsgi,sslの設定を確認する。
4) wsgiは有効になっている？https://qiita.com/shigechioyo/items/2b25f60918be6b81581a などに沿って有効化する。あとで分からなくなるといけないので、venv(virtualenv)下で、pipでインストールするのがおすすめ。 /etc/apache2/mods-available/wsgi.loadファイルをpip でインストールしたwsgiのパスに合わせて定義する必要があるので注意。作成したvenvディレクトリの内部をさすようになる。

私の例では、 4)でerror.logに次のログが出た。
>[Tue Mar 06 14:32:30.116164 2018] [wsgi:error] [pid 2170:tid xxx140125119969024] (2)No such file or directory: [client xxxxxx:63036] mod_wsgi (pid=2170): Unable to connect to WSGI daemon process 'xxxxx.yukilab.cc' on '/etc/apache2/run/wsgi.2167.0.1.sock' as user with uid=33., referer: https://xxxxxxx.yukilab.cc/

5) `sudo apachectl configtest`してみる。通ればOK。通らなかったら直す。
6) WSGISocketPrefix のディフォルトは run/wsgiになっているが、ubuntuではそれでは root以外利用できないので、 /var/run/wsgiに修正したあと、`sudo service apache2 restart`　する。ここでエラーが発生せず、接続できるようになった。　（参考： https://code.google.com/archive/p/modwsgi/wikis/ConfigurationIssues.wiki )

まだ、アプリケーションレベルのエラーがあるけど、apache/wsgiの設定は終了！
iのi乗の値は？

```math
\begin{align}
i&= \text{cos}\left(\frac{4n\pi+1}{2}\right)+i\text{sin}\left(\frac{4n\pi+1}{2}\right)\ (n∈\mathbb{Z})\\
i^i&=\text{cos}\left(\frac{4n\pi+1}{2}i\right)+i\text{sin}\left(\frac{4n\pi+1}{2}i\right)\\
&また，e^{i\theta}=\text{cos}\theta+i\text{sin}\theta より\\
i^i&=e^{i\left(\frac{4n\pi+1}{2}i\right)}\\
&=e^\left(-\frac{4n\pi+1}{2}\right)\\
&=\frac{1}{e^{\frac{4n\pi+1}{2}}}∈\mathbb{R}
\end{align}
```
Herokuに独自ドメイン割り当て（お名前.com共用サーバー編）

#やりたいこと
Heorkuにデプロイしたアプリケーションに独自ドメインを割り当てたい。
今回はお名前.comの共用サーバーを利用している人向けです。

※共用サーバーを利用していると微妙に手順が違うみたいです。今回はそれを書きます。

#やり方

ターミナルでHerokuにログインした状態で、

```
$ heroku domains:add　（独自ドメイン）
```

次に**お名前.comにログインしてDNSをクリック**します。

この次が注意点です。写真の**「共用サーバーで利用されているドメインのDNS設定」をクリック**して次へを押してください。

![スクリーンショット 2018-03-06 15.01.07.png](https://qiita-image-store.s3.amazonaws.com/0/240838/2f9bc348-a2b1-058c-234b-2860bf4a9dac.png)

そしたら対象のドメインを選択するとこの画面になるので**「独自ドメイン設定」をクリック**します。
![スクリーンショット 2018-03-06 15.05.29.png](https://qiita-image-store.s3.amazonaws.com/0/240838/e1a5461c-2a92-1da5-2e98-942259f4e111.png)

すると対象のドメインが出てくるのでそれの**「DNS設定」をクリック。**
※サブドメインなどを利用する場合はこの画面からできます。

![スクリーンショット 2018-03-06 15.05.57.png](https://qiita-image-store.s3.amazonaws.com/0/240838/07508e83-1cb2-54c1-08d5-7d3be15eed45.png)

**遷移先でホスト名がwwwのところを変更**します。

![スクリーンショット 2018-03-06 15.06.25.png](https://qiita-image-store.s3.amazonaws.com/0/240838/cc450231-8c86-894a-fa03-0b5988b6863b.png)


ここでターミナルで

```
$ heroku domains
```

のコマンドを実行すると、
![スクリーンショット 2018-03-06 15.03.36.png](https://qiita-image-store.s3.amazonaws.com/0/240838/56d2a86a-2977-989d-577d-ff116a159104.png)

こんな感じのが出てきます。これの**DNS Targetをコピーしてし下の画面で「レコードタイプ」をCNAMEに変更**し
指定先に**先ほどのDNS Targetをペースト**して完了したら設定終了です。お疲れ様でした。
![スクリーンショット 2018-03-06 15.10.57.png](https://qiita-image-store.s3.amazonaws.com/0/240838/8c79d1ae-ac73-4a29-af5b-24530c3b83d0.png)
pgroongaでレコードを更新するとgroongaインデクスには多重で登録されてるくさい（解決しました。

下記のようなテーブル

    CREATE TABLE "test_data" (
        "id" serial NOT NULL PRIMARY KEY,
        "some_value" integer NOT NULL,
        "some_flg" boolean NOT NULL
    );
    CREATE INDEX "pgroonga_test_index" ON "test_data" USING pgroonga ("id","some_value","some_flg");

下記のようなレコードを登録する

    INSERT INTO test_data VALUES(1,1,'t');
    INSERT INTO test_data VALUES(2,2,'f');
    INSERT INTO test_data VALUES(5,5,'f');

とりあえずSELECT

    SELECT pgroonga_command('select テーブル名 --output_columns _id,id,some_flg ');
結果は下記

    [1,1,true],[2,2,false],[3,5,false]
ここでbooleanをUPDATEする

    UPDATE test_data SET some_flg='t';

すると結果は

    SELECT pgroonga_command('select テーブル名 --output_columns _id,id,some_flg ');
    [1,1,true],[2,2,false],[3,5,false],[4,2,true],[5,5,true]

booleanがだめなのかなとおもったけど

    UPDATE test_data SET some_value=999;
    SELECT pgroonga_command('select テーブル名 --output_columns _id,id,some_value');
    [1,1,1],[2,2,2],[3,5,5],[4,2,2],[5,5,5],[6,1,999],[7,2,999],[8,5,999]

intでも同様
おそらくpgroongaでレコードがUPDATEされたときに
{"id":1,"some_value":999,"some_flg":1}
でloadされてて_idが指定されてないのかな？
UPDATEのたびに
drilldownの結果がどんどんずれていくでござる。

#以下追記

    SELECT pgroonga_command('select  テーブル名 --output_columns _id,id,some_value --query id:1);
    [1,1,1],[6,1,999]

こんな感じでid=1のレコードが重複していたのが

    --filter "pgroonga_tuple_is_alive(ctid)"'

をくわえることで解決しました。

    SELECT pgroonga_command('select  テーブル名 --output_columns _id,id,some_value --query id:1 --filter "pgroonga_tuple_is_alive(ctid)"');
    [6,1,999]

やったぜ大勝利🍣
同一のTaskDefinitionを環境変数を変えてECSクラスタ上で実行するベスト・プラクティス（模索中）

AWS BatchやAWS Fargateについてはまだ詳細な調査ができていませんので。現状のお話。

Lambdaから、連続して `run_task` を実行したとする。
しかし、TaskDefinitionで定義しているメモリなどリソースが足りない場合、起動に失敗してしまうため、ここについては対策を考えたい。

環境変数を書き換えるには、 `overrides` 引数に `ContainerOverrides` を渡してあげればよい。
複数のTaskを起動したい場合は、`try` 以下をループする

```python
client = boto3.client("ecs")
try:
  while flg:
    client.run_task(
      cluster="CLUSTERARNXXXX",
      taskDefinition="task-definition-name",
      overrides={
        "containerOverrides":[{
          "name": "container-name",
          "environment": [
            {"name": "XXX", "value": "XXX"}
          ]
        }]
      },
      count=1
    )   
```

次に、タスクが終了した際に、不要になったインスタンスを停止したい。

```python

ecs = boto.client("ecs")
lci = ecs_client.list_container_instances(cluster="CLUSTERARN", status="ACTIVE")
num = len(lci) - 1
client = boto3.client("autoscaling")
response = client.update_auto_scaling_group(
  AutoScalingGroupName="GROUPNAME",
  MinSize=num,
  DesiedCapacity=num
)
```

ECSはTaskを動かしているインスタンスを強制的に停止することはないので、この方法で台数を最適な数に減らすことができる。
簡単にホームページ的なもの作りたい場合の選択肢

### Qiitaなどの記事公開サービス

一番手軽。文字数制限のない、数式を表示できるTwitterの延長みたいな感じ。
エンジニアなどに目をつけてもらいやすい。
例）https://qiita.com/Esfahan/items/ab63e7c5bcf812dff2a9


### はてなブログ、Tumblr、WordPress.com などの無料ブログ作成サービス

こちらも手軽、デザインはいいの多いけど、いくつかの中から選ぶ感じ。
これもソーシャル機能があるので、目をつけてもらいやすい。
例）http://su-hai.hatenablog.com/


### Seesaawiki などのWiki作成サービス

こちらも手軽、ただ、デザインはあんまりよくない。不特定多数で更新するのに便利。
例）https://www52.atwiki.jp/sms20120113/


### Wix, Jimdooなどのホームページ作成サービス

簡単に自分である程度デザインを作ったそれなりのホームページが作れる。
デザインを綺麗に整えるには頑張らないといけないかも。


### GitHub Pages を使う

0 からHTMLを書いたり、静的サイトジェネレータを使ったり、Markdownで書くことで無料でページを公開できる。
デザインに関しての自由度が最も高く、覚えること少し多いけど、実社会でエンジニアが実際に使っている技術ばかりなので、まあまあおすすめ。
ただ、コメント機能など、双方向の機能が基本的に使えない。


### WordPressをレンタルサーバーでホスト

真剣にやってる大人が選ぶのはだいたいこれ。サーバーを用意しないといけないので、この方法だけ維持費が無料ではない。
例）https://mathtrain.jp/
How to Setup Static IP in the Ubuntu Server 16.04 LTS ?

# 1. Setup Static IP
```
# sudo vim /etc/network/interfaces
...
...
...
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto enp0s3
iface enp0s3 inet static <---- dhcp to static
address 192.168.0.200    <---- your IP
netmask 255.255.255.0    <---- your Netmask
broadcast 192.168.0.255  <---- your boardcast
gateway 192.168.0.1      <---- your gateway
...
...
...
!wq
```

# 2. Setup DNS
```
# sudo vim /etc/resolvconf/resolv.conf.d/base
...
...
...
meserver 8.8.8.8
nameserver 8.8.4.4
...
...
...

!wq
```

# 3. Restart Network
```
# sudo systemctl restart networking.service
```
Puppeteerでdialog OK後のdialogを捕捉


# 動作検証環境

Puppeteer 1.1.1

# コード

```js
const puppeteer = require('puppeteer');
const assert = require('assert');
(async () => {
// 中略
    await page.once('dialog', async dialog => {
        console.log(dialog.message());
        assert.equal(dialog.message(), '一回目だよ')

        // OK後のアラートを設定
        await page.once('dialog', async dialog => {
            console.log(dialog.message());
            assert.equal(dialog.message(), '二回目だよ')
            await dialog.accept();
        })

        await dialog.accept();
    });
    await page.click('#ダイアログを起こすclickイベントがある要素');
})();
```


# ダメな例

```js
await page.once(/**/);
await page.click(/**/);
await page.once(/**/);
```

実行速度にもよるだろうが、最初のdialogに両方のイベントが引っ掛かった。
Redmine 0.9.6のチケットcsvエクスポートに履歴を含める


バージョンも古く情報もそこかしこにあるのでいまさら書くことでもないと思うが、備忘録として。

# 要件

複数あるRedmineの統合をしたいので、チケットの移行をしたい。

# プラグイン系を試そうとする

ネット上に履歴を含めチケットエクスポートできるプラグインは幾つか見つかった。しかし0.9.6なんて骨董品にマッチしているものはなく、また履歴を一つのカラムにまとめて入れるようなプラグインもなかった。そのためプラグインは諦める。

# コードに直接手を入れる

このとき選択肢は幾つかあった。プラグインを一から書くなりフォークするなりして頑張る。もしくはredmineのバージョンをあげるかである。

しかし、今更0.9.6に向けたプラグインなんて需要があるわけもなく（ないよね？）、redmineのバージョンをあげるのはちょっとこわい。

ので、元々あったチケットのcsvエクスポート機能に手を入れることにした。参考にしたのは[こちら](http://www.hiihah.info/index.php?Redmineのチケット情報に履歴を出力)。まったく同じとはいかなかったが、大変参考になりました。

## コード

以下のようになった。rubyは普段描かないから変な書き方になってるのは許して。

```ruby:app/helpers/issues_helper.rb
      # 195行目付近
      # csv lines
      issues.each do |issue|
        fields = [issue.id,
                  issue.status.name,
                  issue.project.name,
                  issue.tracker.name,
                  issue.priority.name,
                  issue.subject,
                  issue.assigned_to,
                  issue.category,
                  issue.fixed_version,
                  issue.author.name,
                  format_date(issue.start_date),
                  format_date(issue.due_date),
                  issue.done_ratio,
                  issue.estimated_hours.to_s.gsub('.', decimal_separator),
                  format_time(issue.created_on),
                  format_time(issue.updated_on)
                  ]
        custom_fields.each {|f| fields << show_value(issue.custom_value_for(f)) }
        fields << issue.description
## 変更部分ここから
        tmp = ""

        Journal.find(:all,
                     :conditions => ["journalized_id= ?", issue.id],
                     :order => :created_on).map().uniq.each do |jn|
                     #:order => :created_on).map(&:notes).uniq.each do |note|
          datetime_string = jn.created_on.strftime("%Y-%m-%d %H:%m")
          if jn.notes != "" then
            tmp += "#{datetime_string}\n"
            tmp += "#{jn.notes}\n"
            tmp += "--------------------\n"
          end
        end
        fields << tmp
## ここまで

        csv << fields.collect {|c| begin; ic.iconv(c.to_s); rescue; c.to_s; end }
      end
    end
    export
  end
end
```

# 終わりに

直接コードに手を入れるなんて鳥肌が立つ感じがしたけれど、壊してもいい環境を作ってやることにしました。致し方なし。

次はプラグインとして、ある程度新しいバージョンに対応したものを書きたい。
BLEパケットをキャプチャする

# 必要なもの

- [nRF51822搭載 Bluefruit LE Sniffer](https://www.switch-science.com/catalog/3347/) - 3,499円

# 動作確認した時の環境

- Windows 10 Home(64bit)
- nRF-Sniffer-v2 - v2.0.0-1.beta
- Wireshark - v2.4.4

nRF-Sniffer-v2はmacでも動作すると書いてあるのですが、私がmacOS High Sierraで環境構築した時は動作しませんでした。具体的にはWiresharkのInterfaceToolbarsが表示されませんでした。

# 環境構築手順

## Bluefruit LE SnifferのUSBドライバをインストール

以下のリンクからドライバをダウンロード+インストールします。
https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers

## Python2.7 + ライブラリをインストール

以下のサイトから、Python2.7.X(現時点では2.7.14)をダウンロード+インストール。
https://www.python.org/downloads/

システム環境変数のPathに以下を追加します。

- C:\Python27
- C:\Python27\Scripts

次に、必要なpythonのライブラリをpipでインストールします。(pipはpythonに付属しているので、別途インストールする必要はありません）

コマンドプロンプトで以下のコマンドを入力します。

```
pip install pyserial
```

## nRF-Sniffer-v2のインストール

以下のサイトからnRF-Sniffer-v2(2.0.0-1.beta)をダウンロード+インストールします。
http://www.nordicsemi.com/eng/Products/Bluetooth-low-energy/nRF-Sniffer

上記のサイトから[ユーザーガイド](http://www.nordicsemi.com/eng/nordic/download_resource/65244/2/89418832/136165)(nRF-Sniffer-UG-v2: v2.1)もダウンロード出来ます。これ以降の環境構築はユーザーガイドに従ってください。 


# 参考サイト

- [Raspberry Pi 3でのBLEのパケット構造解析](https://tomosoft.jp/design/?p=7385)
- [Reverse Engineering a Bluetooth Low Energy Light Bulb](https://learn.adafruit.com/reverse-engineering-a-bluetooth-low-energy-light-bulb/overview)
いろいろ調べながらselenium使ってみたから後からまた使いたくなった時用のメモ(python)

#はじめに
[環境]
・Mac OS X EI Capitan 10.11.6

#準備
###Seleniumモジュールのインポート

```python
from selenium import webdriver
```

###Chromeを開く
```python
driver = webdriver.Chrome()
```

###URLからページを開く
```python
driver.get("開きたいページのURL")
```

#ページの要素

###要素を見つける
基本的に

```python
driver.find_element_by_?(?)
```
の形を使用する

|コード|機能|
|:---|:---|
|by_id(_id_)|id属性が_id_である要素|
|by_class_name(_name_)|クラス名が_name_の要素|
|by_name(_name_)|タグ内のname属性が一致する要素|
|by_tag_name(_name_)|タグ名が一致する要素|
|by_link_text(_text_)|テキストに完全一致する要素|
|by_partial_link_text(_text_)|テキストに部分一致する要素|
|by_xpath(path)|xpathが一致する要素|

xpathは，ページの見つけたい要素から「検証」を選択し，タグを「Copy」→「Copy XPath」とすることで取得できる

###要素に対してアクション
・要素上でマウスをクリックする [.click()]

```python
driver.find_element_by_?(?).click()
```

・フォームを記入する [.send_keys('?')]

```python
driver.find_element_by_?(?).send_keys('記入したい文字')
```

・キーを入力する [.send_keys(?)]

```python
# モジュールをインポート
from selenium.webdriver.common.keys import Keys
# キーを送信
driver.find_element_by_?(?).send_keys(Keys.?)
```
主なキー

|コード|機能|
|:--|:--|
|Keys.DOWN|矢印下|
|Keys.UP|矢印上|
|Keys.LEFT|矢印左|
|Keys.RIGHT|矢印右|
|Keys.ENTER|エンターキー|
|Keys.RETURN|リターンキー|
|Keys.ESCAPE|Escキー|
|Keys.TAB|タブキー|

・内部テキストを取得 [.text]

```python
driver.find_element_by_?(?).text
```

・inputタグなどのテキスト消去 [.clear]

```python
driver.find_element_by_?(?).clear()
```

・要素が存在するかどうか [try:~]

```python
try:
    driver.find_element_by_?(?)
# 要素が存在しない場合
except:
    print('要素は見つかりませんでした')
```
###ブラウザ上のボタンをクリック 

|コード|機能|
|:--|:--|
|driver.back()|「戻る」ボタンをクリック|
|driver.forward()|「進む」ボタンをクリック|
|driver.refrash()|「再読み込み」ボタンをクリック|
|driver.quit()|「ウィンドウを閉じる」ボタンをクリック|

以上です

#参考
<a href="http://www.seleniumqref.com/api/webdriver_gyaku.html">Selenium クイックリファレンス</a>
NanoWalletで読み込めるQRコードを作成する

pythonを使ってNanoWalletで読み込めるQRコードを作ろうとしたら少し詰まったので備忘録として残しておきます．
pythonでQRコードを作成することができるAPIを探してみると

- qrcode 
- pyqrcode
- pygooglechart

の3種類が見つかりました．
一番簡単そうなのは`pygooglechart`かなと思ったのですが
公式で非推奨ということなので泣く泣く諦め今回は`qrcode`を使用することにしました．

とりあえず必要なqrcodeをインストールします.

```
pip install qrcode
```

下準備は以上になります．
後はただQRコードを作成するだけなのですが，どうもNanoWalletで使わている言語がシングルクォーテーションとダブルクォーテーションで意味が違うみたいで読み込んでくれない(phpかな．．．)
pythonの場合ダブルクォーテーションで囲んでもQRコードにするとシングルクォーテーションになるみたいなのでここで少しつまりました．．．
あとは`qrcode.make("ここにデータを記載")`だけでもQRコードは作成できるのですがこれだと上手く読み込めないみたいです．

シンプルに読み込めるQRコードを作成するコードは以下のようになります

```python:nem_qr.py
#-*- codong: utf-8 -*- 
import qrcode

address = "walletのアドレス"
mosaic = 1000000
send_amount = 100 * mosaic 
message = "test"
wallet_name = "test"

if __name__ == '__main__':
    qrdata = '{"v":2,"type":2,"data":{"addr":"' + address + '","amount":' + str(send_amount) + ',"msg":"' + message + '","name":"' + wallet_name + '"}}'
    #qrdata = '{"v":2,"type":2,"data":{"addr":"walletのアドレス","amount":5000000,"msg":"test","name":"test"}}'

    QR = qrcode.QRCode(
            version=2,
            error_correction=qrcode.constants.ERROR_CORRECT_L,
            box_size=6,
            border=4,
            )

    QR.add_data(qrdata)
    QR.make(fit=True)
    img = QR.make_image(fill_color="white", back_color="black")
    img.save('qr.bmp')
```

1Nemを贈りたい場合は1000000倍しないとダメみたいです．
CSSのみで作る幅可変ツールチップ

# コード

HTML

```html
<button>ボタン<span class="tooltip"><span class="text">テキスト</span></span></button>
```

CSS

```css
button {
	position: relative;
}
.tooltip {
	visibility: hidden;
	text-align: center;
	position: absolute;
	z-index: 1;
	opacity: 0;
	transition: opacity 500ms;
	width: 120px;
	bottom: 125%;
	left: 50%; 
	margin-left: -60px;
}
.tooltip > .text {
	background-color: black;
	color: #fff;
	padding: 5px 10px;
	border-radius: 6px;
	font-size: 12px;
	display: inline-block;
}
.tooltip > .text::after {
	content: " ";
	position: absolute;
	top: 100%;
	left: 50%;
	margin-left: -5px;
	border-width: 5px;
	border-style: solid;
	border-color: black transparent transparent transparent;
}
button:hover > .tooltip {
	visibility: visible;
	opacity: 1;
}
```

ポイントは`.tooltip`を幅固定にし、その中で幅可変な`.text`を置き、`.text`の方で背景色を設定するところです。

[CSS Tooltip](https://www.w3schools.com/css/css_tooltip.asp)では`.tooltip`に直接テキストを置いているため幅が固定されてしまい、短いテキストの場合大きな余白が生まれてしまいますが、上記のように外側（透過）と内側（テキスト＋背景色）の2層構造にすればテキストの幅に合わせてツールチップの幅が決まります。

ツールチップの外側は以下のように幅を設定し、その半分の値の左マージンと、親要素の左半分の位置（水平方向の中心）を設定することでツールチップの中心と親要素の中心を合わせます。

```css
.tooltip {
	width: 120px;
	left: 50%; 
	margin-left: -60px;
}
```

チールチップの矢印もCSSで描画します。

```css

.tooltip > .text::after {
	content: " ";
	position: absolute;
	top: 100%;
	left: 50%;
	margin-left: -5px;
	border-width: 5px;
	border-style: solid;
	border-color: black transparent transparent transparent;
}
```

# デモ

https://jsfiddle.net/5jesdveh/9/

# 参考

https://www.w3schools.com/css/css_tooltip.asp
VF帳票出力Tips Word編

VF で Word ファイルを出力する方法をかんたんにまとめました。

# VF で Word ファイルを出力する
Salesforce で Word ファイルを出力したいという要望がごくたまにあると思います。

主な対応としては次の2通りがあります。

- htmlを利用して拡張子.docファイルとして出力する（縦書きの出力不可）
- VBScript と ActiveX を利用して、IE で Wordファイルを出力する（縦書きの出力可能）

上記以外の方法で Word ファイルを出力する方法を紹介します。

# docxtemplater を利用する

https://github.com/open-xml-templating/docxtemplater

ブラウザのみでも動作するので、Visualforce ページでも利用することが可能です。
以下の document サイトのサンプルをVF ページで実装してみました。
テンプレートとして利用する Word ファイルは静的リソースにアップしています。

以下はサンプルコードです。

```html
<apex:page id="page" docType="html-5.0" standardStylesheets="false" showHeader="false" sidebar="false" applyBodyTag="false" applyHtmlTag="false">
<html>
    <script src="{!URLFOR($Resource.docxtemplater,'docxtemplater/js/docxtemplater-latest.min.js')}"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jszip/2.6.1/jszip.min.js"></script>
    <script src="{!URLFOR($Resource.docxtemplater,'docxtemplater/js/file-saver.min.js')}"></script>
    <script src="{!URLFOR($Resource.docxtemplater,'docxtemplater/js/jszip-utils.js')}"></script>
    <script>
    function loadFile(url,callback){
        JSZipUtils.getBinaryContent(url,callback);
    }
    loadFile("https://c.ap4.visual.force.com/resource/1520307484000/tag_example",function(error,content){
        if (error) { throw error };
        var zip = new JSZip(content);
        var doc=new Docxtemplater().loadZip(zip)
        doc.setData({
            first_name: 'John太郎',
            last_name: 'Doe',
            phone: '0652455478',
            description: 'New Website'
        });

        try {
            // render the document (replace all occurences of {first_name} by John, {last_name} by Doe, ...)
            doc.render()
        }
        catch (error) {
            var e = {
                message: error.message,
                name: error.name,
                stack: error.stack,
                properties: error.properties,
            }
            console.log(JSON.stringify({error: e}));
            // The error thrown here contains additional information when logged with JSON.stringify (it contains a property object).
            throw error;
        }

        var out=doc.getZip().generate({
            type:"blob",
            mimeType: "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
        }) //Output the document using Data-URI
        saveAs(out,"output.docx")
    })
    </script>
</html>
</apex:page>
```

#docxtemplater で出来ること

- マルチバイト文字（日本語）を利用することが可能
- テンプレートファイルに画像を利用することが可能
- 縦書きのレイアウトで出力することが可能

上記以外にもpptファイルに対応していたり、ループ処理でテーブルレイアウトの出力にも対応しているようです。

Salesforce の差し込み印刷の代わりに利用できるかもしれません。
Mac上でg++でコンパイル、実行するとSIGILLが出るコード

# はじめに

Mac上でSIGSEGVが出そうなコードをg++でコンパイル、実行するとSIGILLが出たのでメモ。

再現コードはここに置いてある。

https://github.com/kaityo256/sigill_on_mac

# 現象

* 再現環境[^1]
  * macOS High Sierra 10.13.3
  * g++ (Homebrew GCC 7.2.0) 7.2.0
  * 3.3 GHz Intel Core i5

[^1]: 同じバージョンのOS、GCCで、石だけCore i7な環境でも再現した。


以下のコードを`g++ -march=native -O3`でコンパイル、実行するとSIGILLが出る(`a.out`)。

```test.cpp
//------------------------------------------------------------------------
#include <iostream>
#include <string>
#include <fstream>
//------------------------------------------------------------------------
#ifdef CASE_C
inline   // if activate this line, a program works
#endif
void func2(int a[81]) {
  int n[6][9][9] = {};
  for (int i = 0; i < 9; i++) {
    int i1 = a[i];
    int i2 = a[i + 9];
    n[0][i1][i2]++;
    n[0][i2][i1]++;
  }
  std::string s1[3];
  for (int j = 0; j < 3; j++) {
    for (int i = 0; i < 6; i++) {
      s1[j][i] = '0' + n[j][0][i];
    }
  }
}
//------------------------------------------------------------------------
void
func(void){
#ifndef CASE_B
  std::ifstream ifs("test.dat");//with this, the program aborts with SIGILL
#endif
  int a[81];
  func2(a);
}
//------------------------------------------------------------------------
int
main(void) {
  func();
}
//------------------------------------------------------------------------
```

以下は実行結果

```
$  g++ -march=native -O3 test.cpp -o a.out
$ ./a.out
zsh: illegal hardware instruction  ./a.out
```

## 詳細

* コードの中に全く使われない`std::ifstream`の宣言があるが、これを削除するとSIGILLは出ない(`-DCASE_B`をつけてコンパイルするとできる`b.out`)。
* `main`関数から二回の関数呼び出しがあるが、最後に呼ばれる関数に`inline`指定をするとSIGILLがでない(`-DCASE_C`をつけてコンパイルするとできる`c.out`)。
* `-march=native`を外したり、最適化レベルを下げても発生しない。
* clang++では出ない。
* Linuxだと普通にSIGSEGVが出る
* gdbが言うには`addl   $0x1,0x60(%rsp,%rdx,4) `で止まっているらしい。普通にアクセス違反っぽいんだけど・・・

## 疑問点

* SIGSEGVが出るのはわかるけれど、なぜSIGILLが出るんだろう？
* Macのバグなの？GCCのバグなの？

# 追記

一行で再現するコードを作った。

```test.cpp
int main(void) {
  __asm__("movl  $0, 0(%rbp,%rdx,4)");
}
```

これをデフォルトオプションでコンパイル、実行すると、g++でもclang++でもSIGILLが出る。

```shell-session
$ g++ --version 
g++ (Homebrew GCC 7.2.0) 7.2.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ g++ test.cpp
$ ./a.out
zsh: illegal hardware instruction  ./a.out

$ clang++ --version 
Apple LLVM version 9.0.0 (clang-900.0.39.2)
Target: x86_64-apple-darwin17.4.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
$ clang++ test.cpp
$ ./a.out
zsh: illegal hardware instruction  ./a.out
```

というわけで、

* g++の問題ではない(clang++でも出る)。
* コンパイルオプションや、`std::string`や`std::ifstream`の問題ではない(不適切なmovlを出すための条件)
* LinuxではSIGBUSが、Windows (CYGWIN)ではSIGSEGVが出るのに、MacではSIGILLが出る

ということがわかった。

・・・なぜ？
canvasで線を書いたときに思った太さにならない

#canvasを使ってみたが
そういえば使ったことなかったなと思って、HTML5のcanvasを使ってみた。
とりあえず線でもひいてみたところ…縦も横も思った太さにならない…

#調べた
どうも、指定した座標を中心にして描画されるらしいので
太さに1pxを指定すると太さは2pxになる…のか？

あとそんな感じの仕様なので、座標も1px丁度のところだと
上下(または左右)ピクセルにまたがって描画されるので、意図した線にならない。

へーふーんなるほどー
なんだか変わった仕様だこと。

#対応してみた
やってみたけどなおらない

#結果
canvasの大きさをcssで指定していると、
実際のcanvasを引き延ばしたような表示になるっぽい。
canvasの大きさそのものは、html中で書いたら意図した形になった。


```css:css
canvas {
    width: 600px; //これがだめだった
    height:600px; //これがだめだった
    background: white;
    margin : 5px;
}
```

こうやって指定する

```html:html
<canvas id="cvs0" width="600px" height="600px"></canvas>
```

###　おわりに
適当にサンプル持ってくるだけじゃだめねー

###(追記)環境を書き忘れてた
IE11(11.0.9600.18230)
さっきひらめいたnumpyを使ったCrossValidationの簡単な書き方

# tl;dr

```python
# X : ndarray, データ行列とか
# y : ndarray, 教師データ
# cv : int, cv数

n_data = len(y)
m = np.random.permutation(np.arange(n_data) % cv)
for i in range(cv):
    X_train, X_test = X[m != i], X[m == i]
    y_train, y_test = y[m != i], y[m == i]

    # fit & predict
```

# ちなみに
この記事はsklearnを信用できなくなったときにスクラッチで書きたい人のためのものであって、
普通にやるならこういうのつかってかっこよくいきましょう
http://scikit-learn.org/stable/modules/cross_validation.html
【Mac】インストールの際、Android Studioが予期しない理由で終了する

#Android Studioがクラッシュしまくる
色々なタイミングで「予期しない理由で終了しました」と出て、クラッシュします。
インストールしてる時や、最後のFINISHを押してすぐとか。
インストール自体はできている？みたいで、Downloadingは正常に終わるのですが、
最後の「Finish」を押してすぐに、「予期しない理由で〜」が表示され、落ちます。

![erroe.png](https://qiita-image-store.s3.amazonaws.com/0/176897/bc4ec3e7-0a1b-9159-5d67-7445151ddf82.png)

そのあと、もう一回開くと、
![スクリーンショット 2018-03-06 11.11.50.png](https://qiita-image-store.s3.amazonaws.com/0/176897/a912ca5f-e8bf-5936-e7ad-b8d2605fd14a.png)
これがでて、またFinish押しても落ちます。

##PCのスペック
iMac OS X El Capitan 10.11.6
2.4GHz intel Core 2 Duo
メモリ4GB
ストレージ225.33GB空き
java version 1.8

これはメモリ不足なんでしょうか・・・？？

##やってみたこと
①JAVAの切り替え
②JAVA_HOMEの設定
で、結局解決できず、最新のJava1.8入れ直してやるも、またクラッシュしています。

java1.8と1.6が入っていたので、1.8を削除して、
1.6だけにしてJAVA_HOMEでパスを通す？のをやってみたり、
それでもだめで、1.8だけにして、ぜーんぶやり直したけど、
またずっと予期しない理由で終了。。

もう予期できるレベルで終了するわ！！

##なんか入ってきてる
java_error_in_studio_468.log
これがエラーの度、入ってくる。

もうかれこれ、１週間以上、これが解決できず、Android studioのインストールが完了しません。
どなたか、お助け〜〜〜〜 > <
C++ Builder XE4 > IDE > 複数のコンポーネントの名前を確認する > 構造ペイン | エディタで確認 | 構造ペインでの選択

```txt:動作環境
C++ Builder XE4
```

### 希望

200くらいコンポーネントがあるフォームにおいて、新規コンポーネント追加前に既存のコンポーネント名のルールを確認したい。

複数のコンポーネントの名前をどのように確認するか。

### 操作

- フォーム上で複数のコンポーネントを選択する
- 構造ペインで反転した名前が選択中のコンポーネントである

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/55f6a2ab-5406-c9af-c442-a069bc284f38.png)

### 上記操作の問題点と別案

上記の方法では、構造ペイン上でコンポーネントが離れていると一覧性が悪い。

その場合は、以下の操作の方を使う。

1. フォーム上で複数のコンポーネントを選択
2. Ctrl+c
3. エディタに貼る
4. エディタ上でソートする
5. objectという表記で一覧を確認できる

[秀丸でソートを行う方法について。](http://tbpgr.hatenablog.com/entry/20111213/1323786008)
> 2. 編集→変換→ソート→ソート条件→昇順を選択してOKを押下

情報感謝です。

### 構造ペインでの選択

上記の操作中に思いついたのは「構造ペインでの選択」。

右側の「デザインタブ」表示での選択ではなく、「構造ペイン」で選択すると、それらがフォーム上で選択された状態になった。

フォーム上で隠された状態になったコンポーネントを選択したりする用途に使えるかもしれない。

### 関連

- [c++ builder XE4, 10.2 Tokyo > debug / testing > 名前をデフォルトから変更していないコンポーネントの明示](https://qiita.com/7of9/items/312157c93766faf461ce)
- [c++ builder XE4, 10.2 Tokyo > debug / testing > OnKeyPressイベントをセットし忘れたコンポーネントを明示する](https://qiita.com/7of9/items/59784e3398b8a966fa4b)

作業時に失敗した時に、失敗を明示する。
GCP(Google Cloud Platform)の資料を作成するときに便利な公式アイコンとアーキテクチャ図

# GCP(Google Cloud Platform)の資料を作成するときに便利な公式アイコンとアーキテクチャ図のメモ

お客様のために説明用資料を作成したり、LT資料を作成したり、Qiitaに載せたりするために、アーキテクチャ図を書くことって結構多いのではないだろうか。

0から自分で資料を作成するのってかなりの手間だと思う。
そんなときに役に立つのが、本記事で説明するGoogle公式のアーキテクチャ図用のソリューションアイコンだ。
GoogleがGoogle Cloud Platform のアーキテクチャ図を構築するための公式のアイコンのセットを公開してくれているのだ。
[これ](https://cloud.google.com/icons/?hl=ja)を使用すると、自分でわざわざ0から資料のアーキテクチャ図を作成する必要がなくなり、非常に便利だ!
これを活用してコードだけでなくて、資料も車輪の再発明はしない様にしよう!

GoogleスライドとMSのPowerPointの両方に対応している。
アーキテクチャ図の例も豊富に載っており、例で記載されているアーキテクチャ図を見るだけでも、かなり勉強になりそう。

## 参考 
[アーキテクチャ図用のアイコンのライブラリ - Google Cloud Platform  |  Google Cloud Platform](https://cloud.google.com/icons/?hl=ja)