OmniAICreator/Qiita-1.07M huggingface dataset:
dllファイルの32/64bitを判定する方法

#判定法を知っておくと便利なシチュエーション
OracleやPostgreSQLのクライアントドライバをインストールする際に、ファイル名やフォルダ名だけからでは32bitなのか64bitなのか確信を得られない場合がある。
また、アプリケーションが動かない原因を調査する際や、dllの参照が正しくなされれているかを確認する場合にも、32/64bitの判断ができると便利である。
では、どのようにして調べればよいかだが、VisualStudio(VS)に付随しているツール、dumpbin.exeを用いると判定が可能なので、その方法を紹介する。

#事前準備
dumpbin.exeはVSに付属しているツールである。そのためバージョンはExpressでもよいので、VSを判定を行う環境にインストールする必要がある。以下のスクリーンショットはVS2015だが、現在有効なVSであればほかのバージョンでも利用が可能なはずである。
 なお、.NETを開発する環境だと標準(C#やVisual Basicなど)のインストールでは、dumpbinはインストールされないのでインストール時にVisual C++の共通ツールをチェックする必要がある。すでにVSがインストール済みの環境であれば、インストールメディアからインストーラーを実行しインストールするように「変更｣を行うことでツールを利用することができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484026/2ad431f0-e60e-118b-c22f-364e981a9452.png)

#使い方
「すべてのプログラム」から「Visual Studio 2015」>「Visual Studio Tools」>「開発者コマンド プロンプト for VS2015」を選択、起動する。
調べたいdllのフォルダに移動し、以下のコマンドを実施する。

```console
dumpbin Oracle.DataAccess.dll /headers | findstr machine
```
ここで、x64と表示されれば64bit。x86と表示されれば32bit用のdllということである。
なお、"|"以降のfindstrはdumpbin /header の出力に対してパイプライン処理で、machineという単語を含む行を抜き出している。
メモ：Railsでサイト設定情報をDBに持たせて柔軟に運用する

この記事は
===

* RailsでDBにサイト設定情報を持たせて画面から設定させたかったです
* ここでいうサイト設定というのは、例えばサイトのタイトルみたいな、あとからちょくちょく変えたくなるようなアプリケーションレイヤの設定項目です
* 設定ファイルに記述する方式でよければrails configとか使えばいいのですが、スピードと分業の都合でリアルタイムに画面から変更したかったです

対応方針
===

rails-settings-cached gem
---

* [rails-settings-cached](https://github.com/huacnlee/rails-settings-cached)というgemを使ってやってみました
* このgem、元々は[rails-settings](https://github.com/ledermann/rails-settings)のforkらしいのですが、跡形もないくらいにいじられているので、完全に別物と思ってください

このgemのいいところ
---

### DB構成が手軽

* まずDBにデータを保存するという基本的な構成が想定通りです
* かつ、保持させたい設定情報がキーバリュー方式の2つのカラムで管理されていて手軽です
* 対する方式としては、設定項目ごとにカラムを追加するというやりかたもありますが、これだと、設定項目が増える度につどつどmigrationが入ってめんどくさいです

### 性能について考えられている

* それから、性能を改善するために、RequestStoreにデータを入れて再利用しています
    * Railsのリクエスト開始時に最新の設定情報を取りに行って、同一リクエスト内では同じものを使い回す
    * リクエスト終了時に設定情報を破棄する
* RequestStoreを利用しているおかげで、呼び出すたびにDBアクセスはしないですんでおり、ある程度SQL発行回数を抑制しつつ、複数APサーバでも動的な設定情報変更が反映できる構成になっています
* 多分gem名のcachedというのはここの部分を指していると思います。


導入手順
===

gemのインストール
---

* gemを普通に入れます

```ruby:Gemfile
gem "rails-settings-cached", "~> 2.0"
```

DBテーブルの追加
---

### rakeが・・・

* テーブル追加したりモデルクラスを追加するrakeが付いているのですが、なぜかエラーが出て使えませんでした
* なので、ソースのtemplateを参考に下記のようなクラスを作りました
    * ```sample_configs```/```SampleConfig``` というなまえのテーブル/モデルを作るものとします

### テーブル定義

* 今みてるRailsアプリケーションがRidgepoleを使っているので、下記のように定義しました。
* rails標準のmigrationでも同じような事を書けば大丈夫だと思います

```ruby:Schemafile
create_table :sample_configs, id: :integer, force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4" do |t|
  t.string :var, null: false
  t.text :value, null: true
  t.timestamps

  t.index :var, name: 'index_sample_configs_var', unique: true
end
```

### モデル定義

* こんな感じに定義します
* ポイントはfieldに定義するときにハードコードでデフォルト値を設定できるというところです
* DBに値がなかった場合は自動的にこちらを参照してくれるので、運用によっては結構便利だと思います。

```ruby:app/models/sample_config.rb
# RailsSettings Model
class SampleConfig < RailsSettings::Base
    self.table_name = 'sample_configs'
    cache_prefix { "v1" }

    # Define your fields
    # field :host, type: :string, default: "http://localhost:3000"
    # field :default_locale, default: "en", type: :string
    # field :confirmable_enable, default: "0", type: :boolean
    # field :admin_emails, default: "admin@rubyonrails.org", type: :array
    # field :omniauth_google_client_id, default: (ENV["OMNIAUTH_GOOGLE_CLIENT_ID"] || ""), type: :string, readonly: true
    # field :omniauth_google_client_secret, default: (ENV["OMNIAUTH_GOOGLE_CLIENT_SECRET"] || ""), type: :string, readonly: true

    field :example1, type: :text, default: "hello!"
end
```

使い方
===

* こんな感じで普通に使えます
* field定義するときに指定した型に応じて適当にキャストされて返ってくるのもなかなか便利です

```ruby:some_controler.rb
def some_action
  render text: SampleConfig.example1
end
```

* ちなみに値を代入するだけでsaveせずともDBが更新されてしまうのでそこだけは注意してください
* モンキーパッチで潰しておいた方がいいかも

ActiveAdminの利用
===

* わざわざDBに値を保持させたので、画面から更新したくなると思います
* まあまあよく使われているActiveAdminを利用して、普通にこれらの値を画面から更新することができます
* 下記ファイルを作成すれば、普通に画面からCRUDでメンテできるようになります

```ruby:app/admin/sample_configs.rb
ActiveAdmin.register SampleConfig do
    permit_params :var, :value
end
```

終わりに
===

* 全然有名じゃないgemな気がしますが、結構いい感じだなとおもいました
jQueryにて、架空のキャラ紹介ページをつくってみた(自分用)

#まえがき
jQuery練習用に作ったシンプルなシステムの1つです。
この場をお借りして投稿させていただきたいと思います。
#概要
画面は下図の通りです。
<img width="411" alt="introChara.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494447/2657aeae-2745-9a6f-fb6b-29beda117391.png">
各キャラクター名のあたりにカーソルを持ってくると..
<img width="589" alt="introChara2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494447/d73c9fc4-bd0c-d417-c78d-1fa803599117.png">
このようにキャラクターの紹介文が表示されます。
#コード
##CSS
```css

@chaset "UTF-8";

#chara-info ul{
  list-style: none;
  margin: 0;
  padding: 0;
}

.text-contents{
  width: 195px;
  display: none;
}

.chara-role{
  font-size: 30px;
  font-weight: bold;
}

.show-text-content{
  width: 195px;
  display: block;
}
```
##JavaScript
```JavaScript
$('.characters').hover(
  function(){
  $(this).find('.text-contents').addClass('show-text-content');
  },
  function(){
    $(this).find('.text-contents').removeClass('show-text-content');
  }
);
```
##解説
hoverメソッドでホバーしているときと終わったときの動作を設定しています。
show-text-contentクラスをつけることで、ホバーしているときにdisplayがnoneからblockへと変わり、紹介文が非表示から表示へと切り換わるようになっています。ホバーが終わった時はその逆をしています。
効率的なソフト開発


バグのないソフト開発、迷走せず整然としたソフト開発、そして高速なソフト開発、そんなことがしたくて開発メソッド探求の旅に出たんだ。

# 私がたどり着いた楽園

最初に結論から。私はRedmineを使って半年～1年程度において、おおよそ週単位の計画を立てるようにしている。週報で言うことの計画かな。  

ひとつのタスク、私としては「20分程度で終わり、やるべき作業がすでに明確であるもの」、の管理はMicrosoft ToDoを使っている。タスクをまとめたリストの存在、およびタスクをリスト間で移動させやすいので、Getting Thins Done (GTD)とよばれるタスク管理術を実践しやすい。これは1週間ごとにメンテする。

ソフト開発に特化したToDoリストとしては、Github Flowを使うようにしている。こちらは機能ごとにissueを立てることが多いかな。


 
# Redmine
ガントチャートを書くツールである。Githubのissueやマイルストーンを一般業務にも拡張し、ガントチャート表示できるようにしたツールというイメージ。

### こんな時におすすめ
 - 半年～1年程度のプロジェクトで、一週間スパンのToDOリストとして有用である。メモのところに日々の作業内容を書いて、それをMicrosoft ToDoへ落としながら日々作業するのもいい。
 - 全部詳細に書かなくていい。LOD式のように、半年先までタスク（20分で作業できる内容）まで分割、1年先はプロジェクト単位（1週間作業量程度）を事前に計画しておくのにいい。

### メリット
 - チケット駆動開発を体現できる。Githubだけだと、ソフトウェアはチケット駆動開発できるが事務作業や交渉事がうまくインクルードできない。

### デメリット
 - 一日以下で実現できるToDoのリスト化には向かない。ガントチャートにうまく表示できない。
 - メンテし続ける根性が大事

# Microsoft ToDo
Microsoft謹製のToDOリストである。

### こんな時におすすめ
 - タスク単位（20分でできること）でToDoをまとめたいとき。
  - Redmineより粒度が低いレベルのToDoリストですね。
 - Getting Thins Doneを実践したいとき。上司に勧められた。

### メリット
 - シンプルなUI
 - リスト間でタスクの移動が容易である。これにより、GTDメソッドが実践しやすい。

# Github Flow

Git Flowを簡易的に模した開発フローの提案。作業内容（分類ごとのフォーマットに従って書ければなおよい。バグ修正とか機能実装とか）を書いたイシューを立てて、developerブランチを切って、開発が終わったらプルリクエストを出してmasterブランチに統合する。

### こんな時におすすめ
 - ソフト開発するときは絶対必須である。

### メリット
 - 進捗が管理しやすい開発が可能。第三者にも説明しやすい。
 - 一言で言って、おすすめである。

### デメリット
 - メンテし続ける根性が大事。私はさぼり癖が強くてなかなか難しい...ボッチ開発の場合はなおさら続かない。

# 結論
タスク管理手法は山ほどある。手法を知ることはたやすい。一方で、全部に言えることだがメンテナンスが大変である。少しだけ帰るのを我慢して、また少しだけ朝早く来て、こうしたタスク管理に取り組もう。朝30分、帰るとき30分、昼休みあと30分とかかな。

# 参考になったサイト
 - [ゲーム開発プロジェクトマネジメント講座](http://www.jp.square-enix.com/tech/openconference/library/2011/dldata/PM/PM.pdf)
MessageBaseクラス（MVVM Light Toolkitリファレンス）

# MessageBase
## 概要

```csharp
public class MessageBase
```

- メッセンジャーが配信するのメッセージのための基底クラス。

##### 名前空間
- `GalaSoft.MvvmLight.Messaging`

#### アセンブリ
- GalaSoft.MvvmLight


## メソッド
### コンストラクター
<details><summary>コンストラクター</summary><div>

```csharp
public MessageBase()
public MessageBase(object sender)
public MessageBase(object sender, object target)
```

##### 概要
- `sender`は、メッセージの送信者となるオブジェクト。
- `target`は、メッセージの受領者となるオブジェクト。メッセージの配信には影響しない。つまり、メッセージの受領者として指定した`target`以外のオブジェクトにも、メッセージは配信される。したがって、メッセージが自分宛であるかどうかは、メッセージの受領したオブジェクトが判断する。
</div></details>


## プロパティ
### Sender
<details><summary>Sender</summary><div>

```csharp
public object Sender { get; protected set; }
```

##### 概要
- メッセージの送信者となるオブジェクトを戻す。
</div></details>


### Target
<details><summary>Target</summary><div>

```csharp
public object Target { get; protected set; }
```

##### 概要
- メッセージの受領者となるオブジェクトを戻す。
</div></details>


## 参照
- [目次](https://qiita.com/h084/items/c5355fa734936c56ca50/)
- GenericMessage&lt;T&gt;
- [NotificationMessage](https://qiita.com/h084/items/3599ffd8e8dcf6951bfd)
Windows 10 の初期設定 (仮想デスクトップとかWSLとか)

# Windows 10 を使い始めるときに最初にしておく設定(覚書)

- どっかに書いておかないと忘れちゃうので備忘録。
 
1. 最初に[設定] → [更新とセキュリティ]で[Windows Update]をやっておく
2. ついでに [Microsoft Store]でアプリケーションの更新もやっておく

## UI 設定
### 仮想デスクトップを追加
1. タスクバーで「タスクビュー」をクリックして、「新しいデスクトップ」で追加する
2. [設定] → [システム] → [マルチタスク] で「仮想デスクトップ」の設定を変更する

### 言語設定
1. [設定] → [時刻と言語] → [言語]の設定を変更する

### スタートメニュー
1. [設定] → [個人用設定] → [スタート]の設定を変更する

## 仮想環境系設定
### Windows 機能の追加と削除
1. [設定] → [アプリ] → [アプリと機能] の**関連設定**から[プログラムと機能]をクリック (コントロールパネルの「プログラムと機能」)
2. [Windows の機能の有効化または無効化] をクリック
3. [Hyper-V] と [Windows Subsystem for Linux] を有効にして再起動

### Store アプリを追加

- Microsoft Store から「Debian」、「Python3」、[Windows Terminal」をインストールする

### Hyper-V を設定
- 用途に合わせて適切に設定する

### Debian on WSL
1. [スタートメニュー] から [Debian]を選んで起動
2. しばらくすると bash が立ち上がるのでユーザ名を決めてパスワードを設定

#### apt.conf 設定
* プロキシサーバが立っていてそのままネットに出られない場合、apt.conf を作らないと apt-get 等でソフトウェアのインストールや更新が行えない

* /etc/apt.conf
 
```conf
Acquire::http::proxy "http:<fqdn>:<port>";
````
- [参考リンク](https://github.com/Microsoft/WSL/issues/1570)

## 開発環境系

* VSCode とか scoop とか git とか
Google Apps ScriptにはNumber.isNaN()がない

Google Apps Scriptで`Number.isNaN()`を使おうとしたところ、以下のようなエラーが発生しました。

```text
TypeError: オブジェクト function Number() { [native code for Number.Number, arity=1] } で関数 isNaN が見つかりません。
```

そう、Google Apps Scriptには`Number.isNaN()`がないのです。
グローバル関数の`isNaN()`はありますが、こちらは仕様に問題があるので使わないほうがいいでしょう。[^1]

## 対処法
`Number.isNaN()`と同等の処理は簡単に実装できるので、`isNaN_`関数を作ってそれを使いましょう。

### Google Apps Scriptで書く場合
```js
function isNaN_ (value) {
  return typeof value === 'number' && value !== value
}
```

### TypeScriptで書く場合
```ts
function isNaN_ (value: any): boolean {
  return typeof value === 'number' && value !== value
}
```

[^1]: [isNaN() - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/isNaN)

## 参考リンク
* [Number.isNaN() - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Number/isNaN)
github への接続がエラーになっていた話

# 何が起こったのか
```brew update```や、```curl なんたら```というときに、```https:github.com```へ接続をかけた際に、エラーになるお話。
調べても全然出てこない！気がしました。。
★SSHのお話ではありません。

# エラー内容

なにかのコマンドでgithubからファイル等を取得してくる際には、必ず```curl: (60) SSL〜```というエラーになってました。
以下にエラーを。

```terminal
$ curl -L -I github.com
HTTP/1.1 301 Moved Permanently
Content-length: 0
Location: https://github.com/

curl: (60) SSL certificate problem: self signed certificate in certificate chain
More details here: https://curl.haxx.se/docs/sslcerts.html

curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.
$ brew update
fatal: unable to access 'https://github.com/Homebrew/brew/': error setting certificate verify locations:
  CAfile: /etc/ssl/cert.pem
  CApath: none
・
・
省略
```

# やったこと
これが正しいのかはわかりませんので、自己責任・自己判断でお願いします！
自分の場合は、```/etc/ssl/cert.pem```ファイルの中身が空になってました。

```
$ cd /etc/ssl 
$ sudo wget http://curl.haxx.se/ca/cacert.pem
$ sudo mv cert.pem cert.pem.back
$ sudo mv cacert.pem cert.pem
```

一応元々のファイルは、[cert.pem.back]でファイル保存をしておきました。
http://curl.haxx.se/ca/cacert.pem ここから、ファイルを保存。
保存ファイルの名前を変更。

ファイル名で指定されているかもしれないので、同一ファイル名にしました。
もしかしたら、```*.pem```で指定されてるかもしれないので、そこはわかりません。

# 感想
「...まぢクソ程ハマったべや・・・」 というのが本音。
本気でハマったので、誰かが同じエラー発生の場合これで早期解決を祈っております。

本当にSSL関連の理解が乏しいことを実感させられた1日でした。
Docker内でC++コードをビルドする

## はじめに
ベストプラクティスはわからないけど、DockerでC++のビルドを行えるDockerfileを作成した。ホスト環境をビルド環境で汚さない目的のためにDockerを使用している。Dockerコンテナにアタッチしてコードをビルドするのは一般的ではないかもしれない・・。ホスト側のソースコードをbind mountして、Dockerの環境でビルドを行うような使い方を想定している。

## 本題
### コードをビルドするためのコマンド
```sh
# ホスト
docker build --tag env_c .
docker run -it --rm env_c /bin/bash
# Docker
make
```

### 構成
* Dockerfile
* CMakeLists.txt
* main.cpp

### Dockerfile
```Dockerfile
FROM ubuntu:18.04

RUN apt update \
  && apt install --yes \
  build-essential \
  cmake \
  vim \
  && rm -rf /var/lib/apt/lists/*

COPY . /workspace/helloworld
RUN mkdir /workspace/helloworld/build \
  && cd /workspace/helloworld/build \
  && cmake .. \
  && make

WORKDIR /workspace/helloworld/build
```

### CMakeLists.txt
```
cmake_minimum_required(VERSION 3.8)
project(helloworld_cpp)

add_executable(${PROJECT_NAME}
  src/main.cpp)
target_include_directories(${PROJECT_NAME} PUBLIC include)
```

### main.cpp
```cpp
#include <stdio.h>

int main() {
    printf("helloworld\n");
    return 0;
}
```

## ファイル置き場
https://github.com/toppy-luna/sandbox/tree/master/C%2B%2B/helloworld
Embulkのconfig項目で真偽値を使用しようとしたら「Caused by: org.jruby.exceptions.RaiseException: (ArgumentError) Unknown type "boolean"」が出た場合

#結論
booleanの記述が誤っている。正しくはboolとすべき。

##誤
```
      def self.transaction(config, &control)
        # configuration code:
        task = {
          "dir" => config.param("dir", :string, default: "."),                     # integer, required
          "recurse" => config.param("recurse", :boolean, default: false)
        }
```

##正
```
      def self.transaction(config, &control)
        # configuration code:
        task = {
          "dir" => config.param("dir", :string, default: "."),                     # integer, required
          "recurse" => config.param("recurse", :bool, default: false)
        }
```
Google Mini PCIe Acceleratorを導入する

Google Mini PCIe Acceleratorを導入する

![微信截图_20190919155914.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448511/876f9497-c77b-12bf-4471-290e0f3ee5a0.png)

Mini PCIeまたはM.2インターフェイスを使用して、Edge TPUをレガシーシステムと新しいシステムに統合します。

もっと詳しく知る: [Google Coral Edge TPU] (https://store.gravitylink.com/global)

##### 特徴
Google Edge TPU MLアクセラレーター
標準のハーフミニPCIeカード
ホストCPUでDebian Linuxおよびその他のバリアントをサポート

###概要
Coral Mini PCIe Acceleratorは、既存のシステムおよび製品にEdge TPUコプロセッサーを提供するPCIeモジュールです。

Edge TPUは、低電力要件で高性能ML推論を提供するGoogleによって設計された小さなASICです：各TOPSに0.5ワット（ワットあたり2 TOPS）を使用して、1秒間に4兆回の操作（テラ操作）（TOPS）を実行できます ）。 たとえば、MobileNet v2などの最先端のモバイルビジョンモデルを400 FPSで電力効率の高い方法で実行できます。 このオンデバイス処理により、待ち時間が短縮され、データのプライバシーが向上し、一定の高帯域幅接続の必要性がなくなります。

Mini PCIe Acceleratorは、標準のMini PCIeスロットに収まるように設計されたハーフサイズのMini PCIeカードです。 このフォームファクタにより、ARMおよびx86プラットフォームに簡単に統合できるため、組み込みプラットフォーム、ミニPC、産業用ゲートウェイなどの製品にローカルMLアクセラレーションを追加できます。

#### 必要条件
Coral Mini PCIe Acceleratorは、次の仕様のホストコンピューターに接続する必要があります。

- 互換性のあるミニPCIeモジュールスロットを備えたLinuxコンピューター
- Debian 6.0以降、またはその派生物（Ubuntu 10.0+など）
- ARMv8命令セットを備えたx86-64またはARM32 / 64のシステムアーキテクチャ


![微信截图_20190919155849.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448511/01d5710b-8ac3-41b1-2267-402d8f97edd6.png)


####次元
合計サイズ：30 x 26.80 x 2.5 mm
PCBサイズ：30 x 26.80 x 1.0 mm
上面コンポーネントの高さ（最大）：1.5 mm
底面コンポーネントの高さ：0 mm
詳細な機械仕様については、PCI Express Mini Card Electromechanical Specificationを参照してください。


#### ソフトウェアと操作
ホストシステムは、Debian Linux 6.0以降、またはその派生物を実行し、Edge TPUランタイムとAPIライブラリがインストールされている必要があります。

PCIeカーネルドライバーは、バージョン4.19以降、ソースを使用してkernel.orgに既にアップストリーム化されています。 以前のバージョンの場合、dkmsドライバーは、`https：//packages.cloud.google.com/apt coral-edgetpu-stable main` のガスケットdkms debパッケージから入手できます。

#### 熱限界と動作周波数
Edge TPUスタックアップの熱抵抗と最大許容温度は次のとおりです。

- 熱抵抗（シールド缶の上部への接合部）：11°C / W
- 最大Edge TPUジャンクション温度：100°C
- Mini PCIe Acceleratorには、システムから熱を放散する熱ソリューションは含まれていません。 Edge TPUから最大のパフォーマンスを維持するには、Edge TPUが最大Edge TPU温度よりも十分に低く動作するようにシステムを設計することが重要です。 Edge TPUが高温になりすぎると、動作周波数が徐々に低下し、永久的な損傷を避けるためにリセットされる場合があります。

PCIeドライバーには、Edge TPUからの温度測定値に基づいて、電力調整メカニズム（動的周波数スケーリングとも呼ばれます）および緊急シャットダウンメカニズムが含まれています。デフォルトでは、このシステムはEdge TPUダイ温度を5秒ごとにチェックし、次のように応答します。

- Edge TPUが85°C未満の場合、「最大」動作周波数で続行します。
- Edge TPUが85°Cに達したら、動作周波数を50％下げます（「最大」から「通常」に）。
- Edge TPUが90°Cに達した場合、動作周波数をさらに50％下げます（「通常」から「低」に）。
- Edge TPUが95°Cに達した場合、動作周波数をさらに50％下げます（「低」から「最低」に）。
- Edge TPUが100°Cに達したら、Edge TPUをリセットします。
動作周波数を下げることで、Edge TPUの推論速度は遅くなりますが、消費電力が少なくなり、ハードウェアリセットのしきい値に到達することを回避できます。

Edge TPUがリセットされず、Edge TPUの温度がより低いレベルに戻る限り、システムは逆の方法で動作周波数を復元します。EdgeTPUが85°Cを下回ると、最終的に最大動作周波数に戻ります。
１からNまで足し算するシステムをつくってみた(自分用)

#システムを作ったきっかけ
JavaScriptの練習がてら作った、簡単なゲームの一つです。
自分の1作品としてこの場をお借りし、投稿したいと思います。
#システム概要
画面に表示される小さな小窓に数値を入力すると、計算結果を出力します。

【図1】初期状態
<img width="226" alt="Count1ToN.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494447/dd545f04-035e-9f85-3ac8-01fbaf6dbe12.png">


【図2】10を入力した結果
<img width="270" alt="10result.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494447/ee7bacbb-69b5-3794-3170-b5f42c5f0bf2.png">


また、小窓に1未満の数字や文字列を入力した場合は「1以上の数値を入力してください。」と出力されます。
#コード
##HTML
```HTML
<!DOCTYPE HTML>
<html lang="ja">
  <head>
    <meta charset="UTF-8">
    <title>1からNまで足し算</title>
    <script type="text/javascript" src="script/sum.js"></script>
  </head>
  <body>
    <h2 id="text">1～Nの合計を計算します！</h2>
    <input id="max" value="数字を入力してください"/>
    <button onclick="calcSum()">ポチッ！</button>
  </body>
</html>
```
##JavaScript
```JavaScript
  function calcSum() {
    var max = document.getElementById("max").value;
    var total = 0;
    
    if(isNaN(max) === true || max < 1){
       document.getElementById("text").textContent = "1以上の数値を入力してください。";
       }
    else{
      var i = 1;
      while(i <= max){
        total += i;
        i++;
      }
      document.getElementById("text").textContent = "1から" + max + "までの合計は" + total + "です！";
    }
  }

```
#あとがき
改善の余地があれば、ご指摘いただけたら幸いです。
また、他にもいろいろなシステムを作っているので、随時投稿させていただこうと思います。
Swift タプル [ var bar: (a: String, b: Int)←これ ]の使い所

Swift タプル[ var bar: (a: String, b: Int)←これ ]の使い所








# はじめに
タプル、あんまり使ってきませんでした。カッコで囲ってあるこういう奴を**Tuple**と言います。




```swift
var tuple = ("tuple", 12)
```




存在を知っていたものの、最近初めてタプる機会があり恩恵を感じました。




# なぜ使わなかったのか
* 一見複雑そう、なので理解を後回し
* 存在と書き方は一読したが、**使い所が不明**




という理由から使用を避けていました。
おそらく、使い所が分からない！って人もいるんじゃないでしょうか。




しかし、


- タプり所が分かると、実装の１つの選択肢として引き出しになる
- 今後も使用していくと思うのでタプり所メモっときたい




という点からまとめることにしました。




# Taple ?
* 複数の値を一括りで所持できる
* 格納される型はバラバラでもオッケー
* 値の変更は可能
* 値の 追加、削除、繰り返し はできない




タプルの詳細はこの辺をどうぞ：
https://qiita.com/keiskimu/items/3090a6c0a74bdfd285f9




**(array + dictionary + struct) / 3 +  α** かな？と個人的に感じました。




今後も修正して行けたらと思いますが、以下タプり所。




#  タプりどころ
## 一時的な構造体（struct）として
### 想定場面
* `UIImage`と`String`達、**セットで所持**したいなぁ
* **型がバラバラ**だからArrayとかでは無理だなぁ
* **一時的**な値の所持だし、わざわざ**Model増やしたくない**なぁ




→　タプれる




### sample code
```swift


// これでいい
private let picTuples: [(image: UIImage?, title: String)] = [
        (UIImage(named: "picA"), "海です"),
        (UIImage(named: "picB"), "山です"),
        (UIImage(named: "picC"), "川です")
]


//-----------------------------//


// これ長い、構造体も不要
struct Pic {
    var image: UIImage
    var title: String
}


let images = [
        UIImage(named: "picA"),
        ...
]
let titles = [
        "海です",
        ...
]
```


上記のように`(name: , title: )`とラベルを付与することで`Pic.name`のように値にアクセスができます。
新たにモデルを作成するまでもない、一時的な値群の保持として活用できます。




## メソッドの戻り値が２パターンある場合一括りにする
### 想定場面
* 後で操作したいメソッドの**戻り値A（１つ）**がある
* でも**戻り値A,B（２つ）必要**な場合もある
* 且つこの複数のオブジェクトを**互いに紐付けておきたい**
* この為にメソッドを**２つ作りたくない**


→　タプれる


### sample code
```swift
 
// タプルでreturn
class CustomView: UIView {
    init(...){
        ~~~
    }
    func createTwoItems() -> (CustomView,  UIImage) {
        let view = CustomView(...)
        let image = UIImage(...)
        ~~~
    
        return (view, image)
    } 
}




// 両方使う場合
class SampleA: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()   
        let (customView, image) = CustomView.createTwoItems()
        customView.foo.bar // アクセス
        image.foo.bar // アクセス
    }
}


// 片方だけ使う場合
class SampleB: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()   
        let (_, image) = CustomView.createTwoItems()
        image.foo.bar // アクセス
    }
}


```
サンプルなので省略するところは省略していますが、片方だけ使用する場合は**ワイルドカード(_)**を用いることで不要なアクセスを省略できます。又の名を無視できます。


# 終わりに
メソッドに関しては状況に応じて２つ作成してもいいんでしょうが、このような場合もあると思うので引き出しの１つとして。
１つ目はよく使うかも、ということでメモ。
他に使い所あれば追記してく。
【TypeScript + Vue】$refsを使った子コンポーネントのアクセスでエラーになったとき

# エラー内容
```
Property 'hello' does not exist on type 'Vue | Element | Vue[] | Element[]'.
Property 'hello' does not exist on type 'Vue'.Vetur(2339)
```

helloなどというプロパティが"Vue"型には存在しませぬぞ！
と言われております。

# コード

## 親コンポーネント

```vue:Parent.vue
<template>
  <clild ref="clildGreet" />
</template>

<scirpt lang="ts">
  import Vue from "vue";
  import Component from "vue-class-component";
  import Child from "./Child.vue";

  @Component({
    name: "parent",
    components: { Child }
  })
  export default class Parent extends Vue {
    created() {
      // 子コンポーネントのhelloというメソッドを呼び出したい。
      this.$refs.clildGreet.hello();
    }
  }
</script>
```

## 子コンポーネント

```vue:Child.vue
<template>
  <p>{{text}}</p>
</template>

<scirpt lang="ts">
  import Vue from "vue";
  import Component from "vue-class-component";

  @Component({
    name: "child"
  })
  export default class Child extends Vue {
    text:string = "";

    hello() {
      this.text = "hello";
    }
  }
</script>
```

# 解決策

## 親コンポーネント

```vue:Parent.vue
<template>
  <clild ref="clildGreet" />
</template>

<scirpt lang="ts">
  import Vue from "vue";
  import Component from "vue-class-component";
  import Child from "./Child.vue";

  @Component({
    name: "parent",
    components: { Child }
  })
  export default class Parent extends Vue {
    get refs():any {
      return this.$refs;
    }

    created() {
      // 子コンポーネントのhelloというメソッドを呼び出したい。
      this.refs().clildGreet.hello();
    }
  }
</script>
```

`this.$refs`に型anyを付けてあげることで回避。
ヘッダーをposition: fixed;で固定した時のアンカーリンクずれ解消法とoverflow: hidden;

## 概要
position: fixed;で画面上部にヘッダーを固定した場合の
アンカーリンクのズレを直す方法として以下を試しましたが、
**親要素にoverflow: hidden;が設定されているとChromeで効かなくなる**ことに気づかずハマったのでメモ。

## 試した解消法
### パディングとネガティブマージンを使う
<p class="codepen" data-height="265" data-theme-id="0" data-default-tab="css,result" data-user="kai-ono" data-slug-hash="wvwYNVp" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="ヘッダーをposition: fixed;で固定した時のアンカーリンクずれ解消法">
  <span>See the Pen <a href="https://codepen.io/kai-ono/pen/wvwYNVp/">
  ヘッダーをposition: fixed;で固定した時のアンカーリンクずれ解消法</a> by Kai (<a href="https://codepen.io/kai-ono">@kai-ono</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
```css
アンカー要素 {
  margin-top: -60px;
  padding-top: 60px;
}
```

### :target疑似クラスを使う
```css
:target::before {
   content: "";
   display: block;
   height: 50px;
   margin-top: -50px;
}
```

## 効かなかった方法 （2019/9/19時点）
### 疑似要素を使う
<p class="codepen" data-height="265" data-theme-id="0" data-default-tab="css,result" data-user="kai-ono" data-slug-hash="jONedVL" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="疑似要素を使ったアンカーずれ解消法サンプル（※効きません）">
  <span>See the Pen <a href="https://codepen.io/kai-ono/pen/jONedVL/">
  疑似要素を使ったアンカーずれ解消法サンプル（※効きませんでした）</a> by Kai (<a href="https://codepen.io/kai-ono">@kai-ono</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
```css
アンカー要素ID::before {
    content: "";
    display: inline-block;
    height: 50px;
    margin-top: -50px;
    vertical-align: top;
}
```

### 親要素にoverflow: hidden;が入っている
※Chromeで効かなくなります。Safari、Firefoxは大丈夫。
<p class="codepen" data-height="265" data-theme-id="0" data-default-tab="css,result" data-user="kai-ono" data-slug-hash="VwZVMQZ" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="ヘッダーをposition: fixed;で固定した時のアンカーリンクずれ解消法（親要素にoverflow: hidden;があって効かないパターン）">
  <span>See the Pen <a href="https://codepen.io/kai-ono/pen/VwZVMQZ/">
  ヘッダーをposition: fixed;で固定した時のアンカーリンクずれ解消法（親要素にoverflow: hidden;があって効かないパターン）</a> by Kai (<a href="https://codepen.io/kai-ono">@kai-ono</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

## 参考サイト
* [ヘッダ固定時のページ内リンクのズレをCSSだけで解消する3つのテクニック](https://www.tomotanuki.com/entry/web-in-page-link-fixed)
* [position: fixed でヘッダ固定するとアンカーがズレる。直す。](https://freefielder.jp/blog/2017/04/position-fixed-anchor-scroll.html)
* [fixed)で、アンカーリンクがずれる場合の解決法
ヘッダー固定(position:fixed)で、アンカーリンクがずれる場合の解決法](https://www.design-soup.com/css-anker)
一般人にpythonプログラムを配布しよう

# はじめに
猫も杓子もディープラーニング・AIとうるさいご時世ですが、残念ながら誰でもAIを使いこなせるような時代にはなっていません。
scikit-learnやkerasなど優れたpythonライブラリが整備されていますが、プログラミングの素養がなければ扱えません。

データ解析をデータサイエンティストに任せるのではなく、データに一番近い人が担当するべき。
というのが私の持論であり、データ解析用のpythonプログラムの社内への展開を検討中です。

# プログラムの配布方法
pythonプログラムを配布する場合、以下の2つが比較的容易です。
①pyinstallerやpy2exe等で実行ファイル化する
②pythonプログラム(sample.py)を配布して各自で実行してもらう

しかしながら
①：exeファイル化の失敗、実行速度の低下、容量増加
②：非プログラマに配布するのは敷居が高いこと

がデメリットとして挙げられます

そこで、Anacondaが導入されていることを前提としてbatファイルでのプログラム配布・起動方法をまとめました。


# batファイルでのプログラム起動
実行したいpythonプログラム名　　　 ：sample.py
sample.pyのライブラリ設定ファイル　：requirements.txt

sample.pyとrequirements.txtとstart.batが同一フォルダにあるとします。

Anaconda上に必要な仮想環境とライブラリが揃っていれば、以下の２行で済みます。


```quick_start.bat
call activate sample_env
call python sample.py
```

Anacondaがインストールされているが、仮想環境も必要ライブラリもない場合
つまり、初回起動時には色々と準備が必要です。

```start.bat
REM Anacondaの存在確認
SET filename_anaconda="%USERPROFILE%\Anaconda3"
IF EXIST %filename_anaconda% (GOTO ANACONDA_EXIST) ELSE ANACONDA_NOT_EXIST

:ANACONDA_NOT_EXIST
echo Anacondaをインストールしてください
start https://www.anaconda.com/distribution/
exit /B

:ANACONDA_EXIST
REM Anacondaがインストールされています

REM start.batのフォルダへ移動
cd /d %~dp0

call %USERPROFILE%\Anaconda3\Scripts\activate.bat

REM condaが実行できるか確認
call conda -V

SET VIRTUAL_ENV_NAME="sample_env"
REM 仮想環境をactivateします
call activate %VIRTUAL_ENV_NAME%

if errorlevel 1 (
REM 仮想環境のactivateに失敗しました
REM 仮想環境を作成開始します
echo Y | conda create -n %VIRTUAL_ENV_NAME% python=3.6
)

call activate %VIRTUAL_ENV_NAME%
call pip install -r requirements.txt
call python sample.py
```

Anacondaの導入確認や仮想環境の作製やpip installが増えています。


# 注意点
1:簡略化のため、一部のエラー処理を省いています。

2:pipでインストールできないソフト（例：graphviz）も自動ダウンロードさせることは可能ですが
利用規約的に問題ないか確信が持てないので、今回は記載いたしません。

同様にAnacondaの自動ダウンロードやインストールも避けた方が良いと考えています。

3:既に必要ライブラリがインストールされていてもpip installしていますので、少し無駄があります。
Golangの大文字と小文字の不思議

#はじめに
前回こんな記事を書きました。
https://qiita.com/ko-watanabe/items/875085780d2ad72fe6af

初学者がGoで躓きがちな大文字と小文字表記に関しての話です。

簡単におさらいすると外部パッケージで関数を呼び出す際には大文字で表記しましょうね！
ってお話でした！

でも、ちょっと待ってください・・・
なんで、大文字にすると外部パッケージで呼び出せるように成るんでしょう？？？
仕組みが気になる。。。

![https___qiita-image-store.s3.ap-northeast-1.amazonaws.com_0_77401_fa94ce08-da06-0dad-60be-68f5f4f9d359.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233118/3b9f245a-d726-e725-d5cd-ba6c1cbe63b9.gif)

gopherのgifが可愛いので引用させていただきます！
参考：https://qiita.com/nkitgamesake/items/7e45309a180e1a905337


#コンパイラに鍵がある？

こんな記事を発見しました！
>Go言語の情報の可視性についてのルールは単純です。名前(トップレベルの型名、関数名、メソッド名、定数名、変数名、構造体のフィールドおよびメソッド名)の先頭一文字が大文字になっていれば、パッケージの利用者側から参照可能となります。すなわち大文字にしなければ、それが定義されているパッケージ内からしか参照できません。このルールはコンパイラによって実施されるため、絶対的なルールとなっています。この外部パッケージから可視状態であることをGo言語の用語で「エクスポートされた(exported)」と言います。

http://golang.jp/go_tutorial#index08

コンパイラによって実施されるため、大文字と小文字で区別することはGo様のいうことは絶対！
・・・みたいな感じらしいですね！


#コンパイラとは

今回扱っているプログラミング言語は『Go』です。
このGo言語で書かれたプログラムを実際にコンピュータに理解させるには機械語に変換が必要です！
そこでプログラムを変換（compile）する、もの（er)を活用します。

これが compile + er = compiler！（コンパイラ）

今回、大文字と小文字の判定はコンパイラで実際にチェックされて、外部パッケージで使って良いのか、悪いのかを判定しているわけですね！

#まとめ
大文字小文字の判定はコンパイラで行われていて、それによって他のファイルで使える名前（public）か使えない名前（private）かを指定しているんですね！
覚えておきましょう！！！
[Hyperledger Fabric]ローカルでチェーンコードがupgradeされない

###Upgradeコマンドが完了しているのになぜかChaincodeがアップグレードされてない・・・

FabcarネットワークのHyperledger Fabricを使ってローカル環境で開発してたら少しハマりました。

いつもどおりpeerのupgradeコマンドでアップグレードして、完了しました。

```

docker exec -e "CORE_PEER_LOCALMSPID=Org1MSP" \ 
-e "CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp" \
cli peer chaincode upgrade -o orderer.example.com:7050 -C mychannel -n test -l "node" -v 1.1 -c '{"Args":[""]}' 


Get instantiated chaincodes on channel mychannel:
Name: test, Version: 1.1, Path: /usr/local/src, Escc: escc, Vscc: vscc

```


でもチェーンコードを呼び出してみても、変化していない・・・
というかもっと昔のバージョンになっている気がする・・・

ネットワークを再度立ち上げてみても変わらず。
どこかでキャッシュでもされているのかと思い、探ってみると、



Dockerイメージが大量に残ってる！





今までにデプロイしたチェーンコードのDockerイメージがすべて残ってました。
なるほど、チェーンコードをデプロイすると

・Dockerイメージを作成
　　　↓
・イメージを元にコンテナを作成
　　　↓
・新たにできたコンテナにピアのコンテナが向いて新しいバージョンのチェーンコードが呼べるようになる

って感じなんですね。たぶん。


それぞれのDockerイメージの名前は
dev-{Peerの名前}-{チェーンコードの名前}-{バージョン番号}-{UUID}
みたいな感じになっていたのですが、
デプロイ時にPeerの名前、チェーンコード名、バージョン番号が同じイメージがあると、
新たにイメージを作るのではなく、既存のイメージを使用してコンテナを建てるという挙動なんだとおもいます。

だから昔のバージョンのチェーンコードになってたんですね。


とりあえずいらないイメージを全部削除
dev-peer0.~
という名前のイメージだったので

```
docker rmi $(docker images | grep dev-peer)

```

これでまたチェーンコードをデプロイしてみるとちゃんとアップグレードされていました！

ネットワーク自体を落としてもイメージは残るのでこんなことになっていたわけですね。
ちゃんとネットワークを落とすときに自動で消すようにします。

でもチェーンコード名とバージョン番号でコンテナのイメージを決めてるんだったら最後のUUIDいらないのでは・・・
COCO Formatを使う (pycocotools)。RLEの圧縮/非圧縮を添えて

# 0. 概要
COCO Formatを使うためにはポリゴンをピクセルに変換したり、面積に変換したり、時にはRLEしたり・・・色々と手間がかかる。
このためCOCO TOOLSというものが用意されているので、これを用いて効率的に開発を進めたい。

# 1. Installation

以下でCOCOをインストール

``` bash
pip install git+https://github.com/waleedka/coco.git#subdirectory=PythonAPI
```

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

``` bash
$ python
$ from pycocotools.coco import COCO
```

# 2. Run-length encoding (RLE)
そもそもAnnotationにある`counts`って何なの？っていう話であるが、
これは`bbox`で囲まれた領域の`X x Y`ピクセルの内、どこが塗りつぶされているかを`bit`で表現しているものである。

これを復元するためには以下のようなコードを書く

``` python
import json
import numpy as np
from pycocotools import mask
from skimage import measure

ground_truth_binary_mask = np.array([[  0,   0,   0,   0,   0,   0,   0,   0,   0,   0],
                                     [  0,   0,   0,   0,   0,   0,   0,   0,   0,   0],
                                     [  0,   0,   0,   0,   0,   1,   1,   1,   0,   0],
                                     [  0,   0,   0,   0,   0,   1,   1,   1,   0,   0],
                                     [  0,   0,   0,   0,   0,   1,   1,   1,   0,   0],
                                     [  0,   0,   0,   0,   0,   1,   1,   1,   0,   0],
                                     [  1,   0,   0,   0,   0,   0,   0,   0,   0,   0],
                                     [  0,   0,   0,   0,   0,   0,   0,   0,   0,   0],
                                     [  0,   0,   0,   0,   0,   0,   0,   0,   0,   0]], dtype=np.uint8)

fortran_ground_truth_binary_mask = np.asfortranarray(ground_truth_binary_mask)
encoded_ground_truth = mask.encode(fortran_ground_truth_binary_mask)
print(encoded_ground_truth )
print(mask.decode(encoded_ground_truth))
```

出力は以下となる。

``` bash
{'size': [9, 10], 'counts': b'61X13mN000`0'}
[[0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 1 1 1 0 0]
 [0 0 0 0 0 1 1 1 0 0]
 [0 0 0 0 0 1 1 1 0 0]
 [0 0 0 0 0 1 1 1 0 0]
 [1 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0]]
```

# Image

``` python
import cv2
rle={'size': [9, 10], 'counts': b'61X13mN000`0'}
dec_rle= mask.decode(rle) * 255
cv2.imwrite("segmentation.png", dec_rle )
```
PowershellでNSレコードを追加、削除

## 削除

```powershell
Remove-DnsServerResourceRecord -ZoneName 3.2.1.in-addr.arpa -RRType Ns -Name "@" -RecordData ad03.test.local. -Force -PassThru
```

## 追加

```powershell
Add-DnsServerResourceRecord -Name "@" -NS -ZoneName 3.2.1.in-addr.arpa -NameServer ad03.test.local. -PassThru
```
別のリポジトリをサブディレクトリに取り込む

# やりたいこと

- 別々のリポジトリを、1つのリポジトリにまとめたい
- 取りこむリポジトリは、ベースとなるリポジトリのサブフォルダに展開したい
- コミットログ付きで引き込みたい

※イメージ

repos_base
┣repos_base_XXX
┣repos_base_YYY
┗repos2
　┣repos2_XXX
　┗repos2_YYY

# 前提条件
- カレントディレクトリがベースとなるリポジトリのディレクトリになっている

# コマンド

```powershell
REM 別リポジトリを、追加したいリポジトリのリモートとして登録
git remote add [追加したいリポジトリの名称] [追加したいリポジトリのURL]

REM 別リポジトリでの情報を取得
git fetch [追加したいリポジトリの名称]

REM 別リポジトリをサブディレクトリとして取り込み、作業ディレクトリにファイルを引き込む
REM リポジトリを追加したいフォルダは、XXX/repos2 のように表記することも可能
git read-tree --prefix=[リポジトリを追加したいフォルダ階層] -u [追加したいリポジトリの名称]/[追加したいリポジトリのブランチ]

REM ファイル引き込みで発生した変更をコミット
git commit -a -m "[コミットコメント]"

REM 別リポジトリのコミット履歴などを、追加したいリポジトリにマージする
git subtree merge --prefix=[リポジトリを追加したいフォルダ階層] [追加したいリポジトリの名称]/[追加したいリポジトリのブランチ]

REM 必要に応じて別リポジトリのリモート登録を削除
REM git remote rm [追加したいリポジトリの名称]
```

# 参考情報

[Git-のさまざまなツール-サブツリーマージ](https://git-scm.com/book/ja/v1/Git-%E3%81%AE%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E3%83%84%E3%83%BC%E3%83%AB-%E3%82%B5%E3%83%96%E3%83%84%E3%83%AA%E3%83%BC%E3%83%9E%E3%83%BC%E3%82%B8)
[Rails]flashメッセージの使用方法について

#はじめに
今回動画の投稿、編集、削除をした際、flashメッセージを使用してこのように表示したかった為、その方法について。

![afd1686477df0fbf6098e00cc05da9ba.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435517/da042291-578a-7b9e-fab9-b8e6f0916326.gif)

##使用方法について
先ずはビューファイルにflashメッセージを表示させる記述を追加します。今回はHamlを使用しています。必要なら`= render partial: "パス名"`を使用して部分テンプレート化もしましょう。

```ruby:_flash.html.haml
.notification
  - flash.each do |key, value|
    = content_tag :div, value, class: key
```

```ruby:application.html.haml
%body
 .header.container
  = render partial: "shared/flash"
```

次に表示させる文字を`notice:`を使用してコントローラーに記述します。今回は動画投稿完了時に表示させる文字を例にします。

```ruby:videos_controller.rb
def create
    @video = Video.create(name: video_params[:name], image: video_params[:image], text: video_params[:text], user_id: current_user.id)
    if @video.save
      redirect_to root_path, notice: '動画の投稿に成功しました！'
    else
      flash.now[:notice] = '動画の投稿に失敗しました.....'
      render :new
    end
  end
```

この記述をする事で動画投稿成功時は`動画の投稿に成功しました！`と動画投稿失敗時は`動画の投稿に失敗しました.....`と表示させる事が出来ます。
`notice:(flash)`と`flash.now`の違いはリダイレクトさせるか、renderを使用するかです。

####投稿成功時
![b0161f297c083cec8fe41af688ea987f.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435517/f4237103-db10-6ae6-ae33-e4da1e355c74.gif)
####投稿失敗時
![0f1e434dcde87cfd708021537d88f87e.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435517/88fc80b2-44da-7495-2f98-645ad3b45ebe.gif)

あとは時間差で表示が消えるようにjQueryを使用して、JSファイルに記述します。

```ruby:flash.js
$(function(){
  setTimeout("$('.notice, .alert').fadeOut('slow')", 800);
  });
```
`setTimeout`を使用し、一定時間後に特定の処理を出来るようにしてます。
fadeOutはアニメーションの指定に使用し、`slow`などのアクション、`800(ミリ単位)`などの時間を指定する事で好きに表現出来ます。
あとはcssにレイアウトを記述すればOKです。

####例

```ruby:style.scss
// フラッシュメッセージのデザイン
.notification {
  background-color: black;
  color: white;
  font-size: 3rem;
  font-family: "SoukouMincho";
}
```

##まとめ
このようにフラッシュメッセージで表現させれば無駄なページを用意する必要がなくなるので便利だと思います。
以下の記事も参考にして下さい。
https://qiita.com/dice9494/items/2a0e92aba58a516e42e9
https://pg-happy.jp/rails-flash-message.html
まっさらなMacにReactの環境構築〜HelloWorldまで

######~~jQueryオワコンと言われて早n年という感じですが~~
モダンなJavaScriptフレームワークをググってみると・・・
- [React](https://ja.reactjs.org/)
- [Vue](https://jp.vuejs.org/index.html)
- [Angular](https://angular.jp)

このあたりが主流だそう。
詳細な比較については下記を参考にさせていただきました。
https://qiita.com/gumiTECH/items/13eb7da8224bf93c67b5

Reactを業務で触る可能性が出てきたので、自分自身でも環境構築してみました。
何番煎じかわかりませんが、備忘録としてまとめておきます。

##環境構築
マシンに何も入っていないことを想定してゼロからスタートします。

##1.Nodeのインストール(Nodebrewを使用)
Reactでの開発ではNodejsが必須です。
Nodeをインストール済みの場合skipします。

```sh
$ brew install nodebrew
```

####パスを通すため~/.bash_profileに下記を記述
```sh
`export PATH=$HOME/.nodebrew/current/bin:$PATH`
`source ~/.bash_profile`
```

####バージョン指定してNodeをインストール
```sh
nodebrew install v8.9.4
```

####エラー😢
```sh
#省略
fetch: http://nodejs.org/hogehoge
Warning: Failed to create the file 
#省略
```

ローカルにそんなディレクトリないよ！って言われて保存できないので、

```sh
$ touch mkdir -p ~/.nodebrew/src
```
でディレクトリを作ったのち`$ brew install nodebrew`を再実行。

```sh
$ nodebrew use v8.9.4
```

####またエラー😭
```sh
#省略
Use of uninitialized value $b1 in numeric comparison (<=>)
#省略
```

https://github.com/hokaccha/nodebrew/issues/36
↑いわく`/Users/username/.nodebrew/node`配下にある.DS_Storeを消せとのこと。

##2.Reactの環境構築
####[create-react-app](https://github.com/facebook/create-react-app)をインストール
詳細は下記記事を参考にさせていただきました。
https://qiita.com/chibicode/items/8533dd72f1ebaeb4b614

```sh
npm install -g create-react-app
```

####任意のディレクトリでcreate-react-appコマンドを実行

```sh
create-react-app my-app
```

####起動してみる
```sh
$npm start
```

`localhost:3000`をブラウザで開き下記画面が表示されれば成功です。
![スクリーンショット 2019-09-13 13.52.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262530/f3f127ed-283e-9e9a-9676-f4a033744004.png)


####実践的な内容については今後学習しながらアウトプットしていく予定です・・・
かんたん! EC2 Fleet

<!-- かんたん! EC2 Fleet -->

![USS_Missouri_transfers.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486518/a61f4d34-b071-a484-3866-dbfd7ec53bbe.jpeg)

<!-- https://ja.wikipedia.org/wiki/ファイル:USS_Missouri_transfers.JPG -->

今日は [EC2 Fleet (※動画)](https://www.youtube.com/watch?v=QX3PDkOqXLE) を試しましょう
その名の通り複数の EC2 インスタンスを統御する機能です（艦これみたいな感じ？よくわかりませんが）
こいつで10台だろうと100台だろうといっぺんに呼び出したり廃棄したりすることができます
いちインスタンスいちインスタンス、人の温かみのある指で心をこめてなんてめんどくさくて嫌ですからね。
自作ツールでも出来ないこともないでしょうがそんなつまらないfor文等は書きたくありませんのでこれでやります

さて [こちら](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-fleet.html#EC2-fleet-limitations) にあるとおり、
> EC2 Fleet is available only through the API or AWS CLI.

本機能は `API or AWS CLI` のみとのことですがですがそれで結構

冒頭のリンク先にある Deep Dive では [デモも行われて](https://www.youtube.com/watch?v=QX3PDkOqXLE&t=29m) おり、その際の [ソースが Github で公開](https://github.com/awslabs/ec2-spot-labs/tree/master/ec2-fleet) されています。これをそのまま拝借すると話が早そうです

これでいきましょうか
https://github.com/awslabs/ec2-spot-labs/tree/master/ec2-fleet#turbo-boost-ec2-fleet-with-spot
作って消す、という一連の流れを体験できるようになってます
ここでは手順を [スクリプト](https://gist.github.com/o2346/dfe0d49e267cff36a9fc13ee7dc928bb#file-ec2fleet-sh) にすることにします *※記事本文に直書きから gist へ移動:2020/12/26*

実験用のアカウントのクレデンシャルを取得し [こいつ](https://gist.github.com/o2346/dfe0d49e267cff36a9fc13ee7dc928bb#file-ec2fleet-sh) を実行してマネコンの方を観察してみると（適宜リロードしながら） *※反映に20分~の遅延が出るのを観測:2020/12/26*

ちゃんと立ち上がってきました
![cropped_Screenshot from 2019-09-13 14-59-07.png.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486518/655c8e65-ebab-6be7-9cfc-30661e68d2bb.jpeg)

このまま見守ります
![cropped_Screenshot from 2019-09-13 15-00-10.png.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486518/f9b0d502-236b-fb8a-a73d-957a6a66d724.jpeg)
![cropped_Screenshot from 2019-09-13 15-00-34.png.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486518/a0255a04-f4ad-0790-a425-36d9dba5c1bd.jpeg)

時間になったようですね、みんな揃って沈没してゆきます（笑）
![cropped_Screenshot from 2019-09-13 15-01-39.png.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486518/ee1b91b5-422e-0cf4-43bd-059e6635f947.jpeg)

はいおわり。
![cropped_Screenshot from 2019-09-13 15-01-47.png.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486518/8e1f9e63-5d37-cebe-41fb-6c36af4da5e6.jpeg)


※上記のスクリプトは基本的に 1~6 のステップを踏襲しておりますが、設定ファイルをカスタマイズ ( `$cli_input_json` ) しています。エラー回避などのため。
※途中に適宜待機処理などを挟んでおります。人がマネコン側で推移を見守る余裕のため
※立ち上げたインスタンス分の料金はかかりますので注意しましょう（消し忘れると悲惨）
※リージョンはデフォルトです

## 備考

今回これをやろうと思ったのは、ある Lambda Function の動作確認をしたかったのがきっかけです。Lambda Function の内容は本題から逸れますので詳細は割愛しますが ec2 に関係する処理を書いてありまして、本番環境に展開する予定となっていました。しかし100台超のインスタンス群が既に稼働している本番環境にいきなり投入するのに少し不安があったため、sandbox として用意した別アカウント環境で、台数が多いという条件でも問題が無いかを確認しておきたいなぁと思ったのです。そうすると sandbox のほうにも同じ台数の実験用インスタンス群を実際に立てようと思うわけですが、そのオペレーションを容易にするための手段として EC2 Fleet を採用した、という次第です。
おまけに上述の `#./exam_among_fleet.sh` の部分で任意にやりたいことを書けば、動作確認タスクそのものの明文化且つ自動化にもなろうかと思います。

用が済んだインスタンス群は当然ながら後始末もしないといけませんが本機能であればそれもご覧の通り簡潔な命令で済みますから消し忘れ、オペミス等の懸念も少なく助かります
docker の mysql で query log を見る

```
docker stop mysql5.6con
docker rm mysql5.6con
docker pull mysql:5.6
docker run --name mysql5.6con -e MYSQL_USER=USER -e MYSQL_ROOT_PASSWORD=PASS -d -p 3306:3306 mysql:5.6 --general-log=true --general-log-file=/var/log/mysql/general.log
docker exec -it mysql5.6con bash
tail -f /var/log/mysql/general.log
```
plunkerでvue その25

#概要

plunkerでvueやってみた。
rss2json使ってみた。

#参考にしたページ

https://qiita.com/920oj/items/9203c8ade378ec3b8eb7

#成果物

https://embed.plnkr.co/FZTKatIomlgiwlXQKkLP/

以上。
Docker で ubuntu vim python aws gcp あたりの開発環境を作る

## google-cloud-sdk.list を作成

```
deb http://packages.cloud.google.com/apt cloud-sdk-bionic main
```

## Dockerfile

```
FROM ubuntu:18.04

RUN apt-get -y update
RUN apt-get -y install software-properties-common
RUN yes | add-apt-repository ppa:jonathonf/vim
RUN apt-get -y update
RUN apt-get -y install zsh
RUN chsh -s /usr/bin/zsh 
RUN /usr/bin/zsh
RUN apt-get -y install git docker python vim neovim
RUN apt-get install -y python3.7
RUN apt-get install -y python-pip
RUN pip install --upgrade pip
RUN yes|pip install awscli
RUN apt-get install -y curl

RUN export CLOUD_SDK_REPO="cloud-sdk-$(lsb_release -c -s)"
RUN echo $CLOUD_SDK_REPO
COPY google-cloud-sdk.list /etc/apt/sources.list.d/google-cloud-sdk.list
RUN curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
RUN apt-get -y update
RUN apt-get install -y google-cloud-sdk
RUN yes no|gcloud init

WORKDIR /root
```

## run.sh

```
docker build -t hoge_dev .
docker stop hoge_dev_con
docker rm hoge_dev_con
docker run -v /Users/hogehoge/.config/gcloud:/root/.config/gcloud -v /Users/hogehoge/.aws:/root/.aws -it --name hoge_dev_con hoge_dev:latest /usr/bin/zsh
```

## メモ

```
eval `ssh-agent`
```
lambdaへpythonの外部モジュールをzipファイルとしてアップロードする際の手順

1 . 必要なライブラリを保存するパッケージディレクトリを作成。

```
~/$ mkdir package
```

2 . --targetオプションでライブラリをパッケージディレクトリにインストール。

```
~/$ cd package
~/package$ pip install pandas　--target .
```
pandasの部分は自分がインストールしたいライブラリ名に変更する。

3 . ZIPアーカイブの作成。

```
~/package$ zip -r9 ../function.zip .
```
4 . 関数コードをアーカイブに追加。

```
~/package$ cd ../
~/$ zip -g function.zip lambda_function.py

```
5 . ZIPアーカイブをlambdaにアップロード。


## 参考
https://hacknote.jp/archives/48083/
Photon(PUN2)でサーバーに接続してルームを作成する際のメモ

# 概要

PUN2を使ってサーバーに接続してルームを作成する際に、どのようなコードを書いていけばいいのか迷ってしまった時の為の備忘録的なメモです。

# 環境

- PUN2
- Unity 2018.3以降

# 実装

## MasterClientに同期

```csharp
PhotonNetwork.AutomaticallySyncScene = true;
```
このように設定すると、MasterClient以外のClientがシーンの切り替えを、MasterClientのシーンの切り替えに同期して行うことができます。

`Awake()`メソッド内などに書くと良いと思います

## サーバーに接続する

#### 1.PhotonServerSettingsで設定を行う

`Assets/Photon/PhotonUnityNetworking/Resources/`にある`PhotonServerSettings`で設定を行います。

とりあえずApp VersionとFixed Regionを設定しておけば大丈夫だと思います。

App Version : 1.0
Fixed Region : jp

のように設定します。

#### 2.ゲームのバージョンを設定する

```csharp
PhotonNetwork.GameVersion = "1.0";
```
バージョンの異なるClient同士はマッチングすることができないので注意しましょう。

#### 3.次にPhotonのサーバーに接続する

サーバーに接続したい場所で

```csharp
PhotonNetwork.ConnectUsingSettings();
```
を実行すればサーバーに接続することができます。

## ルームが既に作られている場合はルームに入る

```cs
public override void OnConnectedToMaster()
{
    PhotonNetwork.JoinRandomRoom();			
}
```

サーバーに接続した際に呼ばれるコールバックである`OnConnectedToMaster()`メソッド内に処理を記述します。

ここではランダムなルームに入る場合について考えます。

ランダムなルームに入る処理は`PhotonNetwork.JoinRandomRoom()`です。
なのでこれを`OnConnectedToMaster()`内に記述します。



## ルームが無い場合はルームを作る

```cs
public override void OnJoinRandomFailed(short returnCode, string message)
{
	PhotonNetwork.CreateRoom(null, new RoomOptions { MaxPlayers = 4});
}
```

もしルームが1つも作られていない状態で上記のようにルームに入ろうとすると失敗します。

この時に呼ばれるコールバックが`OnJoinRandomFailed()`です。

なので、この`OnJoinRandomFailed()`メソッド内にルームを作る処理を書きます。

ルームを作る処理は`PhotonNetwork.CreateRoom()`です。

`PhotonNetwork.CreateRoom()`の第一引数にはルーム名を記述できますが、ルーム名を特に設定したくない場合は`null`と書きます。

`PhotonNetwork.CreateRoom()`の第二引数にはRoomOptionsクラスのインスタンスを代入します。

RoomOptionsクラスは様々なプロパティを持ち、これらを色々と調整することによって、作成する部屋の設定を決めることができます。

ここでは部屋の最大の人数が4人になるように`MaxPlayers = 4`設定しています。

他の設定をしたい場合は次のページをご覧ください。
[Photon Unity Networking 2: RoomOptions Class Reference](https://doc-api.photonengine.com/en/pun/v2/class_photon_1_1_realtime_1_1_room_options.html)

# 参考文献

- [PUN2で始めるオンラインゲーム開発入門【その１】 - Unity Connect](https://connect.unity.com/p/pun2deshi-meruonraingemukai-fa-ru-men-sono1)
- [Realtimeイントロ \| Photon Engine](https://doc.photonengine.com/ja-jp/realtime/current/getting-started/realtime-intro)
Hyperで矩形選択

Windows10 でだいぶ一般的になっているbash + [hyper](https://github.com/zeit/hyper)。
シンプルでスタイリッシュなビジュアル、Ctrl+ +/- でフォントサイズを簡単に変更できるので、私も気に入って一時期使っていたのですが、矩形選択が出来ないと思って、またgnome-terminalに戻っていました。
しかし、どうやら Alt + マウス操作でできることがわかり、またhyper使ってみようかなと思っています。Ctrl + マウスじゃなかったんですね。
ただ、たまにCtrl + p でhistoryが辿れなくなるのが難点。これはhyperのせいじゃないようですが。。
GNU coreutils > date > 計算を間違う実行 > 「+」をつけてしまう

```txt:動作環境
CentOS 6.9
```

### 間違った実行

```
$ date -d "2019/09/19 09:36 + 6 hours"
Thu Sep 19 13:36:00 JST 2019
```

```
$ date -d "2019/09/19 09:36 + 4 hours"
Thu Sep 19 15:36:00 JST 2019
```


### 正しい実行

```
$ date -d "2019/09/19 09:36 6 hours"
Thu Sep 19 15:36:00 JST 2019
```

「+」を付けると失敗する。

数値計算の終了時刻を計算して、失敗した。


### 関連

- [GNU coreutils > date > x週前の日付をyyyymmdd形式で取得する > date -d "20161020 - 4 weeks" "+%Y%m%d"](https://qiita.com/7of9/items/389b5b5b25e3ec3c9b5e)
- [GNU coreutils > date > 指定日の前日をyyyymmddで表示するワンライナー > $ date --date="20161020 1 days ago" "+%Y%m%d"](https://qiita.com/7of9/items/41208cf2db7b89f05473)
Homesteadが生成したMySQLでログを出す

## 方法

```
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
```

↓のコメントを外す
※出力先を共有フォルダに変えたいけど、何か上手くいかない。。

```conf
general_log_file        = /var/log/mysql/mysql.log
general_log             = 1
```



MySQLを再起動する。

```
sudo service mysql restart
```
static修飾子

##static修飾子とは
static修飾子は主にクラスにインスタンス化せずに、直接メソッドや変数にアクセスするために使用します。

これらのstaticをつけたメソッドを静的メソッド、変数を静的変数と呼びます。

static修飾子にはたくさんの使い方があり、以下のような使い方もあります。
・staticを内部クラスで使う方法
・static finalで定数を使う方法
・static importで外部クラスのstaticメンバの参照を簡略化する使い方

##static修飾子とは

静的メンバーを定義する
クラスのメンバーにstatic修飾子を付与すると、クラスをインスタンス化しなくてもアクセスできるようになります。
具体的には（クラス名.メンバー名）の形式でアクセスできます。
このようなメンバーの事を静的メンバー
またはそれぞれのメンバーに応じて静的フィールド　静的メソッドと呼びます。
例えば以下は静的メンバーとしてhogeフィールド　foobarメソッドを定義し、呼び出しています。

```java
package com.example.mynavi.modifier;
 
public class ModStatic {
    static String hoge = "静的フィールド";
    static void foobar() {
      System.out.println("静的メソッド");
    }
 
  public static void main(String[] args) {
    System.out.println(ModStatic.hoge); // 結果：静的フィールド
    ModStatic.foobar(); // 結果：静的メソッド
  }
}
```

hoge,hooberからstatic修飾子をとり除いた場合、文字の部分は、以下のように書かなければなりません。

```java

ModStatic ms = new ModStatic(); // インスタンス化が必須
  System.out.println(ms.hoge);
  ms.foobar();
```
AngelScript で C++ から std::string を AS に渡す

AngelScript 便利ですね!

スクリプト言語AngelScriptの紹介
https://qiita.com/unknown_ds/items/8d64aaafd8e5ccd9ab14

Angel Script をアプリケーションに組み込もう
https://qiita.com/Ushio/items/cc5f9aa1abeb56f0d6f1


## 文字列を AS スクリプトに渡したい

文字列(scriptstring)を AS スクリプトに引数で渡したいと思いました(C/C++ での argv のように).

ドキュメントには string を渡す方法は記述がありませんが, `SetArgObject` で `std::string` のアドレスを渡すといけました.

以下がコード例です.

scriptstring の add_on を忘れずに登録しておいてください.

```
// AngelScript
void myfunc(const string arg)
{
  Print(arg); // `Print` は別途定義した関数(Tutorial あたりを参照ください) 
}
```

```c++
...
auto func = module->GetFunctionByDecl("void myfunc(const string arg)");
std::string muda = "muda";

auto ctx = engine->CreateContext();
ctx->Prepare(func);

ctx->SetArgObject(&muda);

ctx->Execute();
```

また, リファレンス(?)渡し`(const string &in)` はダメでした.

## TODO

* [ ] クラスを作って渡したほうが安全かも?
* [ ] C++ から直接呼ぶ関数の引数としては string を渡さないほうがいいかも?(getstring() みたいな関数を別途定義するなど)
jqueryが動かない時に確認する事

# jqueryの本体の読み込みを忘れていないか

# 本体の読み込み前にコードが書かれていないか

```html
<script src="js/index.js"></script>
<script src="js/jquery-3.4.1.min.js"></script>
```

と言ったように、本体を読み込む前にscriptを実行していないか

# ロードが必要な要素に対して`$(document).ready`で書いていないか

・image要素を読み込む前にimageのwidthやheightを`$(document).ready`で取得しようとしていないか

# HTML本文に外部jqueryを呼び出すコードが抜けていないか

```js
$('.flexslider').flexslider({
});
```

などの記述が漏れているのではないか。
スライダーなどライブラリーを使用していたページをコピーして、
別のページを作成した際、ライブラリーへのリンクはしているが、
index.htmlなどへ直接記述しなければならないものが抜けている場合がある。
Array is object

# Array class is defined in JVM

```java
public class ArrayClassClassloader {

	public static void main(String[] args) {
		System.out.println(boolean[].class.getClassLoader());
	}

}
```

Output

```
null
```

This means that array class is load by bootstrap class loader

# Name of array class

```java
public class ArrayClassName {

	public static void main(String[] args) {
		System.out.println(boolean[].class.getName());
		System.out.println(short[].class.getName());
		System.out.println(int[].class.getName());
		System.out.println(long[].class.getName());
		System.out.println(float[].class.getName());
		System.out.println(double[].class.getName());
		System.out.println(char[].class.getName());
		System.out.println(byte[].class.getName());
		System.out.println();
		System.out.println(java.lang.Integer[].class.getName());
		System.out.println();
		System.out.println(int[][].class.getName());
		System.out.println(int[][][].class.getName());
		System.out.println(int[][][][].class.getName());
	}

}
```

Output

```
[Z
[S
[I
[J
[F
[D
[C
[B

[Ljava.lang.Integer;

[[I
[[[I
[[[[I
```