OmniAICreator/Qiita-1.07M huggingface dataset:
Ruby 様々な繰り返し処理について

# 前置き
Rubyの反復処理についてまとめる。

## eachメソッド (配列・ハッシュ)
Rubyでは最も使う反復処理のメソッド。配列・ハッシュに対して便利。

```ruby:each.rb
fruits = ["apple", "banana", "grape"]
fruits.each{ |fruit| puts fruit }
```

配列fruitsの要素を、インデックスの若い順から1つずつ取り出して、引数fruitに入れて{}内の処理を実行する。処理が一行だけなので、{}を使っているが、

```ruby:each_do.rb
numbers = [1, 2, 3, 4, 5]
sum = 0
numbers.each do |number|
  if number % 2 == 0
    sum += number / 2
  else
    sum += number
  end
end
sum #=> 12
```

複数行の場合は、do endを使うと書きやすい。

## timesメソッド(繰り返す回数)
繰り返す回数が決まっている処理に対して便利。

```ruby:times.rb
sum = 0
10.times { |n| sum += n }
sum #=> 45
```

## upto・downtoメソッド(数値)
初めと終わりの数値が決まっているときに便利。

```ruby:upto.rb
15.upto(20) do |age|
  if age < 18
    puts "#{age}歳では選挙権はありません"
  else
    puts "#{age}歳は18歳以上なので選挙権があります"
  end
end
```

uptoは数値を増やす方向に処理を繰り返す。
指定した最初の数値15 から最後の数値20 まで処理を実行。

```ruby:downto.rb
20.downto(15) do |age|
  if age < 18
    puts "#{age}歳では選挙権はありません"
  else
    puts "#{age}歳は18歳以上なので選挙権があります"
  end
end
```

downtoは数値を減らす方向に処理を繰り返す。
指定した最初の数値20 から最後の数値15 まで処理を実行。

## while文・until文(終了条件)
終了条件が決まっているときに便利

```ruby:while.rb
array = (1..100).to_a
sum = 0
i = 0
while sum < 1000
  sum += array[i]
  i += 1
end
sum #=> 1035
```

whileの横にある条件が真の間、while endの間の処理を繰り返す。
上のコードでは、合計値sumが1000を超えたときに処理を終了する。

until文は、while文とは逆で、条件が偽のときに処理を繰り返すので、

```ruby:until.rb
array = (1..100).to_a
sum = 0
i = 0
until sum >= 1000
  sum += array[i]
  i += 1
end
sum #=> 1035
```

上のコードは、while.rbと同じ意味になる。

## loopメソッド(無限ループ)
while trueでも無限ループを作れるが、loopメソッドを使うとよりシンプルに作れる。

```ruby:loop.rb
numbers = [1, 2, 3, 4, 5, 6, 7]
loop do
  n = numbers.sample
  puts n
  break if n == 7
end
```

# まとめ
繰り返し処理に使うメソッド・構文は、ケースにあったものを使うと便利。

# 参考文献
プロを目指す人のためのRuby入門
伊藤淳一 [著]
14歳の長男に出題するPythoのF○○○B○○○

##まえがき
登場人物

- Ruby、JavaScript好きぐらいでPythonは学習したことがない父親の自分
- スプラトゥーンとマイクラが大好きな長男

ある日の父子の会話

長男：プログラミングやりたい
俺：なぜ急に？
長男：なんとなく
俺：マイクラの影響？
長男：Youtubeでなんとなく興味を持った
俺：どんなことやりたい？
長男：とりあえずプログラムやりたい
俺：言語どうする？
長男：とと（父の意）は何がいいと思う？

俺：うーん（お手軽にJavaScriptと言ってしまうか？それともRubyを勧めるか？いや、流行りはPythonだろか？質問があっても困らないところにしたい。CとJavaは困る）

俺：RubyかPythonはどうだろうか？
長男：パイソンで！（即答
俺：なぜにパイソン？
長男：聞いたことあるから


強いなPython、中学生でも知っているとは。とりあえず初心者向けの本を購入して長男に渡した。

[Python 1年生 体験してわかる！会話でまなべる！プログラミングのしくみ (Amazon)](https://www.amazon.co.jp/gp/product/4798153192/)

##課題を出したい
学習したからには課題を出したい。
初心者に出す課題といったらF○○○B○○○で決まりでしょう。F○○○B○○○ダンジョンを思い出します。


###課題
1から100まで、3で割りけれるときはF○○○、5で割り切れるときはB○○○、3と5で割り切れるときはFizzBuzzを出力する。

###自由回答
最初は自由に回答させます。

##条件付きの課題
Python初心者の自分が長男に課題を出すなら、父親なりの回答を用意しておきたいと思います。

###基本形
これを利用することを条件とします。


```
for i in range(1,101):
	list = [i, "F○○○", "B○○○", "F○○○B○○○"]
	#課題
```


###１：制限なし
制限なしの回答例

```
for i in range(1,101):
	list = [i, "F○○○", "B○○○", "F○○○B○○○"]
	if i%15==0:
		num=3
	elif i%5==0:
		num=2
	elif i%3==0:
		num=1
	else:
		num=0
	print(list[num])
```

###２：一行
ikkoじゃないよ、1行で書く回答例

```
for i in range(1,101):
	list = [i, "F○○○", "B○○○", "F○○○B○○○"]
	print(list[3 if i%15==0 else 2 if i%5==0 else 1 if i%3==0 else 0])
```

###３：if禁止、行数制限なし
if禁止、行数制限なしの回答例

```
for i in range(1,101):
    fb = [i, "F○○○", "B○○○", "F○○○B○○○"]
    num = list('300102100120100')
    print(fb[int(num[i%15])])
```

###４：if禁止、一行
if禁止、1行で書く回答例

```
for i in range(1,101):
	list = [i, "F○○○", "B○○○", "F○○○B○○○"]
	print(list[bool(i%5==0)*2 + bool(i%3==0)])
```

###５：ifと％禁止
だめだ、分からなかった。

```
for i in range(1,101):
	list = [i, "F○○○", "B○○○", "F○○○B○○○"]
	# ％禁止のコードはわからなかった
```
※[しらかみゅ](https://qiita.com/shiracamus)さん（ありがとうございます）に教えてもらった方法からひねり出すと（*1入れるとわかりやすかった）

```
for i in range(1,101):
	list = [i, "F○○○", "B○○○", "F○○○B○○○"]
	print(list[(i//3==i/3)*1 + (i//5==i/5)*2])
```

##おわりに
ここまで考えたんだから、長男よ、ちゃんと学習して俺に課題を出さしてくれ。
伏字にしたのはぐぐって見つからないように願っている。
教えていただいた「i//3==i/3」はぐぐらないと理解できなかった。
さすがに「ifと％と＝禁止」は無理だと思う
「参照の追加」の仕方

# 環境

- IDE : Visual Studio 2019
- Target : WPF, windows desktop app, .NET Core3.1

# やりたかったこと
- dllを「参照の追加」で追加したかった。

# 困ったこと
- 「参照の追加」がどこにあるか分からず、プロジェクト右クリック→追加→既存の項目　で dllを追加してみたが、コードから参照できなかった。ググっても直接的な答えは得られなかった。

# 解決方法
以下の手順を実施
プロジェクト以下の依存関係を右クリック→COM参照の追加→（左のペインの）参照→右下の参照ボタンを押下しdllを選択

# 参考URL
https://docs.microsoft.com/ja-jp/visualstudio/ide/how-to-add-or-remove-references-by-using-the-reference-manager?view=vs-2019
Rustでクラス拡張を調べた


## 概要

SwiftやKotlinなどにあるクラス拡張をRustではどうやるのか気になり調べてみました。

例えば自身の2倍を返却する関数をIntに追加したい場合などはSwiftであればこうなるかと思います。

**Swift**

```swift
extension Int {
    func double() -> Int {
        return self * 2
    }
}

print(5.double())
```


## Rustで試す

Rustの場合はtraitで実装するようです。先ほどの2倍の例だとこんな感じでしょうか。

```rust

trait DoubleExt {
    fn double(self) -> Self;
}

impl DoubleExt for i32 {
    fn double(self) -> Self { self * 2 }
}

fn main() {
    println!("{}", 5.double());
}
```

## Genericにしてみる

上の例だとi32だけでしたが、Genericにする方法を調べてみました。

```rust

mod foo {
    pub trait DoubleExt {
        fn double(self) -> Self;
    }

    use std::ops::Add;
    impl<T> DoubleExt for T where T: Add<Output = T> + Copy
    {
        fn double(self) -> T { self + self }
    }
}

fn main() {
    use foo::DoubleExt;
    
    println!("{}", 1.1.double());
    println!("{}", 2.double());
}
```

パッと見で理解し辛いので、一つづつ噛み砕いてみます。

#### Add Trait

```rust

use std::ops::Add;
```

+演算子に関するtraitをとりこんでいます。
2倍の算出をimplの中で```self+self```で実装しているのでこちらが必要になります。

### traitの実装

```rust

impl<T> DoubleExt for T where T: Add<Output = T> + Copy
```

T型にDoubleExtの実装をするところですね。
whereを使ったtrait境界の指定では```T: Add<Output = T>```としています。
まずはstd::opts::Addの定義を見てみましょう。

```rust
pub trait Add<Rhs = Self> {
    type Output;
    fn add(self, rhs: Rhs) -> Self::Output;
}
```

上記のようにOutputが関連型となっているので、```T: Add<Output = T>```で実装側でOutputの型を決める必要があるということでしょうか。

### Copy Trait

```T: Add\<Output = T\> + Copy```の```+ Copy```の部分ですね
std::opts::Addの定義をさきほど確認しましたが、addメソッドは引数の値の所有権をそのままとるようになっています。
```self + self```では左側の値をaddに渡す時点で所有権が移ってしまうので、selfを右側の値に指定する時点では使えなくなってしまうようです。
そのためTがCopy Traitを実装していることを担保してあげる必要があるようです。

## さいごに


ZEROBILLBANKでは一緒に働く仲間を募集中です。
[ZEROBILLBANK JAPAN Inc.](https://zerobillbank.com/%e3%81%8a%e5%95%8f%e3%81%84%e5%90%88%e3%82%8f%e3%81%9b/)
RDSの任意のテーブルのダンプ

# What's this?
RDSの任意のテーブルのダンプとる手法の備忘

# 注意
対象DBと対象テーブルは以下のように記載していますが、必要に応じて読み替えてください
対象DB：my_database
対象テーブル：my_table

# やり方
### 1. RDSに接続ができる任意のサーバ(EC2など)に入る

### 2. RDSに接続できるか確認

```
[■■■@▼▼▼:/usr/bin][hh:mm:ss]$ sudo mysql -h 【RDSのエンドポイント】 -u 【mysqlユーザ名】 -p
```
RDSのエンドポイントはAWSマネジメントコンソールから確認可能
mysqlユーザ名は特に指定をしていないならadmin

```
[sudo] ■■■ のパスワード:【ユーザパスワード】
Enter password:【RDSのパスワード】
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 
Server version: 

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]>
```

### 3. 対象のDBがあるか調べる

```
MySQL [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| my_database        |
| tmp                |
+--------------------+
7 rows in set (0.01 sec) ※省略しています

```


### 4. 対象のテーブルがあるか調べる

```
MySQL [(none)]> use my_database;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MySQL [my_database]> show tables;
+-----------------------+
| Tables_in_my_database |
+-----------------------+
| my_table              |
+-----------------------+
2 rows in set (0.00 sec)
```

### 5. RDSとの接続を切る

```
MySQL [my_database]> exit
Bye
[■■■@▼▼▼:/usr/bin][hh:mm:ss]$
```

### 6. RDSの任意のテーブルのダンプを取得する

```
[■■■@▼▼▼:/usr/bin][hh:mm:ss]$ mysqldump -h 【RDSエンドポイント】 -u 【ユーザ名】 -t -p my_database my_table > my_table_yyyyMMdd.sql
```

- RDSのエンドポイントはAWSマネジメントコンソールから確認可能
- mysqlユーザ名は特に指定をしていないならadmin
- tオプションを付けることでcreate tableやdrop tableを省略した状態でのダンプが取得できます。復元に使用するときはtオプションを付けないようにしてください。

### 7. ダンプが取得されたことを確認する
任意の方法で実施してください。
私がやるとすると．．．

- llコマンドなどで、my_table_yyyyMMdd.sqlファイルが存在していること、更新日時があっていること、サイズが適当であることを調べる
- lessで開いて文字化けしていないことを調べる

とか？
vistaでquartus その10

#概要

vistaでquartusやってみた。
serialに、sendとbusyを導入してみた。

#環境

windows vista 32bit
quartus ii v13.0
ep2c5t144ボード

#写真


![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/3ceeb9e1-ad33-3c3e-0edb-230ebd2f7d3e.png)

#サンプルコード


```
module test2(input clk, input rst, output tx);
	localparam NEXT = 4'b0000;
	localparam DONE = 4'b1111;
	reg [5:0] n = 0;
	reg [7:0] char;
	reg [3:0] state = NEXT;
	reg send = 0;
	tx2 tx2(.clk(clk), .rst(rst), .send(send), .data(char), .tx(tx), .busy(busy));
	always @(posedge clk or negedge rst)
	begin
		if (rst == 0)
		begin
			state <= NEXT;
			n <= 0;
		end
		else if (send == 1)
		begin
			send <= 0;
		end
		else if (state == NEXT)
		begin
			state <= 1;
		end
		else if (busy == 0 && state != DONE)
		begin
			if (n == 26)
			begin
				state <= DONE;
			end
			else
			begin
				char <= 97 + n;
				send <= 1;
				n <= n + 1;
			end
		end
	end
endmodule



```

以上。
【あなたの知らない世界シリーズ】UMLの依存の方向性は、こう覚える

# UMLの依存の方向性ってどうも良く分からない
お客様のところで、UMLのユースケース図のレビューをしていたときのこと。
ユースケース間のincludeの矢印の向きをどちらに向けて良いのか、
どうしても覚えられない様子。

だいたい、ソフトウェア開発している人は、矢印があると、
「データの流れる方向」か「実行する方から実行される方への方向」のどちらかだと
思っているようです（過去の自分も例外ではなく...）。

UMLの依存の矢印の向きは、UMLの表現方法を理解すれば、まず間違えなくなります。

#UMLは言語だと再認識すれば、方向性も分かる
UMLは、そもそもが Unified　Modeling　Language で、言語です。
特に、英語をベースとしたモデル形式の言語なので、
**S V O** つまり、**主語＋動詞＋目的語** がはっきりしています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197297/37862b1e-3ff8-d74a-18e8-99fe6e5dce31.png)ならば、
**S：主語 = usecase01    　　　　　 V：動詞 = include   　　　　　　  O：目的語 = Usecase02**
であり、
**Usecase01　は、 Usecase02 を インクルードする**
という意味です。

ユースケースで使われる依存には、《include》の他に《extend》がありますが、
こちらは、「拡張する」をいう意味です。

ですから、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197297/888301b9-3b68-9880-6089-2b0347c8c4f3.png)は、
**S：主語 = usecase03    　　　　　 V：動詞 = extend   　　　　　　  O：目的語 = Usecase01**
**usecase03　は、 usecase01　を 拡張する**
という意味です。

#分かってないときの あるある違和感
includeの時は、**矢印の先**のUsecaseの方が**小さい**ことが多く、
extendの時は、**矢印の先**のUsecaseの方が**大きい**ことが多く
なります。
大きいUsecaseと小さいUsecaseというUsecaseの大きさで、依存の矢印の方向を考えてしまうと、
間違えてしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197297/643714d4-b6a3-0967-58a3-5b57ad940536.png)

#最後に
依存の矢印は、ステレオタイプの《動詞》を見て、S V O ---> の方向に記述します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197297/22ca9a89-6cb9-b686-6525-935693e8be72.png)

これは、クラス図でも同じことなので、是非覚えておいてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197297/ef80e74d-e847-a516-f25c-996fa03c992d.png)
[Rails] エラーメッセージ を表示する　- render、redirect_toの違い、flashについて -

エラーメッセージを表示する方法について書きます。
Railsでメッセージ出力する際によく使用されるrender、redirect_to、flashについても簡単に書きます。

##実装したいこと
フォームの入力値に誤りがあるときに、以下のようなエラーメッセージを表示させる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542905/7c6769df-b104-89a7-c94f-802305f70a9e.png)



##実装したコード

```login_controller.rb

    @error_txt = '※入力に誤りがあるか、登録されていません。'
    render :new
```

インスタンス変数@error_txtにエラーメッセージをセットし、renderでテンプレートnewを表示させるように指定します。
※エラー判定の処理は省略しています



```new.html.slim

    - if @error_txt
        p.error
            = @error_txt
```
テンプレート側ではインスタンス変数の@error_txtの値の存在チェックを行い、あれば@error_txtを表示させます。

##renderとは
renderとはテンプレートを指定して表示させる（レンダリングする）ためのメソッドです。
画面遷移させることなく、表示させることができます。


##redirect_toとの違い
renderと同様にページを指定して表示させるメソッドにredirect_toがあります。
renderが画面遷移することなく指定したテンプレートを表示するのに対して、
redirect_toメソッドはリダイレクトさせるためのメソッドで、URLを指定してリクエストを再送信するようにブラウザに指令を出します。
ブラウザはこの指令に応じ、指定されたURLに対して改めてリクエストをサーバーに送信します。
ブラウザとサーバー間のやりとりや処理が増えるため、改めてリクエストを送信させる必要がない場合は、renderを使うのが良いです。

今回はフォームの入力内容に対してエラーメッセージを表示させるだけで、リダイレクトさせたくないためrenderを使用します。



##flashとは
railsにおけるメッセージ表示について調べるとflashに関する記事が多くでてきます。
flashはsessionを利用した機能の一つでメッセージを画面に表示するためのメソッドです。
flashで設定したメッセージはセッションに保存され、リダイレクトされても保持されるためredirect_toメソッドを一緒に使うことが多いです。

今回はrenderを使用しており、リダイレクトもなく、セッションに値を保持する必要がないのでflashを使わずにインスタンス変数を使いました。


##まとめ
* リダイレクト不要なエラーメッセージはrenderとインスタンス変数で実装する
* リダイレクトが必要な場合は、redirect_toとflashで実装する
ディレクトリ丸ごとの md5sum を取り変更を検知する

`tar` と組み合わせるとハッシュ計算が1回ですむ。
以下 GNU/Linux 環境で確認。

```bash
$ tar -cPf - ./dir | md5sum -b
4a6aca1054a4730c8a86029a5788641f *-
```

チェックサムファイルを作っておけば変更があったかどうかがわかる

```bash
$ tar -cPf - ./foobar | md5sum -b | tee dir_checksum
5745affb9fb7e37875bf48c9c7e524c8 *-
$ tar -cPf - ./foobar | md5sum -c ./dir_checksum
-: OK
$ touch foobar/NewFile
$ tar -cPf - ./foobar | md5sum -c ./dir_checksum
-: FAILED
md5sum: WARNING: 1 computed checksum did NOT match
```
Windows10 HomeにDockerを導入してRstudioを使ってみよう

#はじめに
この記事はDockerを使うのが初めての人、Dockerイメージを使ってRstudioを使いたい人に向けた導入です。今回使ったLocal環境はWindows10 Home、64bitです。Oracleのvirtual boxはインストールしなくて大丈夫です。
#Dockerをインストール
　下記のDockerのホームページからWindows10 Homeに対応したインストーラーをダウンロードします。
https://docs.docker.com/docker-for-windows/install-windows-home/

#Windows10 Homeを更新しよう
Window10 Homeのバージョンが19018以上でないとDockerはインストールできません。更新する必要があります。現在のバージョンはキーボードでWinキー＋Rを押してwinverと入力すれば確認できます。
![バージョン確認.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437659/60dcb467-b511-7661-e477-c10ddf8ea0b7.png)

　
バージョンが古い場合はアップデートが必要ですが、Windows Insider Programに登録していない人は現時点（2020年6月22日）でバージョン1909以降にアップデートできないため、登録が必要になります。登録がまだの人はWindowsの設定→更新とセキュリティ→Windows Insider Programに移動してInsiderに登録しましょう。この時Insiderの設定はスロー（推奨）にしておきましょう。登録が済んだらWindows Updateから更新します。
![Insider.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437659/d1cf7325-2cff-6f65-5a07-3e5cce3a0dbc.png)

#Dockerをインストール 
インストールが進むとWSL 2:penguin:をインストールするするように勧められるので従います。このWSL 2のおかげで、Windows10 HomeでもDockerが使える仕組みです。全てのインストールが完了したらさっそく使ってみましょう。
#Dockerを起動する
Windowsの検索スペースにcmdと入力しコマンドプロンプトを起動します。
```docker```と入力し下の画像のようにコマンドの例がたくさん出てきたら成功です！ではさっそくdockerからRstudioを使ってみましょう。
![コマンド.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437659/be6ef355-29cd-1567-0f35-66e897195436.png)
#Rstudioを使う
#####STEP 1　イメージの取得
コマンドプロンプトに```docker pull rocker/rstudio```と打ち込みRstudioのイメージを取得します。
#####STEP 2　仮想環境とローカルの共有フォルダを作る
 下のコマンドを入力しSTEP 1で取得したイメージから仮想環境を整えます。この際、仮想環境とローカルディレクトリに共有のフォルダを作ります。なので、ローカルディレクトリ（自分のパソコン）とRstudio上でのディレクトリを入力します。
　ここで少しややこしいですがWindows上のローカルディレクトリはバックスラッシュ```\```で設定し、rstudio上でのディレクトリにはスラッシュ```/```を使ってください。```\```はコマンドプロンプト上では```¥```と表示されます。

```ubuntu
docker run -e PASSWORD='パスワードを設定してください' --rm -p 8787:8787 -v C:\Users\Desktop\R\:/home/rstudio/mydesktop rocker/rstudio
```
#####STEP 3 Rstudioへ
 DockerのダッシュボードからOPEN IN BROWSERをクリックするとRstudioがブラウザ上で起動します。この時IDとパスワードを聞かれますが、IDはrstudio、パスワードは先ほどのコマンドで設定したものを使います。
![Open in browser.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437659/578996a1-a45d-0ee1-6a98-c9cefa6c334c.png)
![R.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437659/e846b5c7-6445-b2c2-0cb2-dd1a3a006765.png)

R version 4.0.0、私の知っている限りでは最新です。Rのアップデートを自分で行う時の煩わしさから解放されるのがDockerのいいところです。Rstudio右下のHomeにStep 2で設定したフォルダ（先ほどのコマンドではmydesktop）が出来ていれば完了です。
![ディレクトリ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437659/b3d0844d-3c4d-afb4-7474-9cc82c9a8208.png)
ちなみにブラウザを閉じるとコンテナもなくなるのでファイルは共有したローカルフォルダに保存しましょう。

#参考ウェブサイト
- https://blog.codecamp.jp/programming-docker-image-container
- https://hub.docker.com/r/rocker/rstudio/
テンセントクラウドのIMアプリの作成方法

### 

### IMアプリの作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633185/8716b8f8-5e8a-6e6f-6d6c-6f489081d943.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633185/a0ed8845-0e8a-a562-3e6a-205817df31e6.png)

### アプリの情報を確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633185/96ac579e-d282-989f-35ad-17381f3380ad.png)
Docker運用のためのLaravelログ出力

# 概要
Docker運用におけるログ出力は標準出力/標準エラー出力となるが、単純にLaravel側でログを標準出力に設定しても出力されず、該当する記事も見当たらなかったため、実装した内容を記録する。
# Laravelチャンネルドライバ設定
これは[公式](https://readouble.com/laravel/6.x/ja/logging.html)などにも出ているので問題にならないが、具体的には以下の二通りがある。

* 直接標準出力を指定するパターン  
チャンネルドライバに`stderr`を指定する。

```.env:/.env
LOG_CHANNEL=stderr
```
* デフォルトのドライバを指定するパターン  
他のドライバを内部で複数ラッピングできるので運用上こちらの方が便利。
 * チャンネルドライバに`stack`を指定する。  
 * `stack`のドライバ指定に`stderr`を追加する。  

```env:/.env
LOG_CHANNEL=stack
```

```php:/config/logging.php
...
    'channels' => [
        'stack' => [
            'driver' => 'stack',
            'channels' => ['single', 'stderr'],
            'ignore_exceptions' => false,
        ],
...
```

# php-fpm設定
Laravelの設定を行なっても標準出力されず、phpの設定なども行なってみたができず。。。
はっきりしたソースが見当たらなかったが、**Laravelはアプリケーションサーバがphp-fpmの場合は、php-fpm経由で標準出力する**らしい。
(他のアプリケーションサーバーは知りません。。。)

* php-fpm設定ファイル`www.conf`に以下の設定をする。

```conf:www.conf
catch_workers_output = yes # 標準出力を可能にする
decorate_workers_output = no # php-fpmがログ出力時に吐くゴミ接頭辞を出さない
```
***
以上で、無事標準出力にエラーを出力することができた
しかし、decorate_workers_outputパラメータはphp7.3以降が有効だとのことなので、それ以前はどやって対応していたのだろう。。。
ゴミも出力することを許容せざるを得なかったのか
Windows10のタスクスケジューラでphpを実行する

#タスクスケジューラとは
Linuxでいうところのcrontabのようにバッチを設定するソフトです。

#タスクスケジューラ起動
スタートボタン -> Windows管理ツール -> タスクスケジューラー

#タスク生成
タスクスケジューラライブラリの上で右クリック -> 基本タスクの作成

名前・説明: 後から見てもわかるように適当につける
トリガー: 今回はテストで行うので1回限りにチェック
開始時刻: 近い時刻
操作: プログラムの開始

**<操作 プログラムの開始>**
プログラム/スクリプト: php(xamppを利用していた私の場合は C:\xampp\php\php.exe)
引数の追加: -f 登録したいPHPファイル (-f test.php)
開始(オプション): 登録したいPHPファイルの位置 (C:\xampp\htdocs\)
[php コマンドラインオプション](https://www.php.net/manual/ja/features.commandline.options.php)


#タスク起動
設定した時間が来るのを待つ or タスク選択して右クリック -> 実行
git global コマンド削除方法

```
alias.st=status
alias.cob=checkout -b
alias.co=checkout
alias.ss=status
alias.br=branch
alias.com=commit -m
```
```
編集、更新
$ git config キー名　設定値　#ローカルリポジトリに設定
$ git config --global キー名　設定値　#全てのローカルリポジトリに設定
削除
$ git config --unset キー名
```
```
$ git config --global --unset alias.st
$ git config --global --unset alias.cob
$ git config --global --unset alias.co
$ git config --global --unset alias.ss
$ git config --global --unset alias.br
$ git config --global --unset alias.com
```
finally で async ジェネレータの反復完了時、中断時、エラー発生時の全てで処理を行う

DB やファイルなどからデータをたくさん取り出して
それぞれのデータに対して何かしたい場合は多くあると思います

```ts
async function* readLines() {
  console.log('ファイル開く処理')
  for (let i = 1; i <= 5; ++i)
    yield { textContent: `${i} 番目の行` }
  console.log('ファイル閉じる処理')
}
for await (const line of readLines()) {
  console.log(line.textContent)
}
// ファイル開く処理
// 1 番目の行
// 2 番目の行
// 3 番目の行
// 4 番目の行
// 5 番目の行
// ファイル閉じる処理
```

## 解決すべき課題

上記の `readLines` には問題があります

```ts
async function* readLines() {
  console.log('ファイル開く処理')
  for (let i = 1; i <= 5; ++i)
    yield { textContent: `${i} 番目の行` }
  console.log('ファイル閉じる処理')
}
let tmp = 0
for await (const line of readLines()) {
  console.log(line.textContent)
  if (++tmp >= 3) break
}
// ファイル開く処理
// 1 番目の行
// 2 番目の行
// 3 番目の行
```

途中で `break` すると *ファイル閉じる処理* が実行されません

あるいは途中でエラーが起こると…

```ts
async function* readLines() {
  console.log('ファイル開く処理')
  for (let i = 1; i <= 5; ++i) {
    if (3 === i) throw new Error('何かエラー')
    yield { textContent: `${i} 番目の行` }
  }
  console.log('ファイル閉じる処理')
}
for await (const line of readLines()) {
  console.log(line.textContent)
}
// ファイル開く処理
// 1 番目の行
// 2 番目の行
// Error: 何かエラー
```

こちらでも *ファイル閉じる処理* が実行されません

## finally を使う

反復完了時、または中断時、そしてエラー発生時の全てで処理を行うには `finally` が使えます

```ts
async function* readLines() {
  console.log('ファイル開く処理')
  try {
    for (let i = 1; i <= 5; ++i)
      yield { textContent: `${i} 番目の行` }
  } finally {
    console.log('ファイル閉じる処理')
  }
}
let tmp = 0
for await (const line of readLines()) {
  console.log(line.textContent)
  if (++tmp >= 3) break
}
// ファイル開く処理
// 1 番目の行
// 2 番目の行
// 3 番目の行
// ファイル閉じる処理
```

```ts
async function* readLines() {
  console.log('ファイル開く処理')
  try {
    for (let i = 1; i <= 5; ++i) {
      if (3 === i) throw new Error('何かエラー')
      yield { textContent: `${i} 番目の行` }
    }
  } finally {
    console.log('ファイル閉じる処理')
  }
}
for await (const line of readLines()) {
  console.log(line.textContent)
}
// ファイル開く処理
// 1 番目の行
// 2 番目の行
// ファイル閉じる処理
// Error: 何かエラー
```
Vuetifyでテキストとボタンを横に並べる

# 実現したいこと

Vuetifyでテキストボックスとボタンを横並びにしたい。
ちょっと実現したいデザインは違うけど、フォームの構成としては、以下の検索窓のような感じです。

テキストボックスに入力後、ルーペアイコンのボタンをクリックして検索するというパターンです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133291/1ae7b7b8-e833-c073-e4a3-d266b677ec86.png)


# 実現方法

入力欄に使用する<code>v-text-field</code>の<code>append</code>スロットを使うと実現できました。
vuetifyの公式ドキュメントでは、[Icon slots](https://vuetifyjs.com/ja/components/text-fields/#icon-slots)として紹介されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133291/578bd2bc-6b51-32a6-5522-b0e5307716e0.png)

スロットの<code>append-outer</code>を使って、以下のようにフォームを作成します。

```vue
 <v-text-field
   v-model="message"
   label="Message"
   type="text"
 >
 <template v-slot:append-outer>
   <v-btn color="primary">検索</v-btn>
 </template>
</v-text-field>
```

こんな感じになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133291/4a0af2a0-9111-1084-d64f-251a6ec44876.png)

codepenでサンプルを作成しました。
こちらは、スロットの<code>append</code>も記述して、<code>append-outer</code>と比較しています。

冒頭の検索窓のように、テキストの中にボタンがあるパターンですと、<code>append</code>スロットを指定する方が合います。テキストとボタンを並べる場合は、<code>append-outer</code>がよいですね。

<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="html,result" data-user="1da2" data-slug-hash="qBbmLzz" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="Vuetify Example Pen">
  <span>See the Pen <a href="https://codepen.io/1da2/pen/qBbmLzz">
  Vuetify Example Pen</a> by Shigehiro　IDANI (<a href="https://codepen.io/1da2">@1da2</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>


# まとめ
公式ドキュメントのコンポーネントを眺めていても、組み合わせ方とかは、ある程度の経験が必要になってきます。

このタイプも、知っていれば簡単なのですが、知らないと、ズバリが見つけられなくて時間がかかるパターンでした。
View を支える依存関係プロパティ

## はじめに

オレオレ解釈の覚書　その１１

依存関係プロパティについてです。

## 本文

依存関係プロパティとは簡単に言えば Xaml 上でバインドできるコントロールのプロパティです。身近なところで言えば TextBox.Text や CheckBox.IsChecked などがこれに当たります。その実体は DependencyProperty という静的なフィールドで、DependencyObject から派生したクラスで定義します。例えば TextBox.Text であれば以下のようになります。（実際の System.Windows.Controls.TextBox とは異なります。あくまでイメージです。）

```cs:TextBox
using System.Windows;

namespace TestApp.Views.Controls
{
    public class TextBox : DependencyObject
    {
        // 依存関係プロパティ
        public static readonly DependencyProperty TextProperty =
            DependencyProperty.Register(
                "Text",
                typeof(string),
                typeof(TextBox));
       
        // CLR ラッパープロパティ
        public string Text
        {
            get => (string) this.GetValue(TextProperty);
            set => this.SetValue(TextProperty, value);
        }
    }
}
```

依存関係プロパティは DependencyProperty にメタ情報を渡して初期化するだけで、Xaml からバインドするための準備ができてしまいます。ただし、プログラム（C#側）からアクセスする際には、DependencyObject のメソッドを経由する必要があり、通常のプロパティと使用感が合いません。例のようにラッパープロパティを用意してインターフェースに統一感を持たせるのが一般的で、これによりコントロールの利用者は依存関係プロパティの存在を意識せずにアクセスすることができます。

### 宣伝

上記のようにすれば依存関係プロパティを定義できますが、初期化のくだりは多くの場合で規則的になり、いくつも用意する際は面倒ですし、バグの温床にもなります。拙作ですが、NuGet にて公開中の下記のライブラリでは、初期化の際に要求されるメタ情報を省略することができます。ラッパープロパティを用意することが暗黙のルールであることを利用し、必要な情報を補っています。

<div>
  <a href="https://www.nuget.org/packages/Plow.Wpf/">
    <img src="https://img.shields.io/badge/-NuGet-004880.svg?logo=nuget&style=flat-square">
  </a>
  <a href="https://github.com/kawasawa/Plow.Wpf">
    <img src="https://img.shields.io/badge/-GitHub-3F4448.svg?logo=github&style=flat-square">
  </a>
</div>

```cs:TextBox
using Plow.Wpf;
using System.Windows;

namespace TestApp.Views.Controls
{
    public class TextBox : DependencyObject
    {
        // 依存関係プロパティ
        public static readonly DependencyProperty TextProperty =
            DependencyPropertyExtensions.Register();
        
        // CLR ラッパープロパティ
        public string Text
        {
            get => (string) this.GetValue(TextProperty);
            set => this.SetValue(TextProperty, value);
        }
    }
}
```

## おわりに

ViewModel で登場した変更通知プロパティとは異なり、依存関係プロパティはほとんどのコントロールで必要なものがある程度用意されているため、新たに追加する機会は少ないかもしれません。とはいえ、ユーザーコントロールとしてまとめた際や、既存のコントロールを拡張する場合に登場するため、頭の片隅には置いておきたいですね。

次回はこれを応用した添付プロパティについてまとめます。
【JavaScript】プロパティの変化を監視する

#はじめに
React.jsやVue.jsのようなJSフレームワークを使用してない案件で、オブジェクトのプロパティの変化を監視しないといけないことがあったので、生のJavaScriptで実装しました。
今時のフロントエンド開発では、あまりなさそうな気もしますが。。。

#サンプルプログラム
```javascript:sample.js
//オブジェクトのプロパティの変化を監視する関数
let watchProp = function(obj, propName) {
	let value = obj[propName];
	Object.defineProperty(obj, propName, {
		get: () => value,
		set: newValue => {
			const oldValue = value;
			value = newValue;
			consoleOut(oldValue,value);
		}
	});
}

//プロパティが変化した時に呼び出す関数
let consoleOut = function(oldValue,value){
	document.getElementById("outTime").innerHTML = oldValue+"⇒"+value;
}

//監視させるオブジェクトとプロパティを定義
let timeKeeper = {"count_time" : 0};
watchProp(timeKeeper, "count_time");

//1秒ごとにプロパティをカウントアップ
setInterval("countup()", 1000);
let countup = function(){
	timeKeeper["count_time"] += 1;
	console.log(timeKeeper["count_time"]);
}
```
サンプルプログラムはこんな感じで、以下のようなhtmlで読み込ませてあげると、1秒毎に<ｐ>タグのテキストが変化します。

```html:sample.html
<!DOCTYPE html>
<html>
<head></head>
<body>
    <p id="outTime">0</p>
    <script type="text/javascript" src="sample.js"></script>
</body>
</html>
```
###【ブラウザ表示】
![timestamp.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660151/1a70bfcc-cda1-6ddc-f913-72db0efd217f.gif)


#Object.definePropertyでプロパティの変化を監視
```javascript
let watchProp = function(obj, propName) {
	let value = obj[propName];
	Object.defineProperty(obj, propName, {
		get: () => value,
		set: newValue => {
			const oldValue = value;
			value = newValue;
			consoleOut(oldValue,value);
		}
	});
}
```
サンプルプログラムでは、この「watchProp」という関数がプロパティの変化を監視して、変化した時に「consoleOut」という関数を呼び出しているのですが、 Object.defineProperty() というメソッドを使用しています。

詳しくは、リンクのMDNや他の方の記事が参考になるかと思います｡

>Object.defineProperty() - JavaScript | MDN
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty


>「[JavaScript] 6. Object.defineProperty/ies でプロパティ/メソッド定義」
https://qiita.com/Koizumi-Greenwich/items/1b827b4304538f2f8e37
SQL select文に条件を付与する

# 目的

- select文に条件を与えるwhereの使用方法についてまとめる。

# 例

- select文にてカラムの値に関する条件を付与したい時にはwhere句を使用する。
- 下記にwhere句の書き方の例を記載する。

    ```sql
    select 出力カラム
    from テーブル名
    where 条件式；
    ```

# 具体例1

- 新規レコード追加時に自動インクリメントされた数値が格納されるidカラムなどが存在するusersテーブルがあると過程する。
- usersテーブルのidカラムが1であるレコードの全てのカラムのデータを表示する時のSQL文を下記に記載する。

    ```sql
    -- 出力カラムの設定
    select *
    -- テーブルの指定
    from users
    -- 条件式の記載
    where id = 1；
    ```

# 具体例2

- ユーザの年齢を格納しているageカラムなどが存在するusersテーブルがあると過程する。
- usersテーブルのageカラムが20であるレコードの全てのカラムのデータを表示する時のSQL文を下記に記載する。

    ```sql
    -- 出力カラムの設定
    select *
    -- テーブルの指定
    from users
    -- 条件式の記載
    where age > 20；
    ```
SonarQube8.3 でgithub ログインを有効にする

公式のドキュメントが探せなかったので投稿させていただきます。
以下のドキュメントのpull request のレビューの設定でgithub checksとの連携はできたのですが、github id でのログインを有効にするにはgithub側に権限の設定追加が必要でした。

https://docs.sonarqube.org/latest/instance-administration/delegated-auth/

上記のドキュメントで作成したgithub app の設定画面を開く
Githubにログイン > settings > Developer settings > 対象のGithubApps の"Edit"

Permissions & events にて、以下の権限を "Read-only" に変更する

- Organization permissions 
  - Members
  - Blocking users
- User permissions
  - Email addresses

以上。
Elasticsearch bulkを使って複数ドキュメント登録

Elasticsearchで一つ一つドキュメントを追加していくのが面倒だったため、jsonファイルを使って複数ドキュメントを追加していきます。

# JSONファイル
```json:sample.json
{"index":{}}
{"id": 1, "name": "じゃがりこ"}
{"index":{}}
{"id": 2, "name": "マイクポップコーン"}
{"index":{}}
{"id": 3, "name": "チョコあ〜んぱん"}
{"index":{}}
{"id": 4, "name": "茎わかめ"}

```
一番下に一行空けないとエラーになってしまう。。

# 実行コマンド
```bash
# テンプレート
$ curl -H 'Content-Type: application/x-ndjson' -XPOST http://{domain}/{index}/_bulk?pretty --data-binary @{json file}.json

$ curl -H 'Content-Type: application/x-ndjson' -XPOST http://0.0.0.0:9200/snacks/_bulk?pretty --data-binary @sample.json
```
【TabCopy】マークダウン形式のタイトル付きURLをショートカットキー一発で取得して嬉しくなる方法

2020年5月からエンジニアとして勤務している@shoji621と申します。業務日報を普段マークダウン形式で記載しており、タイトル付きURLを記載する時に楽な方法がないか探していたところ、ちょうど良いChrome拡張機能がありましたので紹介させていただこうかと思います。
これを使えば、きっと嬉しくなる...はずッ...

# TabCopyをChromeに追加する
[TabCopy - Chrome ウェブストア](https://chrome.google.com/webstore/detail/tabcopy/micdllihgoppmejpecmkilggmaagfdmb?hl=ja)
![Tabcopy_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533673/4bd463a2-42ca-24b8-27b3-d2d30bebc99f.png)
こちらが、マークダウン形式のタイトル付きURLをショートカットキー一発で取得することができるChrome拡張機能[TabCopy](https://chrome.google.com/webstore/detail/tabcopy/micdllihgoppmejpecmkilggmaagfdmb?hl=ja)です。後述しますが、マークダウン形式以外にも、URL,JSON,CSV形式等の出力にも対応しています。

# オプションを開く
1. 追加されたアイコンを右クリックし
2. 「オプション」をクリックしてください。

![Tabcopy_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533673/65dcb3ee-3b9f-3024-cf18-3f7060730b07.png)

# オプション画面

## GENERAL
- `Copy confirmation` : タブをコピーする時の確認方法です。

```
Popup : ポップアップを表示する
Icon : アイコンにチェックマーク表示させる  (デフォルト)
Both : Popup, Iconの両方を適用
None : 何もしない
```

- `Ignore pinned tabs` : ピン留めされたタブをコピー対象にするかどうかです。 (デフォルトでは含めない)
- `Show in context menu` : コンテキストメニューにTabCopyを表示させるかどうかです（デフォルトでは表示させる）。コンテキストメニューとは、ウィンドウで右クリックを押下した時に表示されるメニューのことです。
- `Shortcut key` : ⌥(optionもしくはalt)+ C キーでTabCopyを呼び出せます。  
 

<img width="1440" alt="Tabcopy_5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533673/fa9af2d4-d32c-d546-2722-76d5ffe9568f.png">



### FANCY MODE
アイコンをクリックするとタブが表示され、どの範囲までタブをコピーするか選択できます。

```
1. Copy selected tab : 今開いているタブをコピー
2. Copy 2 tabs in window : このウィンドウで開いているタブ2つをコピー
3. Copy all of 33 tabs : 開いているすべてのタブ33個をコピー
```

![Tabcopy_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533673/8c0c820d-a438-0452-9e81-ef57e40e9396.png)

今回のケースでは、

- `FIRST FORMAT` : Markdown
- `SECOND FORMAT` : JSON
- `THIRD FORMAT` : CSV

に対応しています。各FORMATはプルダウンで任意のものに選択することができます。
(URL, Compact, Expanded, Link, Markdown, BB code, CSV, JSON, HTML, HTML table, custom)

![Tabcopy_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533673/98026810-f919-b8bc-1a3d-4e8fec1b9090.png)


### SIMPLE MODE
アイコンのクリック回数に応じて、どの範囲までタブをコピーするか選択できます。
個人的には時短になるのでこちらのフォーマットがおすすめです。

```
1. シングルクリック ： Copy selected tab （今開いているタブをコピー)
2. ダブルクリック : Copy 2 tabs in window (このウィンドウで開いているタブ2つをコピー)
3. トリプルクリック : Copy all of 33 tabs (開いているすべてのタブ33個をコピー)
```

下にスクロールすると`FORMAT`メニューがありますので、今回はこれを`Markdown`に変更しましょう。

<img width="1425" alt="Tabcopy_6.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533673/e42beb0c-9143-f649-3066-8d638e0c71f4.png">


# TabCopyを使ってみる
お試しで、ウィンドウで開いているタブ全てをマークダウン形式でコピーしてみましょう。
###準備
1. [TabCopy Options](chrome-extension://micdllihgoppmejpecmkilggmaagfdmb/options.html)のページを開く
2. SIMPLE FORMATを選択
3. FORMATをMarkDownに変更

###マークダウン形式でコピー（嬉しくなります）
1. `⌥(optionもしくはalt)+ C` キーをダブルクリック （アイコンに:white_check_mark:と開いているタブの数が表示されればOKです）
2. `⌘ + V` キーをクリック(windowsの方は`control + V`)
3. 嬉しくなります:smile:

![ezgif.com-video-to-gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533673/46fab169-42a4-0835-d970-6dd9b72f31d7.gif)
GitHub の芝生の色を戻す

GitHub の UI がアップデートされたみたいですが、ユーザーページの芝生の色まで変わってしまいました…

ちょっと気持ち悪い色なので、css でサクッと戻してしまいましょう。

```css
.calendar-graph rect.day[fill="#c6e48b"] {
    fill: #c6e48b !important;
}
.calendar-graph rect.day[fill="#7bc96f"] {
    fill: #7bc96f !important;
}
.calendar-graph rect.day[fill="#239a3b"] {
    fill: #239a3b !important;
}
.calendar-graph rect.day[fill="#196127"] {
    fill: #196127 !important;
}

.contrib-legend .legend li:nth-child(2) {
    background-color: #c6e48b !important;
}
.contrib-legend .legend li:nth-child(3) {
    background-color: #7bc96f !important;
}
.contrib-legend .legend li:nth-child(4) {
    background-color: #239a3b !important;
}
.contrib-legend .legend li:nth-child(5) {
    background-color: #196127 !important;
}
```

前半は芝生の色を、後半は芝生の下の色見本を上書きしています。

あとはこれを [Stylus](https://chrome.google.com/webstore/detail/stylus/clngdbkpkpeebahjckkjfobafhncgmne) なりなんなりで適用してあげればOK！
PRML 演習問題 5.9 解答

##問題
>
$\mathrm{0{\le}y(x,w){\le}1}$となるロジスティックシグモイド活性化関数を出力に持ち.データが目標値$\mathrm{t\in}${0, 1}を持つようなネットワークについて2クラス分類問題における誤差関数(5.21) が導かれた.ネットワークの出力が$\mathrm{-1{\le}y(x,w){\le}1}$であり,目標値がクラス$\mathrm{C_1}$についてはt=1,クラス$\mathrm{C_2}$についてはt=-1であるようなネットワークを考えた時, 対応する誤差関数を導け.　出力ユニットの活性化関数はどのように選ぶのが適切か.

```math
\begin{align*}
\mathrm{E(w)=-\sum^N_{n=1}\bigl\{t_nlny_n+(1-t_n)ln(1-y_n)\bigr\}}
\tag{5.21}
\end{align*}
```

##方針
すでに得られた誤差関数(5.21)を新たな目標値と出力(活性化関数)である$\mathrm{t\in}${-1,1}と$\mathrm{-1{\le}y(x,w){\le}1}$に対応付けて更新していく. (出力ユニットの活性化関数にはロジスティックシグモイド関数とほとんど同じ性質を持つ$\mathrm{tanh}$が選ばれることが予想される.)

```math
\begin{align*}
\mathrm{tanhx=\frac{exp(x)-exp(-x)}{exp(x)+exp(-x)}}
\tag{a}
\end{align*}
```

##解答

新たな目標値をt', 出力(活性化関数)をy'とする.　それぞれロジスティックシグモイド活性化関数を出力に持つネットワークのt, yを用いて以下のように表すことができる.

```math
\begin{align*}
\mathrm{t'}&=\mathrm{2t-1}
\tag{b}\\
\mathrm{y'}&=\mathrm{2y-1}
\tag{c}
\end{align*}
```

したがってt,yは新たな目標値(t')と出力(y')を用いることで以下のように表すことができる.

```math
\begin{align*}
\mathrm{t}&=\mathrm{\frac{t'+1}{2}}
\tag{b.1}\\
\mathrm{y}&=\mathrm{\frac{y'+1}{2}}
\tag{c.1}
\end{align*}
```

(b.1), (c.1)を用いることで(5.21)で与えられる誤差関数を新たなネットワークに対応させる.

```math
\begin{align*}
\mathrm{E(w)=-\sum^N_{n=1}\bigl\{t_nlny_n+(1-t_n)ln(1-y_n)\bigr\}}
\tag{5.21}
\end{align*}
```

```math
\begin{align*}
\mathrm{E(w)}&=\mathrm{-\sum^N_{n=1}\bigl\{\frac{t_n'+1}{2}ln\frac{y_n'+1}{2}+\bigl(1-\frac{t_n'+1}{2}\bigr)ln\bigl(1-\frac{y_n'+1}{2}\bigr)\bigr\}}
\tag{5.21.a}\\
&=\mathrm{-\frac{1}{2}\sum^N_{n=1}\bigl\{(t'_n+1)ln(y'_n+1)+(1-t'_n)ln(1-y'_n)\bigr\}}+\mathrm{Nln2}
\end{align*}
```
よって目標値がクラス$\mathrm{C_1}$についてはt=1,クラス$\mathrm{C_2}$についてはt=-1であるようなネットワークに対応する誤差関数を導出することができた.

また対応する活性化関数y'は(5.19)と(c)より導き出せる.

```math
\begin{align*}
\mathrm{y=\sigma(a)\equiv\frac{1}{1+exp(-a)}}
\tag{5.19}
\end{align*}
```

よって

```math
\begin{align*}
\mathrm{y'}&=\mathrm{2\sigma(a)-1}\\
&=\mathrm{\frac{exp(a/2)-exp(-a/2)}{exp(a/2)+exp(-a/2)}}\\
&=\mathrm{tanh(a/2)}
\tag{c}
\end{align*}
```

したがって題意は示された.
WSL (Windows Subsystem for Linux) を用いて、Ubuntuをインストール


## 今回の目的
* 私は普段はMacユーザーなのですが、仕事用のWindowsでもLinux環境が使いたい。
* 昔はcygwinを使ったり、VMWareやVirtualBoxで仮想環境を構築してなんとかしていたが、今はWSL（Windows Subsystem for Linux）なるもので簡単に導入できるらしいので、とりあえずやってみたい。

## WSL（Windows Subsystem for Linux）について
* 以前は"Bash on Windows"とよばれた、Windows上でLinuxのBashシェルを動かすことができる、Microsoft公式のものです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648286/74b98c56-1b97-4f84-24cc-4702cbc48ecd.png)



## インストール
* 基本的にはMicrosoftの公式ドキュメント[Windows 10 用 Windows Subsystem for Linux のインストール ガイド](https://docs.microsoft.com/ja-jp/windows/wsl/install-win10)を参考にしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648286/78896dfe-a46c-a0ab-3f18-49bc379fc681.png)


* WSL2がMay 2020 Updateに含まれていますが、私はとりあえずWSL1をインストールしました。

（WSL2での変更点は[前バージョンから大幅に性能向上した新Linux環境「WSL 2」の実力を探る](https://www.atmarkit.co.jp/ait/articles/2005/15/news020.html)をご参照ください。）

* WSL2のインストールはWSL1のインストールに追加して行うものらしいので、とりあえずWSL1から始めたらよさそう、というわけでWSL1をインストールしていきます。

### 1. Windows機能の有効化
* コントロールパネル > プログラム > Windowsの機能の有効化または無効化を開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648286/9a22bfe2-c645-5d7d-cb0e-c9d854044a38.png)


* その中から、Windows Subsystem for Linumにチェックを入れます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648286/b31bf37c-098a-81f1-6a5f-ce8b1eb41fcb.png)


* もしくは管理者権限でPowerShellを開き、を実行します。

```powershell:PowerShell
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
```

* これが終わると再起動を行います。

### 2. Linuxディストリビューションのインストール
* Microsoft Storeにアクセスして、希望のLinuxディストリビューションをインストールします。
* 私はUbuntu18.04LTSをインストールしました。
* ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648286/ab946335-87dc-1ea8-8433-581c38a5ff19.png)

* Ubuntu20.04LTSもありますが、WSL1との相性がイマイチという記事を見かけたので、安全を期して18.04LTSにしています。
* 新しいディストリビューションを設定するため、初回のみ起動に数分ほどかかります。


### 3. インストールした後の諸々...
* まずは、実際にUbuntuを立ち上げてみましょう。


* とりあえず、初期設定のフォントと背景色が気持ち悪いのでプロパティで変更します。
　
* 次に、Tabで入力補完時にWindowsのビープ音が鳴ってイライラするので、次の一文で設定変更します。

```bash
echo "set bell-style none" >> ~/.inputrc
```

* あとは、lsを打つと背景色が表示されて見づらいので、これを取り除きます。


 * emacsなどテキストエディタをダウンロードして、bashrcに以下の1文を追加（dircolorの後ろ辺りに入れる）。
 
```bash
LS_COLORS="${LS_COLORS}:ow=01;34"; export LS_COLORS
```

* 最終的にこんな感じになりました（センスのなさがバレる...）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648286/0efaa984-c018-b9e0-8183-0e089a481f06.png)


### 4. おわりに
* とりあえずLinux (Ubuntuでなくてもよいですが)、動いたでしょうか？

* ちなみに、`cd /mnt/c/Users/"username"/`でWindows側のフォルダにもアクセス可能です。

* 以前にcygwinや仮想環境を構築して...みたいなことを考えると随分とラクになりましたね。ありがたいものです。
arXiv対策：epsファイルの容量削減方法

論文原稿をarXiv（物理、数学、計算機科学等のプレプリントサーバー https://arxiv.org )
に投稿する際、tex一式と図のファイル（eps)をアップロードし、arXivのウェブサイト上のTexliveでコンパイルする必要があります。

アップロードするファイルの容量には制限があり、近頃の図のデータは重いことが多いので容量を軽減するのに苦労してます。
以前は、ImageMagickのconvertコマンドを使っていたのですが、サイズが減りませんでした。

そこで、epsファイル(fig1.eps)をMac OS Xのプレビューで開いて、pdfで保存し、
再度eps化することで容量を削減することができました。

pdftops -eps Fig1.pdf

参照：http://yusuke-ujitoko.hatenablog.com/entry/2019/02/19/010737

思うように容量が下がらない時は、PDFの容量をadobeのAcrobatで下げて保存してからpdftopsを行うことで容量を削減することができました。

＊ファイルの容量が大きくなり、pdftopsをやっても容量をオーバーすることがあるので、PDFにした段階でAdobe Acrobat を使って
「ファイル」-> 「その他の形式で保存」->　「サイズを縮小したPDF...」
を選んで、PDFのサイズを落としてから、上記、pdftopsを行うと容量が１MB前後に下げることができます。
【GCP】Gsuiteと連携した時のメリットをまとめてみた

![Screenshot from 2020-06-24 11:30:40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/848f384a-020d-602d-4e45-86f9a57d4818.png)
Gsuiteには、さまざまな機能があり、多くのデータを蓄積することになります。

![Screenshot from 2020-06-24 11:31:49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/8ff725cd-7473-9b08-2f9a-8747b9672030.png)
そのデータをGCPのBigQueryと連携し、分析することで、更に活用の幅が広がります。

![Screenshot from 2020-06-24 11:32:17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/f81e5dfe-d1ba-9992-a3ea-86a022b1a52a.png)
データの蓄積から分析までを運用の手間がかかることなく実現できます。

![Screenshot from 2020-06-24 11:31:35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/294d4f91-2344-3469-e3f4-c00e90e01b62.png)
例えば、働き方改革の分析をすることもできます。

また、以下のようなメリットも有ります。
・G Suite Enterprise のお客様は、G Suite の管理コンソールからレポートや監査データを Google BigQuery に簡単に移行できるようになります。
・より長期のデータを保持、分析する。BigQuery では、期間を指定せずにデータを保存（既存の管理コンソール レポートでは 180 日間）できるので、長期的な傾向を分析しやすくなります。
・Google アプリのデータを他のデータセットと組み合わせる。BigQuery では、給与や財務などの他のデータセットを結びつけて、包括的なレポートを作成できます。

・管理者、カレンダー、端末、ドライブ、ログイン、グループ、OAuth トークン、SAML の監査ログに加えて、Reports API の今後の更新について、それぞれのアクティビティの動作情報を分析する。
・アカウント、Google ドライブ、Chrome OS、Classroom、カレンダー、Google+、ハングアウト、端末管理、Gmail に加えて、Reports API の今後の更新について、使用状況の統計情報を集約したレポートを作成する。
・Google データスタジオや、BigQuery でサポートされるその他の可視化ツールなどの分析ツールを使用して、カスタム レポートやダッシュボードを作成する。

![Screenshot from 2020-06-24 11:52:05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/0813c19e-80ec-8de2-811a-90d7b3de5272.png)
このような形で連携し、以下のような形でGoogle データスタジオへの出力が可能となります。

![Screenshot from 2020-06-24 11:52:14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/7e916029-8d68-da86-fe14-d624f93dd168.png)

また、BeyondCorpの実装も可能です。

#参考URL
https://www.slideshare.net/GoogleCloudPlatformJP/cloud-onair-05-google-cloud-g-suite
https://gsuiteupdates-ja.googleblog.com/2018/08/bigquery-g-suite.html
https://qiita.com/saenuruki/items/630f156bb35f81cc8697
lsコマンド

今日はlsコマンドについて。
僕が最初にLinuxを触ったときに、先輩が教えてくれたのが、「ls －l」だった。しかしながら、急に口頭で「エルハイフンエル」と言われても何も伝わってこなかった。


###lsコマンドとは
ファイルやディレクトリの情報を表示するコマンド

###lsコマンド代表オプション
・-a(-A):隠れているすべてのファイルとディレクトリを表示
※ディレクトリ：Windowsで例えるならフォルダ
・-d:指定したディレクトリの情報を表示
・-F:名前の後ろにファイルタイプを表示
・-R:サブディレクトリの内容も再帰的に表示

・-i:inode番号を付けて表示
※inode(アイノード)：ファイルやディレクトリの所有者や更新日時、ファイルサイズなどの属性情報が書いてあるデータ
`ls -i
67155140 anaconda-ks.cfg  
101905232 XXXX`
※この数字がinode番号

・ls -l:詳細情報(パーミッション、所有者、更新日時など)の表示
`ls -l
合計 4
-rw-------. 1 root root 1586  2月 13 14:35 anaconda-ks.cfg
drwxr-xr-x. 3 root root   30  2月 13 14:46 XXXX`




###参考文献
https://eng-entrance.com/linux_command_ls#:~:text=ls%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%AF%E3%80%8Clist%20segments,%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A0%E3%80%82&text=%E3%82%92%E5%8F%A9%E3%81%8F%E3%81%93%E3%81%A8%E3%81%A7%E7%8F%BE%E5%9C%A8,%E4%B8%80%E8%A6%A7%E8%A1%A8%E7%A4%BA%E3%81%97%E3%81%A6%E3%81%8F%E3%82%8C%E3%82%8B%E3%80%82


今日は新たにコマンドを入力できた
最小二乗法で多項式の係数を求める

#概要
####最小二乗法
最小二乗法は、誤差を伴う測定値の処理において、その誤差の二乗の和を最小にすることで、関係式を求める方法です。

####プログラムについて
今回作成したプログラムは、予め用意されたデータ`x` `y`をリストにし、そのデータから行列`S` `T`を求め、係数`a`を導く処理となります。また、求めたい多項式の次数を`m`と置いています。
最小二乗法を簡単に求めることができるライブラリは既に存在するかもしれませんが、今回はそのようなライブラリは利用せず、配列操作ライブラリ`numpy`のみを利用し、データ量を変更しても融通が利くような処理を作成しました。

#プログラム
```LeastSquares.py
# -*- coding: utf-8 -*-
#!/usr/bin/env python3

import numpy as np

X_data = [10, 20, 50, 70, 100]
Y_data = [9.3, 9.8, 10.9, 11.9, 13.1]
m = 1

def ST_list(power):
    S, T = 0, 0
    for i, j in zip(X_data,Y_data):
        S += i**power
        T += i**power * j
    return S, T

def A_matrix(n_size, len):
    A = []
    for k in range(n_size):
        A.append(S_list[k+len-m*2-1:k+len-m*2-1+n_size])
    return A

S_list = []
T_list = []
for n in range(len(X_data)):
    S , T = ST_list(n)
    S_list.insert(0, S)
    T_list.insert(0, T)

A = np.array(A_matrix(m+1, len(S_list)))
b = np.array(T_list[-1*m-1::]).reshape(m+1, 1)
Ainv = np.linalg.inv(A)
x = np.dot(Ainv, b)

print("S ="); print(A); print()
print("T ="); print(b); print()
print("a ="); print(x)
```

#実行結果
#####一次多項式の係数aを求める
```
m = 1
```

```
S =
[[17900   250]
 [  250     5]]

T =
[[2977.]
 [  55.]]

a =
[[0.04203704]
 [8.89814815]]

```

#####二次多項式の係数aを求める
```
m = 2
```

```
S =
[[130430000   1477000     17900]
 [  1477000     17900       250]
 [    17900       250         5]]

T =
[[2.2141e+05]
 [2.9770e+03]
 [5.5000e+01]]

a =
[[1.22729504e-05]
 [4.07142857e-02]
 [8.92034855e+00]]
```

#まとめ
今回のデータでは、一次多項式と二次多項式のときの係数`a`を求めました。データ量を増やせば三次、四次も行うことができますが、二次多項式のように浮動小数の影響を受けるため、見やすい値にするには`round`や`format`を利用する必要がありそうです。

#終わりに
今回の記事はここまでになります。
見にくいプログラムで申し訳ないです。特に配列操作に関してはもっと良い方法があるように感じます。アドバイス等あれば、コメント欄にてお願いいたします。
最後までお付き合い頂きありがとうございました。
【Django】Qオブジェクトを用いた際のエラー（Related Field got invalid lookup）

# はじめに
　検索機能を実装する際、Qオブジェクトを用いて絞り込みを行った。ここで、`Related Field got invalid lookup`というエラーが出たので原因を記録しておく。

# 状態
モデルはPostモデルを用意し、フィールドとして投稿者、タイトル、内容、投稿日をもつ。

```python:app/models.py
class Post(models.Model):
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    title = models.CharField(max_length=100)
    content = models.TextField()
    published_at = models.DateTimeField(auto_now_add=True)
```

```python:app/urls.py
app_name = 'app'
urlpatterns = [
    path('', views.IndexView.as_view(), name='index'),
]
```

```html:app/index.html
    <!--検索フォーム-->
    <div>
        <form action="" method="get">
            <a type="submit"></a>
            <input name="query" value="{{ request.GET.query }}" type="search" placeholder="Search...">
        </form>
    </div>
    <!--検索フォーム-->
```

　`q_word = self.request.GET.get('query')`で検索フォームの中身を取得し、存在する場合はQオブジェクトを用いてindex.htmlにレンダリングするobject_listを絞り込む。存在しない場合は単純にobject_listを返す。

```python:app/views
class IndexView(generic.ListView):
    model = Post
    template_name = 'app/index.html'

    def get_queryset(self):
        q_word = self.request.GET.get('query')

        if q_word:
            object_list = Post.objects.filter(
                Q(author__icontains=q_word) |
                Q(title__icontains=q_word) |
                Q(content__icontains=q_word)
            )
        else:
            object_list = Post.objects.all()
        return object_list
```

# 原因
　エラーの原因はapp/views.pyの`Q(author__icontains=q_word)`の部分である。views.pyのIndexViewクラスで検索の対象としてauthor、title、contentを指定しているが、models.pyのPostモデルでauthorフィールドはForeignKey()でユーザーモデルと紐づけられている。したがって、authorフィールドに紐づくモデルのフィールドを指定する必要がある。つまり、
`Q(author__icontains=q_word)`ではなく`Q(author__username__icontains=q_word)`と変更し、authorフィールドに紐づくUserモデルのusernameフィールドを検索対象とする必要がある。

```python:app/views
class IndexView(generic.ListView):
    model = Post
    template_name = 'app/index.html'

    def get_queryset(self):
        q_word = self.request.GET.get('query')

        if q_word:
            object_list = Post.objects.filter(
                Q(author__username__icontains=q_word) |    # 変更！！
                Q(title__icontains=q_word) |
                Q(content__icontains=q_word)
            )
        else:
            object_list = Post.objects.all()
        return object_list
```
<a>タグのリンクを無効化するには？

##aタグにはdisable属性がない

Chromeの場合、＜input＞ ＜textarea＞ ＜select＞タグなどはdisabledを書けば非活性になりますが、**＜a＞タグにはdisable属性がないので利きません。**



##aタグのリンクを無効化するには？

```ruby:css
 pointer-events:none;
```
上記で非活性化することができます。
＜img＞タグも同様です。


##ある条件のときだけ複数の項目を一括で非活性にするには？

そういう場合はJavaScriptを使います。
変更したい項目を＜div＞で囲み、idを付与します。

タグ名で要素を指定することで、項目を複数取得することが出来ます。
【document.getElementById("ID名").**getElementsByTagName("input")**】

それをFor文で回して各項目ごとにdisable属性や、css.Style属性を付与していきます。


```ruby:JavaScript
window.onload = function(){
	var flg = $("#modeflg").val();
/*条件*/
	if(flg == "2"){     
		var inputItem = document.getElementById("changeDisable").getElementsByTagName("input");
		for(var i=0; i<inputItem.length; i++){
		  inputItem[i].disabled = true;
		}
		var inputItem = document.getElementById("changeDisable").getElementsByTagName("textarea");
		for(var i=0; i<inputItem.length; i++){
		  inputItem[i].disabled = true;
		}
		var selectItem = document.getElementById("changeDisable").getElementsByTagName("select");
		for(var i=0; i<selectItem.length; i++){
		  selectItem[i].disabled = true;
		}
		var selectItem = document.getElementById("changeDisable").getElementsByTagName("a");
		for(var i=0; i<selectItem.length; i++){
			selectItem[i].style.pointerEvents = 'none';
		}
		var selectItem = document.getElementById("changeDisable").getElementsByTagName("img");
		for(var i=0; i<selectItem.length; i++){
			selectItem[i].style.pointerEvents = 'none';
		}
	}
};

```
iOSのWidgetについて

>⚠️NDAに違反しない情報のみ掲載します。またスクリーンショットは掲載できません。随時追記
#概要
iOSのWidgetは、Androidと違い自由度は少ない。
ただしその分統一感があったり、見やすさや操作性で優れている。
基本的にこれも対応必須になると思うので、備忘録として書いておく。
#仕様
- 2×2、2×4、4×4の3段階
- iPhoneではホーム画面に表示できる
- iPadはホーム画面で常に表示
- Macでは通知センターに表示される
- タッチされるとアプリが開くため、タッチイベントは利用できない
- SwiftUIで記述可能
#バグ
Xcodeからの書き込みの際、再起動しないと反映されない(beta1)
AtCoder Beginner Contest: D問題解答集 Python

### AtCoder Beginner Contest 171

`collections.defauldict(int)` を使って、各数字の個数を数え上げておく

```
import collections
 
N = int(input())
A = sorted(map(int, input().split()))
 
cnt = collections.defaultdict(int)
for a in A:
    cnt[a] += 1
ans = sum(A)
 
Q = int(input())
for _ in range(Q):
    B, C = map(int, input().split())
    ans += (C - B) * cnt[B]
    cnt[C] += cnt[B]
    cnt[B] = 0
```

以降追加予定
初心者Java　「条件分岐」

##if文
「Aという条件を満たすときにBという処理を実行する」という場合はif文を使います。

### 条件分岐「if else文」

if文を使った条件分岐で基礎となるのがif else文です。
if else文により、複数の条件に応じた処理を指定できるようになります。

 ```
if (条件式){
　処理内容1 　//条件式を満たす場合にのみ実行する
}
else{
　処理内容2 　//条件式を満たさない場合にのみ実行される
}
```

###条件分岐「and.or.no」
複数の条件式を組み合わせ、複雑な処理を実行させることが可能です。





## FizzBuzzの問題を解こう

Javaの条件分岐を勉強しようと思い、問題に挑戦。

####問題文
 * 1から100までの数値を標準出力に表示する。
 * 3の倍数なら数値の代わりに Fizz
 * 5の倍数なら数値の代わりに Buzz
 * 3の倍数かつ5の倍数なら数値の代わりに FizzBuzz


まずは書いてみました。

```java
public class FizzBuzz {
    public static void main(String[] args) {
        for (int i = 1; i <= 100; i++) {  // forで1から100までの数でループ
        //反復式では繰り返し後に行いたい処理を書く(繰り返し時には必ずiが+1される)
            if (i % 3 == 0) { 
                // 3の倍数かつ5の倍数のとき
                if (i % 5 == 0) {
                    System.out.println("FizzBuzz");
                    // 3の倍数のとき
                } else (i % 3 == 0) {
                    System.out.println("Fizz");
                }
            } else if (i % 5 == 0) {  // 5の倍数のとき
                System.out.println("Buzz");
                // どれにも該当しない場合
            } else {
                System.out.println(i);
            }
        }

    }
}
```

出力結果（長いので省略）

```
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
````



もう一つ練習問題を解いてみました

### ifの練習問題

```java
class Mondai{
    public static void main(String[] args){
      
      /*
          以下の変数を作成してください
          型：String　変数名：student_name　初期値："田中"
          型：int　変数名：japanese_score　初期値：85
          型：int　変数名：mathematical_score　初期値：66
      */
        String student_name = "田中";
        int japanese_score = 85;
        int mathematical_score = 66;

        //型：double　変数名：average_score　初期値：国語の点数と数学の点数の平均値

        double average_score = ((japanese_score + mathematical_score) / 2);
        //国語の点数を表示して下さい
        System.out.println("国語の点数は" +  japanese_score + "点です");

        //数学の点数を表示して下さい
        System.out.println("数学の点数は" +  mathematical_score + "点です");

        //国語と数学の平均点を表示して下さい
        System.out.println("国語と数学の平均点は" + average_score + "点です");
      
      /*
          以下のifを作成して下さい
          平均点が65点以上の場合、「合格です。」と表示
          平均点が65点に満たないの場合、「不合格です。」と表示
      */
          if (average_score >= 65){
              System.out.println("合格です");
          }else {
              System.out.println("不合格です");
          }

    }
}
```