OmniAICreator/Qiita-1.07M huggingface dataset:
Kubernetes 1.15: SIG Scheduling の変更内容

## はじめに

ここでは, Kubernetes 1.15 の CHANGELOG から SIG Scheduling に関係のあるものを抜粋しています.

https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.15.md

## 主な変更点 (1.15 What's New)

### Additional Notable Feature Updates

- スケジュールプラグインのための [Scheduling Framework](https://github.com/kubernetes/enhancements/issues/624) が alpha バージョンとなりました.

:memo: スケジュールプラグインとは既存の Kubernetes Scheduler を拡張するための仕組みで, プラグインはコアの実装とともにコンパイルする必要があるようです. カスタマイズされたスケジューラの不具合は特定の環境でしか発生しないものなどが多いため, 保守性の観点からコア実装と拡張機能を分けたいというのが背景にあるようです. また, Kubernetes Scheduler にはもともと webhook による拡張を行うことができましたが, 拡張性やパフォーマンスへの制限があるため, 新しいプラグインの仕組みが検討されています. (参照: [KEP](https://github.com/kubernetes/enhancements/blob/master/keps/sig-scheduling/20180409-scheduling-framework.md))

<!--
## メトリクスの変更 (Metrics Changes)

### Deprecated/changed metrics

Implement the scheduling framework with Reserve, Prebind, Permit, Post-bind, Queue sort and Unreserve extension points. (#77567, @wgliang) (#77559, @ahg-g) (#77529, @draveness) (#77598, @danielqsj) (#77501, @JieJhih) (#77457, @danielqsj)
-->

## 注目機能 (Notable Features)

### Stable

なし

### Beta

なし

### Alpha

- PriorityClass に preempt するかどうかを指定するフィールドが追加されます. これが設定されている場合, Pod は他の優先度の低い Pod よりも先に並べられますが, 実行中の Pod を preempt しません. ([#74614](https://github.com/kubernetes/kubernetes/pull/74614), @denkensk)

:memo: バッチ処理などで, 優先度は指定したいものの途中までの計算結果は無駄にはしたくないというようなユースケースへの対応です.

## その他の変更 (Other notable changes)

- QoS が BestEffort の Pod で同じキーと効果で値の異なる Toleration はマージされるようになります. ([#75985](https://github.com/kubernetes/kubernetes/pull/75985), @ravisantoshgudimetla)

:memo: QoS が BestEffort の Pod の場合だけ `Key:abc, Effect: NoSchedule, Value: Test1`, `Key:abc, Effect: NoSchedule, Value: Test2` というような二つの Toleration を指定した場合に, 二つの Toleration が作られてしまっていた不具合への対応です. QoS が BestEffort 以外の場合には `Value: Test2` の Toleration が一つとなっていたので同じ挙動に修正されます.

- required な場合と preferred な場合の両方の PodAffinity でパフォーマンスが二倍に向上します. ([#76243](https://github.com/kubernetes/kubernetes/pull/76243), @Huang-Wei)

:memo: Lock/Unlock を行う代わりに sync/atomic パッケージの [AddInt64 関数](https://golang.org/pkg/sync/atomic/#AddInt64) を利用するようにしたようです.

- スケジューラの競合問題を修正し, 優先度の高い Pod が NominatedNodeName を持つ場合には優先度の低い Pod が確実に unschedulable となるようにしました. ([#77990](https://github.com/kubernetes/kubernetes/pull/77990), @Huang-Wei)
azure data lake gen2 でファイル操作をする

# azure data lake gen2 ってなに？
awsでいうところのS3。azureにはもともとblob storageというのがあったがblobの進化版らしい。
参考
https://docs.microsoft.com/ja-jp/azure/storage/blobs/data-lake-storage-introduction
何が良くなったのかよくわからんが、ファイルのリネームとかが簡単になったらしい。
blobではファイル名とデータがkey value storeのように結びついている。要はディレクトリという概念がなく、blobのファイルアドレスとデータが1対1に紐付いている。 azure portalからblobストレージを見るとディレクトリがあるように見えるが、ファイルアドレスの中を`/`で区切ることでディレクトリのように見せかけているだけ。

そのため、blobでファイル名やディレクトリのリネームをしようとすると、
1.  新しいファイル名でblobをコピーする
2.  もともとのファイルを 削除する

という手順をが実行される。linuxの`mv`コマンド感覚でうっかりディレクトリのリネームを実行すると、膨大なファイルのコピー&デリートが発生して結構時間がかかったりする。

blobとは違いdata lake gen2ではファイルとディレクトリの概念があるので、linuxの`mv`コマンドのようにリネームを実行してもファイル名が変わるだけで膨大なコピペは発生しませんよ。というのが売りらしい。

blobと同様にdata lake gen2はhdfsのように振る舞う事ができるので、sparkやhadoopで読み書きができる。

blobと互換性をもたせる予定らしく(今は互換性ない)、blob用に書いたいろいろなツールも将来的には簡単にdatalakegen2に移植できるらしい。

# クライアントツールがない

GAアナウンス
https://azure.microsoft.com/ja-jp/updates/azure-data-lake-storage-gen2-is-now-generally-available/

今年の2月にGAしたばかりなので、いろいろとツールが揃っていない。blobの場合はpythonのBlockBlobStorageモジュールを使えばアクセスできたが、今はまだdata lake gen2 に使えない。

対応してるツール一覧
https://docs.microsoft.com/ja-jp/azure/storage/blobs/data-lake-storage-known-issues

hdfsコマンドには対応しているようなので、hdfsコマンドからファイルの操作をする方法をメモする。

# 環境

## OS
Ubuntu 16.04.6 LTS

## java インストール

Javaのインストール

```
$ sudo apt install openjdk-8-jre-headless
$ java -version
openjdk version "1.8.0_212"
OpenJDK Runtime Environment (build 1.8.0_212-8u212-b03-0ubuntu1.16.04.1-b03)
OpenJDK 64-Bit Server VM (build 25.212-b03, mixed mode)
```
`JAVA_HOME`の設定

```

$ which java
/usr/bin/java
$ export JAVA_HOME=/usr
```

## HDFSコマンドの用意

HADOOPコマンドのダウンロード
https://www.apache.org/dyn/closer.cgi/hadoop/common/hadoop-3.2.0/hadoop-3.2.0.tar.gz

ダウンロード、解凍したらとりあえずhadoop-3.2.0に移動

よくわからんおまじない

```
export HADOOP_OPTIONAL_TOOLS=hadoop-azure
```

やっとファイル操作してみる

```
bin/hdfs dfs -Dfs.azure.account.key.ACCOUNTNAME.dfs.core.windows.net=ACCOUNTKEY \
  -ls abfss://FILESYSTEM@ACCOUNTNAME.dfs.core.windows.net/
```

これでhdfsコマンド一式を使ってファイル操作ができるようになった。

# 参考文献

https://cloudarchitected.com/2019/04/accessing-azure-data-lake-storage-gen2-from-clients/

hdfs オプションいちらん

https://hadoop.apache.org/docs/r3.2.0/hadoop-project-dist/hadoop-common/FileSystemShell.html
Helm VS Kustomize

# Helm VS Kustomize

## 背景

Kubernetes上でマイクロサービスアーキテクチャを実現する上で大量のmanifestの管理は避けて通れない。
この問題を解決するには、共通部分を使い回しやすくする仕組みが求められる。  

Kubernetes上でmanifestを管理しやすくするツールは複数開発されており、`Helm`や、`Kustomize`などが有る。

冒頭で挙げた共通部分を使い回しやすくする上で、どのツールが適しているかについて簡単に検討する。

## 前提

いきなり、網羅的でなく恐縮ですが、`Helm`と`Kustomize`以外のツールは今回の比較から除外します。
除外されたツールは主に`Ksoonet`、`Kapitan`、`Kubecfg`を指します。
以下、理由になります。

- KapitanとKubecfgはGitOpsツールのArgo CDが対応していないため（今回はGitOpsのワークフローで使用することを前提としている）
- KsoonetはYAMLの形態からかけ離れており、マイクロサービスで複数チームが都度使うにはKubernetesの学習に加えて更に学習コストが高くなりそうに早々に思えたため。

## 結論

早速ですが、私の結論です。

- アプリケーション開発においてはKustomizeが適している。
    - 共通部分の管理しやすさ、設定変更の容易さ、ConfigMapの作成難易度を低下、dev環境・prd環境へのデプロイの切り替えの容易さなど、開発面で重宝されるような機能が多い。
- アプリケーション配布においてはHelmが適している。
    - Helmはあくまで**パッケージマネージャー**
    - 設定の変更を限定させることができ、想定外の使われ方が起きづらい。
    - Helmリポジトリから配布するといった利用者までの提供の導線が既に有る。

つまり、kubernetes上でマイクロサービスアーキテクチャで開発したいという要件であればKustomizeが適していると考えます。  
最初はKustomizeのひな形を作って各チームに配布、個別要件があれば上patchで上書きする形が悪くないと思っています。

一方で、マイクロサービスアーキテクチャに必要なメッセージキューなどの共通ミドルウェアの配布にはHelmでも良いのでは無いかと考えます。（Kustomizeでも良いと思いますが。）

## 検討

### Helmのメリット

- 利用者にパッケージ化して提供できる。（yumやaptのような感覚で）

### Helmのデメリット

- Helm Chartを最初は作成する必要がある
    - 後続のデメリット理由から、Chart自体のを変更する必要が有る＋学習コストから再利用性が低い。
- カスタマイズ性が低い
    - 設定が穴埋め方式。
    - Template内で変更したいフィールドが公開されていない場合、Helm リポジトリからフォークしてChartを書き換える（自分で穴をあけてあげる）必要が有る。
- Go Templateの学習コストが高い

### Kustomizeのメリット

- 共通のnamespaceやLabelを簡単に書ける
    - kustomiztion.ymalに記述するだけ
    - Kustomization.yaml以外は既存のmanifestと同様なので、HelmのGo Templateに比べれば学習コストは極小
- カスタマイズ性が高い
    - 設定は穴埋め方式ではなく、上書き方式
    - 上書きしたい内容を既存のmanifestの形式で書いてpatchとして当てればOK
- ConfigMapのGeneratorが用意されている。
- kubectlに統合された
    - やっぱりデファクトが良いですよね。
    - https://kubernetes.io/blog/2019/03/25/kubernetes-1-14-release-announcement/

### Kustomizeのデメリット
- Helmと比較すると第3者への配布の仕組みが弱い。

## 最後に
上記は私の私見を多く含みます。
結論ありきなメリデメ比較になってしまったとも思っているので、有識者からのコメントをお待ちしております。
メリデメには書きませんでしたが、Git上でのSecretの扱いも課題感として持っています。これについても良い解決策があればコメントをお待ちしております。
Solargraphをインストールしたにもかかわらず、拡張機能「Ruby Solargraph」が「gem install solargraph」エラーになる

Solargraphを`gem install`しているにもかかわらず、vscodeの拡張機能であるRuby Solargraph
が以下のようなエラーを表示することがあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105859/1c77717e-b4a8-8b13-a047-a8d05313a71d.png)

__わたしの環境では、拡張機能側がSolargraphを探せていないことがこの原因でした。__ 拡張機能Ruby Solargraphは項目`Command Path`の設定値をもとにSolargraph Gemを探し、そのデフォルト値は`solargraph`となっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105859/6b6a5021-ec1f-707b-2e4d-6e77b3548343.png)

そこでおもむろに以下のようなコマンドを打ち込んでみると、確かに`solargraph`が見つかりませんでした。繰り返すようにSolargraphは`gem install`済みです、`gem install`時に`solarpath`コマンドの`PATH`が通るはずですが、何らかの事情で通らなかったのでしょう。

```
$ solargraph help
-bash: solargraph: command not found
```

---

1. `solargraph`の実体を探して、`PATH`を通す
2. `solargraph`の実体を探して、そのフルパスを`Command Path`に設定する。

この問題の解消法としては以上の2つが思いつきますが、今回、わたしは2を選択しました。まずは`gem env`コマンドで`solargraph`コマンドが設置されているディレクトリを探します。

```
$ gem env | grep "EXECUTABLE DIRECTORY"
  - EXECUTABLE DIRECTORY: /usr/local/lib/ruby/gems/2.6.0/bin
```

つまり`/usr/local/lib/ruby/gems/2.6.0/bin/solargraph`が目的のコマンドになるはずなので、それを以下の通りに確認します。

```
$ /usr/local/lib/ruby/gems/2.6.0/bin/solargraph help
Commands:
  solargraph --version, -v            # Print the version
  solargraph available-cores          # List available documentation versions
  solargraph clear-cores              # Clear the cached core documentation
  solargraph config [DIRECTORY]       # Create or overwrite a default configuration file
  solargraph download-core [VERSION]  # Download core documentation
  solargraph help [COMMAND]           # Describe available commands or one specific command
  solargraph list-cores               # List the local documentation versions
  solargraph reporters                # Get a list of diagnostics reporters
  solargraph socket                   # Run a Solargraph socket server
  solargraph stdio                    # Run a Solargraph stdio server
```

あとは以下のように`Command Path`に`solargraph`のフルパスを指定してやるだけで、ポップアップは表示されなくなり、拡張機能が正しく稼働するようになるはず。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105859/f158a8ab-5ae3-ccff-1bae-9d3ff4260652.png)
画像は適切なサイズで運用しよう！

## はじめに
* サイト運用において、重い画像を載せてしまったが故に、サイトが重くなったりサーバ通信費の超過料金が発生してしまったため、画像は適切なサイズで運用する必要があります
* CDNを使用したとしても適切な画像サイズを設定する必要があります
* 備忘録として記載します

## なぜ適切な画像サイズにしないといけないのか？
* パケット通信費用がユーザ・サービス提供側ともにかかってしまうため
* サイト表示速度に影響するため
    * ユーザー離れに至ることもある

## 画像について
* 画像サイズが大きい（解像度が高い）ほど、通信速度が遅く、通信料金が高くなる
* 画像サイズが小さい（解像度が低い）ほど、通信速度が安く、通信料金が安くなる

## 対応策
### 画像サイズを調べる
* WEBサイトで調べる
    * [PAGE WEIGHT](https://pageweight.imgix.com/)
* JavaScript

~~~html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>サンプル</title>
<link rel="stylesheet" href="css/main.css" type="text/css" media="all">
<script type="text/javascript">
function check() {
  var fileList = document.getElementById("sFiles").files;
  var list = "";

  for (var i = 0; i < fileList.length; i++) {

    if (file = fileList[i]) {
      img = new Image();
      img.onload = function() {
        alert("画像の表示サイズは、横 " + this.width + " ×縦 " + this.height + " です。");
      };
    }
    img.src = (window.URL || window.webkitURL).createObjectURL(file);

    list += fileList[i].name + " [" + fileList[i].size + " bytes]<br>";
  }
  document.getElementById("result").innerHTML = list;
}
</script>
</head>
<body>
  <h1>選択されたファイルのファイルサイズを調べる</h1>
  <form>
    <input type="file" id="sFiles" multiple>
    <input type="button" onclick="check()" value="ファイル名とサイズを表示">
  </form>
  <div id="result"></div>
</body>
</html>
~~~

* PHP
    * オープンソース
        * 画像サイズ
            * http://www.coipo.net/lab/103.html
        * 画像容量
            * https://www.php.net/manual/ja/function.filesize.php

### 画像をダイエット（リサイズ）する
* WEBサイトを利用してリサイズする
    * [Optimizilla](https://imagecompressor.com/ja/)
        * -0%であればリサイズする必要なし
        * 最大20枚まで一気に圧縮できる
        * 圧縮前と圧縮後の比較ができる

<img width="1011" alt="スクリーンショット 2019-06-29 22.47.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87218/58b744cb-b62c-aab9-a2ed-bdf6f2450702.png">

* オープンソースを利用してリサイズする
    * JavaScript
        * https://blog.panicblanket.com/archives/4504
    * PHP
        * https://www.sejuku.net/blog/74338

## まとめ
* ユーザ・サービス提供側のパケット通信費用を考慮して、画像は適切なサイズで運用しましょう！
Retrofit 2.6で通信を非同期処理

# Retrofit2.6でsuspend関数がサポート
Retrofit2.6でsuspendがサポートされ、HTTPリクエストをcoroutineを使って書くことができるようになりました！

> New: Support suspend modifier on functions for Kotlin! This allows you to express the asynchrony of HTTP requests in an idiomatic fashion for the language.
[retrofit - Change Log](https://github.com/square/retrofit/blob/master/CHANGELOG.md)

Retrofit 2.6以前と比較してみたいと思います。
[こちら](https://github.com/duosonic62/RetrofitWithCoroutine)にサンプルコードがあるので、参考にしていただければー！

## Retrofit 2.6以前で通信を非同期処理
Retrofitの2.6以前で非同期処理を行う場合は、enqueueを使用します。
具体的にはCall<T>を戻り値に設定して

```kotlin
interface EmployeeApi  {
    @GET("employees")
    fun getEmployeeWithCall(): Call<List<Employee>>
}
```
この戻り値を利用してenqueueを呼び出します。
enqueueにコールバック(コード例ではCustomCallBack)を渡して、成功時にはonResponse、失敗時にはonFailureが実行されます。

```kotlin
class EmployeeService {
    fun getAsyncEmployeeWithCall() {
        service.getEmployeeWithCall().enqueue(CustomCallBack())
        service.getEmployeeWithCall().enqueue(CustomCallBack())
    }

    private class CustomCallBack: Callback<List<Employee>>{
        override fun onResponse(call: Call<List<Employee>>, response: Response<List<Employee>>) {
             // TODO やりたい処理
            }
        }

        override fun onFailure(call: Call<List<Employee>>, t: Throwable) {
            // TODO エラーハンドリング
        }
    }
}
```

## Retrofit2.6で通信を非同期処理
Retrofit2.6ではHTTPリクエストを送るメソッドをsuspendにすることができるようになります。
この際、戻り値はCall<T>ではなくResponse<T>を指定します。

```kotlin
interface EmployeeApi  {
    @GET("employees")
    suspend fun getEmployeesWithResponse(): Response<List<Employee>>
}
```

呼び出し側は、coroutineの要領で記述できます。

```kotlin
class EmployeeService {
    fun getAsyncEmployeeWithSuspendFunc() {
        runBlocking {
            val job1 = async { service.getEmployeesWithResponse() }
            val job2 = async { service.getEmployeesWithResponse() }
            
            val res1: Response<List<Employee>>  = job1.await()
            val res2: Response<List<Employee>>  = job2.await()

            println(res1.body()?.forEach { println(it) })
            println(res2.body()?.forEach { println(it) })
        }
    }
}
```

直感的に非同期処理をかけるのでいいですね。
また、Response<T>で返されるので色々とレスポンスのメタデータがいじれて便利です。

```kotlin
// リクエストを取得したり・・・
res1.raw().request()
// レスポンスのヘッダーを確認したり・・・
res1.headers().toMultimap().forEach {
  println("${it.key}: ${it.value}")
}
```

## まとめ
coroutine対応のおかげで、ぱっと見で何をしているかわかりやすくなった気がします。
ただ、coroutineび知識はまだまだなので、何かご指摘があればいただけると嬉しいです。
AtCoder Beginner Contest 132をといてみた

# [A - Fifty-Fifty](https://atcoder.jp/contests/abc132/tasks/abc132_a)

## 入力例

```
ASSA
```

```Python
import collections
list = list(input())
c = collections.Counter(list)
count = 0

for k,v in c.items():
    if v == 2:
        count = count +1

if count == 2:
    print("Yes")
else:
    print("No")

```

# [B - Ordinary Number](https://atcoder.jp/contests/abc132/tasks/abc132_b)

##入力例

```
5
1 3 5 4 2
```

## [C - Divide the Problems](https://atcoder.jp/contests/abc132/tasks/abc132_c)

```
6
9 1 4 4 6 7

```

```
N = int(input())
numbers = list(map(int, input().split()))

result = 0

for count in range(N-2):
    sliced_list = numbers[:3]
    if min(sliced_list) != sliced_list[1] and max(sliced_list) != sliced_list[1]:
        result = result + 1
    numbers.pop(0)
print(result)
```

```Python
N = int(input())
levels = list(map(int, input().split()))
#print(levels)
levels.sort()
#print(levels)

divid_number = int(N/2)
#print(levels[divid_number-1])
#print(levels[divid_number])
print(levels[divid_number]-levels[divid_number-1])


```

# [D - Blue and Red Balls](https://atcoder.jp/contests/abc132/tasks/abc132_d)

## 入力例

```
5 3
```

## 回答例
きっと場合分けを頑張るんだろうなと思ったけどボールの数が多くなれば多くなるほどどうすれば良いのかわからなくて困っていた

```Python
import math
N, K = map(int, input().split())

print((N-K+1)%(1000000000+7))
print(math.factorial(N-K+1)%(1000000000+7))
print(math.factorial(N-K-2+1)%(1000000000+7))
```
【JavaScript】constructor内じゃawaitが使えねえ！だったらこうだ！【TypeScript】

プロローグ
================

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411269/ec0d89d7-752b-5c61-ef17-74b0d77a9513.png)
あっそうだ！constructorにasyncつけるの忘れてたぜ！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411269/91109ed3-c3cc-26f6-d995-231d912dccab.png)
___は？___


状況
========

- __`async`を`constructor`につけると怒られる__
- かといってプロパティに`Promise`が入るのは嫌だ


解決策
======

```js
class hoge{
    constructor(b){
        this.a = b;
    }
    public static init = async () => {
        return new hoge(await unko());
    }
    private a;
}
```

__非同期静的メソッドを用意して非同期処理を済ませ、そこからコンストラクタを呼び出す。__

エピローグ
====

そういえばあのライブラリ、__コンストラクタを使わずに静的メソッドでインスタンスを生成していた__な…
そういうことだったのか…！？
[Fortran] オブジェクト指向メモ

コンパイラはifort．
単語帳．毎回検索するのが面倒なので転載多め．元URLあり．
自前の検証メモも．

#まとめ

[Qiita@bluepost59: fortranでもオブジェクト指向したい！]
(https://qiita.com/bluepost59/items/ca560c49a8c19484db9d)
[Qiita@bluepost59: 続・fortranでもオブジェクト指向したい！「継承と抽象クラス」]
(https://qiita.com/bluepost59/items/8d4b7d7713676fe06472)

## 以下列挙

### メソッドに総称名を用いる

- それぞれの手続き（個別手続き）を結合する
- その手続きを`generic`でまとめる
※クラスの外で総称名を定義し，それをクラスに結合する，という作戦は失敗

``` Fortran:generic_method.f90
module mymod
implicit none

type :: mytype
    contains
    procedure :: mysub_i => mysub_i ! 必要
    procedure :: mysub_r => mysub_r ! 必要
    generic   :: mysub   => mysub_i, mysub_r
    !procedure :: mysub   => mysub ! 無意味
end type mytype

!interface mysub ! 無意味
!    module procedure mysub_i
!    module procedure mysub_r
!end interface mysub

contains

subroutine mysub_i(self, a)
    class(mytype), intent(in) :: self
    integer,       intent(in) :: a
    write(*, *) 'integer', a
end subroutine mysub_i

subroutine mysub_r(self, a)
    class(mytype), intent(in) :: self
    real(4),       intent(in) :: a
    write(*, *) 'real', a
end subroutine mysub_r
end module mymod

program main
    use mymod
    implicit none
    type(mytype) :: a
    call a%mysub(1)
    call a%mysub(2.0)
end program main
```
http://d.hatena.ne.jp/fortran66/20101111/1289407057
ここの文法だと今は上手く行かない？↓（class→typeにした時点でコンパイルエラー）
http://jjoo.sakura.ne.jp/tips/fortran2003/fortran2003_type_proc.html

### 旧バージョンifortでのバグ

ifortのバージョンが古いと（12.1.0以下）コンストラクタによるオーバーロードが出来ないというバグが存在する．
（コンパイルは出来るが，クラスを`type(MyClass)`と呼び出すときに`error #6463: This is not a derived type name.`と言われる．）
https://software.intel.com/en-us/forums/intel-fortran-compiler-for-linux-and-mac-os-x/topic/271265
三項演算子を書く基準


# 初めに
Rubyを含む色々な言語を学習する上で**三項演算子**という名前が出てくる。
これを使うと条件文をお手軽に1行に収める事が出来るが、使うべきではない時もある

# どういう時に使うの？
・`条件 and 処理`が**わかりやすい**時は使ってもいいよ。
・`条件 or 処理`が**複雑**な時は使わない方がいいよ。
・初学者は使わないほうが無難だと思うよ。

# どういう風に使うの？
例えば、`家庭内の権力順位`を表す条件文を作るとしましょう。
上に**if文**、下に**三項演算子**の形で記載していきます。

### if 〜 else 〜 endの場合
```rb
wai = 2
yome = 1

rank = 
  if wai < yome
    'wai'
  else
    'yome'
  end

rank = wai < yome ? 'wai' : 'yome'
```
三項演算子の形式でも、ぱっと見で分かりますね。
この場合だと、三項演算子の方が行数も少なく、オススメと言えるでしょう。
ちなみに、`条件文` ? `trueの場合の処理` : `falseの場合の処理`です。
**wai**と**yome**の順位の高い方の処理を、**rank変数**に代入するよという意味です。

### if 〜 elsif 〜 else 〜 endの場合
```rb
wai = 3
yome = 2
musuko = 1

rank = 
  if wai < yome
    'wai'
  elsif musuko < yome
    'musuko'
  else
    'yome'
  end

rank = wai < yome ? 'wai' : musuko < yome ? 'musuko' : 'yome'
```
if文だとどう処理をするのかわかりやすいのに、三項演算子の方は分かりづらくなってしまいました。
rank = `条件文1` ? `trueの時は'wai'を代入` : `falseの時は条件文2` ? `trueの時は'musuko'を代入` : `falseの時は'yome'を代入`という事をしています。

```rb
# 条件文の位置で揃えた場合
rank = wai    < yome ? 'wai' 
     : musuko < yome ? 'musuko' : 'yome'

# true / falseの条件の位置で揃えた場合
rank = wai < yome ? 'wai'    : musuko < yome 
                  ? 'musuko' : 'yome'
```
このように2行にすれば、1行の時より多少見やすいですが、if文の方が可読性が高く、読み間違いが少ないと言えるでしょう。

### if 〜 elsif 〜 elsif 〜 else 〜 endの場合
ここまでくればお分かりだと思いますが、やってみましょう！

```rb
wai = 4
yome = 2
musuko = 2
musume = 1

rank = 
  if wai < yome
    'wai'
  elsif musuko < yome
    'musuko'
  elsif musume < musuko
    'musume'
  else
    'yome'
  end

rank = wai < yome ? 'wai' : musuko < yome ? 'musuko' : musume < musuko ? 'musume' : 'yome'
```
if文だと処理を追いかけるのが簡単なのに対し、三項演算子は考えるだけでうんざりですね？

# 最後に
三項演算子は上手く使えば、処理を1行でまとめることができるので、少ない行数でコードを実現できます。
しかし、自分がわかっても、他人がコードレビューした時に分かりづらければ、意味がないのです。
他人の気持ちになって、可読性を心がけるよう自身も含め気をつけていきたいです！
postgresSQLで初期接続ができなかった。

# psql -U postgres で接続できない

### サーバー起動
とりあえずpostgresSQLのサーバーを起動
10分くらいサーバー起動せずにCommand叩いてました。笑

```
$ postgres -D /usr/local/var/postgres
```
### 接続できない。
roleのpostgresが無いらしい。。。

```
$ psql -U postgres
psql: FATAL:  role "postgres" does not exist
```

### データベースの一覧を確認
僕の場合はこの時点でOwnerのところのユーザーを使えば接続できました。

```
$ psql -l

// DBのOwnerのユーザーでログイン
$ psql -U {userName} {dbName}
```

### 残る疑問
なぜデフォルトであるはずのpostgresのroleが無かったのか。
今回は別のユーザーでは入れたので問題無いけれど…

一応参考
https://eng-entrance.com/postgresql-role

### 参考
https://qiita.com/ysdyt/items/64ed98b420ea5c4e52ec
Code9leapで最初に表示される「START」を消したい


#最初の「START」が要らないとき

code9leapで実行すると必ず表示されるのが、画面中央の「START」。
ここをクリックさせることでゲーム表示画面をアクティブにするねらいがあるのかもしれませんが、場合によっては要らないことも。。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234600/b7874639-00d5-79db-890c-28eb8cb1be02.png)

#「START」は、nineleap.enchant.jsで表示している
そこで、index.htmlの中にあるnineleap.enchant.jsを読み込んでいる部分をコメントアウトすれば、解決です。

```html
<!doctype html>
<html>
<head>
    <link rel='stylesheet' href='style.css' type='text/css'>
    <script src='/static/enchant.js-latest/enchant.js'></script>
<!--    <script src='/static/enchant.js-latest/plugins/nineleap.enchant.js'></script>-->
    <script src='/code.9leap.js'></script>
    <script src='main.js'></script>
    <title>Page title</title>
</head>
<body>
</body>
</html>

```

#ゲーム開始からの経過時間を表示したい。
ところでなぜこんなことをすることになったかというと、開始からの経過時間を計測したい場合です。
デフォルトで表示される「START」を押されたタイミングを取得するのは複雑そうでしたので、デフォルトで表示される方は消して、オリジナルのボタンを出した方がシンプルで良いのではと思いテストしてみました。

```javascript
enchant();

window.onload = function(){
    var game = new Core(320, 320);
    var timeflg = false;
    var time;
    game.fps = 15;
    game.preload("start.png");
    game.onload = function(){
        
        // 時間表示用
        var label = new Label("push start");
        label.x = 70;
        label.y = 100;
        label.font = "30px Sans-Serif";
        game.rootScene.addChild(label);
        
        // スタートボタン
        var button = new Sprite(230,50);
        button.image = game.assets["start.png"];
        button.x = 40;
        button.y = 260;
        game.rootScene.addChild(button);
        
        // ボタンが押されたらフラグをTrueにする
        button.addEventListener("touchend",function()
        {
            console.log(timeflg);
            time = 0;
            timeflg = true;
            
            game.rootScene.removeChild(button);
        });
        
        game.addEventListener('enterframe', function() {
            // Trueのときだけカウントアップ
            if(timeflg)
            {
                time++;
                label.text = Math.floor(time / game.fps);
            }
        });
        
    };
    game.start();
};
```

code9leapのサンプルプロジェクト（Chromeで動作させてください）。
http://code.9leap.net/codes/show/164403
Pandasを活用し相関の高い特徴を除去する(改良)


# 背景
以前、[Pandasを活用し相関の高い記述子を除去する](https://qiita.com/kimisyo/items/804576ef03dd8d23b210)を書いたが、相関の高い特徴が見つかった場合、適当にどちらかの特徴を除去していた。その後、参考に記載しているURLに「その他との相関の絶対値が大きい方を除去している」という記載を見つけたためプログラムを修正した。合わせて処理時間の大幅な改善も行った。


# 環境
- Windows10
- python 3.7.3
- pandas 0.24.2

# ソース
今までいろいろ実験したが、毎回同じようなコードを書くのに嫌気がさしたため、今後はできるだけ関数の形にしていこうと思う。
で、今回早速、関数にした。
dfには説明変数が各列に記載されたデータフレームを与え、thresholdは取り除きたい相関係数のしきい値を与えると、最終的に除去されずに残った特徴のリストを返すようにした。

```python

def corr_column(df, threshold):

    df_corr = df.corr()
    df_corr = abs(df_corr)
    columns = df_corr.columns

    # 対角線の値を0にする
    for i in range(0, len(columns)):
        df_corr.iloc[i, i] = 0

    while True:
        columns = df_corr.columns
        max_corr = 0.0
        query_column = None
        target_column = None

        df_max_column_value = df_corr.max()
        max_corr = df_max_column_value.max()
        query_column = df_max_column_value.idxmax()
        target_column = df_corr[query_column].idxmax()

        if max_corr < threshold:
            # しきい値を超えるものがなかったため終了
            break
        else:
            # しきい値を超えるものがあった場合
            delete_column = None
            saved_column = None

            # その他との相関の絶対値が大きい方を除去
            if sum(df_corr[query_column]) <= sum(df_corr[target_column]):
                delete_column = target_column
                saved_column = query_column
            else:
                delete_column = query_column
                saved_column = target_column

            # 除去すべき特徴を相関行列から消す（行、列）
            df_corr.drop([delete_column], axis=0, inplace=True)
            df_corr.drop([delete_column], axis=1, inplace=True)

    return df_corr.columns

```

# 実行速度
前回は、データフレームのindex, columnsでループし、1セルずつ相関をチェックしていたが、今回pandasのmax, idxmax関数を駆使することで大幅に処理時間を短縮できた。
Pandasのデータフレームを1セルずつ処理するのは、実行速度の面で非効率であるということを実感した。


# 参考
- [データセットをそのまま解析してエラーになってしまう方へ、基本的なデータの前処理方法を紹介します！](https://datachemeng.com/basicdatapreprocessing/)
読書リスト

|書名|読んだ？|
|:--|:--|
|JavaScript本格入門|:robot:|
|入門JavaScriptプログラミング|:robot:|
|JavaScript コードレシピ集||
|サーバーレス開発プラットフォーム Firebase入門|:robot:|
|基礎から学ぶ Vue.js|:robot:|
|はじめてのJavaScriptフレームワーク Vue.js入門||
|Vue.js入門 基礎から実践アプリケーション開発まで||
|後悔しないためのVueコンポーネント設計||
|現場で使えるVue.js tips集||
|Nuxt.jsビギナーズガイド||
|実践TypeScript||
|Node.js超入門||
|フレキシブルボックスで作る HTML5&CSS3レッスンブック||
|CSSグリッドで作る HTML5&CSS3 レッスンブック||
|HTML5 & CSS3 デザインレシピ集||
|今すぐ使えるCSSレシピブック||
|Web制作者のためのSassの教科書||
|Real World HTTP||
|現場のプロから学ぶ SEO技術バイブル||
|超速! Webページ速度改善ガイド||
|UIデザインの教科書||
|Design Systems||
|Atomic Design||
enchant.jsのキー入力「離したとき」を認識したい

#なぜクマは連続ジャンプするの？
「クマをクリック（タップ）」または「上矢印のをキーを入力」でクマが1回ジャンプするようにしたいのに、クリックの時はうまくいくのに、キー入力では４，５回連続ジャンプしてしまいます。

code9leapのサンプルプロジェクト（Chromeで実行してください）
http://code.9leap.net/codes/show/164401

##enchant.jsで「キーを離したとき」イベントが認識できない

enchant.jsは「キーを押したとき」はgame.inputをチェックすることで認識できます。
ただこの方法の問題は、1秒間に数十回「押してるかどうか」判定が行われるため、ユーザーは一回キーを押しただけのつもりでも、連打したことになってしまいます。

##「キーを離したとき」のイベントを使いたい

クリック（またはタップ）については、「離したとき」イベントが取得できるため、こういった問題は起きません。

```javascript

     // クマをクリック
     kuma.addEventListener('touchend',function(e){
         kuma.tl.moveBy(0,-120,12).tl.moveBy(0,120,12);
     });

```

そこで、「キーを離したとき」のタイミングで処理を行いたいのですが、enchant.jsではこの「キーを離したとき」のイベントを取得する方法が実装されていないようなので、今回はJavaScriptのonkeyupイベントを使った方法をテストしました。

今回はシンプルにテストするために、キーは上矢印しか使われない前提です。
どのキーが押されたか（離されたか）を管理することで、より複雑な操作にも対応できると思います。


```javascript

// キー入力対策
window.focus();

// グローバル変数
// ①　変数gameをグローバル化　ここでnewはできないので注意
var game;

// ②　enchant.jsで定義されてないキー入力処理を追加する。
document.onkeyup = function (e) {
    game.keyflg = false;    // gameオブジェクトにオリジナルのメンバ変数keyflgを追加
    console.log("keyup!!"); // キーが離された確認用console.log
    return true;
};

// enchant.jsを利用するときには必ず最初に書く
enchant();

// ページが読み込まれたときに実行される処理
window.onload = function()
{
    /*var */game = new Game(320, 320);  // ③　varを消す
    game.keyflg = false;    // ④初期値をtrueにするとキー入力の一回目に反応しない
        
    game.fps = 15;
    game.preload('bg1.png','bg2.png','chara1.png');
    
    // ゲームの処理
    game.onload = function()
    {
        // 背景用の画像を表示する
        var bgA = new Sprite(320,320);
        bgA.image = game.assets['bg1.png'];
        game.rootScene.addChild(bgA);
        
        var kuma=new Sprite(32,32);
        kuma.image=game.assets['chara1.png'];
        kuma.frame=1;
        kuma.x=60;
        kuma.y=230;
        game.rootScene.addChild(kuma);
        

        // 定期処理　背景スクロール
        game.rootScene.addEventListener('enterframe', function()
        {    
            if(game.input.right)
            {
               kuma.x+=2;
            }
            if(game.input.left)
            {
               kuma.x-=2;
            }
            if(game.input.up)
            {
                // ⑤上向き矢印が入力されかつgame.keyflgがfalseのとき
                if(!game.keyflg)
                {
                   kuma.tl.moveBy(0,-120,12).moveBy(0,120,12);
                   // ⑥game.keyflgをtrueに戻しておく
                   game.keyflg = true;
                }
            }
        });
        
        // クマをクリック
        kuma.addEventListener('touchend',function(e){
            kuma.tl.moveBy(0,-120,12).moveBy(0,120,12);
        });
    };
        
    // ゲームの処理をスタート
    game.start();
  
};

```

code9leapのサンプルプロジェクト（Chromeで実行してください）
http://code.9leap.net/codes/show/164402
ITも使いようであること

# 何でもIT化を勧めればいいってもんじゃない。
人がシステムに合わせているようでは、非効率でマイナスになると感じる。
それよりは自分のレベルに合わせてアナログに処理した方が、早いこともあるのではないか。
エンジニアさんは開発に集中する。それはいいことである。
しかし、それはシステムを使う側からすれば過程に過ぎないのである。

## 自分達にとって効果のあることをしよう。

今回は効果のあった、ITの使い方に関して事例を示す。

### 何をしていたか

- 週に1回、YoutubeでLive配信をしている。
- 配信準備をするために、マウスとキーボードで操作して配信の準備を行っている。(15分～20分)

### 状況、発想

- 毎回、マウスとキーボードで同じような操作をしているので、コレ自動化できるんじゃないか？
- 他の作業をしないといけないときもあるので、Live配信だけに手を回せない。
- 配信内容を視聴することが目的なのに、配信準備に時間を掛けている現状に対してストレスに感じるようになった。

### 何を使ったか
[RaiMan's SikuliX](http://sikulix.com/)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265588/47ca3e75-e655-5b33-d301-39d4ef8ad87b.png)

### 使い心地

面白かったことは画像を認識して処理を行うこと。特別な使い方はしていない。
手続き型プログラミングが少し分かること、少しのコマンドを覚えればよい。

### 結果どうなったか

1. ワンクリックで配信準備を行えるようになった。
**今まで15分ほど掛けていた操作が、数秒の操作だけでよくなり後は自動で配信準備を行えるようになった。**
その先は自分の手から離れるので自由になることができた。配信準備を気にせずに他のことに手をつけることができた。

2. ワンクリックで誰でも扱えるようになったので、自分が担当しなくてもよくなった。
**作業を引き継ぎやすくなった！**

### 感想

課題は多少あっても、100%解決できなくても、少しでも改善できるのであれば取り組むことはありだと思った。
結果的に1年間の作業は、15(分)×52(週)であるので・・・。

 **13時間の時間短縮が図れることになるのだ。**

定常的な作業から解放されて、13時間の自由を得られるのは中々魅力的であると思う。
自分の場合なら好きなギターを弾くこともできる。

求める精度は人によって異なるかもしれないが、皆に対して改善や提案にアクションしてはどうだろうか？
全体で許容する精度を落としてくれれば、楽になりアクションを起こす側は能動的になれることは多々あるのだ。
ElixirでSlackの絵文字(emoji)を一括エクスポート

# はじめに
- タイトルの通りです。
- Slackのワークスペースを引っ越しするというイベントがございました。
- すでに諸先輩方に書いていただいたものを[Elixir](https://elixir-lang.org/)で書いてみただけです。
    - はじめは[Ruby](https://www.ruby-lang.org/ja/)で書いてみました
        - [Ruby版はこちら](https://qiita.com/torifukukaiou/items/49b0e472844fe466a89d)
- 画像のダウンロード処理は1枚1枚丁寧にダウンロードするより一気にがーっとできるんじゃないかとおもいまして[Flow](https://hexdocs.pm/flow/Flow.html)を使ってみました
    - はやい! はやい!
    - 次の引っ越しイベントではこれを使おう
        - いや、そんなのもうないかな……

# Special Thanks
- [Slackのカスタム絵文字を全てダウンロードする](https://qiita.com/kure/items/7938d92532bb7577d8b8)
- [Slackの絵文字(emoji)を一括エクスポート＆インポートする](https://qiita.com/ne-peer/items/cbdef4f02b1bb6103e51)

# こちらでSlackのAPI(emoji.list)をお試しいただけます
- [slack api](https://api.slack.com/methods/emoji.list/test)

# 作品
```Elixir:
defmodule SlackEmoji.EmojiList do
  def download(token) do
    "https://slack.com/api/emoji.list?token=#{token}"
    |> HTTPoison.get()
    |> decode_response
    |> Poison.decode!()
    |> decode_emojis
    |> Flow.from_enumerable()
    |> Flow.reject(fn {_, url} -> String.starts_with?(url, "alias") end)
    |> Flow.partition()
    |> Flow.each(fn {key, url} ->
      File.mkdir_p("images/")

      body =
        url
        |> HTTPoison.get()
        |> decode_response

      ("images/" <> key <> "." <> extension(url))
      |> File.write(body)
    end)
    |> Enum.to_list()
  end

  def decode_response({:ok, %{body: body}}), do: body

  def decode_response(res) do
    IO.inspect(res)
    System.halt(1)
  end

  def decode_emojis(%{"emoji" => emojis}), do: emojis

  def decode_emojis(h) do
    IO.inspect(h)
    System.halt(2)
  end

  def extension(url), do: url |> String.split(".") |> Enum.at(-1)
end
```
- [ソースコード全文](https://github-elixir-slack-emoji.torifuku-kaiou.tokyo/)

# 作品どうしの処理時間比較
- 1501枚

## [Ruby版](https://qiita.com/torifukukaiou/items/49b0e472844fe466a89d)
```
$ time ruby downloader.rb 
100 %
real	9m23.978s
user	0m20.733s
sys	0m2.458s
```

## Elixir版
```
$ time ./slack_emoji --token xoxp-****

real	0m57.278s
user	0m5.763s
sys	0m1.488s
```

# 動作確認環境
```
$ elixir -v
Erlang/OTP 22 [erts-10.4.3] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe] [dtrace]

Elixir 1.9.0 (compiled with Erlang/OTP 22)
```
- MacBook Pro (13-inch, 2017, Two Thunderbolt 3 ports)
- macOS Mojave バージョン 10.14.5
ENV[]とENV.fetch()の違い【Rails/Ruby】

## 執筆経緯
RailsでWebアプリを個人開発しているときの話です。

スケ少年は頭を抱えました。

database.ymlはどう書けばいいのだろうかと。ある記事では、`ENV["HOGE"]`と書かれているし、またとある記事では、`ENV.fetch("HOGE") { 'hoge' }`と書かれているし、うーん...一体全体、違いはなんなんだ！

ということで調べてみました。

## 本記事を読むことで達成できること
下記のようなコードの差異が理解できる、はず。

```A/database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV["RAILS_MAX_THREADS"] %>
  host: <%= ENV["DB_HOST"] %>
  username: <%= ENV["DB_USERNAME"] %>
  password: <%= ENV['DB_PASSWORD'] %>

```

```B/database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  host: <%= ENV.fetch("DB_HOST") { 'db' } %>
  username: <%= ENV.fetch("DB_USERNAME") { 'root' } %>
  password: <%= ENV.fetch("DB_PASSWORD") { '' } %>
```

## ENVとENV.fetchの違い



これらの記事を読めば分かる人にはわかります。
ENVについて
http://ruby-doc.org/core-2.6.3/ENV.html#method-c-5B-5D
ENV.fetchについて
http://ruby-doc.org/core-2.6.3/ENV.html#method-c-fetch

どちらもRubyのメソッドなんですが、要は、

- `ENV["HOGE"]`は、"HOGE"が存在しなかったらnilが返ってくる
- `ENV.fetch("HOGE") { "hoge" }`は、"HOGE"が存在しなかったらデフォルト値で"hoge"が返ってくる

ってことです。

実際に`console`で実験してみる。

```terminal
env
```
でローカルでの環境変数一覧が出てきます。ENV、ENV.fetchは、これらを取ってくる。
まだ設定していない環境変数を実験として作成してみます。


```terminal
touch test.rb
```

```test.rb
puts ENV["HOGE"]　# HOGEがすでに設定されていたら、FUGAでもなんでもOK
puts ENV.fetch("HOGE") { "hoge_default" }
```

```
ruby test.rb
```
```
$ sample.rb

hoge_default
```
`ENV["HOGE"]`の方は`nil`なので何も表示されない。
これが環境変数HOGEが設定されていなかった場合。次に環境変数HOGEを設定した上で同じ操作を行う。

```
export HOGE="set hoge"
```

```
$ ruby sample.rb
set hoge
set hoge
```

違いがよくわかりましたね！

## 参考文献
https://stackoverflow.com/questions/47985660/rails-difference-between-env-fetch-and-env
http://ruby-doc.org/core-2.6.3/ENV.html#method-c-5B-5D
http://ruby-doc.org/core-2.6.3/ENV.html#method-c-fetch
ng updateでAngularのバージョンを指定してバージョンアップする



次のように`ng update`を使いAngularアプリケーションおよびその依存関係諸々のアップデートを行うと、最新のバージョンにアップデートされます。

```
ng update @angular/cli @angular/core
```

最新のバージョンではなく、バージョンを指定してバージョンアップしたいことがあります。

その場合、次のように`@`の後にバージョンレンジかタグを指定します。


```7.2.15に指定する例
ng update @angular/cli@7.2.15 @angular/core@7.2.15
```

このバージョンを指定してバージョンアップする方法は、よく参照される次のドキュメントには記載がありません。

* https://angular.io/cli/update
* https://update.angular.io/#6.1:7.0

上記のドキュメントには記載がありませんが、[angular/angular-cli](https://github.com/angular/angular-cli)中の[specifications/update.md](https://github.com/angular/angular-cli/blob/master/docs/specifications/update.md)に記載があります。

> You can specify more than one package. Each package follows the convention of [@scope/]packageName[@version-range-or-dist-tag].

---

ちなみに、`ng update`には`from`と`to`というオプションがありますが、これは`migrateOnly`と一緒にしか使えません。

> --migrateOnly=true|false	
> Only perform a migration, does not update the installed version.

---

個人的にはここに明記してほしい・・・

* https://angular.io/cli/update
* https://update.angular.io/#6.1:7.0


Angularにissue報告したけれど、採用されなそう・・・

https://github.com/angular/angular/issues/31259
Scala/Kotlin/JavaからJavaの可変長引数のメソッドを呼ぶ際の挙動

# なんの記事？
同一クラス内に同一名称のメソッドが、
可変長メソッドと固定長メソッドで混在しているJavaのクラス(要するに↓のようなクラス)を
Scala/Kotlin/Javaから引数１個で呼び出した場合に、どちらが呼ばれるかを調査した。

```java
public class CalledClazz {
    public static void method(Object... args){
        System.out.println("可変長引数のメソッドです" + Arrays.toString(args));
    }
    public static void method(Object args){
        System.out.println("固定長引数のメソッドです" + args);
    }
}
```

# 結論

引数１個渡した際の挙動

- Java => 基本は、`method(Object args)`が実行されるが、一部のケースで[変な挙動](#javaから呼び出し)になる
- Kotlin => `method(Object args)`が実行される
- Scala => 可変長引数のほう`method(Object... args)`が呼ばれてしまう…ので、[Scalaから固定長引数のJavaメソッドを呼ぶ方法](#scalaから固定長引数のjavaメソッドを呼ぶ方法)も検討した。

# 調査方法（調査コード）

## Javaから呼び出し

```java
public class JavaClazz {
    public static void main(String... args) throws IOException {
        CalledClazz.method("Java");
        CalledClazz.method(null);
        Object s = null;
        CalledClazz.method(s);
        CalledClazz.method((Object)null);
    }
}
```

実行結果

```
固定長引数のメソッドですJava
可変長引数のメソッドですnull
固定長引数のメソッドですnull
固定長引数のメソッドですnull
```

nullを渡すと、可変長引数のほうにくる？
しかも、要素数１のObject型の配列ではなく、nullが渡る…。
しかもしかも、nullでなんらかの型で変数宣言して渡すか、Objectへキャストすると固定長引数のメソッドにくる…。

## Kotlinから呼び出し

```java
fun main() {
    CalledClazz.method("Kotlin")
    CalledClazz.method(null)
}
```

実行結果

```
固定長引数のメソッドですKotlin
固定長引数のメソッドですnull
```

自然な挙動っぽく見える。

## Scalaから呼び出し

```scala
object CallTestByScala extends App {
  CalledClazz.method("Scala")
  CalledClazz.method(null)
}
```

実行結果

```
可変長引数のメソッドです[Scala]
可変長引数のメソッドです[null]
```
なんで配列になって、可変長引数のメソッドが呼ばれるんだろう。

# Scalaから固定長引数のJavaメソッドを呼ぶ方法

```scala
val f: Object => Unit = CalledClazz.method
f("Scala")
```

```
固定長引数のメソッドですScala
```
とでるようになりました。

こうやって、型推論に任せないで、関数の型を宣言すると意図通りに呼ばれるようだ。
他にも方法があるんだろうか？

ちなみに、

```scala
val f: Object => Unit = CalledClazz.method
f("Scala", "aaaaa")
```
とやると、固定長引数のほうのメソッドが呼ばれ、Tuple2型の１つの値が渡され、

```
固定長引数のメソッドです(Scala,aaaaa)
```
と出ます。

# オマケ

`method(Object... args)`はScalaから見ると、反復パラメータという扱いらしく、
`scala.List`をJavaの可変長メソッドへ **意図したとおりに** 渡したい場合は、

```scala
CalledClazz.method(List("a","b","b"): _*)
```
とする必要があります。
つけないと、`List("a","b","b")`というオブジェクト１個を要素とした、要素数１の配列という扱いになるようで、

```
可変長引数のメソッドです[List(a, b, b)]
```

と出てしまう。

## 参考資料

[Scala: 反復パラメータ\(Repeated Parameters\)にListで渡す方法 \- Qiita](https://qiita.com/suin/items/517df066935e9ff7753f)
Vue CLI3にて、vue-svg-loaderとfile-loaderを共存させる。

## 経緯
久々の投稿。
今まで[fontawesome](https://fontawesome.com/icons?d=gallery "fontawesome")使ってたけど
デザイナーさんがsvgでアイコンくれたので、[vue-svg-loader](https://vue-svg-loader.js.org)使ってsvgをコンポーネント化して扱ってみようと思った。
で、調べる。
ほうほう、vue.config.jsにchainWebpackで

```
module.exports = {
  chainWebpack: (config) => {
    const svgRule = config.module.rule('svg');

    svgRule.uses.clear();

    svgRule
      .use('vue-svg-loader')
      .loader('vue-svg-loader');
  },
};
```

を追記すれば良いのか。https://vue-svg-loader.js.org/#vue-cli  
分かる分かる。意味わかる。おっしゃ。やってみるわ。
がしかし、、既存のコードで読み込めないsvgが出て来ました。今まで読めてたやつが。。。

こんなやつ。scssファイル上のchecked擬似クラスでsvgを読んでる箇所。

```
input[type=radio] {
  ・・・・
  &:checked {
    background-image: url(/・・・/xxxx.svg);
  }
}
```
これ書いたん俺?? まーいーや。とりあえず置いといて、、
↑のradioもvue-svg-loaderで認識されるように、修正するか。
いや、それって本末転倒よな、うっざ。どないしよ。。
とりあえずvue-cli3の元々のwebpackの設定とか見てみよ。そして落ち着こ。

##原因を探す
これやな。
./node_modules/@vue/cli-service/lib/config/base.js

```
 webpackConfig.module
   .rule('svg')
   .test(/\.(svg)(\?.*)?$/)
   .use('file-loader')
   .loader('file-loader')
   .options({
     name: genAssetSubPath('img')
   })
```

なるほどー、今までsvgはfile-loaderで認識させてたのが、
vue.config.jsで追記した

```
svgRule.uses.clear();
```
でリセットされてるのかー、なるほど。じゃ、どないしよ。。。
既存の設定は活かしつつ、vue-svg-loaderも使う方法はないもんか？？？？調べよ。
## あったー

faqのところ
https://vue-svg-loader.js.org/faq.html#how-to-use-both-inline-and-external-svgs

webpackとVue CLIとnuxtで分けてあった。

しかしwebpackの設定で[oneOf](https://webpack.js.org/configuration/module/#ruleoneof)ってのがあるのか、
しらなんだ。なるほどー、これ使うと両方のloaderを使えるのか、
よし、vue.config.jsを書き換えよう。
##俺の場合はこうした。
```
module.exports = {
  chainWebpack: (config) => {
    const svgRule = config.module.rule('svg');
    svgRule.uses.clear();
    svgRule
      .oneOf('external')
      .resourceQuery(/external/)
      .use('file-loader')
      .loader('file-loader')
      .end()
      .end()
      .oneOf('inline')
      .use('vue-svg-loader')
      .loader('vue-svg-loader');
  },
  ・・・・
```

つまりsvgファイルにexternalクエリがあるものはfile-loaderを使用し、
それ以外はvue-svg-loaderを使用する。

なので、checkedの擬似クラスで読み込んでいるsvgファイルにexternalという名前のクエリをつけた

```
background-image: url(・・・.svg?external);
```

これで既存のコードで読み込まれているsvgファイルはそのまま使用出来て、
新しいsvgファイルをvue-svg-loader使ってコンポーネント化出来ました。
まぁexternalという名前じゃなくてもええんやろけど。

とりあえずはこれでいく。
よし、これでいこ。
Ultra96 ボードで petalinux 2019.1 を動かすメモ

久々の投稿です。

悪戦苦闘の結果、ultra96 (version 1 基板？) 上で petalinux 2019.1 を動かすことが出来たので、メモします。

# 準備

Vivado で ultra96 ボードを選択し(ultra96ボードの定義ファイルは avnet の [GitHub](https://github.com/Avnet/bdf) に落ちています)、プロジェクトを作成します。
ZynqMP+ を配置し、クロックのみ配線します(右側に出ているクロック端子を左の２つのクロック端子に直配線します)。

通常通り bitstream 作成を行い、Vivado SDK にエクスポートします。この時、bitstream を含むようにします。

# wpa_supplicant.conf の編集

自分が使う AP に合わせて wpa_supplicant.conf を編集します。

```text:wpa_supplicant.conf
ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=0
update_config=1

network={
        key_mgmt=WPA-PSK
        ssid="[ssid]"
        psk=[wpa_passphrase で生成したパスワード]
}
```

などとすれば OK。

# petalinux プロジェクトの作成

```text:コンソール
petalinux-create -t project -n ultra96 --template zynqMP
```

などとして、ultra96 プロジェクトを作成します。ultra96 ディレクトリに cd で移動します。

```text:コンソール
petalinux-config --get-hw-description=[Vivado SDK 用の hdf を含むディレクトリ]
```
でハードウェア情報を取り込みます。

# デバイスツリーの修正

デバイスツリーを修正して、デバイスが認識できるようにします。
微妙な感じですが、私が適用したものを[ここ](https://github.com/minosys-jp/ultra96v1-p2019-1)に置きましたのでご参考までに。
device-tree ディレクトリ以下にあるファイルを ultra96/project-spec/meta-user/recipes-bsp/device-tree 以下にコピーします。

# kernel の設定

nl80211 および wl18xx デバイスドライバを利用するように設定します。petalinux のデフォルトでは両方とも使用するようになっているようです。

# roofs への iw, wifi-firm アプリの追加

```text:コンソール
petalinux-create -t apps -n iw
petalinux-create -t apps -n wifi-firm
```
を実行し、iw, wifi-firm アプリを生成します。これらは[ここ](https://github.com/minosys-jp/ultra96v1-p2019-1)に置いてある iw, wifi-firm で置き換えます。

ちなみに iw は iw-5.0 の Makefile を bitbake 用に書き換えたものです。wifi-firm は TI wl18xx 用のファームウェアです。公式版は[ここ](https://git.ti.com/wilink8-wlan/18xx-ti-utils)に置いてあることになっていますが、私の手持ちとちょっと違うようです。

# ライブラリ、アプリの有効化

```text:コンソール
petalinux-config -c rootfs
```
を実行し、libnl, wpa_supplicant, iw, wifi-firm を選択する。

# コンパイル実行

petalinux-build を叩いて bitbake を起動する。気長に待つ。
途中ワーニングが出るが気にしない。

# BOOT.BIN 作成と SD イメージ作成

後は SD カードを用意していつもの作業。
SD カードは fdisk で予めパーティションを２つ切っておきます。

```text:コンソール
cd images/linux
petalinux-build --force --boot --fsbl zynqmp_fsbl.elf --fpga system.bit --pmufw pmufw.elf --u-boot
sudo mount -t vfat /def/sdd1 /mnt
sudo cp BOOT.BIN image.ub /mnt
sudo umount /mnt
sudo dd if=rootfs.ext4 of=/dev/sdd2
sudo e2fsck -f /dev/sdd2
sudo resize2fs /dev/sdd2
```
私の環境では SD カードスロットが /dev/sdd* でしたが、それぞれの環境に合わせてください。
SD カードを ultra96 に挿して起動すると wifi が起動するはずです。

お疲れ様でした。

# 問題点

1. wpa_supplicant.conf-sane はコンフィグ時に定期的に監視しているらしく、いつの間にか置き換え前の内容に戻ってしまう場合があります。
その場合は改めて wpa_supplicant.conf-sane をコピーして bitbake を起動し直すと良いようです。

2. ユーザは最初 root しかいませんが、ssh は root によるログインを禁止しているため、結局ネットワーク経由では最初は入れません！
この問題は新たなユーザを useradd 等で作成すると解決できますが、bitbake 時に予め作っておく方法が分かりませんでした。
vue2-google-mapsでgoogle変数が使えない

```js
this.$gmapApiPromiseLazy().then(() => { var bounds = new google.maps.LatLngBounds() /* etc */ })
```
https://github.com/xkjyeah/vue-google-maps/wiki/vue-google-maps-FAQ

公式に書いてあったのに気づかずに時間を使ってしまった:confounded:
Twitterの改悪をCSSでどーにかする

Twitterの改悪といえば、もうわかるでしょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237877/43c41c03-6baa-397f-c341-555a8d0f7981.png)
この新UI。横方向スクロールバーという出してはならないものが!しかも横に[ハンバーガー](https://gigazine.net/news/20150812-hamburger-menu-not-work/)を忘れたかのように[^1]メニューが。しかもツイートボタンがカットされています!

モーメントを隠したのは誤字をやらかしたから、かもしれません(w)[^2]が、他は「WHY!?」となるものばかり。

https://twitter.com/i/optout も動きません。なんでだ?
IE11では旧レイアウトだけど、IEを使い続けるのはNo!No!No!

でも私はプログラマ[^3]。これをCSSでどうにかすればいいのでは? ということでやってみました。

# ムズイ...
TwitterはReactを使っているようです。Reactではclass名やid名がランダムで指定に使えません。また、CSSではできないこともあります。(JSがらみとか)

ただ、不可能ではありません。結局こうしました:

# CSS
以下のCSSをStylusなどで導入しましょう。

```css
a[aria-label="Twitter"][role="button"] {
    position:fixed;
    top:10px;
    left:25px;
    pointer-events:auto;
    z-index:50000000;
}
nav[aria-label="メインメニュー"] a[aria-label^="ホーム"], a[aria-label="調べたいものを検索"], a[aria-label="ブックマーク"], a[aria-label="リスト"]{
    display:none;
}

[aria-label="その他のメニュー項目"] div div:nth-child(2) {
    display:none;
}

[aria-label="その他のメニュー項目"] div div:nth-child(1) {
    position:fixed;
    right:150px;
    pointer-events:auto;
    top:25px;

}

a[aria-label="プロフィール"][role="link"] div div:nth-child(2) span{
    display:none;
}

a[aria-label="プロフィール"][role="link"] {
    position:fixed;
    pointer-events:auto;
    top:10px;
    right:130px;
}

a[aria-label="ツイート"] {
    position:fixed;
    right:10px;
    pointer-events:auto;
    top:25px;
    min-width:140px;
    max-width:140px;
    min-height:30px;
    max-height:30px;
}

nav[aria-label="メインメニュー"] * div[dir="auto"] span{
    font-size:11pt;
}

a[href="/notifications"] {
    position:fixed;
    pointer-events:auto;
    top:10px;
    left:100px;
}

a[href="/messages"] {
    position:fixed;
    top:10px;
    pointer-events:auto;
    left:200px;
}

header {
    max-width:20vw;
    pointer-events:none;
}

main {
    position:relative;
    top:65px;
    z-index:0;
}

form[aria-label="キーワード検索"] {
    position:fixed;
    top:70px;
    left:20px;
    z-index:82857353525785;
    pointer-events:auto;
}

form[aria-label="キーワード検索"]  div{
    position:relative;
    z-index:6000000000;
}

form[aria-label="キーワード検索"] div div{
    position:relative;
    z-index:6000000000;
}

div[data-testid="primaryColumn"] {
    max-width:65vw;
}

div[data-testid="sidebarColumn"] {
    position:fixed;
    top:70px;
    left:20px;
    max-width:15vw;
}

div[data-testid="sidebarColumn"] div div:nth-child(2){
    max-width:20vw;
}

```

注意:
1. aria-labelを多量に使用しているため、言語設定が日本語以外では動きません。
2. けっこー誤作動あります。

# 見ろ! CSSの力を!
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237877/2691e4b8-4cc3-0ac3-ef86-fe30d0d2a018.png)


# 注釈
[^1]: ハンバーガーはありません。
[^2]: [管理職を覗く国家公務員](https://twitter.com/i/moments/1144440711430852608)のこと。
[^3]: 自称。
Firebaseの環境変数をBashの環境変数にコピーする

# はじめに
Firebase functionsには環境変数を設定することができます。

設定方法については以下がわかりやすいので、ご確認ください。
[Firebaseにおける環境変数の設定方法](https://qiita.com/nerdyboy_cool/items/695c8af7ca8d22761927)

この環境変数を、Bashでも使えるようにしたかったので、コピーするコマンドを考えました。

## 環境変数の例

こんな環境変数がFirebase functionsに登録されているとします。

```json
{
  "hoge": {
    "client_id": "fuga"
    "client_secret": "piyo",
  }
}
```

この中の `client_id` と `client_secret` をコピーすることを、今回の目的とします。

## jq のインストール

JSONを解析してくれるコマンドラインツール jq を導入します。

```bash
# Mac
brew install jq

# Windows
choco install jq

# Ubuntu
apt-get install jq

# CentOS
yum install jq
```

## Bashの環境変数に登録する

以下のコマンドで登録できます。

```bash
export $(firebase functions:config:get | jq -r '.hoge' | jq -r 'keys[] as $k | "export \($k)=\(.[$k])"') 
```

`hoge` の部分は適宜読み替えてください。

こちらの記事を参考にさせていただきました。
[jsonのkey:valueを環境変数にexportしたい](https://qiita.com/arc279/items/3e88bc668987927c03d6)

## Bashの環境変数を確認する

```bash
$ echo ${client_id}
fuga

$ echo ${client_secret}
piyo
```

無事にコピーできました。

# さいごに
こちらの記事を参考にさせていただきました。わかりやすい記事、ありがとうございました。

- [Firebaseにおける環境変数の設定方法](https://qiita.com/nerdyboy_cool/items/695c8af7ca8d22761927)
- [jsonのkey:valueを環境変数にexportしたい](https://qiita.com/arc279/items/3e88bc668987927c03d6)
SharePointのリストをクリップボードにコピーする

SharePointのリストは、選択しようとするとドラッグしようとしてしまったり、リスト項目の選択操作になってしまったりして、単純に文字列をクリップボードにコピーしたい などといったことができません。

こんな時はWebコンソールの出番です。

1. 該当のリストを表示する
2. クリップボードにコピーしたい項目のみを表示したい順番で表示するビューを作る![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14499/58998dcd-e0e1-2e6c-9b31-7ef0039db998.png)
3. Webコンソールを開く
4. コンソールに以下のコードを入力する
5. コンソールに表示された文字列をクリップボードにコピーする

```javascript:Webコンソールに貼り付けるコード
let a = "";
document.querySelector(".ms-DetailsList-contentWrapper").querySelectorAll(".ms-List-cell").forEach((e) => {
  e.querySelectorAll(".ms-DetailsRow-cell").forEach((l) => {
    a += !l.classList.contains("ms-DetailsRow-cellCheck") && l.textContent != "" ? l.textContent.trim() + "\t" : "";
  });
  a += "\n";
});
console.log(a);
```

```text:スクリーンショット部分のみの出力例
2019/07/14   SBC://5
2019/07/17   Facelook Part.8
2019/07/19   もくもく会@にしとも広場
```


# やっていること
`ms-DetailsList-contentWrapper`というのは、SharePointのリストテーブルの「データ部分のみ」を囲んでいるdivのクラスです。HTMLのテーブルでいうtbodyみたいなものです。

この要素内の`ms-List-cell`クラスを取得すると、すべての行が、その下にある``ms-DetailsRow-cell`というクラスを取得するとその中の各セルが取得できます。

そのなかの「テキスト部分だけ」を出力し組み合わせていくことで、リストのテキスト部分のみを抽出できます。

ただし、このままだと各行のチェックボックスまで抽出してしまうため、チェックボックスセルに付いている`ms-DetailsRow-cellCheck`というクラスを検出して、それを出力から除外します。

# ブックマークレットにしました

比較的頻繁に使うので、ブックマークレットにしました。ついでに以下の機能を追加しています

* リスト中のどの項目もチェックしていない場合は、すべての項目をコピー
* リスト中のいずれかの項目がチェックされていたら、それらの項目をコピー

また、コピーできる文章は開発者モードのコンソールではなく、新しいウィンドウに表示されますので、全選択してコピーします。

```js
javascript:a="";f=null==document.querySelector(".ms-DetailsRow-cellCheck div:first-child[aria-checked=true]");document.querySelector(".ms-DetailsList-contentWrapper").querySelectorAll(".ms-List-cell").forEach(function(c){if("true"===c.querySelector(".ms-DetailsRow-cellCheck div:first-child").getAttribute("aria-checked").toLowerCase()||f)c.querySelectorAll(".ms-DetailsRow-cell").forEach(function(b){a+=b.classList.contains("ms-DetailsRow-cellCheck")||""==b.textContent?"":b.textContent.trim()+"\t"}),a+="\n"}); window.open("about:blank").document.write("<pre>"+a+"</pre>");
```

コンパイラはいつものを使いました。コンパイル前のソースはgistに公開しています。

* コンパイラ：https://closure-compiler.appspot.com/home
* ソースコード：https://gist.github.com/TakamiChie/e7e19e2ddd3d1f3b8b788c3a38bb0be6