OmniAICreator/Qiita-1.07M huggingface dataset:
プログラマ脳を鍛える数学パズル Q.3「カードを裏返せ」

[前回記事](https://qiita.com/hrtk_ymzk/items/b89d02fe43983824bb08)に引き続き問題を解いていく。
問題は[プログラマ脳を鍛える数学パズル](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E8%84%B3%E3%82%92%E9%8D%9B%E3%81%88%E3%82%8B%E6%95%B0%E5%AD%A6%E3%83%91%E3%82%BA%E3%83%AB-%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%A7%E9%AB%98%E9%80%9F%E3%81%AA%E3%82%B3%E3%83%BC%E3%83%89%E3%81%8C%E6%9B%B8%E3%81%91%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%AA%E3%82%8B70%E5%95%8F-%E5%A2%97%E4%BA%95-%E6%95%8F%E5%85%8B/dp/479814245X/ref=asap_bc?ie=UTF8)より。
# 今回の問題
> 1~100までの番号が書かれた100枚のカードが順番に並べられています。最初、すべてのカードは裏返しの状態で置かれています。ある人が2番のカードが表を向くようになります。
次に、別の人が、3番のカードから2枚おきにカードを裏返していきます。また、別の人が、4番のカードから3番おきに、カードを裏返していきます。
このようにn番目のカードからn-1枚おきにカードを裏返す操作を、どのカードの向きも変わらなくなるまで続けたとします。
**問題**
カードの向きが変わらなくなったとき、裏向きになっているカードの番号をすべて求めてください。

# 実装手順
①1から100までのカードの配列を作成する。それぞれの番号に表裏の情報を付与する（今回はtrue, falseとする）。
②めくるカード（問題でいう「n」）のループ文を作成する。問題文の通り2から100までにする。
③実際にめくるカードを決めるループ文を作成する。
④めくるカードが表(true)の時は裏(false)に、裏の時は表にする条件文を書く
⑤結果を出力する

# 書いたPHPコードと出力結果
```php:q03.php
<?php

$cards = [];

// ①表裏の情報を持つ1から100までのカード配列を作成する
for ($i = 1; $i <= 101; $i++) {
  array_push($cards, 'false');
  // 添字の番号とカード番号を合わせたいので、101枚作成して添字0のカードを削除する
  unset($cards[0]);
}

// ②nをループさせる
for ($number = 2; $number <= 100; $number++) {
  // ③nをn間隔でループさせてめくるカードを決める
  for ($i = $number; $i <= 100; $i += $number) {
    // ④めくるカードが表(true)の時は裏(false)に、裏の時は表にする
    if ($cards[$i] === 'true') {
      $cards[$i] = '';
      // 参照渡しをする
      $cards[$i] .= 'false';
    } elseif ($cards[$i] === 'false') {
      $cards[$i] = '';
      $cards[$i] .= 'true';
    }
  }
}

// ⑤結果を出力する
foreach ($cards as $key => $value) {
  if ($value === 'false') {
    echo $key;
    echo '<br/>';
  }
}

// 結果
1
4
9
16
25
36
49
64
81
100
```
できた～～:joy:
平方数が並んでいるのが**何か大きな力を感じます**。

# 今回の学び
- ループ文の中で配列の値を置換し出力する際に手間取ったが、「参照渡し」という概念があることを知った。
- カードの表裏の状態を、カードの値とは別に持っておくと操作しやすい
aws-cli で ClassicLoadBalancer の TLS を変更する。

# はじめに
もうClassicLoadBalancerを利用しているところは多くはないと思います。あっても数台だけとか。
さらにSecurityPolicyの変更なんて管理コンソールでちょこっといじれば終了でしょう。
でも、aws-cliで変更してみました。

# 設定
今回は、ポリシーの「確認 → 作成 → 設定」という流れで行います。

## ポリシーの確認
現在利用できるポリシーは `aws elb describe-load-balancer-policies` で確認ができます。

```bash:Policy確認
$ aws elb describe-load-balancer-policies --load-balancer-name <CLBの名前> | grep "PolicyName"
            "PolicyName": "AWSConsole-SSLNegotiationPolicy-<CLBの名前>-1234567890123",
            "PolicyName": "ELBSecurityPolicy-2016-08",
            "PolicyName": "AWSConsole-SSLNegotiationPolicy-<CLBの名前>-1234567890123",
            "PolicyName": "AWSConsole-SSLNegotiationPolicy-<CLBの名前>-1234567890123",
            "PolicyName": "AWSConsole-SSLNegotiationPolicy-<CLBの名前>-1234567890123",
            "PolicyName": "AWSConsole-SSLNegotiationPolicy-<CLBの名前>-1234567890123",
```

## ポリシーの作成

それでは _ELBSecurityPolicy-TLS-1-2-2017-01_ の _SecurityPolicy_ を作成します。
作成は `aws elb create-load-balancer-policy` で行います。

```bash:SecurityPolicy作成
$ aws elb create-load-balancer-policy --load-balancer-name <CLBの名前> --policy-name TLS-1-2-2017-01 --policy-type-name SSLNegotiationPolicyType --policy-attributes AttributeName=Reference-Security-Policy,AttributeValue="${TLS}"
```

今回は **--policy-name** の値を、_TLS-1-2-2017-01_ にしています。 先ほどの、`describe-load-balancer-policies` では _"ELBSecurityPolicy-"_ がついていましたが、コマンドで作成する際は _"ELBSample-"_ と _"ELBSecurityPolicy-"_ は予約語となっていて付けられないためです。

```bash:予約後エラー
$ aws elb create-load-balancer-policy --load-balancer-name <CLBの名前> --policy-name ELBSecurityPolicy-TLS-1-2-2017-01 --policy-type-name SSLNegotiationPolicyType --policy-attributes AttributeName=Reference-Security-Policy,AttributeValue="ELBSecurityPolicy-TLS-1-2-2017-01"

An error occurred (ValidationError) when calling the CreateLoadBalancerPolicy operation: Prefixes '[ELBSample-, ELBSecurityPolicy-]' are reserved.
```

## ポリシーの設定

作成が完了したら作成した **"<セキュリティポリシーの名前>"** を指定して設定変更です。
設定は `aws elb set-load-balancer-policies-of-listener` で行います。

```bash:Policy変更
$ aws elb set-load-balancer-policies-of-listener --load-balancer-name <CLBの名前> --load-balancer-port 443 --policy-names <セキュリティポリシーの名前>
```


# おわりに
管理コンソールからだとポリシーを指定するだけで切り替えられるのですが、cliだとまずはポリシーを作成してから切り替えないと行けないというのが注意点です。台数がなければCLBは管理コンソールから切り替えてしまった方が早そうですねw
nodist では、まだ npm@6.0.0 がインストールできない（2018年5月4日からインストールできます）

(2018/05/04追記)
npm の [Releases](https://github.com/npm/npm/releases) ページに v6.0.0 が掲載され、nodist でもインストール可能になりました。

----

`npm` って、実行すると、たまにアップデートを促しますよね。

こんな感じの。

```
   ╭─────────────────────────────────────╮
   │                                     │
   │   Update available 5.6.0 → 6.0.0    │
   │     Run npm i -g npm to update      │
   │                                     │
   ╰─────────────────────────────────────╯
```

なので、`nodist` で入れた `npm` でもアップデートしようと思ったわけです。
こんな感じで。

```
> nodist npm 6.0.0
```
そしたら、怒られるわけです。こんな感じ。

```
npm 6.0.0
Cannot read property 'trim' of null.
Sorry.
```

いろいろ調べてみたら、`nodist` は [GitHub 上の Releases](https://github.com/npm/npm/releases) のページを参照していて、このページでリリースされていないバージョンが指定されたら、上のエラーが出るっぽいです。

なので、上のページの最新リリース、`6.0.0-next.2` を指定すると、インストールは始まります。怖くて途中でやめましたが。
こんな感じで。

```
> nodist npm 6.0.0-next.2
```

~~なぜ `npm` は release してないバージョンへのアップデートを促すのか。。。~~
-> `npm` は、https://registry.npmjs.org/npm にあるメタデータを見て、判断しています。つまり、`npm`@6.0.0 は、正式にリリース済みでした。
そして `nodist` も、`6.0.0 is not found` くらい言ってくれればいいのに。。。

(追記)
`nodist` の中のファイル (`%NODIST_DIR%\lib\npm.js`)を下のように書き換えて、[tags](https://github.com/npm/npm/tags) からバージョン リストを取得するようにすると入れらないことはないですが、自己責任で。

```js:オリジナル
 47: NPMIST.listAvailable = function(){
 48:   return github.releases.listReleasesAsync({
 49:     owner: 'npm',
     (中略)
184:     var available = results.map(function(v){
185:       return v.tag_name;
186:     });
```

```js:魔改造
 47: NPMIST.listAvailable = function(){
 48:   return github.repos.getTagsAsync({ user: 'npm',
 49:     owner: 'npm',
     (中略)
184:     var available = results.map(function(v){
185:       return v.name;
186:     });
```
魔改造後のインストール結果

```
> npm 6.0.0
https://codeload.github.com/npm/npm/tar.gz/v6.0.0 [============   ] 6815/8351 KiB 82% 7.3s
> npm -v
6.0.0
```
Laravel News まとめ一覧 （随時更新）

[Laravel News](https://laravel-news.com/)には良記事が満載なので、備忘録の意味合いも込めて、記事を簡単にまとめていこうと思います（翻訳ではないです）。

[Laracasts: What’s New in Laravel 5.6](https://qiita.com/yukimunet/items/4267cbf95816265024c0)
[Laravel 5.6.17 Released](https://qiita.com/yukimunet/items/fd92a5b7645c5a27f780)
[VuePress: A Vue-powered Static Site Generator](https://qiita.com/yukimunet/items/84e2059f07e6e15b4506)
[Flexible Heredoc and Nowdoc Coming to PHP 7.3](https://qiita.com/yukimunet/items/2b4acd011be920b93f82)
[Announcing Building a Chatbot with Laravel and BotMan](https://qiita.com/yukimunet/items/d2df5720238d670761ef)
[Laravel Page Cache for Lightning Fast Page Loads](https://qiita.com/yukimunet/items/45ee3b7bdb399042e020)
[Leverage Eloquent To Prepare Your URLs](https://qiita.com/yukimunet/items/5211345632bb6166571d)
Laracasts: What’s New in Laravel 5.6

[Laravel News](https://laravel-news.com/)には良記事が満載なので、備忘録の意味合いも込めて、記事を簡単にまとめていこうと思います（翻訳ではないです）。

# 元記事
投稿日: 2018/04/27
タイトル: Laracasts: What’s New in Laravel 5.6
URL: https://laravel-news.com/laracasts-whats-new-in-laravel-5-6

# まとめ
Laravel 5.6を解説しているLaracastsの紹介です。
日本語で(ry
Laravel 5.6.17 Released

リリース記事は多いのでまとめることにしました。
[こちら](https://qiita.com/yukimunet/items/761771457361ba8999d3c)を見てください。

---

[Laravel News](https://laravel-news.com/)には良記事が満載なので、備忘録の意味合いも込めて、記事を簡単にまとめていこうと思います（翻訳ではないです）。

# 元記事
投稿日: 2018/04/23
タイトル: https://laravel-news.com/laravel-5-6-17
URL: https://laravel-news.com/laravel-5-6-17

# まとめ
Laravel 5.6.17の解説です。

* joinSub等のJOINでサブクエリを使うメソッドの追加
サブクエリをJOINするとき、これまではjoinメソッドに生のSQLを渡していましたが、クロージャやクエリビルダが使えるようになりました。

* Rule::in()、Rule::notIn() でCollectionが使えるようになった。
使えなかったんだ…、という感想。
ServiceNowでユーザーログイン時にスクリプトを自動起動しログインユーザーの情報を取得する

# 概要

ServiceNowでユーザーがログインしたときに何らかの処理をキックしたい場合に使用する。
Script Actionで「session.established」イベント発生時の処理を書く。
注意点として、このスクリプトの起動ユーザーは「system」となっているため、

```javascript
gs.getUserName()
```

で取得できるユーザーは、ログインしたユーザーではなく、常に「system」となっている点だ。
ログインユーザーのユーザー名はイベントの引数として受け取ることが可能だ。

```javascript
event.parm1
```

## 環境

ServiceNow : KINGSTONE

# 手順

## Script Action作成

StudioからCreate Application Fileで起動される画面で、
「Server Development」カテゴリの「Script Action」を選択してCreateをクリックする。
Nameは適当につける。
Event Nameには、「session.established」を選択する。

![NewScriptAction.png](https://qiita-image-store.s3.amazonaws.com/0/197947/352bdc7d-e2e9-ae7f-3032-13326986cddd.png)


## コード入力

Scriptに次のように入力してSubmitで保存する。
今回は、特に有用な処理は記載していない。
「gs.getUserName」では必ず「system」が取得される事と、
event.param1でユーザー名、event.param2でアクセス元のIPアドレスが渡されていることをアプリケーションログに出力して確認している。
また、ついでにユーザーテーブルからログインしたユーザーの情報を取得してログに出力している。

```javascript
gs.info("ログインイベント発生");
gs.info("ログインユーザー名 = " + gs.getUserName());

gs.info('event.parm1 = ' + event.parm1);
gs.info('event.parm2 = ' + event.parm2);

var userid = event.parm1;
var r = new GlideRecord('sys_user');
r.addQuery('user_name', userid);
r.query();
if (r.next()) {
	var l = r.getValue('preferred_language');
	gs.info('ユーザーのpreferred_languageは、  ' + l);
} else {
	gs.info('ユーザー検索失敗');
}
```

![loginscript.png](https://qiita-image-store.s3.amazonaws.com/0/197947/6df6db8b-aade-e7c7-992d-5dff09dc8dae.png)


## 動作確認

adminなどでログインしている場合は、一旦ログアウトしてから、ServiceNowにログインし直してからアプリケーションログを確認する。
今回は「testu」というユーザー名でログインしている。

![loginlog.jpg](https://qiita-image-store.s3.amazonaws.com/0/197947/ed8b4bd5-591a-e6ed-e3d6-e2dced1056b9.jpeg)

「gs.getUserName()」と「event.parm1」の出力の違いが確認できる。


※IPアドレス部分は画像加工している。
※ログの表示順は時間順にしているがミリ秒単位での並べかえとなっていないため、出力順と異なる。

##　この他のログイン関連のイベントスクリプトについて

スクリプト起動のイベントとして「login.faildやlogin.authoraization.failedイベントを選択可能だ。
ログイン成功時のみではなく、ログイン失敗時の処理も書く事が可能だ。
VuePress: A Vue-powered Static Site Generator

[Laravel News](https://laravel-news.com/)には良記事が満載なので、備忘録の意味合いも込めて、記事を簡単にまとめていこうと思います（翻訳ではないです）。

# 元記事
投稿日: 2018/０４/20
タイトル: VuePress: A Vue-powered Static Site Generator
URL: https://laravel-news.com/vuepress

# まとめ
Markdownから静的ページを生成するジェネレータの説明です。
生成だけでなく、編集しながら確認できる機能もあります。
詳細は参考記事を。

# 参考
[VuePress をお試ししてみた](https://qiita.com/dojineko/items/aae7e6d13479e08d49fd)
DALIメモ

[第２回オープン設備制御研究会「さわって覚えるDALI制御」](https://digital-light.jp/2018/04/27/second-open-facility-control-meeting-was-held/)に参加させていただき、DALIの規格について興味を持ちました。
その後に色々と自分で調べてみた内容についてのメモです。

## 機能
### 調光レベル
8ビットで指定。1-254まで。

### POWER ON LEVEL
電源入力時の調光レベル

### SYSTEM FAILURE LEVEL
障害発生時の調光レベル

## バラストが持つデータ
|名称|内容|初期値|範囲|
|:--|:--|--:|--:|
|ACTUAL DIM LEVEL|現在の調光レベル|-|MIN - MAX|
|MIN LEVEL|調光レベルの下限|PHYSICAL MIN LEVEL|PHYSICAL MIN LEVEL - MAX|
|MAX LEVEL|調光レベルの上限|254|MIN - 254|
|POWER ON LEVEL|電源入力時の調光レベル|254|1 - 254|
|SYSTEM FAILURE LEVEL|障害発生時の調光レベル|254|0 - 255|
|FADE RATE|フェードレート|7(=45steps/sec)|1 - 15|
|FADE TIME|フェードタイム|0(=フェードなし)|0 - 15|
|SHORT ADDRESS|ショートアドレス|255(‘MASK’)(=アドレスなし)|00 - 63 ,255|
|SEARCH ADDRESS|サーチアドレス|FF FF FF|00 00 00 - FF FF FF|
|RANDOM ADDRESS|ランダムアドレス|FF FF FF|00 00 00 - FF FF FF|
|GROUP 0-7|グループ0-7への所属の有無|0000 0000(=所属なし)|0000 0000 - 1111 1111|
|GROUP 8-15|グループ8-15への所属の有無|0000 0000(=所属なし)|0000 0000 - 1111 1111|
|SCENE 0-15|シーン|255(‘MASK’)(=シーンなし)|0 - 255|
|STATUS INFORMATION|ステータス情報|0000 0000|0000 0000 - 1111 1111|
|VERSION NUMBER|バージョン情報|factory burn-in|0 - 255|
|PHYSICAL MIN LEVEL|ハードウエア上の調光レベルの下限|factory burn-in|0 - 255 |

## コマンドリスト

### Arc power control commands
調光レベルを操作するコマンド

### Configuration commands
バラストの設定を行うコマンド

### Query commands
バラストの状態を調べるコマンド
Forwardフレームに対してBackwardフレームが返される。

### Special commands
アドレス設定を行うコマンド

DAP
IAP

## フレーム構造
マスターからスレーブへの送信をForwardフレーム、スレーブからマスターへの送信をBackwardフレームと呼ぶ。

- Forwardフレームに対応するBackwardフレームを特定する仕組みは無い。

##Forwardフレーム

- 全体で19ビット

|名称|bit数|内容|
|:--|--:|:--|
|スタートビット|1|フレームの先頭を示す。常に1。|
|アドレスバイト|8|フレームの送信先を指定する。|
|データバイト|8|コマンドを指定する。|
|ストップビット|2|フレームの最後尾を示す。常にHi。|

アドレスバイトはさらに3つのパートに別れる。

|名称|bit数|内容|
|:--|--:|:--|
|スタートビット|1|フレームの先頭を示す。常に1。|
|アドレスバイト|6|フレームの送信先を指定する。|
|データバイト|1|コマンドを指定する。|

##Backwardフレーム

- 全体で11ビット
- 返答先が指定されないためどのForwardフレームに対応しているのかは明示的でない。

|名称|bit数|内容|
|:--|--:|:--|
|送信群指定|1|0: ショートアドレス(個別のアドレス指定)<br>1: グループアドレスまたはブロードキャスト|
|アドレスビット|6|全て1でブロードキャストを示す。|
|セレクトビット|1|0: DAPコマンド<br>1: それ以外のコマンド|

###参考リンク
[Node-REDで照明に特化したDALI APIと連携するナレッジをウフル社と共有しました](http://blog.enebular.com/dali/node-red-flow-dali-api-first-contact_01/)
http://toragi.cqpub.co.jp/Portals/0/greenele/backnumber/no2/p089-090_.pdf
Rails tableのカラム名を変更

## やること　　投稿フォーム、カラム修正する。

Contentをsentenceに修正。
モデル名 articles

<img width="605" alt="スクリーンショット 2018-04-26 20.07.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/243378/1ccdeae7-1918-b406-0123-394dcdbf7769.png">

参考にしたページ
【備忘録】Rails-カラム名を変更する方法
https://qiita.com/kaito-chiba/items/723da8627438b67cc02c

## 　ファイル作成

migrationファイル作成。

```
$　rails generate migration rename_content_column_to_articles

```

## 　編集する

下記ファイルが作成される

```db/migrate/20180427005336_rename_content_column_to_articles.rb
class RenameContentColumnToArticles < ActiveRecord::Migration[5.0]
  def change

  end
end

```
次のように変更する

```db/migrate/20180427005336_rename_content_column_to_articles.rb
class RenameContentColumnToArticles < ActiveRecord::Migration[5.0]
  def change
    rename_column :articles, :content, :sentence
  end
end

```

rename_column :テーブル名 , :変更前のカラム名, :変更後のカラム名


## 　データベースに反映させる。

```
$ rake db:migrate

```
これで、大丈夫。

あとは、viewsなどを修正していく。

<img width="859" alt="スクリーンショット 2018-04-28 10.48.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/243378/882d6b7b-817c-9c3f-3c19-6b0baaf6a72a.png">

## 　番外
1. generateコマンド取り消し方法 

```
$ rails destroy migration rename_content_column_to_articles

```
db/migrate/20180427005336_rename_content_column_to_articles.rbファイルの修正を間違えたため、コマンドを取り消してみた。

２. カラム名は、日本語にしないほうが良い
参考にしたページ
https://qa.atmarkit.co.jp/q/2207

## 　最後に。
もし、何か間違いなどありましたら、ご指摘いただけると幸いです。
センスウェイのLoRaWANサービスを使ってみる　その５

最後に、デバイスからACK要求付きの上りデータ送信を試してみます。

[その１](https://qiita.com/akira-tt/items/28e999435e2d8fb047b9)
[その２](https://qiita.com/akira-tt/items/dd7f9286509735fcc9c3)
[その３](https://qiita.com/akira-tt/items/e64f0490abe9556f5c9c)
[その４](https://qiita.com/akira-tt/items/5782687c21758d0b3739)

-----

# ACK要求付きデータ送信

## 送ってはみたものの…

まずはおさらいということで、ACK要求なしの上りデータ送信を行ってみます。

```
> lorawan tx ucnf 1 01
>> Ok
>> tx_ok
```

アプリケーションサーバにも想定通りのデータが届いていることが確認できました（詳細略）。引き続き、ACK確認付きで送信してみます。

```
> lorawan tx cnf 1 01
>> Ok
>> tx_ok
```

あれ？

てっきりアプリケーションサーバからACKを返す必要があるのだと思っていたのですが、実際にはACK要求なしの場合と同じ動作をしています。もちろんアプリケーションサーバには正常にデータが届いていて、

```
lora/<useryname>/<devEUI>/rx {"gw":[{"date":"2018-04-28T01:34:28.243316Z","rssi":-43,"snr":7.8,"gwid":"<gwid>"}],"mod":{"fq":927.8,"cnt":26,"data":"01","mt":"cnf","devEUI":"<devEUI>","dr":"2","port":1}}
```

`"mt":"cnf"`となっていて、正常にACK要求付きで送信されていることが確認できます。なぜ？？

## 調べてみる

まだまだLoRaWANの資料というのは少なく、ちょっとググってみてもなかなか情報が見つかりません。正規の規格書[Core LoRaWAN™ Specification](https://lora-alliance.org/resource-hub/lorawantm-specification-v11)を読んでみてやっと動作が理解できました。

抜粋すると

> **4.3.1.2 Message acknowledge bit and acknowledgement procedure (ACK in FCtrl)**

> When receiving a confirmed data message, the receiver SHALL respond with a data frame that has the acknowledgment bit (**ACK**) set. If the sender is an end-device, the network will try to send the acknowledgement using one of the receive windows opened by the end-device after the send operation.
```

拙訳ですが、

> confirmedな（訳注　ACK確認要求付きの）データメッセージを受信したとき、受信側は確認ビット（**ACK**）をセットしたデータフレームを返送しなければならない。送信側がエンドデバイスのとき、ネットワーク側（訳注　ゲートウェイのことですね）は送信側の送信動作に引き続いて行われる（訳注　2つの）受信ウィンドウのいずれか1つを使ってACKを送信しようとする。

と規定されていました。つまり、私が誤解していたのは

- 誤：アプリケーションサーバがACKを返す
- 正；ゲートウェイがACKを返す

こういうことであって、アプリケーションが知らないところで自動的にACKが返されているというわけです。ですから、ACK確認があろうが無かろうが見かけ上は全く同じ動作になるのが当たり前、ということになります。

## 改めて、ACK確認付きメッセージを送ってみる

ACKはゲートウェイが自動的に返すわけですから、裏を返すとデバイスがゲートウェイに接続できない場合にはACKが返ってこないということになります。というわけで、ゲートウェイの電源をOFFにしてから試してみましょう。まずはACK確認なしの場合です。

```
> lorawan tx ucnf 1 01
>> Ok
>> tx_ok
```

無事（？）送信が成功しました。もちろんアプリケーションサーバには全くデータが届きません。一方、ACK確認付きの場合は

```
> lorawan tx cnf 1 01
>> Ok
>> err
```

今度は正常に（？）送信エラーになりました。なるほど、デバイスからのACK確認付き送信というのは、ゲートウェイにデータが届いたかどうかを確認するためのものだったのですね。

# まとめ

- デバイスからACK確認付きデータを送ると、ゲートウェイまでデータが届いたかどうかを確認することができます
    - アプリケーションサーバにデータが届いたか、ではありません
    - ACK確認なしで送信すると、ゲートウェイが死んでいたり圏外だったりした場合でも送信が成功してしまいます

これでひととおりの動作確認が完了しました。実際には今回紹介したような低水準の操作をユーザーが行うことはあまり無く、何かしらのライブラリを使うことになると思います。とはいえ、こうしてひとつひとつ動作を追うのも楽しいものです。
ElasticBeanstalk custom platformのサンプルでAMI作成リージョンを変える

[AWS Elastic Beanstalkのドキュメント](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/custom-platforms.html?icmpid=docs_elasticbeanstalk_console)にあるサンプルを使ってTokyoリージョンにAMIを作ろうとしてハマったのでメモ。

Custom Platformのファイル群はgit管理する必要がある。commitしていない変更はアップロードされないので注意！私がハマったのはむしろここorz

custom_platform.json
* builders.region: AMIが作成されるリージョン。`ebp init`で`ap-northeast-1`を選択しても、これが`us-west-2`とかだとそっちに作成されてしまい、`ap-northeast-1`のEBでは使用できなくなる。
* builder.source_ami: 指定したAMIのリージョンがbuilders.regionにマッチしないと、AMI not foundエラーになる。

UbuntuのAMIはここで探すと良い https://cloud-images.ubuntu.com/locator/ec2/

あるいは、[Packerのドキュメント](https://www.packer.io/intro/getting-started/build-image.html#the-template)のように`source_ami_filter`を使ってもよい。
Docker上でrails/webpackerなアプリケーションの開発用DockerfileではNODE_ENVを明示的にdevelopmentに指定してyarn installしよう

タイトルの通り。

```Dockerfile
RUN yarn install

...

EXPOSE 3000
CMD ["bundle", "exec", "rails", "server", "-b", "0.0.0.0"]
```

とやって、、、

```
$ docker run <<↑のDockerfileをbuildしてできたimage>>
```

すると

```
=> Booting Puma
=> Rails 5.2.0 application starting in development
=> Run `rails server -h` for more startup options


========================================
  Your Yarn packages are out of date!
  Please run `yarn install` to update.
========================================


To disable this check, please add `config.webpacker.check_yarn_integrity = false`
to your Rails development config file (config/environments/development.rb).
```

おや、yarn installしたはずなのにな、、、？？となった。

タイトルの通りDockerflieでは以下のようにする必要があった。

```Dockerfile
RUN NODE_ENV=development yarn install
```

もちろんこれは、RAILS_ENV=developmentの時にはこうする必要があるよ、というお話でした。
Ubuntu 16.04 Desktopでのちょっとした小ネタ備忘録

MacBookAir(mid 2011 日本語キーボード)のmacOSを吹き飛ばしてUbuntuマシンにした時のあれこれ
手探りでやったことのあやふや備忘録なので参考までに...

# キーボード配列

Text EntryのInput Sourceの意味をわかってなくて英語打つにはEnglishにしなきゃいけないと思ってた...一覧にEnglish(US)ではなくJapaneseを設定することでキーボード印字通り記号が打てる。

(会社と外付けキーボードはUS配列なので混乱してしまう。USに統一したい)

# 日本語入力

1. ```sudo apt-get install fcitx-mozc -y```
2. ```im-config -n fcitx```
3. OS再起動

# 中国語入力

1. ```sudo apt-get install fcitx-googlepinyin```
2. Text EntryでGoogle Pinyinを追加

# Libvirtをいれたらログイン画面にLibvirt QEMUと出てしまう

こんなファイルを作れば隠せる

```conf:/var/lib/AccountsService/users/libvert-qemu
[User]
SystemAccount=true
```

# Launcher(Dock?)で最近使ったファイルを隠したい

1. Security & Privacy -> File & Applicationタブ
2. Clear Usage Data...をクリック
3. Record file and application usageをOFFにする
ラズベリーパイ工作　vol1~vol2

ラズベリーパイを購入し、IOTにチャレンジすることに

購入品目
ディスプレイ
キーボード
マウス
ラズベリーパイ本体
配線など一式

vol１　ランプ２つを交互に点滅させる

配線例
![alt](https://qiita-image-store.s3.amazonaws.com/0/245059/b2030f4f-ba42-156e-3a09-144b2cbe7bfe.jpeg)



ものの１０分で完成。
０.５秒ずつで交互にランプが点灯するように

初めての作成ながら感動がすごく
さらにラズベリーパイにはまっていきそう。

本当はQiitaに稼働動画を載せたいが載せる方法がわからない
どなたか教えてください
Python > list | tuple > [数値の組合せlist]の中に[tuple定義の同じ数値組合せ]があるか確認する

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04.4 LTS desktop amd64
TensorFlow v1.7.0
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
ADDA v.1.3b6
gnustep-gui-runtime v0.24.0-3.1
PyMieScatt v1.7.0
```

```
(2, 9) [[2, 5], [3, 5], [3, 6], [4, 6], [4, 7], [0, 7], [0, 8], [1, 8], [1, 9], [2, 9]]
```

右側のlistの中に左側のtuple(2, 9)があるか確認したい。

https://stackoverflow.com/questions/2345092/python-why-is-comparison-between-lists-and-tuples-not-supported

https://ideone.com/ij6fRv

```py
alist = [[0, 2], [0, 3]]
atpl = (0,2)

if atpl in alist:
    print('in1')

if atpl in tuple(alist):
    print('in2')
    
if list(atpl) in alist:
    print('in3')
    
```

```txt:run
in3
```

同じ土俵に上げることで比較できるようになる。

上記の例ではlistにすることで希望の処理になった。


### 教えていただいた事項
(追記 2018/04/28)

@shiracamus さんのコメントにてtupleへの変換方法を教えていただきました。

情報感謝です。
Twitter が Internet Explorer11をサポート外にしたようです

#それはJSTで2018/04/26の終わりごろから発生した。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">IE11はダメでIE10はいいと言われても…</p>&mdash; キの人 (@kometaroh) <a href="https://twitter.com/kometaroh/status/989995651961245697?ref_src=twsrc%5Etfw">2018年4月27日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">「お使いのブラウザは現在サポートされていません。より快適にTwitterをご利用いただくために、ブラウザを更新してください。」<br><br>IE11以上のバージョンプリーズ…<br><br>TwitterはIE11サポートしてないんだってね。<br>Microsoft Edgeは未だ使う気になれないのでChromeかFirefox使えってことなんかな。</p>&mdash; レイジ (@rage_twtw) <a href="https://twitter.com/rage_twtw/status/990018566752583680?ref_src=twsrc%5Etfw">2018年4月28日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">なにこれ、ついったはもうIE11を見捨てたっていうのかよ… <a href="https://t.co/ya0LnPLg6m">pic.twitter.com/ya0LnPLg6m</a></p>&mdash; メンタルヘルス暁美ほむら (@MenhelHomura) <a href="https://twitter.com/MenhelHomura/status/989829153854640128?ref_src=twsrc%5Etfw">2018年4月27日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
#IE11の強制終了も影響か（なら更新じゃないと思うけど）

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">IE11はMSが開発終了でセキュリティサポートのみとなっていて、MSはEDGEに注力しますよって事で今後いろんなツールがIE11サポート外になりまふ</p>&mdash; みっふぃ＠例大祭一般 (@udomyon_69) <a href="https://twitter.com/udomyon_69/status/989741577567256576?ref_src=twsrc%5Etfw">2018年4月27日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

とりあえずVBAから動かないの、なんとかしてほしい。

#対処方法
これは不安定ですけど
IE11の互換性にTwitter.comを登録する(mobile.twitter.comは登録してもTwitter.comになる)
mobile.twitter.comにアクセスする。
[初心者でもわかる! IE で互換表示 (IE10/IE9)](https://support.microsoft.com/ja-jp/help/2618122)
で一応モバイル版になります。
ただこの方法は不安定でMobile版に飛ばずブラウザ版に飛んだりします。
また更新を促すメッセージが時々出たりします。
機能はMobile版なので制限があります。
git環境を構築してみた

#はじめに

会社のチーム内で似たようなプログラムを扱うのにも関わらず、個人の中で醸造され、ガラパゴス化されている。バージョン管理をして情報を共有し、コードを可視化すると開発効率も高まるのではないかと思い、個人環境でgitを試し。チームに展開してみたい。

#リポジトリとは
リポジトリとは、開発データを一元管理して保存している場所で、メインとなるデータをリモートリポジトリに置いて管理する。その情報を自分のPCにコピーし、ローカルリポジトリを作って作業をする。

git環境のリポジトリイメージを図にしてみる。

![gitイメージ図.png](https://qiita-image-store.s3.amazonaws.com/0/176158/b4eaf051-c474-1e85-57f9-774cac7cc42b.png)

ローカルリポジトリで編集した内容をリモーリポジトリに入れ換えることで複数人で同時開発することが可能となる。

#リモートリポジトリの作成
編集中
https://qiita.com/nutsinshell/items/c7de1d35d57faf0b8549

＃ローカルリポジトリの作成
編集中
https://www.hivelocity.co.jp/blog/34777/
アリババクラウドのECSを東京リージョンの最安値で起動してみる！

# はじめに
いわゆる、やってみたって記事ではあるのですが
以前起動だけはしてるんですけど
改めて、まとめてみます。

# コンソールにログインして、ECSを選びます。
![0.fq07wowj8i.png](https://qiita-image-store.s3.amazonaws.com/0/241104/17b6630b-852e-0b1c-611e-a6a11b44370e.png)

# インスタンスを選びます。
インスタンスリストから
**Asia Pacific NE 1 (Japan)**
を選びます。

![0.m8w6wnvkoam.png](https://qiita-image-store.s3.amazonaws.com/0/241104/4b84b013-0ac4-4f0b-f212-eab6ef60f736.png)

# スタータパッケージのまま買わずに、エキスパート向け&従量課金に切り替えましょう。
ここは、**重要なポイント**です。
月額課金が主体のため、従量課金を確認してインスタンスを選びましょう。
選び間違えると金額が大きくなります。

![0.ea4nkj9z6ss.png](https://qiita-image-store.s3.amazonaws.com/0/241104/e217bb19-d5cc-2266-e85e-8dcf5d26c8fc.png)

![0.t10ikjz8s8e.png](https://qiita-image-store.s3.amazonaws.com/0/241104/bc0d59ba-30bc-5a22-5e48-5011a186ca6d.png)

このパッケージコストが
**/時間**
になっていることを確認しましょう

# エキスパート向け&従量課金でインスタンスを構築する

## 基本構成
一番低いインスタンスを起動します。

**ecs.xn4.small** を選択しました。

![0.bkf53u88gu6.png](https://qiita-image-store.s3.amazonaws.com/0/241104/e9f7c7fc-fb56-1313-21b3-5faab54be17b.png)

イメージを、Aliyun Linux 17.1 64bit。
ストレージを、Ultra クラウドディスクの20GB
にしました。ここの選定はざっくりとしてます。

![0.chikeuwce3e.png](https://qiita-image-store.s3.amazonaws.com/0/241104/bec8c103-5db2-3691-acd9-59d44eb7779f.png)

## ネットワーク
ネットワークはまた別の機会に話したいので少し省略していきます。
もしWEBサーバを作るのでしたら、セキュリティグループで80と443ポートを開いてください。

![0.nxj1rl9wrpk.png](https://qiita-image-store.s3.amazonaws.com/0/241104/654c1d65-9bde-e5e6-2976-3693bf76d75b.png)

## プレビュー
利用規約の
**ECS SLA と 利用規約に同意する**
にチェックしてインスタンスの作成してください。

## できあがり
インスタンスが作成できます

# インスタンスが作成できたら
![0.a7xp33o9vbm.png](https://qiita-image-store.s3.amazonaws.com/0/241104/ebf41ece-33b7-522c-addf-ce820880b4eb.png)

このままですとサーバにアクセスできません。

## パスワードを設定して再起動してください。
![0.dct3tlslhtm.png](https://qiita-image-store.s3.amazonaws.com/0/241104/d150680f-5c02-fe8a-c70c-6fa9405687b3.png)

# ターミナルを起動してサーバにSSH接続します。

```shell
[f_prg@Documents] $ ssh root@47.74.8.241
The authenticity of host '47.74.8.241 (47.74.8.241)' can't be established.
ECDSA key fingerprint is SHA256:1mcnQCUuwlEG6rwSqxX0EuwpcHhTMvMQMep6p6ftgHg.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '47.74.8.241' (ECDSA) to the list of known hosts.
root@47.74.8.241's password:

Welcome to Alibaba Cloud Elastic Compute Service !

[root@iz6web5k6nxope3402r41az ~]#
```

_久々にrootユーザーでパスワードログインというSSH接続しました。。。_

# まとめ
ひとまず簡単に起動までというところです。
もう使わない場合は、リリースしてサーバを破棄しましょう。
Pure JavaScriptで画像の遅延ロード

縦に長いWebページを作っているのですが、
Webサイトの初期表示までを高速化するために画像の遅延ロードを採用することに。

調べてみると、各種ライブラリを使用するケースがヒットしました。
おそらく、Qiita上でもっともよくまとめられているのはこちら:
[LP高速化のために5つの画像の遅延読み込みライブラリを比較した](https://qiita.com/tkhr/items/4b5e7f2a384dc4fccb20)

が、遅延ロードのために依存ライブラリ増やしたりスクリプト量膨らますのはちょっと、、、
ということで、少し調べてみたところ、
もっともシンプルな実装例がDavid Walsh氏によるこちら:

# 実装例
```sample.html
<img data-src="image.jpg" alt="test image">
```

```sample.css
img {
  opacity: 1;
  transition: opacity 0.3s;
}

img[data-src] {
  opacity: 0;
}
```

```sample.js
[].forEach.call(document.querySelectorAll('img[data-src]'), function(img) {
  img.setAttribute('src', img.getAttribute('data-src'));
  img.onload = function() {
    img.removeAttribute('data-src');
  };
});
```
imgタグのsrcでなく、data-srcというattributeに画像のurlを指定しておいて、
動的に読み込み表示する、というものですね。うん、シンプル。

# 適用例
・スクロールに応じて遅延ロードを実行
・画像のロード完了までは、ローディング中の演出を表示

こういった代表的な遅延ロードに伴う実装の例を以下に添えておきます。
Gifアニメのローディングは綺麗なフレームレートを保とうと思うと10KB以上になったりするので
CSSアニメーションでの実装をおすすめします。

```sample.html
<!--
image.jpgと同サイズのアルファのみの(透明な)default.pngをimg.srcにセットし
遅延ロードの実行前でもレイアウトが崩れないようにする。
本当はcssでimgのサイズをコントロールするのが理想ですが、
例えば、レスポンシブデザインのHTMLテンプレートを使っている場合などでは、
imgに透過画像を配置してしまった方が調整いらずで確実です。
ちなみにアルファのみの画像は tinypng などで圧縮すると極めて軽量(< 1KBになりえる)。
-->
<div class="parent-block">
  <img src="default.png" data-src="image.jpg" alt="test image">
  <div class="img-loading-animation"></div>
</div>
```


```sample.css
img {
  opacity: 1;
  transition: opacity 0.3s;
}

img[data-src] {
  opacity: 0;
}

/*
cssでのloadingアニメーションを実現するクラスをLoading.IOなどから調達。
imgとローディングアニメーションを囲うdivを用意し、
その中央部にローディングが表示されるよう調整。
*/
.some-loading-animation { ... }
.parent-block {
  position: relative;
}
.parent-block .some-loading-animation {
  position: absolute;
  top: 50%;
  left: 50%;
  margin-top: 32px; /* 32pxはあくまで例。 .some-loading-animationの高さ / 2 の値をセット */
  margin-left: 32px; /* 32pxはあくまで例。 .some-loading-animationの幅 / 2 の値をセット */
  z-index: -1; /* imgが表示された際に背部にまわるように設定。 */
}
```

```sample.js
window.addEventListener('scroll', (e) => {
  // window.innerHeightや、document.getElement(...).offsetTop等を使い、
  // 遅延ロードの実行を開始するスクロール量を決定。
  const scrollThreshold = XXX;
  if (window.pageYOffset >= scrollThreshold) {
    [].forEach.call(document.querySelectorAll('img[data-src]'), function(img) {
      img.setAttribute('src', img.getAttribute('data-src'));
      img.onload = function() {
        img.removeAttribute('data-src');
      };
    });
  }
});
    
```


# 参考
- [Five Techniques to Lazy Load Images for Website Performance](https://www.sitepoint.com/five-techniques-lazy-load-images-website-performance/)
- [Loading.IO](https://loading.io/css/)
- [LP高速化のために5つの画像の遅延読み込みライブラリを比較した](https://qiita.com/tkhr/items/4b5e7f2a384dc4fccb20)
【Swift】Swiftの変遷がわかるサイト

一言メモです。

## What's new in Swift
https://www.whatsnewinswift.com/

プルダウンでバージョンを選べ、どのバージョンのときに何が変更されたのかがわかるサイト。
「もしかしてこの書き方古いのか？」などをチェックするのに便利なのかなと思いました。
デザイン覚え書き

### ある枠の中で、対象のブロックを右下に移動させる。

position: absoluteは、親要素がrelativeだと、そこを基準にしたポジションとなる。

```scss:sample.scss

.partent-sample{
  position: relative;
}

.child-sample{
  position: absolute;
  bottom: 0;
  right: 0;
}
```
https://html-coding.co.jp/knowhow/tips/000226/
Jupyter + Matplotlib > scatter()の点の描画順番を可視化 > 色: 失敗, テキスト: 成功

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04.4 LTS desktop amd64
TensorFlow v1.7.0
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
ADDA v.1.3b6
gnustep-gui-runtime v0.24.0-3.1
PyMieScatt v1.7.0
```

### 処理概要

- ax.scatter()で描画する点はどの順番で描画しているかを分かるように

### 検討

- 1. 色やマーカーを変える
- 2. テキストを付ける

### 関連

- [Jupyter + Matplotlib > 散布図の上にx軸のデータをテキスト表示する > showNoriMueller_180203.ipynb v0.1](https://qiita.com/7of9/items/d3eb5a56ab46c970f34c)

### code v0.1

[geometry > numpy > star shaped (星形) の座標を得る | Matplotlibでの描画 > v0.3:座標は得られた | v0.4: モジュール化](https://qiita.com/7of9/items/e23c81db584ffae7edd3#_reference-ebd9b3a13d0ca028b94c)
をベースにコードを作成した。

```py:test_plot_with_diffColor_180428.ipynb
%matplotlib inline

import numpy as np
import matplotlib.pyplot as plt
from pylab import rcParams
import geometry_starShaped_180415 as GSS

'''
v0.1 Apr. 28, 2018
  - add index text for each ppint
  - plot with different colors
  - delete 1 figure
=== branched from [geometry_starShaped_180414.ipynb] ===
v0.4 Apr. 15, 2018
  - tweak figure size
  - show 2 results 
  - separate get_pentagon() and get_starShaped() to [geometry_starShaped_180415]
v0.3 Apr. 14, 2018
  - add get_starShaped()
v0.2 Apr. 14, 2018
  - fix bug: get_pentagon() did not use [radius] arg
  - get_pentagon() takes [upward] arg
v0.1 Apr. 14, 2018
  - add get_pentagon()
      + to obtain pentagon geometry
'''

rcParams['figure.figsize'] = 14, 7
rcParams['figure.dpi'] = 110

RAD_INNER = 5
RAD_OUTER = 10
xs1, ys1 = GSS.get_starShaped(RAD_INNER, RAD_OUTER)
xs2, ys2 = GSS.Test_get_starShaped()

fig = plt.figure()

ax1 = fig.add_subplot(1, 2, 1)
msize = 20  # marker size
mtype = 'o'
SHIFT_X, SHIFT_Y = 0.2, 0.2  # arbitrary determinted

for idx, (axp, ayp) in enumerate(zip(xs1, ys1)):    
    ax1.scatter(axp, ayp, s=msize, marker=mtype)
    msize += 10
    if (idx == 4):
        mtype = '*'
        msize = 20
    ax1.text(axp + SHIFT_X, ayp + SHIFT_Y, idx)
ax1.set_xlabel('x')
ax1.set_ylabel('y')
ax1.grid(True)

fig.tight_layout()

```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/346cdc6c-6bb7-88d0-fab1-d022409b5a57.png)


### 考察

1. 色とマークだけで順番を知ることは難しい
    - 調色のプロを除く
2. インデックスを近辺に付加すると分かりやすい
    - ただし、点の数が100などになるとわかりやすさは半減するだろう。


### 教えていただいた事項
(追記 2018/04/29)

@skotaro さんのコメントにおいて、上記の実装では10点以上の色表現に失敗することを指摘いただきました。

情報感謝です。

対応としてコメントのリンク先に掲載されている方法など検討する必要があります。
certbot renew でエラーが出た時の対策

3ヶ月の間には、Nginx の設定をいじることもあります。
そうしたら、Let'encrypt の証明書の更新でエラーが出ました。
>Let'sencrypt のサーバーのip アドレスが変わることでも問題が発生し得ます。

```text
Attempting to renew cert (example.com) from /etc/letsencrypt/renewal/ekzempla
ro.org.conf produced an unexpected error: Failed authorization procedure. ekzemp
laro.org (http-01): urn:acme:error:unauthorized :: The client lacks sufficient a
uthorization :: Invalid response from http://example.com/.well-known/acme-cha
llenge/rboehR9s1TyAdp-0YL8fXKm9gazzL8Xih25eFS8cQ9k:
```

>これは、 http://example.com/.well-known/acme-challenge/*** にアクセス出来ていないのが原因です。

問題の確認
>.well-known/acme-challenge/test.txt
というフォルダーを作成し、
それにブラウザーでアクセスする
Forbidden という表示が出る。

>Forbidden が出なくなりtest.txt の内容が表示されれば問題は解決します。

問題の解決は、
>nginx.conf の編集
>nginx -t で問題がないことの確認
>systemctl restart nginx
>ブラウザーで test.txt にアクセス (http://example.com/.well-known/acme-challenge/test.txt)
のループを繰り返します。
>>https でなく、http でアクセスできる必要があります。

解決した時の設定

```text
        location / {
            root   /var/www;
            index  index.html index.htm;
        location ^~ /.well-known/acme-challenge/ {
                default_type "text/plain";
                root         /var/www;
                allow all;
                }
        }
```

更新のトライをします。

```bash
sudo certbot renew --dry-run --webroot -w /var/www/html
```

問題がなければ更新します。

```bash
sudo certbot renew --webroot -w /var/www/html
```

更新ができたら、nginx を再起動します。

次のサイトで有効期限が確認できます。
>[SSL有効期限チェッカー](https://comodo.jp/navi/sslchecker#checkbox)
SIRIS > VTK > ASCII VTK Files > POLYGONS 1152 4608の4608 > the number of cell list size

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04.4 LTS desktop amd64
TensorFlow v1.7.0
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
ADDA v.1.3b6
gnustep-gui-runtime v0.24.0-3.1
PyMieScatt v1.7.0
```

[SIRIS | Geometry > Gaussian random sphere (@ SIRIS) > Output > ,and which points should be connected to form the trinangulation](https://qiita.com/7of9/items/93de5ec8c54825ef2126)
で見られたvtk.outのフォーマット

```
POLYGONS    1152   4608
           3           0           1           2
           3           0           2           3
```

上記の4608は何を意味するのか?

以下に使用例がある。
https://www.visitusers.org/index.php?title=ASCII_VTK_Files

そこから下記へのリンクが貼ってある。
http://www.cacr.caltech.edu/~slombey/asci/vtk/vtk_formats.simple.html

> POLYGONS n size 
numPoints 0 , i 0 ,j 0 ,k 0 , ... 
numPoints 1 , i 1 ,j 1 ,k 1 , ... 

4608はsizeということらしい。

(下記、太字は強調のため)

> Polygonal Data 
The polygonal dataset consists of arbitrary combinations of surface graphics primitives vertices (and polyvertices), lines (and polylines), polygons (of various types), and triangle strips. Polygonal data is defined by the POINTS VERTICES, LINES, **POLYGONS**, orTRIANGLE_ STRIPS sections. The POINTS definition is the same as we saw for structured grid datasets. The VERTICES, LINES, **POLYGONS**, orTRIANGLE_ STRIPS keywords define the polygonal dataset topology. **Each of these keywords requires two parameters: the number of cells n and the size of the cell list size**. The cell list size is **the total number of integer values required to represent the list (i. e., sum of numPoints** and 4 VTK 4. 2 File Formats **connectivity indices over each cell**). None of the keywords VERTICES, LINES, POLYGONS, orTRIANGLE_ STRIPS is required. 

上記例では

1152: the number of cells
4608: the number of cell list size

具体的にはっきりしないが、現在の目的には使わないだろう。
SIRIS | Geometry > Gaussian random sphere (@ SIRIS) > Output > ,and which points should be connected to form the trinangulation

### 関連

- [Geometry > Link > Gaussian random sphere > 手法とコードへのリンク](https://qiita.com/7of9/items/3c0a42969d8c9715dff9)

### 頂点のx,y,z座標 + triangulation情報

SIRISに含まれるGaussian random sphere。
光散乱数値シミュレーションADDAで使うためには

- 頂点のx,y,z座標 + triangulation情報

の下記への変換が必要。

- dipoleでvolumeをfillした情報

### Output

@ G-sphere/RAEDME
2.2 Output

(下記、太字は強調のため)

> The **matlabx.out**, **matlaby.out**, and **matlabz.out** files consists of x, y, and z coordinates, respectively, of the grid points at the particle surface. The files **vtk.out** and **idl.out** contain information on the number of points and number of triangles describing the shape, coordinates (x,y,z) of the points that **define the triangles, and which points should be connected to form the triangles**.

整理すると

- matlabx.out, matlaby.out, matlabz.out: 頂点のx,y,z座標
- vtk.out and idl.out: triangulation情報を含む


### vtk.out

```vtk.ouy
# vtk DataFile Version 2.0
gsphere output            
ASCII                     
DATASET POLYDATA          
POINTS     578  float
   0.0000000000000000        0.0000000000000000        1.6484627588210747     
  0.22025970645867510        0.0000000000000000        1.6730385712011135     
   1.2375466764379659E-017  0.20210670983659845        1.5351528724506893     
 -0.19117217165911085        2.3411838810837846E-017   1.4520968091182878     
  -3.9762646348017165E-017 -0.21645776494197605        1.6441599582893061     
...
...
...
POLYGONS    1152   4608
           3           0           1           2
           3           0           2           3
           3           0           3           4
           3           0           4           1
           3           1           5           6
...
...
```

POLYGONSにtriangulation情報が含まれているのだろう。

POLYGONSの1152の方は1152個のtrianglesがあることを意味する。
4608の方は未消化。

vtk.outには`POINTS 578 float`のように頂点情報も含まれるため、matlabx.outを読む必要はなくなる。
Sohbet

![en iyi sohbet konuları.jpg](https://qiita-image-store.s3.amazonaws.com/0/233958/8e37f4ba-56a2-b51c-ed61-3c982057eff0.jpeg)

Sohbet
	Kullanıcılar tarafından çok ilgi gören sanal ortam her geçen gün kendini geliştirmeye devam etmektedir. Her gün yeni bir özelliğin eklendiği sohbet sitelerinde sizlerde yalnızlığınıza son verebilirsiniz. Kullanıcıların kolay ve rahat kullanımı için daima büyüyerek yeni özellikler sunan bu sitelerde aynı anda birden çok kişi ile [chat](https://www.sohbete.com.tr) yaparak tanışabilme fırsatı elde edersiniz.
 	Farklı şehirlerden ve hatta farklı ülkelerden yeni kişiler ile sohbet ederek tanışabilirsiniz. Sesli, görüntülü ya da yazışarak gerçekleştireceğiniz sohbetler ile boş zamanlarınızı en iyi şekilde değerlendirebilirsiniz.
 	Yeni insanlar ile tanışmanızı ve uzaktaki insanlar ile sohbet chat yapma fırsatını sunan [sohbet siteleri](https://www.websohbet.org.tr)nde, bir odada birden çok kişi ile aynı anda muhabbet edebilirken özel olarak tek bir kişi ile de konuşabiliyorsunuz. Tamamen güvenilir olan sitelere kendi bilgilerinizi vermenize de hiç gerek yok.
 	İstediğiniz her yerden istediğiniz zaman girebileceğiniz [sohbet odaları](https://www.omegletv.org.tr)nda rahatsız olduğunuz bir durum olduğunda sohbeti sonlandırabilir ve rahatsız eden kişiyi site yönetimine şikâyet edebilirsiniz. Kendinizi güvende hissedebileceğiniz bir ortamda hem yeni insanlar ile tanışmanız hem de yalnızlığınıza son vermeniz mümkündür.
g07+(covia)解体新書

#そもそも
- 友人が携帯が壊れたといってきた
- どうも画面がつかないらしい
- 中のデータ欲しいなぁ

ということで、携帯を預かって修理してみることに。
同じ機種を壊しちゃったという人の参考になればと思う。
ハードウェア中心の話になると思う。

方針としては、
ハード→ソフト→ハード
のアプローチで考えていた。

つまり、
1. とりあえず画面を修理してみる
2. なんとかデータだけ吸い出す
3. 最悪分解してゴリ押す

友人の証言によれば、
「携帯落としたら画面つかなくなって〜〜〜」
だったので、どうせ素子が壊れたか配線が外れたり切れたりしたんだろうと察し、1で終わると思っていた。

#画面交換の巻
取り合えず、いろいろ調べて分解してみたのだが、どうもこのスマホ、曲者機種である。
分解するように作られていない。

- 全く隙間がなく、ツメの返しで一度はめたら取れなくなっている
- アルミボディで強引に剥がすと裏蓋が変形する(なんで今時アルミ……)
- 基盤の組み立ての多くにシールが使われている

困ったものだ。それでも開けねばならぬ。
こじ開けた。
![P_20180428_020542.jpg](https://qiita-image-store.s3.amazonaws.com/0/253802/03d9257a-82d9-9e71-d287-d0fcbc1d57c2.jpeg)

なるほど頑張れば画面を交換できそうではあるが、ここで問題。

###機種が特殊すぎて画面単体で販売していない。
どうも2017年に発売されて以来、半年ほどで生産が終わった(？)に近い機種でコスパ最強のDSDS機種として希少性までつく始末。
とんだババを引かされた気分である。
もうこうなっては画面交換は望めない。まして別規格との半田なんてプロでもないしあんなミリ単位の作業できればしたくない。
画面交換は諦めた。

#データ吸い出しの巻
画面は直せないらしい。
なるほどどうしたものか、おもむろに電源ボタンをぽちぽちする。
ほう、バックライトはつくのか。
ん？
画面右下をスライドして、中央下をおもむろにタップしてみる。
「カシャッ！！！」

###「タッチパネルと基盤は生きてるんかい！」

なら話が早い。適当にPIN入力画面を等倍率で印刷してかぶせて、ロック解除すれば、データを吸い出せる。
ミラーリングまでなんとかできればroot化してフルバックアップだって取れる。

- デバイスマネージャすら反応しない

なるほど、そうきたか。USBが全く反応しない。
この機種、後で写真をまとめて載せるが、CPUやらフラッシュが入ったマザーボードとUSB関係の基盤が画面を挟んで上下に分かれて細っそいジャンパー線で繋がっている。(まあよくあるタイプ)
その周辺がイかれてるらしい。
ハード的に壊れてるなら無理だ。
この方法は諦めた。

#ハードウェア的にゴリ押す
もうここまできたらしょうがない。
新しい機種を買って、基盤をとっかえよう。

というわけで、長い前置きも終わったところで、本題。
この機種解体には少しコツがいる。
それをたらたら書いておこうと思う。

1.まずsimのケースを外す
![HTTP/2.0 413](http://f.cl.ly/items/0h2E3d2n302o121o1L2I/P_20180428_015911.jpg)
これは忘れてはいけない。(始め忘れた)
ケース変形の原因になる。

2.底のネジを外す
![HTTP/2.0 413](http://f.cl.ly/items/3n0c1k1R1X2E3x2P1H1F/P_20180428_015927.jpg)
星型の特殊ドライバーを使おう。

3.カメラのカバーを外してネジを取る
![HTTP/2.0 413](http://f.cl.ly/items/3s3G1N2t0b0s2m170A37/P_20180428_015945.jpg)
ここは普通のドライバー。
カバーを外す時は、結構粘着力のある両面テープなので、ドライヤー推奨。

4.裏蓋を外していく
![HTTP/2.0 413](http://f.cl.ly/items/1H3X3x1e002Q0b0I1R2L/P_20180428_020033.jpg)
底がわずかに段差ができているので、上向きにドライバーを立てて、がんばって隙間を作る。

![HTTP/2.0 413](http://f.cl.ly/items/2b2D3v1m2J1o3g2y1k1I/P_20180428_020251.jpg)
立てたドライバーを図の方向へ持っていくと、少し隙間があるので強引かつ丁寧に押し込む。
ツメがトップとボトムに2つずつ、サイドに4つずつぐらいあるので、ここからは丁寧に根気よく外していく。

![HTTP/2.0 413](http://f.cl.ly/items/470C2l1o3a0A1D1T2D2o/P_20180428_020514.jpg)
ちょっとしたコツなのだが、つき立てたドライバーを画面側に軽く倒してやるとツメが外れやすい。

![HTTP/2.0 413](http://f.cl.ly/items/2X1x1T1E2J0i0r2s2j2t/P_20180428_020542.jpg)
外れた。(赤丸の所の基盤がメイン)

5.黒いテープをはがして、6個のネジを外す(赤丸)
![HTTP/2.0 413](http://f.cl.ly/items/1M3i1E2z1X062X1C3L14/P_20180428_020629.jpg)
右下のネジ二つを外すと、端子の接触部分を覆っているカバーが外せる。

![HTTP/2.0 413](http://f.cl.ly/items/3f210v2M3x0D2I023i3Z/P_20180428_020704.jpg)
左から(写真では下から)、バッテリー、何か、画面。
全部丁寧に外す。

6.最後に~~青丸の部分~~を外す。
※左下の方は外れない。
![HTTP/2.0 413](http://f.cl.ly/items/1M3i1E2z1X062X1C3L14/P_20180428_020629.jpg)
白いツメをたてて、慎重に抜く。

7.基盤を外す。
![HTTP/2.0 413](http://f.cl.ly/items/421D361O1n1L0Z2l3u1D/P_20180428_020851.jpg)
あとは逆の手順で組み立てていく。

#最後に
まあ、結果的に直った。
割と感動した。
データも全部綺麗に残ってたらしい。
いやーよかったよかった。
一件落着だ。
問題があるとしたら、本人がもう新しい携帯を買っていて中のデータにもそこまで価値を持ってなかったといこと。
曰く2000円ぐらいなら払うレベルらしい。
あと、勝手がわからずはじめて開けた時に壮大に本体に傷をつけて商品価値はなくなった。
全く、高機能な目覚まし時計を手に入れてしまったものだ。


なお、学生にとってスマホ代は安くはなかった。
(だれか投げ銭してくれ。)
React&Reduxでフロントエンジニアを目指す!! 文系学生がやってみた!!

##はじめに
インターン先でプログラミングを勉強中の文系学生。
「フロントエンドとバックエンドのどっちやりたい?」
「フロントエンドですかね」
「じゃあ、ReactとReduxやろうか」とのこと。
早速、勉強してみよう!!

##ReactとReduxとは
そもそも、ReactやRedux自体初耳。
まずはReactから見ていくか。
初心者がReactのことについて知りたいなら、このサイトがよさそう。
[これからReactを勉強する人が最初に見るべきスライド７選](http://uxmilk.jp/43555)
色々用語とか出されてもわからないしね。
スライドのほうが感覚的に親しみやすいし。
`今からでも遅くない! React事始め`は見ておくべきだと思う。
いや、可愛いキャラが居るからじゃないですからね?

大体のスライドを見て、わかったことは次のこと。
**JavaScriptのライブラリ**
**Facebookが作り、そこで実際に使われている**
**AtomもReactで作られている**
**MVC(Model view Controller)におけるViewの役割を担う**
**できることに限りがある分、覚えやすい**
**JavaScriptとHTMLが併用できるJSXという書き方できる**
**サーバと端末のやり取りの間に、VirtualDOMがあることで、高速表示が実現できる**

つまり、ユーザーとエンジニアの2人のストレスを軽減するライブラリか。
そりゃあ使いたくなりますわな。

続いて、Redux。
Reduxのことを教えてくれたのはこのサイト。
[Reduxの実装とReactとの連携を超シンプルなサンプルを使って解説](https://mae.chab.in/archives/2885)

このサイトでの学びを要約すると、

**Reactとかのフレームワークには、Fluxという流れがある。
Action→Dispatcher→Store→View(React)という一方向にのみ流れる構造。
Reduxと組み合わせることで、Action→Reducers→Storeという流れになる。
それによってReactがもたらす効果をより高める。**

こんな感じかな?
実際に使ってみないとわからんよね。

##React環境構築
さてさて、インストールしていきますか。
環境の構築方法を教えてくれるサイトはたくさんあるけれど、ここが一番良さそう。
[WindowsにWebpackをいれてReactの環境を構築してみる](https://qiita.com/keitaMatsuo/items/ab405273db6c12e89e7e)

サイトのやり方と変えたのは以下の箇所。
nodeのLTS.
6.x(サイト)→9.9.0

```
nodist 9.9.0
```
それに応じて、package.jsonを作成する際の`nodist local 6.9.2`を'nodist local 9.9.0'に

このくらいかな?
あとは何事もなくできたし。

###Reactでコンポーネント作成
動かすとどうなるか試してみたいから、このサイトを参考にやってみよう。
[今からはじめるReact.js〜初めてのコンポーネント〜](https://qiita.com/kuniken/items/963cb977dffd3e662e40)
公式にもサンプルあるけど、時間ある時にやっておこうっと。

ほとんどはスムーズにできたけど、`glup`、`browserify`、`vinyl-source-stream`、`reactify`はグローバルとローカルの両方に必要みたい。
まぁ、忘れていたらやっておいたほうがよさそうだね。

##Redux環境開発
Reduxはこのサイトを参考に進めていこう。
[ReactとReduxを使ったアプリを試すための環境作る](https://qiita.com/morizotter/items/87d4a34d32209cbb98b0)

さっきとやることはそこまで変わってないから、すぐできた。
でも、ちゃんと動いているのかどうかってどうやって確かめるのかね?
どうしようもない気が…

##まとめ
今回はReactとReduxの勉強をしました!!
まだ不慣れなところがあるから、復習して使いこなせるようにしないと…

##参考資料
[これからReactを勉強する人が最初に見るべきスライド７選](http://uxmilk.jp/43555)
[Reduxの実装とReactとの連携を超シンプルなサンプルを使って解説](https://mae.chab.in/archives/2885)
[今からはじめるReact.js〜初めてのコンポーネント〜](https://qiita.com/kuniken/items/963cb977dffd3e662e40)
【Swift4】Stringクラスの文字列操作まとめ

#Stringってなに？

- Swiftがデフォルトで用意してくれている文字列を扱うデータ型
- 文字列を "Stringクラスのオブジェクト" として扱う

```swift:qiita.swift
 let name:String = "Usako" 
```
　いろいろと便利なメソッドをデフォルトで持ってくれているので以下に覚書としてまとめました。



##文字列の長さを求める(返り値:Int)
`var count: Int { get }`

```swift:qiita.swift
let name:String = "USAKO"
let num:Int = name.count() //num -> 5
```

##同じ文字列であるか比較する(返り値:Bool)
- 大文字小文字も区別する

```swift:qiita.swift
let name:String = "USAKO" 

if name == "Usako" {//trueのとき
    print("Usakoと同じ")
}else{
    print("Usakoと違う") //違うになる
}
```

##文字列を結合する
- swiftは+で文字列結合もできる。便利。
 
```swift:qiita.swift
let name:String = "USAKO"
let name2:String = "no"
let name3:String = name + name2 + "SIPPO" //name3 -> USAKOnoSIPPO
```

##前から指定した文字数分の文字列を切り出す(返り値:String)
`func prefix(_ maxLength: Int) -> Substring`

```swift:qiita.swift
let name:String = "USAKO"
print(name.prefix(3)) //USA
```

##後ろから指定した文字数分の文字列を切り出す(返り値:String)
`func suffix(_ maxLength: Int) -> Substring`

```swift:qiita.swift
let name:String = "USAKO"
print(name.suffix(3)) //AKO
```

##指定した範囲の文字列を切り出す

```swift:qiita.swift
let name:String = "USAKOnoSIPPO"

var start:String.Index = name.startIndex //String型オブジェクトの開始位置Indexを取得
start = name.Index(start, offsetBy:2) //String型オブジェクトの開始位置から1文字分後ろにずらす

let end:String.Index = name.index(start, offsetBy:) //さらにstart位置から3文字後ろにずらす

print(name[start...end]) //AKOno
print(name[start..<end]) //AKOn
``` 

##文字列を前方比較する(返り値:Bool)
`func hasPrefix(_ prefix: String) -> Bool`

- 前方一致するかどうかを返す
- 大文字小文字も区別する

```swift:qiita.swift
let name:String = "USAKO"
if (name.hasPrefix("USA")){ //trueのとき
   print("USAから始まる文字列")
}else{
   print("USAから始まらない文字列")
}
```

##文字列を後方比較する(返り値:Bool)
`func hasSuffix(_ suffix: String) -> Bool`

- 後方一致するかどうかを返す
- 大文字小文字も区別する

```swift:qiita.swift
let name:String = "USAKO"
if (name.hasSuffix("KO")){ //trueのとき
   print("KOで終わる文字列")
}else{
   print("KOで終わらない文字列")
}
```

##文字列の中に指定した文字列が含まれるかどうか(返り値:Bool)
`func contains(_ element: Character) -> Bool`

```swift:qiita.swift
let name:String = "USAKO"
if (name.contains("SAK")){ //trueのとき
   print("SAKが含まれる文字列")
}else{
   print("SAKが含まれない文字列")
}
```

##文字列の中の指定した文字列を置換する
`mutating func replaceSubrange<C, R>(_ subrange: R, with newElements: C)`

- 指定した文字列が複数ある場合、最初の文字列しか置換されない
- 複数置換するにはループさせる必要がある
- 文字列を破壊して置き換えるので要注意

```swift:qiita.swift
let name:String = "USAKO"
if range:Range = name.range(of: KO){ //KOの含まれる範囲のrangeを取得できたとき
   name.replaceSubrange(range, with:"!!")
}
print(name) //USA!!
```
```swift:qiita.swift
let name:String = "USAKOUSAKOUSAKOKO"
while(range:Range = name.range(of: KO)){ //KOの含まれる範囲のrangeを取得できている間ループ
   name.replaceSubrange(range, with:"!!")
}
print(name) //USA!!USA!!USA!!!!
```



##まとめ
Stringのその他便利アイテムは以下を参照のこと
https://developer.apple.com/documentation/swift/string




C言語を終えたところでオブジェクト指向を学習すると便利過ぎて泣けました🐰
これから覚えた内容を覚書きしていこうと思います。
指摘等ありましたらビシバシお願い致します。
Javaでフォルダの大きさを計測する

Java8でフォルダの大きさを確認する方法を考えた。
単位はバイトです。

```shell
javac foldersize.java
java foldersize フォルダのパス
```

```java;foldersize.java

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class foldersize {
    public static void main(String args[]) {
        String targetdir;
        if (args.length == 0) {
            targetdir = ".";
        } else {
            targetdir = args[0];
        }
        System.out.println("["+targetdir+"]"+fileSize(targetdir)+"B");

    }

    public static long fileSize(String path) {
        Path folder = Paths.get(path);
        long size = 0;
        try {
            size =  Files.walk(folder)
            .map(Path::toFile)
            .filter(f -> f.isFile())
            .mapToLong(f -> f.length())
            .sum();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return size;
    }


}
```

ファイル数が多いと結構時間がかかります。

#Reference
http://www.baeldung.com/java-folder-size