OmniAICreator/Qiita-1.07M huggingface dataset:
【Unity】Fragment ShaderにEmissionを適用する

# はじめに
Standard Shaderを使っている場合はEmissionに値を入れれば光物が表現できる
しかし、Surface Shaderでない自作のShaderの場合はEmissionを作るのにひと工夫が必要

# 環境
- Unity 2018.1.0f2
- Post Processing Stack v1

# 事前準備
Assets->Create->Post Processing ProfileでProfileを作成
Bloomにチェックを入れる
今回は分かりやすくThresholdを0.9にしておく
![image.png](https://qiita-image-store.s3.amazonaws.com/0/105021/53b896de-fc79-77e4-cfc6-dad4f3b7580d.png)

メインカメラに「Post Processing Behaviour」をAddcomponentし、先ほど作ったProfileを設定する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/105021/454dd6fc-1ed4-1217-5a8f-91a2ee7941e3.png)

そうすると物体が光るようになる
![emit1.gif](https://qiita-image-store.s3.amazonaws.com/0/105021/162dc336-5cab-5415-a16a-4341d96fc38c.gif)

# 元となるShaderの作成
```glsl
Shader "Custom/BaseShader" 
{
    Properties 
	{
        _MainTex ("Base (RGB)", 2D) = "white" {}
		_MainColor("Color", Color) = (1,1,1,1)
    }
    SubShader 
	{
        Pass 
		{
            CGPROGRAM
            #pragma vertex vert_img
            #pragma fragment frag

            #include "UnityCG.cginc"
            
            uniform sampler2D _MainTex;
			float4 _MainColor;

            fixed4 frag(v2f_img i) : SV_Target 
			{
                return tex2D(_MainTex, i.uv) * _MainColor;
            }
            ENDCG
        }
    }
}
```

このシェーダーをマテリアルに適用して適当なテクスチャを張ると
![image.png](https://qiita-image-store.s3.amazonaws.com/0/105021/d6ee8f95-7ec4-ad28-2d68-8d3f781c5e27.png)
白い部分がうっすら光ります

# 任意の部分を光らせるシェーダー
``` glsl
Shader "Custom/EmissionShader" 
{
    Properties 
	{
        _MainTex ("Base (RGB)", 2D) = "white" {}
		_MainColor("Color", Color) = (1,1,1,1)
        _EmissionMap ("Emission Map", 2D) = "black" {}               //追加
        [HDR] _EmissionColor ("Emission Color", Color) = (0,0,0)    //追加
    }
    SubShader 
	{
        Pass 
		{
            CGPROGRAM
            #pragma vertex vert_img
            #pragma fragment frag

            #include "UnityCG.cginc"
            
            uniform sampler2D _MainTex;
			float4 _MainColor;

            uniform sampler2D _EmissionMap;    //追加
			float4 _EmissionColor;             //追加

            fixed4 frag(v2f_img i) : SV_Target 
			{
                fixed4 albedo = tex2D(_MainTex, i.uv) * _MainColor;

                //↓今回のキモ。通常のalbedoにEmission分の色を足している
                return albedo + tex2D(_EmissionMap, i.uv) * _EmissionColor;  
            }
            ENDCG
        }
    }
}
```

Baseにはベースとなるテクスチャ
Emission Mapには光らせたい部分を白にしたテクスチャをアサイン
![image.png](https://qiita-image-store.s3.amazonaws.com/0/105021/01a70273-2ccd-d90c-aa32-3bf83989a729.png)

あとはEmission Colorを光らせたい値に調整すればOK
Intensityの値を大きくすれば、より輝きます
![emit2.gif](https://qiita-image-store.s3.amazonaws.com/0/105021/a7888e84-c840-a37e-3363-27ceb38d1886.gif)

# 参考
- [How to add emission map to this shader](https://forum.unity.com/threads/how-to-add-emission-map-to-this-shader.380680/)
- [【Unity】目やパーツの一部を光らせる - テラシュールブログ](http://tsubakit1.hateblo.jp/entry/2015/09/10/233000)
- [SurfaceShaderを利用した発光シェーダ - WonderPlanet DEVELOPER BLOG](http://developer.wonderpla.net/entry/blog/engineer/unity_SurfaceShader/)
- [Unity公式Emission](https://docs.unity3d.com/ja/current/Manual/StandardShaderMaterialParameterEmission.html)
TensorFlowアルゴリズムの一般的な流れ①

一連の流れ[引用元(1)]
①デ―タセットをインポートまたは生成
②データを変換/正規化:fist_tone4:
③データセットをトレーニングセット、テストセット、検証セットに分割する
④アルゴリズムのパラメータを設定:taco:
⑤変数とプレースホルダーを初期化
⑥モデル構造を定義:flag_ag:
⑦損失関数を設定
⑧モデルの初期化とトレーニング
⑨モデルを評価:sunny:
⑩ハイパーパラメーターをチューニング
⑪デプロイと新しい成果指標の予測



何言ってるか全然わかんない！！！！カタカナ英語ほんとやめてほしい。:frowning2::frowning2::frowning2:
順に①から頑張ってかみ砕くぞー。



①データセット(なんかの目的で集められたデータの事)をインポート(そのデータをかしてくださーいと輸入するイメージ)または生成(自分でデータを作ったりする)。

②データを変換(TensorFlowで使えるようにデータの形状を変えることらしい、色んな形のデータがあるのでそれをTensorFlowの使える形にしようって感じかな。)/正規化(これもおんなじ様な意味かな、データを使いやすい様に形を変えることらしい)する。

③データセット(処理されるデータのまとまりのことらしい)をトレーニングセット(この部分で訓練させる)、テストセット(ここで実際に訓練セットをテストさせる)、検証セット(結果うまくいったのかをここで検証させる)に分割する。

わからないので教えてほしいです
(1):「Pythonベースの活用レシピ60+ TensorFlow 機械学習クックブック　2017年」p3-5
jenkinsとgithub　PRが送られたらビルドがキックされる仕組み

## blue oceanを使えば90%近く問題は解決

- ググるといろんな記事が出てきて、どれを信じていいのかよくわからず、半信半疑のままジョブを組み立てていた。
- でも、blue oceanが出てきて、かなり楽になったと感じている。
- 以下メモ。

1. blueoceanプラグインが初めから入っているjenkinsをインストールする
2. githubの設定画面から、Personal API Access Tokenを発行する
3. jenkinsの画面でblueoceanをクリック(画面デザインが切り替わる)
4. するとcreate a new pipelineというポップアップが出てくる。
5. あとはそれをクリックして指示に従うだけ。
6. あっという間にマルチブランチプロジェクトがjenkinsに作成される。面倒な手作業が、ほとんど自動化されていて、素晴らしい！


## 最後に、github側でwebhookの設定

これがなかなか情報が無くて困ったところ。
結論から言うと、repoのsettingからwebhookの追加を選択して、次のようなURLを入力する

```
http://jenkins-url/github-webhook/
```

そして`Let me select individual events.`からpull requestにチェックを入れておく。

ここまでできたら、repoのmasterに対してプルリクエストを送ってみよう。
きっとプルリクエストがトリガーとなってビルドジョブが動くはずです！
バイナリ解析ツール

ほぼ個人的なメモです
#バイナリ解析ツール
##　コマンド
###**file**
ファイルの種類や，どのアーキテクチャで動作し，どのOS向けなのかといった情報を見れるコマンドです．
###**readelf**
ELFファイルの情報を表示してくれるコマンドです．
###**strings**
ファイル中に含まれる表示可能文字を抽出して表示してくれるコマンドです．デフォルトでは4文字連続で表示可能な部分を抽出してくれます．
###**grep**
ファイルの中から特定のパターンを抽出したい時に指定する事ができるコマンドです．

###**unzip**,**tar**,**gunzip**,**xz**
それぞれ，圧縮されたファイルを解凍してくれるコマンドです．

#プログラム
##　トレーサ
###**strace**
システムコールの呼び出しをトレースします
###**ltrace**
共有ライブラリ関数の呼び出しをトレースします

##デバッガ
###**GDB**
GNUのCLIデバッガです．多くのLinuxOS上で用いられています．
###**x64dgb**
Windows向けのGUIデバッガです．32bit,64bit共に対応しています．

##メモリエディタ
###**うさみみハリケーン**
Windows向けのフリーソフトウェアです．
###**Cheat Engine**
MacでもWindowsでも動くオープンソースのメモリスキャナ/バイナリエディタ/デバッガのパーフェクトなやつ．

##逆アセンブラ
##**IDA**
GUIベースの高機能逆アセンブラソフトウェアです．多くのエンジニアが使っています．
###**objdump**
CLIベースの逆アセンブラです．

##逆コンパイラ
###**Hex-RaysDecompiler**
IDAを開発しているところが作った逆コンパイラです．
実行ファイルから擬似C言語を生成します．
###**Rerargetable Decompiler**
Webベースの逆コンパイラでブラウザからアップロードする事で，コードが生成されます，
　
##バイナリエディタ
###**Stirling**
Windows上で動くGUIベースのバイナリエディタです．
###**Bz**
同じくWindows上で動くGUIベースのバイナリエディタです．
###**ghex**
Linux上で動くGUIベースのバイナリエディタです．
###**Vim + xxd**
Vimを-bでバイナリモードでファイルを開き，":%!xxd-r"とうつことで開く事ができます．
Railsの学習　～画像アップロードにcarrierwaveを使う

ユーザー登録時の画像や投稿機能の画像のアップロードにcarrierwaveを導入する手順のメモ

##gemを追加
まずはいつものようにgemを追加してインストールする

```ruby:Gemfile
gem 'carrierwave'
```

##画像を保存するためのカラムを追加する
ここは適時、必要なテーブルに追加していく

    $ rails g migrate add_column_to _users :image string

strong parameterで:imageを許可する

```ruby:users_controller
def user_params
    params.requier(:user).permit(:name, :email, :password, :image)
end
```

##アップローダーの作成
    $ rails g uploader image

##各モデルでアップローダーのマウント
    
```ruby:user.rb
mount_uploader :image, ImageUploader
```

##フォームに下記を追加
```ruby:edit.html.erb
<%=f.label :image,"ユーザー画像" %>
<%= f.file_field :image %>
```
##表示させる

```ruby:view.html.erb
<%= image_tag @user.image %>
```
複数のStreamを繋げる操作@Java

ところでJavaをアップデートしたのでREPLでやります。
コンソールでjshellと打つだけで（java9以上？)

```
jshell>
```

だぜやっほう！

#二つのStreamをつなげる時はconcat

```
jshell> var streamA = Stream.of(1,2,3);
streamA ==> java.util.stream.ReferencePipeline$Head@1f36e637

jshell> var streamB = Stream.of(4,5);
streamB ==> java.util.stream.ReferencePipeline$Head@578486a3

jshell> Stream.concat(streamA, streamB).forEach(System.out::println);
1
2
3
4
5
```
見た感じ、concatは引数が二つのものしかありません？
https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#concat-java.util.stream.Stream-java.util.stream.Stream-

#三つ以上はflatMapの出番やで
そもそもstreamの性質上つなげる操作で困ることなかったんや。素直に行こうや。

```
jshell> var streamA = Stream.of(1,2,3);
streamA ==> java.util.stream.ReferencePipeline$Head@536aaa8d

jshell> var streamB = Stream.of(4,5);
streamB ==> java.util.stream.ReferencePipeline$Head@e320068

jshell> var streamC = Stream.of(6,7,8,9);
streamC ==> java.util.stream.ReferencePipeline$Head@1f57539

jshell> Stream.of(streamA, streamB, streamC).flatMap(Function.identity()).forEach(System.out::println);
1
2
3
4
5
6
7
8
9
```

#jshellを途中で改行するやり方が分からないお...

```
jshell> var streamA = Stream.of(1,2,3);
streamA ==> java.util.stream.ReferencePipeline$Head@27a8c74e

jshell> var streamB = Stream.of(4,5);
streamB ==> java.util.stream.ReferencePipeline$Head@2d8f65a4

jshell> var streamC = Stream.of(6,7,8,9);
streamC ==> java.util.stream.ReferencePipeline$Head@1b68ddbd

jshell> Stream.of(streamA, streamB, streamC).
   ...> flatMap(Function.identity()).
   ...> forEach(System.out::println);
1
2
3
4
5
6
7
8
9
```
このやり方が私の限界だった。何かわかったら追記する（かも）。ていうか最後にピリオド気持ち悪い。いや、自然言語ではこれが通常運転なんだけど。

#reduceの役立たず！もう嫌い！
わかると思うんだけど、reduceするとoptionalになって二度手間なんだYO

```
jshell> var streamA = Stream.of(1,2,3);
streamA ==> java.util.stream.ReferencePipeline$Head@2781e022

jshell> var streamB = Stream.of(4,5);
streamB ==> java.util.stream.ReferencePipeline$Head@57e1b0c

jshell> var streamC = Stream.of(6,7,8,9);
streamC ==> java.util.stream.ReferencePipeline$Head@4232c52b

jshell> Stream.of(streamA, streamB, streamC).
   ...> reduce(Stream::concat)
$38 ==> Optional[java.util.stream.ReferencePipeline$Head@ea1a8d5]
```


今日はここまで。少しずつ続けることが大事だと自分に言い聞かせる。

#追記: swordoneさんよりご指摘
"reduceがOptionalになるのが嫌なら、3引数のreduceを使えばいいじゃない。"

```
Stream.of(streamA, streamB, streamC).reduce(Stream.empty(), Stream::concat, Stream::concat);
```
おっしゃる通りございます。
いや、でもそれならもはや引数2のreduceでいいんじゃね？

```
Stream.of(streamA, streamB, streamC).reduce(Stream.empty(), Stream::concat)
```
reduceの話はベッケンバウアーで。
UiPath勉強四回目

#UiPathに触ってみる(4)

今回は前回行った検索の処理に対しての任意のワードを選べるようにしてみる。

Activitiesから「Input Dialog」Activityを、前回のSequenceボックスの上にドラッグ＆ドロップをする。

![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/246340/8b928fc0-b1a7-b644-5f29-580a64de37e7.png)

「Input Dialog」にはTitleとLabelを入力できるので任意で入力。


![3.PNG](https://qiita-image-store.s3.amazonaws.com/0/246340/bfd222d4-2f9c-e1bc-d334-d7ceb6c874a6.png)

入力を行い実行すると、の下記のようなポップアップがででてくる。



![11.PNG](https://qiita-image-store.s3.amazonaws.com/0/246340/22541daf-e12a-79eb-2d2c-cfc7c283b0cb.png)





ここで入力した文字を検索できるようにする。


「Input Dialog」を選択した状態で、ウインドウの下にある「Variables」をクリックする。


![4.PNG](https://qiita-image-store.s3.amazonaws.com/0/246340/9a19b789-9be8-e4ff-0a02-b3ca686add3d.png)




4つ入力で切る項目があるので下記のように入力。



![6.PNG](https://qiita-image-store.s3.amazonaws.com/0/246340/ca12b0d1-aff9-6dba-f57e-fc9f4c8fc3cd.png)


次に、ウインドウ右側の「Properties」にある「Result」欄に、先ほどの
「Variable」に記載した「Name」を入力。


![8.PNG](https://qiita-image-store.s3.amazonaws.com/0/246340/1dcffdf5-8505-b5c3-e95e-390e2a82030a.png)




最後に前回に作成した、検索した処理の「Type」を「Variable」に記載した「Name」に変更。


その後実行することで、任意の文字を検索できるようになる。
GitLab CIでRails + yarnのビルド & herokuへデプロイをしよう

# はじめに
最近GitLabで開発を行うプロダクトがあり、GitLab CIを用いてビルドとherokuへのデプロイ環境を作りました。
Rails + yarnのビルド環境を作る情報が少なくてちょっとだけ苦労したので、記事にまとめておこうと思います。

# 環境
ruby: 2.5.1
db: postgresql

# 書いた .gitlab-ci.yml
初めに書いた.gitlab-ci.ymlを載せて解説をしていきたいと思います。

```yml
image: "ruby:2.5.1"

services:
  - postgres:latest

stages:
  - build
  - deploy

build:
  stage: build
  variables:
    BUNDLE_CACHE: "vendor/bundle/"
    RAILS_ENV: "test"
    CI: "true"
  script:
    # Install node and some other deps
    - curl -sL https://deb.nodesource.com/setup_8.x | bash -
    - apt-get update -yq
    - apt-get install -yq apt-transport-https build-essential nodejs postgresql postgresql-contrib


    # Install yarn
    - wget -q -O - https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
    - echo "deb https://dl.yarnpkg.com/debian/ stable main" > /etc/apt/sources.list.d/yarn.list
    - apt-get update -yq
    - apt-get install -yq yarn

    # Install packages
    - bundle install --jobs=16 --path $BUNDLE_CACHE
    - yarn install

    - yarn run lint
    - bundle exec rubocop
    - cp config/database.yml.gitlabci config/database.yml
    - RAILS_ENV=$RAILS_ENV bundle exec rails db:create db:schema:load
    - bundle exec rspec
  cache:
    untracked: true
    key: "$CI_BUILD_NAME"
    paths:
      # variables.BUNDLE_CACHEと同じものを指定する
      - vendor/bundle/

staging:
  stage: deploy
  script:
  - gem install dpl
  - dpl --provider=heroku --app=hoge-staging --api-key=$HEROKU_STAGING_API_KEY
  only:
  - master

production:
  stage: deploy
  script:
  - gem install dpl
  - dpl --provider=heroku --app=hoge-production --api-key=$HEROKU_PRODUCTION_API_KEY
  only:
  - production

```

# 解説
## 構成
構成としては
- build
- deploy
の2構造のみです。
buildのscript内に書いてあるライブラリをダウンロードする手続きは、初めはbefore_scripts内に書いていたのですが、deploy時には必要がなく、deployのタイムロスになってしまっていたためbuildのscript内に入れるようにしました。

## buildの内容
buildの内容は、大まかに以下の流れになっています
1. nodeのインストール
2. postgresqlのクライアントのインストール
3. yarnのインストール
4. gemとnode_modulesのインストール
5. lintチェック
6. Railsのテスト

postgresqlはservicesで指定を行いimageを利用しています。
そのため、imageのpostgresqlに対応した設定ファイルを用意しなければいけないため、

```
cp config/database.yml.gitlabci config/database.yml
```
というコマンドを実行しています。
database.yml.gitlabciの内容は以下の通りになっています。

```yml
test:
  adapter: postgresql
  encoding: unicode
  pool: 5
  timeout: 5000
  host: postgres
  username: 'postgres'
  password: ""
  database: test_db
```

また、variablesで渡しているBUNDLE_CACHEというのは、buildに成功した時にbundle installで入れたライブラリをキャッシュさせるために指定しています。この値をcacheのpathsで指定してあげることでキャッシュができ、次回からライブラリのインストールを高速化できます。

## deployの内容
deployは至極シンプルで、dplというデプロイを簡単に行えるgemを用いてデプロイを行なっている感じです。（ローカル環境でも同じようにできます）
--api-keyには、herokuのアカウントのAPIキーを指定します。
ここでは、GitLab CIの環境変数にAPIキーを保存しています。
また、masterのbuildが成功した時はstaging環境へdeployし、
productionのbuildが成功した時はproduction環境へdeployを行うようにしています。
ここで少し苦戦したのが、初めmasterはdeployできたのに、productionのdeployは

```
invalid option "--api-key="
```
と出て失敗してしまうエラーです。
初め原因がわからなかったのですが、原因はGitLabの環境変数を設定するところで
ProtectedオプションをOnにしていたことでした。（Offにしたら無事deployできました）

# まとめ
GitLab CIを初めて触ったのでわからないことが多く苦戦もしましたが、慣れてくると結構便利で重宝しています。
課題としては、buildの時間が少しだけ長いことです。高速化をするいい方法を模索しています。
asciimenia を使って、コンソール操作の動画を投稿する

## asciinema
外国人の fish プラグイン作者が asciinema という動画を使ってプラグインの紹介をしていたので、使って fishingz の操作を録画してみた。

実際の投稿した録画は以下である。
[https://asciinema.org/a/gzFcszqxqfXpI0EDVyrachRS0]


## 使用方法

asciinema のインストール

```
% sudo apt-add-repository ppa:zanchey/asciinema
% sudo apt-get update
% sudo apt-get install asciinema
```

demo_fishingz.cast という題名で録画開始。

```
% asciinema rec -t demo_fishingz.cast
```

exit と入力することで録画が終了する

```
exit
```

録画した内容のチェックをする

```
% asciinema play demo_fishingz.cast
```

アップロードする

```
% asciinema auth
```

アカウントが無いので、「Log in」ボタン左の欄にメールアドレスを入力する

これで登録OK.


## 感想
### 利点
+ 手軽

### 欠点
+ 録画内容の編集ができない
+ Ctrl-u Ctrl-u など不可視キーの入力がわからない

### その他
+ 多分、script コマンドを流用した仕組みだと思う
+ ただ、生成される中間ファイルの内容を編集するのは至難
【jQuery3.3.1】壊れた画像を"noimage.jpg"に差し換える Level②-1 「onerror」を使う

#目的
ページ上の壊れた画像をすべてnoimageに差し換える

#前回
https://qiita.com/konkipiano/items/8f9a0aba437d64ec403d

#サンプルのHTML

```html:broken_image.html
<html>

<head>
    <style type="text/css">
        div {
            width: 150px;
            height: 150px;
            border: 1px solid;
        }

        img {
            max-width: 100%;
            max-height: 100%;
        }
    </style>
</head>

<body>
    <!--存在しない画像-->
    <div>
        <img src="http://google.com/hogehoge.jpg" />
    </div>
    <div>
        <img src="http://google.com/fugafuga.jpg" />
    </div>
    <!--存在する画像-->
    <div>
        <img src="https://3.bp.blogspot.com/-rNmXJXzt8DQ/VsPnSNB6MzI/AAAAAAAA4Dw/GOIgFy4n2ls/s180-c/music_sakkyoku_piano_man.png "
        />
    </div>
    <div>
        <img src="https://2.bp.blogspot.com/-lAIFjv3ejHg/WEztKOlwR-I/AAAAAAABAUU/d9sJUl9xolIAaodsAHmZQFVj_7wkqpSmQCLcB/s400/ai_music.png "
        />
    </div>

</body>

</html>
```

|表示結果|
|---|
|![image.png](https://qiita-image-store.s3.amazonaws.com/0/228301/e5bfcdb3-1375-d2c3-940f-1dc5da571c3e.png)
|

上の2枚の画像が壊れているので、
直します。

#Level②.onerrorを使う
jQueryのonerrorを利用すれば、
壊れた画像をキャッチして直せるのではないかという発想。
これでちょっと作ってみます。

#試行したHTML

```html
<html>

<head>
    <style type="text/css">
        div {
            width: 150px;
            height: 150px;
            border: 1px solid;
        }

        img {
            max-width: 100%;
            max-height: 100%;
        }
    </style>
    <!--jQuery読み込み-->
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <!--onerror(動かない)-->
    <script type="text/javascript">
        $ = jQuery;
        $img.on("error", function () {
            $img.attr("src", "https://placehold.jp/150x150.png?text=NoImage");
        })
    </script>
</head>

<body>
    <!--存在しない画像-->
    <div>
        <img src="http://google.com/hogehoge.jpg" />
    </div>
    <div>
        <img src="http://google.com/fugafuga.jpg" />
    </div>
    <!--存在する画像-->
    <div>
        <img src="https://3.bp.blogspot.com/-rNmXJXzt8DQ/VsPnSNB6MzI/AAAAAAAA4Dw/GOIgFy4n2ls/s180-c/music_sakkyoku_piano_man.png "
        />
    </div>
    <div>
        <img src="https://2.bp.blogspot.com/-lAIFjv3ejHg/WEztKOlwR-I/AAAAAAABAUU/d9sJUl9xolIAaodsAHmZQFVj_7wkqpSmQCLcB/s400/ai_music.png "
        />
    </div>

</body>

</html>
```

|表示結果|
|---|
|![image.png](https://qiita-image-store.s3.amazonaws.com/0/228301/e5bfcdb3-1375-d2c3-940f-1dc5da571c3e.png)
|

なんと、これは動きません。
どこに問題があるのでしょうか。
自分のような初心者はここでまずハマりました。

これをFIXするためには、「JavaScriptの実行順」を理解しておく必要があります。

#次回
Level②-2 onerrorを動かす に続く！
網羅パターン生成 JScript

ちょくちょく条件網羅パターンを書くことがあるので、自動生成用に作成。

作ったやつ
----

### コード

```javascript
// - - - - - - - - - - - - - - - - - - - - -
// ユーザ設定

var pattern = ["0", "1"];
var height = 4;

// - - - - - - - - - - - - - - - - - - - - -
// 網羅パターン生成

var width = Math.pow(pattern.length, height);

var matrix = [];
var blockSize = pattern.length;
while (blockSize <= width) {
  var row = [];
  
  for (var i = 1; i <= blockSize; i++) {
    for (var j = 1; j <= (width / blockSize); j++) {
      row.push(pattern[i % pattern.length]);
    }
  }
  
  matrix.push(row.join("\t"));
  blockSize += blockSize;
}

// - - - - - - - - - - - - - - - - - - - - -
// ファイル出力

var fs = WScript.CreateObject("Scripting.FileSystemObject");
var file = fs.CreateTextFile("output.txt");
file.write(matrix.join("\n"));
file.close();
```

### 出力ファイル

上記のコードから出力したファイルの内容。

```
1	1	1	1	1	1	1	1	0	0	0	0	0	0	0	0
1	1	1	1	0	0	0	0	1	1	1	1	0	0	0	0
1	1	0	0	1	1	0	0	1	1	0	0	1	1	0	0
1	0	1	0	1	0	1	0	1	0	1	0	1	0	1	0
```

これを Excel に直接貼り付けたり、行列を入れ替えたりして使う。変数 _pattern_ を書き換えることで別の文字を使って出力することもできる。
RTX830を使ってバックアップ回線をUSBモバイルルータで作る

# ネットワーク構成
まぁまずはこれを見てくれ。

[昨日のやっつけ感](https://qiita.com/segfo/items/a00d67bbf6c5329b151b)よりはだいぶまともになった。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/30037/00325f52-2f08-2e0a-bbb8-58a4ef266b8a.png)

# やりたいこと
メインの回線が生きてるときはこういう風な経路を通ってほしい

![image.png](https://qiita-image-store.s3.amazonaws.com/0/30037/4c0ebd71-1826-3d0f-be7f-87e75304276e.png)

メインの回線が死んだときは、モバイル回線に切り替えてほしい。
モバイル端末は、富士ソフトのF+ FS020UとDTIの3GBデータプラン的なやつ。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/30037/4a404f57-2523-f83a-9643-9c52e05297eb.png)

# やる目的
掃除のおばちゃんが、あらぁ何このコード邪魔ねぇﾌﾞﾁｨ!!!!!!!

ってやる感じの頻度で、家族が意図せずにPR-500KIの電源を抜くといったことが多発しているため
回線ダウン時の気づき（USBに切り替わった時のビープ音）と快適なインターネットライフのための接続断回避といった目的。

さすがに、何このコード邪魔ねぇﾌﾞﾁｨは無いが、足で延長コードを蹴ってしまい、その衝撃で抜けるなどがある。（別の意味でも危ない）

# メイン回線のインターネットへ出るHGW(PR-500KI)の設定
* 100番台ネットワーク(RTX830側)への静的ルートの設定をしておく。
* RTX830のWAN側IPを固定するため、DHCPのIP固定割り当て機能にRTX830のWAN側MACアドレスと割り当てIPを入れとく。

# 切り替え以外の設定は基本的にGUIでセットアップする
1. メイン回線側(LAN2)：PPPoE接続はしないので、DHCPでHGWからIPアドレスをもらう。  
基本これで、[ネットワーク監視機能の設定](http://www.rtpro.yamaha.co.jp/RT/manual/rt-common/ip/ip_keepalive.html)は自動的にされているはず。
2. モバイル回線側(USB1)：プロバイダからもらったダイヤル番号（CID）とかいろいろを設定するだけ。  
※自動接続はしない　にしておく。  
最後に自動接続にしないと切り替わらないので最後に「自動接続する」にチェック入れる  
余談：`*99***1#` とか　`*99***5#`　で書いてあるので、この場合は#の1個手前の　1　とか　5　がCIDになるらしい。

# 自動切換え設定：LAN2(メイン回線)の生死確認と自動切換えの設定
これをやると、メイン回線が死んだら自動的にバックアップに切り替わり
メイン回線が生き返ると、モバイル回線を落としてメイン回線に切り替わる

このあたりの設定をする。
[LAN 経由でのプロバイダ接続がダウンした時にバックアップする接続先の指定](http://www.rtpro.yamaha.co.jp/RT/manual/rt-common/ip/lan_backup.html)
[LAN 経由のキープアライブを使用するか否かの設定](http://www.rtpro.yamaha.co.jp/RT/manual/rt-common/ip/lan_keepalive_use.html)

```
# もしLAN2が死んだらpp1(モバイル)に切り替える
lan backup lan2 pp 1
# LAN2の生死確認は、192.168.1.1（PR-500KI）にPING打った時にReplyしてくれなくなったら切り替える
lan keepalive use lan2 icmp-echo 192.168.1.1
```

# 最後(これやらないと切り替わらない)
GUIからpp1(モバイル回線)の設定開いて、「自動接続する」にチェック入れる。
これ入れないと、自動的に切り替わってくれなくて、手動でポチってしないといけなくなる。
ここまで頑張って設定した意味がないよね。


以上
kotlinでandroidの入門　ブロック崩し

##ブロック崩しのボールのみ

動きのある物を作ってみたくなって、ブロック崩しにチャレンジ
まずはボールを動かしてみます

定期的に動かす仕組みは、
前にストップウォッチを作った時に使ったHandlerで

```blockBreaking.kt
    // タイマー用
    private val time = 10
    private val handler = Handler() 

    // 起動
    handler.removeCallbacks(runnable)


    val runnable = object : Runnable {
        // 10mS毎の処理
        override fun run() {
            // ボール移動処理
            ball.move()
            if (false == kabe.chkCollision()) {
                // 仮の移動でぶつからなかったので位置確定
                ball.fix()
            }
            // 再表示
            gameArea.invalidate()
            // 次の起動を設定
            handler.postDelayed(this, time.toLong())
        }
    }
```

ボールはクラスを作って

```Ball.kt
class Ball() {
    // 大きさ、座標等
    private val radius : Float = 30F
    private var pointX : Float = 0F
    private var pointY : Float = 0F
    private var vectorX:Float = 0F
    private var vectorY:Float = 0F
    private var tmpX : Float = 0F
    private var tmpY: Float = 0F

    //　描画（円）用
    val size : Float
        get() = radius
    val x  : Float
        get() = pointX
    val y : Float
        get() = pointY
    // 移動前の位置
    val top : Float
        get() = pointY-radius
    val bottom : Float
        get() = pointY+radius
    val left : Float
        get() = pointX-radius
    val right : Float
        get() = pointX+radius
    // 移動後の位置
    val newTop : Float
        get() = tmpY-radius
    val newBottom : Float
        get() = tmpY+radius
    val newLeft : Float
        get() = tmpX-radius
    val newRight : Float
        get() = tmpX+radius

    // 初期位置へ
    fun reset(cx : Float, ytop : Float, vx : Float, vy :Float ) {
        pointX = cx
        pointY = ytop -radius
        vectorX = vx
        vectorY = vy
    }
    // 移動 (暫定値算出)
    fun move( ) {
        tmpX = pointX + vectorX
        tmpY = pointY + vectorY
    }
    // 暫定値を今の位置に　(どこにもぶつからなかった時呼ばれる)
    fun fix() {
        pointX = tmpX
        pointY = tmpY
    }
    // Xぶつかった時
    fun resetNewY( p : Float ) {
        pointY = if ( top > p ) {
            p+radius
        } else {
            p-radius
        }
        vectorY *= -1
    }
    // Yぶつかった時
    fun resetNewX( p : Float ) {
        pointX = if ( left < p ) {
            p-radius
        } else {
            p+radius
        }
        vectorX *= -1
    }
    // X軸　加減速　多少のゲーム要素
    fun vectorAcceleX( acc : Float) { vectorX += acc }

}
```

移動させて座標求め、衝突判定を行ってます
ぶつかったら、ベクトルを反転させる簡単な処理にしてます

![ball.png](https://qiita-image-store.s3.amazonaws.com/0/258658/5a589321-e50e-352b-9579-93db14f57950.png)

ソース[ここ](https://github.com/bokufolivora/ball)置いてます
OSSの全文検索サーバ「Fess」でお手軽Webクローリング＆スクレイピング

#はじめに
世にOSSのクローラや検索システムは沢山ありますが、プラグインなしでクローリング＋スクレイピング＋全文検索が一挙にできるツールは意外と少ない気がします。

Fessは、それらをまとめて簡単に実現できるOSSの全文検索サーバです。今回は、Wikipediaをクローリングし、検索できることを確認するところまでやってみます。

Fessの主な特徴は以下の通りです。

* Javaベース
* Apache License
* 日本語のドキュメントあり
* 導入が非常に簡単
* 機能多数


詳しくは公式を参照。
https://fess.codelibs.org/ja/index.html

#インストール手順
OS : Windows10
Fessのバージョン : 12.1.3

https://github.com/codelibs/fess/releases
から圧縮ファイルを落として解凍するだけです。

#Webクロール
実際にWebクロールをしてみます。

### Fessの起動
初めにFessを起動します。

```none:Fessの起動
$ .\bin\fess
```

※事前にJavaをインストールし、環境変数JAVA_HOMEを設定しておく必要があります。

起動したら、Fessの管理画面 http://localhost:8080/admin/ にアクセスします。
ユーザ名/パスワードはadmin/adminです。

### クローラ設定
次にクローラの設定をします。
クローラ＞ウェブ＞新規作成をクリックします。

![localhost_8080_admin_webconfig_ (2).png](https://qiita-image-store.s3.amazonaws.com/0/227999/b0be5f38-ace1-1f55-9f7c-270a033112b2.png)



設定画面が開きます。
そのままではページ全体が検索対象となってしまうため、本文以外は検索に引っかからないように設定パラメータに以下のようなフィールドを追加します。
`field.xpath.article_title=//*[@id="firstHeading"]`
`field.xpath.article_content=//*[@id="mw-content-text"]/DIV/P`

一行目では、`article_title`フィールドに`//*[@id="firstHeading"]`（記事タイトル）の内容
二行目では、`article_content`フィールドに`//*[@id="mw-content-text"]/DIV/P`（記事本文）の内容
をXPathで指定しています[^1]。
[^1]: XPathはChromeのデベロッパーツール（F12）で簡単に取れるのでおすすめです。
設定したら、`＋作成`をクリックします。

<font color="Tomato">※この設定によりフィールドにテキスト自体は格納されますが、そのフィールドを指定した検索ができません。検索可能にするには以下のようにファイルを編集し、Fessを再起動する必要があります。</font>

```none:\app\WEB-INF\classes\fess_config.properties
query.additional.response.fields=article_title,article_content
query.additional.search.fields=article_title,article_content
```


### クロール
実際にクロールをします。

システム＞スケジューラ＞Default Crawler＞今すぐ開始をクリックするとクローリングが始まるので、しばし待ちます（デフォルト設定では毎日0時0分に自動でクローリングします）。
クロールの実行中はDefault Crawlerの状態が`実行中`になるので確認できます。

### 検索
最後に検索をしてみます。

Fessの検索画面 http://localhost:8080/ にアクセスし、先ほど作成したフィールドで検索します[^2]。
[^2]: 本当はデフォルトでこのフィールド検索をしたいのですが、やり方がわかりません・・・。

![localhost_8080_search__q=article_title%3A%E3%82%A2%E3%83%87%E3%83%AA%E3%83%BC%E3%83%9A%E3%83%B3%E3%82%AE%E3%83%B3&num=10&sort=.png](https://qiita-image-store.s3.amazonaws.com/0/227999/94566bf0-d384-795d-ff4d-28961e8a4da7.png)

できました。




#おわりに
FessはWebだけでなく、ファイルシステムなどもクロール可能な非常に完成度の高いクローラだと思います。
ただ完成度が高いがゆえに、細かい設定をしようと思うと難しい印象がありますね。そういう場合は、ManifoldCFやElasticsearch、Solr等を使って自分でシステムを作ったほうが良いのかもしれません。
Web Starter Kit をマスターするぞ！… その1


- 最近時間ができたのでPWA(Progressive Web Apps)を習得する手始めとしてGoogleが提供しているWeb Starter Kitを始めたいと思います。

## PWAでできること／できないこと。

- ネイティブアプリにできなかったことがいくつかPWAとしてWebアプリ（紛らわしい...）としてできるようになってきました、モバイルSafariにも対応が始まりましたね。

- できることできないこと一覧は、[https://whatwebcando.today](https://whatwebcando.today) で確認できます。

## まずは、Web Starter Kit

- Web Starter KitはPWAのひな形なのでそれだけではだからなに？って感じのようですがまずはここから始めてみます。
- [Web Starter Kitの紹介ページ](https://developers.google.com/web/tools/starter-kit/?hl=ja)最初は日本語の説明もあって安心(?)ですねw

## とにかくまず動かしてみます！

- まずは動かしてからですよね。私の環境は、macOS 10.13.5です。

### 1. Web Starter Kitのダウンロード

- git clone でサンプルをダウンロードします。
- ダウンロード後にweb-starter-kitのディレクトリに移動します。

```sh
sh-3.2$ cd wsk
sh-3.2$ git clone https://github.com/google/web-starter-kit
Cloning into 'web-starter-kit'...
remote: Counting objects: 10577, done.
remote: Total 10577 (delta 0), reused 0 (delta 0), pack-reused 10577
Receiving objects: 100% (10577/10577), 9.86 MiB | 3.79 MiB/s, done.
Resolving deltas: 100% (5624/5624), done.
sh-3.2$ cd web-starter-kit/
```

### 2. もろもろツールのインストール

- 古いバージョンが入ってたりしたので消したりしてます。

```sh
sh-3.2$ brew install ruby
sh-3.2$ nodebrew install-binary stable
sh-3.2$ nodebrew use v10.4.1
sh-3.2$ npm update -g npm
sh-3.2$ npm uninstall gulp-sass
sh-3.2$ npm install gulp-sass --save-dev
sh-3.2$ npm install --global gulp-cli
```

### 3. 起動！！

- appディレクトリに入ってgulpコマンドを実行します。

```sh
sh-3.2$ cd app
sh-3.2$ gulp serve
[21:45:09] Failed to load external module @babel/register
[21:45:09] Requiring external module babel-register
[21:45:09] Working directory changed to ~/Desktop/wsk/web-starter-kit
[21:45:10] Using gulpfile ~/Desktop/wsk/web-starter-kit/gulpfile.babel.js
[21:45:10] Starting 'scripts'...
[21:45:10] Starting 'styles'...
[21:45:11] Finished 'scripts' after 382 ms
[21:45:11] Finished 'styles' after 297 ms
[21:45:11] Starting 'serve'...
[21:45:11] Finished 'serve' after 41 ms
[WSK] Access URLs:
 -------------------------------------
       Local: http://localhost:3000
    External: http://192.168.1.16:3000
 -------------------------------------
          UI: http://localhost:3001
 UI External: http://192.168.1.16:3001
 -------------------------------------
[WSK] Serving files from: .tmp
[WSK] Serving files from: app

```

### 4. ブラウザが立ち上がりました。

#### PC画面

![WSK_PC.png](https://qiita-image-store.s3.amazonaws.com/0/51116/65727273-0288-3171-0d5f-3a3508196a70.png "WSK_PC.png")

#### モバイル画面

![IMG_0912.PNG](https://qiita-image-store.s3.amazonaws.com/0/51116/0a89f34a-ec2b-4fe5-a5bb-66fef3b9cea6.png "IMG_0912.PNG")


## まずはここから

- とりあえず、サービスは立ち上げられたので、PWAっぽい機能、ローカル通知やオフラインストレージを試したいと思います。
CentOS7 に Python 3系を入れよう 

python3.5を入れてみよう
というか入れなきゃいけない
# 環境
OS: CentOS 7 minimal

# インストール
まず、リポジトリの追加

```
yum install -y https://centos7.iuscommunity.org/ius-release.rpm
```

必要なものを追加

```
yum install -y python35u python35u-libs python35u-devel python35u-pip
```

これで終了とおもったら
pip 使えない、、、、
え、インストールできてない！？

```
$ python --version
Python 2.7.5
```
あれれ、古い。
そうだ、共存してるんだ。

```
$ python3.5 --version
Python 3.5.5
```

おけおけpipもpip3.5なのか

```
$ pip3.5 --version
pip 9.0.1 from /usr/lib/python3.5/site-packages (python 3.5)
```

よし使えるようになった。
ごちそうさまです。

# 感想

これで良し。でも3.5ってうつのめんどいな、、、、。
flowtypeの$CallというHigher Kinded Type

[$Call](https://flow.org/en/docs/types/utilities/#toc-call)ヤバイ。超ヤバイ。

flowtypeのUtility Typesを紹介する記事にて、

* [flowtypeのUtility Typeについて その3](https://qiita.com/kinzal/items/8e2978be3ec78663c70b#call)

> $Callは関数の戻り値型を返す型です。

と紹介させていただいたのですが、この説明は間違いではないけど、`$Call`のヤバさを何一つ説明できてませんでした。（というか気づいていなかった）

## 発端

* [Support higher kinded type #30](https://github.com/facebook/flow/issues/30#issuecomment-346668903)

ことの発端は上記issueのコメントを見たところから始まります。

> From what I can tell, higher-kinded types are actually supported in Flow, though they are encoded using the simple-kinded function type and the utility type $Call for type-level application. In fact, some of the utility types of Flow are using this encoding, such as the $ObjMap<T, F> type, where F is higher-kinded. Maybe this isn't official though, because I don't see it explicitly mentioned in the documentation, or I might be missing something.

Higher Kineded Typeがflowtypeでサポートされている！？`$Call`がそれ！！？
これはもう検証するしかないと触りだしたところ`$Call`のヤバいとしか言いようのない型だということがわかりました。

## $CallというUtility Type

端的に言うと`$Call`は型を一定のルールに基づき変換するための型です。
例えば、

```js
type InType<T: Array<*>> = $Call<<A>(arr: Array<A>) => A, T>

declare var arr: Array<number>;
declare var v: InType<typeof arr>;

v.toFixed();
v.replace('', ''); // Error
```

というように`$Call`を用いて`Array`の型パラメーターを抜き出す型を作ることができます。
これは`<A>(arr: Array<A>) => A`のルールに基づいて渡された`T`型を変換する`$Call`の呼び出しになります。

また、`$Call`に渡すルールは`(FunctionA)&(FunctionB)`の形で定義できるので、`T`が`FunctionA`にマッチすればそちらの変換、`FunctionB`にマッチすればそちらの変換ということもできます。

つまり、僕たちは`$Call`によって新しい型表現を手に入れることができたんですね！！

## 余談

余談ですが`$Call`がHigher Kinded Typeかというとちょっと疑問は残ります。
僕の理解ではHigher Kinded Typeと呼べるのは2階カインドからです。

通常の型が0階カインド、型コンストラクタを持った型が1階カインド、型コンストラクタを受け取れる型が2階カインドで、flowtypeでは型コンストラクを受け取る方法はない認識です。

```js
class _A {} // *
class _F<A> {} // * -> *
class _X<F: _F<*>> {} // * -> *
```

`_X`では一見それっぽく見えますが、`_F`は既に確定しており`_F<A>`の`A`が決まれば新しい型を返せるので、`_X`は`_F`と同様の1階カインドです。

そのため、`$Call`をHigher Kinded Typeというのは言い過ぎかなと思うのですが実際のところどうなのでしょうか？（僕もカインドを理解できてる訳ではないので怪しい）
このあたりカインドに詳しい方がいましたら、ぜひ教えてください。
RailsのURLをID以外から付ける

Railsでふつうにシステムを作っていくと、`/articles/20`のようにIDの値からURLを生成するようになっています。ただ、これでは不満な場面もあるかもしれません。

それ用の`friendly_id`というGemもあるのですが、使わなくてもそれなりに簡単に実装できました。

# 変えるべき場所2箇所

URLの表記を変えようと思えば、「URLを生成する部分」と「URLを解釈する部分」の2箇所に手を入れる必要があります。幸い、もともと変えやすいように作られていますので、それに乗っかればさほど手間はかからずに済みました。

## どういうURLにするかと、データ領域の準備

今回は、`/articles/some-key`のように、文字列のスラッグをURLにすることを考えてみます。まずは、スラッグ用のデータ領域を用意しましょう。

```rb:マイグレーション
add_column :articles, :slug, :string, null: false
add_index :articles, :slug, unique: true
```

スラッグが重複してはまずいので`UNIQUE`は必須ですし、スラッグだけを識別に使うのであれば`NOT NULL`も必要となります。入力フォームもスラッグを入れられるように改修が必要ですが、そちらはいったん省略します。

## URL生成部分

`article_path(@article)`で、IDではなくスラッグを見るようにする必要がありますが、これはモデルの`#to_param`というメソッドを呼んでいます。これをオーバーライドしましょう。

```article.rb
def to_param
  slug
end
```

これで、URLヘルパーによって生成されるURLも、スラッグ利用に切り替わります。

## コントローラー側

あとは、コントローラーでスラッグから記事を引くようにするだけです。

```articles_controller.rb
def get_article
  Article.find_by!(slug: params[:id])
end
```

なお、`find_by!`としているのは、記事がなかった場合に`ActiveRecord::RecordNotFound`を投げるという、`find`と同じ挙動をさせるためです。
Blockchain Development Services | Blockchain Development Company

![How Blockchain Will Change The Future of Ecommerce Online Market_.jpg](https://qiita-image-store.s3.amazonaws.com/0/184739/4336088c-1a77-85b6-babc-7e17165d72c2.jpeg)

Mobiweb technologies is tuned as a <a href="https://www.mobiwebtech.com/blockchain-development-services/">Blockchain development company</a> that nowadays requires which are creating a true differentiation in today’s enterprise. Mobiweb’s offerings match perfectly with the global scale businesses need and support innovation across industries on the security perception in transaction
変数名が普遍的な単語の場合、警告が出ないかも

良くないコードを書いていると警告を出してくれる`rubocop`というツールを導入して開発をしているのですが、あるときrubocopが警告出しまくりの設定下でも警告を出してくれないという事がありました。

元々のコードはこんな感じで、`json`という変数名がイケてないのでリネームすることに

```ruby
～略～

json = {test: 1}
render json: json

～略～
```

そして、こんな感じでリネームを行いますが一部し忘れたとします

```ruby
～略～

rename_json = {test: 1}
render json: json # ←リネーム漏れ。このままだとundefinedですが、なぜか警告は出ない

～略～
```




`json`という変数名が他でも使われすぎているのか、エディタやrubocopがundefinedと判定することができないようです。

このままだとバグになりかねないし、リファクタを躊躇してしまうようにもなりかねないので、普遍的な単語は避ける癖を付けた方が良さそうです。
nth系疑似クラスの引数は書き順に気をつけよう

意外とハマりそうになりました。

```css
/* 誤 */
p:nth-child(5+n) {
  ...
}

p:nth-child(n5) {
  ...
}

/* 正 */
p:nth-child(n+5) {
  ...
}

p:nth-child(5n) {
  ...
}
```

掛け算の方は間違えることは無いと思いますが、足し算の方は場合により間違えそうになります。(僕だけ？)
AngularのRouterで遷移したとき、パラメータ解釈前のパス文字列をゲットする

# やりたいこと

> `/something-page/1`

にアクセスしたとき、`RouterModule.forRoot`等で定義した

> `/something-page/:id`

みたいな文字列がほしい。

# やりかた

- Routerのイベントをsubscribeします。
- イベントのステートによるフィルタは任意ですが、`RouteRecognized`より前の`NavigationStart`では、`RouterEvent.state.root`が`undefined`なのでアウトです。
- `ActivatedRouteSnapshot::children`が、`RouterModule.forRoot`に渡した`Routes`or`Route[]`の階層を、逆にたどるような感じになっているので、`children`を再帰的にたどります。
- 各階層の`ActivatedrouteSnapshot`がもっている`routeConfig`の`path`に、パラメータ変換前のパス(`:id`みたいなの)が入っているので、これを抽出すればOKです。
- 一番上階層の`ActivatedRouteSnapshot`=`RouterEvent.state.root`は、なぜか`routeConfig`がundefinedなので、ちゃんと識別するようにしましょう(return時に三項演算子かけて、`routeConfig`の存在をチェックしてます)。

```typescript
export class GetPathService {
  constructor(private router: Router) {
    router.events
      .pipe(filter(e => e instanceof RoutesRecognized))
      .subscribe((e: RoutesRecognized) => {
        console.log(getPath(e.state.root));
      });
  }
}

function getPath(node: ActivatedRouteSnapshot) {
  const c =
    node.children.length > 0 ? `/${getPath(node.children[0])}` : '';
  return `${node.routeConfig ? node.routeConfig.path : ''}${c}`;
}
```

# 結果について

先ほど

> `ActivatedRouteSnapshot::children`が、`RouterModule.forRoot`に渡した`Routes`or`Route[]`の階層と同じ階層構造になっている

といった通り、この作りに依存してきます。

たとえば、`Routes`で

```typescript
[
  {
    path: '',
    children: [
      {
        path: 'id0001',
        children: foo,
      },
      {
        path: 'id0002',
        children: bar,
      },
    ]
  },
]
```

のように、間に`path: ''`みたいなのが存在すると、その分も階層化されます。
なので、この`Routes`を指定した場合の、先ほどのサンプルコードの結果は

```bash
//id0001/...
```

のように、先頭に接続文字列が連続するようになります。

# 参考

https://github.com/angular/angular/blob/5.0.x/packages/router/src/router_state.ts#L354
Ethereum のトランザクション作成時に必要な nonce を得る

* ローカルで Ethereum のトランザクションに署名する際には、nonce を指定する必要があります。
* このときに必要な nonce を取得する方法をメモしておきます。

# nonce とは
* Ethereum のトランザクションにおける nonce は、ある Ethereum のアドレス（アカウント）から実行されたトランザクションの総数です。
* nonce は各トランザクションがそれぞれ一度のみ実行されることを保証するために必要な値です。
* 0 から 1 つずつインクリメントされていきます。

# Ethereum アドレスの現在の nonce を取得する
* Ethereum のトランザクションを作成するためには、トランザクションを作成したいアカウントが過去に何回トランザクションを実行していたか（トランザクションの総数==現在の nonce）を知る必要があります。
* Ethereum アドレスの現在の nonce は、web3.js を使用する場合は `web3.eth.getTransactionCount` で取得することができます。
* `web3.eth.getTransactionCount` では、過去のトランザクション数が0回であれば0を、3回であれば3を返します。

# サンプルコード
```js
code:getTransaction.js
 web3.eth.getTransactionCount(address, (error, count) => {
   console.log(count);
 });
```

# デモ
* https://piyolab.github.io/playground/ethereum/getTransactionCount/index.html

# 参考
* https://github.com/ethereum/wiki/wiki/White-Paper
* https://github.com/ethereum/wiki/wiki/JavaScript-API#web3ethgettransactioncount

# 関連
* http://blog.playground.io/entry/2018/05/25/103924

# Note
- Ethereum 関連の情報は https://scrapbox.io/sushiether/ に集約することにしました。
- この記事の内容に変更・更新がある場合は、以下の URL を更新します。
- https://scrapbox.io/sushiether/Ethereum_のトランザクション作成時に必要な_nonce_を得る
tmuxで自動でペイン毎のログ取る時のファイル数に閾値を設ける。

# なにこれ
`tmux`でペイン毎にログとりたいけど、ログファイル数が一定量いったら消したい時に`*rc`に書く的なそれ。
消すタイミングは、zshrcを起動するタイミングなので`cron`もいりません。
調べて先人様のやつをアレンジして作りました。

## 先人様
[tmuxを使いながらログを取る](https://qiita.com/docokano/items/8418cc1b2561df03e8d9)
[tmuxメモ : Tmux Loggingでロギングとキャプチャ](https://wonderwall.hatenablog.com/entry/2016/07/01/221338)

# こうやる
```bash:bashrcかzshrc
########################################
# tmuxの設定
# 自動ロギング
if [[ $TERM = screen ]] || [[ $TERM = screen-256color ]] ; then
    local LOGDIR=$HOME/Documents/term_logs
    local LOGFILE=$(hostname)_$(date +%Y-%m-%d_%H%M%S_%N.log)
    local FILECOUNT=0
    local MAXFILECOUNT=500 #ここを好きな保存ファイル数に変える。
    # zsh起動時に自動で$MAXFILECOUNTのファイル数以上ログファイルあれば消す
    for file in `\find "$LOGDIR" -maxdepth 1 -type f -name "*.log" | sort --reverse`; do
        FILECOUNT=`expr $FILECOUNT + 1`
        if [ $FILECOUNT -ge $MAXFILECOUNT ]; then
            rm -f $file
        fi
    done
    [ ! -d $LOGDIR ] && mkdir -p $LOGDIR
    tmux  set-option default-terminal "screen" \; \
    pipe-pane        "cat >> $LOGDIR/$LOGFILE" \; \
    display-message  "💾Started logging to $LOGDIR/$LOGFILE"
fi

########################################
```

これでtmuxのログのファイル数に制限を掛けれます。
これでいいならプラグインなしでロギングできます。
[Python] 関数内からその関数の名前を取得する方法

## 本題
Pythonでたまにタイトルのようなことがしたくなるのでメモ

結論から言うと`sys._getframe().f_code.co_name`を使う

```python
import sys

def hoge():
    print(sys._getframe().f_code.co_name)

hoge()
# -> hoge
```

## 応用例
例えば、自作クラスのメンバ変数を全て格納した辞書型を出力するメンバ関数を作る時に使う。

```python
# 例： 「<-」で示したものだけ出力したい
dir(obj) ->
['__class__',
 '__delattr__',
 '__dict__',
 '__dir__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__gt__',
 '__hash__',
 '__init__',
 '__le__',
 '__lt__',
 '__module__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 '__weakref__',
 'age',              # <-
 'name',             # <-
 'saveAsDict']
```

`name`と`age`をメンバ引数に持つ`Person`でやってみる

```python
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def asDict(self):
        out = dict()
        for attr in dir(self):
            # ↓ここで使用
            if not ("__" in attr or callable(attr) or attr is sys._getframe().f_code.co_name):   
                out[attr] = getattr(self, attr)
        return out

shinzo = Person("Abe", 63)
print(shinzo.asDict())
# -> {'age': 63, 'name': 'Abe'}
```

## 元も子もなく
メンバ関数じゃなければ`sys._getframe().f_code.co_name`を使う必要はない

```python
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

def asDict(obj):
    out = dict()
    for attr in dir(obj):
        if not ("__" in attr or callable(attr)):  # <- 3つめの項目を削除
            out[attr] = getattr(obj, attr)
    return out

shinzo = Person("Abe", 63)
print(asDict(shinzo))
# -> {'age': 63, 'name': 'Abe'}
```
obsolete な URI.escape, URI.unescape を置き換える

RuboCopに怒られました。[Lint/UriEscapeUnescape](http://rubocop.readthedocs.io/en/latest/cops_lint/#linturiescapeunescape)

`URI.escape`(`URI.unescape`) はURIに関してRFCに準拠していない動作をしており、使用非推奨/廃止されることにになってる。ついては `CGI.escape` か `URL.encode_www_form`, `URL.encode_www_form_component` で書き換えなさい、とのこと。

で、置換しようとしたんだけど機械的にはできない。

```ruby
# 今までのコード(obsolute)
URI.escape('http://hoge.example.org/search?q=ほげ')
#=> "http://hogehoge.example.org/search?q=%E3%81%BB%E3%81%92"

# '/' などもエスケープされる
CGI.escape('http://hoge.example.org/search?q=ほげ')
#=> "http%3A%2F%2Fhoge.example.org%2Fsearch%3Fq%3D%E3%81%BB%E3%81%92"

# 同様
URI.encode_www_form_component('http://hogehoge.example.org/search?q=ほげ')
#=> "http%3A%2F%2Fhoge.example.org%2Fsearch%3Fq%3D%E3%81%BB%E3%81%92"

# CGI.escape, URI.encode_www_form_component も本来はこういう使い方をする
'http://hoge.example.org/search?' + URI.encode_www_form({q: 'ほげ'})
#=> "http://hoge.example.org/search?q=%E3%81%BB%E3%81%92"
```

いろいろ書き直すしかないか？と思ってたけど [sporkmonger/addressable](https://github.com/sporkmonger/addressable) がやってくれる。 

```ruby
Addressable::URI.encode('http://hoge.example.org/search?q=ほげ')
#=> "http://hoge.example.org/search?q=%E3%81%BB%E3%81%92"
```

リンク集

- [Lint/UriEscapeUnescape](http://rubocop.readthedocs.io/en/latest/cops_lint/#linturiescapeunescape)
- [URI.escape](https://docs.ruby-lang.org/ja/latest/class/URI.html#S_ENCODE)
- [CGI.escape](https://docs.ruby-lang.org/ja/latest/method/CGI/s/escape.html)
- [URI.encode_www_form](https://docs.ruby-lang.org/ja/latest/class/URI.html#S_ENCODE_WWW_FORM)
- [URI.encode_www_form_component](https://docs.ruby-lang.org/ja/latest/class/URI.html#S_ENCODE_WWW_FORM_COMPONENT)
- [Addressable::URI.encode](https://www.rubydoc.info/gems/addressable/Addressable/URI#encode-class_method)
【Unity】ObjectにScriptをAttachできない

### 困ったこと
- ObjectにScriptをAttachできなかったこと

### 困るまでの手順
- Assetsの下で右クリック：Create<C# Script でScriptを作成
- Startメソッドに試しにログを仕込む

        $ Debug.Log(':::::START:::::');

- HierarchyにあるObjectにできたScriptをDrag&Dropでアタッチしようとする
- できなくて、困る

### その時のダイアログの内容

　　　<img width="423" alt="スクリーンショット 2018-06-19 19.58.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/77327/31304684-ba28-9c3c-d092-e54040cb54de.png">


### 解決方法
- クラス名とScriptのファイル名を揃えてあげた（クラス名に変な変数が入っていた）

　　<img width="530" alt="スクリーンショット 2018-06-19 20.10.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/77327/3a8e1ab2-eff5-3268-a41f-d413e8f6cea0.png">
実行中の(デバックで停止中でも)JavaScriptを強制終了

#いかなる時でも強制終了する

```javascript
window.stop();
```

中断とかスリープとか生易しいものではなくブラウザのバツマークを押したときと同じ効力がある。
死なば諸共。

クロームのイベントデバッカーでブレイク中の画面をスクショしたいとき（ブレイク画面はモヤかかるし変なアイコン出るのでスクショに使えない）にconsoleに`window.stop();`を打ち込めばポップアップを閉じる後続処理があっても一切無視して終了して便利。
子クラスの定義時に、自動で親クラスからHashのように参照できるようにする

継承関係のあるクラス間で、子クラスの定義時に、自動的に親クラスに子クラスが登録（メモ）され、それを例えば名前で参照できるようにする。

こんなイメージ。

```ruby
class Parent; 何らかの処理; end
class Child1 < Parent; NAME='child1'; 何らかの処理; end

Parent['child1']
#=> Child1
```

これを、メモ用変数と、`.inherited`メソッドで実現できた。

```ruby
module SubclassReferable
  # クラスの継承時、親クラスのメモ用変数に、子クラスを登録する。ただし、メモ用変数がある場合のみ。
  def inherited klass
    @subclass_list.push klass if @subclass_list
  end

  # 子クラスのNAME定数で、子クラスを見つける。
  def [] key
    __subclass_list__(__method__).find{ |klass| klass::NAME == key }
  end

  # メモ用変数がない場合、通常通りNoMethodErrorになる。
  def __subclass_list__ method_name
    send(:method_missing, method_name) unless @subclass_list
    @subclass_list
  end

  private :__subclass_list__
end

class Parent
  # メモ用変数
  @subclass_list = Array.new

  # `.inherited`等をクラスメソッドにするため、extendする
  extend SubclassReferable
end

class Child < Parent
  # 参照用のNAME定数を定義する
  NAME = 'child'
end
```

これで、親クラスから`.[NAME]`で子クラスを取得できるようになる。

```ruby
Parent['child']
#=> Child
```
GCEでUbuntuをインストールしてリモート接続できた

UbuntuをGCEにインストールして、リモート接続したいと思い試行錯誤していました。

下記の記事を参考に作業しました。
https://qiita.com/saizz/items/df3d32266bc9b6f37e2a

#タイムゾーン
私は、東京のリージョンで作ったのでタイムゾーンは関係ないと思ったのですが、しっかり関係ありました。
タイムゾーンのコマンドを入力すると一覧が、表示されます。
その中で、Asiaを選択します。
選択方法です。
上下のカーソルキーで、項目の上下選択します。
左右のカーソルキーで、OKとキャンセルの選択をします。

次に、たくさん出てきますので、tokyoを選択します。
これは、日本で使う場合ですが・・・

#ユーザー登録
次にユーザー登録ですが、英数字でユーザー名を指定すると、パスワードを聞いてきます。
今回作るユーザーのパスワードを入力します。
これは、リモートデスクトップで接続した際に、使います。
Ubuntuのデスクトップにログインする時も、使います。
パスワードを入力すると、フルネームなど聞いてきます。
フルネームと部屋番号と、電話番号は、私は入力しました。
あとでリモート接続した時、ここで入力したフルネームでアカウントが作られているので、ちゃんと入力した方が分かりやすいと思います。

#/etc/X11/Xwrapper.configのallowed_user
/etc/X11/Xwrapper.configのallowed_userを変更してくださいと説明にありますが、viに続けて入力しても、読み取り専用という趣旨のエラーが出ます。
その為、下記の様に指定します。
```
sudo vi /etc/X11/Xwrapper.config 
```
/etc/polkit-1/localauthority.conf.d/ディレクトリに、02-allow-colord.confを作成という説明も、同じ様にsudoを付けてコマンド入力してください。

#ログインできました
![スクリーンショット 2018-06-19 19.53.07.png](https://qiita-image-store.s3.amazonaws.com/0/20977/24c6297f-6abe-360a-c726-70f8c57153fe.png)


#再起動
VMインスタンスの再起動は、これでできます。
```
sudo shutdown -r now
```
または、
```
sudo reboot
```


#日本語
先にご紹介した記事の通りにコマンドを進めると、ログイン後にsettingで日本語選択することで、日本語使える様になります。
Ubuntuにログインしてから、日本語化の作業が必要です。

##参照元の記事だけでは、日本語化できません
参照元の日本語化の説明では、必要なパッケージをインストールできても、システムに設定がされていません。
![スクリーンショット 2018-06-20 16.09.59.png](https://qiita-image-store.s3.amazonaws.com/0/20977/f387f654-6def-db89-7ff0-2f0490749652.png)
それで、下記の記事を見つけました。
https://www.apps-gcp.com/gce-casual-knowhow-01/#i-8
```
sudo localectl set-locale LANG=ja_JP.UTF-8 LANGUAGE="ja_JP:ja"
```
参照元の記事のコマンドに加えて、このコマンドを実行すると日本語化できます。
![スクリーンショット 2018-06-20 17.21.56.png](https://qiita-image-store.s3.amazonaws.com/0/20977/3e2add44-6ff8-da61-e279-ba1774650ffb.png)


#viについて
viは、コマンドラインで使えるテキストエディタです。
使い方は、こちらも参考になると思います。
http://www.ritsumei.ac.jp/~tomori/vi.html
一応、英数字でiで、挿入モードにします。
カーソルキーで修正したい場所に移動して、適宜内容を修正してください。
修正が終わって保存したいときは、
Escキー→：→wq!→リターンキーの順に入力すると、保存して終了してコマンドラインに戻ってきます。
修正しない時は、:q!と入力すると良いです。

#RDPのクライアント
私はMacを使っていますが、Windowsのリモートデスクトップを使っていたこともあり、マイクロソフトのRDPソフトを今回使いました。
Androidから接続した時も、マイクロソフトのRDPのアプリを使いました。

#Ubuntuのログイン画面でパスワード入力後先に進まない件
Ubuntuのログイン画面で先に進むことができず、一度再起動したらログインできる状況が続いていました。
ググったところ、ビデオドライバ関連が怪しいと分かりました。
こちらの記事を参考にしました。
https://qiita.com/proton_lattice/items/82abbd7b9c31df6570f6
5のドライバのインストールの部分で、コマンドを実行すると一覧が表示されます。
リストの最後のドライバの番号を覚えて、元記事の説明の最新ドライバのインストールの型番を読み替えて入力してください。
どうも、ビデオドライバがインストールされていない感じでした.

この画像は、ビデオドライバのリストが表示されたところです。
![スクリーンショット 2018-06-20 19.33.37.png](https://qiita-image-store.s3.amazonaws.com/0/20977/ae02d840-b647-2bf4-8a8e-bbc2fff334dd.png)

##xdrpでログイン出来ました

調べた結果、ビデオドライバを削除したら直りました。
```
sudo apt-get --purge remove nvidia-*
sudo apt-get --purge remove cuda-*
```
スマホからも、この画像のように、ログイン出来ました。
![Screenshot_2018-06-21-00-38-37.png](https://qiita-image-store.s3.amazonaws.com/0/20977/8237b711-2a6a-c604-5fc8-fda6fd410882.png)
ログインしたまま時間が過ぎてログアウトした時も、正常にデスクトップにアクセス出来ました。
![Screenshot_2018-06-21-00-46-35.png](https://qiita-image-store.s3.amazonaws.com/0/20977/233f2c41-b63b-0db5-1141-072e38fd07db.png)

私は、調べている中で、Ubuntu デスクトップをインストールしました。
```
sudo apt-get -y install ubuntu-desktop
```

#まとめ
多少まごつく感じもありますが、ログインできたので感動しています。
スマホからもUbuntuを使うことが出来るので、助かります。
How to allow firewalld for HTTP for specific IP addresses on CentOS 7.2

CentOS 7.2 の `firewalld` で http (80) を特定の IP アドレスに対して許可する方法です。

# 追加

## firewalld 起動

```shell-session
# systemctl start firewalld.service # 起動
# systemctl enable firewalld.service # 自動起動
```

## zone 追加

`http` という zone を追加します。

```shell-session
# firewall-cmd --permanent --new-zone=http
# firewall-cmd --permanent --zone=http --set-target=ACCEPT
# firewall-cmd --permanent --zone=http --add-service=http # サービスを指定
# firewall-cmd --reload
```

## IP アドレス追加

```shell-session
# firewall-cmd --permanent --zone=http --add-source=203.0.113.1 # 追加
# firewall-cmd --permanent --zone=http --add-source=203.0.113.2 # どんどん追加
...
# firewall-cmd --reload
```

## 確認

```shell-session
# firewall-cmd --get-active-zones # 追加した zone (http) とソースが表示されれば OK
```

# 削除

## zone 削除

```shell-session
# firewall-cmd --permanent --delete-zone=http
```

## IP アドレス削除

```shell-session
# firewall-cmd --permanent --zone=http --remove-source=203.0.113.1
```

## 参考記事
- [[CentOS] firewalldで特定のサービスを特定のIPアドレスに対して許可する - Qiita](https://qiita.com/tomoki1207/items/44c7d19f984ae6a8df09)
- [CentOS7 サービス起動 停止 再起動 自動起動 | ホームページ制作 大阪【インフォメーションメディアデザイン株式会社】](https://www.imd-net.com/blog/2015/09/08-234814/)
- [CentOS7のfirewalldをまじめに使うはじめの一歩（systemdも少し） - Qiita](https://qiita.com/shrkw/items/8410e9cb65eb789a40e1)