OmniAICreator/Qiita-1.07M huggingface dataset:
java, maven メモ

# what is Maven
プロジェクト管理ツール

# install to windows
1. download maven from https://maven.apache.org/download.cgi 
2. 展開 任意のディレクトリに移動
3. なんとか/apatch-maven-x.x.x/binをPATHに追加
4. mvn -v で確認  

#pom.xmlの記述例
```xml
<project
  xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
 >

  <modelVersion>4.0.0</modelVersion>
  <groupId>java_training</groupId>
  <artifactId>java_lang</artifactId>
  <version>0.0.1-SNAPSHOT</version>

  <properties>
    <project.build.sourceEncoding>utf-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>utf-8</project.reporting.outputEncoding>
    <console.encoding>utf-8</console.encoding>
    <!-- console.encoding>Windows-31J</console.encoding -->
    <maven.compiler.source>12</maven.compiler.source>
    <maven.compiler.target>12</maven.compiler.target>
  </properties>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.1</version>
        <configuration>
          <compilerArgs>
            <arg>-parameters</arg>
            <arg>--enable-preview</arg>
          </compilerArgs>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-javadoc-plugin</artifactId>
        <version>3.1.0</version>
        <configuration>
          <additionalJOption>-J-Dfile.encoding=${console.encoding}</additionalJOption>
          <additionalOptions>--enable-preview</additionalOptions>
          <source>${maven.compiler.source}</source>
          <linksource>true</linksource>
        </configuration>
      </plugin>
    </plugins>
  </build>

</project>

```

#build
```project_root
mvn compile // コンパイル
mvn compile exec:java // exec.mainClassプロパティを設定していれば実行できる
mvn javadoc:javadoc // javadocを生成
mvn clean // 自動生成ファイルを削除
mvn -Dmaven.test.skip=true package // testをskip
mvn -DskipTests package // test を skip
複数のlzhファイルを解凍せずに、内容を一つのファイルにまとめる

lzhをlinuxのシステムで使ってるのは初めてみた。
多分、もとはwindowsサーバを使っていたせいだと思う。

```shell
find * -name "wzza*" | xargs -I {} lha pq {} zzmt381.txt >> zzmt_all.txt
```

ちなみに、lzhをwindowsで解凍するとファイル名が大文字になるが、
linuxで解凍すると小文字になるため、ハマった。
MS WORDで途中から段数を変更する

# 利用環境
Microsoft® Word for Mac 2011
version 14.7.3(17035)

macOS High Sierra バージョン10.13.6
プロセッサ 2.6GB Intel Core i5
メモリ 16GB 1600MHz DDR3

#MS WORDで途中から段数を変更したい。

機能を１年に１回か２年に１回くらいしか使わない。

毎回忘れて検索している。

検索結果を記録。

「1段組み」と「2段組み」を混在させる方法
https://news.mynavi.jp/article/wordtech-25/


挿入
区切り
セクション区切り（現在の位置から新しいセクション）

でセクションを宣言しておいて

書式
段組み
１段
など、変更したい段数を指定する。

<img width="607" alt="段.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51423/0604bca3-78a2-4460-7169-ce79810b567b.png">

# 文書履歴(document history)
ver. 0.01 初稿 20190513
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
NSRegularExpression の文字数

正規表現 NSRegularExpression の場合、文字数は "文字列".utf16.count を利用しないといけない場合がありでした。

下記ソースコードでは絵文字を利用した場合、 "".count と "".utf16.count では文字数が異なり utf16 でないと文字数が少なくなりマッチしませんでした。


```Swift:Swift5.0
import UIKit

func regExp(in: String, length: Int)
{
    do {
        let pattern = #"\{(.*?):(.*?)\}"#
        let regExp = try NSRegularExpression(pattern: pattern, options: .caseInsensitive)
        let matches = regExp.matches(in: str, options: [], range: NSRange(location: 0, length: length))
        
        if matches.count == 0 {
            print("No matches")
            return
        }
        
        for match in matches {
            print("match.numberOfRanges:[\(match.numberOfRanges)]")
            
            for index in 0 ..< match.numberOfRanges {
                let nsRange = match.range(at: index)
                
                if let range = Range(nsRange, in: str) {
                    let value = str[range]
                    print("range[\(index)]:[\(nsRange)]:[\(value)]")
                }
            }
        }
    } catch {
        print("Error = \(error)")
    }
}

let str = "{Hello:😹playground}"

print("------------------------------")
print("str.count:[\(str.count)]")
regExp(in: str, length: str.count)
print("------------------------------")

print("------------------------------")
print("str.utf16.count:[\(str.utf16.count)]")
regExp(in: str, length: str.utf16.count)
print("------------------------------")

```

```Output:Output
------------------------------
str.count:[19]
No matches
------------------------------
------------------------------
str.utf16.count:[20]
match.numberOfRanges:[3]
range[0]:[{0, 20}]:[{Hello:😹playground}]
range[1]:[{1, 5}]:[Hello]
range[2]:[{7, 12}]:[😹playground]
------------------------------
```

いろいろと調べてみた結果 NSString が使われる場合は utf16 を使う必要がありそうです。
[Apple Developer: NSString](https://developer.apple.com/documentation/foundation/nsstring)
Rails 5.2 + sorcery で認証

**備忘録です**

# はじめに

`devise` をとりあえず入れとこうとなるかと思いますが、ライブラリとして重たいので、軽量で、最低限の認証機能を作れる sorcery を使ってみようと思います。 

# 公式サイト

GEM: <https://rubygems.org/gems/sorcery>
GITHUB: <https://github.com/Sorcery/sorcery>

# 環境

```
$ rails -v
Rails 5.2.3
$ ruby -v
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin18]
```

## 導入

```rb:./Gemfile
...
+ gem 'sorcery'
```

```bash
$ bundle install
...
$ bundle exec rails generate sorcery:install
 create  config/initializers/sorcery.rb
    generate  model User --skip-migration
      invoke  active_record
      create  app/models/user.rb
      insert  app/models/user.rb
      insert  app/models/user.rb
      create  db/migrate/20190513001622_sorcery_core.rb
```

参考： <https://github.com/Sorcery/sorcery#installation>

### 補足

**新しく作成されるファイル**

- `./config/initializers/sorcery.rb`
- `./db/migrate/[timestamp]_sorcery_core.rb`
- `./app/models/user.rb` 

```rb:./config/initializers/sorcery.rb
# ...
Rails.application.config.sorcery.submodules = []

# Here you can configure each submodule's features.
Rails.application.config.sorcery.configure do |config|
  # ...
  # --- user config ---
  config.user_config do |user|
    # ...
    user.stretches = 1 if Rails.env.test?
  end

  config.user_class = 'User'
end
```

```rb:./db/migrate/[timestamp]_sorcery_core.rb
class SorceryCore < ActiveRecord::Migration[5.2]
  def change
    create_table :users do |t|
      t.string :email,            :null => false
      t.string :crypted_password
      t.string :salt

      t.timestamps                :null => false
    end

    add_index :users, :email, unique: true
  end
end
```

```rb:./app/models/user.rb
class User < ApplicationRecord
  authenticates_with_sorcery!
end
```

### db:migrate

```bash
$ bin/rails db:migrate
== 20190513001622 SorceryCore: migrating ======================================
-- create_table(:users)
   -> 0.0107s
-- add_index(:users, :email, {:unique=>true})
   -> 0.0051s
== 20190513001622 SorceryCore: migrated (0.0159s) =============================
```

## コンソールからユーザーを作成

```rb
user = User.create(email: "hoge@example.com", password: "Password!123")
```
mac 「lib/libreadline.7.dylib (LoadError)」 の解決

`rails c` ってやると、 `libreadline` のロードエラーが発生する。

```
Library not loaded: /usr/local/opt/readline/lib/libreadline.7.dylib (LoadError)
  Referenced from: /Users/fukmaru/.rbenv/versions/2.5.1/lib/ruby/2.5.0/x86_64-darwin18/readline.bundle
  Reason: image not found - /Users/fukmaru/.rbenv/versions/2.5.1/lib/ruby/2.5.0/x86_64-darwin18/readline.bundle
```

### 環境

```
$ rails -v
Rails 5.2.3
$ brew -v 
Homebrew 2.1.2
$ ruby -v
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin18]
```

### 解決方法

調べてみると、 `libreadline` のバージョンが8になったことで、旧バージョン(7)のファイルがなくなったために参照できなくなってしまったようだ。

##### Rubyを再インストール

```bash
$ rbenv uninstall 2.5.1
$ rbenv install 2.5.1
```

解決できた。ちなみに、bundlerを再インストールする必要があります。

```
$ gem install bundler
$ bundle install
```

```
Traceback (most recent call last):
	2: from /Users/fukmaru/.rbenv/versions/2.5.1/bin/bundle:23:in `<main>'
	1: from /Users/fukmaru/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems.rb:308:in `activate_bin_path'
/Users/fukmaru/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems.rb:289:in `find_spec_for_exe': can't find gem bundler (>= 0.a) with executable bundle (Gem::GemNotFoundException)
```

ってエラーが出たら、

```text:./Gemfile.lock
BUNDLED WITH
   1.17.2
```

で指定してるbundlerのバージョンと異なることが原因なので、versionを指定してください。

```
$ gem install bundler -v 1.17.2
$ bundle install
```

解決:sunny:

**または、**

##### その場しのぎの解決
シンボリックリンクを作成することで対応。

```
ln -s /usr/local/opt/readline/lib/libreadline.dylib /usr/local/opt/readline/lib/libreadline.7.dylib
ln -s /usr/local/opt/readline/lib/libhistory.dylib /usr/local/opt/readline/lib/libhistory.7.dylib
```

とりあえず、動くようにはなる。
Gutenbergでブロックエディターが表示されないときにチェックすること

GutenbergのエディターがHTMLエディターしか表示されなくなった。
この場合、ユーザー設定からビジュアルリッチエディターの使用を許可しているかどうかをチェックすると解決する場合がある。
[![Screenshot from Gyazo](https://gyazo.com/e7449f21c4742f553a0a6a28bba0ab79/raw)](https://gyazo.com/e7449f21c4742f553a0a6a28bba0ab79)

- ユーザー>ユーザー一覧から各ユーザーの設定を開く。
- 「ビジュアルリッチエディターを使用しない」のチェックボックスをオフにする
[![Screenshot from Gyazo](https://gyazo.com/6a2eb39bc8218f9b0dbcd5b1f1416230/raw)](https://gyazo.com/6a2eb39bc8218f9b0dbcd5b1f1416230)
ソースコードに著者と年月日はいらないか

特定のgitでしか管理せず、ソースコードの改変は特定のgitでしか認めないのであれば、
著者名、作成年月日などをソースコードに入れる必要はない。
それでもなんらかの理由で持ち出す際に、著作権条項、著者、作成年月日を自動付加する仕組みがあればよい。

ソースコードを特定のgitから持ち出して、他で分岐してもいい著作権条項(license)の場合は、
持ち出す際に、著者と作成年月日情報を合わせて運ぶか、
ソースコードに著者と作成年月日を注釈として自動生成すればよいかもしれない。

投稿する人と、実際に書いた人が違う場合の取り扱いの仕方も仕組みがあるといいかも。
仕組みの一つとして、投稿する人以外の著作物の引用、参照は注釈で書くとか。
その場合に、大事なのは、著作権の発生日であり、編集日ではないことが肝心。

仕組みとやり方について、順次試して記録する予定。

p.s. 
版番号なども同様かも。

# 文書履歴(document history)
ver. 0.01 初稿 20190513 朝
ver. 0.02 著作権条項追記 20190513 午前
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
Rails6 のちょい足しな新機能を試す14（Array#extract!編）

# はじめに

Rails 6 に追加されそうな新機能を試す第14段。 今回のちょい足し機能は、 `Array#extract!` 編です。
Arrayから条件を満足する要素を取り除いて取り除かれた要素を配列として返す extract! メソッドが追加されました。

言葉で説明するとややこしいです。実際に試すとわかりやすいです。

記載時点では、Rails は 6.0.0.rc1 です。　`gem install rails --prerelease` でインストールできます。

```shell
$  rails --version
Rails 6.0.0.rc1
```

Ruby は、2.6.3 です。

```shell
$ ruby -v
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-linux-musl]
```

# irb を実行

ActiveSupport で追加されている機能なので、irb で試すことにします。

```irb
$ irb -ractive_support/core_ext
irb(main):001:0> ary = [1, 2, 3, 4, 5]
=> [1, 2, 3, 4, 5]
irb(main):002:0> even = ary.extract!{ |i| i.even? }
=> [2, 4]
irb(main):003:0> even
=> [2, 4]
irb(main):004:0> ary
=> [1, 3, 5] # <= 元の配列から偶数は取り除かれる！
```

ここで、注意したいポイントは、 `Array#extract!` を実行すると元の配列 ( `ary` ) も変わってしまうということです。
(メソッドの名前の最後に `!` がついていることから、元の配列を変えてしまういわゆる「破壊的メソッド」であることが想像できます。)

# Array#select (Array#filter) との違い

`Array#select` ( `Array#filter` ) は、ブロックの評価が真となる要素の配列を返しますが、元の配列は変わりません。

```irb
irb(main):008:0> ary = [1, 2, 3, 4, 5]
=> [1, 2, 3, 4, 5]
irb(main):009:0> even = ary.select{ |i| i.even? }
=> [2, 4]
irb(main):010:0> even
=> [2, 4]
irb(main):011:0> ary
=> [1, 2, 3, 4, 5] # <= 元の配列は変わらない。
```

# `Array#select!` ( `Array#filter!` ) との違い

`Array#select!` ( `Array#filter!` ) は、ブロックの評価が真となる要素の配列を返しますが、元の配列が返される配列と同じになります。

```irb
irb(main):012:0> ary = [1, 2, 3, 4, 5]
=> [1, 2, 3, 4, 5]
irb(main):013:0> even = ary.select!{ |i| i.even? }
=> [2, 4]
irb(main):014:0> ary
=> [2, 4] # <= 元の配列は変わる
irb(main):015:0> even.__id__ == ary.__id__
=> true # <= even と ary は同じもの
```

# Enumerable#Partition ~~Array#partition~~ との違い

Enumerable#partition ~~`Array#partition`~~ は、ブロックの評価が真となる要素の配列と偽となる要素の配列を返しますが、元の配列は変わりません。

```irb
irb(main):004:0> ary = [1, 2, 3, 4, 5]
=> [1, 2, 3, 4, 5]
irb(main):005:0> even, odd = ary.partition{ |i| i.even? }
=> [[2, 4], [1, 3, 5]]
irb(main):006:0> even
=> [2, 4]
irb(main):007:0> odd
=> [1, 3, 5]
irb(main):008:0> ary
=> [1, 2, 3, 4, 5]
```

# 参考情報

* [What is new in Rails 6.0](https://bogdanvlviv.com/posts/ruby/rails/what-is-new-in-rails-6_0.html)
* [Add `Array#extract!`](https://github.com/rails/rails/pull/33137)
AWS Batchのコンピューティング環境削除でCLIENT_ERROR - Access deniedで失敗する


AWS Batchのコンピューティング環境を削除できなかったのを対応したので作業内容をメモしておく。

# 発生現象

AWS Batchのコンピューティング環境を削除しようとするとステータスがDeleteingになってからInvalidになって削除できない。

# 原因

自分の環境の場合は以下の手順で現象が発生していた。

1. CloudFormationでAWS Batch環境を作成
2. デバッグ用にコンピューティング環境を手動で作成
3. CloudFormationのテンプレートを削除

3.の手順においてBatch管理用のServiceRoleが削除されて手動環境が管理(削除)できなくなる。

# 対応方法

参照：[AWS Developer Forums: Delete Compute Environment failed - ...](https://forums.aws.amazon.com/thread.jspa?threadID=293359)

1. コンピューティング環境のサービスロールを確認する。
2. 調べたロール名でサービスロールを作成する。
3. コンピューティング環境を削除する。
4. 作成したサービスロールを削除する。

ちなみに、CloudFormationで作成していたサービスロール名のパスがルート(/)以外であったのでマネージメントコンソールから作成する必要があった。
(この作業以外はすべてマネージメントコンソールで実行可能)
参照：[【AWS】IAM ロールのパスをルート(/)以外にする - Qiita](https://qiita.com/d_desuyon/items/4fba127ce566e909985d)

```
$ cat batch.json
{
    "Version": "2012-10-17",
    "Statement": [{
        "Effect": "Allow",
        "Principal": {"Service": "batch.amazonaws.com"},
        "Action": "sts:AssumeRole"
    }]
}

$ aws iam create-role --role-name  [サービスロール名]  --path /service-role/ --assume-role-policy-document file://batch.json
# この後AWSBatchServiceRoleポリシーをアタッチ
```
Linuxのパーミッションの確認を644とls -lでおさらいした

# Linuxのパーミッション確認おさらい

先日Linuxのパーミッションで600やls -lの読み方について話す機会があったので書いてみた。

## 644ってどう読むの？

|数字|権限|
|:--: | :--:|
|0|---| 
|1|--x|
|2|-w-|
|3|-wx|
|4|r--|
|5|r-x|
|6|rw-|
|7|rwx|

|アルファベット|英語|意味|
|:--: |:--:|:--:|
|r|read|読み取り可能|
|w|write|書き込み可能|
|x|exec|実行可能|

上の情報を踏まえて644を考えて見ましょう。

`ls -l`を叩くと644は`-rw-r--r--`になって…。
あれ！？なんか沢山あるぞ！？

## ls -lの読み方

```
-rw-r--r-- horikawa users ...略
```

現在のパーミッションを確認する時に`ls -l`や
エイリアスを設定して`ll`で見ることがよくあると思う。

そこで今回はパーミッションにフォーカスして読み直してみよう！

### 644 `-rw-r--r--`を分割して捉えよう。

実際に分割してみると
`-`と`rw-`と`r--`と`r--`になる。

コレを下記に説明していく。

#### ◯ ファイルタイプ `-`
先頭の`-`はファイルタイプで
「ディレクトリ`d`」か「リンクファイル`l`」か「通常ファイル`-`」と表記する。

つまり今回の`-rw-r--r--`は通常ファイルで有ることがわかる。
※644にこの情報は無い

#### ◯ 所有者 `rw-`
先頭から2番目の分割が所有者の権限を表しています。
また、その所有者は`-rw-r--r-- horikawa users ...略`の`horikawa`にあたります。

つまり、この通常ファイルの所有者である`horikawa`の権限は、
読み込み`r`と書き込み`w`が可能ということがわかります。

#### ◯ グループ `r--`
先頭から3番目の分割はグループの権限を表しています。
また、そのグループは`-rw-r--r-- horikawa users ...略`の`users`にあたります。

つまり、この通常ファイルの`users`グループのユーザーの権限は、
読み込み`r`が可能ということがわかります。

#### ◯ その他のユーザー `r--`
先頭から4番目の分割は所有者でもグループにも属さないその他のユーザーです。
現在は読み込み`r`が可能となっていますが、全ての権限が無い`---`にしてもいいと思います。

その場合は`644`を`640`に変えて上げると良いわけですね！

## おさらい「644」の読み方

644は、
所有者の権限が`rw-`で読み込みと書き込みが可能
グループのユーザーの権限が`r--`で読み込みが可能
その他のユーザーの権限が`r--`で読み込みが可能

といった具合です！
あ〜、もうこれTwitterに「◯◯完全に理解した！」って呟やいちゃお！笑

## 参考
- [【一通り理解】Linuxパーミッションの基本とその設定方法](https://eng-entrance.com/linux-permission-basic)
- [Linuxの権限確認と変更(chmod)（超初心者向け）](https://qiita.com/shisama/items/5f4c4fa768642aad9e06)
yarnの逆引き（用途からコマンドを見つける）的な記事

# この記事なに？ 🤔

npmパッケージ管理に`yarn`を使っていますが、
自分用に逆引き（用途からコマンドを見つける）記事が欲しかったので、
とりあえず作成しました。

書き留めておきたいと感じた時に順次追記していく予定です。

## この記事を一読してくださった方へ

- 「こんなのも書き留めておいた方が良いよ」
- 「それ、解釈間違ってるよ」

的なものがあればコメント等いただけると助かります。🙇‍♂️

# 前提（環境など）

以下の前提で記載していきます。

- macOS(High Sierra以上)
- [Homebrew](https://brew.sh/index_ja)でインストールした`yarn`を用いる

# 逆引きコマンド

以下から本題です。

## `yarn global`系

プロジェクトやワークスペース配下ではなくOS上のnpmパッケージを追加・更新・削除したい時に使う系のコマンドです。

### npmパッケージを追加・削除したい

`yarn global [add/remove] npmパッケージ名`で実現可能です。

OS上（`yarn global`）にインストールされた
npmパッケージの一覧を確認したい場合は、
`yarn global list`を用います。

基本的には、プロジェクトやワークスペース配下で実行するときの
`yarn`系コマンドに対して、`yarn`の後に`global`をつけることで
実行することが可能です。

詳しくは以下の公式ドキュメントを参考にしてください。

- [yarn global | Yarn](https://yarnpkg.com/ja/docs/cli/global)

## `yarn upgrade`系

npmパッケージを更新したい場合に使うコマンドです。

### `package.json`に記載されているバージョンを無視し、最新のnpmパッケージバージョンに更新したい

`yarn upgrade --latest`を使います。

npmパッケージのメジャーバージョンをあげたい場合など、
`yarn upgrade npmパッケージ名`では、
`package.json`に記載されたマイナーバージョンまでしか
更新されないことが多いです。

そのため、`package.json`に記載されているバージョンを無視し、
最新のnpmパッケージバージョンに更新したい場合は、
`yarn upgrade --latest`を使います。

詳しくは以下の公式ドキュメントを参考にしてください。

- [yarn upgrade | Yarn](https://yarnpkg.com/lang/ja/docs/cli/upgrade/)
WebGLで地形編集ツールを作る

UnityのTrrainのように、グレースケールを高さに置き換える方法を使えば、
2Dの地形図も簡単に作れるはず。

これをWebGLとシェーダーで作ってみた。
[DEMO] http://tashinoso.xyz/mapgen/

## つまり……
### これを、
![スクリーンショット 2019-05-11 13.39.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134740/d9569414-9af4-d33a-3112-88cbd0c27734.png)

### こうして……
![スクリーンショット 2019-05-12 22.33.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134740/8a4eb131-70a5-3359-11de-4d19b7c0f652.png)

### こうじゃ！
![anothermap_image (10).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134740/db0377a7-83b2-33fb-b0c2-2b0bf19db4cc.png)

## シェーダーの記述

```glsl
#define R_LUMINANCE 0.298912
#define G_LUMINANCE 0.586611
#define B_LUMINANCE 0.114478

precision mediump float;
varying vec2 vTextureCoord;
varying vec2 vFilterCoord;
uniform sampler2D uSampler;
uniform sampler2D uTex;

const vec3 monochromeScale = vec3(R_LUMINANCE, G_LUMINANCE, B_LUMINANCE);

void main(void) {
  vec4 color = texture2D(uSampler, vTextureCoord);
  float grayColor = dot(color.rgb, monochromeScale);

  vec4 color2 = texture2D(uTex, vec2(grayColor, 0.5));
  gl_FragColor = color2;
}
```

ほぼテンプレ通りのグレースケール変換シェーダー。

いじったのはこの部分だけ。

```glsl
  vec4 color2 = texture2D(uTex, vec2(grayColor, 0.5));
  gl_FragColor = color2;
```

グレースケール値 = X軸の値として、
高度カラー用のテクスチャ画像から、出力カラーを抽出している。
![スクリーンショット 2019-05-12 22.33.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134740/8a4eb131-70a5-3359-11de-4d19b7c0f652.png)



狙い通り、左の画像にこのシェーダーでフィルタをかけると、
地図(地形図)状に描画された。

![スクリーンショット 2019-05-12 22.41.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134740/3fad020e-09d5-e7e1-a81c-e1bb8fbbfd2c.png)


# 編集ツール化への道

シェーダー部分はあっさり済んだものの、これを編集ツール化する過程でいくつか悩んだ。

## canvasを２つ重ねている
ベースになるグレースケール画像を編集する方法は、
黒と白のブラシ画像を用意して、ベースに重ねて描画していけば簡単に済む。

ただ、この編集中のcanvasにシェーダーを反映する方法が分からなくて、結局、
canvasAで編集 → canbasBにテクスチャとして読込むという方法を取っている。

今のcanvasが２つある状態は、いかにも鈍臭いと思っているのだが、さてどうしたものか。

## ブラシの反映が遅い
canvasAで編集、canvasBにテクスチャ読込、という流れになっているため、
ブラシドラッグ時の連続更新が、canvasBに反映されるのが遅い。
遅いので、今はドラッグ終了時にcanvasBに反映されるように制限している。
canvasAを表示してみると、なめらかにブラシが描画されているのだが。

## ベースとなるノイズ画像の自動生成を諦めた
地図用に欲しいのは、Photoshopの「雲模様」で作る画像。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134740/dc8298b2-e096-f118-4c36-38231c6dfc82.png)


パーリンノイズを使えば、こういうノイズ画像を作れるらしいのだが、
求めている画像を生成できなかったので、ひとまず諦めた。
（ヘビがのたくったような画像になる）

代わりにPhotoshopのバッチ処理で30枚ほど画像を用意した。

## Three.js を諦めて Pixi.js へ
シェーダーを作る際に、高度カラー用のテクスチャ画像を詠込む箇所が上手くいかず、
やむなく Pixi.js に乗り換えた。
なんでだったんだろ？

# ソースコード

ソースコード一式、画像も含めて置いております。
https://github.com/tashinoso/another-map

MITライセンスということにしていますので、好きに使ってください。

たぶん、今回一番難しかったのは、コードを書くことよりも、
高さ用のカラーとか、ちょうどいいブラシ画像を作るのに試行錯誤することだったと思うので。
VeeValidateでのバリデーションとSubmitボタン制御について

[VeeValidate](https://baianat.github.io/vee-validate/) を使ってバリデーションをしていくにあたり以下の2点で悩んだのでちょっと書いておきます。

- 全パラメータがバリデーションOKになるまでSubmitボタンを押せなくする
- Submitボタンを押したら2重クリック防止のためにボタンをロック（とか）する



後者はあまりVeeValidateとは関係のない話ですが、ついでです。



## 全パラメータがバリデーションOKになるまでSubmitボタンを押せなくする

```html
<template>
<!-- なんかいろいろなフォーム定義 -->
  <span>
    <div v-if="displayButtons" class="field is-grouped">
      <div class="control">
        <button
          class="button is-info"
          :disabled="errors.any() || !isFormCompleted"
          @click="submitSomething"
        >
          Submit
        </button>
      </div>
    </div>
    <div v-else>
      <loading-for-submit /> <!-- ここは後で説明 -->
    </div>
  </span>

</template>

<script>
import LoadingForSubmit from '~/components/LoadingForSubmit'

export default {
  components: {
    LoadingForSubmit, // <-- ここは後で説明
  },
  data() {
    return {
      displayButtons: true,
    }
  },
  computed: {
    isFormCompleted: function() {
      if (
        !this.model.param1 ||
        !this.model.param2 ||
        !this.model.param3
      ) {
        return false
      }
      return true
    },
  },
  methods: {
    submitSomething: async function() {
      this.displayButtons = false
      // あとはなにかここで処理
      // 画面を遷移しないなら最後にthis.displayButtonsをtrueに戻しておく
    },
  },
}
</script>
```

骨子は、

- ``isFormCompleted`` で、フォームの入力が完了しているかどうかを判断する
- ``errors.any()`` で、フォームのバリデーションNGな状況がないかを判断する

の2点。



## Submitボタンを押したら2重クリック防止のためにボタンをロック（とか）する

こちらはVeeValidateとは直接関係がないのですが、自分はこんな感じにしてます。



まず上記のコード内で出てきた、``LoadingForSubmit`` というのがこんなコンポーネントになってます。

Bulma.js使ってるんでprogressとかのタグはそちらをご参照ください。

```html
<template>
  <div class="fa-1x">
    Sending ...
    <progress class="progress is-large is-link" max="50">60%</progress>
  </div>
</template>
```

このコンポーネントはプログレスバーが永遠に左から右に動き続けるという動作をするだけなんですが、その表示を ``v-if="displayButtons"`` で切り替えているだけです。

- Submit前；`displayButtons = false` なのでSubmitボタンが表示されている
- Submit直後：`displayButtons = true` にすることで、v-ifが反転してボタンが表示されなくなり、代わりにプログレスバーが表示される



こちらは ``:disabled`` とかするだけでもいいと思います。

というか、直接関係ない内容ではあるのですが、同時に考えたくなりそうな内容だったので1つ目の話題の近くにおいてみました。
React Nativeで新しいビルドシステムを使いたい

CocoaPodsを使っているReact Nativeプロジェクトで、Multiple commands produceというエラーが出てXcode上でプロジェクトのビルドができない時がある。
https://github.com/facebook/react-native/issues/20492
ここに書いてあるとおり、

```ruby
  post_install do |installer|
    installer.pods_project.targets.each do |target|

      # The following is needed to ensure the "archive" step works in XCode.
      # It removes React & Yoga from the Pods project, as it is already included in the main project.
      # Without this, you'd see errors when you archive like:
      # "Multiple commands produce ... libReact.a"
      # "Multiple commands produce ... libyoga.a"

      targets_to_ignore = %w(React yoga)
      
      if targets_to_ignore.include? target.name
        target.remove_from_project
      end

    end
  end
```

この行をPodfileに追加したら動くようになった。

```bash
pod install
```

も忘れずに。
Word2Vecをお手軽にためす


参考

* [How to get started with Word2Vec — and then how to make it work](https://medium.freecodecamp.org/how-to-get-started-with-word2vec-and-then-how-to-make-it-work-d0a2fca9dad3)
* [Word2vec Tutorial](https://rare-technologies.com/word2vec-tutorial/)
* [Distributed Representations of Words and Phrases
and their Compositionality(PDF)](https://papers.nips.cc/paper/5021-distributed-representations-of-words-and-phrases-and-their-compositionality.pdf)

クラス

* 70000件でbreakしているのは、メモリが1GBを超えるとつらい環境でやっているため。

```python:a
import gensim
import gzip


class MyWord2vec:

    def read_input(input_file):
        with gzip.open(input_file, 'rb') as f:
            for i, line in enumerate(f):
                if i % 1000 == 0:
                    print("read {0} reviews".format(i))
                if i % 70000 == 0 and i != 0:
                    break
                yield gensim.utils.simple_preprocess(line)
```

事前準備

* kavganさんのGitHubにホテルのレビュー何万件をgzに固めたものがあるので、それを手元に置いておく。
    * https://github.com/kavgan/nlp-in-practice/blob/master/word2vec/reviews_data.txt.gz

create model

```python
from a import MyWord2vec
mv2 = MyWord2vec
input_file = './reviews_data.txt.gz'
documents = list(mv2.read_input(input_file))
model = gensim.models.Word2Vec(
    documents,
    size=150,
    window=10,
    min_count=2,
    workers=10,
    iter=10)
```

play

```
v1 = "dirty"
model.wv.most_similar(positive=v1)
```
【視聴メモ】 Anatomy of a Web Media Experience (Google I/O ’19)

この記事は Google I/O '19 のセッションの視聴メモです。
想定読者は自分なので正確性や網羅率には問題があるかもしれません。

---

## References

https://www.youtube.com/watch?v=lXm6jOQLe1Y&list=PLNYkxOF6rcIATmAmz7HcCzongGvQEtx8i&index=6

Speaker(s): Amy Roberts, Sandra Lokshina

## Abstract

Chromeにおけるネイティブのメディアコントロールはあるインサイトに基づいて刷新されました。このセッションではその知見とShaka playerにおいて使用されているUIライブラリについて学ぶことができます。

## Contents

> Chromeが使われる時間の3分の1はメディア再生が伴われている

ユーザーはメディアに接するのは主に3つの方法のどれかである

* Immersively - 完全にコンテンツに集中する場合
* Transiently - 耳だけで聞くような場合
* Ambiently - 作業のバックグラウンドで再生するような場合

> Chromeでは60%の音声再生がバックグラウンドで行われている

> 頻繁なタスクスイッチは人間の思考を最大で40％遅くする

メールを書いているときにバックグラウンド再生している曲の歌詞が気になってしょうがなくなってしまったときなど

### MediaSessionAPI

* キーボードのメディアコントロール入力をChromeに伝達するためのAPI
* 現状ではSpotifyが対応している

### Picture in Picture

* テンセントのサービスがこれに対応したところ16％の視聴時間の増加と16％の`completion rate`の増加が得られた
* Picture in Picture でも一時停止やミュートなどのメティアコントロールが実装された
* モバイルにおけるメディアコントロールの改善
    * 再生ボタンの巨大化やシークバーの長大化

* 新しいメディアコントロールは全体的にYouTubeのUIを参考に再設計された

下図はデザインの候補

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3387/990fc328-4e21-d77b-68d4-b2d3e2f7e20b.png)

* 「Chrome 67のメディアコントロールは最悪だ」とか言われていたらしい
    * 可愛そう…
* 最悪なポイントが3つあった
    1. 画面中央にある再生停止ボタンがビデオコンテンツの邪魔だし他のコントロールから離れすぎている
    2. ボリュームボタンがOn/Offのトグルになってしまい、音量を再生できなくなった
    3. ダウンロードボタンがメニューの唯一のコンテンツとなってしまっている
        * クリック回数が増えるし場所の無駄

### Shaka Player

* Shaka Player はメディア再生を行うためのJSライブラリ
    * ABR / PWA / Offline / Chromecast / Shaka Embedded などの特徴がある
    * ABR: Adaptive Bitrate Streaming の略でネットワークの速度に応じた最適な解像度の動画を再生できる
    * PWA: PWA対応してますよ
    * Offline: 動画をダウンロードしておいて再生できる
    * Chromecast: 対応してるよ
    * Shaka Embedded: C++使えるよ
* サッカーワールドカップの動画配信で130万人の同時視聴にも使われた
* 1日に870万人が利用する
* GhanaはShakaのPWAをオフラインサポートのために取り入れたところセッションタイムが1.5倍に増えた
* ほぼYouTubeと同じことができるという理解でOK? 
* メディアコントロールのレイアウトをカスタマイズすることもできる
* 「購入ボタン」を追加したりもできる
    * これはイイね
* UI Elementを継承することで見た目と動作のカスタマイズができる
    * ちょっとキモいかも
* 5670万人のアメリカ人が何らかの形で障害を抱えている
    * これはスイスの人工の7倍
        * 暗に小国に対応するぐらいならdisability抱えた人のためにアクセシビリティ上げたほうが良いよと言っている
    * 視覚障害・聴覚障害と比べるために更に香港とニュージーランドが引き合いに出される
    * つまり下手にアクセシビリティ上げるより日本語対応したほうが良いよってこと………？？？
    * 視覚に頼らない操作を可能にすることはドライバーにとっても役に立つので、単に障害を抱えた人のためだけというわけではないよ
* Shaka Player はキーボードナビゲーション・スクリーンリーダー・カスタムボタンにアクセスするためのチュートリアルに対応してるよ
* ローカリゼーションにも力を入れてるよ
* 今後は次の要素に力をいれていくよ
    * Ad controls
    * Extending HLS support
    * Media Capabilitiers
    * Codec switching

## Memo

* なんとなく受け入れていたメディアコントロールのデザインがこれだけいろいろなことを考慮して考えられていたとは（小並感）
* Shaka Player 使ってみるか
【React】<Text val="hello"/>が32回も再描画されたわけ

たとえばAtomic Designを採用してこんなシンプルなコンポーネントを作ったとします

```jsx

const Text = (props) => <p>{props.val}</p>
```

そして、プログレスバーを表示するコンポーネントと同じコンポーネントに置きます

```jsx
class Progress React.Component {
  render(){
    return (
      <React.Fragment>
        ...
          <Text val="処理中です" />
          <ProgressBar percent={this.props.percent} />
        ...
      </React.Fragment>
    )
  }
}
```

“処理中です” という文字とプログレスバーが表示されます。
意図通りに動いてくれます。
なにも問題なさそうに見えます

しかし、このコードだと this.props.percent が変更されるたびに
`Progress` や `ProgressBar` だけでなく、***`Text` も再描画されます。***
this.props.percentが32回変更された場合には `"処理中です"` という ***文字列しか渡していない `Text` も32回再描画されます***。

同じように、親やさらにその上のコンポーネントが更新されると、子・孫・曾孫・玄孫にあたる `Text` もrenderが走ってしまうわけですね

「ん？ まって。なんで同じpropsを渡してrenderされるの・・・？」

確かに、同じpropsを渡しているならrenderなんて走らなくていいはず。
ましてや渡しているのはただの文字列。
なんで同じ文字列でrenderしちゃってるのでしょう。

#同じ文字列で何度もrenderされる理由

ここで、Textがどんなpropsを受け取ってるのか見てみましょう

```js
{ val: "処理中です" }
```

さて、this.props.percent が変更されました。
次に受け取るpropsはこんな感じ。

```js
{ val: "処理中です" }
```

ここで、F12を押して開発者ツールのコンソールの中に、以下をコピペしてEnterを押してみてください

```js
{ val: "処理中です" } === { val: "処理中です" }
```

そうすると、こうなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26383/6ebfd00d-8c7c-8de8-8f87-bcd1cf746a1d.png)


JavaScriptだと `{ val: "処理中です" }` と `{ val: "処理中です" }` は別のものとして認識されてしまいます。
オブジェクト同士を比較するときに同一のインスタンスかどうかで判断するため、falseが返ります。
***渡されたpropsが前に渡されたものと異なるオブジェクト → じゃあ、またrenderしなきゃ*** ってなってるわけです。

や、待ってくれ。私がしてほしいのは

```js
{ val: "処理中です" } === { val: "処理中です" }
```
ではなく

```js
val === val
```
だ。 ちゃんと中身を見て、同じかどうか判別してほしい。
え、これどうしたら無駄なrender防げるの・・・？

# 解決法

そんな人のために ***`React.memo`*** と ***`React.PureComponent`*** が用意されました。
Reactの16.6以降のバージョンなら両方使えるようになっています。

使い方は簡単
React.memoは

```jsx
const Text = (props) => <p>{props.val}</p>
```
↓

```jsx
const Text = React.memo((props) => <p>{props.val}</p>)
```

React.PureComponent は

```jsx
class Progress React.Component {
  render(){
    ...
  }
}
```
↓

```jsx
class Progress React.PureComponent {
  render(){
    ...
  }
}
```

とするだけ。

そうすると

```js
{ val: "処理中です" } === { val: "処理中です" }
```
ではなく

```js
val === val
```
で比較してくれるようになります。

やったね！


# 気を付けないといけないこと

で、終わってくれればいいんですが、`React.memo` と `React.PureComponent` にも問題点はあります。

```js
{ val: "処理中です" } === { val: "処理中です" }
```
を

```js
val === val
```
にするということは、propsをたくさん渡すコンポーネントの場合、

```js
{ v1:"a", v2: "b", ..., v1000: "zzz" } === { v1:"a", v2: "b", ..., v1000: "zzz" }
```
を

```js
v1 === v1
v2 === v2
...
v1000 === v1000
```
といちいち展開して比較して、ってやってしまうわけです。
うっかりすると、renderするコストよりも比較するコストの方が重くなったりするので、
適宜計測して、どちらがよりコストが低いかを見ておいてください。

また、比較してくれるのは1段目だけです。

```jsx
<Text val="処理中です" style={{ color:"red" }} />
```
とかしてしまうと、propsは

```js
{ val: "処理中です", style: { color:"red" } }
```
となって

```js
val === val // true
{ color:"red" } === { color:"red" } // false
```
という比較になり、どこかで変更があるたびに再度renderされてしまいますのでご注意を。


# 無駄にrenderされていないかを知るためには

`why-did-you-render` というライブラリがオススメ。
https://github.com/welldone-software/why-did-you-render

無駄にrenderされている場合にconsoleへ表示してくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26383/b4b51b09-ded1-c84b-1552-2748f14e2104.png)

導入も簡単なので、試してみてください。
scriptタグの内部でnuxt-linkと同じ操作を行いたいような場合

``<nuxt-link>`` タグを使えない場所でそれ相当の画面遷移をさせたい場合どうやるんだろう・・・とふと悩んだので書いておく。

Single file componentのscriptタグとかからやりたいようなケースですね。



実際動くので多分これであっていると思うのですが。。

```html
<script>
  methods: {
    doSomething() {
			this.$route.push({ path: 'XXXX' })
    }
  }
</script>
```



さらに、vue-i18nとかを使っていて、localePathを使わないとだめな場合、

```html
<script>
  methods: {
    doSomething() {
			this.$route.push({ localePath: 'XXXX' })
    }
  }
</script>
```

とすればOK。
#Qiita 生活5年間で初めて記事削除 ( 限定公開への変更 ) を受けた件 

# 皆様、ガイドラインを守りましょう。

- プログラミングに関係のない記事を書かないようにしましょう。
- UI / UX の記事とかもだめかも知れません。あくまでもQiitaはプログラミングの技術共有サービスです。


# 公開していた記事タイトル

>Qiita jobs ついにサービス開始！ でも一瞬で登録挫折した件。 #就職 #転職 #UI #UX

- Qiita jobs をきっかけに UI / UX の話を書いていましたが、ダメだったみたいです。
- Qiitaにはプログラミングに直接関係ない記事もわりと膨大にある気もするのですが、 今回トリガーになった理由は謎です。( 対象がQiita jobs だったからという理由はたぶん関係ないと思います。 )

# 通知内容

```
YumaInauraさま

いつもQiitaをご利用いただき誠にありがとうございます。

ご投稿いただいた"#Qiita jobs ついにサービス開始！ でも一瞬で登録挫折した件。 #就職 #転職 #UI #UX"でございますが、
プログラミングとは関係の無い記事と判断し、
限定公開とさせていただきました。
※限定公開とは、投稿者本人及びURLを知っているユーザーのみ
   アクセスすることができる状態です。

Qiitaコミュニティ・ガイドライン を確認の上、内容を修正して再度公開していただくようお願いいたします。

記事を編集する

Qiitaは「プログラマの誰もが楽しくプログラムを書いて、
いろんなモノを生み出すことができる世界」
を実現するために、プログラマ一人一人の知識を共有するサービスです。
次はぜひYumaInauraさまがお持ちの
プログラミングに関する知識をご投稿ください :)
```

# この記事は？

- プログラミングについて書いていないのでガイドライン違反かもしれません。
- 「Qiitaのガイドラインを守ろう」という趣旨の記事がガイドラインになる場合は、この記事も削除されると思いますので、ガイドライン関係の記事も書かないようにしましょう。
- 削除される記事/されない記事の区別はあくまで運営判断なので、結果的に削除された記事から規則性を見つけて、僕らユーザーが微妙な審判判断のラインを見極めていってはどうでしょうか。









<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
UnityのPreview（プレビュー）機能一覧（2019年5月にまとめ）


# はじめに

*こんにちは、のんびりエンジニアのたっつーです。*
*[ブログ](https://www.fast-system.jp/)を運営しているのでよろしければ見てください。*

今回は、Unityでまだ***正式に組み込まれていない機能（Package）***を知りたかったので Unity プレビュー版のパッケージをまとめてみました。

それでは以下に適当に書き出してみます。
大まかに把握してもらえればの多少の読みにくい記事でも問題無いかなと思いますのでご了承ください。

# プレビュー版の機能一覧

***・2D Animation***
　Anime2Dみたいな事ができる

***・Vector Graphics***
　SVGファイルのインポーター

***・HD レンダーパイプライン***
（みんな大好き、HDRP！！）

***・Adaptive Performance***
（モバイル環境でパフォーマンスを最大限にするシステム）

***・Addressables System（[使い方](https://www.fast-system.jp/unity%ef%bc%9aaddressable-assets-system-%e3%82%92-webgl-%e3%81%a7%e4%bd%bf%e3%81%a3%e3%81%a6%e3%81%bf%e3%81%9f%e3%80%82/)）***
（AssetBundleの代わり）

***・AI Planner***
（ゲーム作成を補助してくる秘書みたいなもん？）

***・AR Fundation***
（ARCore・ARKitとかを隠蔽している、今後増えてもいい感じに対応してくれそう）

***・JobSystem／ECS***
（プログラマが頑張るとハイパフォーマンスになるやつ）

***・FBXエクスポーター***

***・Film and TV Toolbox***
（？）

***・Immediate Window***
（ランタイムで実行できるコンソール？）

***・新しいProfiler***
（メモリProfilerが見やすくなる）

***・Mobile Notifications***
（モバイルでPush通知）

***・Polybrush***
（メッシュ・テクスチャをペイント、装飾できる）

***・ProGrids（[使い方](https://www.fast-system.jp/unity-asset-progrids/)）***
（オブジェクトの配置がグリッドにスナップできる）

***・Quick Search（[使い方](https://www.fast-system.jp/unity-quick-search-howto/)）***
（Unityのすべての要素が検索できる）

***・Tiny Mode***
（Unity軽量ランタイム実装）

***・Unity Physics***
（新しい物理エンジン）

***・Unity Recorder***
（実行した結果をキャプチャして保存する）

***・USD（Universal Scene Description）***
（？）

# Twitter

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">UnityのPreview機能まとめ！<br><br>・2D Animation（Anime2Dみたいな事ができる）<br>・Addressables System（AssetBundleの新しい）<br>・AR Fundation（ARCore・ARKitとかを隠蔽してくれる）<br>・JobSystem・ECS（PGが頑張ると高速になる）<br>・Unity Physics（物理エンジン）<br><br>↓その他<a href="https://t.co/4FbEnad76L">https://t.co/4FbEnad76L</a></p>&mdash; たっつー@Unity情報発信 (@kingyo222) <a href="https://twitter.com/kingyo222/status/1126054291968446464?ref_src=twsrc%5Etfw">2019年5月8日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 終わりに

*よければ ブログ「[初心者向けUnity情報サイト](https://www.fast-system.jp/)」の方にも色々記載しているのでぜひご参照いただければと思います。*
実は知らない！？ヒエラルキービューの便利な使い方

# はじめに

*こんにちは、のんびりエンジニアのたっつーです。*
*[ブログ](https://www.fast-system.jp/)を運営しているのでよろしければ見てください。*

unityを扱うと絶対に使う画面、***Hierarchyビュー***ですね。
***使う頻度が多い画面こそ使い方を知っておく***と開発効率が上がると思います、そのため今回は Hierarchyビューを色々まとめてみました。

# Hierarchyとは？

Unityを起動した時に表示される、以下の画面領域です。

![image-39-768x572.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227880/f7925dac-1304-6bec-3154-7bbbc78f4c0a.png)

## Hierarchyで何ができるのか？

Hierarchyビューでは何ができるのかと言うと、簡単に言うと特定シーンファイルのオブジェクト構造をツリーで表示して追加・編集できる画面になります。

- ３Dモデルを追加・削除できる。
- ３Dモデルにスクリプト・マテリアルなどをアタッチできる。
- シーンを開いて編集できる。
   - 複数のシーンも同時に扱える。

# 他ビューとの関係

[ブログの記事](https://www.fast-system.jp/unity-hierarchy-howto/)をご参照ください。

# Hierarchyの基本的な使い方

[ブログの記事](https://www.fast-system.jp/unity-hierarchy-howto/)をご参照ください。

# Hierarchyの便利な使い方

筆者が***便利な使い方***と思った機能を色々とご紹介させていただきます。

## 複数のシーンを配置する

Projectウィンドウから、HierarchyにSceneをドラッグアンドロップすると、複数のシーンを同時に編集できるようになります。

![hierarchy-mouse3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227880/d5ad8a38-0716-c6b4-1072-be0d2f26dc3a.gif)

## Sceneに対して一括で表示・非表示をする

Unity2019からはHierarchyに、表示のON/OFFが追加されました。（目のマークです）

使い方は簡単です、HierarchyビューでON/OFFをしたいモデルにマークを付けます。
次に、シーンビューのアイコンをON/OFFすると、表示・非表示が切り替えられます。

![visible-hidden-toggle.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227880/34caf37a-bbe2-3334-9bbc-2ecd190aa84f.gif)

## 表示順序をアルファベット順にする

Hierarchyビューの表示順番（ソート）をアルファベット順にするには、Preferencesウィンドウから ***Enable Alpha Numeric Sorting にチェック*** を付けてください。

![image-52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227880/b16c3c81-dae5-1182-226e-097e5d774abe.png)

Hierarchy のメニューから、***Alphabetical Sorting を選択***すると
オブジェクトが名前順で表示されるようになります。

![image-53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227880/f74add82-f3de-8fda-b167-861c6ce9e3cf.png)

# 終わりに

*よければ ブログ「[初心者向けUnity情報サイト](https://www.fast-system.jp/)」の方にも色々記載しているのでぜひご参照いただければと思います。*
Unity：出力されたログのファイルを開く

# はじめに

*こんにちは、のんびりエンジニアのたっつーです。*
*[ブログ](https://www.fast-system.jp/)を運営しているのでよろしければ見てください。*

Unityのコンソールウィンドウを右クリックメニューから「Open Editor Log」を選択することにより、ログファイルを開くことができます。

![image-98-300x227.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227880/bd6d9453-5dc2-c2fd-2fb2-8e7620150f65.png)

# コンソール画面

以下のようなログが出力されていた場合、ファイルはこのように出力されます。

![image-97.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227880/cc66a0a8-985f-f301-79cf-6ec8b714556e.png)

# ログファイルの内容

```bash
Info
UnityEngine.DebugLogHandler:Internal_Log(LogType, String, Object)
UnityEngine.DebugLogHandler:LogFormat(LogType, Object, String, Object[])
UnityEngine.Logger:Log(LogType, Object)
UnityEngine.Debug:Log(Object)
TestLog:Start() (at Assets\TestLog.cs:9)
 
(Filename: Assets/TestLog.cs Line: 9)

Warning
UnityEngine.DebugLogHandler:Internal_Log(LogType, String, Object)
UnityEngine.DebugLogHandler:LogFormat(LogType, Object, String, Object[])
UnityEngine.Logger:Log(LogType, Object)
UnityEngine.Debug:LogWarning(Object)
TestLog:Start() (at Assets\TestLog.cs:10)
 
(Filename: Assets/TestLog.cs Line: 10)

Error
UnityEngine.DebugLogHandler:Internal_Log(LogType, String, Object)
UnityEngine.DebugLogHandler:LogFormat(LogType, Object, String, Object[])
UnityEngine.Logger:Log(LogType, Object)
UnityEngine.Debug:LogError(Object)
TestLog:Start() (at Assets\TestLog.cs:11)
```

# 終わりに

*よければ ブログ「[初心者向けUnity情報サイト](https://www.fast-system.jp/)」の方にも色々記載しているのでぜひご参照いただければと思います。*
実は知らない！？Sceneビューの便利な機能


# はじめに

*こんにちは、のんびりエンジニアのたっつーです。*
*[ブログ](https://www.fast-system.jp/)を運営しているのでよろしければ見てください。*

Unityを扱うと絶対に使う画面、***Sceneビュー***ですね。
***使う頻度が多い画面こそ使い方を知っておく***と開発効率が上がると思います、そのため今回は Sceneビューを色々まとめてみました。

# Sceneとは？

Unityを起動した時に表示される、以下の画面領域です。

![image-768x558.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227880/93e04cce-0e3a-e202-8018-dbd86a5fbd4b.png)

## Sceneで何ができるのか？

Sceneビューでは何ができるのかと言うと、簡単に言うと見た目の要素を構築・編集画面になります。

- Sceneを画面毎に作成できるのでモデル・スクリプトの管理が楽。
- ３Dモデルを追加・削除できる。
- ３Dモデルの位置・回転・スケールを変更できる。
- ３Dモデルにスクリプト・マテリアルなどをアタッチできる。

# 他のビューとの関係

[ブログの記事](https://www.fast-system.jp/unity-scene/)に詳細を記載しています。

# Sceneの基本的な使い方

[ブログの記事](https://www.fast-system.jp/unity-scene/)に詳細を記載しています。

# Sceneの便利な使い方

## Sceneを４画面分割で表示

Layoutの表示切替で***「4 Split」***を選択します。

![image-22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227880/077adb0a-39e6-f932-cb16-88918c43a1d4.png)

すると、Sceneの表示が***上／左／正面／斜め***からの４分割でSceneの表示が行えます。

![image-23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227880/396e24bd-536e-5d37-e055-61d86ccdacf4.png)

# ALT + 左クリック

視点の先を中心に回転が行えます。
***対象のモデルの側面・背面などを見たいときなどに便利***です。

![scene-mouse10.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227880/30bbec7d-3b95-aee8-7f96-66bd66e05b49.gif)

# 対象のみ非表示にできる

Unity 2019 から、Hierarchyウィンドウに表示・非表示のオブジェクトが追加できるようになりました。これを設定すると、Sceneの表示・非表示がワンクリックで切り替えられるようになりました。

![image-12-768x319.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227880/62352f63-e823-705d-a734-63eb6d1939a5.png)

ON/OFFを切り替えると、目マークを付けたオブジェクトの表示・非表示が切り替えられるようになります。

![image-13-768x293.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227880/21878280-dfe0-ecdb-2879-0d159547750d.png)

# 終わりに

*よければ ブログ「[初心者向けUnity情報サイト](https://www.fast-system.jp/)」の方にも色々記載しているのでぜひご参照いただければと思います。*
Craft CMS （twig）でテンプレートに独自フィルタを追加する（参考リンク）

Twig だと変換処理は用意されているものを使うしかないので、何かやるとなるとフィルタを作るとかになる（らしい）。

Twig 入門書 | Craft 3 ドキュメント
https://docs.craftcms.com/v3/ja/dev/twig-primer.html#%E3%83%95%E3%82%A1%E3%83%B3%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3

やりたかったのはこんな感じでISBNをASINに変換するって話。

> PHPでISBNコードをASINコードに変換する
> https://www.pahoo.org/e-soul/webtech/php02/php02-34-01.shtm

@BUN に教えてもらった参考はTwig フィルタで MD5 に変換するプラグイン

https://github.com/steadfast-collective/md5twigfilter

この辺も参考になるのかな。

* テンプレートエンジンTwigに自作フィルタを追加する｜プログラムメモ  
https://pgmemo.tokyo/data/archives/955.html
* Twigで独自の関数を使えるようにする - Qiita  
https://qiita.com/atwata/items/d486bd26495b5a5580df

ただ、ASINに変更しても解決しなさそうってことなので、一旦忘れないようにメモしておく。
Desktop : OpenCV manual a take picture

<H5>Goal</H5>
Manually capture webcam preview and save to folder.

```TakeAPictureManual.java
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.videoio.VideoCapture;

public class TakeAPictureManual {

	static {
		System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
	}
	
	public static void main(String[] args) {
		VideoCapture camera = new VideoCapture();
		camera.open(0);
		JFrame frame1 = new JFrame("Show image");
		frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame1.setTitle("從 webcam 讀取影像到 Java swing 視窗");
		frame1.setSize(600,480);
		frame1.setBounds(0,0,frame1.getWidth(),frame1.getHeight());
		Panel panel1 = new Panel();
		frame1.setContentPane(panel1);
		frame1.setVisible(true);
		
		JButton btnCapture = new JButton("拍 照");
		btnCapture.setEnabled(false);
		btnCapture.setBounds(680,97,87,23);
		frame1.getContentPane().add(btnCapture);
		
		if(camera.isOpened()) {
			final Mat webcam_preview = new Mat();
			camera.read(webcam_preview);
			frame1.setSize(webcam_preview.width()+50,webcam_preview.height()+70);
			btnCapture.setEnabled(true);
			btnCapture.addActionListener(new ActionListener() {
				
				@Override
				public void actionPerformed(ActionEvent e) {
					Imgcodecs.imwrite("D:\\projects\\Java\\OpenCV_Samples\\resource\\imgs\\manual_take_webcam_frame.jpg",webcam_preview);
					System.out.println("手動觸發拍照");
				}
			});
			
			while (true) {
				
				try {
					camera.read(webcam_preview);
					Thread.sleep(500);
					camera.read(webcam_preview);
					Thread.sleep(500);
					camera.read(webcam_preview);
					Thread.sleep(500);
				} catch (InterruptedException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
				
			
				System.out.println("使用攝影機拍照");
				panel1.setimagewithMat(webcam_preview);
				frame1.repaint();
			}
			
		}else {
			System.out.println("Error");
		}
		
		
	}

}

```
<h5>Reault</h5>
![manual_take_webcam_frame.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276243/4d2d58d3-911f-73ce-1529-f8898655adf6.jpeg)
[deprecated] VSCode Insiders で最高の作業環境が出来上がる話

## 追記 2020/05/08

この記事を書いたことをすっかり忘れていたのですが，現在はInsidersバージョンじゃなくても普通にRemote Development使えるようになっていますね．
Insidersはたまにバグに悩まされることもあるので，今から使うならstableを使うほうがいいと思います．

あとタイトルですが，InsiderじゃなくてInsidersですね．さっき気が付きました．

## これはなに
現在夜中の3時です．完全に深夜テンションで書いてます．

僕は普段VSCodeをIDE代わりに使って書き書きしているのですが，たとえばローカルに存在していないライブラリをDockerコンテナの中だけで使っているとシンタックスエラーが表示されたりするんですね．
エラーじゃないとわかりつつも気持ち悪いですよね...

そこに出てきたRemote Development:sparkles::sparkles:
これを使えばこの気持ち悪い状況を抜け出せるのではないかと突然思い立って試してみました．

(勢いだけで書いています．わかりやすい画像とか付けてないのは許してヒヤシンス...)

## どうやるの

### 下準備
Dockerがローカルに入っていない方は入れておきましょう．
VirtualBoxで立てた環境にSSH接続とかでもいけるとは思いますが試してないです...それはまた今度やってみます．

既出の記事がいっぱいあるのですが，VSCodeはちゃんとInsiderバージョンを入れましょう．
僕の環境はUbuntu 18.04なので.debパッケージからインストールしました．
既存のバージョンは残したままで大丈夫です．というか残しておくと一部設定を引き継いでくれます．
僕の場合はDockerHubのアカウント情報を引き継いでおいてくれました．出来る子．
インストーラーは[こちら](https://code.visualstudio.com/insiders/)

VSCode Insiderが無事インストールできたら，早速拡張機能を入れていきましょう．
とりあえず入れておくべきなのは，`Remote Development`と`Docker`です．両方ともMicrosoftが出している公式の拡張機能です．

### 実際に使ってみる
ここからは，
- Dockerfile / docker-compose.yml が既にある場合
- Dockerfile / docker-compose.yml が無い場合
の2パターンに分かれます

#### Dockerfile / docker-compose.yml が既にある場合
僕はこちらで使っています．

まずは該当のDockerコンテナを立ち上げましょう．編集したいコードを置いているローカルのディレクトリを`--volumes`で読み込ませるのを忘れずに！

コンテナが立ち上がったら，`Ctrl + Shift + P`でコマンドパレットを出して`remote-c`とでも打ってみましょう．
候補の中に`Remote-Containers: Attach to Running Containers...`というのが出てくるはずです．
もしくは左下の緑色の，"><"みたいなマークを左クリックしてみても同じものが出せます．
そちらを選択すると，別ウィンドウでコンテナ内にアクセスできます．
そしたら先程`volumes`で読み込ませたファイルを置いたディレクトリを，`Open Folder`から開いてみましょう！
あとは言語やフレームワーク等それぞれに対応した拡張機能を適宜インストールしていきましょう(reloadが必要です)．
Lintももちろん使えます:thumbsup:
ほら最高！

#### Dockerfile / docker-compose.yml が無い場合
※こちらは試していないです

この場合は，まずDockerfileを書く必要があります．でも書いたことが無くても大丈夫です．
コマンドパレットを出して`Remote-Containers: Create Container Configuration file...`を選択するだけ．
あとはVSCodeがいい感じにDockerfileを作ってビルドしコンテナを立ち上げてくれます．
[こちら](https://yoheikikuta.github.io/vscode_remote_dev/)に詳しくまとめてくださっている方がいたので参考にしてみてください．

## まとめ
Remote Developmentを使うと，人によっての環境の違いとか意識しなくてもよくなりそうなので期待大ですね:thumbsup:
Windows10 Pro 以外のWindows民向けにVagrantfileを別途配布する，くらいで全環境網羅できそうな気がします．最高です．

VSCodeはいいぞ！

## ちょっと追記
書いたコードにエラーがあるまま保存すると，コンテナが停止してしまいます．
どうなるかというと，コンテナ内で編集するために開いていたウィンドウが閉じ，ローカルのファイルを開いていた最初のウィンドウに戻ります．
まぁ当然といえば当然ですね...もう1回コンテナ立ち上げる作業が増えるので気をつけましょう...
ショートカットとか割り当てておくといいかも．
APIテスト自動化ツール「Karate」のまとめ

# Karateとは？

![karate-logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22893/9918ad16-7aff-6580-0a4c-9e2ffa56a809.png)

[Karate](https://github.com/intuit/karate)は、Cucumberと同様のBDD（ビヘイビア駆動開発）を行うためのフレームワークであり、Gherkinの文法を自然言語に近い形で記述できるユニットテストツールです。
REST-APIのテストの他、GraphQLやWebSocketなどにも対応しており、さらに、テストダブルやUIテストにも利用できるツールです。

![karate-capability-map.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22893/a5b1fc13-f4ec-e453-fadf-20ed35319e1e.png)
(2021/03/15 v1.0.0 Release)

この記事では、Karateを利用したAPIテストについて、いろいろと調査や検証した結果の内容をまとめています。

# Basic な利用方法
Karateの基本的な利用の仕方について、説明しています。

- **[#01 Quick Start](https://qiita.com/takanorig/items/11fd65a4359280cb82e5)**
    - Karateの紹介
    - サンプルシナリオの実行
- **[#02 Reading By Example](https://qiita.com/takanorig/items/70f14fa6ef024850ba25)**
    - Karateのファイル構成や内容
    - サンプルシナリオの理解
    - テストスクリプト（featureファイル）の書き方
- **[#03 Writing Scenarios](https://qiita.com/takanorig/items/2f4963d87af860a60d17)**
    - シナリオを踏まえたテスト
- **[#04 Defining Data](https://qiita.com/takanorig/items/1a7920d0dbc2099db000)**
    - 変数の利用方法
    - JSONデータの指定方法
    - ファイルからの読み込み
- **[#05 Assertions-Matching](https://qiita.com/takanorig/items/ab69ddd7c1995ebf30be)**
    - Matching を利用した Assert
    - Fuzzy Matching を利用した Assert
- **[#06 Assertions-Contains](https://qiita.com/takanorig/items/9709291e0f2583c8b24b)**
    - Contains を利用した Assert
    - JSON Path によるチェック
- **[#07 Test-Double](https://qiita.com/takanorig/items/5f63806219ae30a8f09a)**
    - Karateによるテストダブル
- **[#08 Running Karate](https://qiita.com/takanorig/items/339c20d67f681e882583)**
    - Karateの実行方法

# Advanced な利用方法
- UI Automation
- WebSocket
- QraphQL
- **[KarateをProxy環境下で実行する](https://qiita.com/takanorig/items/1752a020c8e4792ef03e)**


# 参考
- [Karate GitHub](https://github.com/karatelabs/karate)
- [Karate Documents](https://karatelabs.github.io/karate/)
- [マイクロサービスにおけるテスト自動化 with Karate (2018)](https://speakerdeck.com/takanorig/microservices-testing-automation-with-karate)
- [人生がときめくAPIテスト自動化 with Karate (2019)](https://speakerdeck.com/takanorig/sparkingjoy-for-api-testing-automation-with-karate)
- [Karateによる UI Test Automation 革命 (2019)](https://speakerdeck.com/takanorig/uitests-automation-with-karate)
Macのシェル環境を整えてみた(導入編)

# Macのシェル環境を整える
GW中に新しく導入したMacマシンのセットアップを行いました。
OS初期インストール状態からセットアップを行ったのでついでにシェル環境も1~2年前に構築した状態から変更してみました:smiley:

## 旧シェル環境
```
OS: MacOS Mojava
ターミナルアプリ: iterm2
シェル: fish Shell
Fish Shell用プラグインマネージャー: fisher(https://github.com/jorgebucaran/fisher)
```
以前はfish shellを利用しており、特に追加設定など必要ないことからここ1~2年ほど利用していましたが、
1. 誤入力した際の入力履歴が補完され続ける。入力補完が入力中に表示されるが、たまに表示が崩れる。
2. `fish Shell`はPathの通し方が独特でたまにしか触らない自分のようなユーザーは設定の仕方を忘れてしまう。
上記2点の問題があったため今回 `fishh shell → zsh` へ移行することにしました。
(#ノД｀).｡oO(べっ別に当時よくわからないままfish Shell導入したとか、導入当時のことを覚えてないわけじゃないんだからね！！)

ということで、今回設定した環境は以下のとおりです。
## 新シェル環境
```
OS: MacOS Mojava
ターミナルアプリ: iterm2
シェル: zsh
zsh用プラグインマネージャー: zplug
```
## 手始めに...
今回は__Mojave__インストールしたばかりのまっさらな環境でシェル環境を構築したため、以下の対応を行いました。
### 1. HomeBrewのインストール
[Homebrew](https://brew.sh/index_ja)の公式サイトの内のcurlコマンドを実行

```
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

実行完了後、HomeBrewがインストールされたことを確認するため、`brew -v` などbrewコマンドを叩いてみる。
問題なく実行できればOK👍
![brew-v.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61040/d0edbdb8-e94d-c291-2d40-3c0dd8fe88c1.png)
### 2. ターミナル起動時に毎回表示されるメッセージを非表示にする
毎回表示される`Last login`と呼ばれるメッセージがうっとしいため非表示にしました。
ユーザーディレクトリ(/Users/"ユーザー名")直下に`.hushlogin`の空ファイルを作ることで非表示にすることができます。
![last-login.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61040/02a013b9-aa30-0523-efcf-e9876505c5f2.png)
### 3. 現在zsh以外のシェルを導入している場合
現在利用しているシェルのパスは `echo $SHELL` で確認することができます。
すでにzsh以外のシェルを導入済みの方は次項の__zshのインストール__実行後、今後特に利用しないようであれば古いシェルは都合の良いタイミングでアンインストールして問題ないです。
ただし、`less /etc/shells`を実行し、`/bin/シェル名`の記載のものはMacOSインストール時に導入されたものなのでアンインストールの必要はありません。
あくまで自身で導入したシェルのみ不要であれば削除してください。

## zshのインストール
`less /etc/shells`を実行すると、`/bin/zsh`の行が存在していると思います。
これは、MacOSインストール時に合わせて導入されているzshのパスとなります。
しかし、今回はHomeBrewから別途zshのインストールを行い、そちらを利用します。
別途インストールしたzshを利用する理由は、HomeBrew経由でインストールすることで、zshのアップデート・不要になった際のアンインストールを__brewコマンド経由で実行・管理することができる__からです。
HomeBrew経由でzshをインストールするコマンドは `brew install zsh`です。
コマンド実行後`/usr/local/bin`のディレクトリ配下にzshがインストールされていることを確認してください。
## パスの設定
HomeBrew経由でインストールしただけでは、zshを使うことはできないため、パスの設定を行います。
はじめに`vim /etc/shells`を実行し、`/usr/local/bin/zsh`の一行を追記してください。
上記を追記することで実行可能シェルとして設定することができます。
次に起動時の実行シェルの指定を行います。
今回は`/usr/local/bin/zsh`を実行シェルとして設定するため、`chsh -s /usr/local/bin/zsh`のコマンドを実行してください。
(パスワードの入力を求められた場合、ユーザーと紐づくパスワードを入力してください)
ターミナルアプリ(ターミナル.app or iTermなど)を一旦終了し、再度ターミナルアプリを起動させると__zshが起動します__
`echo $SHELL` を実行して `/usr/local/bin/zsh`がzshのインストールは完了です！！:ok_hand:

----
続きは[Macのシェル環境を整えてみた(zsh拡張編)](https://qiita.com/MonkeyWlench/private/9f3a3642cd16eecfa3b0)へ続きます。