OmniAICreator/Qiita-1.07M huggingface dataset:
JavaScriptでの関数の取扱説明書

# JavaScriptでの関数使用方法
rubyではdef~endで関数を使用していましたが
JSでは**function文**を用います。
以下、定義です

```javascript
function 関数名(引数){処理の内容}
```
定義だけ示されてもよく分からないと思うので具体例を交えていきます。

## 具体例①

```javascript
function hello() {
  console.log("hello");
}

function name() {
  console.log("name");
}

hello();
name();
```
これを実行した結果は以下の画面です。
<img width="1222" alt="JavaScript.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625088/df0ebd42-a5c4-db18-6d41-6e24a1bc1316.png">
これは定義が分かれば理解できると思います。
では次の具体例をみていきましょう

## 具体例②

```javascript
function sum(num1,num2){
  num1*num2;
}

let num1 = 1;
let num2 = 2;
console.log(sum(num1,num2));
```
これを実行した結果は以下の画面です。
<img width="1219" alt="JavaScript-3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625088/1655f6ad-56bc-3a5b-26ab-abebbc84ccc3.png">
なぜか２という結果が出力されていません。
これはそもそもreturnが入っていないからです。
rubyの場合ではreturnがなくても自動的に返り値を設定してくれましたが
**JSではreturnを明確**にしないとこのようなエラーがでます。
なので以下のようなコードを書くとエラーがなくなります。

```javascript
function sum(num1,num2){
  return num1*num2;
}

let num1 = 1;
let num2 = 2;
console.log(sum(num1,num2));
```
実行結果は以下の画面になります。
<img width="1217" alt="JavaScript-4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625088/ca8ca495-79db-3a35-e82b-39fb35179602.png">
これで正しく表記されました。

# 関数の種類
実は関数には２つの種類があります
①関数宣言
②無名関数
それぞれ、どのようなコードなのか、みていきましょう

```javascript
関数宣言
function hello(){
  console.log('hello');
}

無名関数
let hello = function(){
    console.log('hello');
}
```
違いとしては**無名関数は関数自体に名前がない**です。
働きの違いとしてはどういう違いがあるのかみてきます。
無名関数をみてきます。以下のように記述していきます。

```javascript
hello();

let hello = function(){
    console.log('hello');
};
```
そして実行結果は以下のようになります。
<img width="1217" alt="JavaScript-5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625088/ce080e81-4f33-b3d8-11f6-d90222aca335.png">
エラーが出てしまいました。
ここでプログラムの原理原則を思い出してください。
**上から順番に式を実行していくのが原則**でした。
今回はhelloが定義されていないにもかかわらず、
helloを呼び出しているのがエラーの原因です。
これを以下のように書けばうまくいきます

```javascript
let hello = function(){
    console.log('hello');
}

hello();
```
プログラムの原則を利用して順序を逆にしました。
余談ですが**関数宣言はrubyのように先に定義しなくても大丈夫**です。
無名関数だけ今までと扱いが違うので注意しておきたいです。
1日10分のコピーライティングで鍛える伝える力

# 円周率3.14の奇跡
いきなりクソコピーすいません。
Qiitaは技術情報書くところですので、こいつ何書いてるんだって思われた方も多いかと思うのですが、エンジニアの方の日々の業務を飛躍的に改善する学習方法として「コピーライティング学習法」をお勧めしたく記事を書きました。

## 改善が期待される業務
* メール / 報告書 / 議事録
* 要件定義書 / 仕様書 / 設計書 ...

ほぼ全てのドキュメント作成業務です。

## 本記事で扱うコピーの定義
記事や書籍により多少の差異がありますが、本記事の学習法では以下をコピーとして定義し学習対象とします。

* キャッチコピー
自分の伝えたいことを簡潔に伝える見出し(15 - 20文字程度)

* リードコピー
本文の内容を簡潔に伝える冒頭の書き出し(2 - 3行程度)


[(参考)Wikipedia : キャッチコピー](https://ja.wikipedia.org/wiki/%E3%82%AD%E3%83%A3%E3%83%83%E3%83%81%E3%82%B3%E3%83%94%E3%83%BC)
> キャッチコピー、キャッチフレーズとは、主に商品や作品の広告など、何らかの告知や宣伝に用いられ、謳い文句や煽り文句となる文章で、広告コピー（広告文）の一部である。惹句とも呼ばれる。
> 
> 1文、1行程度のものから、数行に亘る物まで形式は様々である。広告や宣伝においては、キャッチコピーで商品の印象が決まると言え、その出来如何によっては商品自体の売れ行きが大きく左右される事になるため、重要視される。職業としてキャッチコピーを含む広告コピーを創作する者をコピーライターという。

## コピーライティング学習法
時間を見つけて、キャッチコピーとリードコピーを、身の回りのもの（まずは好きなもの）を対象に書くだけです。
勉強会などで制限時間を決めて書き、お互いに見せ合うとより一層効果的です。

## 期待される効果(個人差があります)
* 観察力

コピーを書くためにはコピーを書く対象のことをよく知らなければ書けません。
コピーを反復して書くことで『観察力』の改善が期待されます。

業務の例では、過去案件の書類を参考にドキュメントを作成するようにという指示を出した際に、フォーマットだけ参考にする方、中に書いてある情報の構成まで参考にする方などいると思いますが、観察力が低い方の成果物はレビューしても直りにくい傾向があるかと思います。

* 分析力 / 分解力

好きなもののことを語ろうとすると膨大な量になりがちです。
３行で詳しく説明しなければいけない時に、膨大な情報の中から何を語るべきかを判断する『分析力 / 分解力』の改善が期待されます。

業務の例では、報告書やメールが、とにかく時系列にやったことをすべて書いてくる方などいると思いますが、何を書くにも３行で書く習慣がついていれば、その様な報告を受ける機会が減る事が期待されます。

* いいとこ探し力

反復していると、ネタが切れてきます。
興味のないもののコピーを書こうとすると行数が書けません。
無理にでもいいところを探そうとする習慣をつけると業務と言わず人生が豊かになります（たぶん）。

* 伝えるための表現力

キャッチコピーは、「一番短い言葉で伝えるための文章」だと思います。
これを反復して書くことで、全ての文章が読者に伝わることを意識した文章、すなわち、『伝えるための表現力』の改善が期待されます。

ここではタイトルの伏線を回収しますが、「円周率3.14の奇跡」はキャッチー（なんだろう？と興味を惹く）なことのみを意識して「伝えたいこと」は何もないというコピーでした。人に何かを伝えない文章は存在しない文章と同義です。

ただし、そのようなコピーが「クソコピー」ということを伝えたかったので、もしもそれが伝わっていたらわたしの『伝えるための表現力』は改善されつつあると言えるかもしれません。わたしも勉強中です。

* レスポンスタイムの短縮

本訓練を反復することで、情報収集からアウトプットまでの時間が短縮することが期待されます。

メールや報告書など、素早く返信が必要なケースで、即座に返信できるような事が期待されます。

## まとめ
日本人だから日本語が書けるのは当たり前と思いがちですが、常日頃から文章を書いていないと文章力は落ちます。
そして、まとまった量のドキュメントを日常生活で書く機会は、意識して作らないとない状況かと思います。
気づけばわたしも文章書いてないなという危機感から本記事を書かせて頂きました。

業務ドキュメントのレビュー指摘の原因が「基礎が出来ていない」という状況は指摘する側もされる側も不幸になります。
また、その様な指摘が出るケースでは、啓蒙本やHowTo本を買ってきて１－２冊読んでも改善する事はまれで、地道な反復での改善を期待するしかないと思っています。

今回ご紹介した「コピーライティング学習方法」は、日本語でドキュメントを作成する上での基礎力を、比較的楽しく短い時間の反復の訓練で習得できる方法となっているかと思います。

テレワークの導入も加速し『ドキュメント』の重要性は上がっていくかと思いますので、不幸な状況になる前に『楽しく』『伝える文章』を学べたらよいなと思います。
SQLiteでFizzBuzz的な

# Summary

Sqlでfizzbuzzしてみた

Sqliteでfizzbuzzしてみた

fshrapでfizzbuzzしてみた

とりあえず、メモ書き程度に・・・

## つまりは

sqliteのユーザー定義関数をfsharpでかいてべた書きのsqlを実行する

## こんな感じ

sqlの実行部

```fsharp

open Callmekohei.MySqlite.MySqlite3

let foo () =
  let db = SQ3 @"C:\Users\callmekohei\Desktop\db/tmp.sqlite"
  let sql =
    @"

-- BigSky : SQLite3 で generate_series(連番)
-- https://mattn.kaoriya.net/software/lang/sql/20150428194911.htm
with
  recursive generate_series(x) as (
    select 1
    union all
    select x+1 from generate_series limit 15
  )

-- ★ここでfizzbuzz関数を使えるのがポイント！
select fizzbuzz(x)
from generate_series
      ;

    ;; "
  db.ConnectionOpen
  db.DumpQuery sql
  db.ConnectionClose

[<EntryPoint>]
let main argv =
  foo()
  0 // return an integer exit code

```

sqliteのユーザー定義関数

```fsharp

// MySqlite.fs（自作）の一部分

  [<SQLiteFunction(Name = "fizzbuzz", Arguments = 1, FuncType = FunctionType.Scalar)>]
  type Foo () =
    inherit SQLiteFunction()
    override obj.Invoke(args:obj[]) =

      int( string(args.[0]) )
      |> fun x ->
        match x with
        | x when x % 5 = 0 && x % 3 = 0 -> "FizzBuzz"
        | x when x % 3 = 0 -> "Fizz"
        | x when x % 5 = 0 -> "Buzz"
        | x -> string x

      |> fun x -> box<_> x


  type public Sq3Impl( con : System.Data.SQLite.SQLiteConnection) =

    let bindFunction(connection:SQLiteConnection, func ) =
        let attributes =
          func.GetType().GetCustomAttributes(typeof<SQLiteFunctionAttribute>, true)
          |> fun x -> unbox<SQLiteFunctionAttribute>(Array.item 0 x)
        connection.BindFunction(attributes, func)

    member this.ConnectionOpen : unit =
      con.Open()
      bindFunction (con, (new Foo()) )
```

### 実行結果

```
実験 $ dotnet run
fizzbuzz(x)
-----------
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
```

## 感想

これは！

相当お仕事に役立ちそう！

## 参考

[Big Sky SQLite3 で generate_series(連番)](https://mattn.kaoriya.net/software/lang/sql/20150428194911.htm)
[C#とPowerShellで色々なDBを操作してみる](https://qiita.com/mima_ita/items/e253aacafe1f87b5921f)
[SQLite.net SQLiteFunction not working in Linq to SQL](https://stackoverflow.com/questions/24229785/sqlite-net-sqlitefunction-not-working-in-linq-to-sql/26155359#26155359)
【重複行排除_MySQL,PostgreSQL,Oracleの違い】指定したカラム以外他のカラム情報も欲しい

###・SELECT DISTINCTでは重複判定に指定したカラム項目しか返されない
####サンプルテーブル
| ID | 名前 | 趣味 | 場所 |
|:-:|:-:|:-:|:-:|
| 101  | 田中  | 映画  | 映画館  |
| 102  | 田中  | 漫画  | 本屋  |
| 103  | 田中  | 水泳  | 体育館  |
| 104  | 田中  | 散歩  | 公園  |
| 105  | 佐藤  | 映画  | 映画館  |
| 106  | 佐藤  | 水泳  | 体育館  |
| 107  | 清水  | 漫画  | 本屋  |
| 108  | 清水  | 水泳  | 体育館  |
| 109  | 清水  | 散歩  | 公園  |

SELECT DISTINCT 名前 FROM サンプルテーブル

とすると、返されるのは名前カラムだけです。

| 名前 |
|:-:|
| 田中  |
| 佐藤  |
| 清水  |

###・重複判定に指定したカラム以外のカラムも取得するSQL
####サンプルテーブルから取得したい情報

| ID | 名前 | 趣味 | 場所 |
|:-:|:-:|:-:|:-:|
| 101  | 田中  | 映画  | 映画館  |
| 105  | 佐藤  | 映画  | 映画館  |
| 107  | 清水  | 漫画  | 本屋  |

MySQL、PostgreSQL、Oracle、それぞれやり方が違います。

####MySQL
```SQL
SELECT * FROM サンプルテーブル GROUP BY 名前
```

####PostgreSQL
```SQL
SELECT DISTINCT ON(名前)* FROM サンプルテーブル
```

####Oracle
```SQL
SELECT * FROM サンプルテーブル WHERE ROWID IN (select min(ROWID) from サンプルテーブル GROUP BY 名前)
```
[ROWIDについて](https://docs.oracle.com/cd/E16338_01/server.112/b56299/pseudocolumns008.htm)
Arduinoの電源ON/OFFのためのスイッチ付きUSBコネクター

この記事は、2020-05-23に書きました。
***
Arduinoには電源スイッチがないので、電源をON/OFFするためには、ケーブルを抜き差ししなければなりません。これが面倒くさいので、USBケーブルの途中にスイッチ付きコネクターをかまして使っています。

<img width="320" alt="USBケーブルの途中にスイッチ付きコネクターを接続している" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635194/9c8fc7bc-aa65-6b90-925a-11ff665a6141.jpeg">


使っているのは、コアウェーブ株式会社のUSBスイッチ付きコネクター：CW-165USB です。100均で買いました。

<img width="320" alt="コアウェーブ　USBスイッチ付きコネクター：CW-165USB" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635194/28fa6f3c-45d2-090c-1e75-00241372c07c.jpeg">

電源供給もデータ通信も、まったく問題ありません。スケッチの書き込みもシリアル通信も、問題なくできています。
Amazonでも別メーカーの同等品が400円弱で売っているようですが、写真を見るとどうも同じ商品のような気もします。
PYNQ-Z1 > IPアドレスを変更する > 固定IPアドレス設定 > /etc/network/interfaces.d/eth0

```
Windows 10 Pro (v1909) 
PYNQ-Z1 (Digilent)
```

### 関連

- [PYNQ-Z1 > Getting Started > 最初のJupyter Notebook接続でつまずく > imageファイルがおかしかった?](https://qiita.com/7of9/items/7d123252a4eeaa8ae708)

### IPアドレスの変更

PYNQ-Z1の初期IPアドレスは「192.168.2.99」である。
自分のネットワークは192.168.0.Xなので、変更をする。

### 公式情報

How do I set/change the static IP address on the board?
https://pynq.readthedocs.io/en/v1.3/14_faqs.html#how-do-i-set-change-the-static-ip-address-on-the-board

「/etc/dhcp/dhclient.conf 」を変更という記載がある。

### 設定変更

Jupyter Notebookに接続して、Terminalから操作をした。

`/etc/network/interfaces.d/eth0`を変更した。
下記の通り、addressを「192.168.0.99」に変更した。

```
auto eth0
iface eth0 inet dhcp

auto eth0:1
iface eth0:1 inet static
address 192.168.0.99
netmask 255.255.255.0
```

192.168.0.XからJupyter Notebookにて接続できることを確認した。
WindowsのExplorerで右クリックからMarkDownファイルを作成したい

Windows10のExplorerでプロジェクトのフォルダとか作って、そこに右クリックの「新規作成」から指定拡張子の空ファイルを作ることができますが、その選択肢の中に.md（MarkDown）がなかったので追加してみました。

1. レジストリエディターでHKEY_CLASSES_ROOTツリーを開く
2. 目的の拡張子を探す（今回は.md）
3. 右クリックして「新規」->「キー」で名前を「ShellNew」とする
4. 作成した「ShellNew」キーを選択し、右ペインで右クリックして「新規」->「文字列値」で値の名前を「NullFile」、データは空のままで良い

完成するとこんな感じ。
![md_shellmenu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128639/ab0c7ec6-bacb-47b0-1ae2-4450727ab30c.png)

これで再起動とか必要無く、即座に反映されました。

ついでにいらない拡張子を探して「ShellNew」キーを削除しまくってリストをスッキリさせました。


# 参考にした記事
https://www.atmarkit.co.jp/ait/articles/0304/04/news002.html
Ubuntu 20.04 したら OwnCloudが動かなくなった

__注意！：OwnCloud 10.5.0 よりUbuntu 20.04に対応したため、以下の記事は既に古新聞です。__ 

OwnCloudの最新バージョンはUbuntu 20.04のphp7.4に対応していないのに、うっかり18.04からアップグレード。仕方がないのでppa経由でphp7.2をインストールしました

```bash
$ sudo add-apt-repository -y ppa:ondrej/php
$ sudo apt update
$ sudo apt install php7.2 php7.2-curl php7.2-intl php7.2-mbstring php7.2-xml php7.2-xmlrpc php7.2-mysql php7.2-zip php7.2-gd
$ sudo update-alternatives --set php /usr/bin/php7.2
$ sudo a2dismod php7.4
$ sudo a2enmod php7.2
$ sudo apache2ctl -t
$ sudo apache2ctl -k restart
```

もし真っ白なページになったら、いったんconfig/config.php を何処かに退避させてもう一度見ると、足りないモジュールが何か教えてくれます。
Ruby: CSV::Tableの使い方備忘録


CSVライブラリ使いにくいですね〜。少なくとも私は使いにくいです。
備忘録として書き留めます。参考になれば幸いです。

# newする

CSV::Rowインスタンスを渡す。それ以外の方法あるのかよくわからない。なんか直感的じゃないと感じる


```ruby
row1 = CSV::Row.new(["header1", "header2"], ["row1_1", "row1_2"])
table = CSV::Table.new([row1])
pp table
```

```shell
#<CSV::Table mode:col_or_row row_count:2>
```


# headersを取得する

```ruby
row1 = CSV::Row.new(["header1", "header2"], ["row1_1", "row1_2"])
table = CSV::Table.new([row1])
pp table.headers
```

```shell
["header1", "header2"]
```



# row（行）を指定して取得する

[0]はheaderが取れるかもと思っていましたが、ヘッダーを除いた１行目（rowというのかな？）が取れました。
添字？を指定するとheaderではなくrowが取れるということのようです。

```ruby
row1 = CSV::Row.new(["header1", "header2"], ["row1_1", "row1_2"])
table = CSV::Table.new([row1])

pp table[0]
pp table[1]
pp table["header1"]
```

```shell
#<CSV::Row "header1":"row1_1" "header2":"row1_2">
nil
```


# headerを指定して取得する
これは直感的な挙動でした。

```ruby
row1 = CSV::Row.new(["header1", "header2"], ["row1_1", "row1_2"])
table = CSV::Table.new([row1])

pp table["header1"]
```

```shell
["row1_1"]
```


# CSVファイルの生成
* ここで紹介するのは読み込んでから保存する方法ではなく、ゼロからCSVファイルを生成する方法
* 結局CSV.openを使う事になる
* force_quotesを指定するとダブルクォートで囲ってくれる
* headersの書き込みは引数で行い、rowの書き込みは１行ずつcsv << xxxで行う

```ruby
    headers = ["header1", "header2"]

    row1 = CSV::Row.new(headers, ["row1_1", "row1_2"])
    row2 = CSV::Row.new(headers, ["row2_1", "row2_2"])
    table = CSV::Table.new([row1, row2])

    CSV.open("test.csv", "w", headers: headers, write_headers: true, force_quotes: true) do |csv|
      table.each { |row| csv << row }
    end
```

```shell
$ cat test.csv 
"header1","header2"
"row1_1","row1_2"
"row2_1","row2_2"
```

##### メソッド化しておく

```ruby
  def save_csv_table(csv_table)
    headers = csv_table.headers
    CSV.open("test.csv", "w", { headers: headers, write_headers: true, force_quotes: true }) do |csv|
      csv_table.each{ |row| csv << row }
    end
  end
```
[DISCORD BOT] Server Managerコマンドヘルプ

__**10/26 大幅リニューアルに伴い、書き直しました。**__
# 招待リンク
[Server Manager](https://discord.com/oauth2/authorize?client_id=699967735538384987&permissions=8&scope=bot)
[Server Manager (β)](https://discord.com/oauth2/authorize?client_id=719036196331716721&permissions=8&scope=bot)
β版を導入することにより、作成中の機能を試すことができます。

また、不具合は、cronちゃん#1850まで。

# PICKUP
推しの機能を紹介します。
## モデレータ機能
BOTの設定を変更するコマンドを使用できるユーザーを制限することができます。
標準で、サーバーの作成者は全てのコマンドを操作することができます。

`set/mod` 現在のモデレータを表示
`set/mod add @ロールのメンション` モデレータを追加
`set/mod remove @ロールのメンション` モデレータを削除
## VC機能
画面配信をする人が多く、チャンネルが何個あっても足りないということはありませんか？
また、VCにいないのに聞き専用チャンネルや音楽BOTコマンド用チャンネルの通知がきてうざいということはありませんか？
そのような問題を解決することができます。
以下のように無限に増殖するチャンネルを作成することができます。![voicemanager.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642690/5e7a683b-9976-0cae-42be-a024d0baff92.gif)



#機能

## Request
スレッド機能です。
これは、サーバに対するリクエストをユーザから受け付けるために設計されました。
`req/create Title`コマンドを実行することにより、一時的なチャンネルを作成することができます。
これにより、複数のスレッドを無限に同時に立ち上げることができます。
# debug
## debug/profile
メンションまたはユーザID指定されたユーザのプロフィールを表示します。
引数が指定されていない場合は、実行者のプロフィールを表示します。
## debug/info
ギルドID指定されたギルド(サーバー)のプロフィールを表示します。
引数が指定されていない場合は、実行されたサーバの詳細を表示します。
※ギルドID指定は、Server Managerが入っているギルドのみしか表示できまsねん
# vc
ボイスチャット管理機能です。
`vc/create`コマンドにより、以下のようなボイスチャンネルを生成することができます。
このボイスチャンネルに参加すると、ボイスチャンネルとテキストチャンネルが作成され、そちらに移動されます。
メンバーがいなくなると削除される仕組みです。
## vc/create
ボイスチャンネルを作成します。
引数に名前を指定することで、`➕ 新規作成[名前]`のような形で作成できます。
作成するカテゴリーは、`set/vc_categories`で指定します。
これは、クリエイターのみが使用できるコマンドです。
# role
リアクションを付与することで、ロールを付与できるメッセージを生成します。
## role/create
リアクションをつけるとロールを付与されるメッセージを生成します。
引数は取りません。
これは、クリエイターのみが使用できるコマンドです。
# req
リクエストスレッドを管理するコマンドです。
`req/create [Name]`で作成し、`req/close`でスレッドを終了します。
## req/create
リクエストスレッドを作成します。
引数に名前を指定することで、`request【test】`という形のチャンネルを、user用とadmin用2つ生成します。
User用でユーザからリクエストを受け、admin用で審議することを想定しています。
作成するカテゴリーは、user用とadmin用それぞれ、`set/req_categories`と`set/req_ad_categories`で指定します。
チャンネルの権限は、カテゴリの設定を引継ぎます。
## req/close
リクエストスレッドを終了します。
引数は取りません。
これは、クリエイターのみが使用できるコマンドです。
※実行されたチャンネルを削除してしまうため、誤爆に気をつけてください。
# set
## set/creater_role
クリエイターロールを設定します。
引数は取りません。
すでにクリエイターロールが設定されている場合、クリエイターのみが実行できます。
## set/vc_categories
ボイスチャンネルを作成するカテゴリを指定します。
引数に、カテゴリ名を指定します。
これは、クリエイターのみが使用できるコマンドです。
## set/req_categories
リクエストのuser用を作成するカテゴリを指定します。
引数に、カテゴリ名を指定します。
これは、クリエイターのみが使用できるコマンドです。
# set/req_ad_categories
リクエストのadmin用を作成するカテゴリを指定します。
引数にカテゴリ名を指定します。
これは、クリエイターのみが使用できるコマンドです。
[Python] DFS（深さ優先探索）　ATC001A

#[ATC001A](https://atcoder.jp/contests/atc001/tasks/dfs_a)

迷路はグラフ探索と捉えるのが有効

```python:サンプルコード
# pythonだとデフォルトの再帰処理回数の上限に引っかかってしまうので、それを変更
import sys
sys.setrecursionlimit(1000000)

# 再帰関数DFSの定義
def dfs(x, y):
    #マーク
    d[x][y] = 1

    # 移動4方向をループ
    for i in range(4):
        X = x + dx[i]
        X = y + dy[i]

        # X と Y が街の範囲内か、行ったことがないか、塀ではないかを判定
        if 0 <= X and X < n and 0 <= Y and Y < m and d[X][Y] == 0 and c[X][Y] != "#":
                dfs(X, Y)

# 入力
n, m = map(int, input().split())
c = [list(input()) for i in range(n)]

# 到達したかどうか（0は未到達、1は到達済み）
d = [[0] * m for i in range(n)]

# 移動する4方向
dx = [1, 0, -1, 0]
dy = [0, 1, 0, -1]

# スタート地点から dfs を始める
for i in range(n):
    for j in range(m):
        if c[i][j] == "s":
            dfs(i, j)

# ゴール地点に到達したかどうか
for i in range(n):
    for j in range(m):
        if c[i][j] == "g" and d[i][j]:
            print("Yes")
            exit()
print("No")
```
Laravelのアクセサ

##はじめに
例えばviewで人の氏名を実装する時`苗字＋名前`といちいち実装するのは手間がかかりますよね。
今回のお題であるアクセサというLaravelの機能を用いれば、Modelに`苗字＋名前`と定義しておくだけで、viewで呼び出す時は`氏名`で一気にフルネームを呼び出すことができます。

##アクセサを使って実装する

###そもそもアクセサとは
>アクセサを定義するには、アクセスしたいカラム名が「studlyケース（Upper Camel Case）」でFooの場合、getFooAttributeメソッドをモデルに作成します。以下の例では、first_name属性のアクセサを定義しています。first_name属性の値にアクセスが起きると、Eloquentは自動的にこのアクセサを呼び出します。
[Eloquent：ミューテタ 7.x Laravel](https://readouble.com/laravel/7.x/ja/eloquent-mutators.html)

Laravelの公式ドキュメントには上記のように定義されています。
簡単にまとめるとModelに`get〜Attribute`（今回の場合はgetFullNameAttribute）というメソッドを定義すると、それをuseしたControllerやviewで`full_name`（今回の場合は$this->full_name）属性の値で呼び出せます。

```php:Model
namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * ユーザーのフルネームを取得
     *
     * @return string
     */
    public function getFullNameAttribute()
    {
        return this->last_name . this->first_name;
    }
}
```

```PHP:view
<?php

    {{ $this->full_name }}
```

##おわりに
いかがでしたでしょうか。
今回のようにModelに定義しておくことでフルネームを表示するに「山田花子」「山田 花子」「山田　花子」みたいに人によってスペース開けたり開けなかったり、半角スペースだったりすると思うので、まとめて定義しておくと保守性が上がるでしょう。
502 Bad Gatewayの解消法

デプロイした後で、アプリケーションサーバを立ち上げ直したら、502 Bad Gatewayが出るようになった。
502 Bad Gatewayについては、原因や解決法が様々あるみたいですが、解決できた方法を一応紹介しておきます。

前提知識として、capistranoで継続運用していると、デプロイしたファイルがcurrentフォルダに、保存されていくんですね。ここが抜けていたので、かなりハマりました。

currentディレクトリに移動し、pumaを立ち上げ直すと、無事解決できました。
node 14.3.0 top level await

https://github.com/nodejs/node/blob/master/doc/changelogs/CHANGELOG_V14.md#support-for-top-level-await

> 非同期関数の外でawaitキーワードを使用できるようになりました。

denoが出たと思ったら、nodeもtop level awaitをサポートしたのか
https://deno.land/
PYNQ-Z1 > Getting Started > Jupyter Notebook接続でつまずく > imageファイルがおかしかった?

```txt:動作環境
Windows 10 Pro (v1909) 
PYNQ-Z1 (Digilent)
```

### 概要

- 公式サイトに紹介されているimageファイル
    - Jupyter Notebookに接続できない
- 公式サイトに紹介されている別のimageファイル
    - Jupyter Notebookに接続できた

### ボード

- [ＰＹＮＱ－Ｚ１　Ｚｙｎｑ－７０２０評価ボード](http://akizukidenshi.com/catalog/g/gM-13812/)

### 試したimage > 失敗

https://pynq.readthedocs.io/en/v2.0/getting_started.html#pynq-z1-setup-guide

1. MicroSD Card Setupにある「1. Download the PYNQ-Z1 image」から「pynq_v2.0.img」を取得
2. PYNQ-Z1に書き込み
3. Chromeやfirefoxから192.168.2.99:9090へ接続できない
    - 500: Internal Server Error

### 別のPYNQ image > 成功

https://pynq.readthedocs.io/en/v2.2.1/getting_started/pynq_image.html

Pynq-Z1 board (Digilent) 用の「Pynq-Z1 v2.1 image」から「pynq_z1_v2.i.img」を取得した。

こちらのイメージファイルだとJupyter Notebookに接続できた。


### 関連

ポート9090が利用可能かは下記を使って確認した。

- [2015-06-20 win > ポートが開いているか確認する > PortQry2](https://qiita.com/7of9/items/1d2e123d592d22fd6c55)
Ethereumのlockdropを自力で実装する、substrateのink!で試す前に

# Substrateでlockdropを実装してみようと思ったが・・・
- 自信がないので、まずはEthereumで試してからにしようと思った
- solidityで実装出来てから、substrateのink!でやろうと思った

# 実現すること
- lockしてくれたEtherと同量のTokenをunlock時に発行する。
- こんなデザインです。
<img width="560" alt="design.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628255/f2375f2f-26eb-569f-0532-06baf688a573.jpeg">

# 実装してみた
- 自力で実装しました。
- 他のlockdropのソースは一切見ていないです。だからこそ、ダメな部分がありそうです。

```
pragma solidity ^0.4.23;

import "https://raw.githubusercontent.com/OpenZeppelin/openzeppelin-solidity/v1.6.0/contracts/token/ERC20/StandardToken.sol";
import "https://raw.githubusercontent.com/OpenZeppelin/openzeppelin-solidity/v1.6.0/contracts/ownership/Ownable.sol";

contract SEI is StandardToken,Ownable{
    string public name = "My Token v0.2";
    string public symbol = "My0.2";
    uint public decimals = 18;
    
    struct Pesonal_data{
        uint256 amount;
        uint term;
        uint256 locktime;
        uint256 tokenAmount;
    }
    
    uint256 public remaining_token = 0;
    
    mapping(address=>Pesonal_data) public memolized_data;
    
    constructor(uint _initial_supply) public {
        totalSupply_ = _initial_supply;
        remaining_token = _initial_supply;
    }
    
    function lockDrop(uint _term) public payable checkAmount {
        //Pesonal_data data = Pesonal_data(msg.value,_term,blocktime.add(_term days));
        Pesonal_data memory data = Pesonal_data(msg.value,_term,block.timestamp.add(5 minutes),msg.value);
        memolized_data[msg.sender] = data;
        
    }
    
    function unlockDrop() public checkTime {
        msg.sender.transfer(memolized_data[msg.sender].amount);
        balances[msg.sender] = memolized_data[msg.sender].tokenAmount;
        remaining_token = remaining_token - memolized_data[msg.sender].tokenAmount;
    }
    
    modifier checkTime(){
        require(memolized_data[msg.sender].locktime < block.timestamp);
        _;
    }
    
    modifier checkAmount(){
        require(msg.value > 0);
        _;
    }
}
```

# 動作確認
- Rimixでこのソースをコンパイルして、Metamaskを使って、Ethereumのテストネットにデプロイします。
- Tokenの初期発行量を決めて、コンストラクトを実行します。
- 次に、lockdrop関数を動かします。※送信するEhterを忘れずに設定して下さい。
- Contractが実行されてから、MetamaskのEtherの残高を見ると確かに減っています。
- ※このソースはテスト用として５分のlockとしています。
- ５分以内にunlockDropを実行しても動きません。
- ５分後に実行すると、トークンを獲得出来て、lockしたEhterが戻ってきたことを確認出来ました。

# 次はSubstrateで
- やってみます！
いろんなキーボードを試してきたけど、結局MacBookPro搭載のキーボードが一番打ちやすいと思ってた。

ノートパソコンは、モニターとキーボードとトラックパッドの位置が固定されてるから使いやすい。
また、薄いキーボードは慣れると最小の運動で文字入力出来るようになるから楽なんだよなぁ。
【Swift】Protocolとはなにか、どんな時に便利か

# Protocolとは
Protocolとはある機能を実現するclassやstructが必ず実装するべきメソッドやプロパティの名前や型を定義するものです。
他の言語いう抽象クラスやInterfaceにあたります。

```swift
protocol CanFly {
	func fly() // 実際の処理は書かない
}
```
protocolを定義するときは、必要なメソッドやプロパティの名前や型を定義するのみで実際の処理は書きません。

# どんなときに便利か
特定のclassやstructが持っているべき要件(このメソッドやプロパティを持っているべき)を適用したい場合に便利です。
例えばBirdクラスを作ります。鳥の特徴は空を飛べて、メスは卵を産みますね。


```swift
class Bird {
	var isFemale = true
	func layEgg() {
		if isFemale {
			print("トリは卵を産みました")
		}
	}
	func fly() {
		print("トリは翼で羽ばたいて空を飛びました")
	}
}
```

次にEagleクラスとPenguinクラスを作りましょう。どちらも鳥の一種なのでBirdクラスを継承して定義してみます。
Eagleの特徴は上昇気流に利用して高く上がって滑空して移動すること、Penguinの特徴は泳ぐことですね。
ここでインスタンスを作って使えるメソッドを確認してみます。

```swift
class Eagle: Bird {
	func soar() {
		print("タカは上昇気流に乗って高く上がりました")
	}
}

class Penguin: Bird {
	func swim() {
		print("ペンギンは翼で羽ばたいて泳ぎました")
	}
}

let myEagle = Eagle()
myEagle.layEgg() // "トリは卵を産みました"
myEagle.fly() // "トリは翼で羽ばたいて空を飛びました"
myEagle.soar() // "タカは上昇気流に乗って高く上がりました"

let myPenguin = Penguin()
myEagle.layEgg() // "トリは卵を産みました"
myEagle.fly() // "トリは翼で羽ばたいて空を飛びました"
myEagle.swim() // "ペンギンは翼で羽ばたいて泳ぎました"
```

一見良さそうですが、ペンギンは空を飛ぶことはできませんのでこの実装だとおかしなことになってしまいます。

更に同じく空を飛ぶAirplaneクラスを作る場合はどうなるでしょう。Birdクラスがflyメソッドを持っていますが、翼で羽ばたくわけではないのでオーバーライドして少し内容を変えましょう。

```swift
class Airplane: Bird {
	override func fly() {
		print("飛行機はエンジンを使って空を飛びました")
	}
}

let myAirplane = Aiplane()
myAirplane.layEgg() // "トリは卵を産みました"
myAirplane.fly() // "飛行機はエンジンを使って空を飛びました"
```

これもよく見るとBirdクラスが持っているlayEggメソッドも継承しているので飛行機が卵を産むことになっていますね。おかしいです。
それなら継承せずに必要なクラスにだけflyメソッドを定義すればよいのですが、プログラムの規模が大きくなってくると、複雑になりそうですし実装漏れも起きそうです。

# Protocolを使って実装する
そんなときにProtocolを使うと実装が必要なメソッドやプロパティを定義しておけるので便利です。
例えば今までの例でいうとEagleとAirplaneはflyメソッドを持っている必要がありますが、Penguinは必要ないですね。
従ってEagleとAirplaneのみにCanFlyを適用します。

```swift
protocol CanFly {
	func fly() // 必要なメソッドの名前を書くだけ、実装はclassやstructの定義時に書く
}

class Bird {
    var isFemale = true
    func layEgg() {
        if isFemale {
            print("トリは卵を産みました")
        }
    }
}
    
class Eagle: Bird, CanFly { // CanFlyを適用する
    func fly() { // flyメソッドを実装しないとエラーになる
        print("タカは翼で羽ばたいて空を飛びました")
    }
    func soar() {
        print("タカは上昇気流に乗って高く上がりました")
    }
}

class Penguin: Bird { // Penguinは飛べないのでCanFlyは適用しない
    func swim() {
        print("ペンギンは翼で羽ばたいて泳ぎました")
    }
}

struct Airplane: CanFly { // CanFlyを適用する
    func fly() {  // flyメソッドを実装しないとエラーになる
        print("飛行機はエンジンを使って空を飛びました")
    }
}
```

こうするとペンギンが空を飛んだり、飛行機が卵を産んだりしなくて済みます。
因みに継承はclassではできてstructではできませんが、protocolの適用はclass/structどちらでもできるのが特徴です。

# 参考
https://docs.swift.org/swift-book/LanguageGuide/Protocols.html
https://www.udemy.com/course/ios-13-app-development-bootcamp/
開発環境をきちんと整えると、コードもきれいになる説

つまり、最高にキレイなコードを書くために必要なお金は、

1. MacBookPro
2. HHKB
3. 4Kモニター
4. Magic Trackpad 2
5. JetBrains

大体、40万ぐらいかかる。
Vuetifyのv-btnのボタンの文字を白文字にしたいならdarkはおすすめしない

# Vuetifyのv-btnの文字の白文字化にdarkを使わないで

Vuetifyを使い始めた当初はボタンの白文字化をするために安易に`dark`を付与していました。
しかし、下記の文章から`dark`では本来目的としている挙動を得られない事が分かりました。
※使っていくうちに不都合が見つかる

https://vuetifyjs.com/ja/components/buttons/
![スクリーンショット 2020-05-23 12.58.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206542/22849287-1771-5e59-6a72-c4479e334ae7.png)

>v-btn は dark prop を使用したときに振る舞いが変化する唯一のコンポーネントです。通常のコンポーネントは dark prop を使用して暗い色の背景であることを明示し、テキストを白に変更する必要があります。しかし、v-btn では自動的にスタイルが変化するので、ボタンが白い背景と組み合わせて無効化されているときなど、色のついた背景の上に置かれているときのみこの prop を使用することをおすすめします。白いテキストが必要な場合は、ただ white-text クラスを追加するだけでテキストを白くできます。

## 白文字化は`white--text`で実現

Vuetifyのカラークラスを与えてあげることで文字を白くします。

```vue
<template>
  <div>
    <v-btn class="white--text">
     白文字のボタン
    </v-btn>
  </div>
</template>

```

## 注意！！

公式では`white-text`と記載されていますが`white--text`が正解です。
ハイフンを一つ追加してください。

詳しく知りたい方は下記を参照
[Vuetify Colors](https://vuetifyjs.com/ja/styles/colors/)
便利なGoogle Chrome の　拡張機能

#拡張機能を使おう

##拡張機能の使い方

### 1,拡張機能の追加の仕方
①chrome右上の縦に「…」が並んでいるマークをクリック⇒その他ツール⇒拡張機能
![①.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550671/0bc16e12-f8ae-92e3-6f7d-a64154520c49.png)

②左上のメニューバーをクリック
![②.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550671/e1f75210-a6a1-7358-505d-dd599cf76092.png)


③左下のChromeウェブストアを開きますをクリック
![⑧.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550671/e78483f8-8ac9-1cb4-5045-98eb1c65fd6b.png)

④追加したい機能を検索
![④.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550671/7e89d9b6-926e-1c7a-b0af-9be3a78dcec3.png)

⑤追加したい機能の右側のChromeに追加ボタンをクリック⇒確認ダイアログの拡張機能を追加をクリック
![⑤.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550671/677f48b6-2d90-769b-027a-57d7efa31a85.png)


これだけで追加は完了です！


<br>
###2, オンオフの切り替え

オンオフを切り替えたい機能右下のスライドを切り替えるだけ
![②.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550671/ec511a91-5c99-b6d1-ddd9-143155d8961b.png)
<br>
###3,ショートカットの登録
メニューバーからキーボードショートカットをクリックすると各機能のショートカットを登録できます
![③.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550671/a9e1fddd-0c0b-a70a-d280-518a6eb9ca56.png)


<br><br><br>
##実際に使ってみよう

先ほど追加したFullPageScreenCaptureという機能を実際に使用してみたいと思います
![⑨.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550671/b95e7156-efb2-d128-42ee-37497bdf8eb6.png)

この機能はスクロール分も含めてページ全体のスクリーンキャプチャーが取れる機能です

使い方はメニューバー右側のカメラマークをクリックか先ほどショートカットで登録したコマンド
![⑥.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550671/0ae07f70-a761-8907-db8a-228d63c16722.png)

正常に終了するとこのような形でページ全体のスクリーンキャプチャーが撮れます
テストでのエビデンス習得の際にスクロール毎にキャプチャーを撮る必要がなくなるので重宝しています
![⑦.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550671/f1c98ab3-cc62-14ca-4dfe-b84c564bb009.png)

<br><br><br>
##その他便利な機能
<br>
###SearchPreview
![⑩.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550671/a44f632f-df63-8368-6a23-b474166ef746.png)
検索結果にページのプレビュー画像を表示させることができるようになる機能
先ほどのフルページスルリーンにさらにこちらの機能を追加したものがこちら
![screencapture-google-search-2020-05-23-13_28_44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550671/a3fced69-fe50-aaa9-f742-5dbb9d40baa8.png)
<br>
###Grammarly for Chrome
![⑪.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550671/a752420d-31cd-5988-beee-d8d64d2e7eeb.png)
Chrome上で入力した英単語や英文のスペルチェック、文法チェックをリアルタイムでしてくれる機能

<br>
###Black Menu for Google
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550671/80ce90a7-ba5f-54b2-8b18-5564ec9b0d48.png)
GmailやGoogle翻訳等の機能をポップアップメニューから1クリックで使用できるようにする機能


<br><br><br>

##ほかにもたくさんの機能があります
色々な機能を試して自分の好みのものを選んで
仕事の効率化やめんどくさい作業の簡略化を！！
ローカル環境のみでリモートリポジトリを作成し履歴管理やブランチを切り替える

一緒に仕事している会社さんが
自分のサーバーにSSH接続させてcloneで納品
仕様違いはbranch切るので勝手に持っていて()のStyle・・・

使い慣れると以外に便利なので自社内でも出来ないかなと調べたら
あっけなくできたんですが、やり方絶対忘れるので自分メモ

操作はwindowsで、とりあえずの動作説明なので
ローカルのPCのCドライブDドライブで操作を行います。

git初心者向けの項目もあるのでgitがわかる方は
適時読み飛ばしてください


#１．リモートリポジトリ作成

まず　「d:\test」というフォルダにリモートリポジトリ「try.git」を作成します

(cloneするときに「***.git」ってファイルなのかな？と思ってたけどフォルダという事が今回判明
ちなみにリモートリポジトリのフォルダに「.git」つけるのは作法らしい・・・）

```
$ d:
$ cd test
$ mkdir try.git
$ cd try.git
$ git --bare init --shared
```

こんなコメントが（多分出ると思うので）出たら成功

```
Initialized empty shared Git repository in D:/test/try.git/
```

上4行はまあいいとして
問題は5行目！
git initに何やらオプションが・・・
一応解説

**–bare**：作業ファイルをもたないpushされるための専用のリポジトリを作成
**–share**：このリポジトリを共有可能にする。これがないとpushしてもファイルを作成できないらしい・・・

dirとかlsとかで「try.git」フォルダ内にファイルが出来ていれば成功です。
意外にちょろいです。

#２－１．ローカルにクローンを作成する場合

c:\に「tmp」というフォルダを作ってそこに先ほどのリモートリポジトリをクローンします

```
$ c:
$ cd tmp
$ git clone d:\test\try.git
```

成功するとこんなコメントが
warningとかドキッとするのでやめてください（）

```
Cloning into 'try'...
warning: You appear to have cloned an empty repository.
done.
```

リモート先の確認

```
$ cd \try
$ git remote -v
```

問題ないことを確認

```
origin  d:\test\try.git (fetch)
origin  d:\test\try.git (push)
```

空のコミットをしたほうが良いらしいので実行をします
★参考 @NorsteinBekklerさん
：[Gitの最初のコミットは空コミットにしよう](https://qiita.com/NorsteinBekkler/items/b2418cd5e14a52189d19)

```
$ git commit --allow-empty -m "first commit"
```

あとは適当にファイルを作って、普通に操作します

ここから先はNOOB用の参考です。
gitが操作できる方は読み飛ばしてください

とりあえず「test.txt」というファイルを新規に作って中身は「master」とでもしておいてください。

作成したら

```
$ git add .
$ git commit -m "適当なコメント"
```

下記みたいなコメントが出たら成功
今回はコメントは「initial addition」

```
[master (root-commit) 3fbb23f] initial addition
 1 file changed, 1 insertion(+)
 create mode 100644 text.txt
```

先ほどのリモートリポジトリにpushします。


```
$ git push origin master
```
下記みたいなコメントが出たら成功

```
Counting objects: 3, done.
Writing objects: 100% (3/3), 218 bytes | 218.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
To d:\test\try.git
 * [new branch]      master -> master
```


#２－２．既存のフォルダをリモートリポジトリに追加する場合

「d:\test」というフォルダにリモートリポジトリ「try2.git」があり
既存のファイルがあるディレクトリ（c:\tmp\try2）を「try2.git」にリンクさせます。

やっている事は
初期化->空のコミット->にリモートリポジトリのリンクを追加です。

```
$ cd c:
$ cd \tmp\try2
$ git init
$ git commit --allow-empty -m "first commit"
$ git remote add origin d:\test\try2.git
```
リンクできているか確認します。

```
$ git remote -v
```

リンク先が表示されますので問題ないことを確認

```
origin  d:\test\try2.git (fetch)
origin  d:\test\try2.git (push)
```

リモートリポジトリの場所が登録されただけなので
中身を潜影蛇手（）します。
さっきと同じなので説明はなしで

```
$ git add .
$ git commit -m　"initial addition"
$ git push origin master
```

ここまで書きましたが、２－１の操作ってあまりやらなさそうなので
２－２の操作だけ書けばよかった気が・・・

次回は他のPCにリモートリポジトリを配置してそこから操作する方法を書く予定です。
【入門】QiitaはMarkdown記法がdefault

# Qiitaの記事はMarkdownで書かれている
* 自分の様なMarkdown初心者向け情報
* 記事を書こうとしたらいきなりVSCode同様の二画面編集で、左側がMarkdown記述、右側に表示となる
* とても便利。早くブログもこの様なスタイルを取って欲しいと思う
![スクリーンショット 2020-05-23 13.03.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642632/363f3c4a-5c7d-9c49-25a8-80a244e31646.png)

* いわゆるGFM対応
* 日頃お世話になっているQiitaの先見性に感服
Javascript における「==」と「===」の違い

##Javascript における「==」と「===」の違い



どちらも「左辺と右辺が等しいか?」を比較するのですが、決定的な違いは**データ型を比較するかしないかの違いです。

##「==」
**値のみでデータ型は比較しない。**

(厳密には異なり、詳細は後述にて補足致します。)
##「===」
**型と値を比較します。**






```javascript:sample.js

   var num = 123;
   var str = '123';
 
   document.write(num == str);  // true
   document.write(num === str); // false
```

「数値型の123」と「文字列型の123」を比較した場合、データ型まで比較を行う「===」はfalse、行わない「==」はtrueとなります。
比較において「==」と「===」のどちらかを使うべきですが、基本的には「===」を使います。
その理由として
型の比較を行わない「==」はバグの原因になりやすいなど理由は多々あるようです。
ですから変数の型を意識する意味を含めて、「===」を使ってプログラムを書いく方が良さそうです。




##「==」についての補足です。


前述で「==」は型の比較をしないと言いましたが、厳密に言うと
「型を特定の決まった方に合わせるように変換し、そのあと比較する。」
というニュアンスが正しいです。

例えば文字列型と数値型を「==」で比較した場合は、数値型を文字列型に自動で変換した後に、比較を行います。これはjavascriptで定義されている一定の法則で行われています。




**型の自動変換表**

|　　演算 |　　変換  |
|---|---|
|文字列と数値  |文字列に変換  |
|数値と論理 |数値に変換 |
|文字列と論理|文字列に変換|
Passing Variable to Partial - undefined local variable or method error ２つの解決法


# 1: render partial 'my_partial' と書いているか、render 'my_partial' と書いているか確認する

呼び出し方に違いがあります

```
<%= render 'my_partial', :locals => {:class_Name => "Science", :y => 36} %>
<% render partial: 'my_partial', :locals => {:class_Name => 'Science', :y => 36 } %>
```

# 2: 定義されているか確認する

```
# Rails4以降
<% if defined?(local_var) do %>
# Rails3
<% if local_assigns[:local_var].present? do %>
```

自分の場合、partialに書いた変数を使わない場合があり、 `if defined?(local_var)`を書いたら解決した。defined?で確認して、local_varをそのまま使わないようにした。

# 参考
自分はqiitaの記事のおかげで解決しました
https://qiita.com/shinichinomura/items/1921027fc28279ce54e0
https://stackoverflow.com/questions/16229470/passing-variable-to-partial-undefined-local-variable-or-method-error/21651848#21651848
【AWS】Lambda+Amazon SESでメールを送信する

[前回の記事](https://qiita.com/duplicate1984/items/8a3ce5c434a44b2b04fd)でAmazon SNSを利用してSMSを送信するlambdaを書きました。
今回はメールを送信するためにAmazon SESを利用していきます。

#やりたいこと
lambdaからのキックでメールを送信したいと思います。
ただし、宛先のメールアドレスはlambda内で指定したいと思います。

Amazon SMSでもメールの送信は可能ですが、予め作成したサブスクリプションで認証済みのメールアドレス宛にしか送信できません。
そこで今回はAmazon SESを使用します。

#Amazon SESって？
システムエンジニアリングサービス…ではなく
Amazon Simple Email Serviceです。

従量課金制のEメール送信サービスです。
2020年5月現在、東京リージョンではサポートされていません。
エンドユーザーへのマーケティングや、ヘルスチェック系の通知などに利用できます。

#コードとかより注意しておきたいこと
###サンドボックスの解除
Amazon SESで送信元アドレス（ドメイン）を新たに登録すると、最初はサンドボックス環境で動作します。
サンドボックス環境においては送信数の制限があるうえ、
検証済みのメールアドレス宛にしか送信できません（SNSのような状態）。

そのため本番で運用するには制限解除を申請する必要があります。
制限解除は送信数の上限引き上げ、という名目ですが、これによりサンドボックス環境の解除がされるので、
検証済み以外のアドレスにも送りたい、という場合でも制限解除を申請します。

また、制限解除をする場合には、予めバウンス（送信失敗）や苦情（受信者にスパム登録される）への対策を行っておく必要があります。
バウンス率や苦情率が高いとメール送信ができなくなってしまうので、注意しましょう。

登録した送信元アドレス（ドメイン）ごとに、バウンス・苦情の発生時に通知する設定をSES内でできるので、
忘れずにやっておきましょう。

#構成
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/503026/8f930fef-dd0f-31c2-6e41-4d4986cc58f6.png)


#Amazon SESに新規アドレス（ドメイン）を登録
Amazon SESコンソールを開きます。
今回はバージニア北部リージョンで利用します。

左のメニューからDomainsまたはEmail Addressesを選択し、
新規の送信元アドレス（ドメイン）を登録します。

今回はメールアドレスの登録をやっていきます。
「Verify a new Email Address」を選択します。↓こんな画面です。
![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/503026/ce63f82a-5cde-4c5f-2eb4-73d960f7efbb.png)

「Verify This Email Address」を選択すると、入力したメールアドレス宛に検証メールが届きますので、検証します。

以上です。
「Send a Test Email」からテストメールの送信ができるので一応確認しておきましょう。

また、サンドボックス環境の解除については、lambdaからのテストなどが一通り完了してから行いましょう。
最悪テストでバウンス率が高まってメール停止されるかもしれないので。



#lambda関数
単にSESを呼び出して、指定したアドレスにメールを送信するだけのlambdaです。
ランタイムはNode.js 12.xです。

```test_SendEmail.js
var aws = require('aws-sdk');
// バージニア北部リージョンを選択
var ses = new aws.SES({region: 'us-east-1'});


exports.handler = (event, context, callback) => {
   
    // メール送信設定
    var params = {
        Destination: {
            ToAddresses: ['送信先メールアドレス']
        },
        Message: {
            Body: { Text: { Data: 'メッセージ' } },
            Subject: { Data: '件名' }
        },
        Source: '検証済みの送信元アドレス'
    };

    // メール送信
    ses.sendEmail(params, function (err, data) {
        if (err) {
            console.log(err);
            context.fail(err);
        }
        console.log(data);
        context.succeed(data));
    });
};
```

以上！
デジタルマーケティング

# ◆ デジタルマーケティング学習
個人用学習記録&備忘録として記述します。
ですが、ご参考になればどうぞ・・・

##・ なぜ、人は買いたいのか？

**例：10万円のSTARWARSサイン入り限定ライトセーバー**

40名程度、ほぼ要らないと回答

・半額だったら？？・・・・・10%承認
・1万円だったら？？・・・・・20%承認
・無料だったら？？・・・・・80%承認
・1万円あげるから？？・・・・・100%承認

**●映画**
・子供におもちゃを売って儲けたい

**●対策**
・見せて認知度を高める→好きになってもらう
→映画の中で、そのおもちゃを登場させるように仕込む

**●メカニズム**
・動機・情報付与・ニーズ・要因

**●欲求（動機）パターン**
①独自性
②自己尊厳
③達成
④権力
⑤親和

##・ 例：バナー広告
クリック率が高いのはどちらでしょうか？？

①　割引表記：55%割引
②　金額表示：980円/月


クリック率が高いのはいつでも55%割引表記。


**理由：金額（答え）がわからないから調べるためにクリック数が増える。**

ただし、増えているのはクリック数で成約率に言及なし。


**●前提条件**
・認知率の高い商品群であり、商品金額のイメージできる場合のみ
・製品の認知の高さ

**●備考**
・成約率を追うか、クリック率を追うか。何を求めるかによってバナーデザインは変わる。

##・ 例：クレジットカード
クレジットカード契約の場合の知覚リスク
（消費者心理）

**・経済的要因**
→金利がもったいない

**・社会的要因**
→かっこ悪い

**・身体的理由**
→怖い人が来そう

**・時間的理由**
→時間がかかりそう

**・機能的理由**
→借方、返し方がわからない

**・心理的要因**
→癖になりそう


上記内容に対する対策を情報提供する。

##・ 例：ブランド品買取
高く買い取ってくれそうなサイトはどれ？？
（消費者心理）

**・経済的要因**
・ある程度の妥協は必ずある

**・消費者心理的**
・査定は出してみないとどのお店も比較できない
・複数査定は面倒
・失敗したくない


##・ マーケティングの必要スキル
**【人間の理解】**
**・潜在的意識レベルの理解**
→認知心理学、脳科学、行動経済学

**・顕在化した行動への理解**
→アクセス解析、リサーチ、消費者行動分析

**【技術の理解】**
**・方法**
→マーケティング戦略、マーケティング計画

**・手段**
→リスティング、DSP、DM

##・ point
**・消費する脳はモノやサービスを欲しているわけではなくモノやサービスを得た先にある物を欲している。**
→自分の未来基準で物事を見る

**・動機を刺激する**
→欲しい理由となる情報提供

**・知覚リスク排除**
→成約に至らない理由を情報提供

**・「失敗しなさそう」を表現**
→損失回避性

**・安さや割引は決定要因ではない**
→後押し。「利益」より「損失」の方が強い

##・ 用語集
・バズる・・・ざわめく
・知覚リスク・・・機能、経済、時間、社会、心理、身体、これらの要因
・損失回避性・・・利益を得る満足より、同額の損失を避ける人間心理
JOI 2006 本選 D 最悪の記者

##問題
https://atcoder.jp/contests/joi2007ho/tasks/joi2007ho_d
##見た感じ
勝敗が決まっているということで、各チームをノードとする、有向グラフを考えればよさそうで、順位が上のチームはそれより順位が低いチームに全勝であることから、勝ち負けを矢印で表したときに、閉路がないことに対応するっぽい。
ここでトポロジカルソートができ、その結果が与えられた情報に矛盾のない順位を与えそうなので、その方針で行くことにした。
もし負けから勝ちに矢印を引くとまだ何の情報もない孤立ノードが、順位の下のほうに行ってしまうので（入次数=0の点から順位を割り振るから）これだと、今の情報で、孤立ノード以外に負けが一つ以上ついていた時に1位が決まらない。
だから、勝ちから負けに矢印をひいて、それについての入次数を数えておいて、トポロジカルソートした。
この時入次数が0のノードを入れたスタックを考えて、このスタックの要素数が2以上やったら、順位に自由度があるので、最後の出力を0にした。
##解法
上のようにトポロジカルソートを使って順位表を作って出力した
##ソースコード
```c++
const int N_MAX=5001,M_MAX=100001;
int n,m,incou[N_MAX];
vector<int> v[N_MAX];
stack<int> st;
bool tof=false;

vector<int> topologicalSort(){
    vector<int> res;
    while(st.size()){
        if(!tof&&st.size()>1){
            tof=true;
        }
        int now=st.top();
        st.pop();
        res.push_back(now+1);
        rep(i,v[now].size()){
            
            incou[v[now][i]]--;
            if(incou[v[now][i]]==0){
                st.push(v[now][i]);
            }
        }
    }
    return res;
}

int main(){
    int i,x,y;
    //入力
    cin>>n;
    cin>>m;
    rep(i,m){
        cin>>x>>y;
        v[x-1].push_back(y-1);
        incou[y-1]++;
    }
    rep(i,n)if(incou[i]==0)st.push(i);
    //処理
    if(st.empty()){
        cout<<"no answer"<<endl;
        return 0;
    }
    vint ans=topologicalSort();
    //出力
    rep(i,ans.size()){
        puts(ans[i]);
    }
    tof?puts(1):puts(0);
}
```
Nuxt.jsでOGP設定をする方法

Nuxt.jsでOGP設定を行う機会があったので下記にまとめます。

## 共通のOGPはnuxt.config.jsで設定
各ページで共通のOGPは`nuxt.config.js`ファイルでおこないます。

```javascript:nuxt.config.js
head: {
    htmlAttrs: {
      lang: 'ja',
      prefix: 'og: http://ogp.me/ns#'
    },
    title: process.env.npm_package_name || '',
    meta: [
      { charset: 'utf-8' },
      { name: 'viewport', content: 'width=device-width, initial-scale=1' },
      { hid: 'description', name: 'description', content: process.env.npm_package_description || '' },
      { hid: 'og:site_name', property: 'og:site_name', content: 'サイト名' },
      { hid: 'og:type', property: 'og:type', content: 'website' },
      { hid: 'og:url', property: 'og:url', content: 'サイトのURL' },
      { hid: 'og:title', property: 'og:title', content: 'サイトタイトル' },
      { hid: 'og:description', property: 'og:description', content: '共通ディスクリプション' },
      { hid: 'og:image', property: 'og:image', content: '画像のURL' },
      { name: 'twitter:card', content: 'summary' }//　twitterの画像サイズ
    ],
  },

```
上記のようにheadの中に記述していきます。
まずは、htmlタグにprefix属性をつけます。これはOGPを使う宣言のようなものです。
`prefix: 'og: http://ogp.me/ns#' `

後は設定したい項目をmetaタグ内の記述していきます。

`{ name: 'twitter:card', content: 'summary' },`でtwitter用の画像サイズを変えることができます。

- `summary`は画像とテキスト情報が横並びのタイプ
- `summary_large_image`は画像が横いっぱいに表示され、その下にテキスト情報記載されるタイプ。

## 各ページでOGP設定
各ページでOGP設定する時は、各ページのvueファイルでおこないます。

```vue:page.vue
<script>
export default {
  head() {
    return {
      meta: [
        { hid: 'og:description', property: 'og:description', content: 'ディスクリプション' },
        { hid: 'og:url', property: 'og:url', content: 'ページのURL' },
        { hid: 'og:image', property: 'og:image', content: '画像のURL' },
      ]
    }
  }
};
</script>
```

APIのデータなどで動的にOGPを設定したい場合については、下記の記事で解説しています。

https://qiita.com/TK-C/items/ed6c2ec612c38124bd28

## ローカル環境でOGPを確認する

ローカル環境でOGPの確認をする際は、グーグル拡張機能のLocalhostOGPチェッカーが便利です。
[LocalhostOGPチェッカー](https://chrome.google.com/webstore/detail/localhost-open-graph-chec/gcbnmkhkglonipggglncobhklaegphgn)
![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559347/8ecce6de-f883-9301-91c1-03a34121bcaa.jpeg)
ワンクリックでURLを生成してくれるので、そのURLをOGP確認できるサービスに使えます。

[OGP確認　SNSシェア時のOGP画像・タイトル・説明文のサイズ・見え方を確認](https://rakko.tools/tools/9/)
![キャプチャ1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559347/4e371a28-117a-789b-bc35-947337cba295.jpeg)
URLを入力するだけで、facebook・twitter・はてなブックマーク・LINEでページをシェアした際のOGP画像を表示してくれます。

OGPの画像サイズのみを確認したい時は下記のサイトが便利です。
画像をドラックするだけで確認できます。
[OGP画像シミュレータ](http://ogimage.tsmallfield.com/)
Nuxt.jsをVue.jsに解体するTips(Axios編)

# 背景

- Nuxt.jsで動いているSPAアプリをVue.jsに解体してほしい的な話があり、部分部分をTipsとして投稿します。
- APIはLaravel(6.x)です。なおLaravelとNuxt.jsは同一リポジトリです(なぜ)
- Nuxt.jsは2.9。Vueは2.6.10
- 今回はAxios編です。

## Vue.jsでthis.$axiosを使えるようにPluginを作る

```resources/js/plugin/axios.js
import axios from "axios"

const AxiosPlugin = {}

AxiosPlugin.install = function (Vue) {
  Vue.prototype.$axios = axios;
}
export default AxiosPlugin;
```

あとはPluginを読み込むだけで、this.$axiosが使えます。

```resources/js/app.js
import Vue from "vue";
import router from '~/router'
import App from '~/App.vue'
import AxiosPlugin from '~/plugin/axios';

Vue.use(AuthPlugin)

new Vue({
  router: router,
  render: h => h(App),
}).$mount('#app')
```

### Nuxt.jsでのonRequestやonErrorを使いたい場合

[Nuxt.js Axios Module](https://axios.nuxtjs.org/helpers.html)のonRequestやonErrorを使いたい時があると思います。

その時は[interceptors](https://github.com/axios/axios#interceptors)を使います。

```resources/js/plugin/axios.js
import axios from "axios"

const AxiosPlugin = {}

AxiosPlugin.install = function (Vue) {
  Vue.prototype.$axios = axios;

  Vue.prototype.$axios.interceptors.response.use(
    function (response) {
      console.info(response)
      return response;
    },
    function (error) {
      console.error(error)
      return Promise.reject(error);
    }
}
export default AxiosPlugin;
```

## 参考

- [Axios interceptors](https://github.com/axios/axios#interceptors)
- [Nuxt.js Axios Module](https://axios.nuxtjs.org/helpers.html)

##関連リンク

- [Nuxt.jsをVue.jsに解体するTips(JavaScriptコンパイル編)](https://qiita.com/ProjectEuropa/items/824eb8e0902ee8d93178)
- [Nuxt.jsをVue.jsに解体するTips(Layout編)](https://qiita.com/ProjectEuropa/items/467f043b5ddf1f6c4cdb)
- [Nuxt.jsをVue.jsに解体するTips(Plugin編)](https://qiita.com/ProjectEuropa/items/a03dc1c01dda679d9c73)
- [Nuxt.jsをVue.jsに解体するTips(Vuex編)](https://qiita.com/ProjectEuropa/items/3a04447aadc1d186ec57)
リロードしないとjavascriptが動かない[Rails]

# はじめに
　Qiita初心者のため、自分が困っていたことが簡単に解決した方法や、豆知識みたいなものから上げていこうと思います。ゆくゆくは実装の一通りの流れなど細かく投稿していきます

　初心者（自分もですが）のみなさんは一度はなったことがあると思います。
　javascriptを実装したのにリロードしないと反映されない。今回はその簡単な解決方法をご紹介します。

## リロードしないと反映されない時のコード
　jsでスライドショーを実装（これだけだとリロードしないと画面に反映されない）
　``` Ruby

    $(function () {
      $('.anime').slick({
        dots: true,
        autoplay: true,
        autoplaySpeed: 2000,
      });
    });

### 解決方法
　こうなる原因はgem にあります
　Railsのデフォルトで入っている'turbolinks'です。
　じゃこれを消せばいいとおもっちゃいますが、このgemはページのロードをする際に少しだけ早くしてくれるため消しにくいのです😭
　しかし、このgemを無効化しない限りjsはきちんと動いてくれません。
　そこでJSファイルに下記コードを入れることによって解決できます。

```
 document.addEventListener("turbolinks:load"
, function () {
    $(function () {
      $('.anime').slick({
        dots: true,
        autoplay: true,
        autoplaySpeed: 2000,
      });
    });
  })

document.addEventListener("turbolinks:load")を入れることによって、turbolinksを無効化できます！！
Node-RED上でWatson AssistantとWatson Discoveryをつなげる1つの方法

#Watson AssistantとWatson DiscoveryをNode-RED上でつなげよう

Watson AssistantとWatson Discoveryをつなげた記事があまりないので。

##Watson Assistantから出てくるメッセージについて

Watson Assistantから出てくるmsg.payloadの中には、以下の項目が含まれています。
大きくは、
```msg.payload.output```と```msg.payload.context```に分かれます。

![ink.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142235/a5878937-8401-e07f-a073-3c5100dd3098.png)

Watson Assistantからのメッセージ本文は、
```msg.payload.output.generic[i].text
```に入っています。
ここでは、```i=0```から```msg.payload.output.generic.length-1```です。

写真では、
```msg.payload.output.generic[0].text
msg.payload.output.generic[1].text
```にWatson Assistantからのメッセージ本文が入っています。

##Watson Assistantから出てくるメッセージを修正する

メッセージを修正するfunctionノードを作成します。

まず、```msg.payload.output.generic[i].text```を
```i=0```から```msg.payload.output.generic.length-1```まで結合させます。

```
var len=msg.payload.output.generic.length-1;
var i=o;
while(i<=len){
 temp += msg.payload.output.generic[i].text
 i=i+1;
}
```

そして、結合したメッセージ本文をmsg.payloadに代入するという形でmsg.payloadを修正します。

```
msg.payload=temp
```

##Watson Discoveryにmsg.payloadの内容を渡す

```
msg.discoveryparams.query=msg.payload
```
という内容のfunctionノードを作成します。

##参考文献
こちらの記事は会社でお世話になっている[@shuari4](https://twitter.com/shuari4)さん
に教えていただいた内容になります。いつもありがとうございます。
Swift、はじめました。

こんにちは、ka-min と申します。

swiftでのプログラミングをはじめました。

今回の成果は、iphoneへの転送です。

Macbook Air → iPhoneXs
に無事転送できました。


![IMG_6120.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642569/989b72ed-cfe1-360c-9e58-df902545ff6b.png)
XYZ形式をextended XYZ(exyz)形式に変換する

# CP2Kのトラジェクトリ可視化
CP2KでMD計算する場合、出力形式としてXYZ形式を選択することが多い。しかし、このXYZ形式ではセル情報が書き込まれていない。そのため、OVITOやVMDなどで可視化する際、周期境界条件として認識してくれない。また、OVITOでは、セルの大きさが時間ごとに自動変更されてしまい、時系列全体で共通のセル情報を保持できない。困った。

CP2Kではセル情報を含んでいるPDB形式も選択できるが、OVITOではPDB形式の時系列データは認識してくれない。時系列を多数のPDB形式ファイルに分割して読み込めば、アニメーション化できるが、ファイル数が多くなるのも嫌。

# Extended XYZ形式
XYZ形式の発展型としてExtended XYZ形式がある（[Atomsk, Format: XYZ](https://atomsk.univ-lille.fr/doc/en/format_xyz.html)）。これはXYZ形式にセル、速度、その他の情報を追加した形式。OVITOも対応している。これならbashスクリプトで簡単に変換できると考えた。

書式としては以下のよう。

```
N
Lattice="a1 a2 a3 b1 b2 b3 c1 c2 c3" Properties=species:S:1:pos:R:3:aux1:R:1...auxM:R:1 Time=  time
atom1 x y z prop1 prop2 prop3...propM
atom2 x y z prop1 prop2 prop3...propM
... ...
atomN x y z prop1 prop2 prop3...propM
```

`Lattice`にはスーパーセルのa, b, c軸ベクトルの各成分を`"`で挟んで記入する。`Properties`は各原子の情報の書式を示している。各項目を`:`でつないで指定する。最初に情報の種類を示すキーワード（`species`は元素名、`pos`は原子の位置、`aux`はその他の情報の名前で、例えば`select`で選択状態、`vel`で速度など）、次にデータの種類（`S`はstring文字列・`I`はinteger整数・`R`はreal浮動小数点）、最後に列数。

単純なXYZ形式の場合は、元素名、x成分, y成分, z成分の情報しかないので、`Properties=species:S:1:pos:R:3`でよい。

CP2Kが出力するXYZ形式のトラジェクトリデータは、コメント行にステップ番号、時刻、全エネルギーが記入されている。ここから時刻情報だけ抜き取って、eXYZ形式に流用する。

スーパーセルの情報は、別ファイルを作ってそこに書き込み、スクリプトで読み取ることにした。スーパーセル情報ファイルは、Atomskのオプションで使用するsupercell形式（[Atomsk, Option: properties](https://atomsk.univ-lille.fr/doc/en/option_properties.html)）を流用した。

```
supercell
H(1,1) H(1,2) H(1,3)
H(2,1) H(2,2) H(2,3)
H(3,1) H(3,2) H(3,3)
```
こうしておけば、Atomskでの処理も同じファイルで可能になる。

# 作成したシェルスクリプト
bashスクリプト作成初心者のため、こんな簡単な処理も苦労した。今の所ちゃんと動く。

```bash:xyz2exyz.sh
#! /bin/bash
if [ $# -lt 2 ]; then
  echo "引数が足りません"
  echo "Usage: xyz2exyz.sh supercell file.xyz"
  echo "supercell: スーパーセルの情報が書かれたインプットファイル名を入力してください"
  echo "file.xyz: 変換元のxyzファイル名を入力してください"
  exit 1
fi

CELL_DATA=$1
XYZ=$2

SUFFIX_IN=xyz
SUFFIX_OUT=exyz

# xyzファイル名の拡張子を除く
list=(${XYZ//./ })
PREFIX=${list[0]}
# exyzファイル名作成
OUTFILE=${PREFIX}.$SUFFIX_OUT

echo "supercell data file: ${CELL_DATA}"
echo "xyz file: ${XYZ}"

# ファイル読み込み
DATA=$(cat $CELL_DATA)

echo ${DATA}

count=0
while read line
do
  if [[ ${line} = "supercell" ]]; then
    FLAG=1
    echo "supercell line"
    continue
  fi
  if [[ ${FLAG} = 1 ]]; then
    arr[${count}]="${line}"
    ((++count))
  fi
done << EOF
$DATA
EOF

a=(${arr[0]})
b=(${arr[1]})
c=(${arr[2]})

lattice="${a[0]} ${a[1]} ${a[2]} ${b[0]} ${b[1]} ${b[2]} ${c[0]} ${c[1]} ${c[2]}"
property="species:S:1:pos:R:3"

state="Lattice=\"${lattice}\" Properties=${property} Time="
sed -r "s/(^ i =)(.*)(, time =)(.*)(, E =)(.*)/${state}\4/" $XYZ > ${OUTFILE}
```
[Swift] if文 を if式 にしてみた

##if文は式じゃないから値をかえさないですよね。
条件によってある変数に異なる異なる値を与える、なんてことは日常的にありますが、swiftではifは関数ではありませんので値を返すことをしません。変数への代入は各ブロックの中で行うことになります。

```swift
let val: Int

if conditionA {
   val = val1
} else if conditionB {
   val = val2
} else if let val3 = doSome() {
   val = val3
} else {
   val = val4
}
```

では、このif文を関数化してみましょう！

##やってみた

```swift
class ConditionalBranch<T> {
    private var val: T?

    func `if`( _ bool: Bool, _ ex: () -> T ) -> ConditionalBranch<T> {

        if bool {
            val = ex()
        }
        return self
    }

    func ifLet<E>(_ some: E?, ex: (E) -> T ) -> ConditionalBranch<T> {

        if val != nil {
            return self
        }

        guard let wapped = some else {
            return self
        }

        val = ex(wapped)
        return self
    }

    func elseIf( _ bool: Bool, _ ex: () -> T ) -> ConditionalBranch<T> {
        if val != nil { return self }
        return self.if(bool,ex)
    }

    func `else`(_ ex: () -> T) -> T {
        return val ?? ex()
    }
}

```

使い方はこんな感じです。

```swift
let val =
       ConditionalBranch<Int>()
       .if(conditionA) {
           return val1
        }
        .elseIf(conditionB) {
            return val2
        }
        .ifLet(doSome()) { val3 in
            return val3
        }
        .else {
            return val4
        }

```

想像以上に綺麗！（自己満足）なので、Swift6で採用してもらいたいです 笑
javaScript 乱数　配列　For of ループ For ループ　を使ったコード

#環境：GAS

#目的：
* 任意の回数配列にランダムな数字（０〜９）を入れ、それを昇順にソートする。
* 要素ごとにログで出力する

```javascript:qiita&nbsp;arrayPractice.js
function arrayPractice() {
  let number_list = [];
  const LOOP_COUNT = 20;
  for (let count = 1; count <= LOOP_COUNT; count ++){
    number_list.push(Math.floor(Math.random()*10));
  }
  Logger.log('result for loop' + number_list)  
  let organize_list = number_list.sort()
  // For (element in array){ } の場合、Xは要素番号となります。
  // 上記方法だとLogger.log(array[element])とする必要があります
  for (let number of organize_list){
    Logger.log(number)             
  }
}
```