OmniAICreator/Qiita-1.07M huggingface dataset:
【GAS】スプレッドシート内の全シートへのリンク一覧を作る

Google スプレッドシートで仕様書なんかをまとめていると、シート数が20、30になっていたりすることがある。
こうなると目的のシートを探すのに手間がかかるので、インデックスみたいなシートを作っておきたくなる。

手作業でリンクをいちいち設定するのも面倒なので、リンク一覧を作るGASを作った。

```js

function PutLinks()
{
  // スプレッドシート内の全シートとスプレッドシートのID
  var sheets = SpreadsheetApp.getActive().getSheets();
  var ssId = SpreadsheetApp.getActive().getId();
  
  // ハイパーリンク文字列の配列
  var linkList = [[]];
  
  for(var i=0; i<sheets.length; i++) {
    // シートのIDと名前
    var sheetId = sheets[i].getSheetId();
    var sheetName = sheets[i].getSheetName();
    
    // シートのURLからハイパーリンク文字列を組み立て
    var url = "https://docs.google.com/spreadsheets/d/" + ssId + "/edit#gid=" + sheetId;
    var link = [ '=HYPERLINK("' + url + '","' + sheetName + '")' ];
    
    // ハイパーリンク文字列を配列に格納
    linkList[i] = link;
  }
  
  // 選択中のセルにハイパーリンク文字列を入れる
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var cell = sheet.getActiveCell();
  var range = sheet.getRange(cell.getRow() , cell.getColumn() ,  linkList.length , 1);
  range.setValues(linkList);
}
```

jsはあまり触ったことないので不自然な書き方をしているかもしれないが、とりあえずこれで動く。

Before
![before.png](https://qiita-image-store.s3.amazonaws.com/0/156809/c4325ff6-52ba-c6e5-a3f9-e24eebd8439b.png)

After
![after.png](https://qiita-image-store.s3.amazonaws.com/0/156809/2cd7b78e-b417-7629-bb67-d3b2f9543e8d.png)

## 使い方 - How too use （2021/03/05 編集リクエスト）
### 正しい使い方


1.ツール>スクリプトエディタをクリック

![スクリーンショット 2021-03-05 15.40.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381710/fb4c0be1-3b1b-385f-d5de-1768caa80999.png)
2. GASのjsのIDEが表示されるので、コードをコピペ

![スクリーンショット 2021-03-05 15.42.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381710/e0a2b880-a885-a569-6cdd-2ff3c3b39ffa.png)
3. ブラウザのタブを移動してリンクの配置したい列の任意の行のセルを選択状態にする
今回は、K列の３行目のセルを選択。（青くなっている部分です。）

![スクリーンショット 2021-03-05 15.38.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381710/3895f286-d761-3faf-4dc9-216fb72bc535.png)
4. ブラウザのタブを移動して再度コードを表示して、実行ボタンを押下する

![スクリーンショット 2021-03-05 15.44.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381710/4faf327e-0fbe-349b-ff7c-69cc90853983.png)

この時に認証が出てくるので、「権限を確認」ボタンをおす。
この時に「安全でないので接続できません。」という旨のページが出てきた場合は、その画面の「詳細」>「〇〇のページへ接続する」のようなリンクが下側に小さく表示されているのでそれをクリックで続行できる。

![スクリーンショット 2021-03-05 15.48.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381710/c23a71eb-1ac0-69ed-26d0-e26b60588714.png)
5. 実行が完了したら手順3で選択した場所に戻ると、リンクが追加されている
実行完了後に選択していたページを確認するとリンクが生成されている

![スクリーンショット 2021-03-05 15.50.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381710/fc256c79-f68c-8d26-c52d-8fc9ce282e48.png)

### 間違い例
関数を使うときは画像のようにセルに`=関数名()`と使う場合が多いですが、この関数をセルに指定して使用すると画像のようなエラーがでます。

![スクリーンショット 2021-03-05 15.32.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381710/83e559c8-9a0b-ed1e-944f-e5e6122ae566.png)

#### エラー文：

```
Exception: You do not have permission to call setValues
```
rack-contribをやめてrack-attackに乗り換えた

# 課題

rack-contribというgemがあるのですが、ここ数年メンテナンスされておらず、プロジェクトをRails5にアップデートしたタイミングでrackのバージョンの依存性解決ができなくなっていました。他の方がrack 2系に対応したものをPull Requestしていたので、それを使えばひとまず延命はできたのですが、Circle CIでのテストがうまく動かなくなったので、捨て去る決意をしました。

ちなみに、rack-contribはIP制限の用途で使っていました。

# 調査

## IP制限を実現する方法

IP制限を実現する方法は、

1. Railsアプリのbefore_actionなどで実装する
2. 他のRack Middlewareを使う(他のgemを探す)

という2つが思い浮かびました。

今回は2の、他のRack Middlewareを使う方を選びました。まー車輪の再発明するとテストも大変だし。

## rack-attackの採用

IP制限できるgemは、

- [rack-attack](https://github.com/kickstarter/rack-attack)
- [alpaca](https://github.com/jeffchao/alpaca)

の2つを見つけたのですが、alpacaはrack-contribと同様あんまり活発ではないようなので、rack-attackを試してみることにしました。

ちなみに、rack-attackは、名前の通りですが、本来はDOS攻撃を防ぐためのgemです。
ただ、IP制限をすることもできます。ホワイトリスト、ブラックリストが使えます。

# 使い方（ブラックリスト方式）

## 導入

Gemfileに記述。

```rb:Gemfile
# rack-contribは削除
# gem 'rack-contrib', require: 'rack/contrib', git: 'https://github.com/pabse/rack-contrib.git', branch: 'rack_ruby_2+'
gem 'rack-attack', '~> 5.0.1'
```

そして、`bundle install`を実行します。

## 基本

まず、`config/application.rb`でrack-attackを有効化します。

```rb:config/application.rb
config.middleware.use Rack::Attack
```

次に、`config/initializers/rack-attack.rb`を作ります。
そこに、ブラックリストを作ります。

```rb:config/initializers/rack-attack.rb
class Rack::Attack
  OFFICE_IP_ADDRESS = 'XXX.XXX.XXX.XXX'

  blocklist('only allow from office') do |req|
    req.path.match(%r{^/admin}) && (OFFICE_IP_ADDRESS != req.ip)
  end
end
```

ちなみに、`blacklist`から`blocklist`になった模様です（blacklistって書くとwarningが出る）。

## 応用

基本の通りでもいいのですが、コード側はあまりいじりたくありません。
rack-contribの際に使っていたアクセスリスト(access.yml)を使い回したいなーという欲求がでてきました。

ちなみに元々のconfig/access.ymlはこんな感じです。

```yaml:config/access.yml
localhost: &localhost
  /admin:
    - 127.0.0.1
    - 192.168.0.0/24

development:
  <<: *localhost

test:
  <<: *localhost

production: &production
  /admin:
    - XXX.XXX.XXX.XXX(拠点AのIP)
    - XXX.XXX.XXX.XXX(拠点BのIP)
    - XXX.XXX.XXX.XXX(拠点CのIP)

staging:
  <<: *production
```

これを使い回すために、`config/initializers/rack-attack.rb`を修正します。

```rb:config/initializers/rack-attack.rb
class Rack::Attack
  OFFICE_IP_ADDRESSES = YAML.load(File.read("#{Rails.root.join('config')}/access.yml"))[Rails.env]

  blocklist('only allow from office') do |req|
    OFFICE_IP_ADDRESSES.any? do |path, ip_addresses|
      ip_addrs = ip_addresses.map { |ip_address| IPAddr.new(ip_address) }
      req.path.match(%r{^#{path}}) && ip_addrs.none? {|ip_addr| ip_addr.include?(req.ip) }
    end
  end
end
```

ミソなのは、`IPAddr`クラスを使って、サブネットマスクを使ったIP範囲(192.168.0.0/24とか)での検証を行えるようにしていることです。
また、`Array#none?`を使って、アクセスしてきたIPアドレスが許可されたIPアドレスの範囲にない場合、trueを返すようにしています。

上記のaccess.ymlだと、`/admin`から始まるpathで、かつ、許可されていないIPアドレスの場合に`403 forbidden`を返すようになっています。

これで、もし許可IPを変えたい場合でも`config/access.yml`を編集するだけでよくなりました。

# まとめ

IP制限は今のところ、rack-contribよりはrack-attackを使おう！
タイムゾーンを指定しない日時文字列に対するTime.parseとDateTime.parseの挙動の違い

# 結論

'2017-01-31 01:02:03' をパースしたときに何が起きるか。

Time.parseはローカルタイムになる
Date.parseはUTCになる

## 実例

Time.parse

```ruby
Time.parse('2017-01-31 01:02:03')
# => 2017-01-31 01:02:03 +0900
```

DateTime.parse

```ruby
DateTime.parse('2017-01-31 01:02:03')
# => #<DateTime: 2017-01-31T01:02:03+00:00 ((2457785j,3723s,0n),+0s,2299161j)>
```
R のdata.frame/data.table のsortベンチマーク

まだまだ処理のボトルネックがあるようです。無思慮にも数百件のデータテーブルのsortを数万件している箇所があるのですが、外すわけにもいかず、これもどの方法が最速なのか調べないとなりません。ついでにやっておきます。

参考リンク：
[Sort a data.table fast by Ascending/Descending order](http://stackoverflow.com/questions/13685295/sort-a-data-table-fast-by-ascending-descending-order)@StackOverflow

# データ構造による違い

## data.frame(df)
普通にデータフレームでソートします。

```R
a <- df[order(df$v),]
```

## data.table with base(dtbase)
データテーブルのソートを標準ソート関数で行います。

```R
a <- dt[base:::order(v),]
```

## data.table(dt)
データテーブルのソートをdata.tableのソート関数で行います。

```R
a <- dt[order(v),]
```

## data.table with setorder (dtref)
データテーブルのソートをreferenceを利用した、高速なsetorder関数で行います。

```R
a <- setorder(dt, v)
```

## ベンチマーク

100万から1000万件のソートを１回ずつ行いました。
標準のソートはdata.tableのそれに比べて１０倍も遅いので使わない方が良いです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/97c5cca1-02f0-0224-bfbf-afb4d35b6d79.png)

keyを設定する効果は大いにあるといえます。
reference を用いたソート方法はkeyを設定した場合さらに数倍のスピードをもたらします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/669f9b21-9178-cdff-4516-e6b84b27346d.png)

# まとめ

結局今回もdata.tableを普通のソートを使っていたので、最速のsetorderを使うことで、10s -> 100msと、約１００倍高速になることがわかりました。
[Unityで学ぶC#] 2   条件分岐

# If文とは
ある条件を満たした時だけXXをしたいという時に使います．

---

## 例
- HPがなくなったとき
- 矢印キーを押した時
- フラグを回収した時

---

## サンプル

```csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class IfExample : MonoBehaviour {

	void Start () {
		// 数値の比較
		int hp = 10;

		if (hp > 8) { 
			Debug.Log ("HPは8より高い!");
		}
	}
}
```

---
## 実行結果
実行するとこのような結果が出ると思います．

![スクリーンショット 2017-02-26 12.21.21.png](https://qiita-image-store.s3.amazonaws.com/0/113504/0bda03a1-9837-7472-ed5d-cfe2f2486590.png "スクリーンショット 2017-02-26 12.21.21.png")

---

## ポイント
この部分で条件を設定しています．

`if(hp > 8)　　//  hpが8よりも大きかったら`

ifと書いてあるところの()の中身が正しければ
{}の中が実行されます．

---

## つまりこういうことです．
```csharp
if(条件){
  実行される処理
}
```
---

## サンプル2

```csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class IfExample : MonoBehaviour {

	void Start () {
		// 数値の比較
		int hp = 5;

		if (hp < 8) { 
			Debug.Log ("HPは8より低い!");
		}
	}
}
```
---
## ポイント
このように条件にはいくつかの種類があります．

一つ目の例

```csharp
if(hp > 8)  // 8より大きい
```

二つ目の例

```csharp
if(hp < 5)  // 5より小さい
```

---
## よく使う条件
|条件| 意味|
|:--|:--|
|a == b| aとbは等しい |
|a != b| aとbは等しくない|
|a > b| aはbより大きい|
|a >= b| aはb以上|
|a < b| aはbより小さい|
|a <= b| aはb以下|

---
# おわり
Gradle Pluginを2.3.0にした際にUnresolved referenceが発生してビルドがFAILEDする場合の対処方法

# 概要

Android Studioを2.3にGradle Pluginを2.3.0に上げたところ、以下のようなエラーが発生しました。

```
Unresolved reference: DaggerAppComponent
Unresolved reference: databinding
```

# 現象が発生した際の環境

## Kotlin

- compile "org.jetbrains.kotlin:kotlin-stdlib:1.1.0"

## DataBinding関連

- kapt 'com.android.databinding:compiler:2.2.3'

## Dagger関連

- compile "com.google.dagger:dagger:2.8"
- kapt "com.google.dagger:dagger-compiler:2.8"

# 解決方法

## kotlinのAndroidプロジェクトの場合

各種ライブラリのバージョンを上げることで解決しました。

- `com.android.databinding:compiler`は`2.3.0`を指定
- `com.google.dagger:dagger`および`com.google.dagger:dagger-compiler`は`2.9`を指定

## 通常のAndroidプロジェクトの場合

@teradonburiさんの[記事](http://qiita.com/teradonburi/items/a2185723b1bf883cf755)で知りましたが、android-aptがgradle plugin2.3.0以降ではdeprecatedとなっており、`apt`を`annotationProcessor`に書き直す必要があります。コメントありがとうございました:bow:

また、[android-aptのMigrationページ](https://bitbucket.org/hvisser/android-apt/wiki/Migration)のissuesの項目には以下のように書かれていますので、問題が解決するまでandroid-aptを引き続き使用しても良いかもしれません。

> if you encounter an issue after migrating it might be a bug in the Android Gradle plugin. Please report these bugs in in the Android bug tracker. You can still revert to android-apt if you are not using Jack in the mean time.
Reactのテキストボックスのフォーカスが外れる問題ではまった

他の画面では正常に動いているReactのカスタムコンポーネントが、特定の画面で呼び出した場合のみ、テキストボックスで入力をするたびにフォーカスが外れる事象に遭遇してはまったのでメモを残しておきます。

色々と試行錯誤したところ、原因としてはカスタムコンポーネントを呼び出しているrenderの書き方の違いによるものでした。
Reactのrender部分はいくつか書き方がありますが、以下で書いているHogeの様に定義し、その中でstateの更新をかけると、テキストボックスのフォーカスが外れます。詳細は追っていませんが、Hogeのスタイルで書くとstateが更新される度にコンポーネントが作り直されているのではないかと思います。

```
render() {
  const Hoge = () => {
    const props = {
      type: "text",
      value: this.state.hoge,
      onChange: e => this.setState({hoge: e.target.value})
    };
    return <div>hoge<input {...props}/></div>;
  };

  return (
    <div>
      <Hoge/>
      {this._renderFuga()}
    </div>
  );
}

_renderFuga() {
  const props = {
    type: "text",
    value: this.state.fuga,
    onChange: e => this.setState({fuga: e.target.value})
  };
  return <div>fuga<input {...props}/></div>;
}

```
ディスクに残っているIEオートコンプリート情報を静的に解析する

# 前提となる環境
- Internet Explorerで保存したオートコンプリートの情報をマシンが起動していない状態で出力する
- 当該マシンのディスクイメージはddなどにより取得している
- 当該マシンの環境は、Windows 7 / IE 11を利用

# 利用するツール
- IE PassView <br> http://www.nirsoft.net/utils/internet_explorer_password.html
    - IE PassViewを利用すると、オートコンプリートで保存したパスワード情報を出力することができる。
    - 既定だと、起動時のIE環境に保存されている情報に基づいて、出力をするが、指定したユーザーフォルダの情報に基づいて出力するように設定することもできる。
- FTK Imager Lite <br>
http://marketing.accessdata.com/ftkimagerlite3.1.1
    - ディスクイメージの内容を参照できるツール。
    - ディスクイメージをマウントして利用することもできる。

# 操作
## FTK Imager Liteによるディスクイメージのマウント 
1. [File] - [Image Mounting]
2. Image Mounting画面で、ディスクイメージを指定。[Mount]をクリックし、指定したディスクイメージをマウントする
![iepv02b.jpg](https://qiita-image-store.s3.amazonaws.com/0/39869/4ec2c7ae-49cf-73f2-5614-f7ef0bc061bc.jpeg)

## IE PassViewによる参照
1. [Options] - [Advanced Options]
2. ユーザープロファイルの保存先を指定するように構成。その際、ログオン時に使用されていたパスワードも入力
![iepv05.jpg](https://qiita-image-store.s3.amazonaws.com/0/39869/33704303-91f0-ef21-94ec-caa6a1bb7954.jpeg)
3. 以下のように出力される。
![iepv06b.jpg](https://qiita-image-store.s3.amazonaws.com/0/39869/619796b8-8cf4-dcea-d2c0-4f3e0c1e3b15.jpeg)

# 補足
- 元の情報はレジストリ情報に暗号化されて保存されている。
    - 保存先: HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\IntelliForms\Storage2
    - 接続先のURLのハッシュ値ごとにキーを配置
    - この暗号化を解除するためにログオン時に使用されていたパスワードの情報が必要となる。
    - パスワード情報が入手できない場合には、SAMデータベースを解析するなどの手法が必要となる。
Mac / zsh | シェルで Control + A E 等でのショートカットが効かなくなった

こいつのせいだった。
消してシェルを再起動したら直った。

```~/.zshrc
export EDITOR=vim
```

# 問題

泣きたくなった。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/9971483b-e3e9-c302-f65e-b282c76ae648.png)

- direnv のエディタ設定で `export EDITOR` を書く必要があった。
- 普段の動作にも干渉してしまうので direnv でのエディタ設定は諦めた。 ( 毎回 `EDITOR=vim direnv edit .` とか打とう )

# 参考


- [direnvを使おう](http://qiita.com/kompiro/items/5fc46089247a56243a62)
- http://unix.stackexchange.com/questions/197839/why-does-exporting-vim-as-editor-in-zsh-disable-keyboard-shortcuts








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Capybara Poltergeist で Bootstrap3 のモーダルを使ったテストが失敗する

こんな感じの rspec が成功したり失敗したりしていました。

```ruby
click_link '田中 花子' # モーダルを呼び出す
click_link 'キャンセル' # モーダル内のリンクをクリックするはず（ができないことがある）
expect(page).to have_css '.is-canceled' # クリックできてなければ失敗する
```

## 問題の原因
Bootstrap3 のモーダルがスクロールしている最中にモーダル内のボタンをクリックすると、クリックしたときにはその位置にすでにボタンがないことがあるようです。

[poltergeistのソース](https://goo.gl/FKvSnQ)を見ると、このへんで問題が起きていそうでした。

```coffeescript
  mouseEvent: (name) ->
    if area_image = @_getAreaImage()
      area_image.scrollIntoView()
    else
      @scrollIntoView()
    # クリックしたいDOMノードの位置を取得
    pos = this.mouseEventPosition() 
    # その位置でノードがクリックできるかチェック（ここでも失敗する可能性はありそうだけど、今回はここではない）
    test = this.mouseEventTest(pos.x, pos.y) 
    if test.status == 'success'
      if name == 'rightclick'
        @page.mouseEvent('click', pos.x, pos.y, 'right')
        this.trigger('contextmenu')
      else
        # 実際のクリックは座標だけで指定（クリックするノードを指定しているわけではないので、すでにそこにノードがなくてもエラーにならずにスルーされる）
        @page.mouseEvent(name, pos.x, pos.y) 
      pos
    else
      throw new Poltergeist.MouseEventFailed(name, test.selector, pos)
```      

## 修正方法 その１
モーダルが出現するまでの時間 sleep します。

```ruby
click_link '田中 花子' # モーダルを呼び出す
sleep 1 # モーダルがスクロール完了するのを待つ(bootstrap のモーダルのスクロールは 0.3s)
click_link 'キャンセル' # モーダル内のリンクをクリック
expect(page).to have_css '.is-canceled'
```

## 修正方法 その２

sleep なんて不確実な方法は嫌という場合、こんな感じのヘルパーを用意します。

```ruby
  def wait_for_bs_modal
    script = <<~EOS
      window._capybaraModalWait = 1;
      jQuery(document).one("shown.bs.modal", function(){window._capybaraModalWait = 0;});
    EOS
    page.execute_script(script)
    yield
    Timeout.timeout(Capybara.default_max_wait_time) do
      loop until page.evaluate_script('window._capybaraModalWait').zero?
    end
  end
```

で、こう書きます。

```ruby
# モーダルが出現するまで待つ
wait_for_bs_modal do
  click_link '田中 花子' # モーダルを呼び出す
end
click_link 'キャンセル' # モーダル内のリンクをクリック
expect(page).to have_css '.is-canceled'
```
Pythonで基本的なソート

Pythonとアルゴリズムの勉強のために基本的なソートを書きました。
気が向いたら今後も追加していきます。

#選択ソート (selection sort)

```python
def sSort(a):
    for i in range(len(a)-1):
        mi = a[i:].index(min(a[i:]))
        a[i], a[i+mi] = a[i+mi], a[i]
    
    return a
```

#バブルソート (bubble sort)

```python
def bSort(a):
    for i in range(len(a)):
        for j in range(len(a)-1, i, -1):
            if a[j] < a[j-1]:
                a[j], a[j-1] = a[j-1], a[j]
            
    return a
```

#挿入ソート (insertion sort)

```python
def iSort(a):
    for i in range(1, len(a)):
        for j in range(i, 0, -1):
            if a[j] >= a[j-1]:
                break
            else:
                a[j], a[j-1] = a[j-1], a[j]
    
    return a
```

#クイックソート (quick sort)

```python
def qSort(a):
    if len(a) in (0, 1):
        return a
    
    p = a[-1]
    l = [x for x in a[:-1] if x <= p]
    r = [x for x in a[:-1] if x >  p]

    return qSort(l) + [p] + qSort(r)
```

#マージソート (merge sort)

```python
def merge(l, r):
    n = len(l + r) # マージ後の配列のサイズ
    s = max(l + r) + 1 # 番兵

    l.append(s)
    r.append(s)

    a = []
    while len(a) < n:
        a.append(l.pop(0)) if l[0] <= r[0] else a.append(r.pop(0))
    
    return a

def mSort(a):
    if len(a) == 1:
        return a

    mid = len(a) // 2
    l = mSort(a[:mid])
    r = mSort(a[mid:])
    
    return merge(l, r)
```
Chocolatelyをプロキシ環境でインストールしたときのメモ

chocolatelyをプロキシ環境下でインストールする一番簡単だった方法
参考: http://yoshimov.com/tips/chocolatey-with-proxy/

## 手順

### 1. 手動ダウンロード
http://chocolatey.org/api/v2/package/chocolatey/

ダウンロードすると、`chocolatey-*.nupkg`ができる

### 2. ダウンロード後に拡張子変更してあげる

`chocolatey-*.nupkg`
↓
`chocolatey-*.zip`

このzipファイルを解凍する

### 3. 解凍したフォルダに移動してインストール

コマンドプロンプトを起動してインストールする。

```
> @powershell -NoProfile -ExecutionPolicy unrestricted -Command ".\tools\chocolateyInstall.ps1"
```

### 4. インストールできたか確認

バージョンが表示されたらOK

```
> choco -v
0.10.3
```
海外の日時をどこにいても取得する方法

```js
// UTC から時差分を差し引きしたタイムスタンプを取得する関数
const getAreaTimestamp = (offset) => {  // offset はタイムスタンプを取得したい地域の時差
  const date         = new Date();
  const utc          = date.getTime();
  const deviceOffset = date.getTimezoneOffset();
  return utc + (1000 * 60 * (deviceOffset + (offset * 60)));
};

// タイムスタンプから日時を取得
const offsetDate = new Date(getAreaTimestamp(3));  // UTC+3 の地域の日時を取得

console.log(offsetDate);  // Fri Mar 03 2017 06:16:40 GMT+0900 (JST)
```

上記の `GMT+0900 (JST)` の箇所はデバイス情報のままなので偽の値です。
必要があればそこは静的に記述で OK かなと思いますので、特に問題はないかと。
あと、`UTC` と `求めたい地位域の UTC 時差` と `デバイスの時間の UTC 時差` を比べて出力してるので、
`デバイスの時間` が間違ってたら正しい日時を取得できないです。
Ruby (2.4) の美しい書き方メモ

最近ruby (2.4) を書き始めたのでメモ。
Rubyは文法が多彩なので、美しい書き方を覚えていきたい次第です。

## linterツールを使う
とにかくまずは、文法をチェックしてくれるツールをたくさん入れて指摘されながら覚えていきます

- rubocop
- ruby-linter
- reek
- fasterer
- debride

## Immutable string を使う
```rb
# frozen_string_literal: true
# ソースファイルの最初に↑のコメントを入れる
```

- [Ruby2.3 で導入された frozen_string_literal オプションで Immutable String を実現する](http://blog.toshimaru.net/ruby-immutable-string/)

## `%()` を活用する
`#{...}` で文字列埋め込みしたいけど、`"` ダブルクォートも入れたい場合は `%()` をつかう

```rb
%(<tr><td class="name">#{name}</td>)
```

## `||=` を活用する
値が未定義であったり、falseの場合のみ代入をする `||=` を使うことでコードがすっきりします。

```rb
# bad
val = [] unless val

# good
val ||= []
```

## `Array#dig`,  `Hash#dig` を使って深い階層へのアクセスを楽に
Ruby 2.3+ の機能です

```rb
# bad なかったらエラーとなる
arr[0][1][2]

# good なかったらnilが返ってくる
arr.dig(0, 1, 2)
```
google vision API

チュートリアルやってみた

チュートリアルのリポジトリを取得

```bash:取得.sh
TUTORIALDIR=~/src/プロジェクト名/python_vision_quickstart-2017-03-03-12-14
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git $TUTORIALDIR
cd $TUTORIALDIR/vision/api/label
```

API認証作成

```bash:認証.sh
gcloud iam service-accounts create vision-quickstart;
gcloud iam service-accounts keys create key.json --iam-account vision-quickstart@プロジェクト名.iam.gserviceaccount.com && export GOOGLE_APPLICATION_CREDENTIALS=key.json
```

ラベル付

```bash:ラベル.sh
python label.py resources/cat.jpg
```

ランドマーク検出やってみた

- [自由の女神](http://www.newkidscenter.com/images/10415715/Statue_of_Liberty.jpg)

回答：Statue of Liberty　(○)

画像のラベル付けやってみた

- [猫](https://upload.wikimedia.org/wikipedia/commons/e/e0/2016-06-12_Orange_and_white_tabby_cat_born_in_2016_%E8%8C%B6%E3%83%88%E3%83%A9%E7%99%BD%E3%81%AD%E3%81%93%E5%AD%90%E7%8C%AB_2016%E5%B9%B4%E7%94%9F%E3%81%BE%E3%82%8C_DSCF6403%E2%98%86%E5%BD%A1.jpg)

回答：
cat
mammal
vertebrate
whiskers

- [犬](https://jp.sputniknews.com/images/220/21/2202129.jpg)

回答：
dog
mammal
vertebrate
dog breed

- [吠えてる犬](https://s3-ap-northeast-1.amazonaws.com/peco-images/images/187520.jpg)

回答：
dog
mammal
dog breed
vertebrate

- [オバマ](https://pbs.twimg.com/profile_images/822547732376207360/5g0FC8XX_400x400.jpg)

回答：
face
person
nose
head

- [トランプ](https://upload.wikimedia.org/wikipedia/commons/5/56/Donald_Trump_official_portrait.jpg)

回答：
person
public speaking
speech
official
Zynq > BOOT.binの解析 > P. elfファイルのsection情報読込み

```txt:動作環境
PetaLinux 2014.4
Vivado v2014.4
MicroZed
```

2014年頃のメモより。

```
$ readelf -S test.elf
There are 21 section headers, starting at offset 0x24b58c:
Section Headers:
[以下、Name, Type, Addr, Off, Size, ES, Flg, Lk, Inf, Alなどが続く]
```

```
$readelf -s test.elf
[以下、Symbol Tableの内容 Num: Value, Size, Type, Bind, Vis, Ndx, Nameなどが続く]
```
Zynq > BOOT.binの解析 > O. .bitファイルをBoot.binに格納する前の整形

```txt:動作環境
PetaLinux 2014.4
Vivado v2014.4
MicroZed
```

2014年頃のメモより。

.bitファイルはbootgey.pyにおいてstrip_bit()という関数の処理を持って変換した上で、Boot.binに格納している。
stript_bit()において__copy_body()が呼ばれており、その中でunpack(), pack()処理をしていることによりendianの変換がされているようだ。
Zynq > BOOT.binの解析 > N. .elfファイルからplain binaryファイルへの変換

```txt:動作環境
PetaLinux 2014.4
Vivado v2014.4
MicroZed
```

2014年頃のメモより。

.elfファイルはそのままの形式でなく、plain binaryに変換した上でBoot.binに格納されている。
plain binaryへの変換は、Windows環境(XSDKをインストール済み)で、以下のパスにある objcopy.exe を使用するのが一つの手ではあるが。。。
C:\Xilinx\SDK\2014.4\gnu\arm\nt\arm-xilinx-eabi\bin
Git コミットログのコメント文字 "#" を変更する

GitHub で issue を管理していると、コミットログで issue 番号を参照したくなる。

> \#1234 - Fix this issue ...

しかし、デフォルトで Git のコミットログは先頭が `#` から始まる行はコメントになるので、上記のように入力できない。そんなときは、Git の設定パラメータ `core.commentChar` を使ってコメント文字を変更する。

    $ git config core.commentChar '>'

グローバルで変更を適用したかったら、`--global` を付けてもよい。

# Vim のハイライト設定

Vimmer であれば、コメント文字を変更したら、vim のハイライト設定も変えたくなる。`.vimrc` に以下のように設定する。

    au FileType gitcommit syntax match gitcommitComment /^[>"].*/

上記の設定では、`#` に加えて、`>` と `"` がコメントとしてハイライトされるようになる。

# 参考

- http://stackoverflow.com/questions/2788092/start-a-git-commit-message-with-a-hashmark/14931661
fxp/composer-asset-plugin で Could not parse version constraint >=~2 エラーの対処法

fxp/composer-asset-plugin を使って下記のような `composer.json` で `composer install` すると

```json:composer.json
{
  "require": {
    "bower-asset/fullcalendar": "^2.7"
  }
}
```

こんなエラーが出る。

```
  [UnexpectedValueException]                                            
  Could not parse version constraint >=~2: Invalid version string "~2"  
```

`bower.json` の記法で、 `fxp/composer-asset-plugin` に一部対応していないためだ。

このIssueを参考にして

https://github.com/fxpio/composer-asset-plugin/issues/270

```
rm -rf vendor
composer global require fxp/composer-asset-plugin:~1.3@dev
composer update -v
```

したら解決した。

# 考察

正式リリースされていない `fxp/composer-asset-plugin` を使うリスクがある。

bower-asset plugin はタグ読み込みのせいで重いし、トラブルのもと。
Laravel使っている時点でほぼほぼnpmは入っているはずだから、普通にbowerでアセットファイルを管理した方が良いかもしれない。
R のdata.frame/data.table のfilterベンチマーク

各所でベンチマークをされていて、data.tableは速いということはわかっているのですが、ベーシックな処理でも違いは出るのでしょうか？昨日の試みのついでにやってみました。


# データ構造による違い

## data.frame(df)
普通にデータフレームで行選択します。

```R
df <- data.frame(idx = 1:n1, v = runif(n1))
for (i in 1:n2) {
　　a <- df[df$v < 0.5,]
}
```

## data.frame with dplyr(dfdplyr)
dplyrでデータフレームの行選択します。

```R
df <- data.frame(idx = 1:n1, v = runif(n1))
for (i in 1:n2) {
　　a <- df %>% filter(v < 0.5)
}
```

## data.table(dt,dtk)
データテーブルで行選択します。setkeyありなしを試しました。

```R
    dt <- data.table(idx = 1:n1, v = runif(n1))
    if (key) {
        setkey(dt, idx)
    }
    for (i in 1:n2) {
        a <- dt[v < 0.5,]
    }
```

## data.table with dplyr (dtdplyr,dtdplyrk)
dplyrでデータテーブルの行選択します。

```R
    dt <- data.table(idx = 1:n1, v = runif(n1))
    if (key) {
        setkey(dt, idx)
    }
    for (i in 1:n2) {
        a <- dt %>% filter(v < 0.5)
    }
```

## ベンチマーク

元データ数(n1) 100万-1000万（変化させる）
選択回数(n2) 100

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/1b0f856a-0b4e-c168-5251-68177836391e.png)

data.tableが速いという結果は確かなのですが、dplyrを使えばdata.frameでもそん色ないスピードが出るということがわかりました。
filter等の単純な処理ではdata.tableの効果は限定的でgroupbyやaggregateなどを行った場合に真価が発揮されるということですね。

# フィルタ条件の記法による違い

少し気になっていたことですが、filterを書く際に2つ以上の条件を一つのverbで書いたほうが良いのか、別々にverbをカスケードして使ったほうが良いのかどちらが速度的に有利なのでしょうか？

## 一度にやる方法（logical）

```R
    dt <- data.table(idx = 1:n1, v = runif(n1))
    for (i in 1:n2) {
        a <- dt %>% filter(v < 0.6 & v > 0.4) 
    }
```

## 分けて順次やる方法（cascade）

```R
    dt <- data.table(idx = 1:n1, v = runif(n1))
    for (i in 1:n2) {
        a <- dt %>% filter(v < 0.6) %>% filter(v > 0.4)
    }
```

## ベンチマーク

どちらも大差ないという結果になりました。おそらく内部的には同じコードに変換されているのではないでしょうか？

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/89f04bba-0be6-0602-0c00-387bfc84698f.png)
【Java8】 Collection(List, Map, etc.)を舐めるからといって何でもかんでもstream.mapしないでくだしあ＞＜  dear netbeans

なんでこんなん書いたし
====================

業務で初めてJava8を使いました。（以前の投稿から1年以上経ってます…）
初めてNetbeansというIDEを使いました（今までは基本Visual Studio、まれにeclipseです）。
Netbeansの補完機能により、forループがstream API形式に書き換わります。
流石にちょっとこれはないでしょと思うコードが生成されることがあります。

もともとのコード
==============

擬似コードです。

``` java

List<ObjectA> objAList = func();
List<ObjectB> objBList = new List<>();
for (ObjectA objA: objAList) {
    ObjectB objB = convertToObjB(objA);
    objBList.add(objB);
}
```

NetBeansさんのヒントに従う
========================

相変わらず擬似コードです

``` java
List<ObjectA> objAList = func();
List<ObjectB> objBList = objAList.stream()
	.map((objA) -> {
		ObjectB objB = convertToObjB(objA);
		return objB;
	}). forEachOrdered((objB) -> {
		objBList.add(objB);
	});
```

私はこうしてほしい
================

相変わらず擬似ry
そうそう、これも問題があって、convertToObjBが新たに検査例外吐くように修正されたらこのコードコンパイルエラーなんで。
正直for-inで書いたところを何でもかんでもStream APIで置き換えるのは間違ってます。

``` java
List<ObjectA> objAList = func();
List<ObjectB> objBList = objAList.stream()
	.collect(
		() -> new List<ObjectB>(),
		(list, objA) -> {
			ObjectB objB = convertToObjB(objA);
			list.add(objB);
		},
		(l,r) -> l.addAll(r)
	);

```

結論
====

ヒントは絶対に従おうっていうコーディング規約が悪いんですが、
ヒントに従うならその自動置換で生成されたコードの意味、あるいは気持ち悪いかどうかもちゃんと考慮してくださいな。
Javascriptの経験しかなく、そのノリで書いちゃったとかほんとにやめてくだしあ＞＜。

ちなみに
-------

何でもかんでもArrayList, HashMapもやめてくだしあ＞＜
順序めちゃくちゃになるのほんと怖い。

LinkedListとかLinkedHashMapとかあるんで順序が重要な場合はこれ使ってよ。
順序関係ない場合はもしかしたらHashSetとか使えるかもしれないんで
何でもかんでも重複除去処理とかかかないでよ〜〜〜〜〜(; ;)
C#でコードから手動でデバッガをアタッチする方法

C# のプログラム内で、`Process.Start()` を使って、自らを新しく子プロセスとして呼び出したい場面があったが、その場合普通に Visual Studio でデバッグ実行しても、子プロセス側はデバッガにアタッチされない。

子プロセスをアタッチするためには、子プロセス側で、以下を呼び出せばよい。


```C#
System.Diagnostics.Debugger.Launch();
```

上記を記述してデバッグ実行すると、デバッガの選択画面が表示されるので、適当なものを選択すればデバッグが開始される。

### 参考

- [MSDN: Debugger.Launch メソッド (System.Diagnostics)](https://msdn.microsoft.com/ja-jp/library/system.diagnostics.debugger.launch(v=vs.110).aspx)
新しいプログラミング言語を学ぶときに知りたい項目

- 公式サイトのURL(第一次情報源)

- インストール方法(環境構築手順)

- チュートリアル(ソフトウェアを使用するための最低限な知識)

- ベストプラクティス(Effective XXX的な良いと知られている方法すべて)

- ビルドツール(プロジェクトをつくれる,依存ライブラリを自動ダウンロードできる,ビルドができる,実行ができる)

- ライブラリ(標準ライブラリだけでなくよく利用される便利なライブラリなど)

- マニュアル

- ソースコード
pfxファイルを使ってsigntoolでコード署名する時の引数

signtool は WindowsSDKに付属している署名ツール。

オレオレ証明書（コード署名）したい場合は以下の記事を参考にする
http://qiita.com/jTakasuRyuji/items/4db1da1936b4f63390dd

```DOS:引数など
signtool sign /f HOGEHOGE.pfx 
              /p YOURPASSWORD 
              /d UACで表示される文字 
              /t http://指定されたタイムスタンプサーバURL 
              EXEとかMSIとか
```
実際は改行なしで記述。

```DOS:実行結果
  Done Adding Additional Store
  Successfully signed: E:\YOURAPP.exe
```
ウィンドウ操作の便利なショートカットキー

## やり方

### #ウィンドウを半分にして左右に配置する
対象ウィンドウを選択し、「Windows（ロゴ）キー」を押しながら「←」または「→」を押す。
マルチディスプレイでも対応可能。

### #ウィンドウを最大化する
対象ウィンドウを選択し、「Windows（ロゴ）キー」を押しながら「↑」を押す。

### #ウィンドウを最小化する
対象ウィンドウを選択し、「Windows（ロゴ）キー」を押しながら「↓」を押す。
【Git】人生やめたくなったときに使うgitのコマンド集

自分用メモ

よくやらかし、調べつつ自分の中で「このコマンドよく使ったなぁ...」と思い出深いコマンドを書きます
gitでミスをしたり、イラァっとして人生やめたくなった時に使えるかなと思います

## 不要な編集を追跡したくない(addしたくない)
* ` $ git stash`->編集したファイルの作業内容をなかったことにする
* ` $ git checkout {編集を追跡したくないファイルパス}`->指定したファイルを追跡から除外する

## コミットを戻したい
### 使う場面
* 変なコミット積んでしまって戻したい
* マージしたらエラー祭りになったので、戻したい
* とにかく過去に帰りたい！

`$ git reset --hard {戻りたい箇所のコミットの番号}`

または1つ前のコミットの状態に戻したいとき
`$ git reset --hard HEAD~`


## マージ済みのブランチをローカルから一括削除
### 使う場面
* 増え続けるローカルブランチ...
* 1つ1つ丁寧に
`$ git branch -D {ブランチ名}`はとっても面倒


`$ git branch --merged | grep -v '*' | xargs -I % git branch -d %`
をすれば、ローカルのブランチがすっきりする

## コミットメッセージ間違えて恥ずかしい///
### 使う場面
* コミットメッセージに誤字脱字
* まあまあ恥ずかしい単語をコミットメッセージに記載していた(あるあr...ないわ)

`$ git commit --amend`

をしたら、コミットメッセージを編集することができます
※ただし、pushする前に限る
CakePHP2で$this->log()が使えない時のログ出力

app/Lib/下の独自クラス内やapp/Vendor/下のサードパーティ製クラス内などからログ出力する時には$this->log()は呼び出せない。
その時は、公式ドキュメント https://book.cakephp.org/2.0/ja/core-libraries/logging.html#writing-to-logs にも書かれている、

```
CakeLog::write(${出力先ファイル名}, ${出力データ});
```
を使う。

```
$this->log(${出力データ}, ${出力先ファイル名})
```
と引数が逆となる点に注意。
一撃！(ぱくり) KUSANAGI × さくらのVPS

寺尾です。一撃！って宮崎さんのぱくりです m(_ _)m

さくらのVPSで標準OSとして、KUSANAGI8が提供されていますが、初期設定はコマンドラインでやらなければいけません。若干面倒なので[デプロイ用のスクリプト](https://github.com/terao/eisaku/blob/master/wordpress_for_kusanagi8_on_vps.sh)を作成しました。先日の[勉強会](https://sakura-kanto.doorkeeper.jp/events/57050)で初公開しました.

自動でやってくれることは、以下の８つ。

- アカウント・パスワードを自動生成
- yum update
- KUSANAGI初期設定(kusanagi init)
- KUSANAGI構成(kusanagi provision)
- Wordpress設定(kusanagi wordpress config)
- Wordpressインストール(wp core install )
- FQDN設定
- SSL証明書設定（Let's Encrypt)自動更新設定まで

事前の準備は3つ

- VPSサーバの契約（IPアドレスが確定します）
- WordPressサイトのためのFQDNを決めて、DNS設定を終わらせておいてください
- 受信できるメールアドレスの用意（Wordpress、Let's Encrypt用）

早速インストールしていきます。

1. 標準OSインストールをクリック
2. KUSANAGI (CentOS7 x86_64)を選択
3. rootパスワードを2回入力
4. 完了したら[設定内容を確認する]をクリック
5. 内容を確認したら[インストールを実施する]をクリック

コピペが出来るのでシリアルコンソールでrootログインしますを使います

1. 「コンソール」から、「シリアルコンソール(β版)」をクリック
2. login : 「root」、パスワード:「rootパスワード」を入力


```
# curl -O https://raw.githubusercontent.com/terao/eisaku/master/wordpress_for_kusanagi8_on_vps.sh
# chmod 700 wordpress_for_kusanagi8_on_vps.sh
# ./wordpress_for_kusanagi8_on_vps.sh vps1.example.jp terao@example.jp
```

実行時の引数：

- FQDN：サイトのドメインとSSLのコモンネームに使われます
- メールアドレス：WP管理者とLet's Encrypt(SSL)に使われます

スクリプト内部でSSL証明書の発行をしているので何度も同じコモンネームで実行すると上手くいかなくなります。

完了したら構成情報やパスワード情報一覧が表示されます。（実際には最初と最後に2回表示されます）
このコピーを忘れずに！ 忘れると2度と出てきませんのでご注意ください。

最後にリブートしておきましょう

```
# reboot
```

自分のこだわりで内容を変えれば自分用のスクリプトも出来るので試してみてください。

ちなみに、生成される構成情報とパスワード情報はこんな感じです。アカウント名もランダムになってます。

```
- KUSANAGI Server Infomation
Web Server      : Nginx
PHP Type        : php7
Default Profile : default_profile
IP Address      : 192.168.1.100
FQDN            : vps1.example.jp
SSL EMAIL       : terao@example.jp

- Linux User Infomation
kusanagi user Password     : elEnS7xM2H3ybMRnd84IvlxhT91hgL49

- MariaDB Infomation
MariaDB root Password      : Q0aU6lw0e93Isj3Oz0fkAiGKBm5Y2lrn
MariaDB Wordpress Username : wp_f6xq2rdesl
MariaDB Wordpress Password : oWKAhEn17b8GHti1y4lw8vj30g0TOeOf
MariaDB Host               : localhost
MariaDB Charset            : utf8mb4

- WordPress Infomation
Wordpress URL              : https://vps1.example.jp/
Wordpress Admin Username   : admin_uu06x
Wordpress Admin Password   : DY4u1Hq0rhRNgh5lbkR9xOa9SL2h18eh
Wordpress Title            : ICHIGEKI WordPress on KUSANAGI
Wordpress Admin Email      : terao@example.jp
Document Root              : /home/kusanagi/default_profile/DocumentRoot/ 
```

追加情報は公式ドキュメントを見てください。

- KUSANAGI専用プラグイン
    - https://kusanagi.tokyo/document/kusanagi_plugin/
- 推奨するセキュリティ対応
    - https://kusanagi.tokyo/document/security/
- FAQ
    - https://kusanagi.tokyo/faq/
- KUSANAGI Internals
    - https://column.prime-strategy.co.jp/archives/column_284
Vimで、行末に現在時刻を挿入

転職して日報を書くようになり、時間を測る必要に迫られた。

Vimで、Emacsの `org-mode` のように時間を記録したい。Unix系OS限定だが

```vim:~/.vimrc
let mapleader = "\<Space>"
nnoremap <Leader>dt o<ESC>:.!date +\%H:\%M<CR>kJ
```

これで、 `<Space> d t` と入力すれば、現在カーソルがある行末に現在時刻が挿入される。

![out.gif](https://qiita-image-store.s3.amazonaws.com/0/103885/95932a1d-099e-f1dc-c401-35cd49c55858.gif)


撮影メモ

```bash
xwininfo
recordmydesktop --overwrite --no-sound --no-wm-check --no-frame \
    --no-cursor --delay 2 --windowid 0x100860c
ffmpeg -i out.ogv out.gif
```
PhpStormの使い方 便利/よく使う機能

# ローカルの２ファイルを比較する
    1.プロジェクトビューでCtrl+クリックを使い、ファイルを2つ選択する。
    2.右クリックメニューから［Compare Two Files］を選択する。

# Git headとの差分
    「9: Version Control」ナビゲーションを開く。
    右クリック > Show Diff

# Git 行ごとのコミット情報を見る
    エディタ上で右クリック > Git > Annotate

# 既存ファイルの改行コードを一括で変更する

    `1:Project (プロジェクトビュー)`で、変更したいファイル or ディレクトリを選ぶ。
    ウィンドウメニュー > File > Line Separators → LS - Unix and OSX (\n)

![phpstorm1.PNG](https://qiita-image-store.s3.amazonaws.com/0/87995/613b2309-663d-8212-0acb-cd455ddd78fd.png)

![phpstorm2.PNG](https://qiita-image-store.s3.amazonaws.com/0/87995/ff04c84c-c0b8-3090-ca1c-19b93e8b6265.png)

# git stash
[別記事にまとめました](http://qiita.com/RyutaKojima/items/6f9f8967bc1cb0fd8b5b)
Windows > ボリューム削除した状態からの画像ファイル復旧 + 後日談:不具合 (2018-12-17)

```txt:復旧環境
Windows 10 Pro (64bit) Anniversary Update適用済
ファイナルデータ フォトリカバリー9.0プラス
```

### リカバリ

「ディスクの管理」から「ボリューム削除」してしまった。どうしよう。
と相談された時の対処。

フォトリカバリー9.0プラスを使う。

手順は以下で作業した。

1. ボリューム削除した領域に新規ボリュームを割り当てる
  - フォトリカバリーにてスキャン対称を絞り込むため
  - **クイックフォーマットにしておく**
2. フォトリカバリーにて以下とする
  - 論理ドライブを選択
  - 手順1で作成したボリュームを選択
  - 画像ファイルを選択 (すべての画像ファイル)
  - 詳細スキャンまで行う
    - クラスタ単位でのスキャン
  - 「通常のファイル」は検出しない、にチェック
  - ~~「自動的にファイルを復元」を使用~~
     - 「メモリが不足しています」で処理が止まったので、これは使用しない
     - [関連情報]( http://kyama.blog.eonet.jp/default/2011/05/finaldata-90-1f7a.html)

- ファイル名は復旧できない  
- ファイル作成日は復旧できる?
- 2TBのスキャンの場合、240時間かかる
- 物理ドライブという選択ではUSB接続のドライブが見えない
- シリアルATAのドライブが「物理ドライブ」選択で見え、間違ったドライブをスキャンしてしまった (240時間。。。）
- ~~「自動的にファイルを復元」を使用、にて作業途中のチェックができる (誤ったドライブの選択の防止)~~
- 途中まで処理をして停止して、ファイル復元をして正しい領域選択になっているかチェックするのが良い。正しいことを確認したら、最初から選択しなおして処理をする。

### フォトリカバリーにたどり着くまで

以下のツールでは復旧できなかった。

- [TestDisk](https://pctrouble.net/software/testdisk.html) (Deeper Search使用) : 16時間
- [EaseUS Partition Master Free](http://jp.easeus.com/partition-recovery-software/partition-recovery-freesoft.html)
- [PartitionRecovery](http://tokiwa.qee.jp/download/PartitionRecovery/PartitionRecovery.html)
- [Partition Find and Mount](http://hamamuratakuo.blog61.fc2.com/blog-entry-495.html)

### Windows 10について

Windows 10上でフォトリカバリを使うのがいいかは要検討。
Windows 10の場合、Updateのための再起動がかかる場合がある。
http://blog.bagooon.com/?p=1077

Windows 10 Proだと設定で対応できそう。Windows 10 Homeだとどうしようもなさそう。

### 大切なデータについて

適宜バックアップを取りましょう。
大切なデータは「小さな」HDD (例: 500GB)に保存しましょう。スキャン時間を抑制できます (2TBでは240時間)。


### 後日談 (2018-12-17)

久しぶりに同じような状況になった。

実行したところ、`「通常のファイル」は検出しない、にチェック`を選択する画面の「次へ」ボタンを押した後に、再度、ドライブ選択画面(論理、物理）に戻る不具合に遭遇した。

調べても解決方法が不明であったので、使用をあきらめた。

別の方法として[TestDisk](https://pctrouble.net/software/testdisk.html)を試したところ、今回は復旧できた。
PhpStormの使い方 git stash

# git stash save

1. Menu > VCS > Git　<i class="fa fa-play" aria-hidden="true"></i>
 > Stash Changes...
2. 補足のメッセージを入力して Create Stash

キャプチャ(1.)
![stash-save-1.png](https://qiita-image-store.s3.amazonaws.com/0/87995/7b76a3b8-57f4-3b66-52b7-58af9e70bff6.png)

キャプチャ(2.)
![stash-save-2.PNG](https://qiita-image-store.s3.amazonaws.com/0/87995/99c5b0be-8df7-87e3-69bd-a8f78f15593a.png)

# git stash list / apply

1. Menu > VCS > Git　<i class="fa fa-play" aria-hidden="true"></i>
 > UnStash Changes...
2. stashの詳細確認 → View
3. stash apply 実行（stashに保存された状態を戻す） → Apply Stash

キャプチャ(1.)
![stash_apply-1.png](https://qiita-image-store.s3.amazonaws.com/0/87995/6a16e22a-4081-eb64-56cd-9638818d10b7.png)

![stash_apply-2.PNG](https://qiita-image-store.s3.amazonaws.com/0/87995/439b3e7a-ad73-243e-a9b5-52f4c347d99e.png)

キャプチャ(2.)
![stash-apply-3.PNG](https://qiita-image-store.s3.amazonaws.com/0/87995/c11f5a1b-cfd0-0e59-6d39-6e5ec2f14c47.png)
Fish Shell で、TmuxのステータスバーにPATHが通ってない

tmuxのステータスバーに、自作コマンドでバッテリー残量などを表示させている。

![Screenshot_2017-03-03_10-36-52.png](https://qiita-image-store.s3.amazonaws.com/0/103885/5ac32dc4-ebf0-e9d4-bbac-64f55ab9fe28.png)

設定はこれ。

```bash:~/.tmux.conf
set -g status-right \
"#[fg=white] #(imstatus) #(battery) #[fg=white][%Y-%m-%d(%a) %H:%M]"
```

```bash:~/bin/battery
#!/bin/bash

if acpi -b | grep -q Discharging; then
  echo -n \#\[fg=yellow,bold\]
else
  echo -n \#\[fg=green,bold\]
fi

echo `acpi -b | grep -oE \[0-9\]+%`
```

ところが、下記の操作をしたところ正しく表示されなくなってしまった。

- Arch Linuxをフルアップデート
- tmux 2.3 にアップデート
- Fish shell に乗り換え

フルパスで書いたら表示されたので、 `PATH` の設定を追加したところ治った。

```bash:~/.tmux.conf
setenv set-environment PATH $HOME/bin:$PATH
```

参考

http://unix.stackexchange.com/questions/27701/send-a-command-to-a-running-tmux-session-like-screen-x
「neocomplete requires Vim 7.3.885 or later with Lua support」 の解決

Arch Linux をアップデートしたら、Vimの補完プラグイン `neocomplete` が下記のエラーで動かなくなった。

`neocomplete requires Vim 7.3.885 or later with Lua support`

`vim --version` の結果はこれ。

```
VIM - Vi IMproved 8.0 (2016 Sep 12, compiled Feb 14 2017 10:57:50)
Included patches: 1-329
Compiled by Arch Linux
Huge version without GUI.  Features included (+) or not (-):
+acl             +file_in_path    +mouse_sgr       +tag_old_static
+arabic          +find_in_path    -mouse_sysmouse  -tag_any_white
+autocmd         +float           +mouse_urxvt     +tcl/dyn
-balloon_eval    +folding         +mouse_xterm     +termguicolors
-browse          -footer          +multi_byte      +terminfo
++builtin_terms  +fork()          +multi_lang      +termresponse
+byte_offset     +gettext         -mzscheme        +textobjects
+channel         -hangul_input    +netbeans_intg   +timers
+cindent         +iconv           +num64           +title
-clientserver    +insert_expand   +packages        -toolbar
-clipboard       +job             +path_extra      +user_commands
+cmdline_compl   +jumplist        +perl/dyn        +vertsplit
+cmdline_hist    +keymap          +persistent_undo +virtualedit
+cmdline_info    +lambda          +postscript      +visual
+comments        +langmap         +printer         +visualextra
+conceal         +libcall         +profile         +viminfo
+cryptv          +linebreak       +python/dyn      +vreplace
+cscope          +lispindent      +python3/dyn     +wildignore
+cursorbind      +listcmds        +quickfix        +wildmenu
+cursorshape     +localmap        +reltime         +windows
+dialog_con      +lua/dyn         +rightleft       +writebackup
+diff            +menu            +ruby/dyn        -X11
+digraphs        +mksession       +scrollbind      -xfontset
-dnd             +modify_fname    +signs           -xim
-ebcdic          +mouse           +smartindent     -xpm
+emacs_tags      -mouseshape      +startuptime     -xsmp
+eval            +mouse_dec       +statusline      -xterm_clipboard
+ex_extra        +mouse_gpm       -sun_workshop    -xterm_save
+extra_search    -mouse_jsbterm   +syntax          
+farsi           +mouse_netterm   +tag_binary      
   system vimrc file: "/etc/vimrc"
     user vimrc file: "$HOME/.vimrc"
 2nd user vimrc file: "~/.vim/vimrc"
      user exrc file: "$HOME/.exrc"
       defaults file: "$VIMRUNTIME/defaults.vim"
  fall-back for $VIM: "/usr/share/vim"
```

下記のIssueを見たところ、 `lua/dyn` は単体では動作しないっぽい？

https://github.com/Shougo/neocomplete.vim/issues/457

試しに `:lua print "hello"` としたところ 

`Could not load library liblua.so.5.3.4`

というエラーが出たため、 `sudo pacman -S lua` で解決した。

ウィンドウマネージャーに `Awesome` を使っているため、古いほうが入っていたのかもしれない。
react-jsonschema-formのをもっとかんたんに使う便利ツール

## reactでフォームを簡単に作成できるreact-jsonschema-formをもっと簡単に利用する便利ツールについて、その荒い流れ
1. formData(注)のjsonからJSONSchemaを作成する。（ツール１）
2. JSONSchema・UISchema・formDataを詰める。（ツール２）
3. reactに乗せる。
4. フォームできる。
(注) 下記react-jsonschema-formにおけるformData。formの入力例をjsonにしたもの。

### 参考ページ
http://qiita.com/pirosikick/items/f4c010e5914caec13808
大感謝。ここに書いてある通りにやればよい。

## 便利ツール　これを使わないと無理
無理ではない。一からJSONSchema作るのは正気の沙汰ではないが、ツールを知らずにそれをしていた。

1. JSONSchema.net
http://jsonschema.net/#/#top
ここでjsonからjsonschemaを作成=>調整する。
各言語から変換するツールもある模様。


2. react-jsonschema-form
https://mozilla-services.github.io/react-jsonschema-form/
Github Pagesのデモページ
JSONSchema・UISchema・formDataを入力すると、画面右に生成したフォームを表示してくれる。サンプルもたくさんある。
ここで十分詰めておくほうがよい。
エラーの原因も分かるので、後に詰まったりしたらここで確かめる。
カスタムフィールドでもった分類から特定の値を選んだら投稿から排除する

# 投稿から排除する
なんらかの理由でカスタムフィールドで分類した値を排除したい場合
['key' => 'news_type','value' => 'type-a',]

```php
function theme_name_exclude_type_a( $query ) {
	//管理ページでは無効
	if ( is_admin() || ! $query->is_main_query() ) {
		return;
	}
	//トップページとカテゴリページのみ有効
	if ( $query->is_front_page() || $query->is_category() ) {
		//ACFなどのkeyにnews_typeと入力していてセレクトボックスなどの値でtype-aを選択したときに一覧にのせない場合
		$meta_query = array(
			array(
				'key' => 'news_type',
				'value' => 'type-a',
				//type-aだけ取得したい場合は'='に
				'compare' => '!='
			)
		);
		$query->set( 'meta_query', $meta_query );
		$query->set( 'posts_per_page', 10 );
	}
}
add_action( 'pre_get_posts', 'theme_name_exclude_type-a' );
```

それかテンプレートタグを作成するか

```php
function theme_name_get_post_query( $args = array()){
	//カスタムフィールドnews_typeで分類したtype-aの排除
	$meta_query = array(
		array(
			'key' => 'news_type',
			'value' => 'type-a',
			//type-aだけ取得したい場合は'='に
			'compare' => '!='
		)
	);
	$defaults = array(
	 'post_type' => 'post',
	 'posts_per_page' => 5,
	 'meta_query' => $meta_query
	);
	$args = wp_parse_args( $args, $defaults );
	return get_posts( $args );
}
```
node.jsコマンド

Node.jsコマンドについて

terminalを開いてnodeと打つと、>が画面に出て、入力待ち状態となる。

そこに　console.log('hello');　と書くと　terminalが hello と表示してくれる

終了するときは、.exit　と入力する。
node --version　でnodeのバージョンを知ることができる。

主に使うのはこっち

node ファイル名でファイル名を読み込む

ファイル名を hello.js とする
hello.jsのファイルの中に　console.log('hello');　と書く
terminalで node hello.js と打つとterminalが　hello と返してくれる

以上

ほかのnodeのオプションを知りたいときは、 node --help と打つと知ることができる。
Rubyで定義されている全てのClassとModuleを取得する

```rb
modules = ObjectSpace.each_object(Module).to_a

puts modules
puts modules.reject(&:singleton_class?) # 特異クラスを外す場合
```

公式のドキュメントの[ObjectSpace](https://docs.ruby-lang.org/ja/latest/class/ObjectSpace.html)から引用。

> each_object(klass) -> Enumerator
> 指定された klass と Object#kind_of? の関係にある全てのオブジェクトに対して繰り返します。引数が省略された時には全てのオブジェクトに対して繰り返します。

上記のコードはRubyで定義されている全てのオブジェクトに対して `kind_of?(Module)` を実行しており、ClassとModuleに属するオブジェクトはこの判定式がtrueになるので、全てのClassとModuleが取得できます。

特異クラスを外したい場合は `singleton_class?` を実行して `true` を返すものを外します。

## 参考サイト

https://docs.ruby-lang.org/ja/latest/class/ObjectSpace.html
Linux > lookを使って全ての単語を取得する > for x in {a..z};do look $x;done

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 14.04 LTS desktop amd64
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v8.0
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
```

任意の英単語を取得して、それを画像化してNeural Network学習に使おうと検討中。

lookコマンドを使う。
a-zでイテレートして、辞書から単語を引き出す。

参考 http://stackoverflow.com/questions/7300070/bash-script-looping-through-alphabet

```
$ for x in {a..z};do look $x;done
```

```txt:結果
A
A's
AA's
AB's
ABM's
AC's
ACTH's
AI's
AIDS's
AM's
AOL
AOL's
ASCII's
ASL's
ATM's
ATP's
AWOL's
AZ's
AZT's
Aachen
...
abhorred
abhorrence
abhorrence's
abhorrent
abhorring
abhors
abide
abided
abides
abiding
abilities
ability
ability's
abject
abjectly
abjuration
abjuration's
abjurations
abjure
abjured
abjures
abjuring
ablative
ablative's
ablatives
ablaze
...
```


```
$ for x in {a..z};do look $x;done | wc
  99154   99154  938702
```

単語数は99154。
[Ruby] CSVライブラリの使い方

 csvファイルのよく使う扱い方をまとめました。

# CSVファイルを新たに作成
```ruby
require 'csv'

CSV.open('file.csv', 'w') do |csv|
  csv << ["id", "name", "location"]
  csv << [1, "hoge_1", "Kyoto"]
  # ...
end
```

```file.csv
id,name,location
1,hoge_1,Kyoto
2,hoge_2,Osaka
3,hoge_3,Shiga
4,hoge_4,Fukui
```

# CSVファイルの内容を追記
```ruby
CSV.open('file.csv', 'a') do |csv|
  csv << [5, "hoge_5", "Nagano"]
end
```

```file.csv
id,name,location
1,hoge_1,Kyoto
2,hoge_2,Osaka
3,hoge_3,Shiga
4,hoge_4,Fukui
5,hoge_5,Nagano
```

# CSVファイルを読み込む
配列として扱う場合

```ruby
CSV.read('file.csv')
# [["id", "name", "location"], ["1", "hoge_1", "Kyoto"] ... ]
```
ハッシュとして扱う場合（ http://qiita.com/hkengo/items/59ba599ef48c613f2402 ）

```ruby
CSV.read('file.csv', headers: true)
#<CSV::Table mode:col_or_row row_count:5>
```

# ハッシュからCSVファイル生成例
```ruby
require 'csv'

module CSVConvertible
  def to_csv(*keys)
    keys = self.map(&:keys).inject([], &:|) if keys.empty?
    CSV.generate do |csv|
      csv << keys
      self.each { |hash| csv << hash.values_at(*keys) }
    end
  end
end

users = [
  {id: 1, name: 'hoge_1', location: 'Kyoto'},
  {id: 2, name: 'hoge_2', location: 'Osaka'},
  {id: 3, name: 'hoge_3', location: 'Shiga'},
  {id: 4, name: 'hoge_4', location: 'Fukui'}
].extend(CSVConvertible)

IO.write 'file.csv', users.to_csv
```

```file.csv
id,name,location
1,hoge_1,Kyoto
2,hoge_2,Osaka
3,hoge_3,Shiga
4,hoge_4,Fukui
```

Railsの場合は、ActiveRecordのメソッドを使う。
http://qiita.com/retosu/items/5bda7bd5a55c20fc89c0

# 参考リンク
https://docs.ruby-lang.org/ja/latest/class/CSV.html
http://qiita.com/hkengo/items/59ba599ef48c613f2402
http://qiita.com/retosu/items/5bda7bd5a55c20fc89c0
http://qiita.com/metheglin/items/439d1fd9b0e0e53c6051
技術英語 > This use of else might seem [nonintuitive].

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 2141 / 12833)

> This use of else might seem **nonintuitive**.

```py
numbers = [1, 3, 5]
position = 0
while position < len(numbers):
    # some code using break
else: # break not called
    # some other code
```

breakが一切ない場合にelseが処理される。
Pythonで初めてこういう構文を見た。

<hr>
以下にてintuitive を説明する文章ではintuition が使われる。
https://www.merriam-webster.com/dictionary/intuitive
intuition が分からない人には説明できない文章だ。
遺伝的アルゴリズムにもストーリーがあるよ、ってはなし

*『遺伝的アルゴリズム』をカジュアルに知りたい方へ
〜遺伝的アルゴリズムの概念と、どこをどう操作していく解決方法なのかについて〜
この情報過多社会でそれについての情報が少ない、あるいは情報がアカデミックすぎて私にとっては難解であり卒論を書くときに辛かったので、カジュアルにここにまとめました。数学科の底辺学生でも興味を持てた分野です、とっても面白いよ。*


![ae1bc612d40a62da98dff6dc70b405a6.jpg](https://qiita-image-store.s3.amazonaws.com/0/137322/abb3aa92-dcdb-573f-9e52-34b81397c828.jpeg)

#まさに生物の遺伝だねってはなし

遺伝的アルゴリズムはとてもシンプルでナチュラル。

数学を勉強していた身からすると、わりと偶然の事象に身をまかせちゃっているから新しいなって思います。

ふつう、なんらかの問題を解くとき、あれこれ計算して最後の最後にようやくコレだ！という解が導かれます。

しかし、その計算に時間がかかる場合や、計算の仕方自体不明な場合はどうするのか。

そこで考えられたのが遺伝的アルゴリズムです。

解を進化させていくアルゴリズムを構築し、よりよい解を導くのです。

生物が何世代もの時を経て、進化してきたのと同じように。

![1*-S4KOvakHIYzGZypzCP8QA.png](https://qiita-image-store.s3.amazonaws.com/0/137322/10cf9632-d712-c82c-e6f1-914585c01c6e.png)
*こんなかんじ（？）*

今は、人工知能などにも応用されているそう。

より自然界に近いしくみを作ろうとしている点は同じだから、しっくりきます。

個人的には、とりあえず解を仮置きしちゃう大胆さ、そんな堅すぎないところが好きです。

だってスーパーサイヤ人的天才からしたら怠惰って思われそうだよね（？）それをこれでいいのだと貫いているのだから。

#盲目コワイってはなし

遺伝的アルゴリズムを考える際に、気をつけなければならないこと。

それは、盲目にならない！ということ。

というのも、

これは絶対優秀な解だー、と思ったらそれは一時の気の迷い、あるいは勘違いで、本当の優秀な解に辿り着けなくなることがある。

解の探索はときに、からあげにレモンするのと一緒で不可逆なのです。
レモンは確認してからかけよう。

![1*eWcZlB8DLlujvNrM_5OPhQ.jpeg](https://qiita-image-store.s3.amazonaws.com/0/137322/dee09a13-fdee-8a4e-345d-b2839041bf39.jpeg)

なので、いかに一途になりすぎず、常に広い視野を持ち、同時に選択していく勇気も持てるかがカギとなります。

そんな人になりたい…遺伝的アルゴリズムはそんな思想を持ったやつです、大人すぎる。盲目コワイ。（ちがう

要は、常によりよいものを探していけるアルゴリズムを構築せよ、ということです。

#とはいえ実際にどのように進化させていくの?

いざコーディングしようとしたときに、まず何をすればいいのか分からず、なかなか自力で発想していくフェーズまで行けなかった私。

なのでここもカジュアルに文章で残しておきたいです。

##1. ストーリーのはじまり ~現状把握~

まずは、ランダムにつくった個体（解）の集団を0世代としてみなします。

そして、その個体が優秀なのかどうかの判断基準を適合度で表します。

これは、例えば身長が高いほうがその世界で生きていきやすいなら、長身の個体ほど適合度が大きくなるように設定します。

##2. よりよい集団にしようッ

その世界で生きていると、優秀なものが生き残ります。

適合度が低いものは淘汰されていく、とはまさに自然界でも同じです。

淘汰って、ときに残酷に聞こえて、実はハイパー自然的現象でありこの世界には必要不可欠。

そして、このような「選択」を正しくしていけるアルゴリズムを考えるのが私たち世界支配者の仕事です。

適合度が高いほど選ばれやすいとか、適合度が1番高い個体を必ず次世代に残すとか、そんなアルゴリズムをつくりだします。

##3. どんな子孫を残したいの？

選ばれた個体同士で生殖をはじめ、子が生まれます。

その際に、遺伝子がどのように交わるか（交叉）そしてときには突然変異も起こるよね、という自然的事象をアルゴリズムに落とし込みます。

要は、こどもって親の遺伝子をどの程度受け継ぐっけ？を操作しちゃいます。

例えば、突然変異の確率をあげておくと偶発的に目新しい遺伝子をもったこどもが産まれる訳なので、盲目コワイッッを避けられるとか、そういうことが起こる訳です。

このようにして、次世代の集団をつくりだします。

##4. よりよい世界にしようッ

これを、何度も何度でも繰り返していくことで、優秀な個体の集団になります。

きっとそれが、私たちが求めていた解、なのでしょう。

それが本当に確実に正しいのかは分かりません。

しかし、限りなく正解に近づいているはずで、そうなる可能性が高いアルゴリズムを作ることができれば、その世界の支配者として優秀ということになります。

より優秀な支配者をめざして、選択や生殖のしくみを考えるのが私たちの役目なのです。
ポートの開放することなく、Respberry Piに外からアクセスする

自宅に設置したRaspberry Piに外出先からアクセスしたいことってありますよね。
でも、そのためだけにルーターのポートを解放するのも、セキュリティが心配。
そんなあなたに、VNCのクラウドサービスを紹介します。

# RealVNC

https://www.realvnc.com/

![スクリーンショット 2017-03-02 23.55.43.png](https://qiita-image-store.s3.amazonaws.com/0/41574/696ee3cd-943b-0f6e-ef92-0f3e9b5129d2.png "スクリーンショット 2017-03-02 23.55.43.png")

Wikipediaによると、オリジナルのVNCの"正統な後継ソフト"だとのこと。
```Seamlessly connect  devices directly or via the Cloud.```とのことで、
RealVNCのアカウントを作成することで、クラウドを介してインターネット越しのVNCにアクセスすることができます。


![スクリーンショット 2017-03-02 23.57.07.png](https://qiita-image-store.s3.amazonaws.com/0/41574/cf9b7d89-36a1-75f8-b8eb-3949d55fabb2.png "スクリーンショット 2017-03-02 23.57.07.png")

個人利用であれば、HOMEプランのアカウントが無料で作成でき、クラウド連携ができます。他にPROFESSIONALプラン、ENTERPRISEプランがあるようですので、詳しくは公式サイトを確認してください。

https://manage.realvnc.com/pricing

# アカウント作成

サイト上部の「SIGN IN」から登録をすることで、アカウントが作成できます。登録自体は難しいことはないと思います。

# VNCサーバー（Raspberry Pi）の設定

## VNCを有効にする

raspi-configコマンドから、VNCを有効にしましょう。

## アカウントの設定

Raspberry Pi右上のツールバーのところのVNCアイコンを右クリックし、Licensingを選択します。

![Kobito.kGjeED.png](https://qiita-image-store.s3.amazonaws.com/0/41574/16ab4e24-8644-3044-bc4c-9974e2d965d9.png "Kobito.kGjeED.png")

1. ```Sign in to your RealVNC account```を選択します。
2. そして先ほど作成したアカウント情報を設定します。
3. ```Direct and cloud connectivity```を選択します。


# VNCクライアントの設定

## Viewerのインストール

RealVNCのサイトからインストーラーをダウンロードします。
いろいろなOS向けに提供されています。

![スクリーンショット 2017-03-03 6.07.53.png](https://qiita-image-store.s3.amazonaws.com/0/41574/6983672c-50ab-63db-ed0d-9da3ca5858c9.png "スクリーンショット 2017-03-03 6.07.53.png")

インストーラーを実行してインストールします。
VNC Serverは今回は必要ないので、インストールしなくてもOKです。

![スクリーンショット 2017-03-03 6.11.30.png](https://qiita-image-store.s3.amazonaws.com/0/41574/794a65c7-ffe8-eb24-4c64-cbf4923dd583.png "スクリーンショット 2017-03-03 6.11.30.png")

## アカウントの設定

インストールが終わったら、起動し、アカウントの設定を行います。
これといって難しいところはないと思います。

# 接続

設定が終わったら、接続できることを確認してください。

# おまけ

サーバー側のオプション設定に、

* Allow Cloud connection
* Allow direct VNC connections over TCP

の設定があります。

オプション設定はRaspberry Pi右上のツールバーのところのVNCアイコンを右クリックし、Optionsを選択すると表示されます。

![Kobito.GNHoth.png](https://qiita-image-store.s3.amazonaws.com/0/41574/8751ec93-495a-6db9-d971-7b11f5207581.png "Kobito.GNHoth.png")

```Allow direct VNC connections over TCP```のチェックを外すと、5900番ポートでLISTENしなくなり、クラウド経由の方法でのみ接続できる状態となります。

* SSHオフ
* VNCのダイレクトコネクトオフ
* VNCのクラウドコネクトだけオン
* RealVNCのアカウントで二段階認証の設定をする

としておくと、Raspberry Piのセキュリティ対策として良いのではないでしょうか。