OmniAICreator/Qiita-1.07M huggingface dataset:
Write Blocker for Windows (Blocking Copy to USB drive and Prohibit to create new folder)

1.Windows + R or Fime名を指定して実行
2.type regedit
3.Open \HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control and right click on Controle -> New -> Key then you get a new folder and assign folder name as StorageDevicePolicie. example:StorageDevicePolicie.

4.go to StorageDevicePolicie and right click and chose DWORD(32ビット値) and named "WriteProtect" and click "WriteProtect" to modify (修正）-> 値のデータ(V) - > change a value 0 -> 1 (1でenable) . check 16進数 (default) and OK.

5. reboot windows machine.(再起動)

6.create the file on your desktop as test.txt. then move this file to your USB drive . then Windows said unable to copy and move. So, User unable to file copy or move to USB.

何か適当にUSB Driveをつなげて、デスクトップ上に新規test fileなど作成したものを移動しようとすると、エラーとなり移動不可＋コピー不可。
+ USB Drive上で新規で何かFolderを作成しようとしても上記設定したWindows上に接続したUSBでは新規の作成も不可。

7.when you create the rule and check behavior and surprised.
then type google USBメモリーへの書き込みを禁止する. or "How to enable write protection for USB devices on Windows 10"

then there are already someone posted same kind of story from 2005... -_-;;
I also surprised this is known story...(I just know it today..and found same kind of story in google there too...)

Anyway Enjoy !
RN42 Bluetooth Module の Baud rate を変更する

[RN42 Bluetooth Module](http://ww1.microchip.com/downloads/en/DeviceDoc/bluetooth_cr_UG-v1.0r.pdf)のBaudRateを変更する．

## 検証環境

- macOS Sierra 10.12.6
- Board: Arduino Pro mini
- Processor: ATmega328P(3.3V, 8 MHz)

## Bluetooth 経由で Baud rate を変更

### ペアリング

- Mac の Bluetooth 設定から RN42 とペアリングする
- Arduino > Tools > Port からBluetoothのポートを選択

### Serial Monitorからコマンドモードに

- Arduino > Serial Monitor を起動（デフォルトは、Baud rate: 115200）
- No line ending に変更
- `$$$` を送信 
- シリアルモニタに返り値 `CMD` が表示されることを確認

### Baud rate 変更

- `No line encoding` → `Newline` に変更（以降のコマンドは，改行を含む必要がある）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/31862/f215b3b7-b60f-1795-4b28-331c0c30c839.png)

- `D` を送信し，状態を確認する
- `SU,96` を送信し変更（変更後のBaud rateの頭2文字を指定）
- `D` を送信し，再度状態を確認

#　参考

- [公式ドキュメント](http://ww1.microchip.com/downloads/en/DeviceDoc/bluetooth_cr_UG-v1.0r.pdf)
- [Using the BlueSMiRF](https://learn.sparkfun.com/tutorials/using-the-bluesmirf/example-code-using-command-mode)
- [RN-42モジュールのコマンド](https://qiita.com/TakeoChan/items/a1148546d2e56b8173b8)
【CSS3】ブラウザサイズに合わせてファーストビューを表示する

こんにちは、ニュースが出る前に花粉を察知して早くも憂鬱です。

#ホームページを作ろう
前回、重い腰を上げて無料サーバーから有料サーバーに切り替えました。
[Xdomein(の無料サーバ)からXserverへ サーバー移転方法](https://qiita.com/yoshimi825/items/43524819812d967af25b)

ですがこれまで肝心の中身を一切作ってこなかったので、これを機に最低限の情報のみを掲載した自分のサイトを作ります。
以下ざっくりとしたマークアップ

```ruby:qiita.rb
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
</head>
<body>
　<header class="header">
　　ここがファーストビュー
　</header>
　<section class="profile">
　　プロフィールとか
　</section>
</body>
</html>
```

#ブラウザサイズに合わせてファーストビューを表示する
最近流行りのやつを作りたいと思います。
昨今デバイスが増えすぎて、それら全てになるべく対応できるよう柔軟性の高い組み方をしていきたいところ。。

横幅は
`width: 100%;`
これでなんとかなりますが、**縦幅は？**

結論からするとこういう時に使えるのが **" vh "** という単位でした。
1vh=1%になります。

画像を大きく使ったフルスクリーンにしたければ、
`width: 100%;
height: 100vh;`

ファーストビューを半分におさえて、
メインコンテンツを見せる場合は
`width: 100%;
height: 50vh;`

こんな具合に調整できます。簡単！

他にもjQueryを使う方法や事細かにCSSを設定する手もありますが、
難しいことを考えずにできるのが上記の方法になります。

私の場合、上記headerのCSSはこうなりました。

```ruby:qiita.rb
.header{
	background: #fff url(../img/xxx.jpg) center center / cover no-repeat fixed;
	background-size: cover;
	width: 100vw;
	height: 100vh;
	text-align: center;
}
```

#vhとは
htmlの勉強を始めたばかりや、昔のテキストサイトで知識が止まってる人からすると「なんか新しい単位が出てきたな…」って感じですよね。
私も知識がHTML4.01とCSS2.1で止まってて、単位はpxや%くらいしか知らなかったのですがvhはCSS3から増えた単位のひとつです。

vh は viewport height の略で、
>viewport（ビューポート）とは、日本語に訳すと「表示領域」という言葉がしっくりくると思います。
>例えば、デスクトップ環境（PCなど）のブラウザなどでは、ブラウザウインドウの表示領域がviewportになります。

参照元 : [実践！スマホサイトのviewport設定 第1回 viewportとはなにか？](https://app.codegrid.net/entry/whats-viewport)

viewport(表示領域)のheight(高さ)という意味になります。

ではブラウザ幅に対して50%にしたいときは？

この場合は単位が **" vw "** になります。
もうわかりますよね、viewport widthの略です。

上記でフルスクリーンにしたい場合は
`width: 100%;
height: 100vh;`
と書きましたが、
`width: 100vw;
height: 100vh;`
でもOK。

大差ないですが単位に慣れるという意味では使ってみるのも良いかもしれません。

ちなみにこのvh,vwは **Viewport Units** の仲間で、
他にも **" vmax "**  **" vmin "** というのがありますがそれはまた今度。。


それではまた
Akashic Engine のサンプルデモをTypeScriptで写経する

## モチベーション
TypeScriptに触れてみようと思い、何かしらいい題材が無いかと探していました。色々と検討した結果、[Akashic Engine](https://akashic-games.github.io/) というゲームライブラリを利用するとすぐさまTypeScriptでコーディングが始められそうだったので、そちらを利用させていただきました。

AkashicにはJavaScriptで書かれたサンプルがいくつかあるのですが、その中から[サンプルデモ](https://akashic-games.github.io/asset/hoppingwitch.html)の1つをTypeScriptで写経してみました。

今回行った成果物のリポジトリは[こちら](https://github.com/heyhachi/HoppingWitchTS)です。

## やってみた感想
TypeScriptの書き心地は非常によかったです。普段、仕事でCをゴリゴリ書いている身としては、ある程度の規模のプログラムになると、やはり型がある方がありがたいです。C#に似通ったところもあり、特段取っ掛かりにくいところは無かった気がします。

TypeScriptのドキュメントを読みながら探り探りやったので、「ふつうはこう書きます」ということができていないところもあると思います。お気づきの点があればコメントしていただけると幸いです。

## はまったところ
### Assetへのアクセス
Akashicではassetsには以下のようにアクセスします。例えばgirlという名前の画像ファイルの幅を取得したいなら

```js
scene.assets["girl"].width
```

という感じです。しかし、TypeScriptの場合はキャストが必要でした。まあ、自分が[チュートリアル](https://akashic-games.github.io/tutorial/tutorial-v2.html)の**効果音とBGM**の章にちゃんと説明があったのに、それを見落としただけなんですが…。

```ts
(scene.assets["girl"] as g.ImageAsset).width
```

## 課題
### htmlへエクスポートしたファイルが壊れる
akashicではnpm run export-htmlでhtmlへのエクスポートができるのですが、どうも[akashic-tile](https://github.com/akashic-games/akashic-tile)のバンドルがうまくいかず、exportされたhtmlを開くとモジュールが読み込めずにエラーとなってしまっています。

```sh
akashic install @akashic-extension/akashic-tile
```

この点は自分自身の最新のECMAScriptの仕様、TypeScriptの仕様の理解が浅すぎるのが原因の可能性もあるので、調査中。

**追記 2018/02/16**
単独動作の意味を勘違いしていたようです。サーバーに置くことが前提で、単独動作可能という事のようでした。

### グローバル変数の扱いに悩む
今回はこんな感じに全てexportしたが、declareでアンビエント宣言するほうが良いのだろうか…。

```ts:Models.ts
export const game: g.Game = g.game;
// タイルの幅
export const TILE_WIDTH: number = 32;
// タイルの高さ
export const TILE_HEIGHT: number = 32;
// 重力加速度
export const GRAVITY_ACC: number = 500;
// ホップ初速度
export const HOPPING_SPD: number = -Math.sqrt((TILE_HEIGHT * 2) * 2 * GRAVITY_ACC);
// スクロール速度
export const SCROLL_SPD = (TILE_WIDTH * 2) / (Math.abs(HOPPING_SPD) / GRAVITY_ACC * 2);
```
`react-scripts start` で起動したときに Firebase の JavaScript SDK を使用できるようにする

Firebase Hosting用のアプリを作る際に、`firebase init hosting`ってコマンドを実行するといろいろファイルが生成されるのですが、`index.html`を見てみると以下のように `/__/` ってパスが入っています。

```html
<script defer src="/__/firebase/4.9.1/firebase-app.js"></script>
```

ローカルで開発する際にはこのファイルは実際には存在していなくて、`firebase serve` というコマンドでローカルサーバーを起動するといい感じで解決してくれるのですが、Reactベースのアプリを`create-react-app`で作ったときには、`react-scripts start`でローカルサーバーを起動したほうが便利で、いやーんってなったのでその解決方法。

## Firebase の JavaScript SDK をインストール

```
$ npm install firebase --save
```

## App.jsを修正

`App.js`に以下の行を追加。

```js
import firebase from 'firebase';
import { firebaseConfig } from './firebase-config.js';

firebase.initializeApp(firebaseConfig);
```

次にFirebaseの設定ファイルを `src/firebase-config.js` に作成。

ファイルの内容は Firebase のダッシュボードで入手できます。

![](https://www.evernote.com/l/ABWH6KnScCNPbIVmEHqwYHdHODexs--upw0B/image.png)

だいたい以下のような感じ。

```js
export const firebaseConfig = {
  apiKey: "xxxx,
  authDomain: "xxxx",
  databaseURL: "xxxx",
  projectId: "xxxx",
  storageBucket: "xxxx",
  messagingSenderId: "xxxx"
};
```

## 設定ファイルを設置

プロジェクトのルートディレクトリに `firebase.json` というファイル名で以下の内容を保存。

```js
{
  "hosting": {
    "public": "build",
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ]
  }
}
```

`.firebaserc`というファイルを作る。内容は空のオブジェクト。

```
{}
```

## 起動

以上で `create-react-app` で生成された `package.json` に記述された `npm start` で起動します。

```
$ npm start
```

あとは React のお作法に従ってゴリゴリ頑張る。
LINE Messaging API で取得するuserIdについて

# LINEのMessagingAPIを介して取得できるuserIdは一つではない？
複数のMessagingAPIを使えるアカウントを用意して、各アカウントに同じユーザーアカウントで
友だち登録をしたのですが、想定していたIDが送られてこない。
よく見るとIDが異なっている。

# LINEの友だちのuserIdが同じアカウント使っていても違う
どこにもドキュメントが無く、また試そうとした人もあまりいないようなので記録用にメモ。

# セキュリティとかの問題でしょうか。
友だちでない人に対してpushメッセージとか送れないようにという配慮なのでしょうか？
API的には友達登録してない人にメッセージを送ってもエラーが返るだけなので、問題ないと思ってしまうのは
私だけでしょうか。

マルチテナントのサービスをLINEと連携させるときに、ちょっと不便だったので。
RTX1200でのポート開放手順

今回はRTX1200でポート開放をする際に少し手間取ったのでメモ書きとして投稿する。

ルーターの設定においてやることは２つ
##１．NATの設定を行う
- RTX1200のipに接続すると管理画面が出てくる、左側のリストから"NAT"の項目を選択し、
インターフェースという項目のうちインターネット接続に使用している種別（例PPPoE）の横にある設定をクリック

- すでに番号１０００番などというふうにIPマスカレードの設定が存在していると思うので、その右側にある設定をクリックする。

- その後一番下に存在する、静的IPマスカレード設定に追加する。
内側のアドレスは接続させたいサーバーのアドレス、プロトコルはtcp/udpであったものを、ポートは開放したいポート番号を書いて追加を押す。
- その後、確認を押して登録を押せば設定は完了

##2. パケットフィルター設定を行う
- 左側のリストからパケットフィルターを選択して、接続に使用している種別のIN側の横にある設定をクリック

- すでに設定は存在していると思うのでrejectとpassの間を見ると一番右側に矢印があると思うのでそれをクリックする。

- 番号は他の設定にかぶらないようにプロトコル、受信先アドレス、受信先ポートはさっき書いたようにかく。
その他の変更はかえなくていい

- 確認を押して登録する。


以上でルーターの設定は終わりです。
外部サイトなどでポートの疎通チェックを行ってみてください。


##※注意事項
- ポート先に信号を受け取るソフトがないとポート疎通チェックはうまく行きません。
- サーバー側のfirewallの設定をしないとつながりません。
シェルスクリプトで任意のサイズのダミーファイル（CSV）を作成する

#目的
ファイル転送速度測定やDBへのロード時間測定など、比較的サイズの大きいCSVが必要になった時に、任意のサイズ（GB）のCSVを容易に作成すること。

#スクリプト
```create_csv.sh
#!/bin/sh

##実行時の引数の数をチェック。引数が1じゃない場合、Usageを表示。
if [ $# -ne 1 ]; then
   echo "Usage: $(basename ${0}) [size(GB)]"
   exit 1
fi

##filesizeに実行時の引数であるファイルサイズ（GB）を入力する。
filesize=$1

##引数が整数であることを確認する。引数が整数ではない場合、Usageを表示する。
expr ${filesize} + 1 >/dev/null 2>&1
RET=$?
if [ $RET -lt 2 ]; then
   echo ${filesize}"GB file will be created."
else
   echo "Usage: $(basename ${0}) [size(GB)]"
   exit 1 
fi

##作成するファイルサイズから必要なレコード数を計算する。
num_records=`expr ${filesize} "*" 1024 "*" 1024 "*" 1024 / 10`

##必要な分のレコードをファイルに書き込む。
for (( i=0; i<${num_records}; i++ ))
do
echo 123456789 >> test.csv
done
```

##考慮できてないところ
- 1GB以下のファイル作成
- 引数に少数を利用
- 一行あたりのバイト数によっては行数が膨大になること。今回は書くのがめんどくさいので省略するが、ファイル入力の123456789のところは実際4000バイト程度のカンマ区切り文字列を入れている。（num_recordsの最後の10を4000に変更。）
MacのWiresharkでMQTT通信のパケットを見やすくキャプチャする

# やること

Macにて、
MQTT通信の内容が、本当に意図した通りに行われているか（QoS, Retain...他）を確認したいものの、
ただ単にWiresharkを使っても、いまいちMQTTメッセージのやり取りを追いきれませんでした。

Wiresharkにて、MQTT通信のパケットキャプチャ結果をもっと見易くなるようにします。

# 前提

#### 筆者環境

* macOS sierra
* Homebrew 1.5.4

#### 知識

* MQTTを知っている
* Wiresharkを知っている
* Homebrewを使っている


# 実践

## 1. Wiresharkのインストール

mac版をインストールします。

2018年2月9日時点のバージョン 2.4.4
https://www.wireshark.org/#download

## 2. luaをインストール

Wiresharkのプラグインでは、luaを利用することが多いようなので、
luaをmacにインストールします。

```
$ brew install lua
```

## 3. MQTT用のプラグインをWiresharkにインストール

### 3-1. プラグインを探してダウンロード

有志のWiresharkプラグイン（Mac対応版）を探してダウンロードします。

Mac用で探したら以下を見つけたので、有り難く利用します。
https://github.com/bobwenx/Wireshark-MQTT-OSX


Windows, Linux用では以下のを見つけましたが、試してないので不明です。
https://github.com/menudoproblema/Wireshark-MQTT

（しかしながら、プラグインの更新日が結構古いので、
　MQTTプロトコルバージョン3ではあるものの、何か必要な仕様が足りてなかったりするかも...？）


### 3-2. Wiresharkプラグインをインストール

Wiresharkの所定のディレクトリに、上記で手に入れた mqtt.lua を置きます。

```
## プラグインディレクトリの場所
## plugins ディレクトリは存在しない場合もあるので、そのときはmkdirで作成します。
~/.config/wireshark/plugins

$ cp /path/to/mqtt.lua ~/.config/wireshark/plugins
```

## 4. Wiresharkを起動して使ってみる

Wireshark起動時に、プラグインは自動的に読み込まれます。

Wiresharkでパケットキャプチャを開始（またはキャプチャデータを読み込み）して、
パケットフィルタに mqtt3 とすれば目的のフィルタリングができます。

 <img width="1330" alt="Wireshark MQTTフィルタ" src="https://qiita-image-store.s3.amazonaws.com/0/55620/161d5b09-9b66-2da2-8949-fc8fce8e93c1.png">


# トラブルシューティング

Wiresharkでプラグインの読み込み時に何かエラーが出たら、
エラー内容を見てなんとかします。

* プラグインとして登録しようとしているプロトコル名（フィルタ等で利用するための名称、識別子）が、既に存在するものと重複している
* luaライブラリがインストールされていない
* .lua ファイルがなんかおかしい
* ...etc
イーサリアムでスマートコントラクトを実行した場合のトランザクションの見方（覚書）

## ERC20トークンを転送（transferをcall）した場合のトランザクション
Function: transfer(address _to, uint256 _value) がトークンの転送では実施される。

```js:送受信アドレスとトークン数を表示するサンプル
// Transaction Hash "0xe85c63caa7d8797fa52ee51d5eea6a19c487cde2173d29cbbe06b701f80280ae"
// にトークンを送信したトランザクションがあるとする

web3.eth.getTransaction("0xe85c63caa7d8797fa52ee51d5eea6a19c487cde2173d29cbbe06b701f80280ae", function(e, tx){
  console.log(tx.from);   // トークンの送信元アドレス
  console.log(tx.to);     // ここはトークンの送信先アドレスではなく、コントラクトアドレス
  var input = tx.input;   // ここにスマートコントラクトの実行内容が入っている
  console.log("0x" + input.substring(34,74));          // トークンの送信先アドレス
  console.log(parseInt(input.substring(75,138),16));   // トークン数
});
```

|開始| 終了 | 意味 |
|:--:|:----:|:----:|
| 1 | 2 | 16進予約語 (0x) |
| 3 | 10 | function名（web3.sha3("transfer(address,uint256)").substring(0,10) => "0xa9059cbb"）|
| 11| 74| 第一引数、この場合は送付先アドレス（20文字 = 64Byte(40Byte)） |
| 75|138| 第二引数、この場合はトークン数（256bit = 32Byte） |
CheckIO(home:house password) python使用

**使用したサイト　checkIO　問題(home:house password)**

<font color="OrangeRed">**・躓いたポイント**</font>
a = "hogehoge" とstr文字配列がある。
for char in aと取り出す際に取り出したcharに""が付いていることに気付かなかった

***example 誤)***
a = "hogehoge" 
for char in a:
    if not <font color="DarkRed">"</font>char<font color="DarkRed">"</font>.isdgit():

取り出したcharに""も含まれるため、正しくは
***example 正)***
a = "hogehoge" 
for char in a:
    if not char.isdgit():
のような記述でよかった


<font color="DarkOliveGreen">**今日使用した　python構文**</font>
listname.count(2)
となると、リスト内に2と重複している数を表示してくれる
a = [1,2,3,2,] の場合は a.count(2) は2になる。

***またpythonで文字、数字を確認する方法***
"文字".isdigit() 全部数字ならTrueを返す
"文字".islower() 全部小文字ならTrue
"文字".isupper() 全部大文字ならTrue
https://docs.python.jp/3/library/stdtypes.html?highlight=isupper#str.isupper


**boolean型**
http://www.python.ambitious-engineer.com/archives/204


※
回答のなかにリスト内包表記というものがあった。
今後学習が必要

友達にコンパスっているプラットフォームとかで勉強のコミュニティーに
入ったら？と言われた
他のお勧めサイト、paiza AtCoder(プログラミングコンテストサイト)
もいいらしい。
Loraメモ


個人メモです



## 参考

[Mbed のウェビナーの LoRa, LoRaWAN や LPWA 記事が良かったので抜粋翻訳（その１） \- Qiita](https://qiita.com/nikosun/items/833ba6526cb36b7b0451)

[MBED Fest in Yokohama Japan \- February 24 2018 \| Mbed](https://os.mbed.com/blog/entry/mbedfest-02242018/)


[いまさら聞けないLoRaWAN入門 \(2/4\) \- MONOist（モノイスト）](http://monoist.atmarkit.co.jp/mn/articles/1709/19/news004_2.html)

[Getting started with LoRa using Mbed and The Things Network \- Q&A \| Mbed](https://os.mbed.com/blog/entry/Getting-started-LoRa-Mbed-Things-Network/)




SX1278（433Mhz）モジュールはハードウェアでLF(410 ~525Mhz)を使用
SX1276（868Mhz, 915Mhz） モジュールはLoRa chipでHF(862 ~1020Mhz)


## Q&A

Q. I have a Dragino LoRa product with 868Mhz, Can i use it in 915Mhz?

A. Yes, in our product, the 868Mhz and 915Mhz module use the SX1276 HF Radio path, the difference of these two modules are 3 inductors which can let the module work best in 868MHz or 915Mhz.
So if user use the 868Mhz model as 915Mhz, the software is complete the same. the difference will be the Radio performance which is not siganificant between 868Mhz and 915Mhz.

Q. I have a Dragino LoRa product with 868Mhz, Can i use it in 433Mhz?
A. No,in hardware side, the 433Mhz module use the LF Radio path in hardware(410 ~525Mhz ), and 868Mhz use the HF radio path (862 ~1020Mhz ) of LoRa chip. To save space and support PA mode, there is no radio path for LF in the 868Mhz module. So use 433Mhz in 868 module won't work, (actually it might work if you put both transmit and receive device very very close)

* single channelと8channelゲートウェイの違いについて

[LoRa Questions - Wiki for Dragino Project](http://wiki.dragino.com/index.php?title=LoRa_Questions)


# MQTT


### なぜ MQTT なのか

IoT 開発者にとって、MQTT は軽量さと柔軟性の点で申し分のないバランスがとれたネットワーク・プロトコルです。


* 軽量なプロトコルであるということは、制約が厳しいデバイス・ハードウェア上でも、待ち時間が長かったり帯域幅が限られていたりするネットワーク上でも実装できることを意味します。
* MQTT の柔軟性は、IoT デバイスおよびサービスの多種多様なアプリケーション・シナリオをサポートすることを可能にします。

参照
[MQTT の基本知識](https://www.ibm.com/developerworks/jp/iot/library/iot-mqtt-why-good-for-iot/)



## その他

[000452567\.pdf](http://www.soumu.go.jp/main_content/000452567.pdf)

[Raspberry Piを使ってLoRaWANゲートウェイを製作する](https://www.rs-online.com/designspark/building-a-raspberry-pi-powered-lorawan-gateway-jp)

[LoRaWANでつくるThe Things Network カルダーデール](https://www.rs-online.com/designspark/the-things-network-calderdale-jp)



LoRa®️ network Github
[LoRa®️ network](https://github.com/Lora-net)
対応ブラウザどうなってるっけ？をワンライナーでポン

ものすごく雑なスクリプトで恐縮・ｘ・

```
node -e "console.log('http://browserl.ist/?'+ encodeURI('q=' + require('./package').browserslist.join(',')))"
```

## 蛇足
* 主にAutoprefixerの対象ブラウザを指定するためにpackage.jsonに記述する `browserslist` というフィールドがある。
* 実際どのブラウザが対象なのか確認できる http://browserl.ist というサイトがある
* package.json内は配列で書かれてるが、browserl.istにはカンマ区切りで渡す必要がある
* したがってエイヤでポン。

## ついでに
package.json以外に、.browserslistrcに書く方法などもあるので、その場合はこれでは対応できない。
とはいえ、やってることはシンプルなので、テキトーにスクリプト書いて対応したらいいと思う。
なんなら手入力できるし。
AWS Artifact について軽く調べて、日本準拠法契約に変更してみた

# ０．はじめに

AWS に関して日本準拠法契約の話があり、
AWS Artifact も含めて、軽く調べてみました。

# １．調べてみた結果

以下、AWS のページです。

* [AWS Artifact \(コンプライアンスレポートへのオンデマンドアクセスを提供\) \| AWS](https://aws.amazon.com/jp/artifact/)
* [よくある質問 \- AWS Artifact \| AWS](https://aws.amazon.com/jp/artifact/faq/)
* [AWS Artifact とは \- AWS Artifact](https://docs.aws.amazon.com/ja_jp/artifact/latest/ug/what-is-aws-artifact.html?icmpid=docs_artifact_console)
* [AWS Artifact](https://aws.amazon.com/jp/blogs/news/introducing-aws-artifact-speeding-access-to-compliance-reports/)

こちら、
Developers.IO に投稿されていた記事です。
毎度のことではありますが、Developers.IO には AWS に関する記事が早めに投稿されるので、非常にありがたいですね。感謝 ♪

* [【新機能】AWS Artifactリリースされました！監査レポートをダウンロードしよう \#reinvent ｜ Developers\.IO](https://dev.classmethod.jp/cloud/aws/aws-artifact-new/)

ざっくりとまとめると、

* <font color="magenta"><b>AWS がいかに安心なサービスか、すぐに第三者の監査レポートを見て確認できる。</b></font>

ってことみたいです。

で、
他にも、

* <font color="green"><b>日本準拠法に関するAWSカスタマーアグリーメントの変更の契約も出来る。</b></font>
* <font color="green"><b>追加料金なし。</b></font>

ただ、
注意点として、

* <font color="red"><b>ダウンロードしたドキュメントの取り扱いには注意!!</b></font>
    * <font color="red">共有は信頼出来る相手とのみで、</font>
    * <font color="red">セキュアな共有サービスを使うこと!!</font>
    * <font color="red">メール添付での共有は禁止!!</font>
    * <font color="red">セキュアでない共有サービスは禁止!!</font>

とのことです。

# ２．日本準拠法に関する AWS カスタマーアグリーメントの変更
以下のページに動画がありますので、それに従って操作するだけです。

* [日本準拠法に関する AWS カスタマーアグリーメントの変更: AWS Artifact \| Amazon Web Services ブログ](https://aws.amazon.com/jp/blogs/news/how-to-change-aws-ca-by-artifact/)

# ＸＸ．まとめ

やはり、サービスを提供するにあたってターゲットとなるメインユーザーが日本人であれば、「日本準拠法に関する AWS カスタマーアグリーメントの変更」をしておいた方が良い様に思います。

契約は、あくまで AWS のアカウント単位とのこと。
サービスの拡大や対象に伴い、どのアカウントのどのリージョンでどのリソースを取り扱うべきなのかなど、色々と検討する必要があるのかもしれません。

当たり前のことですが、ビジネスはシステムを作ってそれで終わりにはならないので、こういった部分についても包括的にカバーしてくれる AWS は非常にありがたく思います。
コマンドラインで lint --list ができなかったのでやったこと

## 経緯
雰囲気でアンドロイドアプリのデザインをやっていたところ `tools:ignore` 属性のデフォルトで用意されている issue ID に何が用意されているかわからないことに気づきました。検索すると「Lint によるコードの改善」が引っかかり、記事中にある「コマンドラインからの lint の実行」を試してみたら `-bash: lint: command not found` という結果に。

## 環境
OS: macOS Sierra
Android Studio: 3.0.1

---

結論、単純にパスが通っていなかったため利用できないだけでした。。。
というわけで lint があるディレクトリのパスを .bash_profile に追記します。

```
$ echo "export PATH=$PATH:~/Library/Android/sdk/tools/bin" >> ~/.bash_profile
```

確認します。

```
$ more ~/.bash_profile
```

問題がなければ `.bash_profile` を再読み込みします。

```
$ source ~/.bash_profile
```

これで `lint --list` ができて確認することができました。
デザイナーにはちょっと厳しいですね。

- [Lint によるコードの改善](https://developer.android.com/studio/write/lint.html?hl=ja#commandline)
- [PATHを通すために環境変数の設定を理解する (Mac OS X)](https://qiita.com/soarflat/items/d5015bec37f8a8254380)
[RxSwift]初心者がRxSwiftを触ってみた①

最近転職活動しており、企業の求人などをみていると「RxSwift」の文字を見かけることが多く、気になっていたが、時間が取れず、学習することができていなかった。ようやく時間が取れたので、公式のExsampleを触ってみました。ただ、概念を理解するには時間がかかると思い、まずは慣れることを優先しました。
[RxSwift](https://github.com/ReactiveX/RxSwift)

[公式のExsample](https://github.com/ReactiveX/RxSwift/tree/master/RxExample/RxExample/Examples)
上記のリンクに、Exsampleがあるので、写経した後にコードの意味を調べながら、理解を深めることにしました。

```swift:sample.swift
import UIKit
import RxSwift
import RxCocoa/

class ViewController: UIViewController {

    @IBOutlet weak var number1: UITextField!
    @IBOutlet weak var number2: UITextField!
    @IBOutlet weak var number3: UITextField!
    
    @IBOutlet weak var result: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        //Observableで値の監視をスタート？
　　　　　　　　　　　　　　 //combineLatestで値を随時、結合
        //mapは全要素に適用したい時に使用する
        //descriptionで文字型に変換
        //bindで監視した値を縛り付ける
        Observable.combineLatest(number1.rx.text.orEmpty, number2.rx.text.orEmpty, number3.rx.text.orEmpty){textValue1,textValue2,textValue3 -> Int in
            return (Int(textValue1) ?? 0) + (Int(textValue2) ?? 0) + (Int(textValue3) ?? 0)
        }
            .map{ $0.description }
            .bind(to: result.rx.text)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }


}

```
Observableがどういった意味なのかがよくわかっていないですが、割と簡単にコードがかけた印象。
引き続き、Exsampleを写経しつつ、リファレンスを見ながら学習を進めたいと思います。
Android KTXを使ってみた〜SQLiteDatabase編〜

# 検証環境
この記事の内容は、以下の環境で検証しました。

* Java:open jdk 1.8.0_152
* Kotlin 1.2.10
* Android Studio 3.0.2
* CompileSdkVersion:26
* MinSdkVersion:21
* TargetSdkVersion:26
* BuildToolsVersion:26.0.2
* gradle:4.0.0
* Android KTX:0.1

# Android KTXとは
AndroidアプリのKotlinコードを簡潔に快適に記述できるように設計された拡張機能です。
提供元は*Google*です。オフィシャルのライブラリーになります。
※この記事を書いている時点（2018/02/08）では、プレビュー版のため、今後、APIの変更も予想されます。ご注意ください。

# 参考
Android Develpers Blog
https://android-developers.googleblog.com/2018/02/introducing-android-ktx-even-sweeter.html

Github
https://github.com/android/android-ktx/

API reference
https://android.github.io/android-ktx/core-ktx/

# 目標
Android KTXを利用したデータベースアクセスで、従来の記述方法との違いを確認する。

# 準備
Android KTXを使用するために、下記をbuild.gradleに追記してください。

```groovy:build.gradle（一部省略）
repositories {
    google()
}
dependencies {
    implementation 'androidx.core:core-ktx:0.1'
}
```

## 注意点
Android KTXはcompileSdkVersionが27になっていなければ使用できません。
また、compileSdkVersionを27にする場合、その他のライブラリもバージョンを上げる必要があります。
結果的に以下のような形になります。

```groovy:build.gradle（一部省略）
android {
   compileSdkVersion 27
}
repositories {
    google()
}
dependencies {
    implementation 'com.android.support:appcompat-v7:27.0.2'
    implementation 'androidx.core:core-ktx:0.1'
}

```


# 実装
## 今回の例
テーブルを全件検索して、dataクラスに格納するコードを例とします。

## テーブル
今回は下記のテーブルを使用します。
テーブル名：User

|id|name|
|---|---|
|1|山田太郎|
|2|花子さん|

## dataクラス
検索した結果を格納するクラスは以下のとおりです。
クラス名：UserEntity

```kotlin:UserEntity
data class UserEntity(val id:Int, val name:String)
```

## データベースアクセス

Android KTXで記述すると以下のようになります。

```kotlin
val dbHelper = DatabaseOpenHelper(this)
dbHelper.readableDatabase.use {
    val cursor = it.query("User", null, null, null, null, null, null)
    while (cursor.moveToNext()) {
        // KTXでの書き方
        val ktxId = cursor.getInt("id")
        val ktxName = cursor.getString("name")

        val ktxData = UserEntity(ktxId, ktxName)
        Log.e("KTX SQLiteDatabase", ktxData.toString())
    }
}
```

従来の記述方法で書くと以下のようになります。

```kotlin
val dbHelper = DatabaseOpenHelper(this)
dbHelper.readableDatabase.use {

    val cursor = it.query("User", null, null, null, null, null, null)
    while (cursor.moveToNext()) {

        // 従来の書き方
        val idIndex = cursor.getColumnIndex("id")
        val id = cursor.getInt(idIndex)

        val nameIndex = cursor.getColumnIndex("name")
        val name = cursor.getString(nameIndex)

        val data = UserEntity(id, name)

        Log.e("KTX SQLiteDatabase", data.toString())
    }
}
```

差分だけを抜き出すと以下のようになります。

```kotlin
// KTXでの書き方
val ktxId = cursor.getInt("id")
val ktxName = cursor.getString("name")

// 従来の書き方
val idIndex = cursor.getColumnIndex("id")
val id = cursor.getInt(idIndex)

val nameIndex = cursor.getColumnIndex("name")
val name = cursor.getString(nameIndex)
```
従来の記述方法では、列名からインデックスを取得した後に、そのインデックスを使用して列のデータを取得していました。
Android KTXを利用することにより、Cursorから直接、列名を指定してデータを取得できるようになっています。
Django での AttributeError

Django でちょっとハマったのでメモ。

# コードとエラー

``` Python:models.py
from django.db import models

class Foo(models.Model):
    title = models.CharField(name='タイトル')
    content = models.TextField(name='内容')

    def __str__(self):
        return self.title
```

``` :Shell
~/path/to/proj $ python manage.py shell
...
>>> from bar.models import Foo
>>> foo = Foo()
>>> foo.title = "Hoge"
>>> foo.content = "Fuga"
>>> foo.save()
>>> Foo.objects.all()
Traceback (most recent call last):
  File "<console>", line 1 in <module>
  ...
  File "/path/to/proj/bar/models.py", line 8, in __str__
    return self.title
  AttributeError: 'Foo' object has no attribute 'title'
>>> exit()
```

# 解決策

``` Python:models.py
from django.db import models

class Foo(models.Model):
    title = models.CharField(verbose_name='タイトル')
    content = models.TextField(verbose_name='内容')

    def __str__(self):
        return self.title
```

`name='タイトル'` , `name='内容'` を
`verbose_name='タイトル'`, `verbose_name='内容'` にしたら直った。


また `name='タイトル'` , `name='内容'` のままで `__str__` を

``` Python:models.py
...
def __str__(self):
    return self.タイトル
```

に変えても`AttributeError`が出なくなった。
Cordovaのチュートリアルをやってみる 第十二回

# 使用したもの(環境)
 1. cordova
 1. visualStudioCode
 1. windows10
 1. Android
 

---

# チュートリアルを訳しながらやってみる
チュートリアルのページは下記。

[Module 13: Using the Contacts API](http://ccoenraets.github.io/cordova-tutorial/contacts-api.html)

前回のチュートリアル。

[Cordovaのチュートリアルをやってみる 第十一回](https://qiita.com/tokky_se/items/57db7bdf483a1ab53195)

環境構築については別途まとめてあるので下記参照。

[cordova&VSCodeで環境を構築するまでの右往左往メモ。](https://qiita.com/tokky_se/items/346429d234c91bece11d)

---


# Module 13: Using the Contacts API

In this section, you use the Cordova Contacts API to provide the user with the ability to add an employee to the device's contact list.
このセクションでは、デバイスのコンタクトリストに従業員を加える機能を提供する、CordovaのContacts APIを使用していましょう。

The code below only works when running the application on your device as a Cordova app. 
このコードはCordovaアプリケ^ションとしてデバイス上で動作しているときのみ動きます。

In other words, you can't test it in a browser on your computer.
言い換えると、PCのブラウザ上ではテストすることができません。

1\. contacts プラグインを追加します。

```console 
cordova plugin add cordova-plugin-contacts
```

2\. index.htmlでemployee templateに下記の項目を追加します。

```html
<li class="table-view-cell media">
    <a hre="#" class="push-right add-contact-btn">
        <span class="media-object pull-left"></span>
        <div class="media-body">
            Add to contacts
        </div>
    </a>
</li>
```

3\. EmployeeViewのinitializeメソッドに、下記コードを追加します。

```js
this.$el.on('click', '.add-contact-btn', this.addToContacts);
```

4\. EmployeeViewで、addToContacts という event handlerを定義します。

```js
this.addToContacts = function(event) {
    event.preventDefault();
    console.log('addToContacts');
    if (!navigator.contacts) {
        alert("Contacts API not supported", "Error");
        return;
    }
    var contact = navigator.contacts.create();
    contact.name = {givenName: employee.firstName, familyName: employee.lastName};
    var phoneNumbers = [];
    phoneNumbers[0] = new ContactField('work', employee.officePhone, false);
    phoneNumbers[1] = new ContactField('mobile', employee.cellPhone, true);
    contact.phoneNumbers = phoneNumbers;
    contact.save();
    return false;
};
```

テスト前にちょっと解説。
ここのemployeeは、コンストラクタ関数EmployeeViewの引数のemployee。  
app.jsでEmployeeViewがnewされるのは、  
window.location.hash.substr(1)がemployees/:id(:idは従業員IDで数字)になるとき。  
EmployeeViewがnewされるときに引数に渡すemployeeはservice.findByIdの結果なので、
結果的には従業員の一人分のデータになる。(変数の名前からわかるけど…)  
即時関数を使われると普段Javaとか扱っている人は変数宣言が迷子になりがちなので注意。(私とか)


5\. テストしてみましょう。(ブラウザ以外でテストしましょう。)
Add to Contactを押しているところが見にくいですが、最上部の通知バーに連絡先の通知が来ているので押したことがわかります。

![test.gif](https://qiita-image-store.s3.amazonaws.com/0/196422/f7a9e690-f8e2-463d-b94d-8cd4a446f30c.gif)

初回ではないので確認が出ませんが、Add to Contactを押すと連絡先へのアクセス許可を求めるダイアログが出ます。(Android側で)  
ポチッと押すとそれだけで連絡先に追加されます。(アラートも何も出ないので押した感が薄いですが…)  
私物スマホの連絡先を晒すのもちょっとアレなので、連絡先に追加されたかのエビデンスは貼らない感じで…。


---

# 参考URL

[Module 13: Using the Contacts API](http://ccoenraets.github.io/cordova-tutorial/contacts-api.html)

[Cordovaのチュートリアルをやってみる 第十一回](https://qiita.com/tokky_se/items/57db7bdf483a1ab53195)

[cordova&VSCodeで環境を構築するまでの右往左往メモ。](https://qiita.com/tokky_se/items/346429d234c91bece11d)
R1Soft/IderaでのAPI実行方法例

#1. API Referenceのありか
`http://<R1SoftServer>/apidoc`にある。

<img width="938" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/62127/3f24cefd-2f6d-6fb8-e4e4-01a84c9f4b69.png">


#2. Sample APIの場所
例えばライセンス情報を取得するためのサンプルAPIは以下に載っている。
http://wiki.r1soft.com/display/ServerBackup/getServerInformation

#3. Sample APIの使い方

このサンプルは全部phpなので、まずはphpを導入する必要がある。

```bash
[root@myr1soft ~]# yum install -y php.x86_64 php-soap.x86_64
```

SampleAPIを適当なファイルに保存し（例えば`getServerLicenseInformation.php`など）、

1. `$HOST`と`$PASS`を適切なIPアドレスおよびパスワードに変更する。
2. phpスクリプトとしてとして動かすために、最初と最後に`<?php`と`?>`を挿入する。

```php:getServerLicenseInformation.php
<?php
########====CDP Server Configuration Start====########
#set CDP server host name
$HOST="xxxxxxx"; 
#set CDP server to access API
$PORT="9443";
#set CDP user
$USER="admin";
#set CDP user password
$PASS="xxxxxxx";
########====CDP Server Configuration End====########
#Retrieve license details for your host server.
try{

    $client = new soapclient("https://$HOST:$PORT/Configuration?wsdl",
        array('login'=>"$USER",
        'password'=>"$PASS",
        'trace'=>1
        )
    );

     $response=$client->getServerLicenseInformation() ;
     var_dump($response);

    echo "Successfully executed getServerLicenseInformation\n";

    exit(0);

}
catch (SoapFault $exception)
{
    echo $exception;
    exit(1);
}
?>
```

#4. 実行例

```bash
[root@myr1soft ~]# php getServerLicenseInformation.php
object(stdClass)#2 (1) {
  ["return"]=>
  object(stdClass)#3 (18) {
    ["advancedEdition"]=>
    bool(false)
    ["currentAgentCount"]=>
    int(0)
    ["currentLongTermArchiveCount"]=>
    int(0)
    ["currentVirtualAgentCount"]=>
    int(0)
    ["currentVirtualizationCount"]=>
    int(0)
    ["enterpriseEdition"]=>
    bool(true)
    ["licenseAgentCount"]=>
    int(10)
    ["licenseKey"]=>
    string(36) "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
    ["licenseVirtualAgentCount"]=>
    int(0)
    ["pooledLicense"]=>
    bool(true)
    ["standardEdition"]=>
    bool(false)
    ["timeLimitReportEnabled"]=>
    bool(false)
    ["timeLimited"]=>
    bool(false)
    ["totalLongTermArchiveCount"]=>
    int(0)
    ["totalVirtualizationCount"]=>
    int(0)
    ["trial"]=>
    bool(false)
    ["valid"]=>
    bool(true)
    ["version"]=>
    string(5) "6.6.1"
  }
}
Successfully executed getServerLicenseInformation
```
Linuxでマザーボードのブザーを鳴らす方法

古いPCの時から、マザーボード上にはほとんどブザーがついており、BIOSなどが使うことがあります。
そのブザー、「なにかの用途に使えるかも」って思ったりしたことはないですか？
でも調べてみてもあまり有力な情報がありません。(実際、ブザーの需要はないので)
ですが、ちょっとコマンドを打てば、ブザーはLinux上から鳴らせるようになります。
# ブザーがあるか調べるには
Ubuntuなどを導入している場合、GRUBなどのブートローダーで、「memtest86+」という項目があると思います。
memtest86+というのはご存知の通り、メモリ診断ツールです。
これを起動するとき、マザーボードにブザーがあると「ピポッ」となるのです。
それを利用して、チェックしてみてください。
※ベルを鳴らす`echo -e '\a'`というのがありますが、それはPulseAudioなどで模擬的に鳴らしています。
# 導入方法
ここではUbuntuを前提に説明します。
まず、端末を開いてから

```bash
sudo apt install beep
```
と入力してください。beepというパッケージがインストールされます。
※aptコマンドがエラーになる場合は、従来のapt-getを使ってください。

これで利用可能になりました。
# beepコマンドを使う
先ほどのbeepパッケージをインストールすると、beepというコマンドが利用可能になります。
ただ普通に`beep`と打つと、440Hzくらいの音がブザーから出ます。
*※鳴らない場合は、最後のトラブルシューティングをご覧ください*
でもこれだけでは面白くありませんね。
beepコマンドでは、パラメータをいじると、周波数や鳴らす時間も変えることができます。
詳しいヘルプは`beep --help`を実行してください。
## 周波数を変えるには
周波数を指定するには -f [周波数(Hz)] を指定します。
ただし、大抵の場合は50Hzくらいからしか音は出ません。
何回か`beep -f 200`とか`beep -f 1400`などとやって遊んでみてください。
ちなみに、`beep -f 2000; beep -f 1000`を実行すると、なつかしいあの音が出ます。
Pythonで次のようなプログラムを作ると、一気に鳴らせます。

```python:beep.py
#!/usr/bin/python3
import os, time
Hzs = [100, 200, 300, 400, 500, 600, 700, 800, 900, 1000, 1500, 2000, 2500]
for i in Hzs:
 os.system("beep -f " + str(i) + " -l 50")
```
## 鳴らす時間を変えるには
周波数は変えられるようになりましたが、長さはデフォルトなので「ピーピーピー」とあまりかっこよくありません。
もちろん、変えることができます。-l [長さ(ミリ秒)] で変えられます。
例えば`beep -f 300 -l 2000`を実行すると、2秒間鳴りっぱなしになります。
逆に`beep -f 300 -l 100`とすれば、「ピッ」という短い音にすることができます。
10ms以下はあまり聞こえません。

# まとめ
**ブザーを鳴らすには`beep`**
**周波数を変えるには`beep -f [周波数(Hz)]`**
**鳴らす時間を変えるには`beep -l [時間(ミリ秒)]`**
**100Hzを1.5秒鳴らしたいときは`beep -f 100 -l 1500`**

このコマンドを使って、通知に使ったり、エラー発生時などに鳴らすように工夫してみてください。

# トラブルシューティング：beepコマンドで音が鳴らない
筆者も経験していますが、ほとんどのLinuxでは、beepコマンドが使えても**鳴らない場合があります。**
原因は**モジュールが読み込まれていない**からです。
ブザーを鳴らすときは、pcspkrというモジュールが仲介しています。そのため、pcspkrがロードされていないと鳴りません。
Ubuntuなどではデフォルトでpcspkrを読み込まない設定になっているので、設定を変える必要があります。
モジュールなどを読み込むかは、/etc/modprobe.d にあるファイル群で管理されています。
そのうちのblacklist.confのブラックリストにpcspkrが登録されているので、コメントアウトしましょう。
nanoエディタが使える人は端末を開き、`sudo nano /etc/modprobe.d/blacklist.conf`を実行し、/etc/modprobe.d/blacklist.confをroot権限で編集してください。
49行目に`blacklist pcspkr`という行があるはずです。それを**`#blacklist pcspkr`**に変えて、保存します。
これにより、PC起動時に自動でpcspkrが読み込まれます。

それから、**`sudo modprobe pcspkr`**を実行します。
modprobeコマンドはモジュールを読み込むコマンドです。

**これでbeepコマンドでなるようになりました。**
それでも鳴らない場合はマザーボードにブザーがないか、壊れています。
またはpcspkrモジュールがI/Oコントローラーとうまく通信できていないとか、ブザーを見つけられなかった、ということかもしれません。

アンロード(無効化)するには`sudo modprobe -r pcspkr`とします。
さきほどのブラックリストでコメントアウトしましたが、それを元に戻せばPC起動時にpcspkrは読み込まれません。
Laravel5.5のディレクトリ構造まとめ

自分で追加したディレクトリも入ってますが。


├── app
│   ├── Console　... タスクスケジュール
│   ├── Exceptions ... 例外ハンドラ
│   ├── Http
│   │   ├── Controllers ... [処理クラス](https://readouble.com/laravel/5.5/ja/controllers.html)
│   │   │   ├── Admin
│   │   │   ├── Auth
│   │   │   ├── Internal
│   │   │   └── Manager
│   │   ├── Middleware ... [認証やCSRF保護](https://readouble.com/laravel/5.5/ja/middleware.html)など
│   │   └── Requests ... [リクエストクラス](https://readouble.com/laravel/5.5/ja/requests.html)　(バリデーションの設定等)
│   ├── Libraries ... [共通処理クラス](https://qiita.com/zaburo/items/e8e786624f88c253c87d)
│   │   └── Google ... TagManager、Gmail等の詳細なGoogle　APIの処理
│   ├── Models ... [モデルクラス](https://readouble.com/laravel/5.5/ja/eloquent.html)
│   ├── Providers ... [起動処理クラス？](https://readouble.com/laravel/5.5/ja/providers.html)
│   └── Rules ... [カスタムバリデーションクラス](https://readouble.com/laravel/5.5/ja/validation.html)
├── config ... 設定ファイル
├── database
│   ├── factories ... [データベースのテスト](https://readouble.com/laravel/5.5/ja/database-testing.html)
│   ├── migrations ... [マイグレーション](https://readouble.com/laravel/5.5/ja/migrations.html)
│   └── seeds ... [データベースのテストシーダー](https://readouble.com/laravel/5.5/ja/seeding.html)
├── node_modules
│   ├── bootstrap-sass ... Bootstrapの細かい設定
│   │   └── assets
│   │       ├── fonts
│   │       │   └── bootstrap
│   │       ├── images
│   │       ├── javascripts
│   │       │   └── bootstrap
│   │       └── stylesheets
│   │           └── bootstrap
│   │               └── mixins
├── public ... コンパイル済みのフロントエンドのソース
│   ├── css
│   ├── fonts
│   │   └── vendor
│   │       ├── bootstrap-sass
│   │       │   └── bootstrap
│   │       └── font-awesome-scss
│   └── js
├── resources ... コンパイル前のフロントエンドのソース
│   ├── assets
│   │   ├── js
│   │   └── sass
│   ├── lang
│   │   └── en
│   └── views ... [viewテンプレート](https://readouble.com/laravel/5.5/ja/blade.html)
├── routes ... [ルーティング設定](https://readouble.com/laravel/5.5/ja/routing.html) ＆ [権限ごとのルーティング](https://www.craneto.co.jp/archives/1264/)
├── tests ... [テストケース](https://readouble.com/laravel/5.5/ja/testing.html)
│   ├── Feature
│   └── Unit
└── vendor ... インストール済みパッケージ
Linuxログイン時に表示されるメッセージを自分の好きなものにする

Linuxにsshやtelnetでログイン時に表示されるメッセージをカスタマイズする方法です。
まぁ使わないと思いますが、逆に忘れそうなのでメモです。
　
### １．ログイン直後のメッセージ（/etc/motd）
まずは簡単な方からです。
ログイン直後に表示されるメッセージは/etc/motdの内容が表示されます。
ちなみに「motd」とは「Message Of The Day」の略です。
![motd.jpg](https://qiita-image-store.s3.amazonaws.com/0/237538/8519393a-e268-84aa-95ed-c91c5ae2e7f8.jpeg)



### ２．ログインプロンプトのメッセージ（/etc/issue,issue.net）
次にログインプロンプトに表示されるメッセージです。
基本/etc/motdと同様です。
sshやtelnetなどのリモートログインではなく、コンソール画面には/etc/issueの内容が表示されます。（日本語だと化けるので英字のみで）
![issue.jpg](https://qiita-image-store.s3.amazonaws.com/0/237538/3c42f2cf-f912-685e-a0f1-8e235a9e3e02.jpeg)
　
　
コンソール画面ではなくリモートログインの場合は/etc/issue.netの内容が表示されます。
![issue.net.jpg](https://qiita-image-store.s3.amazonaws.com/0/237538/57f562e7-d8e5-0b12-5a42-0a880cac8456.jpeg)
**あれれれ？ sshパスワードプロンプトには表示されないんですかね？**:frowning2:
　
### ３．SSHのパスワードプロンプトのメッセージ（/etc/ssh/sshd_conf）
SSHのパスワードプロンプトにメッセージを表示したい場合は、/etc/ssh/sshd_configに下記の行を追加します。

`Banner パスワードプロンプトに表示したい内容を書いたファイル名`
（デフォルトではコメントアウトされた「#Banner none」という行があると思いますが、それはそのままにしてこの行を追加です。追加した後はsshdの再起動が必要です。）

\# service sshd restart
でsshdを再起動してからsshでログインしてみます。
![SshBanner.jpg](https://qiita-image-store.s3.amazonaws.com/0/237538/0e4d02a5-345a-205e-c034-0d3ddfec18ee.jpeg)

　
◎ちなみに/etc/issue, /etc/issue.netには日付やOS名などを表すシーケンスが用意されています。
http://www.atmarkit.co.jp/flinux/rensai/linuxtips/272etcissue.html
マストドンで画像投稿がエラーでできなかった時の対応メモ

【環境】
CentOS7
Mastodon 2.0
さくらのクラウド スタートアップスクリプトで構築された環境

【現象】
ツイートはできるが、画像投稿できない。

【対応】
nginxのエラーログを見ると、パーミッションフェイルしているようだったので、
/var/lib/nginx/ を chown で mastodon にオーナーを変更したところ解決
なお、 nginx.conf で user　を mastodon に指定している状態

【参考にさせていただいたページ】
https://qiita.com/rinkun/items/8f8bc19f98754b3b17c7
Polymerで作ったWeb Componentで string 型以外の属性を使う場合のTIPS

先日 Web Components に関して、 @aggre さんの [“Web Componentsだけ” で新サービスを実装して見えたこと](https://qiita.com/aggre/items/9d77085a32764ffe994d) という記事が投稿されました。
これすごい良い内容なんで、ぜひ読んで欲しいです。

で、そのサービス `Double O` に以下のような質問が入っていました（質問したのは私ではないです)。

まだ埋め込み対応はされていないので、画像で貼り付けます。
![Polymerは使わないんですか？](https://qiita-image-store.s3.amazonaws.com/0/61446/5c380c2d-0977-b940-fcfe-c1f282de1be8.png)

[「Polymerは使わないんですか？」実際のページ](https://ooapp.co/project/7H6GfQWhIZumzaY1tFIRgWaA)

良い質問と回答だなーと。

### でもちょっとコメントしたい

> string 型以外の属性( attributes )を渡せるかどうか？になると思います。ドメイン依存の排除を考えるとそもそも string 型以外を渡すシチュエーションは避けるべきなので、結果的に Polymer を使う必然性がなくなった

その通りなのですが、では Polymer で Web Component 作って公開するとき `string` 型じゃない属性はどうやって使うの？
Polymer で Custom Element 作ったらアプリも Polymer で作らないといけないの？

と、不安になる人がいるのではないか？と思ったのです。

## 安心してください、それ使えますよ！

### どうやって使うか？

では、非Polymerドメインから、Polymerで作ったWeb Componentのstring型ではない属性に対して、どうやって値を渡すか？
答えは、[公式ドキュメント：Attribute deserialization](https://www.polymer-project.org/2.0/docs/devguide/properties#attribute-deserialization)に書いてあります。
[日本語訳：属性のデシリアライズ](https://qiita.com/jtakiguchi/items/85d4e636bc490eac699c#%E5%B1%9E%E6%80%A7%E3%81%AE%E3%83%87%E3%82%B7%E3%83%AA%E3%82%A2%E3%83%A9%E3%82%A4%E3%82%BA)もあります。

### 簡単な例

string 型以外の簡単な例を紹介します。

#### boolean

Polymerでbooleanとして定義されている属性 `manager` があるとき、 `Scott` さんは `manager` で `Bob` さんは 非managerということになります。
booleanのときは属性名を書くか、書かないかでboolean値がtrueもしくはfalseになります。

```html
<x-custom user="Scott" manager></x-custom>
<x-custom user="Bob"></x-custom>
```

#### array or object

配列やJSONオブジェクトとして定義されている属性があるときは、 `JSON.stringify` した結果の文字列として指定すると、自動的にPolymer側でarrayまたはobjectに変換されます。

```html
<my-element book='{ "title": "Persuasion", "author": "Austen" }'></my-element>
<my-element colors='["red", "green", "blue"]'></my-element>
```

## さいごに

Web Components をはじめるのにフレームワークを使わないのもアリなんですが、最初の取り掛かりとして Polymer のようなライブラリ（フレームワーク）を使うと簡単に始められると思います。

コミュニティ活動も活発に行なっていますので、ぜひ参加ください。
詳しくは[Polymer Japan サイトのコミュニティページ](https://polymer-jp.org/community/)をご覧ください。
ブラウザバックでページでなくjsonが表示されてしまう

#起こっていること
ajaxで非同期の検索機能を作り、その都度バックエンドからajaxでjsonを受け取り、jsのhistoryAPIで検索のパラメーターを保存するためにpushStateしていたら、他のページからブラウザバックで戻ってくるとajaxで取得していたjsonしか表示されなくなってしまった。

#原因
ajaxでjsonを取得したときに、次のajaxをしなくていいように自動的にキャッシュされるようになっていた。そのためpushStateで履歴に追加したurlとajaxでリクエストを送るurlが同じときにこのような問題が発生してしまうようだ。

# 解決策
ajaxでキャッシュしないように変更すれば良い。

```js
$.ajax({
    url      : url,
    data     : {},
    dataType : 'json',
    type     : 'GET',
    cache    : false,  // この１行を追加
    success: (data) => {
      ...
    },
    error: (xhr, status, err) => {
      ...
    },
  });
```

#参考
[jQuery.ajaxにCacheが残って困ったら設定](https://qiita.com/leedohyung-dba/items/2cfd683c65aeb7c1108d)
Twitterから適当にツイートを拾って形態素解析する

グダグダ書いてもしょうがないので簡潔に書きます

#必要なもの
- tweepy
- MeCab

これを予め入れてください．入れ方はggってください．

#なにか
TwitterAPIのpublic streamで全世界のツイートを取得し，その中から日本語のツイートだけをふるいにかけ、余計な情報を削除した後MeCabに投げ形態素解析するものです．

```
#! /usr/bin/env python3
# encoding=utf-8
import re
import tweepy
import unicodedata
import MeCab
from datetime import timedelta

CK = ""
CS = ""
AT = ""
AS = ""



class Listener(tweepy.StreamListener):
    def on_status(self, status):
        status.created_at += timedelta(hours=9)

        if is_japanese(status.text):
            tweet = format_text(status.text)
            print(tweet)
            print(MeCab.Tagger("").parse(tweet.encode("utf-8")))


        return True

    def on_error(self, status_code):
        print('Error: ' + str(status_code))
        return True

    def on_timeout(self):
        print('Timeout...')
        return True

def format_text(text):

    text = re.sub(r'https?://[\w/:%#\$&\?\(\)~\.=\+\-…]+', "", text)
    text = re.sub(r'@[\w/:%#\$&\?\(\)~\.=\+\-…]+', "", text)
    text = re.sub(r'&[\w/:%#\$&\?\(\)~\.=\+\-…]+', "", text)
    text = re.sub('お気に入り', "", text)
    text = re.sub('まとめ', "", text)
    text = re.sub(r'[!-~]', "", text)  # 半角記号,数字,英字
    text = re.sub(r'[︰-＠]', "", text)  # 全角記号
    text = re.sub('\n', " ", text)  # 改行文字
    text = re.sub(';', "", text)
    text = re.sub('RT', "", text)
    text = re.sub('\n', " ", text)
    return text

def is_japanese(string):
    for ch in string:
        name = unicodedata.name(ch)
        if ("CJK UNIFIED" in name and ("HIRAGANA" in name or "KATAKANA" in name)) \
                or ("HIRAGANA" in name or "KATAKANA" in name):
            return True
        return False

    def name(ch):
        try:
            return unicodedata.name

        except ValueError:
            return None



auth = tweepy.OAuthHandler(CK, CS)
auth.set_access_token(AT, AS)


listener = Listener()
stream = tweepy.Stream(auth, listener)
stream.sample()#filterにすると条件を付けれる（詳細はggってくだ..）
```

これを動かしているとたまに

```
Traceback (most recent call last):
  File "Get_public_tweet.py", line 86, in <module>
    stream.sample()
  File "/Library/Python/2.7/site-packages/tweepy/streaming.py", line 419, in sample
    self._start(async)
  File "/Library/Python/2.7/site-packages/tweepy/streaming.py", line 361, in _start
    self._run()
  File "/Library/Python/2.7/site-packages/tweepy/streaming.py", line 294, in _run
    raise exception
ValueError: no such name
```
こういうエラーが出てくるけれど原因がわからなくて、わかる人コメント等で教えて欲しいです．
iOS,Androidのローカル画像の配置先


#内容

```
<Image Source="frog1.jpg"/>
```

や

```
<ImageCell ImageSource="frog1.jpg"/>
```

等、`frog1.jpg`というローカル画像を表示させたい場合の`iOS`、`Android`の保存先

#Androidの場合
Androidプロジェクトの`Resources/drawable`配下
もし`drawable`フォルダがない場合は作成する
![スクリーンショット_2018-02-15_16_15_46.png](https://qiita-image-store.s3.amazonaws.com/0/72559/18462d98-2e71-6a81-e190-4985c299dc2b.png "スクリーンショット_2018-02-15_16_15_46.png")

#iOSの場合
iOSプロジェクトの`Resourses`配下


#共通部分に配置する(PCL)
共通部分に配置する方法が書かれた記事がありました。
多分こっちのほうが良いと思いますヽ(´ー｀)ノ

[【Xamarin.Forms】共通部分(PCL)に配置した画像を表示する](https://qiita.com/suzu-king/items/a0fe98e7b371e13e49b5)
MacでHomebrewを使ってPython3でSphinxのライブリロード環境を作る

# 概要
MacでSphinxを動かす．
Python3を入れてvirtualenvwrapperを使って環境を汚さないようにする．

## Python3
Homebrewでインストールする

```
$ brew install python3
% python3 -V
Python 3.6.4
```

## virtualenvwrapper
- `VIRTUALENVWRAPPER_PYTHON` を設定しないと，システム標準の `/usr/bin.python` を見に行ってしまう．
- virtualenvsにPATHを通してactivateしたコマンドを見られるようにする

```
$ pip3 install virtualenvwrapper
$ vim ~/.zshrc
export PATH=$HOME/.virtualenvs/:$PATH
export VIRTUALENVWRAPPER_PYTHON=/usr/local/bin/python3
if [ -f /usr/local/bin/virtualenvwrapper.sh ]; then
  export WORKON_HOME=$HOME/.virtualenvs
  source /usr/local/bin/virtualenvwrapper.sh
fi
$ source ~/.zshrc
virtualenvwrapper.user_scripts creating /Users/<user>/.virtualenvs/premkproject
virtualenvwrapper.user_scripts creating /Users/<user>/.virtualenvs/postmkproject
```

sphinxのプロジェクトがあるディレクトリに移動する

```
$ cd /your/sphinx/project
$ vim enable.sh
#!/bin/bash
# sphinxビルド用の環境に切り替える
workon <env name>
```

## sphinxでプロジェクトを作る

[Windows版の例](https://qiita.com/goforbroke/items/9f78ccb302615febcf84#%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E4%BD%9C%E6%88%90) に従ってプロジェクトを作る

## ライブリロード

```
$ cd /your/sphinx/project
$ vim server.py
#!/usr/bin/env python

from livereload import Server, shell

server = Server()
server.watch('**/*.rst', shell('make html'))
server.serve(open_url=False)
```

### 使い方

sphinxのプロジェクトに移動してライブリロードを起動する．

```
$ cd /your/sphinx/project
$ sh enable.sh
(env name) $ server.py
[I 180215 15:57:01 server:283] Serving on http://127.0.0.1:5500
[I 180215 15:57:01 handlers:60] Start watching changes
[I 180215 15:57:01 handlers:62] Start detecting changes
```

rstファイルの更新を検知して， http://127.0.0.1:5500/build/html/index.html にビルド結果が表示される．

# VS codeで.rstファイルのインデントを設定する

[EditorConfig for VS Code](https://marketplace.visualstudio.com/items?itemName=EditorConfig.EditorConfig) をインストールする．
次にsphinxプロジェクトのルートディレクトリに `.editorConfig` ファイルを置く

```
root = true

[*]
charset = utf-8
end_of_line = lf
indent_size = 2
insert_final_newline = true
trim_trailing_whitespace = true
indent_style = space

[*.rst]
indent_size = 3
```

.rstファイルを試しに作ってみて，インデントがスペース3つになっていることを確認する．

# 参考にしたドキュメント

[Python Livereload を使って Sphinx でドキュメントを書く](https://qiita.com/kshigeru/items/00cbc6b25c44715f9774)
[Windows環境でメンテしやすいドキュメントをSphinxで作る(rst形式, Markdown形式)](https://qiita.com/goforbroke/items/9f78ccb302615febcf84)
[Sphinxを使って自分用技術メモをAtom / VSCodeで取る時にやっていることの紹介](https://qiita.com/takuan_osho/items/aaa1e9b472ee07626e08)
[Visual Studio Codeを使ってみる](https://qiita.com/fukuit/items/9572ec53e21ce2b3e445#editorconfig)
[小ネタ] Check! Windows と Bash on Windows (WSL) で az コマンドのログイン情報を共有する

こんにちは、　@dz_ こと大平かづみです。

Prologue - はじめに
====

開発マシンは Windows 10 Pro ですが、何かと Linux 環境を使うことが多く、Bash on Windows (WSL) を中心にした環境を整えています。

完全に WSL で置き換えられるわけではなく、いかに Windows とハイブリッドで使うかが肝で、例えば今回挙げる `az` コマンドのログイン情報など、どちらでもシームレスに使えるよう小細工をよくしています。

なお、本件については、本当に小細工ですが（笑）、小ネタとして残しておきます。

`az` コマンドで共通のログイン情報を使う
====

要は、Windows 本体と、 WSL にそれぞれ Azure CLI 2.0 をインストールし、ログイン情報を格納する `.azure` ディレクトリを共有するだけです。

前提環境
----

ここでは、WSL は Ubuntu 16.04 を使います。

- [Learn about the Windows Subsystem for Linux | Microsoft Docs](https://docs.microsoft.com/en-us/windows/wsl/about)

Windows 本体と、WSL それぞれに Azure CLI 2.0 をインストールします。

- [Install the Azure CLI for Windows | Microsoft Docs](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli-windows?view=azure-cli-latest)
- [Install the Azure CLI 2.0 on Linux with apt | Microsoft Docs](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli-apt?view=azure-cli-latest)
- Ubuntu 以外の WSL でのインストレーションはこちらをご参照ください。
    - [Install the Azure CLI 2.0 | Microsoft Docs](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli?view=azure-cli-latest)

手順（というほどでもないですが…）
----

1. Windows 側で `az login` で Azure にログインする。
    - すると、 ユーザーディレクトリ配下に `.azure` ディレクトリが作成され、ログイン情報が格納されます。
2. WSL 側のホームディレクトリで、上記の `.azure` にシンボリックリンクを張る。

```bash
ln -s /mnt/c/users/<ユーザー名>/.azure ~
```

以上です！

WSL 側で `az account show` を実行して、Windows 側でログインした情報が表示されていれば完了です。

Epilogue - おわりに
====
今までは cmd/PowerShell を Linux 風にオーバーラップしてくれる [cmder](http://cmder.net/) を愛用していたのですが、可能な限り WSL に寄せてみることにしました。

cmder も気に入ってるので、気になる方はぜひ使ってみてください～

- [Check! cmder ～ Windows に Monokai スタイルのコンソールを導入 (実行ポリシーのトラブルシューティング) - Qiita](https://qiita.com/dz_/items/68de2b07aab9ef4aab68)
Excelで範囲内のセルが全て数値の時にTRUEを返す方法

### 結論

```
=SUMPRODUCT(--NOT(ISNUMBER(A1:C1)))>0=FALSE
```

* 範囲内のセルにたった一つでも文字列や、空白や、エラー文字列があれば FALSEを返す
* 範囲内のセルが全て数値であった時に TRUEを返す

http://office-qa.com/Excel/ex367.htm

ここには配列数式を使えばいいと書いてあったので最初それを試したのですが、
ためしに範囲内のセルに空白や文字列を書いてもTRUEが返ってきてダメじゃんと思って四苦八苦した結果、上の数式に落ち着きました。

###「--」って何ぞ

http://www.excel.studio-kazu.jp/kw/20040530061813.html

文字列を数値として処理するおまじないのようです。
Laravel5.5から5.6に更新する際にTypeErrorに遭遇した話

## やりたいこと
Laravel5.5をLaravel5.6に更新する

## 環境
* macOS HighSierra 10.13.3
* Docker version 17.12.0-ce, build c97c6d6
* docker-compose version 1.18.0, build 8dd22a9
* nginx version: nginx/1.13.6
* PHP 7.2.2 (cli) (built: Feb  6 2018 23:24:31) ( NTS )
* Laravel Framework 5.6.3

## 事象
`composer.json`の以下の項目を書き換えて`composer update`を実施しました。

```composer.json
        "php": ">=7.1.3",
        "fideloper/proxy": "~4.0",
        "laravel/framework": "5.6.*",
```

その後、アクセスすると以下のようなエラーが出ました。

```laravel.log
laravel.ERROR: Type error: Argument 2 passed to Symfony\Component\HttpFoundation\Request::setTrustedProxies() must be of the type integer, array given, called in /app/vendor/fideloper/proxy/src/TrustProxies.php on line 54 {"exception":"[object] (Symfony\\Component\\Debug\\Exception\\FatalThrowableError(code: 0): Type error: Argument 2 passed to Symfony\\Component\\HttpFoundation\\Request::setTrustedProxies() must be of the type integer, array given, called in /app/vendor/fideloper/proxy/src/TrustProxies.php on line 54 at /app/vendor/symfony/http-foundation/Request.php:564)
```

## 対応
* [Upgrade Guide](https://laravel.com/docs/5.6/upgrade)(Trusted Proxiesの部分)

ミドルウェア`App\Http\Middleware\TrustProxies`を書き換えてね！って書いてありました。

```php:app/Http/Middleware/TrustProxies.php(Laravel5.5)
    protected $headers = [
        Request::HEADER_FORWARDED => 'FORWARDED',
        Request::HEADER_X_FORWARDED_FOR => 'X_FORWARDED_FOR',
        Request::HEADER_X_FORWARDED_HOST => 'X_FORWARDED_HOST',
        Request::HEADER_X_FORWARDED_PORT => 'X_FORWARDED_PORT',
        Request::HEADER_X_FORWARDED_PROTO => 'X_FORWARDED_PROTO',
    ];
```

念のためLaravel5.6のスケルトンを拾ってくると、記述の通りメンバ変数`$headers`の定義がUpgradeGuide同様に配列型からString型に変わっていました。
ここはカスタムしていなかったので置き換えました。

```php:app/Http/Middleware/TrustProxies.php(Laravel5.6)
    protected $headers = Request::HEADER_X_FORWARDED_ALL;
```
再度確認し、無事動作することを確認しました。

## 補足
カスタムしていた場合、いい感じのやつをリクエストクラスから選んで当ててあげるようです。

```php:Illuminate\Http\Request.php
    const HEADER_FORWARDED = 0b00001; // When using RFC 7239
    const HEADER_X_FORWARDED_FOR = 0b00010;
    const HEADER_X_FORWARDED_HOST = 0b00100;
    const HEADER_X_FORWARDED_PROTO = 0b01000;
    const HEADER_X_FORWARDED_PORT = 0b10000;
    const HEADER_X_FORWARDED_ALL = 0b11110; // All "X-Forwarded-*" headers
    const HEADER_X_FORWARDED_AWS_ELB = 0b11010; // AWS ELB doesn't send X-Forwarded-Host
```

## 雑感
ちゃんとUpgradeGuideを読まない私が悪い。