OmniAICreator/Qiita-1.07M huggingface dataset:
Ubuntu(18.04)に固定IPアドレスを設定する方法

# ファイルの編集を行うため、Vimをインストールします

初期のvimでは、「vi互換モード」という設定になっています。
Vimはviというエディタの後継として開発されました。
vi互換モードでは、十字キーがAやBなど文字列の入力になります。
筆者はVimの方が、操作しやすいためVimをインストールします。

```
$ sudo apt install vim
$ vim --version
VIM - Vi IMproved 8.0 (2016 Sep 12, compiled Oct 13 2020 15:49:09)
適用済パッチ: 1-1453
Modified by pkg-vim-maintainers@lists.alioth.debian.org
Compiled by pkg-vim-maintainers@lists.alioth.debian.org
Huge 版 without GUI.  機能の一覧 有効(+)/無効(-)　
+acl               +farsi             +mouse_sgr         -tag_any_white
～略～

```

Huge版となっていることを確認します。
Hegeとは日本語で「巨大」という意味です。

Vimでは、様々な種類があます。
上から順に機能の制限がかけられており、tinyが最も制限を受けています。
今回は、Hugeを利用したいので確認を行いました。
1.tiny
2.small
3.normal
4.big
5.huge


#記述ファイルの作成

IPアドレスに関する記述を行うファイルを作成します。
初期では、/etc/netplan　配下の「01-network-manager-all.yaml」ファイルに記載されていますが、今回は「99_network-manager-all.yaml」という新しいファイルに記述していきます。
そのため、「01-network-manager-all.yaml」を別の名前に変更します。

```:/etc/netplan
$　mv 01-network-manager-all.yaml 01-network-manager-all.yaml.disabled
```

では、99_network-manager-all.yamlを作成して書き込んでいきます。

```:/etc/netplan/99_network-manager-all.yaml
$ vi 99_network-manager-all.yaml

network:
   version: 2
   renderer: networkd
   ethernets:
       enp0s3:
        addresses: [(設定したいIPアドレス)]
        gateway4: (デフォルトゲートウェイのIPアドレス)
        nameservers:
          addresses: [8.8.8.8, 8.8.4.4]
```
この際に、インデントが揃っていないと再起動時にエラーが出るので注意が必要です。
enp0s3の部分はipコマンドで確かめることができます。

```
$ ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
～略～
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000

～略～
```
２：enp0s3とありますので、ネットワークインタフェース名はenp0s3に設定しています。
eth0やenp1s0の場合もあるため、設定時には確認が必要です。

最後に再起動してipアドレスが変更されていれば完了です。

```
$ sudo netplan apply
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen
～略～ 
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:37:8c:4b brd ff:ff:ff:ff:ff:ff
    inet (設定したIPアドレス） brd 192.168.1.255 scope global enp0s3  ・・・ここを確認
       valid_lft forever preferred_lft forever
    inet6 2001:a453:5464:200:a00:27ff:fe37:8c4b/64 scope global dynamic mngtmpaddr noprefixroute
       valid_lft 14376sec preferred_lft 12576sec
    inet6 2001:a453:5464:200:3e7b:66da:783a:4992/64 scope global dynamic mngtmpaddr noprefixroute
       valid_lft 14376sec preferred_lft 12576sec
    inet6 fe80::830b:1cee:c8a8:9f83/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
```
2: enp0s3内の、inet の部分のIPアドレスが変更されていたら成功です。
Railsチュートリアル3章メモ(2周目)

##概要
３章知見を備忘録的にまとめておく


##やったtest順序

1. test編集
2. route編集
3. controller(controller.rb)編集
4. view(.html.erb)作成

 -> テスト成功

###1. test記入後

```
$ rails test
NameError: undefined local variable or method `static_pages_about_url'
# AboutページへのURLが見つからない
```
###2. route編集後

```
$ rails test
AbstractController::ActionNotFound:
The action 'about' could not be found for StaticPagesController
# StaticPagesコントローラにaboutアクションがない
```
###3. controller(controller.rb)編集後

```
$ rails test
ActionController::UnknownFormat: StaticPagesController#about
is missing a template for this request format and variant.
# テンプレート(view)がない
```

###4. view(.html.erb)作成

```
$ rails test
3 tests, 3 assertions, 0 failures, 0 errors, 0 skips
# 成功
```

##レイアウトと埋め込みRuby（Refactor）

###provideメソッド
タイトルにERBを使ったviewに、
provideメソッドで呼び出し

``` erb:views/static_pages/home.html.erb
<% provide(:title, "Home") %>
<!-- yieldメソッドを呼び出すだけで何も出力しない -->
```
HTMLの構造はtitleタグの内容も含めてどのページも完全に同じなので
リファクタリングしてDRYにする。

最終的にレイアウトファイルのyieldメソッドで受け取り、html完成させる。

```erb:views/layouts/application.html.erb
<title><%= yield(:title) %> | Ruby on Rails Tutorial Sample App</title>
<!-- <title>Home | Ruby on Rails Tutorial Sample App</title> -->
```


###minitest reporters
rails test実行時に``red``や``green``の表示が見やすくなる

```test/test_helper.rb
ENV['RAILS_ENV'] ||= 'test'
require_relative '../config/environment'
require 'rails/test_help'
require "minitest/reporters"
Minitest::Reporters.use!

class ActiveSupport::TestCase
  # 特定のワーカーではテストをパラレル実行する
  parallelize(workers: :number_of_processors)

  # すべてのテストがアルファベット順に実行されるよう、
  #test/fixtures/*.ymlにあるすべてのfixtureをセットアップする
  fixtures :all

  # （すべてのテストで使うその他のヘルパーメソッドは省略）
end
```
【Python】loggingの出力結果をログファイルに出力する

pythonでloggingを使ってログを外部ファイルに出力させる方法について、手こずったので備忘録的に残しておきます。

#■やりたいこと
・loggingモジュールを使って、ログの内容を「test○○○.log」に出力する
・loggingの設定情報については、以下の2パターンについて検討する
　1.ソースに直接記述する場合
　2.「logging.conf」を作成し、参照させる場合
・Windows環境なので、文字化けを防ぐため、文字コードをShift_JIS (CP932) からUTF-8にエンコードする設定を入れる

#■環境
OS：Windows10
バージョン:Python 3.9.2

#■ディレクトリ構成

```
[main]
  ├──logging_test01.py
  ├──logging_test02.py
  |
  ├──[conf]
  |    └──logging.conf
  |
  └──[logs]
       ├──test001.log
       └──test002.log
```

#■手順
##1.loggingをインストール
コマンドプロンプトを起動し、以下のコマンドを実行

```
pip install logging --user
※もしくは、py -m pip install logging
```

##2.パターン1（loggingの設定情報をソースに直接記述する場合）
###パターン1のソース
```python:logging_test01.py
import logging

logger = logging.getLogger()
logger.setLevel(logging.DEBUG)

formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')

#ファイルへ出力するハンドラーを定義
fh = logging.FileHandler(filename='./logs/test001.log', encoding='utf-8')
fh.setLevel(logging.DEBUG)
fh.setFormatter(formatter)
#rootロガーにハンドラーを登録する
logger.addHandler(fh)

logger.debug("ログに出力")
logger.info("ログに出力")
logger.warning("ログに出力")
logger.error("ログに出力")
```

###パターン1の出力結果
```text:test001.log
2021-04-02 14:49:05,471 - DEBUG - ログに出力
2021-04-02 14:49:05,471 - INFO - ログに出力
2021-04-02 14:49:05,471 - WARNING - ログに出力
2021-04-02 14:49:05,471 - ERROR - ログに出力
```

##3.パターン2（「logging.conf」を作成し、参照させる場合）
###パターン2のソース
```python:logging_test02.py
import logging.config

logging.config.fileConfig("./conf/logging.conf")
logger = logging.getLogger()

logger.debug("ログに出力")
logger.info("ログに出力")
logger.warning("ログに出力")
logger.error("ログに出力")

```

###パターン2のconfファイル
```python:logging.conf
[loggers]
keys = root

[handlers]
keys = fileHandler

[formatters]
keys = simpleFormatter

[logger_root]
level = DEBUG
handlers = fileHandler

[handler_fileHandler]
class = FileHandler
formatter = simpleFormatter
args = ('./logs/test002.log', 'a', 'utf-8')

[formatter_simpleFormatter]
format = %(asctime)s %(levelname)s %(message)s
```

###パターン2の出力結果
```text:test002.log
2021-04-02 15:00:37,780 DEBUG ログに出力
2021-04-02 15:00:37,780 INFO ログに出力
2021-04-02 15:00:37,780 WARNING ログに出力
2021-04-02 15:00:37,780 ERROR ログに出力
```

#■まとめ
pythonの経験が少なかったので、logging.confのパス指定に手こずったり、logging.confの中にコメントを書いておくとエラーになるなどいろいろと勉強になった。
[備忘録]Swiftでのstrategyパターン

# SwiftでGofのデザインパターンstrategyの備忘録
忘れそうだったのでメモ

```swift
// タイプコード
enum Type {
    case A, B, C
}

func execute(type: Type) {
    strategyForType(type: type).execute()
}

//返り値にプロトコルを採用することもできる
func strategyForType(type: Type) -> Strategy {
    switch type {
    case .A: return StrategyA()
    case .B: return StrategyB()
    case .C: return StrategyC()
    }
}

protocol Strategy {
    func execute()
}

class StrategyA: Strategy {
    func execute() {
        print("Aが呼ばれる")
    }
}

class StrategyB: Strategy {
    func execute() {
        print("Bが呼ばれる")
    }
}

class StrategyC: Strategy {
    func execute() {
        print("Cが呼ばれる")
    }
}

```

## 語彙説明
###タイプコード
オブジェクトの種別を表す値のこと
交通手段として、徒歩/電車/タクシーがあった場合

徒歩...0
電車...1
タクシー...2

このときの0,1,２がタイプコード
【VBA】新規シートを追加する方法

今回は、新規シートを追加する方法です。

新規シートを追加して、追加したシートに記載したい時等に必要になります。

↓実演動画
https://youtu.be/shdYt6r5u4o

ソースコードは下記の通りです。

```
Sub シートを追加する()

    Dim ws1 As Worksheet
    
    Set ws1 = Worksheets.Add
    
End Sub
```

詳細を説明します。

>Dim ws1 As Worksheet

まずは、追加シート用の変数を用意します。

>Set ws1 = Worksheets.Add

その変数に「Worksheets.Add」で新規シートを追加することが出来ます。

以上が、新規シートを追加する方法でした。
VSCodeでphp-cs-fixerが動かない場合の対処法メモ(PHP version)

# 背景
急に `php-cs-fixer` が `PHP CS Fixer: php general error` という謎のエラーをだし時間が溶けてしまったので、同じ苦しみを味わう人を一人でも減らすための雑なメモ

## 調査方法

### コンソールエラーを確認

[Visual Studio CodeでPHPの自動整形を設定](https://itcolumn.net/phpcsfixer/)を確認すると、
「Help」→「Toggle Developer Tool」
を選択することでVSCode上のコンソールエラーが確認できるのでそちらを確認。
ここで様々なパターンがありそうですが、
僕の場合は以下のバージョン違いのエラーが出ていました。

```
PHP needs to be a minimum version of PHP 5.6.0 and maximum version of PHP 8.0.*.Current PHP version: 8.0.0.PHP CS Fixer is not able run on PHP 8.0.0 due to bug in PHP tokenizer (https://bugs.php.net/bug.php?id=80462).Update PHP version to unblock execution.
```

### phpbrewでPHPのバージョンを7.4に戻す

[(Mac）phpbrewでPHPのバージョンを切り替える](https://pointsandlines.jp/server-side/php/phpbrew)などを参考にphpのバージョンを戻して、再度調整するもなぜか同じエラーが出続けていました。
ターミナルのphpバージョンとVSCodeのphpバージョンはずれることがあるようです。（詳細は調べていないですが。。。）

### 気合でVSCode側のphpバージョンを指定

1. 「command + ,」で設定を開き「php」で検索
2. 「PHP › Validate: Executable Path」の「setting.jsonで編集」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198985/04e60dad-0fa3-f5cf-e095-efc05dca5b69.png)
3. `"php.validate.executablePath": "/Users/sakuraiyuji/.phpbrew/php/php-7.4.16/bin/php",`を設定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198985/78d7116b-041a-38e0-a601-3ae65237f783.png)


# 最後に
強制的にVSCodeのphpのバージョンを指定しているためおそらく方法としてはベストではない気がしており、今後phpのバージョン上げたくなった際に苦労しそうな予感がメチャしています。。。笑
何かいい回避方法をご存知の方がいらっしゃれば教えていただけるととても助かります。
知っておくとちょっと便利。コマンドラインでワンライナーするためのオプションたち

# はじめに

ちょっとした関数の機能を確かめたいときやかんたんな文字列処理を取得したいときに力を発揮するワンライナー。各コマンドをワンライナーを実行するオプションが実行環境によってまちまちだったのでまとめました。

# Ruby

`-e`オプションを使います

```bash
ruby -e "puts (`a` * 1000).to_s"
```

# Python

`-c`オプションを使います

```bash
python -c "print('a' * 1000)"
```

# PHP

`-r`オプションを使います

```bash
php -r "print(var_dump(empty(trim(' '))));"
````
今、ハマっていること。（collectionを使った一覧表示内で、ネストしている子モデルのデータを表示させたい）

## 前置き

初学者のため言語化が難しいですが、頑張ります💪

## やりたいこと

簡単にいうと、colectionメソッドで一覧表示しているところで、他のネストしてある子モデルの情報を載せたい

collectionメソッドを使ってaccountモデル（口座）の一覧表示をしています。そこにそのaccount（口座）情報に付随する、ネストしたassetモデル（資産額）とmovementモデル（投資額）の情報を載せたいのですが、コードが思いつかず、ハマっています。

![スクリーンショット 2021-04-02 13.14.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004079/eb87c531-a574-9844-44b8-1c34f6136711.png)


**ハマっている原因→**　MVCの理解が甘いため、実現できることが把握できていない。できそうという感覚だけでアプリケーションを作り初めてしまいハマりました。

##　今のところ試したこと

collectionメソッドにassetモデルとmovementモデルのインスタンス変数を渡そうと思い調べたが、部分テンプレートにインスタンス変数を渡すのはあまり良くないみたいで、諦めました。

インスタンス変数は諦めて、モデルから直接取り出すことにしました。
結果たどり着いた記述がこれです。

```ruby
<h1>資産-------¥<%= Asset.where(account_id: account.id).last(1).pluck(:amount) %></h1>
```
意味はaccountに紐づくAssetモデル一番新しいamountカラムを取り出しています。
pluckメソッドを使って、データを取り出すことはできたが、配列で取り出してしますので、表示用ではないと思いました。

[2222]この形で取り出してしまう。
正規表現で表示を帰れると思ったが、できなかったので

また振り出しに戻リました。
最近傍のデータを使った衛星プロダクトにおける欠損データの補完について


##概要
こんにちは。衛星データから作られるプロダクトには様々なものがありますが、時には関心領域がプロダクト中に含まれていない場合があります。今回はその一例として、マングローブ林における海面温度の欠損の問題に取り組んでみました。
##状況
マングローブ林は陸域と海域のちょうど中間に存在していることから、MODIS衛星の海面温度プロダクトでは一部がカバーされていませんでした。そのため、最近傍から海面温度情報を引っ張ってくることによって、対象領域全体についての海面温度情報を作成する方針を立てました。1300 km* 1600 kmほどのかなり広い領域の処理を行いましたが、最近傍ピクセルの探索でBrute forceな手法ではなく、より効率的なKDTreeで処理を行ったためか全体の処理時間は20~30秒ほどでした。処理の過程で距離による重みづけ等が必要な場合には異なる方法やライブラリが必要となるかと思いますが、ひとまずの欠損値埋めに使用する事が可能な方法かなと思います。

##コード
```python:SST_interpolation.py
import rasterio
import numpy as np
import scipy.spatial as ss

#MODIS画像と対象領域のファイルは同一の解像度、同一領域に調整済み
#対象領域のファイルにおいて、対象領域では値が１、それ以外の領域は値が０となっている

#ファイルパスの設定
StudySiteFilePath="#対象領域のファイルへのパス"
MODIS_SST_FilePath="#MODIS SSTプロダクトファイルへのパス"
OutputFilePath="#（出力ファイルを格納したい場所へのパス）/出力したいファイル名.tif"

#rasterioでファイルの読み込み
StudySite=rasterio.open(StudySiteFilePath)
SST_Jan=rasterio.open(MODIS_SST_FilePath)

#行列としての読み込み
StudySite_matrix=StudySite.read(1)
SST_Jan_matrix=SST_Jan.read(1)

#ゼロより大きいSSTの場所のインデックスを取得
SST_loc=(SST_Jan_matrix>0).astype(np.uint8)
list_of_SST_points=np.where(SST_loc==1)

#対象領域のインデックスを取得
list_of_targetPoints=np.where(StudySite_matrix==1)

#最近傍の値の探索を高速化する為、KDTreeを利用
#ユークリッド距離に基づいて評価
data=[(list_of_SST_points[0][i],list_of_SST_points[1][i]) for i in range(len(list_of_SST_points[0]))]
tree=ss.KDTree(data)
target_coordinates=[(list_of_targetPoints[0][i],list_of_targetPoints[1][i]) for i in range(len(list_of_targetPoints[0]))]

#値を格納する為の行列を作成
SST_interpolated=np.zeros_like(SST_loc)

#対象領域のピクセルについて、最近傍のMODIS SSTの値を取得して行列へ格納
for coords in target_coordinates:
    d,i=tree.query(coords,p=2)
    SST_interpolated[coords[0],coords[1]]=SST_Jan_matrix[data[i][0],data[i][1]]

#GeoTiff形式で保存
with rasterio.open(OutputFilePath,'w',driver='GTiff',width=StudySite.width,height=StudySite.height,count=1,crs=StudySite.crs,transform=StudySite.transform,dtype=np.float32) as output:
    output.write(SST_interpolated,1)
    output.close()

```

##結果
対象領域のファイルの一部（白は対象領域、黒は非対象領域）![StudySite_ex.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1059565/034093f3-32a5-68b4-5841-375da627788b.png)
MODISプロダクト![MODIS_SST_ex.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1059565/880c4e30-0fd6-bdba-9399-64621f3a006e.png)
最近傍の値によるSST値の補完結果![Interpolated_SST_ex.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1059565/f3583dcb-af31-e7b7-b284-137fbe14bcd2.png)
javascript じゃんけんゲーム

const GU = 1;
const CHOKI = 2;
const PA = 3;

let hand = prompt('半角数字で1~3の数字を入力してください。\n\n' + GU + ':グー \n' + CHOKI + ':チョキ \n' + PA + ':パー \n');

hand = parseInt(hand, 10);

if (hand !== GU && hand !== CHOKI && hand !== PA) {
  alert('入力値をうまく認識できませんでした。ブラウザを再読み込みすると、もう一度挑戦できます。');
}
else {
  let com = Math.floor(Math.random() * 3) + 1;

  let comHandName = '';
  switch (com) {
    case GU:
      comHandName = 'グー';
      break;
    case CHOKI:
      comHandName = 'チョキ';
      break;
    case PA:
      comHandName = 'パー';
      break;
  }

  let msgResult = '';
  if (hand === com) {
    msgResult = '結果はあいこでした';
  }
  else if ((hand === GU && com === CHOKI) || (hand === CHOKI && com === PA) || (hand === PA && com === GU)) {
    msgResult = '勝ちました';
  }
  else {
    msgResult = '負けました';
  }

  msgResult = msgResult + 'コンピュータの出した手は「' + comHandName + '」でした';
  alert(msgResult);
}


自作してみたので記念に残します。
switchを使う際は「break」を忘れないようにしないとですね。
AndroidStudioで、Buttonオブジェクトに背景画像を設定するときの問題点と解決法

#AndroidStudioで、Buttonオブジェクトに背景画像を設定するときの問題点と解決法
###AndroidStudioで、Buttonオブジェクトに背景画像を設定しても画像が反映されない問題があります。

以前からButtonオブジェクトのbackgroundTintプロパティに色を指定しても、Buttonの上下に隙間ができてしまうということがありました。（余白をあまり空けたくないときに困る）
これは、AndroidStudioにデフォルトで設定されている色の画像の上下に余白が含まれている為に発生しているようです。（Buttonオブジェクトのプロパティで「layout_marginTop」や「layout_marginBottom」,「paddingTop」や「paddingBottom」の値を0dpに指定しても消えません！）
![qiita_button1e2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794916/b9128fdf-7783-73ed-f205-00f39d148ac0.png)

これに関して、以前はButtonオブジェクトのbackgroundプロパティに、自作の画像を設定すれば解決できました。（余白を消すことができました）
###しかし、最近確認したらButtonオブジェクトのbackgroundプロパティに画像を指定することはできますが、指定した画像が表示されなくなっていました。（2021年4月2日時点）

これに対しての解決法ですが、Buttonオブジェクト自体をImageButtonオブジェクトに変更して、ImageButtonオブジェクトのsrcCompatプロパティかbackgroundプロパティに自作の画像を設定することで解決できます。
![qiita_button2e2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794916/1a7419bb-e605-ea67-b94b-c88a69619d26.png)

###しかし、Buttonオブジェクトと違い、ImageButtonオブジェクトはテキストを含めることができない問題があります。

これに対しての解決法ですが、ImageButtonオブジェクトに設定する自作の画像自体に、テキストを含めてしまうことで解決できます。
![qiita_button3e.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794916/89c1bd31-29d7-95db-4020-e73cd53f53db.png)

###まとめると、今後Buttonに画像を設定するときは、ImageButtonオブジェクトにテキスト入りの画像を設定すると良いと思います。（テキストが入り用の場合）

今回の投稿記事に関連するアプリを2つ作りました。
1つ目はテキストの含まれない単色の画像を作成できるアプリです。枠の設定と角丸の設定（四角から円形まで可能）もできます。
###ColorPartsCreater （無料、広告無し）
https://play.google.com/store/apps/details?id=com.konno_siki.colorpartscreater2

2つ目はテキストの含まれる単色の画像を作成できるアプリです。文字の色やサイズやスタイルの変更、影をつけることもできます。
###CharPartCreater （100円、広告無し）
https://play.google.com/store/apps/details?id=com.konno_siki.charpartscreater

どちらも保存する画像サイズは縦横1ピクセルから1024ピクセルまで変更可能なので、作成されるAndroidアプリのパーツサイズに合わせて使用できます。
Webアプリケーションでも私のアプリと同じような画像を作成できるものはありますが、無料のものでも著作権等の関係で商用利用できないものや商用利用できても使える画像の数量制限のあるものがあります。
著作権等の事をいちいち考えなくていいのは自作で画像を作ってしまうことだと思うので、よろしければダウンロードして、使ってみてください。
Gitのコミットの単位、メッセージの書き方、レビュー依頼の仕方

## これは何

https://qiita.com/official-events/63aa63fd921659fb3b5d

- 「新人プログラマ応援 - みんなで新人を育てよう！」のイベント記事です
- 私が個人で開発する際や、チームのルールを決める場合の進め方をまとめました
    - コミットの単位やコミットメッセージの書き方ひとつで、チームの生産性は大きく変わります
    - これが正解、なんてものではありませんが、どなたかのお役に立てれば幸いと思って投稿しました

## コミットの仕方

- 実現したものの単位でコミットする  
- コミットログは作業ログではなく、成果物がどの粒度で完成したかのログであるべき

### 良いコミット（コミットメッセージ）

- Aの処理を実装
- Bの処理をファイルCからファイルDに移動
- Eのコンポーネントのスタイルを変更
- Fのページを新規作成

### イマイチなコミット（コミットメッセージ）

- 関数の修正
- 新しいページを追加
- Gの処理を追加したのとついでにHの処理を少しリファクタリング
- WIP
- レビュー内容対応
- 微修正

### 良い例とイマイチな例の違い

| | 良いコミット | イマイチなコミット |
| --- | --- | --- |
| 1つのコミットの中で | 実現されたものが分かりやすい | 何が実現されたのか分からない |
| レビューが | しやすい | しづらい<br/>（リネームしつつコードを変えて……とかだと、全部が差分として出てしまう、など） |
| 要らないコミット | ない | `WIP`や`レビュー内容対応`や`微修正`はsquashまたはfixupすべき |


## コミットメッセージ

- Issue番号を記載しておく
    - GitHubやGitLab上で、コミットからIssueへ飛べる
- 可能なら英語で書く
    - OSSなどでは必然的に英語でコミットメッセージを書くので
    - ただし今回は「新人プログラマ応援」のイベントの記事として投稿しているので、以降の例は日本語で書く
- フォーマットを意識して書く
    - 世間のコミットメッセージを見るにだいたいこういう書式になると思う
    - （Issue番号の記載の仕方はお好みで）

### 基本のフォーマット

```
#（Issue番号） （実装したもの）を（対象のファイルや処理の名前）に（追加・編集・削除）
```

## ケーススタディ：プルリクを出す際

### 最初のコミット

```
* 15e6766 #42 ログアウト処理をマイページに追加
* 9642c75 #42 ユーザーマイページを新規作成
* 915ee74 Merge pull request #XXX from some-branch
```

### 途中からの追加

- 新規作成したユーザーマイページに、未使用の変数宣言が残っているのに気付いた
    - それだけ消したい
- その後、アカウント設定ページへの動線を追加した

### 良いコミットログ

```
* ca21a8c #42 アカウント設定ページへの動線をマイページに追加
* bd39f49 fixup! #42 ユーザーマイページを新規作成
* 15e6766 #42 ログアウト処理をマイページに追加
* 9642c75 #42 ユーザーマイページを新規作成
* 915ee74 Merge pull request #XXX from some-branch
```

↓適当なタイミングで`git rebase --autosquash`

```
* 51b85aa #42 アカウント設定ページへの動線をマイページに追加
* 97a4ecf #42 ログアウト処理をマイページに追加
* 345e386 #42 ユーザーマイページを新規作成
* 5373e98 Merge pull request #XXX from some-branch
```

### イマイチなコミットログ

```
* ca21a8c #42 アカウント設定ページへの動線をマイページに追加
* bd39f49 #42 不要なコードの削除
* 15e6766 #42 ログアウト処理をマイページに追加
* 9642c75 #42 ユーザーマイページを新規作成
* 915ee74 Merge pull request #XXX from some-branch
```

### 良い例とイマイチな例の違い

- イマイチなコミットログには`不要なコードの削除`が1つのコミットとして存在している
    - そしてこのコミットはどこの何が不要だったのかも分からない
- 良いコミットログの最終的なアウトプットでは、「成果の実現」に関係ないコミットは存在しない

autosquashの参考資料：

https://qiita.com/thinca/items/44ff57ed56a1f8c7efa2


## ケーススタディ：プルリク修正をコミットする際

### レビューをもらった内容

- ログアウト処理の実装の中にタイポがある
- 仕様に書いてある「プロフィール変更ページへの動線」が追加されていない

### 良い修正のコミットログとコミュニケーション

```
* 054ff9a #42 プロフィール変更ページへの動線をマイページに追加
* 7690c08 fixup! #42 ログアウト処理をマイページに追加
* 51b85aa #42 アカウント設定ページへの動線をマイページに追加
* 97a4ecf #42 ログアウト処理をマイページに追加
* 345e386 #42 ユーザーマイページを新規作成
* 5373e98 Merge pull request #XXX from some-branch
```

> `7690c08`でタイポの修正、`054ff9a`でプロフィール変更ページの追加を実装しました

↓

Approveをもらったらautosquash

### イマイチな修正のコミットログとコミュニケーション

```
* 7690c08 #42 レビュー対応
* 51b85aa #42 アカウント設定ページへの動線をマイページに追加
* 97a4ecf #42 ログアウト処理をマイページに追加
* 345e386 #42 ユーザーマイページを新規作成
* 5373e98 Merge pull request #XXX from some-branch
```

> 修正しました

### 良い例とイマイチな例の違い

- 良い例
    - タイポ修正と新規追加がちゃんとコミットが分かれている
    - どのコミットでどの修正がされているか、ちゃんとレビュワーに伝えている
- イマイチな例
    - 一緒くたに対応しているので、おそらく変更差分が多く、レビュワーが大変
    - `レビュー対応`コミット自体は何か成果物を生んでいるわけではない
【Rails】 モデルをreferencesで関係づける

#はじめに
この記事はrailsで扱うモデルの関係性について書いています
referencesを使い親モデルが削除されたら子モデルも削除されるようにモデルの対応を行う。

------------------------
今回はdeviseのUserとGroupモデルを作成し
user:group=1:Nの形にする
![13822235635078.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268848/0d94cf5b-3ab1-8dd5-01ed-eb6466e1ea34.jpeg)

------------------------

この記事を読むに当たりdeviseを使ったUserモデルは作成しているとし省略する。
Userモデルを作っていない人は以下の記事を参考にUserモデルを作成してほしい。

https://qiita.com/Ochanyoro/items/2a21c14194efedea4701

#Groupモデルの作成
ターミナルで以下のコマンドを入力する

```:ターミナル
$ rails g model group
```
そしたらマイグレーションファイルが作られているので編集する

```ruby:db/migrate/----create_groups.rb
class CreateGroups < ActiveRecord::Migration[6.1]
  def change
    create_table :groups do |t|
      t.string :name, null: false
      t.references :user, null: false,foreign_key: true
      t.timestamps
    end
  end
end
```

```t.references :user, null:false,foreign_key:true
```はuserモデルを親としgroupを子とする。また空欄は許容されない。これによって親と子の関係が作れる。
このように編集できたら ```rails db:migrate```を行う

```:ターミナル
$ rails db:migrate
```
これでモデルが作成されている。
確認の仕方はdb/schema.rbを見る

```ruby:db/schema.rb
create_table "groups", force: :cascade do |t|
    t.string "name", null: false
    t.integer "user_id", null: false
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
    t.index ["user_id"], name: "index_groups_on_user_id"
  end
```
これを見てみると```name```の他に```user_id```というカラムが作られていることが分かる。

#それぞれのモデルの関係性を記入する
モデルが作れたら次はuser:groupの1:Nの関係を作る
まず```models/group.rb```を開き編集する

```ruby:models/group.rb
class Group < ApplicationRecord
  belongs_to :user
end
```
このように書くことでGroupモデルはuserに関連付けられる。
```belongs_to```を書くときは必ず単数形の形で書く```belongs_to:user```

次にuserモデルについて編集する

```ruby:models/user.rb
class User < ApplicationRecord
  has_one_attached :image
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable


  has_many:groups, dependent: :destroy
end
```
```has_many:groups, dependent: :destroy```と書くことで1:Nの関係が作れる。
```has_one```にすることで1:1の関係にすることができる。
ただし```has_many```の場合は複数形groups,
```has_one```の場合は単数形groupにする。

```dependent: :destroy```はUserが削除されたらそのUserに関連しているGroupも削除してくれる機能である
Apple ID 2ファクタ認証 のコードが表示される端末を追加・削除したい


## ユースケース

Apple IDにサインインする時2ファクタ認証の6桁のコードが送られてくる端末をオフィスに置いてある共有端末に設定した。が、リモートワークでオフィスに出社していないため、代わりに手元にある個人用開発端末にも2ファクタ認証のコードが送られてくるようにしたい。

## 方法

公式ページに小さく書いてあります
https://developer.apple.com/jp/support/authentication/

> 1つのApple IDに複数の信頼できるデバイスを関連付けることはできますか？
はい。2ファクタ認証を使用して、デベロッパ用Apple IDで複数のデバイスにサインインすることができます。
1つのApple IDに複数の信頼できる電話番号を関連付けることはできますか？
はい。Apple IDアカウントページで、信頼できる電話番号、信頼できるデバイス、その他のアカウント情報を管理できます。また、信頼できるデバイスのApple IDセキュリティ設定で、信頼できる電話番号を管理することもできます。

https://appleid.apple.com　にアクセスし、該当アカウントでログインすると、2ファクタ認証を飛ばす電話番号の追加・削除はできます。

また信頼済みデバイスの確認もできます。

ただ信頼済みデバイスの追加自体はここからはできないように思えます。追加するには、mac自体が該当のApple IDを使ってログインしていないとダメなようです。macのシステム環境設定 > インターネットアカウント から該当のApple IDでログインすれば、自動的に信頼済みデバイスとなります。
ブラウザにURLが入力されてページが表示されるまでをまとめた

ブラウザにURLが入力されたときにどのような処理が行われてページが表示されているのか　　
自分なりにざっくりまとめてみました。（間違えているところがありましたらご指摘ください）
全体的なイメージがつかめればと思います。

## ページが表示されるまで
全体イメージはこんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1203886/b6ef3f6a-d204-37e0-3e2c-7b0ecae9c600.png)



## 登場人物と役割

- クライアント
    - ブラウザ: chrome, firefox, IEなど
- サーバー
   - DNS(DSNキャッシュサーバー・DNSサーバー): ドメイン名を管理。ドメイン名に紐づくIPアドレスをクライアントに返す
   - Webサーバー：webページの表示に必要な情報をクライアントに返す

## 処理の流れ  
1. ブラウザはDNSに対してユーザに入力されたURL（ドメイン名）を送り、IPアドレスを要求する
2. DNSはブラウザに対してドメイン名に紐づくIPアドレスを返す  
※ドメイン名に紐づくキャッシュがあればキャッシュの情報をブラウザへ返す。なければDNSサーバーからIPアドレスを取得しブラウザへ返す。
3. ブラウザはDNSから受け取ったIPアドレスを持つwebサーバーに対して接続を行い、Webページの情報を要求する
4. Webサーバーはブラウザに対してページ生成に必要な情報を返す
5. ページを画面に表示する 


## 参考
  
[https://blog.knowbe4.com/what-happens-when-you-type-in-a-url-in-an-address-bar-in-a-browser](https://blog.knowbe4.com/what-happens-when-you-type-in-a-url-in-an-address-bar-in-a-browser)
[https://github.com/tetz-akaneya/what-happens-when-JA](https://github.com/tetz-akaneya/what-happens-when-JA)
[https://www.urban-project.jp/blog/recommended/433/](https://www.urban-project.jp/blog/recommended/433/)
[https://www.rworks.jp/system/system-column/sys-entry/21249/](https://www.rworks.jp/system/system-column/sys-entry/21249/)
[https://developers.google.com/web/fundamentals/performance/critical-rendering-path/constructing-the-object-model](https://developers.google.com/web/fundamentals/performance/critical-rendering-path/constructing-the-object-model)
xstateのtypescriptは厄介、だったのを解消するxstate-codegen

![Screen Shot 2021-04-02 at 14.50.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16757/fd3479b3-00ef-9c9c-445d-2315c2adf11f.png)


# 問題

とりあえずxstateに飛び込んでみたものの、typescriptはどうやって書けば良いのか最適解が見つからない。

# xstate-codegenを使う

色々xstateのtypescript周りはゴタゴタしてて、今までの他のライブラリのような`Generic当てればOK`とはすんなり行かないことが多いみたい。

# 解決策

[https://github.com/mattpocock/xstate-codegen][1]を使うことで、このゴタゴタを回避して、更には完璧なタイプセーフが実現するらしい。

# 使い方

```:インストール
yarn add xstate-codegen
```

## 処理の流れ

1. `xstate-codegen "src/**/**.machine.ts"`などとして特定のファイルをwatchしておく
1. machineをtsで書く
1. ファイル変更に反応して、`@node_modules/@xstate/compiled`配下に`index.d.ts`と`react.d.ts`が自動生成される
1. IDE側でそれを検知して、タイプセーフが完了する

## machineの作り方

```ts:switch.machine.ts
import { Machine } from "@xstate/compiled" // package名注意

interface Context {}

type Event = { type: "toggle" }

// basicSwitch: これはmachineのID 今まではconfig内のid:プロパティだったもの
export default Machine<Context, Event, "basicSwitch">({
  context: {},
  version: "1.2.3", // あってもなくてもOK
  initial: "active",
  states: {
    active: {
      on: {
        toggle: {
          target: "inactive",
        },
      },
    },
    inactive: {
      on: {
        toggle: {
          target: "active",
        },
      },
    },
  },
})
```

# 注意点

IDEでは保存するまで以前の`index.d.ts`と`react.d.ts`しか参照できないので、例えばstate名を変更したりして、**保存するまでは**エラー表示になってしまう。
一旦保存してwatchが検知して、`index.d.ts`と`react.d.ts`が書き換えられて、且つIDEがその変更を飲み込むまではエラー表示が続くので、保存してひと呼吸してからエラーが出ないか確認したほうが良い。

# package.json

自分はnextjsを普段使っているが、こういう風に書けば

```jsonc:package.json
{
  "scripts": {
    "dev": "next",
    "codegen": "xstate-codegen \"src/**/**.machine.ts\""
//  又は  "codegen": "xstate-codegen \"src/**/**.machine.ts\" --outDir=\"src\""
  }
}
```

```
yarn codegen
```

でwatchが実行できる。`--outDir`指定で`index.d.ts`と`react.d.ts`の保存先が変えられる。


[1]: https://github.com/mattpocock/xstate-codegen
[HTML/CSS] 画像の上に文字を重ねる方法

#画像と文字を表示する
今回はclass名を `box` としました。
`box` classの中に、表示させたい画像と文字を入れます。

```:html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="css/main.css">
    <title>画像の上に文字を重ねる方法</title>
</head>
<body>
    <div class="box">
        <img src="./img/dog.png">
        <p>Hello!</p>
    </div>
</body>
</html>
```

#CSSで画像の上に文字を重ねる
以下を追記します。
absoluteは、親要素を基準に、絶対的な位置を決めるので、`top: 0;` `left: 0;` を指定すると、文字は `box` classの左上に配置されます。
例えば、`top: 50px;` `left: 100px;` とすれば、文字は `box` classの上から50px、左から100pxの位置に配置されます。

```:CSS
.box {
   position: relative;
}

.box p {
   position: absolute;
   top: 0;
   left: 0;
}
```
cronが動かない時

これまでに数回 crontab で設定した処理が動かなかったことがある。

/var/log/cron を見て、該当時間帯に動いた形跡が無いか確認。

何も考えずにサービス再起動すると基本的に直った。

設定しているスクリプト名に ^I が混じっていたこともあり、
恐らくTabキーを押してしまったものと思われる。（消して保存したら動いた）
Firebase Auth REST API で IdToken を取得/更新する

# 概要

Firebase Auth REST API を使った認証についての自分用メモ。
FirebaseSDK が使えない環境や、REST クライアントでのユーザー認証の検証で役に立つ。

本記事で行うのは下記の2つ、IdToken は HTTP リクエスト時の Bearer トークンになる。

- IdTokenを取得する
- IdTokenの更新を行う

詳しくは [Firebase Auth REST API](https://firebase.google.com/docs/reference/rest/auth/) を参照。

# APIキーを取得する

Firebaseダッシュボード -> プロジェクトの設定 -> 全般 -> ウェブAPIキー。

# IdTokenを取得する

IdToken は1時間で無効になるので、IdToken を更新できる RefreshToken も取得しておく。
[ユーザーセッションの管理 | Firebase](https://firebase.google.com/docs/auth/admin/manage-sessions?hl=ja)

POST: https://www.googleapis.com/identitytoolkit/v3/relyingparty/verifyPassword?key=[APIキー]

```request.json
{
  "email": "example@example.org",
  "password": "testtest",
  "returnSecureToken": "true"
}
```

```response.json
{
"kind": "identitytoolkit#VerifyPasswordResponse",
"localId": "******************",
"email": "example@example.org",
"displayName": "",
"idToken": "[IdToken]",
"registered": true,
"refreshToken": "[RefreshToken]",
"expiresIn": "3600"
}
```

# IdTokenを更新する

IdToken 取得時に一緒に取得した RefreshToken を利用する。
ここで返ってくる RefreshToken はリクエストのものと同じになるので更新の必要は無い。

POST: https://securetoken.googleapis.com/v1/token?key=[APIキー]

```request.json
{
  "grant_type": "refresh_token",
  "refresh_token": "[RefreshToken]"
}
```

```response.json
{
  "access_token": "****************",
  "expires_in": "3600",
  "token_type": "Bearer",
  "refresh_token": "[RefreshToken]",
  "id_token": "[IdToken]",
  "user_id": "**************",
  "project_id": "**************"
}

```
JS~ハートが可愛く回るよ♥②~

前回の記事でクリックするとピンクのハートが赤になるように実装しました！！次はハートがクリックで回るようにしていきたいとおもいます！！

この操作は、JSではなくCSSにて実装していきます！！


```style.css
 <style>
.heart {
  width: 100px; 
  height: 100px; 
  position: relative;
  cursor: pointer;
  transition: 0.2s;
}
.heart::before,
.heart::after {
  content: "";  
  width: 50%;   
  height: 80%; 
  background: pink;
  border-radius: 25px 25px 0 0; 
  display: block; 
  position: absolute; 
}
.heart::before {
  transform: rotate(-45deg); 
  left: 14%;                
}
.heart::after {
  transform: rotate(45deg);  
  right: 14%;                
}

.circle {
  width: 100px;  
  height: 100px; 
  position: relative;
  cursor: pointer;
  transform: rotate(360deg);
}
.circle::before,
.circle::after {
  content: ""; 
  width: 50%;   
  height: 80%; 
  background: red; 
  border-radius: 25px 25px 0 0; 
  display: block;
  position: absolute; 
}
.circle::before {
  transform: rotate(-45deg); 
  left: 14%;                
}
.circle::after {
  transform: rotate(45deg);  
  right: 14%;               
}

</style>
```

まず、heartにtransitionをつけ加えます！これは、ハートがくるっと回るまでの時間を指定します！！
今回は、0.2秒で指定しました👍

そして、circleにtransformを追加します。
このプロバティは要素を回転、拡大縮小、傾斜、移動することできます！！
詳しくはこちらのページをどうぞ！！

https://developer.mozilla.org/ja/docs/Web/CSS/transform

ハートが可愛く回ったかなとおもいます！！♥
addEventListenerメソッドを使ったクリックイベント 



##「Hello world!」をクリックすると「こんにちは、世界！」と文字が変わるイベント


```html:html
<p id="hoge">Hello world!</p>
```


```css:css
#hoge {
  color: red;
  cursor: pointer;
}
```
###Javascript
`#hoge`をクリックするたびにクラス`on`の追加と削除を行います。
もし`on`が含まれていたら<b>「こんにちは、世界！」</b>、それ以外は<b>「Hello world!」</b>と表示します。

```javascript:javascript
const hoge = document.querySelector('#hoge');
hoge.addEventListener('click', e => {
	hoge.classList.toggle('on');
	if( hoge.classList.contains('on') == true ){
		hoge.innerHTML = 'こんにちは、世界！';
	} else {
		hoge.innerHTML = 'Hello world!';
	}
});
```


###サンプル
<p class="codepen" data-height="265" data-theme-id="dark" data-default-tab="js,result" data-user="sugoi-reirei" data-slug-hash="BapWrwM" 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="BapWrwM">
  <span>See the Pen <a href="https://codepen.io/sugoi-reirei/pen/BapWrwM">
  BapWrwM</a> by reirei (<a href="https://codepen.io/sugoi-reirei">@sugoi-reirei</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>
javascript switch文のイメージ

let 運転切り替え = 暖房;
switch (運転切り替え) {
  case 冷房:
    温度を下げます;
  break;

  case 暖房:
    温度を上げます;
  break;

  case 送風:
    風を送ります;
  break;

  default:
    自動で判断します;
}
ブロックチェーンとスマートコントラクト

ビットコインなどの主に仮想通貨取引に用いられる、ブロックチェーン技術は「P2Pネットワーク」、「コンセンサスアルゴリズム」、「偽造防止・暗号化技術」、「スマートコントラクト」など複数の技術によって支えられています。
この記事ではその内の「スマートコントラクト」　について説明します。
##スマートコントラクトとは
結論からいうと、**「第三者が介在しない契約の自動化技術」**のことです。
これはよく自動販売機に例えられます。
飲み物を提供する自動販売機とそれを購入したい人との間の購入契約には第三者が介在しません。

言葉の意味としては直訳するとスマートコントラクト= 賢い契約 という意味ですが、
普通の契約においては、契約自体を管理する仲介者が存在します。

銀行の送金や、クレジットカードでの支払い、通販でものを購入するにしても、販売者と購入者の間には契約を管理している第三者がいますが、スマートコントラクトでは、これらの様に第三者を介さず、ネットワークで繋がっている相手と直接取引が可能になります。

まず契約を結ぶ取引には重要なポイントが2つあります。
1. 合意の上での契約内容が取引中に変更されないこと
2. 取引が契約内容に沿って正しく実行されること

今までの普通の契約では、これらを第三者が管理することによって、正しく取引が行われる様になっていました。
しかし、ブロックチェーン技術に含まれる「P2Pネットワーク」「偽造防止・暗号化技術」によって、この2つのポイントが守られ、ネットワークにおいて第三者が介在しない、賢い契約＝スマートコントラクトが実現出来るのです。

##スマートコントラクトの利用

ビットコインにはスマートコントラクトの様な機能はありません。
スマートコントラクトを用いたものの代表例に**イーサリアム**があります。

イーサリアムは、カナダ人のヴィタリク・ブテリンが発明した、スマートコントラクトを機能を初めて扱える様にしたブロックチェーンです。
イーサリアムの様なブロックチェーンは**分散型プラットフォーム**とも呼ばれ、
スマートコントラクト機能を用いて、ブロックチェーン上(オンチェーン)でプログラムが実行できます。そのプログラムの実行には、**Solidity言語**という専用の言語を主に用います。
これらを利用して、現在ではゲーム開発や、SNS開発など様々なプロダクトが開発されでいます。
またその様なプロダクトことをDecentralized applications（＝分散型アプリケーション）の略で**DApps**(ダップス)と呼んでいます。


参考記事
・スマートコントラクトとはhttps://www.tottemoyasashiibitcoin.net/entry/2016/09/12/091414
・ブロックチェーンで自動契約！スマートコントラクトの事例と仕組みhttps://bitcoin.dmm.com/column/0138
・ビットコインとイーサリアムの違いとは？初心者でもわかる主要仮想通貨の比較
https://hedge.guide/feature/difference-bitcoin-ethereum.html
GFF AWARD2021の最終選考を終えて感想と優秀賞を受賞したADDSEVENの紹介

##初めに
先日GFFAWARDの授賞式と大賞の発表がありました。
私は、__ADDSEVEN__の__Team ASK__のリーダーとして参加してきました。
福岡を代表するゲーム企業の代表や社長などがいてかなり緊張しました。。。![gfad7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268440/b426e871-5c06-e4e7-b193-18a621d2779c.png)


##GFFAWARDってなに？
GFFとは、九州・福岡を、ゲーム産業、デジタルコンテンツ産業の世界的開発拠点とすることを目的に活動している、九州・福岡のゲームソフト制作関連会社による任意団体。「GAME FACTORY'S FRIENDSHIP」の略称。
メンバー企業にはレベルファイブやサイバーコネクトツーなど有名企業がたくさん！
今年は__1800__を超える作品の応募があり日本一？大きいゲームコンテスト(ゲームは260作品らしい)
[GFFAWARD公式サイト](http://fukuoka-game.com/)
##結果
TSUKUMO賞と大賞は取れませんでしたが...
実質的な__2位__を取れました！
1位が同じ学校の人たちだったので悔しかったですが260作品の2位になることができて嬉しいです。
やっぱり１位を取れないのは悔しい
##授賞式を終えて感想
正直自分たちの作品がこんなにも色々な人に見てもらい褒めてもらえるなんて思ってなかった。
日本一大きいゲームコンテストで優秀賞を受賞することが出来たのは今後のゲーム制作のモチベーション向上につながった。
他校の受賞作品のレベルの高さを見て自分もエンジニアとして負けてられないと感じた。
来年は絶対に大賞を取りたいと強く思った。というか取る
##ADDSEVENの紹介
![ADDSEVENimage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268440/7d2be3ae-5fff-76ab-4008-ddb59d545673.png)

コンセプトは__やってみると意外と解ける__
見た目は難しそうだけどプレイしてみたら意外と解けるかも！！みたいな
簡単に説明するとサイコロの面と面を足して__7__になるとサイコロがくっついて一緒に動かせる
3+4=__7__だからADDSEVEN(アッドセブン)
詳しくは[プレゼン動画](https://youtu.be/7WLX8YSetuQ)を見てください(プレゼンしているのはチームメンバーの人です。)
##ADDSEVENの技術的なアピールポイント
ステージを制作、修正できる__ステージエディタ__を制作！![editorscreenshot.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268440/71a6d8ed-7cee-e3d3-e67e-f966f908158e.jpeg)
エディタで制作したステージのデータを__Json形式__で吐き出してUnityの__StreamingAsset__内に入れるだけでステージを増やすことが可能に！
多次元配列を使用したプレイヤーの移動。一手戻る、手数の判定、手数による評価の保存、視点切替、ヒント機能など従来のパズルゲームと同じ要素もたくさん入っています。
##最後に
このADDSEVENを制作して一番いい賞ではなかったけど受賞をすることができていい経験になった。
この経験を活かして今後エンジニアとしてもっといい作品を作れるようになる。
プログラマーとしてだけではなくリーダーとしてもかなり成長できた気がする。
やっぱり__1位__を取らないと意味がないからGFFAWARD2022は大賞を本気で狙いに行く！！
最後にADDSEVENの実行ファイル公開します。(YouTubeの説明欄にダウンロードリンク貼ってあります)
[ADDSEVENのPVとダウンロードリンク](https://youtu.be/B5IWYorE4Rk)
MaxSessionの変更方法

以下エラーメッセージがsecureに出力された場合、Max Sessionの数値を変更する可能性があります。


```
Received disconnect from 172.22.206.170 port 64269:2: disconnected by server request
```


MaxSessionsは/etc/ssh/sshd_configにて変更可能です。

```
#MaxSessions 10
↓
MaxSessions 50
```

MaxSessionsの説明は、```https://cloud6.net/so/ssh/1248050```の通りです。

```
MaxSessions
     Specifies the maximum number of open shell, login or subsystem
     (e.g. sftp) sessions permitted per network connection.  Multiple
     sessions may be established by clients that support connection
     multiplexing.  Setting MaxSessions to 1 will effectively disable
     session multiplexing, whereas setting it to 0 will prevent all
     shell, login and subsystem sessions while still permitting for-
     warding.  The default is 10.

 MaxStartups
     Specifies the maximum number of **concurrent   unauthenticated con-
     nections to the SSH daemon.**  Additional connections will be
     dropped until authentication succeeds or the LoginGraceTime
     expires for a connection.  The default is 10:30:100.

     Alternatively, random early drop can be enabled by specifying the
     three colon separated values ``start:rate:full'' (e.g.
     "10:30:60").  sshd(8) will refuse connection attempts with a
     probability of ``rate/100'' (30%) if there are currently
     ``start'' (10) unauthenticated connections.  The probability
     increases linearly and all connection attempts are refused if the
     number of unauthenticated connections reaches ``full'' (60).
```


以上
【JSP】JSTLを使ってjspを記述する

##はじめに
JSTLを使ってjspを記述するために必要な手順を記載します。

##１．jstl-api-1.2.jarファイルダウンロード
https://mvnrepository.com/artifact/javax.servlet.jsp.jstl/jstl-api/1.2


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573636/d1679f42-5ae4-d884-bbc9-b79cf3d458ce.png)

##２．jstl-impl-1.2.jarファイルダウンロード
https://mvnrepository.com/artifact/org.glassfish.web/jstl-impl/1.2

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573636/d690515e-cf9a-6737-be35-e154dc82b484.png)


##３．ファイル格納
WEB-INF/libに2つのjarファイルを格納する。

##４．jspファイルでjstlを記述

```
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<html lang="ja">
    <head>
        <meta charset="UTF-8">
        <title>全件検索結果</title>
    </head>
    <body>
        <table border=1>
            <tr><th>id</th><th>title</th><th>content</th></tr>
            <c:forEach var="dto" items="${queryAll}">
                <tr>
                    <td>${dto.id}</td>
                    <td>${dto.title}</td>
                    <td>${dto.content}</td>
                </tr>
            </c:forEach>
        </table>
    </body>
</html>
```



##参考
https://sukkiri.jp/technologies/libraries/jstl/jstl_install.html
【VBA】範囲指定して値を削除する方法

今回は、範囲指定して値を削除する方法です。

サンプルデータは以下の図をご覧ください。
![20210402_134829.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1242278/788f001a-e502-f595-e914-a749897e722a.jpeg)
見積書の18行～29行目までの値を削除しようと思います。

↓実演動画
https://youtu.be/rwwdop8m7oI

ソースコードは下記の通りです。

```

Sub 範囲指定して値をクリアする()

    Range(Range("A18"), Cells(29, 17)).ClearContents

End Sub


```

詳細を説明します。

>Range(Range("A18"), Cells(29, 17)).ClearContents

Rangeで対象範囲を指定しています。
「ClearContents」で値を削除しています。

詳細は、下記のサイトが参考になるかと思います。
https://www.vba-ie.net/method/clearcontents.php

以上が、範囲指定して値を削除する方法でした。
ColaboratoryでGoogle Driveの共有アイテム(Shared drives)を開けなくなったその時に

https://research.google.com/colaboratory/faq.html?hl=ja

Google Colaboratoryほんと便利です。

そんな便利なColaboratoryですが……

# いつからか共有アイテムがマウントされなくなりました

以前の記憶なので少し曖昧なのですが

![2021-04-02_13h07_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217361/f3219e05-81b3-4a88-5b25-9b2eb46d00bb.png)

![2021-04-02_13h08_40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217361/63aba897-f5be-6324-8c5d-bde3df9abc47.png)

```python:hogehoge.ipynb
from google.colab import drive
drive.mount('/content/drive')
```
これらの方法でGoogle Driveをマウントしたときに`content/Shared drives`がマウントされていたと思うのですが、いなくなってしまいました。

## 参考リンク

https://ja.stackoverflow.com/questions/68173/googlecolab-%E3%81%8B%E3%82%89googledrive%E3%81%AE%E5%85%B1%E6%9C%89%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%81%AB%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%87%BA%E5%8A%9B%E3%81%97%E3%81%9F%E3%81%84

https://qiita.com/kado_u/items/45b76f9a6f920bf0f786

## 現在Google Driveをマウントすると

![2021-04-02_13h19_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217361/5c8f284e-5227-7775-c347-a4f834389fa4.png)

`Shared drives`さんが行方不明になりました(´・ω・｀)



#それでも共有アイテムを使いたい

そうです、使いたいんです。

安心してください、共有アイテムを使う方法がありました！

![2021-04-02_13h22_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217361/586c6107-2e81-33ad-c2ed-bd9c50a1592e.png)

いつからか共有アイテムを右クリックすると`ドライブにショートカットを追加`をすることができるようになっています。

これでマイドライブに共有アイテムのショートカットを追加するとあら不思議。

マイドライブの中にあるようにアクセスすることが可能になります！

```python:hogehoge.ipynb
%cd /content/drive/MyDrive/hogehoge
%ls
```
これでちゃんとマウントされているかを確認してみてください😆


```python:hogehoge.ipynb
import os
os.chdir('/content/drive/MyDrive/hogehoge/')
```

こうしてカレントディレクトリに追加することでそのディレクトリ内のファイルも参照可能になります。


共有アイテム難民の方の力になれるとうれしいです！

#おまけ

以前はカレントディレクトリを追加するときこうしていました。

```python:hogehoge.ipynb
import os
os.chdir('/content/drive/My Drive/hogehoge/')
```

`My`と`Drive` はソーシャルディスタンスを保っていたはずです。

現在は`My Drive`としてしまうとファイル参照できなくなります(´・ω・｀)

`MyDrive`にしてくっつけてあげましょう！




たまにこんなことをTwitterでつぶやいています。
フォローお待ちしております＼(^o^)／

https://twitter.com/tbshiki/status/1377633460358062080

https://twitter.com/tbshiki/status/1377634341195407363
Microsoft 365 (Office 365）on Macのライセンス認証を解除する

# Only Summary
所属が変わってMS Officeのライセンスを設定し直さないといけないけど，Office製品のアンインストールはできればやりたくないと思ってライセンスだけ解除する方法を日本語で調べたのですがパッと出てこなかったのでメモしておきます．

0. とりあえずOffice製品はアプリケーションを終了しておく
1. 以下のURLから `license removal tool` なるものをダウンロードする
    * https://support.microsoft.com/en-us/office/how-to-remove-office-license-files-on-a-mac-b032c0f6-a431-4dad-83a9-6b727c03b193
2. ダウンロードしたpkgファイルを起動していわゆるインストール作業をする（インストール作業に見せかけてライセンスを解除する仕様の模様）
3. Word，Excelなど適当なOffice製品を起動するとアクティベートを促される．
AtCoder Beginner Contest 197　備忘録

AtCoder Beginner Contest 197の備忘録
https://atcoder.jp/contests/abc197

A：AC
B：AC
C：分からなかったので飛ばし
D：AC
E：未着手
F：未着手

A - Rotate
https://atcoder.jp/contests/abc197/tasks/abc197_a
3文字の文字列Sを先頭文字だけ末尾に移動させる問題。
Stringで読み込んで文字を入れ替えて出力するだけ。
文字数が3文字固定なので、coutで1文字ずつ出力。
簡単。

```php
#include <bits/stdc++.h>
#include <math.h>
using namespace std;
 
int main() {
    string S;
    cin>>S;
    cout<<S.at(1)<<S.at(2)<<S.at(0)<<endl;
}
```

B - Visibility
https://atcoder.jp/contests/abc197/tasks/abc197_b
H×Wのマス目で、各点から見えるマス目をｶｳﾝﾄする問題。
各点から縦の±方向、横の±方向に対して探索し、障害物(#)がなかったら＝(.)だったら、countをインクリメントする。
4方向あるので、4方向分のif分岐を作って全探索。
「マス目自身を含む」なので、最後に+1だけいれとく。

```php
#include <bits/stdc++.h>
#include <math.h>
using namespace std;
 
int main() {
 
int H,W,X,Y;
char S[110][110];
int count =0;
cin>>H>>W>>X>>Y;
for(int i=1;i<=H;i++){
    for(int j=1;j<=W;j++){
        cin>>S[i][j];
    }
}
 
for(int i=1;i<100;i++){
    if(S[X+i][Y]=='.'){
        count++;
    }
    else{
        break;
    }
}
for(int i=1;i<100;i++){
    if(S[X-i][Y]=='.'){
        count++;
    }
    else{
        break;
    }
}
for(int i=1;i<100;i++){
    if(S[X][Y+i]=='.'){
        count++;
    }
    else{
        break;
    }
}
for(int i=1;i<100;i++){
    if(S[X][Y-i]=='.'){
        count++;
    }
    else{
        break;
    }
}
cout<<count+1<<endl;
}
```


D - Opposite
https://atcoder.jp/contests/abc197/tasks/abc197_d
N=偶数の正N角形において、ある頂点(x0,y0)とその対角の頂点(xN/2, yN/2)が与えられる。
指定頂点の次の点である、(x1,y1)を求める問題。
正N角形であり、2点が定められるので、当然ながら残りの点は一義的に決まる。
正N角形なので、必ず頂点は円の軌跡上に存在する。
なので、円を回転中心として、ある点からN/360°回転させると、必ず次の頂点になる。

よって、
・円の中心座標　　= {(x0+xN/2)/2, (x0+xN/2)/2}
・回転させる角度　= N/360度
から、(x0,y0)を回転移動させるﾌﾟﾛｸﾞﾗﾑを書いちゃおう。

と思ったけど、座標回転ってどうやるのか忘れてたのでググりました。
http://www.geisya.or.jp/~mwm48961/kou2/linear_image3.html


```php
#include <bits/stdc++.h>
#include <math.h>
using namespace std;
static const double pi = 3.141592653589793;
 
int main() {
    double N, x0, y0, xn2, yn2,x1,y1,si,Ox,Oy;
    cin>>N>>x0>>y0>>xn2>>yn2;
    si=(2*pi)/N;
    Ox=(xn2+x0)/2;
    Oy=(yn2+y0)/2;
 
    x1=cos(si)*(x0-Ox)-sin(si)*(y0-Oy)+Ox;
    y1=sin(si)*(x0-Ox)+cos(si)*(y0-Oy)+Oy;
 
    cout<<x1<<" "<<y1<<endl;
 
}

```


3問ﾄｹﾀ―
Cむずい。問題の意図を理解するのに時間がかかるけど、bit全探索というらしい。
後日勉強。

Cはこっちで解いた。
https://qiita.com/ichihey/items/8d59d607ede55e3ad897
Visual Studio Code でPythonファイルをデバッグする方法

#デバッグとは

まず、デバッグとは何なのか。Wikipediaによると、
>デバッグ（debug）とは、コンピュータプログラムや電気機器中のバグ・欠陥を発見および修正し、動作を仕様通りのものとするための作業である。

つまり、デバッグを行うことでコードの中の問題点をより早く修正することができます。

#Visual Studio CodeでPythonファイルをデバッグする方法
##拡張機能をインストール
まず、画面左のバーの中からExtentionsというボタンをクリックし(もしくはコマンドでCtrl＋ Shift＋ X)、Pythonと検索し、画像にあるPythonという拡張機能をインストールしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693681/4613ea9b-1197-b515-2a24-ea1f0ccd0454.png)

##ファイルを実行する
実行したいファイルに移動して、Runの中のStart DebuggingもしくはF5をクリックし、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693681/62c3bd4d-8dcf-2374-3a04-e7fdee6a5aa0.png)

Python Fileを選択してください。すると、すぐにデバッグが始まります。でもこのままではプログラムが止まることなく最後まで実行されてしまいます。それではデバッグの意味が無いので次の操作をします。
##ブレークポイント(Breakpoint)を設定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693681/89296ee8-6c71-53b3-77e3-a8670a037832.png)

この画像の行数の左側にある赤い丸がブレークポイントです。デバッグを始めると、この行で実行を止めてくれます。設定の仕方は赤丸の位置をクリックするだけです。解除も同様にできます。また、ここで最も大事なことはブレークポイントで実行が止まりますが、**その行はまだ実行されていない**ということです。もしの画像の状態でデバッグをすると2行目まで実行され、3行目は実行されずに止まります。

##デバッグ中に出てくるバーについて
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693681/6896cc94-ba1c-2472-9179-eb0cbd68a316.png)
デバッグを始めると上の画像のようなバーが出てきます。左から、Continue,Step Over, Step Into, Step Out, Restart, Stopとなっています。簡単に解説すると次のようになっています。
###Continue
次のブレークポイントまでプログラムを実行
###Step Over
プログラムを一行だけ実行
###Step Into
関数が呼ばれるとその中に入ってプログラムを実行
###Step Out
入っている関数から抜け出す
###Restart
一度プログラムの実行をやめて、再び実行を始める
###Stop
プログラムの実行を終了する


##デバッグ中に役立つ知識
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693681/b9ac9284-0b4a-a3c3-ef3d-18cdbd99442b.png)

このプログラムを4行目まで実行して```dt_now```にカーソルを合わせると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693681/13d1469c-dec6-85da-6b85-9407775aa96e.png)
このようにdt_nowの中に入っている値をすべて見ることができます。
例えばここで

```python
print(dt_now.second)
```
とすると46が取り出せます。
変数の中にどんな値が入っているのか調べるためにprintを使っているととても大変です。しかしデバッグをすると一発で分かってしまいます。これがデバッグを行う一番のメリットだといっても過言ではないと私は思います。

#最後に
ぜひあなたがこれまでデバッグを試したことなければ、一度でいいので試してみてください。
iPhone Simulatorのgifを作成するShellScript

# 動作環境
- macOS

# 前提条件
- ffmpegがインストールされていること

# ShellScript

以下のファイルを `isimgif` という名前でPATHの通った場所に配置してください。

```shell
#!/bin/sh

date=`date +%Y%m%dT%H%M%S`
mov_name=isim_$date.mov
gif_name=isim_$date.gif
function stopped () {
  ffmpeg -i $mov_name -vf scale=320:-1 -r 10 $gif_name > /dev/null 2>&1
  echo "Created $mov_name and $gif_name"
}
trap 'stopped' 2
echo 'Simulatorの録画を開始します... 録画を終了する場合は、 Ctrl+C を押下してください'
xcrun simctl io booted recordVideo $mov_name
```

# 実行方法

```terminal
% isimgif
Simulatorの録画を開始します... 録画を終了する場合は、 Ctrl+C を押下してください
Recording started
^CWrote video to: isim_20210402T130250.mov
Created isim_20210402T130250.mov and isim_20210402T130250.gif
```

# 参考
- [iPhoneのシミュレータで動画を撮影する方法](https://qiita.com/Sho-heikun/items/62b0b8b4150a1c401e3a)
- [androidのスクリーンショットやムービーを取得するためのシェルスクリプト](https://qiita.com/k-yamada-github/items/47ff635432158bbeb3f4)
Excelのユーザ定義まとめ

今回は、Excelの書式をまとめてみました。
●日付関係
=
　1、「年」に関するもの
　　・yy：西暦下2桁で表示
　　※例：2021/1/1　→　21
　　・yyyy：西暦下4桁で表示
　　※例：2021/1/1　→　2021
　　・e：元号で表示した時の年数を表示
　　※例：2021/1/1　→　3
　　・ee：元号で表示した時の年数を2桁で表示
　　※例：2021/1/1　→　03
　　・g：元号のアルファベットの頭文字（M、T、S、H、R）で表示する。
　　※例：2021/1/1　→　R
　　・gg：元号の漢字の頭文字（明、大、昭、平、令）で表示する。
　　※例：2021/1/1　→　令
　　・ggg：元号の漢字（明治、大正、昭和、平成、令和）で表示する。

　２、「月」に関するもの
　　・m：月の値を表示。
　　※例：2021/1/2　→　1
　　・mm：1桁の月は0を付けて、2桁で表示
　　※例：2021/1/2　→　01
　　・mmm：英語の月の頭文字3文字 (Jan～Dec) を表示
　　※例：2021/1/2　→　Jan
　　・mmmm：英語の月 (January～December) を表示
　　※例：2021/1/2　→　January
　　・mmmmm：英語の月の頭文字 (J～D) で表示
　　※例：2021/1/2　→　J
　　
　３、「日」に関するもの
　　・d：日にちを表示
　　※例：2021/1/2　→　2
　　・dd：1桁の日にちには0をつけて2桁で表示
　　※例：2021/1/2　→　02
　
●時間関係
=
  １、「時刻」に関するもの
　　・h：時刻 (0～23) を表示
　　※例：01:05:08　→　1
　　・hh：1 桁の時刻には 0 を付けて時刻 (00～23) を表示
　　※例：01:05:08　→　01
　　
　２、「分」に関するもの
　　・m：分(0～59)を表示
　　※例：01:05:08　→　5
　　・mm：1桁の分は、0を付けて分(00～59)を表示
　　※例：01:05:08　→　05
　　
　３、「秒」に関するもの
　　・s：秒(0～59)を表示
　　※例：01:05:08　→　8
　　・ss：1桁の秒は0を付けて秒(00～59)を表示
　　※例：01:05:08　→　8

　４、AM/PM (午前/午後)を付ける
　　・h AM/PM：12時間表示で時刻の後にAMまたはPMを表示
　　※例：01:05:08　→　1 AM
　　・h:mm AM/PM：12時間表示で時間と分の後にAMまたはPMを表示
　　※例：01:05:08　→　1:05 AM
　　・h:mm A/P：12時間表示で時間と分の後にAまたはPを表示
　　※例：01:05:08　→　1:05 A

●曜日関係
=
　・aaaa：曜日付で表示
　※例：2021/1/2　→　土曜日
　・aaa：曜日無で表示
　※例：2021/1/2　→　土
　・dddd：英語表記で表示
　※例：2021/1/2　→　Saturday
　・ddd：英語の頭文字3文字で表示
　※例：2021/1/2　→　Sat

●金額関係
=
　・#,##0：3桁ごとにカンマを付ける
　※例：1000000　→　1,000,000
　・¥#,##0：￥マークを付けて表示
　※例：1000000　→　￥1,000,000
JS~ハートが可愛く回るよ♥①~

今回は♥が可愛く回るのをJSで再現していきたいと思います！！
また、自分でハートを作るんも大変なので、コピペでやらせて頂いたのを貼っときます😊💕

https://qiita.com/7note/items/3b640d031e83f82a81c1

それでは、早速JS側の実装に入っていきます。

```index.html
<div class="herart" id="target"></div>
```

```heart.js
<script>
    'use strict';

    document.getElementById('target').addEventListener('click', () => {
      document.getElementById('target').classList.add('circle')
    });

  </script>
```

今回cssの実装は上記の記事のソースコードをみてください！！

document.getElementById('target') ▶　HTMLのtarget要素を指定します！
 documentはこの文章全体を指し、getElementByIdは文章の中で指定しているid取得してね！って意味になります。またidはこのファイルの中で１度のみの使用になります！！
addEventListener　▶　何かが起きたら何かの処理をしてくださいという意味です。

で、この中にまとめて処理を次々に書いていきます！アロー関数と言います。

この中の処理としてclassList.addを追加します！これは、特定の要素のクラス名を追加したり、削除したり、参照したりすることが出来るプロバティになります！！

#アロー関数とは
通常のfunction関数よりも短く書くことができる関数です。

```fun.js
let fruit = function() {
  document.write('フルーツ大好き！！')
}

fruit();
```
👇 functionでは引数が必要ですが

```aro.js
let fruit = () => {
  document.write('フルーツ大好き')
}

fruit();
```
アロー関数では省略することができます！


現状はクリックで色が変わるようになったかなとおもいます！！