OmniAICreator/Qiita-1.07M huggingface dataset:
gnuplot 3D plot

#概要

出力
for z=0,2{
 for y=0,2{
  for x=0,2{
write() x, y ,z, x+y+z
}}}なるデータファイル

```data.csv
#x, y, z, f(x,y,z)=x+y+z
#1st black Z=0
#1st set
0, 0, 0, 0 #1st line
1, 0, 0, 1 #2nd line
2, 0, 0, 2 #3rd line

#2nd set
0, 1, 0, 1
1, 1, 0, 2
2, 1, 0, 3

#3rd set 
0, 2, 0, 2
1, 2, 0, 3
2, 2, 0, 4


#2nd block Z=1
0, 0, 1, 1
1, 0, 1, 2
2, 0, 1, 3

0, 1, 1, 2
1, 1, 1, 3
2, 1, 1, 4

0, 2, 1, 3
1, 2, 1, 4
2, 2, 1, 5


#3rd block Z=2
0, 0, 2, 2
1, 0, 2, 3
2, 0, 2, 4

0, 1, 2, 3
1, 1, 2, 4
2, 1, 2, 4

0, 2, 2, 4
1, 2, 2, 5
2, 2, 2, 6

```

###３次元plotする

``` sp "data.csv" with pm3d ```

###特定の断面表示する

```u ($1==0 ? $1: 1/0):2:3 ```もしく は```every```を使う．




#実際的なサンプルコード例

```3d.gp
#!/user/bin/gnuplot

#set pm3d
#set pm3d map
set ticslevel 0
#set cbrange[20:120]
set palette define (20 "blue", 60 "white", 120 "red")
#set palette define (0 "navy",1 "blue",2 "dark-violet",3 "red",4 "yellow")

set palette rgbformulae 22, 13, -31
#set palette define (20 "white", 100 "red")
#set grid
set xtics  0.01 font "Times,10" offset 0,-1,0
set ytics  0.01 font "Times,10" offset 1,0,0
set ztics  0.01 font "Times,10" offset 0,0,0
set size ratio 1.0
set key left below

set cblabel "{/Times-New-Roman=10 Temp [℃]}"
set xlabel "{/Times-New-Roman=10 X [M]" offset 0,-1,0
set ylabel "{/Times-New-Roman=10 Y [M]" offset 1,0,0
set zlabel "{/Times-New-Roman=10 Z [M]" offset 0,0,0
set view equal xyz
set cbtics 10 font "Times,10" offset 1,0,0
#set colorbox  user origin 0,0

set format cb "%.2f"


splot for [j=0:100:5] "result/result_05_0.020.txt" every ::: (j*201+0) :: (j*201+200) with pm3d not


set arrow from 0.00,0.00,0.00 to 0.04,0.00,0.00 nohead lw 1 lc black front
set arrow from 0.00,0.04,0.00 to 0.04,0.04,0.00 nohead lw 1 lc black front
set arrow from 0.00,0.00,0.04 to 0.04,0.00,0.04 nohead lw 1 lc black front
set arrow from 0.00,0.04,0.04 to 0.04,0.04,0.04 nohead lw 1 lc black front

set arrow from 0.00,0.00,0.00 to 0.00,0.00,0.04 nohead lw 1 lc black front
set arrow from 0.04,0.00,0.00 to 0.04,0.00,0.04 nohead lw 1 lc black front
set arrow from 0.04,0.04,0.00 to 0.04,0.04,0.04 nohead lw 1 lc black front
set arrow from 0.00,0.04,0.00 to 0.00,0.04,0.04 nohead lw 1 lc black front

set arrow from 0.00,0.00,0.04 to 0.00,0.04,0.04 nohead lw 1 lc black front
set arrow from 0.04,0.00,0.04 to 0.04,0.04,0.04 nohead lw 1 lc black front
set arrow from 0.04,0.00,0.00 to 0.04,0.04,0.00 nohead lw 1 lc black front
set arrow from 0.00,0.00,0.00 to 0.00,0.04,0.00 nohead lw 1 lc black front
```
Swagger viewer（プラグイン）をvscodeで使おう

![スクリーンショット 2021-01-06 18.01.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321986/a48458c1-d0a8-9d48-3a82-476e411bc83f.png)

拡張機能「Swagger viewer」をインストールして

表示したいyamlファイルをVSCodeにドラッグ＆ドロップ。

VSCodeの左下歯車のコマンドパレットから

```
Preview Swagger
```
で動くよ！
![スクリーンショット 2021-01-06 18.02.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321986/9a1cae51-b0e4-b6de-fb53-b1e1022b793e.png)

おめでとう！
UILabelの幅と高さを自動で設定する

## はじめに
SnapKitを使いコードベースでレイアウトを組むようになってからテキストを持つUI部品の幅や高さを意識するようになりました。ここではwidthやheightを自動で設定する方法について記録を残します。

## 悩み
![Simulator Screen Shot - iPhone 12 - 2021-01-06 at 17.53.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549093/fa4956f0-65e2-8a97-12bd-784757f9d2a8.png)
コードベースでレイアウトを組むようにしたものの、`width`と`height`の設定が上手くいかない！というかメンドくさい！

```swift
private func setupLabel() {
        label.text = "あいうえお"
        label.backgroundColor = .red
        view.addSubview(label)
        label.snp.makeConstraints {
            $0.width.equalTo(60)//ここを定数にしてしまっているため、いい感じになるまで何度も確認しなければならない
            $0.height.equalTo(30)//同様
            $0.center.equalToSuperview()
        }
    }
}
```

## 解決方法
`sizeThatFits`と`greatestFiniteMagnitude`を使います。

```swift
private func setupLabel() {
        label.text = "あいうえお"
        label.backgroundColor = .red
        let size = label.sizeThatFits(CGSize(width: CGFloat.greatestFiniteMagnitude, height: CGFloat.greatestFiniteMagnitude))
        view.addSubview(label)
        label.snp.makeConstraints {
            $0.width.equalTo(size.width)
            $0.height.equalTo(size.height)
            $0.center.equalToSuperview()
        }
    }
```

![Simulator Screen Shot - iPhone 12 - 2021-01-06 at 17.57.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549093/5b458842-8caf-7281-1a74-25d0b4e0039a.png)
C++ エラー備忘録

この記事(備忘録) は人に見てもらうことを目的としたものではありません。
あくまでエラーと対処法を後から確認できるようにしたものです。
それとC++は初心者です。

# エラー I
``` shell
./float/network.h: In member function 'void TwoLayerNet::addRelu()':
./float/network.h:16:67: error: invalid new-expression of abstract class type 'ReluLayer'
   16 |             layers.push_back(std::shared_ptr<Layer>(new ReluLayer()));
      |                                                                   ^
In file included from ./float/network.h:4,
                 from ./float/network.cpp:1:
./float/layer.h:44:7: note:   because the following virtual functions are pure within 'ReluLayer':
   44 | class ReluLayer : public Layer{
      |       ^~~~~~~~~
./float/layer.h:9:22: note: 	'virtual void Layer::reset(const Matrix&)'
    9 |         virtual void reset(Matrix const &input)      = 0;
      |                      ^~~~~
make: *** [Makefile:26: network.o] Error 1
```

###解決法
このエラーは仮想関数を他の関数に継承したときに発生した。
厳密にはベクタに追加する作業。
原因は純粋仮想関数を全てのクラスで実装していないことが原因だった。
初めてのC言語

私はプログラミングスクールで学習を始めてからまだ１年未満です。そんな私がスクール卒業後、C言語に挑戦しています。私がC言語を始めた理由は、その汎用性の高さです。C言語は現在でもインターネットや機器の多くを制御したり、他のプログラム言語の元となっていたりするようです。ゲーム制作もできてしまうらしいです。すごいですね。

私は__BitAllow__を利用し、C言語を体験しています。これから私が初めて書いたC言語を用いて書いたコードをお見せします。

#処女作

```C
//C
#include <stdio.h>

int main(void){
    printf("ケン・トンプソン\n");//ケン・トンプソンと出力し改行する
    printf("デニス・リッチー");//デニス・リッチーと出力する
}

```
このコードの結果がこちらです
![737b00144e94a8e60c7a5195a3c412b0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1003936/09908ea9-2faf-84eb-2e53-b28563a27abb.png)

このようにC言語では_int main(void){}_の{}の中に命令を記述し、それを実行させるものとなっています。そして命令の内容は__（）__で始まり、;

ちなみに、トンプソン氏とリッチー氏は、C言語を作成されたお二人です。

#コードの解説
`include <stdio.h>`
言語出力を表します。私はHTMLの<!DOCTYPE>のようなものと解釈しています。

`printf（"文字列"）`
””に囲まれた文字列を出力しなさいという命令を表します。私はRubyのputメソッドのようなものと解釈しています。

その他、\nで改行、なんてコードもあります。これってRubyと共通してますよね。
学んだばかりで言うのも何ですが、私はC言語ってRubyに似ているなぁって感じています。
Go言語-基本❷

# 基本❷
プログラミング基本からGoの理解を文字におこして行こうと思います！
[Go言語-基本❶はこちら](https://qiita.com/coxcoa/items/01cd4e30e965bcebb3ee)

### 変数定義と代入の違い
```go
package main
func main(){
  n := 100
  n := 200
  println(n)
}

//コンソール
:=の左側に新しい変数がないとエラーになる
```
変数定義の「:=」と、代入の「=」の違いに注意
2度変数nを定義しているためエラー

### 変数が使える場所
```go
package main
func main(){
  println(n) //使用不可
  n := 100
  println(n) //使用可能
}

//コンソール
変数nが定義されていないとエラー
```
変数は、定義したあとでしか使えない
コンソールには、「変数nが定義されていない」ことを表すエラー

### 使わない変数
```go
package main
func main(){
  a := 100
  b := 200 //使用していない
  println(a)
}

//コンソール
変数bが使用されていないとエラー
```
定義したものの使っていない変数があるとエラー
Goではエラーを発生させて、バグを未然に防ぐ設計になっている

## 型の不一致
```go
package main
func main(){
  n := 100
  n := "Go" //int型でない
  println(n)
}

//コンソール
string型の"Go"をint型として変数nに代入できないとエラー
```
変数のデータ型と異なるデータ型の値は代入できない

## 変数の演算
```go
package main
func main(){
  n := 100
  println(n + 100)
}

//コンソール
200
```
変数は値と同じように扱える

### 自己代入
```go
package main
func main(){
  n := 100
  n = n + 10 //100+10の合計を変数nに再代入
  println(n)
}

//コンソール
110
```
nの値である100に数値の10を足して、それを再度nに代入（自己代入）

### 自己代入の省略
```go
//原型            //省略型
n = n + 10       n += 10
n = n - 10       n -= 10
n = n * 10       n *= 10
n = n / 10       n /= 10
n = n % 10       n %= 10
}
```
「n = n + 10」は「n += 10」と省略でき、これは「-」「*」「/」「%」でも同様

### 自己代入の省略(2)
```go
n = n + 1 → n += 1 → n++
n = n - 1 → n -= 1 → n--
}
```
「++」という記号は「変数に1を足す」という意味
反対に「--」は「変数から1を引く」という意味

変数に1足す、1引く時のみ、さらに省略できる
WordでZoteroを用いて引用した順（Vancouver Style）に番号をふるスタイル

以前，[Mendeleyで引用した順（Vancouver Style）に番号をふるスタイル](https://qiita.com/Philosophistoria/items/3bc14953333ac46c4729)を投稿したが，今回共同研究先がZotero推しということで，Zoteroでも同様のこと，すなわち，

- 文献を番号で引用
- 文献番号は引用した順（参照順，Vancouver Style）に振り，参考文献リストはその番号順に並べる．
- 文献番号はブラケット`[]`で囲む，
- 文献番号が3つ以上連続する場合は最初と最後だけをつなぐ．e.g. `4-7,11,15`
- 文献番号が2つ以上ある場合は，それらを一つのブラケットに収める．`[4-7,11,15]`

をやってみようとした．

# Background

ZoteroもMendeley同様MS Word用Add-inがあり，Citationスタイルもいろいろ用意されている．
分野的にACMかまたはIEEE系のをそのまま使えればいいのだが，

- ACM系のCitationスタイルは，参照順（バンクーバ方式）ではない．
- IEEE系のCitationスタイルは，バンクーバ方式ではあるのだが，一つの数字にいちいちブラケットがつく．e.g. `[4]-[7],[11],[15]`
- Vancouverスタイルもあるのだが，こちらは数字が丸かっこ`()`でくくられている．

たぶんちゃんとスタイルライブラリを探せばあるのかもしれないが見つけれられなかったので，Mendeleyの場合と同様IEEE方式を基に編集を試みた．
これに先立ち，試してわかったこととして，

- MendeleyもZoteroもcslファイルでスタイルを設定しており，cslの中身はxmlでコーディングされている．
- MendeleyではGUI的にスタイルを設定できるサイトが用意されているが，Zoteroではコードでしかスタイルをいじれない．
- Mendeleyでつくったcslファイルをエクスポートする機能は見つけれられなかった．
- Mendeleyで作ったcslの内容はxmlとして表示できるので，それを部分的にZoteroのcsl編集画面でコピペしてもなんかエラーを吐かれた．

そこでMendeleyでIEEEスタイルを基準にブラケットが各数字につかず，数字列を囲むように作ったcslファイルのxmlコードとZoteroのIEEEスタイルのcslのファイルを見比べてみたら一か所だけcut & pasteすればいいことに気付いた．

# Method

1. Zoteroの設定を開く．
  - Word add-inから `Zoteroタブ` > `Document Preference` > `スタイルを管理する` 
  - Zoteroから `編集タブ` > `設定(N)`
2. 引用タブ
3. スクロールボックスから`IEEE`スタイルを選択
4. スクロールボックスの下にある`ツール` > `引用スタイルエディタ`
5. ` <!-- Citation -->`とコメントあるところを探し，以下のように変更する．

```xml:IEEE-style
  <!-- Citation -->
  <citation collapse="citation-number">
    <sort>
      <key variable="citation-number"/>
    </sort>
    <layout delimiter=", " >
      <group  prefix="[" suffix="]" delimiter=", ">
        <text variable="citation-number"/>
        <text macro="citation-locator"/>
      </group>
    </layout>
  </citation>
```

```diff:bracket-per-series
  <!-- Citation -->
  <citation collapse="citation-number">
    <sort>
      <key variable="citation-number"/>
    </sort>
-   <layout delimiter=", " >
+   <layout delimiter=", " prefix="[" suffix="]" >
-     <group  prefix="[" suffix="]" delimiter=", ">
+     <group delimiter=", ">
        <text variable="citation-number"/>
        <text macro="citation-locator"/>
      </group>
    </layout>
  </citation>
```

またこのままだとインポートしてもスタイル名がIEEEのままなので，上部の`<info>`タグ以下の`<title>`の内容を変える

```diff
  <info>
-   <title>IEEE</title>
+   <title>Vancouver_Bracket</title>
  ...
```

あとは名前を付けて保存でcslファイルを保存できるので，これをさっきのスクロールボックスの株の`+`ボタンからインポートすると使えるようになる．


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265603/6cb5328a-c8c5-417e-ce3a-c887d1ec4c65.png)

# p.s.
今回作ったのにかなり似た形式として`Elsevier - Vancouver`スタイルがあった．これと今回の都の違いは最後の参考文献リストでの文献情報の表し方の違いにある（ファーストネームが先か，ラストネームが先かなど）
link_toの記述方法

link_to "link_button"　=　どこを触ると
root_path   =  どこにとぶ？←rails routesでパスを確認する
class: "header__title--text"　=  装飾　class: "__"という人と解釈する

link_toの""だが、''でもどちらでも問題ない。


```show.html.rb
(#Prefix使用)
<%= link_to "link_button", root_path, class: "header__title--text" %>

(Prefix未使用)
<%= link_to "link_button", '/', class: "header__title--text" %>
```
書く順番を間違えるとNameError in ○○#show（エラー）が表示されてしまうので注意する。
C#でProtocolBuffersを使って見た！！

###🌅新年明けましておめでとうございます🌅

業務の中でProtocolBuffersを使用することになり、
"なんなんそれ..."と思い、習うより慣れろということで動かしてみました。
詳しい説明を知りたい方は先人の方々がわかりやすく解説してくださっているものが
ありますのでそちらを参考にしていただきたいと思います。
ちなみに、私は[こちら](https://qiita.com/yugui/items/160737021d25d761b353)のページを参考にしました。

##手順の流れ
1. Protocを入手
2. Protoファイル作成
3. ProtoファイルからC#のクラスを自動生成する
4. サンプルプログラムを書く

##1. Protocを入手
Homebrewを使用して入手
<pre># terminal
$ brew update     # formula を更新
$ brew upgrade    # 更新があるパッケージを再ビルドする
$ brew install protobuf # protobufをインストール
$ brew upgrade protobuf # protobufをアップグレード

$ protoc --version
libprotoc 3.14.0
</pre>
##2. Protoファイル作成
```Human.proto
syntax = "proto3";
package MyPackage;

message Human {
  string name = 1;
  uint32 age = 2;
}
```

##3. ProtoファイルからC#のクラスを自動生成する
・Protoファイルが存在する場所まで移動する。
<pre># terminal
protoc --csharp_out=. -I. Human.proto
</pre>


##4. サンプルプログラムを書く
<h4>下準備</h4>
・NuGetから Google.Protobuf をインストールする。
・先程の自動生成したcsファイルをRiderのProgram.csと同じ階層に置く。

```Program.cs
using System;
using Google.Protobuf;
using MyPackage;

namespace protocol_test
{
    class Program
    {
        static void Main(string[] args)
        {
            var human = new Human
            {
                Name = "name001",
                Age = 20
            };
            
            byte[] bytes = human.ToByteArray();
            Console.WriteLine(BitConverter.ToString(bytes)); // 

            // デシリアライズ
            var human2 = new Human();
            human2 = Human.Parser.ParseFrom(bytes);
            
            Console.WriteLine(human2.Age);
        }
    }
}
```
<pre>
#実行結果
0A-07-6E-61-6D-65-30-30-31-10-14
20
</pre>

##参考文献
・[C#でProtocolBuffersを使う方法](https://kagasu.hatenablog.com/entry/2018/04/29/233407)
・[Protocol Buffers 導入メモ Mac/Win](https://qiita.com/nzer0/items/7208c880693e63ca247a)
・[XML、JSON、Protocol Buffersを比較してみました]
(http://blog.keepdata.jp/entry/2018/04/06/103104)
Azure Machine Learning SDK for Python をアップグレードする

# はじめに
Azure Machine Learning SDK for Python は多数のライブラリから構成されていて、一つだけアップグレードしてしまうとライブラリ間でバージョンが異なってしまいます..。
そのため、依存関係も含めて一気にアップグレードする必要があります。

# 方法
```shell
pip install --upgrade --upgrade-strategy eager azureml-sdk
```

# 参考
https://docs.microsoft.com/ja-jp/python/api/overview/azure/ml/install?view=azure-ml-py
Font Awesomeの使い方

#Font Awesome とは
ウェブサイトなどでアイコンを文字として扱うことを可能にしたツールです。画像ではなく文字なので、大きさや色などを変更することができます。

#Font Awesomeの使い方
##headタグに追加
以下のコードをheadタグ内に貼付けます。

```
<link href="https://use.fontawesome.com/releases/v5.6.1/css/all.css" rel="stylesheet">
```
#使いたいアイコンフォントを探す
Font Awesomeの公式サイトから使いたいアイコンフォントを探します。
https://fontawesome.com/

（無料プランでは濃いグレーで表示されているアイコンのみ使用できます。）
使いたいアイコンをクリックしてアイコンの詳細ページを開きます。

#使いたいアイコンフォントのコードをコピーする
`<i class="fas fa-camera"></i>` のようなコードをそのままコピーします。

#アイコンをHTML内の表示させたい位置に貼付ける
例えば、以下のように貼り付けます。

```
<span><i class="fas fa-camera"></i></span>
```

cssで大きさや色などを変更することができます。
Ubuntu20.04にHomebrewをインストールする


# 公式手順
https://docs.brew.sh/Homebrew-on-Linux

# インストール
```
sudo apt-get install build-essential curl file git
git clone https://github.com/Homebrew/brew ~/.linuxbrew/Homebrew
mkdir ~/.linuxbrew/bin
ln -s ~/.linuxbrew/Homebrew/bin/brew ~/.linuxbrew/bin
eval $(~/.linuxbrew/bin/brew shellenv)
```

# 環境変数セット
```
test -d ~/.linuxbrew && eval $(~/.linuxbrew/bin/brew shellenv)
test -d /home/linuxbrew/.linuxbrew && eval $(/home/linuxbrew/.linuxbrew/bin/brew shellenv)
test -r ~/.bash_profile && echo "eval \$($(brew --prefix)/bin/brew shellenv)" >>~/.bash_profile
echo "eval \$($(brew --prefix)/bin/brew shellenv)" >>~/.profile
```
Postgresのスキーマ

## スキーマとは
- Postgresにおいては、実データはテーブルに格納される
- テーブルをまとめているのがデータベース
- テーブル、関数などのオブジェクトをグループ化するもの
- データベースを作成すると自動的にPublicスキーマが作成される
- 別のスキーマを任意の名前で作成することも可能

## Publicスキーマ
- すべてのロールにアクセス権、CREATE権限が与えられており、Publicスキーマの中にはどのロールでもテーブルを作成することができる
リアクションエンジニアが去った・・・あれから1年後

# 最初に
[2019年末にリアクションエンジニアが去ってから1年が経った](https://qiita.com/m_sasaki/items/082764df7a48062bb84c)
1年が経過して、チームのslackでのやり取りにどのような変化が起きているのか・・・

# 集計
### 総リアクション数
人数的には微増だと思うが、リアクション数は2万近く増えている
年間10万弱

| 年 | リアクション数 | 前年増率 |
|:-------------|:-------------|:--------|
| 2018 | 18875　　　　　 | -  |
| 2019 | 75953　　　　　 | 402%  |
| 2020 | 95887　　　　　 | 126%  |

###slack登録絵文字数
登録数は約100程度増えた

| 年 | リアクション登録数 | 前年増率 |
|:-------------|:-------------|:--------|
| 2018 | 196　　　　　 | -  |
| 2019 | 505　　　　　 | 257%  |
| 2020 | 約600　　　　　 | 118%  |

### 2020年リアクション上位ランキングTOP10
日常で使いやすいものが上位に来ている。
もう少し順位を下げると限られた状況で使うものや、少し面白いものがあったりする。

| 順位| 2020年 | リアクション数 | 備考 |
|:-------------|:-------------|:-------------|:------------|
| 1位| ![2620102d09ed2035.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320579/bad80a3f-b404-592b-f257-8472a6f426ce.png) | 10960   | 1営業日あたり約40程度利用されていることになる。シンプルに使いやすい。  |
| 2位| ![0a154859358990ba.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320579/cf533b1f-496e-16d2-78dd-a77ebc854fe5.gif) | 7706   | これは感謝ですかね  |
| 3位| ![6ee0134f8bf1a135.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320579/a26b31eb-a72a-c689-df29-9adf0220df1c.png) | 6366   | リモートワークになり挨拶で使われることが増えた  |
| 4位| :man-bowing: | 5266   | slack標準。謝罪なのか感謝なのか。  |
| 5位| :eyes : | 4854   | slack標準。既読ですかね。  |
| 6位| ![0154caf1662c9d1b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320579/d841450a-f246-a07f-f8f0-e3a4c978db57.png) | 4277   | リモートワークになり挨拶で使われることが増えた  |
| 7位| ![746bab0b15c307c3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320579/653cf300-b9d8-d9d4-00bb-1126f32eb6de.jpeg) | 3859   | 個人的に1番使ったと思う絵文字  |
| 8位| :man-raising-hand: | 3458   | slack標準  |
| 9位| ![3f03af9e69448cfd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320579/c7e9dabf-20e6-d863-7c83-acbd6eb48fa0.png) | 3101   | 何か教えてもらったとき、何か使えそうな情報が流れてきたとき  |
| 10位| ![b3a72054fb0ca82d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320579/8eaf4a57-2a32-c4d4-463a-e5e0f53e908d.png) | 2552   | 何か依頼されたとき、各個人のタスク管理  |

# 最後に
色んな人が増えた

* 1つの発言に複数のリアクションをする人
* ちょっと笑ってしまうようなリアクションをする人
* 既読を伝えてくれる人
* 毎回挨拶のためにリアクションする人
* 「打倒承知」を掲げている人
* 発言するときにサインポスティングを目的として絵文字を利用する人

カスタムリアクションの数が多過ぎるという声があったり、一方では他のワークスペースにいくとリアクションが少なすぎるという声も聴いたりする
2019年末にリアクションエンジニアは去ったが、チームではリアクションをすることは文化になりつつある

ちなみに、このランキングTOP3にはslackの「[ワンクリック絵文字リアクション](https://slack.com/intl/ja-jp/help/articles/206870317-%E7%B5%B5%E6%96%87%E5%AD%97%E3%83%AA%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E4%BD%BF%E3%81%86#u12527u12531u12463u12522u12483u12463u32117u25991u23383u12522u12450u12463u12471u12519u12531u12398u29872u22659u35373u23450u12434u34892u12358)」の座が贈られました
Azure ストレージの暗号化について調べてみた

## 概要
Microsoft Azure に触れる機会が増え、ふと Azure Cosmos DB や Blob に保存したデータなどの暗号化などはどうなっているかと思い、調査してみた。

## 調査結果
- Azure ストレージ(Blob 含む) では、データが保存されるときに自動的に暗号化されるとのこと。
- 暗号化方法は 256 ビット AES 暗号化が使用される。
- 暗号化はすべてのストレージで有効になり、暗号化を無効にすることはできない。
- Azure ストレージ暗号化機能を使用するために必要な処理はない。

## 暗号化キーの管理について
- 規定では Microsoft マネージドキーで暗号化されている。
- 独自のキーで管理する方法もあり、その際のオプションは以下の 2 つ。
  - BLOB ストレージ（と Azure Files）のデータの暗号化と復号化に使用する "カスタマーマネージドキー" を独自に指定することが可能（詳細は [Azure Storage 暗号化へのカスタマーマネージドキーの使用](https://docs.microsoft.com/ja-jp/azure/storage/common/customer-managed-keys-overview) を参照）。
  - BLOB ストレージへのアクセス時、要求別・操作別に暗号化キーを指定する "カスタマー指定のキー" を独自に指定することが可能で、BLOB データの暗号化と暗号化解除の方法を細かく制御することが可能となる（詳細は [BLOB ストレージに対する要求で暗号化キーを指定する](https://docs.microsoft.com/ja-jp/azure/storage/blobs/encryption-customer-provided-keys) を参照）。
- Microsoft マネージドキーは、コンプライアンス要件に応じて適切に交換されるため、安全とのこと。ただし、特定のキー交換の要件がある場合は、独自にキーを管理・監視可能な "カスタマーマネージドキー" に移行することが推奨されている。
なお、以下の表は Azure Storage 暗号化のキー管理オプションの責任範囲を示す。

| キー管理パラメーター                      | Microsoft のマネージド キー | カスタマー マネージド キー           | カスタマー指定のキー    |
| ----------------------------------------- | --------------------------- | ------------------------------------ | ----------------------- |
| 暗号化/暗号化解除の操作                   | Azure                       | Azure                                | Azure                   |
| サポートされている Azure Storage サービス | All                         | BLOB ストレージ（と Azure Files）    | BLOB ストレージ         |
| キー記憶域                                | Microsoft キー ストア       | Azure Key Vault または Key Vault HSM | カスタマーのキー ストア |
| キーのローテーションの責任                | Microsoft                   | カスタマー                           | カスタマー              |
| キー コントロール                         | Microsoft                   | カスタマー                           | カスタマー              |

## インフラストラクチャーの暗号化を使用したデータの二重暗号化について
- データのセキュリティについてより高いレベルの保証が必要な場合、Azure ストレージのインフラストラクチャレベルで 256 ビットの AES 暗号化を有効化することも可能とのこと。
- その場合、2 つの異なる暗号化アルゴリズムと 2 つの異なるキーを使用して、2 回暗号化される（インフラストラクチャレベルで 1 回、ストレージサービスレベルで 1 回）。
  - ストレージサービスレベルでの暗号では、Microsoft マネージドキーまたはカスタマーマネージドキーの使用がサポートされている。
  - インフラストラクチャレベルでの暗号では、Microsoft マネージドキーに依存し、常に別のキーが使用されている。
- インフラストラクチャの暗号化を有効にするストレージアカウントを作成する方法の詳細は、「[データの二重暗号化のためにインフラストラクチャ暗号化を有効にしてストレージアカウントを作成する](https://docs.microsoft.com/ja-jp/azure/storage/common/infrastructure-encryption-enable)」を参照とのこと。

## 参考にした資料
- [保存データに対する Azure Storage 暗号化](https://docs.microsoft.com/ja-jp/azure/storage/common/storage-service-encryption)
Doctrineで主キーの無いテーブルに対してSELECTをかける

# データを取りたいが重複したデータ（先頭データ）しか取れない

コントローラ内で、

```KaraagekunController.php
$this->KaraagekunRepository->findBy(['id' => $id]);
```

としてRepository経由でfindByしてデータを取ろうとしたら、
同じレコードが3件返ってきていた。
件数は3件で間違っていないものの、同じレコードが返ってくるのはおかしいと思って調べました。

# doctrineでは主キーの無いテーブルを推奨していない
みたいです。
なので、主キーの無いテーブルに対してレコード取ろうとしてて、
doctrine側でレコードが認識できずに変な値が返ってくるみたいですね。

# 解決方法
Repository内でQueryBuilderを使って取るしか方法なさそうでした。

```KaraagekunRepository.php
public function getData($id) {
    return $this->createQueryBuilder('t')
      ->select('t.id, t.type, t.price')
      ->where('t.id = :id')
      ->setParameter('id', $id)
      ->getQuery()
      ->getResult();
}
```

```KaraagekunController.php
$result = $this->KaraagekunRepository->getData($id);
```


そもそも主キーの無いテーブルがいいのか悪いのかって議論があると思いますが、
一応こういうやり方で取れましたっていう報告です。
ご参考までに！
Node.jsを勉強する⑤ - JSONファイルの書き込みと読み込み

##はじめに
前回は、 [npmモジュールの使い方](https://qiita.com/arata0520/items/91c47ea8742efee32a64)についてまとめました。
今回は、JSONファイルの作成と読み込みを記事にします。

##教材
Udemy
The Complete Node.js Developer Course (3rd Edition)
https://www.udemy.com/course/the-complete-nodejs-developer-course-2/

##データをJSONファイルに書き込む
まずは、app.jsファイルを作成して、Javascriptのオブジェクトを作成します。変数personを定義し、代入しておきましょう。

```javascript:app.js

const person = {
     name: "Taro",
     age: 25
}
```

次に、このデータをJSONファイルに変換してみます。
変換には、JSON.stringify()というメソッドを使います。データは変数のpersonJSONに代入しておきます。

```javascript:app.js

const person = {
     name: "Taro",
     age: 25
}

const personJSON = JSON.stringify(person)
```
データがJSON化されたので、これをファイルに書き出します。ファイルの操作を行うには、fsモジュールを使います。requireを用いて、fsモジュールを使えるようにします。

また。ファイルを作成するには、writeFileSync(ファイル名, データ）を使います。今回は、info.jsonという名前のファイルを作成します。

```javascript:app.js
const fs = require('fs')

const person = {
     name: "Taro",
     age: 25
}

const personJSON = JSON.stringify(person)

fs.writeFileSync('info.json', personJSON)
```

以下のようなJSONファイルが作成されたら、完成です。

```javascript:info.json
{"name":"Taro", age:25}
```

##JSONファイルを読み込む
今度は作成したJSONファイルを読み込んで、consoleに出力してみます。
新しくread.jsを作って試してみます。readFileSync（ファイル名）を用いて、データを取り出します

```javascript:read.js
const fs = require('fs')

//データを取りだす
const bufferData = fs.readFileSync('info.json')
```
ただし、この状態ではデータはバイト列なので、文字に変換する必要があります。

```javascript:read.js
const fs = require('fs')

//データを取りだす
const bufferData = fs.readFileSync('info.json')
// データを文字列に変換
const dataJSON = bufferData.toString()
```
最後に、データをJavascriptのオブジェクトに変換する処理をしてから、consoleに出力します。

```javascript:read.js
const fs = require('fs')

//データを取りだす
const bufferData = fs.readFileSync('info.json')

// データを文字列に変換
const dataJSON = bufferData.toString()

//JSONのデータをJavascriptのオブジェクトに
const data = JSON.parse(dataJSON)

console.log(data)
``` 

コードを実行し、ターミナルに、以下のように出力されれば、完成です。

```terminal:ターミナル
node read.js

{ name: 'Taro', age: 25 }
```

また、データをJavascriptのオブジェクトに変換しているので、以下のように要素を取り出すこともできます。

```javascript:read.js
const fs = require('fs')

//データを取りだす
const bufferData = fs.readFileSync('info.json')

// データを文字列に変換
const dataJSON = bufferData.toString()

//JSONのデータをJavascriptのオブジェクトに
const data = JSON.parse(dataJSON)

const name = data.name
const age = data.age
console.log(data.name + ' is '+ data.age + ' years old.')
```


```terminal:ターミナル
node read.js

Taro is 25 years old.
```
フォルダ内のExcelファイルを一括で取り込むLotusScript

ExcelのデータをNotesに取り込むLotus Scriptは以下に紹介されていますが、Excelで作成された勤務表のようにセルが固定されているものであれば、ファイルを逐一で指定して取り込むのではなく、ファイルが集められたディレクトリを指定して一括で取り込んだほうが便利です。
VBAで使用されているDir関数はNotesでも利用できるので、これを使ってサンプルコードを書いてみます。

[参考：ノーツ(LotusScipt)で、Excelブックを開いて操作する](https://qiita.com/otagaisama-1/items/88089c7b7d68ebc28be3)

#概要
エージェントの実行をすると、ファイルが格納されているフォルダのファイルパスの入力を要求する画面が表示されます。ファイルパスを入力すると指定したフォルダ内の全Excelファイルを対象にして、Notesへの取り込みを行います。

* サンプルでは、C:\Tempフォルダに山田一郎/山田次郎/山田三郎の勤務表（Excelファイル）があるという前提です。
* Notes側では、氏名/日付/開始時間/終了時間のフィールドを持つ取込用フォームを用意します。日付分の文書を作成し、勤務者の氏名でカテゴリ化して表示する方法を採用しています。

##サンプルコード
```
Sub Initialize
	
	On Error GoTo ErrorProc

	Dim ss As New NotesSession
	Dim db As NotesDatabase
	Dim doc As NotesDocument
	Dim i As Integer
	
	Set db = ss.Currentdatabase

	'--ファイルが格納されているフォルダを指定させる
	Dim FilePath As String
	Dim FileWC As String
	Dim FileName As String
	
	FilePath = InputBox("ディレクトリのパスを入力してください","一括取込")
	If IsEmpty(FilePath) Then
		Exit Sub		
	End If

	'--Excelの起動	
	Dim ExcelObject As Variant
	Dim ExcelBook As Variant
	Dim ExcelSheet As Variant

	'--ディレクトリ内の全てのExcelファイルを取得する。
	'Dir関数の引数を省略して実行すると、前回に指定されたワイルドカードが指定されたものとしてファイルを取得する
	'すでに取得されたファイルは除外され、すべてのファイルの取得が終わったときにブランク（””）を返す。
	FileWC = FilePath & "\" & "*.xls"
	FileName = Dir$(FileWC, 0)
	Do While FileName <> ""
		'--Excelの取り込み処理
		Set ExcelObject = CreateObject("Excel.Application")
		ExcelObject.Visible = False
		ExcelObject.DisplayAlerts = False
		Set ExcelBook = ExcelObject.Workbooks.Open(FilePath & "\" & FileName)
		Set ExcelSheet = ExcelBook.Worksheets(1)

		'1日から31日まで
		For i = 1 To 31
			Set doc = db.createdocument
			With doc
				.form = "main"
				.Uname = ExcelSheet.Cells(5, 1).Value
				.UDate = ExcelSheet.Cells(7 + i, 1).Value 		
				.UTimeS = ExcelSheet.Cells(7 + i, 4).Text	 
				.UTimeE = ExcelSheet.Cells(7 + i, 5).Text	
			End With
			Call doc.Save(True, True)
		Next
		ExcelObject.Quit
		Set ExcelObject = Nothing
		FileName = Dir$()
	Loop
	
	MsgBox "取り込み処理が終わりました",, "正常終了"
	Exit Sub
	
ErrorProc:	
	MsgBox "取り込み処理に失敗しました",, "異常終了"
	ExcelObject.Quit
	Set ExcelObject = Nothing

End Sub
```

##実行結果
全ての勤務者を取り込んで、勤務者をカテゴリにして、全ての日程を表示させています。

![取り込み結果.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/983034/f44a5008-a22a-60f7-5bab-da29c9cf7967.png)


##補足説明
Excelファイルを順次で取り込んでいるときにエラーが発生すると、非表示で動作しているExcelファイルがメモリ上に残ってしまうため、On Error Goto で、ExcelのClose処理を行う場所にジャンプするようにしています。
Gitでpushしてしまったcommitを削除するための方法

#きっかけ
gitを使い始めて一ヶ月ほど経った日に、ふとcommitした情報を消すためにはどうしたら良いのだろう、と思い立ったのがきっかけ。今までは、間違えてPushした時は、その上から上書きしていたが、消す方法も知るためにメモ。

#結論
revertをする。（任意でDiscardもすべし。）

#過程
git hub desctop内の左上にあるHistoryをクリック。
そして、消したいコミットを選択し、右クリックをする。
すると　Revert Changes in Commit　という文章が一番上に出てくるので、ポチッとクリック。
そして、Pushをすれば終了。

#注意すべき点
RevertをしてもHistoryには履歴としては残るため、ぱっと見には、本当に削除できたのかが分からない。
完全に削除したいときには、Pushした後に、右クリックをして、discard　をクリックすれば完全に消える。
【秘密分散】AONT秘密分散法のプロトコル解説

## はじめに

この記事では、AONT(All-Or-Nothing Transformation)と呼ばれる秘密分散法の一つを紹介します。秘密分散法については以下の記事で紹介していますので、よろしければご覧ください。

[【技術】秘密分散法とは。数式を用いて解説](https://acompany.tech/blog/technology-secret-sharing/)

AONTを用いた秘密分散は以下の特徴を持っているため、情報を効率的に秘匿化する目的で使用されています。

- 変換後のデータ容量が元データとほぼ同じ
- 分割された断片(シェア)を全て集めることで復元する
- シェアの大きさを任意に調整できる

ただし、Multi-party Computation(MPC)に使用することができないというデメリットもありますので注意が必要です。MPCについてはこちらの記事を参照してください。

[【技術】Multi Party Computationとは](https://acompany.tech/blog/technology-multi-party-computation/)

それでは、AONTの仕組みについてみていきましょう。

## AONTによる秘密分散化の仕組み

あるデータ$m$ をAONTで秘密分散させることを考えます。
使用する記号は以下です。

- データ$m$ を分割した$s$ 個のブロック

    $m_1, m_2, \cdots, m_s$

- 秘密分散後の$s+1$ 個のシェア

    $m_1', m_2', \cdots, m_s', m_{s+1}'$

- 共通鍵暗号の鍵

    $K$

- 公開された共通鍵暗号の鍵

    $K_0$

- 任意の共通鍵暗号化

    Enc(鍵, 平文)

この時の秘密分散化処理は以下になります。

1. $s$ 番目までの全てのブロックをシェアに変換する

    $m_i' = m_i \oplus Enc(K, i)$

    $i = 1, 2, \cdots, s$

2. シェアのハッシュ値を得る

    $h_i = Enc(K_0, m_i' \oplus i)$

3. $s+1$ 番目のブロックをシェアに変換する

    $m_{i+1}' = K \oplus h_1 \oplus h_2 \oplus \cdots \oplus h_s$

4. 鍵$K$ を破棄する

上記の方法を用いてデータ$m$ のシェアを生成することができました。この時、シェアのサイズが各ブロックのサイズと同じであることで、変換後のシェアデータ全体の大きさが、変換前のデータとほぼ同じになります。また、分割するブロックのサイズは任意に決めることができます。

## 復号の仕組み

復号時には以下の方法を用いて元のデータを得ます。

1. シェアのハッシュ値を得る

    $h_i = Enc(K_0, m_i' \oplus i)$

2. 共通鍵$K$ を復号する

    $K= m_{s+1}' \oplus h_1 \oplus h_2 \oplus \cdots \oplus h_s$

3. シェアからデータ$m$ を復号する

    $m_i = m_i' \oplus Enc(K, i)$

重要な点は、シェア生成時に破棄した共通鍵$K$ を復号する仕組みです。復号の正しさは以下で確認できます。ただし $a \oplus b \oplus b = a$  という関係を用います。

$\begin{array}{cll} m_{s+1}' \oplus h_1 \oplus h_2 \oplus \cdots \oplus h_s &=& (K \oplus h_1 \oplus \cdots \oplus h_s) \oplus h_1 \oplus \cdots \oplus h_s \\ &=& K\end{array}$

このようにして、全てのシェアを集めた時にのみ共通鍵を復号することができることで、秘密分散を実現できました。ただし、共通鍵$K$ がメッセージ$m_i'$ から容易に推定できると情報が漏洩してしまうため、鍵の長さがセキュリティパラメータとなります。実際に使用する場合は適切な暗号方式と鍵を選択する必要がある点に注意してください。

## まとめ

この記事のまとめは以下になります。

- AONTは全てのシェアを集めることで復元できる秘密分散法の一つ
- MPCに使用することはできない
- 元のデータ容量とほぼ同じ
- 内部で共通鍵暗号を用いている

### 参考文献

[https://people.csail.mit.edu/rivest/pubs/Riv97d.prepub.pdf](https://people.csail.mit.edu/rivest/pubs/Riv97d.prepub.pdf)
Squidで複数のProxyを操る

※この記事は[Proxyを華麗にスルーしてWi-Fiを飛ばすには -Qiita](https://qiita.com/yangniao23/items/be9eaf95ed87b1084bac)の環境を前提としています。まだお読みでない方はご一読の上こちらの記事をお読みください。

## 環境をざっくりと解説
- PC: ThinkPad T490 Arch Linux
- 認証付きProxy必須の環境
- Azure上に構築したHTTP ProxyをSSHポートフォワーディングで持ってきている
- create_apでWi-Fiを飛ばしていて，スマホはDronyを使いHTTP Proxy非対応のアプリもProxy経由で通信できるようにしている

## 困ったこと
- スマホは認証付きProxyだとうまく接続できないため，常時Azure上に構築したプロキシに接続させているから，追加でAzureの通信料金が発生する
- 認証付きProxyの方だと見れないサイトがある：Youtubeなど生活必需品

## 解決するために
ローカルにSquidを使ってProxyを構築し，時間帯・アクセス先のサイトに応じて代理接続するProxyサーバ先を選択できるようにした

192.168.1.1:8080に認証付きProxy，0.0.0.0:8888に外部Proxyがある環境の例 重要な設定を抜粋

```conf:/etc/squid/squid.conf
(前略)
cache_peer 192.168.1.1 parent 8080 0 no-query no-netdb-exchange no-digest login=ユーザ名:パスワード proxy-only
cache_peer 0.0.0.0     parent 8888 0 no-query no-netdb-exchange no-digest default

acl sorting time SMTWHF 1:00-6:00
acl blacklist dstdomain "/usr/local/etc/squid/blacklist"

(中略)

# ローカル環境には上位のプロキシを通さず直接接続
acl developersegments1 dst 192.168.1.1/24
always_direct allow developersegments1

never_direct allow all

# キャッシュしない
cache deny all

# 1:00から6:00にblacklistに掲載されているサイトにアクセスしたときは192.168.1.1に代理接続 **させない**
cache_peer_access 192.168.1.1 deny blacklist sorting
```

```:blacklist
.qiita.com
.youtube.com

.[domain]でそのドメイン全てを対象にできる
```

これで設定したポートに接続すると，192.168.1.1へ**認証なし**で優先的に接続され，1:00から6:00にblacklistに設定したサイトへアクセスしようとした場合は0.0.0.0のproxyへ接続される。
Android studio でSHA-1 key をcommand lineで得る方法

SHA1-key を取得するのに、Android studio のGradleタブから見てくれという記事ばっかで、command lineから取得する方法があんまり見当たらなかったのでここにメモ。

### 方法
1. Android studio の `android > gradle` の `gradlew` を右クリックし、 `Open in terminal`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557811/bb7c5a08-45c7-0c81-59e8-a4515baeff83.png)

2. 開いたターミナルで、

```
$ gradlew signingReport
or
$ ./gradlew signingReport
```

### 参考
https://stackoverflow.com/questions/51845559/generate-sha-1-for-flutter-app
【TouchDesigner】Feedback TOPの残り続ける薄い影問題


#追記
<blockquote class="twitter-tweet" data-conversation="none"><p lang="ja" dir="ltr">これテクスチャのフォーマットを16bitか32bitにしたらすぐ解決したりしません？</p>&mdash; 神田　竜 (@Kezzardrix) <a href="https://twitter.com/Kezzardrix/status/1346836237185740800?ref_src=twsrc%5Etfw">January 6, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

ということで下記のようなややこしいことをしなくても、フィードバックする`TOP`の`Pixel Format`を`16bit`か`32bit`に変更すると消えます。IPPON！


#発端
僕は`Feedback TOP`があまり好きではなく、その理由の一つに
「トレイルのために`Opacity`が`0.95`程度の`Level TOP`を繋いでだんだん消えていくようにすると、フィードバックした軌跡が薄く残り続ける」
というものがあります。
![feedback.0.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144702/c8a2860d-6af3-ec0c-437e-0e8a8ef34141.jpeg)
↑こいつ

今日はこの問題に終止符を打ちます。

#解決方法
`Threshold TOP`でトレイルの部分だけ表示して、`Multiply TOP`で切り取ります。
`Threshold`の値を`0`から大きくして正体を暴きましょう。
諸悪の根源がいますね。`Threshold`：`0.02`まではのうのうと居座っています。
![スクリーンショット 2021-01-06 154323.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144702/4c3a3eeb-5db0-89ff-ce8d-3346402c9b21.png)

`Threshold`：`0.03`
![スクリーンショット 2021-01-06 154541.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144702/503f26db-1e04-3632-23c8-dcdf19845cfe.png)
今です！！

![スクリーンショット 2021-01-06 154658.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144702/7ad0d71b-b7c2-7121-5f78-9de897b2b445.png)
ふう。
![feedback.1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144702/89599827-27a7-f8e5-ab53-1597c5313ae7.jpeg)

綺麗サッパリ消えました。
`Threshold`の値は、`Level TOP`の`Opacity`によって変わります。

#あとがき
少し苦手意識が消えました。
cloneしてきたファイルを自分のリポジトリにpushする際のエラー解決法

## 起きたこと
他の人のgitリポジトリからクローンしたものを編集し、自分のリポジトリにpushしようとしたところ、以下のエラーが出ました。

```
error: src refspec master does not match any
error: failed to push some refs to 'git@github.com:~~~'
```

## 原因

以下のコマンドで原因が分かりました。

```:ターミナル
$ git remote -v
```
↓

```
origin	git@github.com:クローンしてきたリポジトリ (fetch)
origin	git@github.com:クローンしてきたリポジトリ (push)
```

リモートリポジトリがクローンしたところのままになっていました。
クローンしたままのファイルをそのままpushしようとすると、push先が自分のリポジトリではなく、元々のリポジトリにpushしようとするためエラーが発生します。


## 解決法1

自分のリポジトリのURLを指定してpushする。

```:ターミナル
$ git push （自分のリポジトリのURL） main
```

<br>
(2021年1月15日追記)
## 解決法2

新しいリモートURLに変更する。

```:ターミナル
$ git remote set-url origin https://github.com/変更したいユーザーネーム/リポジトリ名.git
```
<br>
変更できているか確認します。

```:ターミナル
$ git remote -v
```
↓

```
origin  https://github.com/変更後のユーザーネーム/リポジトリ名.git (fetch)
origin  https://github.com/変更後のユーザーネーム/リポジトリ名.git (push)
```

これにて`git push -u origin main`でpushできるようになりました。

参照元：[Changing a remote's URL - GitHub Docs](https://docs.github.com/en/free-pro-team@latest/github/using-git/changing-a-remotes-url)
ボタンをクリックして要素を非表示から表示に切り替える


````html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8" name="Content-Style-Type" content="text/css">
    <title>Document</title>
</head>
<body>
    <h1 style="display: none;">サンプルタイトル</h1>
    <h2 style="display: none;">サンプルタイトル</h2>
    <button>ボタン</button>

    <script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
    <script>
        $('button').click(function() {
            $('h1').toggle();
            $('h2').toggle();
        })
    </script>
</body>
</html>
````
個人的によく利用するシェルコマンド備忘録

* 個人的にシェルスクリプト内でAWS CLIコマンドを実行し、AWSリソースを作成することがある。
* その際によく利用しているシェルコマンドを備忘録としてまとめる。

## ファイルの一括読み込み

* **ユースケース**

  * 変数ファイル(.env)を一括で読み込み、環境変数に埋め込みたい場合。

    ```shell
    set -a; for f in ./env/*.env; do . ${f}; done; set +a;
    ```

## ディレクトリパスを取得する

* **ユースケース**

  * 実行スクリプト内でスクリプトのディレクトリパスを取得したい場合。

    ```shell
    dir=$(dirname $0)
    ```

    `/home/bin/xxx.sh`のように実行した場合、`/home/bin`が取得される。

    

## 一時的なJSONデータを作成する

* **ユースケース**
  * AWS CLIコマンドに渡す一時的なJSONデータを作成したい場合。

### 外部のJSONファイルをベースに作成したい場合

* JSON構造が複雑で、スクリプト内部にJSONを定義したくない場合。

```shell
test_json_path=$(dirname $0)/json/test.json
test_json=$(cat ${test_json_path})
tempfile=$(mktemp) 
echo ${test_json} | envsubst > ${tempfile}
```

※`envsubst`利用

### スクリプト内部で定義したJSONデータをベースに作成したい場合

* JSON構造が簡潔で、スクリプト内部にJSONを定義したい場合。

```shell
tempfile=$(mktemp)
cat  > ${tempfile} << EOS
{
	# JSON
}
EOS
```

※ヒアドキュメント利用



※スクリプト実行後には、`tempfile`を削除することを忘れない。

## JSONから任意の値を取得する。

* ユースケース

  * AWS CLIの実行結果として出力されたJSONから任意の値を取得したい場合。

    ```shell
    response=$(AWS CLIコマンド)
    target_value=$(echo ${response} | jq -r ".HogeId")
    ```
    ※`jq`コマンド利用
    ※ダブルクォートなしで取得
    ※場合によっては、AWS CLI `--query`オプションを使用する。

## 参考情報

* [ディレクトリ名を取得するdirnameコマンドの使い方【Linuxコマンド集】](https://eng-entrance.com/linux-command-dirname)
* [jq コマンドを使う日常のご紹介](https://qiita.com/takeshinoda@github/items/2dec7a72930ec1f658af#%E5%80%A4%E3%81%AE%E5%88%97%E6%8C%99)
* [低機能でポータブルなテンプレートエンジンが欲しい→そこでenvsubstですよ](https://qiita.com/hnw/items/3d8bad7852510c3a84d7)
* [簡単なシェルスクリプトの備忘録](https://qiita.com/hirotaka-tajiri/items/d0def8ff5abc03e6afc4)
* [AWS CLI からのコマンド出力の制御](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-usage-output.html)
[React]refのchildrenから特定のclassNameを持つElementを取得する

ライブラリのDOM触るときとかに使うのでメモ

```ts
import React from 'react'

export default function Foo() {
  const ref = React.useRef<HTMLDivElement>(null)

  React.useEffect(() => {
      const element = Array.from(ref.current?.children || []).find(
        (item) => item.className === 'some-class-name'
      )
      ...
  }, [ref])
  
  return (
    <div ref={ref}>
      /*~*/
    <div/>
  )
}
```
リストの追加・削除等について（Ruby学習後のPython初学）

#リストの追加・削除等

PythonのリストはRubyにおける配列のようなもの。


```python:list.py
list = [0, 1, 2]
len(list)  #リストの要素数を調べる、この場合は3
list.append(3)  #リストの最後に要素を追加、この場合は2の次にカンマが入って3が入る
list.pop(3)  #リストの指定した番号の要素を削除、この場合は3が削除される
```

ちなみにcsvのファイルもカンマで区切られているリスト扱いとなるのでリスト操作できるということになる。
Webアプリ概要のメモ

#はじめに
個人的に調査した際の雑感メモです。

#レンダリングから見た歴史

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233237/9cd18aa1-f20e-44b3-9c38-e551a5a03bd3.png)

#.Netでの開発区分
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233237/904ffc85-2b34-b0f3-4ca3-490f499dc36c.png)

※Viewフレームワークという言い方はおかしい気もする。
GPU で curve fitting する gpufit のメモ

GPU(CUDA) で Levenberg Marquardt 法(LM 法)でフィッティング(最適化する)ライブラリです.

https://github.com/gpufit/Gpufit

Windows はバイナリがありますが, Linux はソースコードからビルドが必要です.

https://gpufit.readthedocs.io/en/latest/installation.html#compiling-gpufit-on-linux

## python binding

python バインディングもあります
(cmake ビルド時に whl が生成される)

git repo のサンプルコードみればだいたい使い方はわかるかと思います(Numpy を使っています).

## 注意事項

最新(CUDA 10 くらい?)nvcc だと sm30 などの古いアーキテクチャはサポートされなくなったため, cmake そのままですとアーキテクチャ選択がうまくいかず sm30 など古いアーキテクチャも含めてしまうため, コンパイルがコケます.

`-DCUDA_ARCHITECTURES="7.0"` あたりで利用するアーキテクチャを明示的に cmake に指定しましょう.
ローカルデスクトップ検索・操作方法備忘

記憶力が無い上にデスクトップが汚いため、
対象ファイルを探し出して、対象ファイルの中身も検索して、という泥臭い作業をやたらやってるので、
道具を紹介する。

■検索

１：ファイル名の一部のみ分かってる状態でWindows内のファイルを全検索する。
[Everything](https://forest.watch.impress.co.jp/library/software/everything/)を使う


２：特定ディレクトリ下の、ファイル一覧を取得する。
	コマンドプロンプトで対象ディレクトリに移動し、以下コマンドを使う
```
dir * /s /b
```

３：特定ディレクトリ下の、特定拡張子のファイル一覧を取得する。（例：pdf）
	コマンドプロンプトで対象ディレクトリに移動し、以下コマンドを使う
```
dir *.pdf /s /b
```

４：Windowsでgrepを行う
	サクラエディタでgrepを使う

５：1ファイル内で、重複行の存在有無をチェックする。（Excelでやるのが面倒な場合）
	サクラエディタで
Ctrl+a（全て選択）
 → Alt+a（選択行を全てソート）※最終行末尾に改行が無いと、最終行のみ対象外となるので注意
 → Alt+m（連続した同一内容行を削除）


６：複数行×複数行で同一行の存在有無を検索する
ExcelでVLOOKUPを使う

７：複数のExcelファイル内を一括検索する
[AiperEditex](https://forest.watch.impress.co.jp/library/software/aipereditex/)を使う


■差分比較

８：フォルダ/ファイルの差分検索
[WinMerge](https://forest.watch.impress.co.jp/library/software/winmerge/)を使う

９：DBの差分検索
[Popular Beetle](https://www.vector.co.jp/soft/winnt/business/se498449.html)を使う


■まとめて操作

１０：grep置換
サクラエディタで「grep置換」機能を使う

■マルチカーソルでまとめて操作

１１：一つのファイル内に複数出てくる単語を一括操作する
VSCodeで対象の単語を選択してCtrl+d（一つ戻す場合はCtrl+Shift+d）

１２：複数行を一括操作する
VSCodeで対象行を選択してCtrl+Shit+L

１３：正規表現で対象を抽出して一括操作する
VSCodeでCtrl+fで検索し、Ctrl+Shit+L→Esc

■サブフォルダごと一括操作

１４：サブフォルダも含めて比較し、差異のあるファイルのみ、フォルダの階層を維持しつつ抽出する。
[Saboon!](https://www.vector.co.jp/soft/winnt/util/se441315.html)を使う

１５：サブフォルダも含めて、空フォルダを削除する。
[DelFolder](https://www.vector.co.jp/soft/win95/util/se329220.html)を使う
【vroid】白目を加工するべからず【失敗談】

# 動作環境
本記事の動作環境は以下の通り。
(2.9にアップデートしました)
 
| 項目             |               環境 |
|:-----------------|:------------------|
| OS               |         Windows 10 | 
| Vroid          |               0.12.1 |


# 要約

白目を加工して驚きの表情を作ろうとして失敗した話。
<img width="600" alt="neutral.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682933/ca54df3a-8c5d-fbde-dea3-9fbdccc8ba24.png">


Vroidの表情設定で、瞳を隠すを100すると、文字通り瞳が隠れる。

<img width="600" alt="surprised.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682933/d8a57eb4-72e2-b87e-d1a8-ce2358dbff1d.png">

そこで、白目のテクスチャを加工して驚きの表情で別の瞳を出すようにした。
<img width="600" alt="surprised2.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682933/6116b64e-6451-7686-d281-0c7ca08a6bd3.png">



が、他の表情で瞳の下から驚き用の瞳が見えてしまう始末…

<img width="600" alt="neutral.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682933/ca54df3a-8c5d-fbde-dea3-9fbdccc8ba24.png">

気が向いたらblenderでトライしようかな。
Vuforia Studio CSS備忘録：2D画面上の指定位置にウィジェットを表示


#はじめに

Vuforia Studioでは、2Dウィジェットをドラッグ＆ドロップで簡単に2D画面レイアウトに配置できるが、レイアウトの位置に制約されてしまい、自由な位置指定ができない。だが、CSSを使うと、その制約にとらわれずに表示位置を指定できるので、備忘録としておく。

#前提

この備忘録は、Vuforia Studioで、2Dウィジェットを含むARコンテンツを独力で作成できる人が対象。

#CSSの例

###例：テキスト領域を画面中央より少し下に表示

Vuforia Studioで、2D画面レイアウトに、テキスト領域をドラッグ＆ドロップで配置してみる。
表示位置は、レイアウトの制約を受ける。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297270/6a0ee526-f3bb-fe43-ee5a-601beefb555d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297270/7254793c-fdac-37ac-576d-6f952605b37a.png)
画面中央より少し下に表示させたいのだが、どうすればいいのか？
そのためには、アプリケーションにて、以下のスタイルを追加する。
※ テキスト領域用のCSSの定義には、「textarea」の記載が必要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297270/5d098192-3b11-8574-d554-54521120b511.png)
配置したテキスト領域のクラスプロパティに、上記で追加したスタイルを設定すると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297270/b1bd3d3b-d6d4-6958-5ba3-685254439c63.png)
テキスト領域の表示位置が、スタイルで指定した位置になった。出来た！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297270/bbf69bad-70ec-b7e2-4f9d-218b40f9ebbb.png)

尚、位置を指定できたものの、テキスト領域のデフォルト表示は、白を背景に黒文字であり、ARに使う表示としては見栄えがよくない。背景色と文字色を変更し、背景を半透明にすると見栄えが良くなりそう。そのCSSはまた別の備忘録にて。

###例：グリッドレイアウトの表示位置を指定

他の2Dウィジェットも同様に、CSSで表示位置を指定できる。もう一つの例として、複数のウィジェットをまとめて表示できるグリッドレイアウトに指定してみる。
アプリケーションにて、以下のスタイルを追加して、グリッドレイアウトのクラスに設定すると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297270/8d619400-cafc-5ef1-74d3-4df234f5562d.png)
グリッドレイアウト（イメージとラベルの組合せ）の表示位置が、スタイルで指定した位置になった。出来た！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297270/8a1611d8-6ac2-c61d-db3f-10f61c86347e.png)


#おわりに

Vuforia Studioで2Dウィジットを、CSSを使い指定位置に表示させることができると、より効果的なAR画面を、より簡単に作成出来る。いざというときに使える。

#参考

・[Vuforia Studio CSS備忘録：2D画面上の指定位置に縦スライダーを表示](https://qiita.com/tm181001/items/2809e72bed5a5a8c6ebe)

・[Vuforia Studio で作成できるAR例～タブレットAR例、3D形状の特徴で実物にARを重畳（モデルターゲット）、2D画面上の表示や操作を組合せ]
(https://players.brightcove.net/1532789042001/HknUe20R_default/index.html?directedMigration=true&videoId=6120145841001)
【Excel】オートフィルタの割と知らない小技たち

# あなたの知らないオートフィルタ
毎日のように使うExcel。
各種プログラミング言語と違い、新人教育とかでも特に教えてもらった記憶はありません。
まあ、習うより慣れろって感じもするし、仕方ないとは思うのですが。
その上で不便だなって思ったときに改善策を模索しないタイプの人の方が多いらしくて、「そんなことできるんですか！？」って驚かれたりすることも結構あります。
ここではオートフィルタについて、関数とかVBAなどではなくExcelデフォルトでちょっと驚かれた機能を紹介します。



# フィルタ条件
## 文字列(データ)でのフィルタ
オートフィルタを使うなら、セル内のデータを基にフィルタリングするのが一般的だと思います。
デフォルトではオートフィルタのプルダウンにあるテキストボックスに入力するか、リストからチェックボックスを選択したりチェックを外したりしますよね。
テキストボックスは部分一致検索となっていて、入力した条件を含むデータをリストに抽出してくれます。

「テキストフィルター」や「数値フィルター」の中から「ユーザー設定フィルター」を選択すると、下のようなダイアログが開きます。
ここで設定することで、前方一致や後方一致、範囲検索もできますし、`And`、`Or`で複数条件を指定することも可能になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117413/032222c1-3898-80c4-b9ba-0259b742303d.png)

## 色分けフィルタ
セル内のデータではなく、セルの背景色や文字色をフィルタ条件にしたいと思ったことはありませんか？
実はオートフィルタのメニューに最初から組み込まれているので、とっても簡単に設定できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117413/d1b7b528-f440-a094-86dc-c6adbf2a078b.png)

セルの背景色、文字色の両方が表示されていますが、ひとつだけをフィルタ条件として設定できます。
「背景色がピンクかつ文字色が緑」とか、複合条件は設定できません。
上図の表では、「背景色」列は「セルの色でフィルター」、「文字色」列は「フォントの色でフィルター」のみが表示されます。

### 色で並べ替えもできるよ
ちなみに上図にも見えていますが、色で並べ替えも可能です。フィルターと一緒で色を選ぶだけ。
選択した色のセルをまとめて上部に持ってきてくれます。ただし、選択しなかった色は並べ替えられないでそのまま残りますが。
もっと細かく設定する場合は、「ユーザー設定の並び替え」を選択すると下図のダイアログが表示されて、詳細設定が可能になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117413/f5b08f0f-d78a-8f0c-70da-1dd1ded252a6.png)

---

# フィルタ設定状態でのデータの編集
フィルタを設定して、条件に一致するセルだけにコピーアンドペーストをしたい。よくあることです。
ですが、そのまま列を選択して貼り付けると……フィルタによって非表示になっているセルまでペーストされてしまうことってありませんか？
これもショートカットキー一発で解決することができます。

まずはいつも通りにペースト先のセルを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117413/996be1ea-3175-c15c-82fd-a39b2174a99d.png)


ここでショートカットキー**「`Alt`＋`;`」**を押します。
するとほら！選択範囲が、表示されているセルだけに変わります！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117413/f5589462-dbd2-8894-6676-bcf56a15ef52.png)

これは結構検索しました…検索ワードがなかなかうまくいかなくて。こんな便利なのに認知度低いの検索の難易度のせいでは…？

ちなみにこの機能は、「ホーム」リボンの「検索と選択」の「条件を選択してジャンプ」の「可視セル」にあたります。
下図のメニューを開くのではなく、直接のショートカットキーがあるのがありがたいですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117413/ecf5f274-458c-135f-966c-8b7b9886e066.png)

---

知っているのと知らないのでは、作業効率がマジで段違いの2機能でした。
快適なExcelライフにお役立てください。
PHPの変数にHTML要素を格納する

# 目的

- HTMLのtable要素の一連の文字列をPHPの変数に格納する時に若干詰まったので方法をメモ的にまとめておく。

# 方法


- `""`(ダブルクオート)ではなく`''`(シングルクオート)でくくるようにする。（`""`でくくるとHTML要素のクラス名の指定部分などと競合してエラーになる。どうしても`""`でくくりたいなら文字列として扱うHTML要素の中の`""`を`\`でエスケープする。）

- シングルクオートでHTMLの要素をくくる方法を下記に記載する。

    ```php
    $content = '<table border="1"><tr><th>info_1</th><th>info_2</th></tr><tr><td>Tokyo</td><td>Kanagawa</td></tr><tr><td>Osaka</td><td>Hyougo</td></tr></table>';
    ```

- どうしてもダブルクオートでHTMLの要素をくくる時は下記のように要素内の`""`をエスケープして文字列として変数に格納する。

    ```php
    $content = "<table border=\"1\"><tr><th>info_1</th><th>info_2</th></tr><tr><td>Tokyo</td><td>Kanagawa</td></tr><tr><td>Osaka</td><td>Hyougo</td></tr></table>";
    ```

- 下記方法はNG!!!要素中の`""`がPHPの文字列認識の`""`と競合してしまう。

    ```php
    $content = "<table border="1"><tr><th>info_1</th><th>info_2</th></tr><tr><td>Tokyo</td><td>Kanagawa</td></tr><tr><td>Osaka</td><td>Hyougo</td></tr></table>";
    ```
EncryptedSharedPreferencesのところで落ちる件

ただの備忘録なのであまり本質的でないです。

# 困ったこと
昨日まで動いていた開発中のAndroidアプリが、エミュレータ上で落ちる。

#どこで落ちているか
ここ。つまりEncryptedSharedPreferencesを開くところ。

```kotlin
    @Synchronized
    fun getPreferences(): SharedPreferences {
        val masterKey = MasterKey.Builder(getApplication(), MasterKey.DEFAULT_MASTER_KEY_ALIAS)
                .setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
                .build()
        return EncryptedSharedPreferences.create(getApplication(),
                "my_app",
                masterKey,
                EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
                EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM)
    }
```
※「ここを呼び出している大元のクラス」が例外を吐いた後、改めてここが例外を吐くので、一見気付かないことがある(これではまった)。

#何が原因か
エミュレータおよび一部実機のAndroidKeyStoreの実装がおかしいらしい。

#ワークアラウンド
AVD Managerで当該エミュレータのAVDを Stop→Wipe Data→Launch してから改めてアプリを起動。
`androidx.security:security-crypto` ライブラリのバージョンによって治ったり治らなかったりするいう報告もあり。

#参考
[Google Issue Tracker](https://issuetracker.google.com/issues/147480931)
意外と知らないスプレッドシートによる範囲結合と小ネタ5選

## はじめに
意外と知られていないスプレッドシートの**セル範囲の結合**を使った例を5つ紹介します。
<img width="100" alt="スマホを持つ猫" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618790/5255d32a-a992-a69f-3281-3eb872aeae5f.png">

スプレッドシートの関数では、`{範囲,範囲}`で**横方向**、`{範囲;範囲}`で**縦方向**にセルの範囲を結合することができます。公式ドキュメントは以下です。

Google スプレッドシートで配列を使用する
https://support.google.com/docs/answer/6208276?hl=ja

### 縦方向に結合する
![スクリーンショット 2021-01-06 14.14.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618790/d13338b7-bfad-34b0-621b-37fe4cb548b8.png)
`={A2:A4;B2:B4}`

2列の値を1列にすることができました。

### 横方向に結合する
![スクリーンショット 2021-01-06 14.12.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618790/619738d5-90cb-b490-53dc-d298acd7e77f.png)
`={A2:A4,B5;B7}`

1列の値を2列にすることができました。今回はこの配列結合を組み合わせた応用例を紹介します。

## 1.VLOOKUPの検索値より左の値を返す
![スクリーンショット 2021-01-06 10.38.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618790/94847aea-d81b-ba4c-2ad4-e889dcc144c3.png)
`=VLOOKUP(E2,{C2:C4,B2:B4},2,false)`

通常VLOOKUPは範囲の検索値より、右方向の値しか取り出せませんが、配列の結合を用いることで関数の中で入れ替えを行えます。`{品名,値段}`の配列を作ることで、品名を元に値段を取り出せます。

![スクリーンショット 2021-01-06 10.38.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618790/446c70c5-fb0a-3b7f-2757-984a58cf6db5.png)
`=FILTER(B2:B4,C2:C4=E2)`
なお、このケースはフィルタ関数でも代用可能です。フィルタの場合、検索値に一致する要素が複数ある場合、結果が配列で取り出せます。

## 2.複数ある表からVLOOKUPで値を返す
![スクリーンショット 2021-01-06 11.08.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618790/642f9ae3-f885-5d47-2f33-254e537d22ba.png)
`=VLOOKUP(I2,{C2:C4,B2:B4;G2:G4,F2:F4},2,false)`

```
{
表Aの品名,表Aの値段;
表Bの品名,表Bの値段
}
```
セミコロンで繋ぐことで、縦方向に結合して1つの表として、VLOOKUPの範囲にすることができます。これは月毎に表が別のシートにある場合などのケースで活用できます。

## 3.今日の日付のセルへジャンプする
![スクリーンショット 2021-01-06 11.36.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618790/fe965c77-9291-c33c-6c30-0f3fc25f5d4b.png)
`=HYPERLINK("#gid=944597197&range="&"A"&VLOOKUP(TODAY(),{A2:A,ARRAYFORMULA(ROW(A2:A))},2,false), "今日の日付のセルへ")`

配列結合を使った応用例です。
HYPERLINKが入ったセルをクリックするだけで、今日の日付が入ったA列にジャンプする関数です。

`gid=`にシートid、`range=`にセル番地を入れます。

今日の日付のセル番地は`ARRAYFORMULA`関数と行関数`ROW`を組み合わせて配列を作り、`{日付,行番号}`の配列を作っています。

## 4.値が含まれている最終行を取得する
![スクリーンショット 2021-01-06 14.50.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618790/69bca1ee-099c-7d9d-35d7-42f09c770d36.png)

`=MAX(ARRAYFORMULA(FILTER(ROW(A2:A),A2:A<>"")))`

`FILTER`関数で値が空白ではない、行番号を返し、`MAX`でその行の最終行を取得しています。列も同様の方法で取得可能です。空白を無視した最大行は`ROWS`関数だけで取得できます。

## 5.進捗ゲージぽいものを表示する方法
![スクリーンショット 2021-01-06 12.16.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618790/4adf158d-ff0f-dd4a-c173-a20474dccf68.png)

`=SPARKLINE({A2,1},{"charttype","bar";"max",1;"min",0;"color1","#5468ff";"color2","#bbb6b8"})`

配列結合を応用し、`color2`にグラフの最大値を結合することで、背景色ぽく使用できます。進捗が100%になったら色を変えるなど、応用も可能です。


## さいごに
今回は配列の結合を使った応用例を紹介しました。まだまだ、色々な活用方法があるかもしれません。この記事がお役に立てれば幸いです。
[python] 16進数表記のRGB値を暗くするメソッド

```python:
def darken(rgb, rate=0.5):
    rgb = rgb.replace('#', '')
    s = '#'
    for i in [0,2,4]:
        c = rgb[i:i+2]
        c = int(c, 16)
        c = int(c * rate)
        c = format(c, '02x')
        s += c
    return s

# 使用例
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
color_orig = [
    '#C5DAEE',
    '#ABCFE5',
    '#8DC0DD',
    '#6AADD5',
    '#4F9BCB',
    '#3787C0',
    '#2070B4',
    '#0F5BA3',
    '#08458B',
    '#08306B',
]
color = [
    [darken(c) for c in color_orig],
    color_orig,
]
df = pd.DataFrame([np.ones(10), np.ones(10)], columns=[x[1] + '\n' + x[0] for x in np.array(color).T])
df.T.plot.bar(color=color, stacked=True)
plt.legend().remove()
plt.yticks([])
plt.xticks(rotation=0)
plt.show()
```

out:

![スクリーンショット 2021-01-06 午後2.59.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178570/c9066181-26d9-3390-4ef9-abf0a203182a.png)