OmniAICreator/Qiita-1.07M huggingface dataset:
TypeScript: Proxyを使ってオブジェクトのmix-inを実現する方法

TypeScriptで、2つのオブジェクトをmix-inして、オブジェクトの機能を拡張する方法です。

## やりたいこと

たとえば、下記の`Foo`オブジェクトと`Bar`オブジェクトを合成して、どちらのメソッドも持った`FooBar`オブジェクトを作る方法を説明します。

```typescript
class Foo {
  getFoo(): string {
    return 'foo'
  }
}

class Bar {
  getBar(): string {
    return 'bar'
  }
}

const foo = new Foo()
const bar = new Bar()
const fooBar = mixin(foo, bar)
fooBar.getFoo() // Fooのメソッドも
fooBar.getBar() // Barのメソッドも呼べる！
```

(伝わる人いるか分かりませんが、Scalaの`new Class with Trait`みたいなイメージです)

## 実現方法

JavaScriptの`Proxy`クラスを用います。簡単に言うと、`Foo`オブジェクトを`Bar`オブジェクトでラップするようなイメージです。

なので、`Bar`オブジェクトにプロパティがあればそれが採用され、なければ、`Foo`オブジェクトのメソッドを採用する。どちらにも無ければ`undefined`といった処理になります。

次の`mixin`関数が、2つのオブジェクトを合成してくれる汎用的な関数の実装です:

```typescript
const mixin = <T extends object, U extends object>(
  object: T,
  trait: U,
): Mixin<T, U> =>
  new Proxy(object, {
    get: (target, key) => (trait as any)[key] ?? (target as any)[key],
    has: (target, key) => key in trait || key in target,
  }) as any

type Mixin<T extends object, U extends object> = Omit<T, keyof U> & U
```

TypeScriptコードだと型がごちゃついてますが、JavaScriptの部分だけ取り出して見ると、何をしているかより分かりやすいと思います:

```js
const mixin = (object, trait) => new Proxy(object, {
    get: (target, key) => trait[key] ?? target[key],
    has: (target, key) => key in trait || key in target,
})
```

`mixin`関数に2つのオブジェクトを渡せるようになっていて、2つ目のオブジェクトにプロパティがあればそれを採用、なければ1つ目のオブジェクトのものを採用、といったように先述した処理になっているのがわかるかと思います。

## 使い方

先程の`foo`と`bar`をmix-inしてみます:

```typescript
const fooBar = mixin(foo, bar)

console.log(fooBar.getFoo()) //=> "foo
console.log(fooBar.getBar()) //=> "bar"
```

## ミックスイン先の`this`の参照

`Bar`から`Foo`の`getFoo()`メソッドを使いたい場合、`this.getFoo()`で呼び出したいところですが、TypeScriptは`Bar`が`Foo`にミックスインされることは知らないので、「BarにはgetFooがないよ」というコンパイルエラーになってしまいます。

<img width="527" alt="TypeScript__Playground_-_An_online_editor_for_exploring_TypeScript_and_JavaScript.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889/26f31f3c-adb9-0c51-7483-270fb317e9c5.png">

このようにミックスイン先のプロパティを参照する場合は、`this`の型を明示する必要があります。

```typescript
class Bar {
  getBar(): string {
    return 'bar'
  }
  
  getFoobar(this: Mixin<Foo, Bar>): string {
//          ^^^^^^^^^^^^^^^^^^^^^
    return this.getFoo() + this.getBar()
  }
}
```
MSSQLに関わる小ネタ（昔のメモ）

# MSSQLに関わる小ネタ


<strong>SQLServerで文字列のバイト長を取得するクエリ</strong>  
１．バイト数を取得  
`DATALENGTH(CONVERT(VARCHAR(30), [COLUMN]))`

２．左から２バイト取得(LEFT()関数もどき)  
`CONVERT(VARCHAR(2), [COLUMN])`

３．最後から４バイト取得(RIGHT()関数もどき)  
`REVERSE(CONVERT(VARCHAR(4), REVERSE([COLUMN])))`

***

<strong>Padleft,Padrightもどき</strong>  
(''00000'')はカラムの最大桁まで指定しておく。  
5桁、左、0埋め  
`SELECT RIGHT(''00000'' + COL ,5) AS CODE FROM TABLE`

5桁、右、0埋め  
`SELECT LEFT(COL + ''00000'' ,5) AS CODE FROM TABLE`

***

<strong>重複行の取得</strong>  
SQLServerはこれでいけた。

	SELECT [COLUMN(S)]
	FROM [TABLE]
	GROUP BY [COLUMN(S)]
	HAVING COUNT > 1


***

<strong>SQLServerでリンクサーバの構成・解除</strong>  
2008までかな？  

	--リンクサーバ構成
	USE master
	GO

	EXEC master.dbo.sp_addlinkedserver
	@server = N''[ServerAddress]\\[INSTANCE]'' ,
	@srvproduct = N''SQL Server'';
	GO

	EXEC master.dbo.sp_addlinkedsrvlogin
	@rmtsrvname = N''[ServerAddress]\\[INSTANCE]'' ,
	@useself = N''False'', 
	@locallogin = NULL , 
	@rmtuser = ''[USER_ID]'', 
	@rmtpassword = ''[PASSWD]'';
	GO

-

	--リンクサーバ削除
	USE master
	GO

	EXEC master.dbo.sp_dropserver 
	@server = N''[ServerAddress]\\[INSTANCE]'' ,
	@droplogins = ''droplogins'';
	GO

-

	--リンクサーバ取得
	select * from sys.servers where is_linked = ''1''
	and name = ''''

-

	--確認用クエリ
	SELECT name FROM [ServerAddress]\\[INSTANCE].MASTER.SYS.DATABASES


***

<strong>SSMSで実行結果をミリ秒まで出す</strong>  

	DECLARE @StartTime datetime -- 処理開始時刻保存用変数
	SET @StartTime = GETDATE() -- 処理開始時刻設定

	/* ↓↓↓ 以下に処理時間を計測したいSQL文を書く*/

	/* ↑↑↑ ここまで計測対象 */
	SELECT CONVERT(varchar,GETDATE()-@StartTime,114) AS 実行時間 

[ＳＱＬの実行時間をミリ秒単位で計測する方法](http://sqltips.blog40.fc2.com/blog-entry-10.html)

***

<strong>全テーブルの件数を取得</strong>

	SELECT A.NAME, B.ROW_COUNT 
	FROM SYS.TABLES A
	LEFT JOIN SYS.DM_DB_PARTITION_STATS B
	ON A.OBJECT_ID = B.OBJECT_ID
	ORDER BY A.OBJECT_ID
mysqldumpが親切で不親切

##dumpとは
みなさん、dumpって知ってます？
dumpって機能を使うとデータベースのバックアップが取れたり、特定テーブルの定義だけsqlとして保存できたりと(ガバ解説)、なかなか便利なんです。

##dumpを取りたい
じゃあ早速dumpを取らせていただきますかァ・・・

```sql
mysql> mysqldump -u root -p -A -t > dump.sql;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'mysqldump -u root -p -A -t > dump.sql' at line 1
```

**ﾐ゛ｯ(絶命)**

##なぜ取れないのか
至極簡単な話でしてェ・・・
mysqldumpってのはmysqlに入った状態だと使えないっぽいんですね。

ということでコマンドプロンプトで

```sql
hogehoge>mysqldump -u root -p -A -t > dump.sql
```

って感じで打ってあげるとパスワード入力に遷移して解決って話でした。
dumpファイルはコマンドを実行したカレントディレクトリに生成されますね。

##最後に
親切だけど不親切ってタイトルですけど、完全に私の知識不足と八つ当たりです。
そんな私の備忘録として、これを残したいと思います。
OpenSSL 3.0 dev のビルド方法

* Ubuntu 20.04 にて確認。

## ダウンロード

* https://www.openssl.org/source/snapshot/

## ビルド

```sh
apt install -y build-essential

tar xzf openssl-3.0-dev-SNAP-20200418.tar.gz
cd openssl-3.0-dev-SNAP-20200418

cat INSTALL.md

./config
make -s
make test
make install
```


![スクリーンショット_2020-04-20_12-42-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/87eaa211-2594-a785-9791-a84647e897dc.png)
mt全カテゴリー一覧出力（親子）

## 全カテゴリー一覧出力（親子）
```
<mt:TopLevelCategories>
```

だと親しか出力されず

```
<mt:SubCategories>
```

だと子しか出力されず
全部取得したい場合に

```
<mt:TopLevelCategories>
<mt:SetVarBlock name="TopLevelCategories_name"><$mt:CategoryLabel$></mt:SetVarBlock>
<$mt:CategoryLabel$>
<mt:SubCategories category="$TopLevelCategories_name">
<$mt:CategoryLabel$>
</mt:SubCategories>
</mt:TopLevelCategories>
```

親カテゴリーで子を絞ってループさせる

```
<mt:SetVarBlock name="TopLevelCategories_name"><$mt:CategoryLabel$></mt:SetVarBlock>
```

検索しても記事一覧を取得しているのが多かったのでメモ
for...inとfor...ofの違い

#初めに

for...inとfor...ofの違いが曖昧だったのでまとめることにする。
##for...in
###for...inは指定されたれ連想配列（オブジェクト）から要素を取り出して先頭から順に処理する。


```for_in.js
for( 仮変数 in 連想配列（オブジェクト） ) { 
   // 処理 
}
```
あくまでも出力されるのは`キー`であり、`バリュー`ではない。
なので、下記のようになる。

```honda.js
var myTeam = {
    name: '本田',
    age: '33',
    birthplace: '大阪'
}
            
for( var item in myTeam){
    console.log(item);
} 

//name
//age
//birthplace
```

`バリュー`を出したければ下記のようにする

```honda2.js

var myTeam = {
    name: '本田',
    age: '33',
    birthplace: '大阪'
}
            
for( var item in myTeam){
    console.log( myTeam[item] );
}

//本田
//33
//大阪
```

####注意点　配列をfor...in命令に利用してはならない
構文上使えないことはないのだが、`prototype`で拡張されたメソッドまで引っ張ってきてしまう。

```honda3.js

var team =['vvv', 'cska', 'milan'] //配列

for(var item in team){
    console.log( team[item] );
}

//vvv
//cska
//milan
```

```honda4.js

var team =['vvv', 'cska', 'milan'] //配列
Array.prototype.hoge = function(){}  //プロトタイプで拡張

for( var item in team){
    console.log( team[item] );
}

//vvv
//cska
//milan
//ƒ (){}  //余計なもの
```

`配列をfor...in命令に利用してはならない理由は他にもある`
①for...in命令は処理の順序が保証されていない。
②仮変数（`item`）にはインデックス番号が格納されるだけなのでコードがシンプルにならない。

##for...of
###for...ofは配列などを順に処理する

```for_of.js
for( 仮変数 of 列挙可能なオブジェクト ) { 
   // ループ内で実行する命令（群）
}
```

早速先ほどfor..inで行った処理をfor...ofに変えてやってみましょう。

```honda4.js

var team =['vvv', 'cska', 'milan' ] //配列
Array.prototype.hoge = function(){}  //プロトタイプで拡張

for(var item of team){
    console.log(item);
}

//vvv
//cska
//milan
```

for...in命令では、仮変数にキー名（インデックス番号）が渡されていたのに対し、for...of命令では値が列挙されている。


###おまけ
プロトタイプで拡張された場合でも`for...in命令`を使いたい方は「オブジェクトが指定されたプロパティを持っているかどうかを判別する」`hasOwnProperty`メソッドを使えば寄せぬ挙動を回避できる。

```honda5.js
var team =['vvv', 'cska', 'milan' ] //配列
            
Array.prototype.hoge = function(){}
for( var item in team){
    if( team.hasOwnProperty(item) ) {
        console.log( team[item] );
    }
}
```

##まとめ

#####for...in
・連想配列（オブジェクト）を操作する（配列を使ってはならない）
・値ではなく`要素`を出力する。
・prototypeで拡張すると意図せず出力されてしまう。
#####for...of
・列挙可能なオブジェクト（配列、NodeList、arguments等）を操作する。
・要素ではなく`値`が出力される

##参考
<a href="https://www.amazon.co.jp/%E6%94%B9%E8%A8%82%E6%96%B0%E7%89%88JavaScript%E6%9C%AC%E6%A0%BC%E5%85%A5%E9%96%80-%EF%BD%9E%E3%83%A2%E3%83%80%E3%83%B3%E3%82%B9%E3%82%BF%E3%82%A4%E3%83%AB%E3%81%AB%E3%82%88%E3%82%8B%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E7%8F%BE%E5%A0%B4%E3%81%A7%E3%81%AE%E5%BF%9C%E7%94%A8%E3%81%BE%E3%81%A7-%E5%B1%B1%E7%94%B0-%E7%A5%A5%E5%AF%9B-ebook/dp/B01LYO6C1N">改訂新版JavaScript本格入門</a>
[Ansible]変数渡し( -e オプションで変数設定を羅列しないスマートな方法 )

# 概要

Ansibleで作成したツールに複数の値を渡す場合、思わず`-e`に頼ってしまいがちだが、playbookの書き方を一工夫することでスマートに値を渡すことができるようになる。

# コード

```yaml:playbook.yml
- hosts: all
  gather_facts: no
  vars_files:
  - '{{ fl_param }}'

  tasks:
  - debug:
      var: parameter
```

```yaml:/tmp/parameter.yml
parameter:
  hoge: hogehoge
  fuga: 
  - foo
  - bar
  - baz
  piyo:
    p1: swallow
    p2: sparrow
```

# 実行コマンド

```
$ ansible-playbook -i localhost, -e "fl_param=/tmp/parameter.yml" playbook.yml
```

# アウトプット(抜粋)

```
TASK [debug] *************************************************
ok: [localhost] => {
    "parameter": {
        "fuga": [
            "foo",
            "bar",
            "baz"
        ],
        "hoge": "hogehoge",
        "piyo": {
            "p1": "swallow",
            "p2": "sparrow"
        }
    }
}
```
vimエディタの行番号を表示させる（デフォルト設定あり）

##行番号を表示する

vimエディタを開いた状態で、

```
:set number　もしくは
:set nu
```
ファイルを開いている間は、行番号が表示されるようになります。

##行番号を非表示にする

vimエディタを開いた状態で、

```
:set nonumber　もしくは
:set nonu
```
表示されていた行番号が、非表示になります。

##デフォルトで行番号を表示するようにする

いちいち`:set number`と打つのが面倒だな・・という時は、
vimエディタの設定ファイルを編集します。

```
$ vi ~/.vimrc 
```

設定ファイルをvimエディタで開いたら、以下の一行を追記して
ファイルを保存します。

```
set number
```
これで設定は完了です。
次からvimエディタを開いた時に、自動で行番号が表示されるようになります。
なお、もともと ~/.vimrcファイルが無い場合は、新規に作成して上記の設定すれば問題ありません。

【補足】
Linuxだけでなく、Macでも同様に設定ができました。
.netに関わる小ネタ（昔のメモ）

#自分用のメモ

<strong>FormLoad中のフォーカスセット</strong>
FormLoad イベントでは Focus メソッドが効かない。 
代わりに、`this.ActiveControl = [Control]`で設定する。

***

<strong>ミリ秒まで時間を取得</strong>
結構よく忘れるので覚書
`System.DateTime.Now.ToString("HHmmssfff")`

***

<strong>DatasetとDatareaderの速度比</strong>
[DataSet vs DataReader 検証 .NET2.0](http://blogs.wankuma.com/ganfield/archive/2007/02/06/61084.aspx)
Datareaderのほうが早いっぽい

***

<strong>Form上のTextBoxに対してCtrl+Aで全選択</strong>
FormのProcessDialogKeyをオーバーライドするだけ。

```csharp
    protected override bool ProcessDialogKey(Keys keyData)
    {
        switch (keyData)
        {
            case Keys.A & Keys.Control:
                System.Windows.Forms.Control c = this.ActiveControl;
                if (c.GetType().Equals(typeof(TextBox)))
                {
                    TextBox t = (TextBox)c;
                    t.SelectAll();
                }
                break;
            default:
                break;

        }
        return base.ProcessDialogKey(keyData);
    }
```

***

<strong>DatasetでDistinctをかけるには、これ。</strong>

```csharp
    System.Data.DataSet ds = new DataSet();
    System.Data.DataTable dt = new DataTable();
    dt = ds.Tables[0].DefaultView.ToTable(true, "DistinctCol1", "DistinctCol2");
```

***

<strong>ListBoxコントロールで項目の入れ替えなど</strong>

```csharp
	// 項目をあげるボタン
	private void cmd_UP_Click(object sender, EventArgs e)
	{
	    if (lst_img.SelectedItem == null || lst_img.SelectedIndex < 0) { return; }

	    int idx = lst_img.SelectedIndex;
	    if (idx <= 0) { return; }

	    object lo = lst_img.SelectedItem;

	    lst_img.Items.Remove(lst_img.SelectedItem);
	    lst_img.Items.Insert(idx - 1, lo);

	    lst_img.SelectedIndex = idx - 1;
	}

	// 項目をさげるボタン
	private void cmd_DN_Click(object sender, EventArgs e)
	{
	    if (lst_img.SelectedItem == null || lst_img.SelectedIndex < 0) { return; }

	    int idx = lst_img.SelectedIndex;
	    if (idx + 1 >= lst_img.Items.Count) { return; }

	    object lo = lst_img.SelectedItem;

	    lst_img.Items.Remove(lst_img.SelectedItem);
	    lst_img.Items.Insert(idx + 1, lo);

	    lst_img.SelectedIndex = idx + 1;
	}

	// 項目を消すボタン
	private void cmd_RV_Click(object sender, EventArgs e)
	{
	    if (lst_img.SelectedItem == null || lst_img.SelectedIndex < 0) { return; }

	    int idx = lst_img.SelectedIndex;
	    lst_img.Items.Remove(lst_img.SelectedItem);
	    if (lst_img.Items.Count != 0)
	    {
	        lst_img.SelectedIndex = idx - 1;
	        if (idx == 0) { lst_img.SelectedIndex = idx; }
	    }
	}
```
【WordPress】アイキャッチ画像　※備忘録

<h2>はじめに</h2>
現在、WordPressの案件に携わっており、アイキャッチ画像の設定の調査をしていたので、
そのことを忘れないようにまとめてみます。


<h2>アイキャッチ画像とは?</h2>
投稿に画像を添付することができる機能。
使用するテーマによっては機能が有効化されていない場合がある。

<h2>有効化するには</h2>

function.php(wp-content/themes配下)に下記を追記する。

```function.php
add_theme_support('post-thumbnails');
```

機能が有効化されると、管理画面の投稿編集ページの右下にアイキャッチ画像の項目が表示される。

<h2>カスタム投稿タイプでアイキャッチ画像を有効化する方法</h2>
プロパティのsupportsの値にthumbnailを追加する。

※function.phpからカスタム投稿タイプに追加した場合。

```function.php
add_action( 'init', 'create_post_type' );
function create_post_type() {
  register_post_type( 'product',
    array(
      'labels' => array(
      'name' => __( 'Product' ),
      'singular_name' => __( 'Product' )
    ),
      'public' => true,
      'has_archive' => true,
      'supports' => array('title','editor','thumbnail','custom-fields','excerpt','author','trackbacks','comments','revisions','page-attributes')
    )
  );
}
```

<h2>アイキャッチを設定する部分に説明文を表示する方法</h2>
管理画面のアイキャッチ設定箇所に説明文(注釈的な)を追加する。

function.phpに下記を追記する。

投稿タイプ全てのアイキャッチの説明文を一気に設定する方法。

```function.php
//方法1
add_filter( 'admin_post_thumbnail_html', 'add_featured_image_instruction');
function add_featured_image_instruction( $content ) {
return $content .= '<p>ここに説明文を記載します。</p>';
}

//方法2
function my_admin_post_thumbnail_html( $content ) {
  return $content .= 'ここに説明文を記載します。';
}
add_filter( 'admin_post_thumbnail_html', 'my_admin_post_thumbnail_html');

```

カスタム投稿ごとにアイキャッチの説明文を設定する方法

```function.php
function my_admin_post_thumbnail_html( $content ) {
  $screen = get_current_screen();
  if ( $screen->post_type == 'post' ) {//投稿
    $content .= '管理画面のアイキャッチ下に説明文';
  } elseif ( $screen->post_type == 'works' ) {//カスタム投稿
    $content .= '管理画面のアイキャッチ下に説明文';
  } elseif ( $screen->post_type == 'staff' ) {//カスタム投稿
    $content .= '管理画面のアイキャッチ下に説明文';
  }
  return $content;
}
add_filter( 'admin_post_thumbnail_html', 'my_admin_post_thumbnail_html');


```

get_current_screen()関数を利用して、どの管理ページを見ているかを判断する


<h2>参考サイト</h2>
https://takayakondo.com/wordpress-eye-catch-text/
https://lab.studio-benkei.com/post-242/
https://developer.wordpress.org/reference/functions/get_current_screen/
https://developer.wordpress.org/reference/hooks/admin_post_thumbnail_html/
https://datalibraries.info/wordpress-admin-post-thumbnail-html/
Ruby と Perl と Java で解く AtCoder dwangoプログラミングコンテスト B

# はじめに
*[AtCoder Problems](https://kenkoooo.com/atcoder/#/)* の Recommendation を利用して、過去の問題を解いています。
AtCoder さん、AtCoder Problems さん、ありがとうございます。
# 今回のお題
*[AtCoder dwangoプログラミングコンテスト B - ニコニコ文字列](https://atcoder.jp/contests/dwango2015-prelims/tasks/dwango2015_prelims_2)*
<font color="green">Difficulty: 832</font>

今回のテーマは、reduce による集計
# Ruby
例えば文字列`1251251252525`について `25` -> `a`に変換し文字のカウントをし易くします。=> `1a1a1aaa`
連続した`a`の個数は、(1, 1, 3) ですので、それぞれについて組合せ数を合計します。

```bit.rb
s = gets.chomp

s.gsub!(/25/, 'a')
p = []
c = 0
0.upto(s.size - 1) do |i|
  if s[i] == 'a'
    c += 1
  elsif c > 0
    p.push(c)
    c = 0
  end
  p.push(c) if i == s.size - 1 && c > 0
end
sum = 0
0.upto(p.size - 1) do |i|
  sum += (1..p[i]).reduce{|a, b| a + b}
end
puts sum
```
```reduce.rb
  sum += (1..p[i]).reduce{|a, b| a + b}
  sum += (1..p[i]).reduce(&:+)
  sum += (1..p[i]).inject(:+)
  sum += (1..p[i]).sum
```
reduce の部分は、inject でも、sum (ruby 2.4以降)でもいけます。
**追記**
コメントよりいただいた、`reduce(&:+)` を追加しました。

# Perl
```perl.pl
use v5.18; # strict say state
use List::Util qw/reduce/;

chomp (my $s = <STDIN>);
$s =~ s/25/a/g;
my $c = 0;
my @p;
for my $i (0..length($s)-1) {
  if (substr($s, $i, 1) eq 'a') {
    $c++;
  } elsif ($c > 0) {
    push @p, $c;
    $c = 0;
  }
  if ($i == length($s)-1 && $c > 0) {
    push @p, $c;
  }
}
my $sum = 0;
for my $i (0..$#p) {
  $sum += reduce {$a + $b} 1..$p[$i];
}
say $sum;
```
```reduce.pl
use List::Util qw/reduce sum/;

  $sum += reduce {$a + $b} 1..$p[$i];
  $sum += sum(1..$p[$i]);
```
reduce の部分は、sum でもいけます。
# Java
```java.java
import java.util.*;
import java.util.stream.IntStream;

class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.next();
        sc.close();
        s = s.replace("25", "a");
        List<Integer> p = new ArrayList<>();
        int c = 0;
        for (int i = 0; i < s.length(); i++) {
            if (s.substring(i, i + 1).equals("a")) {
                c++;
            } else if (c > 0) {
                p.add(c);
                c = 0;
            }
            if (i == s.length() - 1 && c > 0) {
                p.add(c);
            }
        }
        int sum = 0;
        for (int i = 0; i < p.size(); i++) {
            sum += IntStream.rangeClosed(1, p.get(i)).reduce(0, (a, b) -> a + b);
        }
        System.out.println(sum);
    }
}
```
```reduce.java
            sum += IntStream.rangeClosed(1, p.get(i)).reduce(0, (a, b) -> a + b);
            sum += IntStream.rangeClosed(1, p.get(i)).sum();
```
reduce の部分は、sum でもいけます。

||Ruby|Perl|Java|
|:--:|:--:|:--:|:--:|
|コード長|284 Byte|411 Byte|847 Byte|
|実行時間|34 ms|28 ms|284 ms|
|メモリ|4092 KB|2816 KB|33228 KB|
# まとめ
+ dwangoプログラミングコンテスト B を解いた
+ Ruby に詳しくなった
+ Perl に詳しくなった
+ Java に詳しくなった
+ reduce に詳しくなった

参照したサイト
*[Rubyで配列の要素を合計するベストな方法](https://qiita.com/takaram/items/b62466c76fced4e40dd1)*
java error処理のまとめ

````

import java.util.*;
import java.io.IOException;
public class Main {
    public static void main(String[] args) throws IOException {
        // Your code here!
        /*int a =0/0;
        System.out.println("XXXXXXXX");*/
        
        
    String str="simizu";//ここをヌルにすると例外が発生するが、非検査例外なので、トライしなくてもOK
    int i = str.length();

    System.out.println(str + "は" + i + "文字");
    
    //throw new　StackOverflowError("StackOverflowError"); メモリーのオーバーフローここはキャッチできない、、そもそもサーバー落ちてたらキャッチできないよね
    throw new IOException("IOException"); //検査例外　tryが必要　ただメソッドの横でスローしてるので大丈夫、もしメソッドでスローしなければトライキャッチが必要です。
    }
    
   
}

}

参考資料
https://freelance-jak.com/technology/java/1157/
Google Chromeに緊急の脆弱性、ただちにアップデートを

# はじめに
昨日、会社からこんなアナウンスがあった

**Google Chromeに緊急の脆弱性、ただちにアップデートを**

自社のＰＣはWindowsで簡単にchromeアップデートができたが、自分のMacをUpdateしようとしてもで少し手間取った。


# 本記事の内容
本記事では、
- Macのchromeのアップデート方法を共有する
（chromeの脆弱性に関しては、[こちら](https://news.mynavi.jp/article/20200418-1018805/)を参照）

※アップデートは自己責任でお願いします



# 方法
 1. chromeを開く
 2. `chrome://settings/help` を検索バーに入力しジャンプする
 3. chromeのアップデートが自動で開始される
 4. chromeのアップデート完了後 再起動ボタンを押し、chromeを再起動させる

# おわりに
他にchromeの良い更新の仕方があったら教えてください。
qiita初投稿
migration 時にエラー　SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; 

# migration時に構文エラー
エラー内容は

```terminal
SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; 
```

```terminal

  Illuminate\Database\QueryException  : SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'json null, `s3_bucket` varchar(191) null) default character set utf8mb4 collate ' at line 1 (SQL: create table `exports` (`id` bigint unsigned not null auto_increment primary key, `created_at` timestamp null, `updated_at` timestamp null, `created_by` bigint unsigned null, `settings` json null, `s3_bucket` varchar(191) null) default character set utf8mb4 collate 'utf8mb4_unicode_ci')

  at /Users/test/Desktop/test/src/vendor/laravel/framework/src/Illuminate/Database/Connection.php:664
    660|         // If an exception occurs when attempting to run a query, we'll format the error
    661|         // message to include the bindings with SQL, which will make this exception a
    662|         // lot more helpful to the developer instead of just the database's errors.
    663|         catch (Exception $e) {
  > 664|             throw new QueryException(
    665|                 $query, $this->prepareBindings($bindings), $e
    666|             );
    667|         }
    668| 
```

migrationファイルに構文のエラーがあるとのことだが、どこにエラーがあるのかさっぱり分からなかった。
検索を進めると、以下の記事を発見。
https://stackoverflow.com/questions/58721612/error-sqlstate42000-syntax-error-or-access-violation-1064-you-have-an-error

こちらをもとに、読み進めると、次の一文がおかしいようだ。migrationファイルのカラムの中でjson型にしているものを修正する必要がある。

```
(MySQL server version for the right syntax to use near 'json null,)
```


# 修正
そこで、githubにissueとして上がっていたので、それを参考にすると、
私の該当のmigrationファイルはもともと以下のようになっていたが、これが問題らしい。

```×××××_create_×××.php
$table->json('search')->nullable();
```

修正後

```×××××_create_×××.php
$table->json('search')->charset(null)->nullable()->change();
```

参考：githubで参考にしたissue。
https://github.com/doctrine/dbal/issues/3714
<img width="1048" alt="スクリーンショット 2020-04-20 11.52.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417196/a07cad80-7f35-8895-ec9e-cb2ab62385d2.png">


# 追記
私の場合は原因は不明だが、json型が読み込めずにエラーがでていたのでjson型をtext型に変更した。

```
$table->json('chart_state')->charset(null)->nullable()->change();
を
$table->text('chart_state')->charset(null)->nullable();
```

また、storage/logに以下のようなエラーが排出された

```
[2020-04-23 07:56:55] local.ERROR: View [base] not found. (View: /Desktop/***/src/resources/views/home.blade.php) {"userId":1,"exception":"[object] (ErrorException(code: 0): View [base] not found. (View: /Desktop/***/src/resources/views/home.blade.php) at /Desktop/***/src/vendor/laravel/framework/src/Illuminate/View/FileViewFinder.php:137, InvalidArgumentException(code: 0): View [base] not found. at /Desktop/****/src/vendor/laravel/framework/src/Illuminate/View/FileViewFinder.php:137)
```

なので、.envの

```tex:.env
APP_DEBUG=true
から
APP_DEBUG=false
へ変更
```
Discordでチャイムボットを作ってみた（初心者）

# 概要

　テレワークが始まって2週目になりますが、オフィスで鳴っていたチャイムが自宅で鳴らないので時間感覚が狂うとの意見が多数あがってきました。ちょうど部門内でDiscordを常用していたので、チャイムを鳴らしてくれるボットを作ってみました。
　テレワークになったことで時間の区切り目を意識しいないと忘れがちになるので、チャイムは大事だなと改めて感じる出来事でした。

# 前提条件

- Discordのアカウントが開設済みであること
- サーバの管理者であること
- dockerおよびdocker-composeがインストールされていること
- [こちらのサンプルコード](https://github.com/comefigo/discord-bell-bot)で実行すること  
    プログラムの仕様は、ボイスチャネルに人がいれば、ボットが順にチャイムを鳴らしていきます  
    ボット（人も同様）が同時に複数チャネルに参加できないので、このような仕様になっています...
- ライブラリは[discord.js](https://discord.js.org/#/)を使用しています

# 1. DiscordのBotを作成

[Discord Developer Portal](https://discordapp.com/developers/applications)で新規アプリケーションを作成します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30522/aaae0870-f612-5638-6d8a-17f10c5d69c2.png)

アプリケーションに適当な名前を付けた後は、Botを作成します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30522/49f343d6-ea80-15aa-8d5f-671794fb4e24.png)

アクセス用TOKENを控えときましょう
**PUBLIC BOTは無効化**することをお勧めします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30522/c99aed6e-f218-74c6-26d8-2c78ccb617f2.png)

OAuth2用にBotのアクセス権限を選択し、URLを「Copy」します
当サンプルコードでは「Stream」権限のみでOKです
※当記事公開後にこのBotは削除しますので、client_idはそのままになっています
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30522/0c44c28a-844a-569a-df49-5a97f3b4f512.png)

コピーしたURLを新しいタブで開くと、ボットを参加させるサーバを選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30522/ecb74445-78db-ca42-e64d-98260cffef08.png)

追加したサーバに以下の様にメッセージが表示されたらOKです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30522/b23f93b0-2e72-b962-0846-49f46420c94c.png)

# 2. プログラムをスケジュール実行

[サンプルコード](https://github.com/comefigo/discord-bell-bot)を取得し、docker-compose.ymlの以下の変数を修正します

- TOKEN_ID･･･前述で控えたアクセスTOKEN
- MUSIC_FILE･･･チャイムの音楽ファイルを差し替える場合は、そのファイルパスを記載
- INTERVAL_TIME･･･ボットがチャネルからチャネルに移る際の待ち時間（最低2秒）  
    ※この待ち時間がないと正常に動作しません！

**※初回ビルドに時間がかかるため、スケジューリング前に必ず動作確認してください**

cronで`docker-compose up -d`指定するのみ！

## Docker環境がない場合以下

- Node.jsをインストール
- サンプルコードのapp配下で`npm install`
- TOKEN_ID、MUSIC_FILE、INTERVAL_TIMEを環境変数化するか、app.js内のそれらのコードを直書きする
- cronで`npm start`指定する

# 開発

- 当リポジトリではVS CodeのRemote Containerをサポートしています
- discord.jsでdiscord apiをコールしています

## アプリの仕様

- ボットがサーバに接続できたら、人がいるボイスチャネルをリスト化する
- それらのチャネルを順にチャイムを鳴らす
- すべて鳴らし終えたらログアウトする

※定時刻にチャイムを鳴らせればよいので、常駐はしていない
org.springframework.web.servlet.handler.HandlerInterceptorAdapterでcors対応しようとしたらめっちゃ詰まった話

# HandlerInterceptorAdapterで認証をfirebaseで入れていた

# クライアントサイドからのリクエストが延々とcorsエラー
止まらないエラー。

```text
 「Access to fetch at 'http://localhost:8080/article/1/edit/fileupload' from origin 'http://localhost:3001' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status.
」
```

# cors対応はクライアントサイド、サーバサイドともにできている

## クライアントサイド
fetchには、Requestに`'cors'`を設定できている。

## サーバサイド
Spring Bootで、`@CrosOrigin`つけている。

# 原因
HandlerInterceptorAdapterのpreHandle内で、

```java
response.status = 200
```

などのステータスコードを設定していなかった。
根本原因は不明だが。。。
Python の GPG Key はどこで調べれば良いのか

Dockerfile なんかで Python のソースコードからインストールする際に GPG Key が必要になる。
のだけれど、公式ドキュメントには記載されていなさそうだしどこで確認すればよいのだろうと思い調べてみた。

ここにあった。
https://github.com/docker-library/python/blob/master/update.sh#L5
Rustでアニメーションをハードコーディングするノウハウ

## 1. ゲームのアニメーション(3Dゲーム)
作るには主に以下の２つの方法があると思います。
### 1.1 アニメーションのファイルを作成する
普通はこの方法で作ります。オブジェクトをモデリングするときにアニメーションも一緒に作成してゲームに読み込みます。ゲームでは、キャラごとにジャンプや走るなどのアニメーションを作成し、それをプログラムで制御するという方法で実行します。

### 1.2 ハードコーディングする
プログラマーの意匠を物体の動きに盛り込みたい時にこちらの方法を使います。例えば草の揺れ動きとか水の流れなど、動きが一定ではなくランダムに動くアニメーションはコードで作成する方がより自然な動きを実現できます。。

## 2. ハードコーディングするメリット・デメリット
### 2.1 メリット
- ランダム性のある動きを表現しやすい
- データの容量節約になる
- かなりプログラマーの自由が効く
- 楽しい（重要）

### 2.2 デメリット
- 人の動きなどの複雑な動きは難しい
- 微調整が面倒
- コードが大きくなりがち


## 3. Rustでアニメーション作成
ようやく本題です。Rustでアニメーションを作るときに私はよくステートマシーンを用います。このときEnumを用いて状態を管理します。基本的な作り方は、前フレームからの時間経過を取得し、現在の状態を実行し、終了したら次の状態に移るという形になります。
###3.1 状態の定義
例えば走る→ジャンプ→攻撃というアニメーションを作成したい時はまず以下のように4つの状態をEnumを用いて定義します。かっこの中の数字は各状態のアニメーションの経過時間を保持します。
最初の状態は"走る"なので、現在の状態にRunを設定します。

```rust:state.rs
/// アニメーションの状態の種類
enum AnimationState {
    Run(f32), // かっこの中の数字は経過時間
    Jump(f32), 
    Attack(f32),
    Still // 何もしない状態
}

let current_state = AnimationState::Run(0.);

```

###3.2 前フレームからの時間経過を取得
前フレームから経過した時間を取得し、現在状態が保持している経過時間に足し合わせます。このとき、tickという関数をAnimationStateに実装します。このtickという関数で状態遷移も定義するとスッキリしたコードになります。

```rust:system.rs
/* 前フレームからの時間経過を取得するシステム */
let dt: f32 = time.delta_seconds(); // Amethystはこう書きます
current_state.tick(dt);

```


```rust:state.rs
impl AnimationState {
    /// 状態が保持している経過時間に足し合わせる
    fn tick(&mut self, dt: f32) {
        *self = match self {
            AnimationState::Run(t) => {
                // tは状態の経過時間
                if *t >= RUN_DELAY {
                    // 走る状態が終了、ジャンプに移行
                    AnimationState::Jump(0.0)
                } else {
                    // 走る状態が継続中
                    AnimationState::Run(*t + dt)
                }
            }
            AnimationState::Jump(t) => {
                if *t >= JUMP_DELAY {
                    // ジャンプ状態が終了、攻撃に移行
                    AnimationState::Attack(0.0)
                } else {
                    // ジャンプ状態が継続中
                    AnimationState::Jump(*t + dt)
                }
            }
            AnimationState::Attack(t) => {
                if *t >= Attack_DELAY {
                    // 攻撃状態が終了、何もしない状態に移行
                    AnimationState::Still
                } else {
                    // 攻撃状態が継続中
                    AnimationState::Attack(*t + dt)
                }
            }
            AnimationState::Still => AnimationState::Still,
        }
    }
}

```

###3.3 現在の状態を実行
現在の状態は経過時間を保持しているのでそれを元に進行状況(progress)を計算しオブジェクトを移動させます。

```rust:animation.rs
match current_state {
    AnimationState::Run(t) => {
        let progress = t / RUN_DELAY;
        /* progressを元にxy座標を移動 */
    }
    AnimationState::Jump(t) => {
        let progress = t / JUMP_DELAY;
        /* progressを元にz座標を更新 */
    }
    AnimationState::Attack(t) => {
        let progress = t / ATTACK_DELAY;
        /* progressを元に攻撃させる */
    }
    _ => ()
}
```

###3.4 次の状態へ移行
AnimationStateのtickが自動で状態を遷移してくれます。

###3.5 アニメーションの終了
状態がAnimationState::Stillまで到達したらアニメーションは終了です。同様のアニメーションをもう一度実行したいときはcurrent_stateにもう一度"走る"状態をセットするだけです。

##4. まとめ
以上、ステートマシーンを活用したアニメーションのハードコーディングの方法の一例でした。
HikariCP

HikariCPとはなんぞや



「HikariCP（ヒカリシーピー）は、高速かつ軽量なJDBCコネクションプールのライブラリです。現時点では、Javaで実装されたコネクションプールのライブラリの中で最も高速という検証結果も出ており、RDBMSアクセス時の性能を要求されるような場合に有効なソリューションとなります。いくつかのベンチマークにより、その高速性が証明されています。」　HikariCP最新情報

JDBCコネクションプールのライブラリ。
グラフ


コンピューターで扱う問題は、「対象」とそれらの「関係」を抽象的に示したグラフと呼ばれるデータ行動で示すことができます。グラフは、現実世界の様々な問題をモデル化することができるので、グラフに関するアルゴリズムが多く研究されてきました。

グラフとは、「対象と集合とそれらのつながりの関係の集合」を表すデータ構造です。

<img width="797" alt="Screen Shot 2020-04-20 at 11.10.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169789/b31ed35a-1681-2659-c6f2-f17f23db9e8e.png">




クラブにおける「対象」はノードまたは頂点と呼ばれ、一般的に円で表されます。「つながり」は頂点と頂点の関係を表し、エッジまたは辺と呼ばれ、円と円を結ぶ線または矢印で表されます。

##グラフは主に４種類

- 無向グラフ
    - エッジに方向がないグラフ
    - 例：Facebookの友達関係など
- 有向グラフ
    - エッジに方向があるグラフ
    - 例：物事の手順
- 重み付き無向グラフ
    - エッジに重み（値）があり、方向がないグラフ
    - 例：太さがあるパイプを使った拠点間の液体の移動
    - 例：拠点間の距離
- 重み付き有向グラフ
    - エッジに重み（値）があり、方向があるグラフ
    - 例：拠点間の交通料金

有向グラフのエッジは2つの頂点間のつながりの有無を示すだけでなく、つながりに方向があり、エッジをつなぐ視点と終点を区別します。重み付きグラフでは、各エッジに値が割り当てられます。

##グラフの表記と用語

- 頂点の集合がV、辺の集合がEであるようなグラフ
    - G = (V, E)
    - 頂点と辺の数は|V|,|E|と表す。
- ２つの頂点を結ぶ辺
    - e = (u, v)
    - 無向グラフの場合(u, v)と(v, u)は同じ辺を示す。
    - 重み付きグラフの辺(u, v)の重みをw(u, v)と示す。
- 無向グラフに辺(u, v)があるとき、頂点uと頂点vは隣接している(adjacent)と言う。隣接している頂点の列v0,v1,v2,v3.....vkをパス(path)と言います。
- 始点と終点が同じようなパスを閉路(cycle)と言います。
- 閉路のない有向グラフをDirected Acyclic Graph(DAG)と呼びます。

<img width="957" alt="Screen Shot 2020-04-20 at 11.10.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169789/7859e4e1-aa12-ee97-cb31-876034947a28.png">

頂点uに繋がっている辺の数を頂点uの次数(degree)と言います。有向グラフにおいては、頂点uに入る辺の数を頂点uの入次数、頂点uから出る辺の数を頂点uの出次数と言います。
例えば、図のDAGグラフの頂点3の入次数は３、出次数は1です。

グラフG = (V, E)の任意の２つの頂点u, vに対して、uからｖへパスが存在するとき、Gを連結なグラフと言います。

2つのグラフGとG`について、G`の頂点集合と辺集合の両方がGの頂点集合と辺集合の部分集合になっているとき、G`をGの部分グラフと言います。

##グラフの基本的なアルゴリズム
グラフにおける最も基本的なアルゴリズムが探索です。グラフの探索とは、グラフの全ての頂点、または部分的な頂点の集合、を体系的に訪問することです。。訪問の仕方によってグラフの様々な特徴を調べることができるので、多くの重要なアルゴリズムの基礎となっています。

グラフにおける代表的な探索アルゴリズムが深さ優先探索(DFS: Depth First Search)と幅優先探索(BFS: Breadth First Search)で、無向グラフと有向グラフのどちらにも適用されます。

深さ優先探索は、「行けるところまでとことん行く」というルールに従った、グラフにおける最も自然で基本的な探索アルゴリズムです

一方、幅優先探索は既に探索した頂点と未探索の。頂点の境界を幅いっぱいにわたって拡張しながら探索します。幅優先探索は最短経路を求めるアルゴリズムの1つとして応用することができます。

##参考
[プログラミングコンテスト攻略のためのアルゴリズムとデータ構造 | 渡部 有隆, Ozy(協力), 秋葉 拓哉(協力) |本 | 通販 | Amazon](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%82%B3%E3%83%B3%E3%83%86%E3%82%B9%E3%83%88%E6%94%BB%E7%95%A5%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%81%A8%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0-%E6%B8%A1%E9%83%A8-%E6%9C%89%E9%9A%86/dp/4839952957/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=1WY8XADFMXZ5I&dchild=1&keywords=%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%81%A8%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0&qid=1587349600&sprefix=%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%2Caps%2C252&sr=8-1)
Flutterのはじめかた（学び方）

Flutterのはじめかた（学び方）です。
Google Codelabsが学習に最適なコンテンツではありますが，2020年4月時点[日本語版](https://codelabs.developers.google.com/lang-ja/)でflutterのコースは存在しないため英語版で頑張るしかない！:muscle_tone1:
**英語が読めなくてもChromeであれば超簡単に翻訳できるので＜[こちら](https://support.google.com/chrome/answer/173424?co=GENIE.Platform%3DDesktop&hl=ja)＞をご確認ください。**

## 0-1. 各種ドキュメント
まずは公式ドキュメントの所在です。
今後ガイドやチュートリアルに従い学習を進め行きますが、サンプルに出てくるクラスや関数について、公式ドキュメントで簡単に調べておくと理解が深まり習熟スピードも上がるのでお勧めです。

- FlutterのAPIDOC (https://api.flutter.dev/)
- Flutterの画面部品のライブラリ (https://api.flutter.dev/flutter/material/material-library.html)

## 0-2. 学習に取り組むにあたり
Flutterはとにかく『**Widget! Widget! Widget!**』そして『**Package**』です。
多数存在するWidget（部品）とPackageを理解し、それらを組み合わせながらアプリケーションを構築します。WidgetやPackageに関しては以下を参照してください。

- Widgetのカタログ (https://flutter.dev/docs/development/ui/widgets)
- WidgetのYoutubeチャンネル※字幕あり (https://www.youtube.com/playlist?list=PLjxrf2q8roU23XGwz3Km7sQZFTdB996iG)
- Packageのサイト (https://pub.dev/)
- FlutterのCookbook/事例集 (https://flutter.dev/docs/cookbook)

## 1. 開発環境の構築・簡単なプログラムの作成
Flutterの開発環境の準備と簡単なプログラムの作成を以下のガイド・コースに従い学習します。

1. Flutter Siteの「Get Started」(1-3) 
https://flutter.dev/docs/get-started/install
1から3までを実施する。（4からはCodelabsの内容となるため）

2. Codelabsの「Write your first Flutter app, part 1」
https://codelabs.developers.google.com/codelabs/first-flutter-app-pt1/#0

3. Codelabsの「Write Your First Flutter App, part 2」
https://codelabs.developers.google.com/codelabs/first-flutter-app-pt2/#0

## 2. 画面レイアウトおよび画面部品の配置・カスタマイズ
画面レイアウトおよび画面部品の配置・カスタマイズについて以下のコースに従い学習します。

4. Codelabsの「MDC-101 Flutter: Material Components (MDC) Basics (Flutter)」
画面部品の使い方・カスタマイズ方法を101-104の4つのコースで学ぶことが出来ます。
https://codelabs.developers.google.com/codelabs/mdc-101-flutter/#0

5. Codelabsの「MDC-102 Flutter: Material Structure and Layout (Flutter)」
https://codelabs.developers.google.com/codelabs/mdc-102-flutter/#0

6. Codelabsの「MDC-103 Flutter: Material Theming with Color, Shape, Elevation, and Type (Flutter)」
https://codelabs.developers.google.com/codelabs/mdc-103-flutter/index.html#0

7. Codelabsの「MDC-104 Flutter: Material Advanced Components (Flutter)」
必須のコースではありません。
見た目についてこだわったカスタマイズを行いたい場合に本コースを実施してください。
https://codelabs.developers.google.com/codelabs/mdc-104-flutter/index.html#0

0. Codelabsの「Building Beautiful UIs with Flutter」
チャットツールを作りながらUI開発を学ぶコースです。
101-103を行っていれば、必須のコースではありませんが、LINEのようなチャットツールの作り方を学びたい場合に参考になります。
https://codelabs.developers.google.com/codelabs/flutter/index.html#0

## 3. BLoCパターンについて学ぶ
Codelabsで学んだことをもとにアプリ開発を進めていくと、「1つのプログラムが大きく複雑になり、中規模以上のアプリ開発には向かないフレームワークなのでは」という不安を感じます。
ここで、現時点でデファクトスタンダードになりつつある設計パターン「BLoC」パターンについて学びます。

・ BLoCパターンの概要
　ネット上の記事でも一番わかりやすい記事でした。
　https://note.com/yamarkz/n/n7f9106e53179



## リリース方法
ここまで作ったアプリをiPhone, Androidにリリースしてみます。

- iPhone (https://flutter.dev/docs/deployment/ios)
- Android (https://flutter.dev/docs/deployment/android)
【初心者向け】ホワイトボックステスト

前回の記事[【初心者向け】同値分割と境界値分析](https://qiita.com/sakuraki11/items/f841020831e1defc2dee)で単語だけ取り上げたホワイトボックステストの記事です。

##はじめに
今回はホワイトボックステストについてざっくりと記載していきます。
※全国各地の入社して間もないだろう新入社員さん向けの記事ですので、「そんなの知ってるよ！」「もう仕事でプログラミングやってるから大丈夫！」「テスター歴〇年のベテランです！」という熟練の方はブラウザバック推奨です！
本記事はあくまで知識０の方がざっくりとでもいいのでイメージが湧くようにお手伝いする記事ですので、専門の難しい用語はあまり出てきません。ご了承ください。

##何故それを説明するの？
ホワイトボックステストはテスト手法の一つであり、今後プログラミングを行うなら念頭に入れておくと役に立つ知識だからです。

##ホワイトボックステスト
ざっくり説明すると、機械がプログラマーさんの作った命令一覧通りに動くか確かめるテストだよ！
イメージの例：博士が作ったロボットが命令通りに動くか確かめる。

ホワイトボックステストでは、プログラマーが作成したプログラムを直接読み、プログラマーの意図通りに動くか確かめるテストです。

ホワイトボックステストのことを詳しく知りたくなった方は、ここでブラウザバックしてQiitaのキーワードの検索欄にホワイトボックステストと入力して他の方の記事を調べてみてくださいね。
これ以降は前回の記事をお読みいただいた方向けにブラックボックステストとホワイトボックステストの差をざっくりと書いていきますよ！

さて、前回の記事をお読みいただいた方は「ブラックボックステストと何が違うの？動くか確かめるんだよね？」と思っているかもしれませんが、その二つのテストはかなり違うんですよ！

では、その疑問について纏めていきましょう。

##ブラックボックステストとホワイトボックステストの差
ざっくり説明すると、出来上がったものを外から見るか作っている最中のものを中から見るかだよ！
イメージ例：配信前のベータ版のゲームをプレイするか、今回作るゲームは怪獣のような敵を登場させてこんな風に倒したいからこのコマンドを用意したよ！単に倒すんじゃなくこのコマンドで倒せているか確認してね！というチェックを行うかどうか。

ブラックボックステストは初めて商品を購入したお客さんが違和感なく使えるかどうか確かめるテストであるのに対し、ホワイトボックステストは製作者側が今後商品をアップデートする上でアップデートしやすいように工夫したり、製作者（プログラマー）が意図した内容通りに動くか確認するのが主なテストです。

二つは切っても切れない存在であり、商品を作成した場合必ずどちらのテストも行います。

ただし、ブラックボックステストはこの業界未経験の初心者の方が試験するうえでいいテスト結果が出やすいのに対し、ホワイトボックステストはプログラムをある程度読める方でないとテストするのが難しいため、一人でどちらのテストも行うことはあまりありません。

尚、プロジェクトによってはブラックボックステストとホワイトボックステストを同時並行で行うところとホワイトボックステストを先に行っておいて後でブラックボックステストを行うところがありますが、それは商品の見本版（サンプル品）を提出するまでの期間（納期）が短かったり、新たに作成した機能や変更した機能が多すぎて手が回っていない場合に多く発生する現象のため、完成させる商品の目標自体は変わりません。

そのため、ブラックボックステストとホワイトボックステストをどちらも行うことが丁寧にテストすることが大事であり、その際設計者やプログラマーと連携を取って作品を作るうえでの目標像の差がないかを確認しながら行っていくことが大切です。

##おわりに
いかがでしたか？
ホワイトボックステストは暗号（プログラミング言語）を解読できる専門的な知識があることを前提に行うテストで、ブラックボックステストより難易度が高く製作者（プログラマー）との連携が大切だということを覚えておいていただけると幸いです。
この記事を見て「ホワイトボックステストについてもっと詳しく知りたい！」と思った方は、是非Qiitaの他の専門的なことが書かれている記事をご覧になってくださいね。
ReactのFunctionComponentについて

ちゃんとReactを始めたのがv16からなんですが、最初に謎だったのがClassComponent」と比較された文章でした。調べてると３つあって、あまり賢くないので文章を読んでもよく違いが理解できず、、、

- FunctionComponet（FC）
- ClassComponent
- SFC

v16以前のバージョンもやったことはあるのですが、既存の改修等でちゃんと理解できてない私には違いが分かりにくかったのでメモを残しておこうかと思います。違いが分からなくても組めたのですが、モヤモヤしたので。。。

今後、新規でコンポーネントを作成する場合はFCで組んでいけば良いみたいです。
もし勘違いして理解してたら教えてもらえるとありがたいですm(_ _)m

# Function Component（FC）

- v16から追加されたコンポーネント
- SFCとは違ってStateが使えるようになった関数型コンポーネント

v16以前は下記のようにSFCとClassComponentを使い分けていた

- 状態(state)を持つ必要がないコンポーネント：SFC
- 状態(state)を保つ必要があるコンポーネント：ClassComponent

FCが出たことで関数型コンポーネントでも状態保持が可能になり、実質的な違いがなくなった。

```javascript
const App: React.FC = () => {
  const [count, setCount] = useState(0)

  return (
    <div>
      <p>count : { count }</p>
      <button onClick={() => setCount(count + 1)}>increment</button>
    </div>
  )
}
```

# Stateless Function Component(SFC)

名前のまま、stateを持たない関数型コンポーネント。
stateを持たないため状態を保持できない。
共通フッターなどを状態を持たないコンポーネントに使われる。

#### 特徴

- ライフサイクルメソッドを持たない
- ref属性を設定できない
- stateがない

``` javascript
const Counter: React.SFC = (props) => {
  // count値を保持できないため、propsでcount値をもらう
  let { count } = props
  return (
    <div>
      count : { count }
    </div>
  )
}
```

# Class Component

Classとして定義されたコンポーネント。

#### 特徴

- ライフサイクルがある
- stateがあるので状態を保持できる

``` javascript
class Counter extends React.Component {
  constructor(props) {
    super(props)
    this.state = { count: 0 }
  }

  render() {
    const { count } = this.state
    return (
     <div>
      <p>count : { count }</p>
      <button onClick={() => this.setState({ counter: count + 1 })}>increment</button>
    </div>
    )
  }
}
```
gulpインストール後にgulp: command not foundのエラー

#エラー内容
```
$ gulp ejs
bash: gulp: command not found
```

```
$ sudo npm install -g gulp
Password:
npm WARN deprecated urix@0.1.0: Please see https://github.com/lydell/urix#deprecated
npm WARN deprecated resolve-url@0.2.1: https://github.com/lydell/resolve-url#deprecated
/Users/mac/.npm-global/bin/gulp -> /Users/mac/.npm-global/lib/node_modules/gulp/bin/gulp.js
+ gulp@4.0.2
updated 2 packages in 9.078s
```

```
'/Users/mac/.npm-global/bin/gulp'
```
ココに着目。

#対処法
/Users/mac/.npm-global/bin　に　path　が通っていない事が原因でした。

```
$ export PATH=/Users/mac/.npm-global/bin:$PATH
$ gulp ejs
[10:53:38] Using gulpfile ~/Desktop/work/02-ejs/gulpfile.js
[10:53:38] Starting 'ejs'...
[10:53:38] Finished 'ejs' after 13 ms
```

OK！！
初心者の僕がSpringBoot の学習を始める時にわかりやすかったサイト

最近SpringBootの勉強を始めました。
学習始めの時は、勉強の仕方がわからなくて、手こずる事があると思うので、始めるならこれでやって欲しいと僕が思うものを紹介します。(コロナで図書館が使えなかったので全てネットです)

**僕の始めた時の状態**

・スッキリわかるJava入門
・スッキリわかるJava入門実践編
でJavaの基礎をある程度おさえた

YouTube(UZUZ就活チャンネル)にあった
プログラミング講座のデータベース編以降を2倍速で流し見してイメージを掴んだ
[https://www.youtube.com/playlist?list=PLXXalsdlzX-JPOXLaE4e-L3FgFDw_Y71M]

めっちゃ初心者です…

そんな初心者から見て
*わかりやすかった！*
*参考になった！*
*始めるならこれでやって欲しい！*
というサイトを紹介します。

#####１つ目
[https://qiita.com/suke_masa/items/9dd3300c3190d6445ff8]

SpringFrameworkの勉強会の記事です。
この記事の初めの２つがおすすめです。
最初見た時は、良くわからなかったですが、
少しして、戻ってきた時に色々としっくりきました。
後半２つは少し難しいかなと感じました。

SpringBootの学習にはSpringFrameworkの勉強が大事みたいです。

#####2つ目
[https://www.sys-link.jp/technical/SpringBoot/SpringBoot0-0.html]

SpringBoot入門の学習サイトです。
作りながら学べるのでイメージしやすく
楽しいです。難易度も優しいです。


この２つである程度イメージはできるのではないかなと思います。

参考になればいいなと思います。


ーーーーーーーーーーーー

※追記
###[eclipseを使ってSpringBootでHello World](https://qiita.com/toki_k/items/52c222433823268472a1)
SpringBootでのHello Worldの仕方です。
eclipseのインストールから記載しています。

###[SpringBootでToDoアプリを作ってみよう【誰でも作れます・初心者向け】](https://qiita.com/toki_k/items/f9fcdf7d65f3a8ab0f23)

SpringBootを使ってTodoアプリを作ります。
SpringBootの概念とか、難しい事学ぶ前に、一回これやって動かしてみるといいと思います。

###[SpringBootでToDoアプリを作ってみよう【+jQuery】](https://qiita.com/toki_k/items/e207157c679018579e21)

続きも書きました！！
[JQuery] ボタンからファンクションに値を渡す

下記のようにボタンにdata-で値を持っておくと簡単。

```javascript

$(document).ready(function(){
    $('input[type=image]').click(function() {
       var selector = $(this).data('selector');
       var color = $(this).data('color');

       $(selector).css("color", color);
    });
});
```

```html

<input type="image" value="" class="but-blue" data-selector="#col1 p" data-color="#00F" />
```
Watson StudioでNotebookのGPU環境が正式リリース

Watson Studioではこれまで[申請](https://medium.com/ibm-watson/gpu-powered-notebook-is-coming-to-watson-studio-56876f60c056)ベースで、NotebookのGPU環境がベータ版として提供されていましたが、この度GPU環境が正式にリリースされました。

##### Watson Studio GPU Notebook Now Generally Available
https://www.ibm.com/cloud/blog/announcements/watson-studio-gpu-notebook-now-generally-available

現時点ではDallasリージョンの、Standard および Enterprise プランで使用可能となります。本記事では簡単に使用方法をご紹介します。

# 使用方法

Watson Studioでプロジェクトを作成し、Notebookを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235649/4bd38e25-c3f0-d909-656d-7d6928ffbcb0.png)

デフォルトで定義されている **1/2 x NVIDIA Tesla K80 (1 GPU)** を選択し、**Create** ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235649/da6b8f6b-bfae-5902-d36e-cd041400a7f2.png)

Notebookが起動します。以上、とても簡単ですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235649/6966bf74-1a77-8855-325e-155c3549f1c5.png)

### 環境の追加
環境(Environment)の設定で、GPUの個数を増やした環境を作成することも可能です。

プロジェクトの画面で **Environment** タブを選択し、**New environment definition** をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235649/36fcf0ba-7917-d35a-6d11-8e5e332174ba.png)

**Define configuration** で **GPU** を選択すると、定義可能なGPUのタイプがリストボックスに表示されます。ここでは4GPUの環境（**2 x NVIDIA Tesla K80 (4 GPU)）** を選択し、適当な名前をつけて **Create** ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235649/d7fa13b7-78b6-3818-7cb6-467faa5db372.png)

Notebookを新規作成すると、定義した環境が使用可能となります。今回は[以前の記事](https://qiita.com/schiyoda/items/571fc968d08737fb55d9)で紹介したPyTorchのコード( https://github.com/schiyoda/FasterRCNN-PyTorch/blob/master/pytorch_rcnn.ipynb )で稼働確認してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235649/8d196a2a-84a7-009a-24fe-6d6fe327b652.png)

Deep Learningのモデル構築もサクサク動いてくれることが確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235649/c85936bd-fa7b-db58-963c-a22a7ce00f11.png)
[JQuery] クリックされたエレメントのIDを見る

JQueryメモ、クリックされたエレメントのIDを得る。 cssオブジェクトでセレクトされたときなどに使います。（使いました）。

```javascript

$(document).ready(function() {
    $("a").click(function(event) {
        alert(event.target.id);
    });
});
```
findメッソドで取得したレコードをhashに変換

#attrubutesメソッドをつかう
```answer_controller.rb
class AnswersController < ApplicationController
  def create
    Answer.create(Question.find(params[:id]).attributes)
  end
end
```
findメソッドでQuestionクラスのレコードを取得後、
attributesメソッドでハッシュに変換することで
Answerクラスにレコードを保存することが可能になった。
Redshift vs. BigQuery  vs. Snowflake 比較ブログの紹介

こんにちは。今回のテーマはずばりクラウド・データウェアハウスです。
現在、クラウド・データウェアハウスというと以下の3つがメジャーです。

- Redshift
- BigQuery
- Snowflake

データウェアハウス導入時にどれを選べば良いか悩んでいる方、別のデータウェアハウスに乗り換えを検討している方もいるかと思います。
どれを選択するかにおいて、最も重要なことは、各データウェアハウスの特性を正しく理解する事です。

次のブログは、それぞれのDWHを１対1で比較したものです。それぞれの比較を通してぼんやりとしたものがはっきりとすることもあるかと思います。導入を検討している方や乗り換えを検討されている方は、ぜひこれらのブログを参考に。

- **[Redshift vs BigQuery](https://www.xplenty.com/jp/blog/redshift-vs-bigquery-comprehensive-guide-ja/)**

- **[Redshift vs Snowflake](https://www.xplenty.com/jp/blog/redshift-vs-snowflake-ja/)**

- **[Snowflake vs BigQuery](https://www.xplenty.com/jp/blog/snowflake-vs-bigquery-ja/)**

もし、これ以外にも興味がある方は、**[それ以外](https://www.xplenty.com/jp/blog/)**のブログもチェックしてみてください。
Pythonで重複ありの組み合わせ


ここではPythonを使って重複ありの組み合わせが何通りあるかを計算するコードを書いていきます。

### factorialを使う。

```python:

from math import factorial

print("2つの正の整数を入力してください。")
a, b= map(int, input().split())
h = (factorial(a+b-1))/(factorial(b)*factorial(a-1))
print(str(a)+"個のものから"+str(b)+"個のものを重複を許して選ぶ方法は"+str(h)+"通りです。")
```

以下の様に書くとmathに含まれる関数を全部見れます。

```python:
import math
help(math)
```

### factorialを使わない。


```python:
print("2つの正の整数を入力してください。")
a, b= map(int, input().split())
n = a + b -1
m = n
l = a-1
while  n > b+1:
    m = m * (n-1)
    n = n - 1
while l > 0:
    m = m / l
    l = l -1

print(str(a)+"個のものから"+str(b)+"個のものを重複を許して選ぶ方法は"+str(m)+"通りです。")
```
一定時間経過したらアクセスできなくなるキャッシュを使う (C#)

# 一定時間経過したらアクセスできなくなるデータキャッシュを使う (C#)

\# 以下の記事が書かれた時の版数は .NET Core 3.1 (3.1.201), System.Runtime.Caching 4.7.0 となります.

外部リソースから拾ってきたデータをキャッシュしたい場合、ずっとキャッシュすると外部リソース側が更新されたときに困る. そういう時とかに使えるデータキャッシュ. 以前はそういう用途が多い Web アプリケーション用に ASP.NET だけそういう機能があったが、今はデスクトップアプリでも普通に使えるようになった. 最後にアクセスしてから一定時間経過後にキャッシュを無効化したいのであれば `AbsoluteExpiration` の代わりに `SlidingExpiration` を使う.

とりあえず今回は有効期間1分で、10秒ごとにアクセスしてみた.

```csharp
using System;
using System.Runtime.Caching;
using System.Threading;

namespace ConsoleApp1
{
    class Program
    {
        static readonly ObjectCache Cache = MemoryCache.Default;

        static void Main(string[] args)
        {
            while (true)
            {
                var message = (string)Cache["test"];
                if (message == null)
                {
                    message = $"cached at {DateTime.Now:yyyy-MM-dd HH:mm:ss}";
                    Cache.Add("test", message, new CacheItemPolicy()
                    {
                        AbsoluteExpiration = DateTime.Now.AddMinutes(1)
                    });
                }
                Console.WriteLine(message);
                Thread.Sleep(TimeSpan.FromSeconds(10));
            }
        }
    }
}
```

なお、System.Runtime.Caching 使用時には Install-Package System.Runtime.Caching で nuget からインストールする必要がある、念の為.
GitHubでよく使われる英略語

#概要
学生のときにプルリクを出してコードレビューの際、<b>「LGTM」</b>と言われプルリクが通りました。
今思うとなんて事ないんですが、学生の時は調べないとわかりませんでした。
と言うわけで、今回はそんなGitHubでよく使われてる英略語を紹介します

#AFAIK = "As Far As I Know"
ぱっと見でアファイクと読んでしまいそうなこの略語
<b>「自分の知っている限りでは」</b>と言う意味になります。
実際、知ってるだけで使った事はありません。

#FYI = "For Your Information"
<b>「参考までに」</b>と言う意味です。
リンクと一緒に使うことが多いですね。

#GOTCHA = "I've Got You"
ガッチャ！
これ割と使う気がする
<b>「わかった！」</b>と言う意味です

#LGTM = "Looks Good To Me"
これが一番目にする略語じゃないでしょうか
<b>「自分的にはOK!」</b>って言う意味ですね
概要でもいったプルリクとかによく用いられます。

#NP = "No Problem"
<b>「気にしないで」</b>
これはGitHub以外でも目にするんじゃないでしょうか？

#TIA = "Thanks In Advance"
<b>「お手数をおかけしますがよろしくお願いします。」</b>って言う意味があります。
この略語はたくさん意味があリます。
場面を間違えると失礼な言葉になるので注意です。
まあでもあんまり使わない気がする。

#WIP = "Work In Progress"
<b>「今やってるよ」</b>って言う意味です。
issueの先頭とかにつけてることが多いかな？

#XD
可愛い笑顔です。
顔文字として使ってください。

#終わり
自分が知ってるだけまとめてみました！
よく使うものから、あまり使えないことがあるのではないでしょうか
プルリクを出す際や、コードレビューする際はぜひ使ってみてください
【Teams】TeamsでGoogleDriveからOneDriveにファイルコピーする方法

#・はじめに#
突然ですが、今後 GSuite をやめて Office365 を利用することになったけど、Google Drive 上のファイルをどうやって移行しよう。。って考えていませんか？
もしくは、Google Drive と One Drive を併用しているんだけど、簡単にファイルをコピーしたいという人もいるのではないでしょうか。

今回は**Teamsを利用して Google Drive から One Drive にファイルコピーする方法**をご紹介します。
事前準備は、Teams に Google Drive を追加するだけ！！
**お金をかけずに簡単にファイルを One Drive 上にコピーしたい！！**って時に便利な方法です。

#・注意事項#
この記事でご紹介する方法では、下記の点にご注意ください。
1．**ユーザー単位で実施する必要があります**。
2．ファイルコピーできるのは**ログインしているGoogleアカウント自身の Google Drive のみ**です。
3．この方法で**フォルダはコピーできません**。
4．**Googleスプレッドシートなどの GSuite 製品のファイルはコピーできません**。

#・方法#
#####Teams にクラウドストレージを追加する#####
1．Teams を起動する。（Web版、アプリ版どちらでもOK）
2．Teams の左側メニューにある「ファイル」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613247/68bd76ff-f691-8836-d55d-5f07129c89d7.png)

3．画面左下の「＋クラウドストレージを追加」ボタンをクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613247/7a6a0175-c30a-636b-2a32-c7e154cfc394.png)

4．Google Drive を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613247/a9c48f4b-ec2a-fa97-65ec-dfd00a8244b2.png)

5．自分のGoogleアカウントのIDとパスワードを入力する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613247/7bff24c2-49f6-1fa4-9b60-e65fdce37d18.png)

6．Teams に Google Drive が追加されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613247/90f08177-d660-417c-99b4-d4100866cdf5.png)

#####Google Drive から One Drive にファイルをコピーする#####
7．GoogleDriveからOneDriveにコピーしたいファイルにチェックを入れる。
GoogleスプレッドシートなどGsuiteのファイルやフォルダはコピーできないので注意してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613247/e4da71cd-02f7-5f37-48b2-9c69a22da51e.png)

8．ファイルを選択した状態で「コピー」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613247/6dfa624b-be11-1141-c868-ad1bf2362cb5.png)

9．コピー先に One Drive を選択して、「コピー」ボタンをクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613247/f861fc4b-2a55-611b-a090-51c39d8ed9dc.png)

10．One Drive 上にファイルがコピーされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613247/65b774a6-eefe-be85-d177-28ece155e1a1.png)


#・宣伝#
私が所属する会社（Funkit）でブログを運用しています。
Teamsの活用方法、EMSを利用したセキュリティの強化、Power Appsアプリの事例紹介などを掲載していますので是非ご覧ください。

**Share！ビジネス　ビジネスに役立つクラウドサービス利活用術をシェアするブログ（随時更新中）**
https://blog.funkit.jp/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613247/afcb5e22-0958-a696-d9af-d20ca2589e60.png)