OmniAICreator/Qiita-1.07M huggingface dataset:
【Laravel】storageシンボリックリンクがうまくいかない

画像を含む投稿機能で画像を/storage/app/public内に保存し、$php artisan storage:linkでstorageフォルダにシンボリックリンクを追加したつもりだが、画像が表示されなかった。

```php:blade.php
<img src="{{ asset('/storage/'.$post->image)}}">
```

![ad1583b750e36fad410e98472a740245.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/848640/1413d8cd-c808-49e0-c66e-6e1d0aa1b248.png)


##結論
storageフォルダを削除し、再度storageフォルダにシンボリックリンクを追加するとうまくいった。

```
$ php artisan storage:link
```

##原因
詳しくはわかっていないが、よく見るとstorageフォルダに何も保存されていなかった。
また、シンボリックリンクのパスが指定されていなかった。

```
$ ls -la public

省略
drwxr-xr-x  2 _apt ssh    64  2月 16 03:07 storage
```

↓再度storageフォルダにシンボリックリンク追加後

```
$ ls -la public

省略
drwxr-xr-x  2 _apt ssh    64  2月 16 03:44 storage -> /var/www/アプリ名/storage/app/public // 自分の場合
```

##参考
https://tac-blog.tech/index.php/2018/08/27/laravel-symlink/
ajax(jQuery)からSigfoxメッセージ取得

DEVICE_ID, USERNAME, PASSWORDはご自身の環境に合わせてください。

```ajax_get_sigfox_messages.html
<html>
	<head>
		<title>client</title>
		<script type="text/javascript" src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
		<script type="text/javascript">
		function getmessages() {
			$.ajax({
				url: "https://api.sigfox.com/v2/devices/DEVICE_ID/messages",
     			success: function(data){
     				$('#result').html(JSON.stringify(data));
     			},
				error: function(jqXHR, textStatus, errorThrown){
						alert(textStatus+": "+errorThrown);
				},
				beforeSend: function(xhr) {
					var credentials = window.btoa("USERNAME:PASSWORD");
				    xhr.setRequestHeader("Authorization", "Basic " + credentials);
				},
			});
		}
		</script>
	</head>
	<body>
		<button onclick="getmessages();">Get Sigfox Device Messages</button>
		<div id="result"></div>
	</body>
</html>
```
Rでヒストグラムを複数表示

# はじめに

データ分析をするときにはヒストグラムを表示させて特徴を見る。その際、2つのデータの特徴を見比べるためにも同時に表示させるとわかりやすい。

# 画面分割
Rでは par関数 を使用することで R Graphics 画面を分割でき、その後ヒストグラム表示を行えば2つを同時に表示することができる。

```r:par.R
par(mfrow=c(2,1))
hist(x, breaks=seq(0, 600, 60))
hist(y, breaks=seq(0, 600, 60))
```

par関数の引数は mfrow だけでなく mfcol でもよい。mfrow=c(2,1) と mfcol=c(1,2) は同じ分割となる。上記コードの出力結果は以下のようになる。

![hist.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/769545/11cd2ce5-b91d-53b9-a6b3-3130b093a835.png)
ケプストラム解析の自分用まとめ

# はじめに
このページは自分用に下記ページを書き直した物です
もしケプストラムの解説を求めて当ページに来た方がいましたら下記のページを御覧ください
[ケプストラム分析 - 人工知能に関する断創録](https://aidiary.hatenablog.com/entry/20120211/1328964624)
[メル周波数ケプストラム（MFCC） - Miyazawa’s Pukiwiki](http://speechresearch.fiw-web.net/66.html)

# ケプストラム解析

**ケプストラム**（英: Cepstrum）とは、音のスペクトルを信号と見なしてフーリエ変換 (FT) した結果である。"spectrum" の最初の4文字をひっくり返した造語。ケプストラムには、複素数版と実数版がある。

ケプストラムは、**異なるスペクトル帯における変化の度合いに関する情報**と見ることができる。本来、地震や爆弾の爆発を原因とする地震性反響の特性を調べるために考案された。また、レーダー信号の反射を解析するのにも使われてきた。(wikipediaより)

ケプストラム解析の用途として、スペクトルの周期情報の抽出、スペクトルの包絡線（エンベロープ）をもとめる、ことなど

# 概要

**口語的定義**: （信号の）ケプストラムとは、（信号の）フーリエ変換の対数（位相アンラッピングを施したもの）をフーリエ変換したものである。**スペクトルのスペクトル**とも呼ばれる。

**数学的定義**: 信号のケプストラムは FT(log(|FT(信号)|)+j2πm) である。ここで m は、複素対数関数の虚数成分または角度の位相アンラッピングを正しく行うのに必要とされる整数である。

**アルゴリズム的定義**: **信号 → FT → abs() → log → 位相アンラッピング → FT → ケプストラム**

# 計算

元データ

![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401318/6193532d-fccb-139f-8415-7efe36d4abc7.png)


窓関数をかける

$w(x)=0.5-0.5cos2πx, if0≦x≦1$(ハン窓の場合)

```python
import numpy as np
# ハニング窓をかける(窓関数はハミング窓等も可能)
hanningWindow = np.hanning(len(wavdata))
wavdata = wavdata * hanningWindow
```

![Untitled 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401318/323f7439-cfe1-c197-21ff-d129f0ff5792.png)


フーリエ変換する(振幅は合わせてない)

```python
n = 2048  # FFTのサンプル数 2のn乗
# 離散フーリエ変換
dft = np.fft.fft(wavdata, n)
# 振幅スペクトル
Adft = np.abs(dft)
# パワースペクトル
Pdft = np.abs(dft) ** 2
# 周波数スケール
fscale = np.fft.fftfreq(n, d = 1.0 / fs)
```

![Untitled 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401318/26663f18-e978-5595-6902-0d7d4e5af24e.png)


対数スペクトルにする $Y(x)=log_{10}(x)$
(この時$Y(x)=20log_{10}(x)$にするとdBの単位になる？)

```python
# 対数振幅スペクトル
AdftLog = 20 * np.log10(Adft)
# 対数パワースペクトル
PdftLog = 10 * np.log10(Pdft)
```

![Untitled 3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401318/83bc745b-e05a-e4ea-7dbb-1a9a50e669f9.png)


なだらかに変動する**スペクトル包絡**（赤線）と細かく変動する**スペクトル微細構造**（青線）があることがわかる

すなわち、フーリエ変換の結果も周期性のある信号であるといえる

![Untitled 4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401318/455bcfde-c816-f411-28c3-986017aab947.png)

フーリエ変換後のスペクトルは色々な振動がかけ合わさった物(畳み込まれた物)といえるが、対数をとってやることで単純に足し合わせた物として考える事ができる

→分離ができる

- スペクトル領域では$Y(w)=S(w)H(x)$
- 対数スペクトル領域では$Y(w)=S(w)+H(x)$

# ケプストラム（cepstrum）

対数スペクトルをもう一度フーリエ変換にかけて、音源の周波数と声道の周波数を切り分けることを考えます

- フーリエ変換のフーリエ変換は、フーリエ変換の結果に対して逆フーリエ変換をかけるのと同じ処理になる
- 対値をとっているので、（実数ケプストラムでは）位相スペクトルの情報は消える

**y軸**：**ケプストラム**
スペクトル領域を逆フーリエ変換するので元の時間領域に戻るが、対数をとっているので元の信号にはならずに*ケプストラム*（cepstrum）と呼ばれるものになる

**x軸：ケフレンシー**
周波数の逆数のようなものなのでケフレンシー（quefrency）一応尺度的には時間の尺度

```python
# ケプストラム分析
# 対数スペクトルを逆フーリエ変換して細かく振動する音源の周波数と
# ゆるやかに振動する声道の周波数を切り分ける
cps = np.real(np.fft.ifft(AdftLog))
quefrency = time
```

![Untitled 5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401318/8558117e-4ac5-0b91-c47b-85b2c8654950.png)


# 参考

[ケプストラム分析 - 人工知能に関する断創録](https://aidiary.hatenablog.com/entry/20120211/1328964624)
[メル周波数ケプストラム（MFCC） - Miyazawa’s Pukiwiki](http://speechresearch.fiw-web.net/66.html)
[https://ja.wikipedia.org/wiki/ケプストラム](https://ja.wikipedia.org/wiki/%E3%82%B1%E3%83%97%E3%82%B9%E3%83%88%E3%83%A9%E3%83%A0)
Laravel8 ルーティングのネスト

Laravel初学者です。
オリジナルアプリを作成しているのでその過程を記事にしています。

理解が曖昧なところも多いため、ご指摘等ありましたらご連絡いただければ幸いです。

今回はルーティングのネストについて勉強したのでそのまとめです。
自分用メモです。

## 環境

|                | Version     |
|:---------------|------------:|
| PHP            | 7.4.14      |
| Laravel        | 8.24.0      |
| mysql          | 8.0.23      |
| docker         | 20.10.2     |
| docker-compose | 1.27.4      |


## 参考

- [Laravelのルーティングチートシート](https://qiita.com/fagai/items/a1bf55b6249aee03a624)
- [Laravel 6.x ネスト構造になっているRESTfulルーティングの定義方法](https://www.autovice.jp/articles/65)

私のLaravelバージョンはなので全く同じではできなかったのですがとても参考になりました！
ありがとうございます！


## はじめに

今回はオリジナルアプリにおいて`game`と`comment`があり、gameの投稿に対してcommentできるというものです。
その為、もしgameの投稿が削除された場合はcommentも削除されるべきなのでネストしたいと考えました。

- 親 = game
- 子 = comment

ただ、公式にもネストの記述がなくそもそも必要なのか、この考え方であっているのか分かりませんが、ルーティングの設定はできたので記事にしておきます。
初学者のためご承知おきください。


## モデル

```PHP:app/Models/Game.php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Game extends Model
{
    use HasFactory;

    protected $table = "games";
	protected $fillable = [
        "id",
        "user_id",
        "name",
        "describe",
        "play_time",
        "players_minimum",
        "players_max",
        "image_path",
        "updated_at",
        "created_at",
    ];

    public function user()
    {
        return $this->belongsTo(User::class);
    }

    public function comments()
    {
        return $this->hasMany(Comments::class);
    }
}
```

Gameモデルは上記のように記述しました。
1つの投稿はたくさんのコメントを持てるので`hasMany`で定義しています。


```PHP:app/Models/Comment.php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Comment extends Model
{
    use HasFactory;

    protected $table = "comments";
	protected $fillable = [
        "id",
        "user_id",
        "game_id",
        "text",
        "updated_at",
        "created_at",
    ];

    public function user()
    {
        return $this->belongsTo(User::class);
    }

    public function game()
    {
        return $this->belongsTo(Game::class);
    }
}
```

Commentモデルは上記のように記述しました。
1つのコメントは1つの投稿に所属するので`belongsTo`で定義しています。


## ルーティング

結論から言うと下記のような記述でルーティングのネストができました。

```PHP:routes/web.php
Route::resource('game.comments', App\Http\Controllers\CommentController::class);
```

```PHP:ターミナル
php artisan route:list
```

で確認すると

![スクリーンショット 2021-02-15 12.16.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1051152/118b29f2-ce02-484f-7d42-b96394fd4a24.png)

上記のようになりました。

```PHP:ターミナル
game/{game}/comments
```

上記のようなURIになっているのでネストできているのではないかと考えています。
以上です。

もし間違い等ございましたらご指摘いただければ幸いです。
WSLでGUIを使う

# VcXsrv のインストール

https://sourceforge.net/projects/vcxsrv/

オプションは変更せずに、インストールを行う。

インストールが完了したら、VcXsrvを立ち上げ、以下の順序で設定を行う。

1. One large window を選択
2. 次へ
3. Start no client を選択
4. 次へ
5. 以下全てにチェック
  - Clipboard
     - Primary Selection
  - Native opengl
  - Disable access control
6. 次へ
7. 完了

# Ubuntu側の設定

## 必要なパッケージのインストール

gnome環境を用意します。

また、[apt-fast](https://github.com/ilikenwf/apt-fast)を用いてインストールを行っています。
無い場合は、`apt-fast`を`apt-get`に置き換えて使用してください。

```bash
sudo apt-fast update -y && sudo apt-fast full-upgrade -y

sudo apt-fast install x11-apps x11-utils x11-xserver-utils dbus-x11 fonts-ipafont ubuntu-desktop -y
```

## .bash_profile の設定

```bash
echo 'export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0.0' >> ~/.bash_profile
echo 'export LIBGL_ALWAYS_INDIRECT=1' >> ~/.bash_profile
source ~/.bash_profile
```

## dbus, x11-common の起動

```bash
sudo service dbus start
sudo service x11-common start
```

# GUIを起動

以下コマンドで起動。

```bash
gnome-shell --x11 -r
```

# 参考

* [初心者のためのWSL( 2 ) ~GUI設定,デスクトップ環境設定編~](https://qiita.com/yoshige/items/7a17bb7a3582d72a7e48)

* [WSL2でUbunutuのGUI環境を作る](https://qiita.com/TTOM/items/d19969f3781902518c75)

* [Run ubuntu-desktop on WSL (Ubuntu 18.04 LTS)](https://askubuntu.com/questions/1162808/run-ubuntu-desktop-on-wsl-ubuntu-18-04-lts)

* [What's the easiest way to run GUI apps on Windows Subsystem for Linux as of 2018?](https://askubuntu.com/questions/993225/whats-the-easiest-way-to-run-gui-apps-on-windows-subsystem-for-linux-as-of-2018)
【Laravel】CSRFについて

知識を整理するための個人的な備忘録です。

#CSRFとは
インターネットを通じたサイバー攻撃は多く存在する。その中にもいくつか危険性の高いサイバー攻撃があり、`クロスサイトリクエストフォージェリ（Cross Site Request Forgeries）`もその1つ。
>オンラインサービスを利用するユーザーがログイン状態を保持したまま悪意のある第三者の作成したURLなどをクリックした場合などに、本人が意図しない形で情報・リクエストを送信されてしまうこと。

#LaravelでのCSRF対策
`Laravel`では`CSRF対策`が簡単にできるような仕組みが組み込まれており、必ず`CSRF対策`をしないといけない。

`form`を使うときには、必ず`form`タグ内に@csrfを記述する。

```php
<form action="/create" method="POST">
    @csrf
    ...
</form>
```

@csrfは以下のように展開される(Ub7ebV8XbFCTtZyenNoFYyK9ctDzaj09wbp2R7IIの部分は毎回、ランダムな値になる)

```php
<form action="/create" method="POST">
    <input type="hidden" name="_token" value="Ub7ebV8XbFCTtZyenNoFYyK9ctDzaj09wbp2R7II">
</form>
```
この`_token`も他の値と一緒に送信され、検証が行われる。もし用意したトークンと一致しなかった場合、`419 Page Expired`というエラーになる

#参考
* [CSRF（クロスサイトリクエストフォージェリ）の意味とその対策](https://www.shadan-kun.com/blog/measure/2640/#01)
* [【PHP】LaravelでのCSRF対策](https://tmg0525.hatenadiary.jp/entry/2019/05/08/210945)
Rでベクトル・行列を扱う

# ベクトル

ベクトルは以下のように作ることができる。

```r:vector.R
v1 <- c(1, 2, 3, 4, 5) # [1] 1 2 3 4 5
v2 <- 1:5              # [1] 1 2 3 4 5
v3 <- seq(1, 9, 2)     # [1] 1 3 5 7 9
v4 <- rep(1, 5)        # [1] 1 1 1 1 1
v5 <- rep(1:2, 2)      # [1] 1 2 1 2
```

v1 と v2 は同じベクトルを作る。[1:5]という表記は forループ などでもよく見る形だが、それ自体に演算子を施す場合には注意が必要。

```r:for.R
n <- 5
for (i in 1:n-1) {
  print(i)
}
# [1] 0
# [1] 1
# [1] 2
# [1] 3
# [1] 4
```

上記コードは 1-4 を表示させようとしたのだが、 0-4 が表示されている。 v1 と v2 が同じものを意味することを理解していると、このコードのミスがわかる。 v1 の表記で forループ を書き直すと以下のようになる。

```r:mistake.R
for (i in c(1, 2, 3, 4, 5)-1) {
  print(i)
}
```

-1 がベクトル全体に施されていることがわかる。Rではこのように、ベクトル全体に引き算が施されるため気をつける必要がある。上記の場合は 1:(n-1) のように -1 が反映される範囲を意識する。

# ベクトルの内積

Rではベクトルの基本演算は、すべて要素ごとで実施される。ベクトルの内積を行うときには %*% という演算子を用いる。

```r:innerProduct.R
vec1 <- 1:5
vec2 <- seq(2, 10, 2)
vec1  *  vec2 # [1] 2 8 18 32 50 要素同士の掛け算
vec1 %*% vec2 # [1] 110          ベクトルの内積
```

# 行列

matrix関数で行列を作成、cbind関数やrbind関数で既存のベクトルを結合して行列を作成することができる。例は省略。colnames関数やrownames関数を使うことで列名や行名を変更でき、行列の転置を取る場合はt関数を使用。

# 特別な行列

行列にはいくつか特別なものがあり、それらを作成する場合は専用の関数がある。ここでは、対角行列と単位行列を作成する diag関数 を紹介する。

```r:diag.R
diag(c(1, 2, 3)) # 対角要素に 1, 2, 3 を持つ対角行列を作成
diag(3)          # 対角要素の個数だけを指定した場合は単位行列を作成
```

# 行列の演算

行列式を求める det関数、逆行列を求める solve関数、固有値・固有ベクトルを求める eigen関数 がある。例は省略。
40代おっさんVPCを勉強してみた②


## 本記事について

本記事は AWS 初学者の私が学習していく中でわからない単語や概要をなるべくわかりやすい様にまとめたものです。
もし誤りなどありましたらコメントにてお知らせいただけるとありがたいです。

## AWS 作成図

![vpc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641940/b9dc8ad4-bba8-2910-9975-96abff578ad3.png)

## 構築手順

❶ 　 VPC を作成する
❷ 　 VPC の中にサブネットを作成する
❸ 　インターネットゲートウェイを VPC に割り当てる
❹ 　ルートテーブルにインターネットゲートウェイへのルートへのルートを追加

### 1. VPC を作成する

・まずは AWS に行き、コンソールサインインをしてログインして、AWS マネジメントコンソールに行ってください！
（ここで忘れずにリージョンは東京にしてください）
![VPCマネジメントコンソール.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641940/3f833770-1dc9-6c7f-ba29-8d703968d901.png)

上部のサービス（赤い枠のところに）に VPC と書くとサービスがでます。AWS はサービスが多いので探すのも大変ですよね・・・・

・VPC 選択して、VPC ダッシュボードに移行
![VPCダッシュボード.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641940/908bd583-f767-d308-9c5a-77bc30486e6c.png)

ここで VPC（赤枠）をクリックしてください

![VPCを作成をドラック.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641940/c5a422b0-cac5-bb5b-5371-f277ce50eb60.png)
次は右上の VPC 作成をクリック（赤枠）
![VPC作成.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641940/fe98c068-e530-0003-8e51-60d92c5360dd.png)

・名前タグにお好きな名前（わかりやすいものが良いと思います）
・IPv4 CIDR ブロックにはサイダー表記で書きます。
・IPv6 CIDR ブロックは IPv6 CIDR ブロックなし良いです。
　 IPv6 CIDR ブロックを調べて見ましたが色々と難しく説明できないので割愛させていただきます。
＊補足
（IP アドレスの Version6 分の設定！

VPC 内で IPv6 を使ったサービスを提供する場合などにこの項目は設定します。）
・テナンシーはデフォルトのままで起動されたインスタンスが起動時に指定されたテナンシー属性を使用するようになっているみたいです。

・ここまで出来たら写真には写っていませんが下のほうにある VPC 作成をおしてください！
確認すると VPC が作成できています。（↓ 写真赤枠）
![VPC.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641940/a5d82769-b78f-89b5-4b11-97a90d111f90.png)

### 2.VPC の中にサブネットを作成する

↑ の写真の VPC の下にあるサブネット（青枠）をクリックしてください。

![サブネット作成.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641940/5a121694-0ad9-9aea-7d79-0a98359716f4.png)
サブネットの画面に画面遷移します。その次にサブネットを作成をクリックしてください。

![サブネットをVPCへ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641940/0c0d983d-44d1-d4e3-7e12-8040e3364bf0.png)
サブネット作成画面に進んだら VPC ID のところにさきほど作った VPC（自分は Test-VPC)を選択したら下にスクロール)
![サブネット名前.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641940/9deb2fc7-eb16-e5b1-199c-5e1d3595b338.png)

・このサブネットは public 　公開用（つまりほかの人に見せたいものを置きます。例　 WEB サーバーなど）に作りました。
・サブネット名を入れてください（どの VPC にアタッチしているかわかりやすいほうがいいです）
・アベイラビリティーゾーンを選んでください
・IPv4 CIDR ブロックはサイダー表記で記入
これを行ったら下のほうにあるサブネット作成をクリックしてください！！

次に同じように Test-subnet-private を作ってください！
・こちらは公開しない用（つまりほかの人にいじられたら困る用です。例　 DB など）
・IPv4 CIDR ブロックは public と違うものに！！自分は 10.0.2.0/24 にしました！！
![サブネット確認.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641940/b0419c0c-5e9f-d0b7-ec4d-0fa00bf6073f.png)

まだ終わらない・・・
長くなったので今日はここで終わりで・・・③ に続きます・・・

またこの記事は AWS 初学者を導く体系的な動画学習サービス「AWS CloudTech」の課題カリキュラムで作成しました。
<https://aws-cloud-tech.com/>
非同期処理はthen→catchではなくcatch→thenが正解！？

皆さんこんにちは！

皆さんは何気なく非同期処理において``then``と``catch``を使っていると思います。

ただ何となく使っていると落とし穴にはまります。

以下の例を見て下さい。

```index.js
const user = this.$auth.currentUser
const func = this.$function.httpsCallable('updateEmailVerified')
      func()
        .then(() => {
          alert('処理完了')
          user.reload()
        })
       .catch(() => {
          alert('エラー発生')
        })
```

これはFirebasFunctionsを使ってとある処理を行っています。

本来なら処理が正しく行われたら``then``で処理を行い、何かしらエラーが起きた場合は``catch``で処理を行うと誰もが予想すると思います。

なんとこの処理``then``と``catch``両方の処理が行われ、``alert('処理完了')``が表示された後に``alert('エラー発生')``も表示されてしまいます😨

一度``catch``とはどういうものなのかを調べました。

・Promise が reject したもの
・catch 以前に Promise call 後に throw された例外

``catch``はこの二つのエラーをキャッチします。

つまり、非同期処理関数、今回で言うと``func()``が起こしたエラーと``catch``より前の処理``then()``内で起こったエラーの２つをキャッチします。

これは恐らく初心者の方で知っている方はほぼいないでしょう。

なので、今回の処理では恐らく``user.reload()``がエラーを起こしてしまい、``alert('処理完了')``と表示された後に``alert('エラー発生')``が表示されます。

``user.reload()``を消せばいいのですが、練習も兼ねて以下のように``then``と``catch``の順番を逆にすることで``then``と``catch``別々に処理が行われるようになりました。

```index.js
const user = this.$auth.currentUser
const func = this.$function.httpsCallable('updateEmailVerified')
      func()
       .catch(() => {
          alert('エラー発生')
        })
       .then(() => {
          alert('処理完了')
          user.reload()
        })
```

ただ、一概には``catch``→``then``とすることが正しいとは言えませんね。

この順番裏を返せば``then``内で起こったエラーをキャッチできないので、``then()``内の処理を多く行っている場合は``then``→``catch``の方が良さそうですね。

逆に少ない処理の時は``catch``→``then``としてやるのもアリですね。

少し調べただけなので、鵜呑みにはしないでください！！

悪魔で僕個人の見解なので！

詳しく知っている方はぜひコメント欄にてご指摘頂けると幸いです。

中々見ないエラーで一度はまた２，３時間くらい時間を潰すのではと思ったのですが、意外と早く解決できたので良かったです。

また、なんとなく使っているものをこれからは理解するようにしていこうかなと思いました。

以上、「非同期処理はthen→catchではなくcatch→thenが正解！？」でした！

良ければ、LGTM、コメントお願いします。

また、何か間違っていることがあればご指摘頂けると幸いです。

他にも初心者さん向けに記事を投稿しているので、時間があれば他の記事も見て下さい！！

Thank you for reading
LaravelのmiddlewareでJsonResponseのデータを編集する

# はじめに
LaravelでREST APIを作成する時、middlewareでRequestObjectに対し、何かしらのデータを編集するという例はかなり目にします。けれどもJsonResponseObjectに対してデータを編集するという例はあまり見かけないのです。かなりあるあるなケースだと思ったのに、あまり検索に引っかからないので書きました。
なお本記事で取り扱うLaravelのバージョンは8、phpのバージョンは７以上を想定しているのであしからず。

# よくあるmiddlewareでRequestObjectのデータを編集するやつ
```php
public function handle(Request $request, Closure $next)
{
    $input = $request->all();
    $result = $this->service->repository($input['some_input']);
    $request->merge(['result' => $result]);

    return $next($request);
}
```
なんかこういう感じで、入力に何かしらのデータが入っていたらDBに問合せて結果をRequestObjectに合流させる的な処理。
バリデーションでやるにはちょっと気持ち悪くて、コントローラで毎回やらせるのは面倒な感じのあれです。
多分LaravelでREST API書いてたら一度は使うと思います。

[class Illuminate/Http/Response](https://laravel.com/api/7.x/Illuminate/Http/Response.html)

# 何故かなかったmiddlewareでJsonResponseObjectのデータを編集するやつ
```php
public function handle(Request $request, Closure $next)
{
    $input = $request->all();
    $result = $this->service->repository($input['some_input']);
    $request->merge(['result' => $result]);

    $response = $next($request);
    // Get the json_decoded data from the response.
    // mixed getData(bool $assoc = false, int $depth = 512)
    $response_data = $response->getData(true, 512);
    $response_data['result'] = $result;
    $response->setData($response_data);
    return $response;
}
```
Laravelのhandler内で$next()にRequestObjectを渡すと、コントローラでの処理が終わった後の任意のResponseObjectが返ってきます。
今回はREST APIとしての振る舞いControllerに期待するので、JsonResponseが返る事が期待されます。
そこで、Laravelのapiドキュメントを読みにいくと、丁度getDataとsetDataという素敵なメソッドを発見。
getDataは**JsonResponseに入力されたデータをjson_dencodeして返してくれる**メソッド。
setDatahは**JsonResponseにデータを入れ直せる**メソッド。
つまり、getDataで持ってきた配列に任意の処理をしてsetDataにそれを渡せば後付けでJsonResponseのデータの編集ができるというカラクリ。

[class Illuminate/Http/JsonResponse](https://laravel.com/api/7.x/Illuminate/Http/JsonResponse.html)

# 参考
https://laravel.com/api/8.x/index.html
YouTubeのサムネイル画像を作るやつ

# YouTube投稿時にサムネイル画像を作るのが結構めんどくさい

手順はこんな感じ。せめて画像編集処理くらいは自動でやりたい。

* フルスクリーンで動画のスクリーンショットを取る
* 上下の余計な部分を切り捨てて縦横比を16:9にする
* サイズを1280x720に縮小する
* YouTubeにアップロードする

# 自動化しよう

簡単に自動化できそうなのは以下の２点。

> * 上下の余計な部分を切り捨てて縦横比を16:9にする
> * サイズを1280x720に縮小する

実際の画像ファイルでいうと、これ [^1] を
![2021-02-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147207/9b4c01cc-63a6-48a0-32b3-dec11d8dfa66.png)
こうしたい。（上下の黒い部分が無くなっている）
![2021-02-01.thumb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147207/df9a5335-a2e5-32fd-a3f7-6d61e6612f0e.png)

ImageMagickに慣れ親しんでいたのでPythonでもそれで行こうと思いましたが、思いのほか実例やドキュメントが無く難航。画像編集はPillowというライブラリが一般的なようなので、今回はそれで行くことにします。

## 画像ファイルを読み込む

```python:
im = Image.open(infile)
```

## 上下の余計な部分を切り捨てて縦横比を16:9にする

元の **幅** に $\frac{9}{16}$ を掛けて変更後の **高さ** を算出。（一番時間がかかったのはここかもしれない）

```python:
size = (1280, 720)
dHeight = width * size[1] / size[0]
offsetY = (height - dHeight) / 2
box = (0, offsetY, width, offsetY + dHeight)

im = im.crop(box)
```

## サイズを1280x720に縮小する

```python:
size = (1280, 720)
im = im.resize(size)
```

## 出来上がった画像をファイル出力する

ファイル名の拡張子から自動判定してくれる模様。簡単。

```python:
im.save(outfile)
```

## 整理するとこんな感じ

「ドラッグ＆ドロップで使えると便利だよね」とか、「出力ファイル名は『元のファイル名 + ".thumb.png"』とか」、「メソッドチェーンにすると今風かな」とか、いろいろ詰め込んだ結果がこれ。

```python:thumb.py
import os, sys
from PIL import Image

size = (1280, 720)

for infile in sys.argv[1:]:
    try:
        (fname, ext) = os.path.splitext(infile)
        outfile = fname + '.thumb.png'
        im = Image.open(infile)

        (width, height) = im.size
        dHeight = width * size[1] / size[0]
        offsetY = (height - dHeight) / 2
        box = (0, offsetY, width, offsetY + dHeight)

        im.crop(box) \
            .resize(size) \
            .save(outfile)
    except OSError:
        print('Cannot convert:', infile, file=sys.stderr)
```

[^1]: (C) ARMOR PROJECT/BIRD STUDIO/SQUARE ENIX All Rights Reserved.
AWSの「S3」とは？

今回はAWSの**「S3」**　について学んだことをアウトプットさせて頂きたいと思います。

##S3 (Simple Strage Service)
**S3とは、AWSのオブジェクトストレージサービスになります。**
特徴としては、安価(1Gあたり約3円)で耐久性が高いことです。
また、保存容量の上限がなく、冗長化してデータを保存する仕組みもあります。

###そもそもオブジェクトストレージとは何か？
ストレージの種類には大きく分けて、**ブロックストレージ、ファイルストレージ、ブロックストレージ**の
３種類がありますが、**オブジェクトストレージ**には以下のような特徴があります。

- HTTPSのプロトコルで通信する。
- 他ストレージ（EBS、EFS）より読み書き速度が遅い。
- 多数の大きなファイルを取り扱うのに向いている。
- APIを使用した開発が容易。

これらの特徴から、現代のWebサービスにも非常にマッチしやすく、
オブジェクトストレージを使用するケースはとても多いです。

###S3のイメージ
S3のイメージについて説明していきます。
バケットの下にフォルダやオブジェクトを作成できます。

- 頂点のフォルダ...バケット
- フォルダ...プリフィクス
- データ...オブジェクト


###S3のセキュリティ
デフォルトではアカウント管理者及びルートユーザーのみアクセスが可能になっています。
S3のバケットに直接IAMポリシーを埋め込むことでIAMに権限を付与することができます。
この仕組を**リソースベースのポリシ**ーまたは**バケットポリシー**と呼びます。
このリソースベースの仕組みを扱うことで、特定のIPアドレスのみ許可などの接続制限を設定することも
できるようになります。

以下はポリシーのサンプルイメージです。(AWS Cloud Tech学習サービス参照 https://aws-cloud-tech.com/)
ポリシーの内容は、全てのPrincipalに対して、S3のResourceに指定したバケットを参照できるアクションを指定しています。また、参照できるCondition(条件)は、12.34.56.78のIPアドレスからのアクセスを許可しているといった感じです。

![S3_2.003.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/930396/1e1af218-9f39-9e73-f831-63737cf24133.jpeg)


###S3のWebサイトのホスティング機能
S3では、HTML＋CSSのみで生成されたWebサイトをホスティングすることも可能です。
S3の特徴として各オブジェクトには、一意のURLが関連付けられます。この特徴を活かし、
以下のような作業を行います。

①パブリックに読み取り権限を付与する。
②バケットプロパティ内、「Webサイトのホスティング機能を有効にする」にチェックを入れる。

上記の作業を行うと自動的にエンドポイントURLというものが発行されます。
ユーザーはエンドポイントURLにアクセスするだけでバケットに設置したWebサイトに
アクセスすることができるようになります。
この特徴を活かすことで、告知用のWebサイトなども簡単に用意することもできるので
大変便利な機能になります。

###S3のストレージクラスについて
S3には用途に合わせて以下の6つのストレージクラスが用意されています。

|ストレージクラス|概要|
|:-----------|:------------|
|標準|デフォルトのストレージクラス(AZを３つ以上使用して冗長化)|
|標準 – IA|S3標準に比べオブジェクト格納料金が安価。ただしデータの呼び出しに対して課金あり|
|Intelligent-Tiering|コストの重なる低頻度/高頻度の2階層あオブジェクト別にアクセス頻度に応じて自動で階層移動。30日間アクセスがないオブジェクトは低頻度層に移動し、アクセスがあると自動的に高頻度層に移動|
|1 ゾーン – IA|S3 標準 – IAよりも安価。データの冗長率が低く、またデータの読み出しに対して課金あり※AZ1つ以上で冗長化であることに注意|
|Glacier|とても安い（S3標準と比較しデータ格納料金は1/5）だがデータの読み出しに課金および数分〜数時間かかる|　
|Glacier Deep Archive|S3 Glacierより安く最も低コストだがデータの読み出しに課金および長時間（12時間以内）かかる|


###S3のコストについて
S3のコストは**保管料、転送量、リクエスト量**に対して課金されます。

**保管料**
こちらは選択するストレージクラス（どれくらい冗長化するか）によって料金が変わります。
例えばS３標準か、Glacierするかなどで料金が異なるといったものです。

**転送量**
受信、同一リージョンのAWSサービスとの連携は無料。
具体的には、S3のバケットの中にどんどんデータを溜め込んでいく受信が無料です。また、同一リージョンのS3同士のコピー作業や、同一リージョンのEC2からS3のバケットに転送するといったデータ送信料金も無料であり、課金がされません。
`※ただし送信は課金されます。`
S3からインターネット回線を通して画像や音楽を配信するなどの送信動作に関しては課金されるため、注意が必要です。

**リクエスト料**
S3に対してのGET/PUT/POST/LIST/COPYなどのリクエスト数に対しての課金されます。
DELETEの動作においては無料になるのですが、上記のような表示、登録、更新、コピーなどには課金がされます。

###まとめ
S3とは、AWSのオブジェクトストレージサービスです。
S3を使用することで、冗長性、耐久性共に優れた環境でデータを管理することができます。
また、S3には6つのストレージクラスがあるのでアプリケーションの状態やライフサイクルに合わせて選択することが大切です。
S3を利用する場面としては、画像や動画の保存だけでなく、Webサイトのホスティングに使用することやCloudWatchやLamdaと連携してイベントを発動するなど様々な用途で使用することができます。
他のAWSリソースと連携する際には、S3のバケットに対しての権限を設定する必要がありますが、その際にはバケットポリシーというものを設定する方法も有効です。
課金制度については、基本的に保管料、転送量、リクエスト量によって課金がされます。

この記事はAWS初学者を導く体系的な動画学習サービス
「AWS CloudTech」の課題カリキュラムで作成しました。
https://aws-cloud-tech.com
PHPにてDateTimeクラスのインスタンス化とフォーマットを1行で実行

# はじめに
DateTimeクラス利用の際、インスタンス化とformatを1行でもかけることを本日知りました。

# 概要
インスタンス化してそのままformat

```php:
$datetime = (new DateTime())->format('Y-m-d H:i:s');
echo $datetime; // 2021-02-16 18:31:22
```

今まではフォーマット済みの値が入った変数を何箇所かで利用する場合はこんな感じにやってました。。

```php
$datetime = new DateTime();
$datetime = $datetime->format('Y-m-d H:i:s');
echo $datetime;
```


# おわりに
もしかしたらみなさん当たり前のように使っているのかもしれませんが、個人的に知れて嬉しかったので残しておきます。
【Android Studio】Number Pickerをループさせないようにする

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694762/479a55f0-cf69-e4a2-bba5-c7a50b20365c.gif" width=50%>

NumberPicker（ドラムロールUI）使用時に、ループさせないようにする方法。``wrapSelectorWheel``を``false``にすればOKです。

## 1. レイアウト
```activity_main.xml
<NumberPicker
	android:id="@+id/picker"
	android:layout_width="0dp"
	android:layout_height="0dp"
	app:layout_constraintBottom_toBottomOf="parent"
	app:layout_constraintEnd_toEndOf="parent"
	app:layout_constraintStart_toStartOf="parent"
	app:layout_constraintTop_toTopOf="parent"/>
```

##2. 処理
```MainActivity.kt
binding.picker.minValue = 0
binding.picker.maxValue = 5
binding.picker.wrapSelectorWheel = false
```
pipで独自ライブラリをインストールする

# pipでインストールしたい

独自ライブラリのモジュールのパスを追加して開発を行っていた。

```python

# 現在のディレクトリの絶対パスを取得
current_dir = pathlib.Path(__file__).resolve().parent
print(current_dir)
parent_dir = pathlib.Path(current_dir).resolve().parent
print(parent_dir)
# モジュールのあるパスを追加
sys.path.append(str(parent_dir))
from dokuji.dokuji.test import test as t

```

pythonだけで動かす場合には問題なかったのだが、この状態からpyinstallerを用いてexe化して実行した際に「（独自モジュール）が存在しない」とのメッセージが発生してしまった。
これはimportで取り込んだ際にpipなどでモジュール管理していないため関連ライブラリも取り込めず、エラーが起きてしまうのかな…と思った。
解決策として開発プロジェクト内に上記のモジュールを追加する方法もあるが、重複管理となってしまうため、それは避けたい。

## setup.pyとrequirements.txtを作成

pipでインストールするために、setup.pyとrequirements.txtを作成した。

```python:setup.py
import os, sys
from setuptools import setup, find_packages

sys.path.append('./tests')

def read_requirements():
    """Parse requirements from requirements.txt."""
    reqs_path = os.path.join('.', 'requirements.txt')
    #print(reqs_path)
    with open(reqs_path, 'r', encoding="utf-8") as f:
        requirements = [line.rstrip() for line in f]
    return requirements

# パッケージの依存情報、バージョン情報、パッケージ名を記述
setuptools.setup(
    name='dokuji name',   # パッケージ名
    version='0.0.1',    # 現在のバージョン名
    Description='独自ライブラリ',    # パッケージ概要
    author='製作者',
    author_email='xxxx@dokuji.co.jp',
    install_requires=read_requirements(),
    packages=find_packages(include=['dokuji','dokuji.*','bin']),
    include_package_data=True,
    package_dir={'dokuji':'dokuji'},
    python_requires=">=3.6",
)
```


独自モジュールと開発プロジェクトの配置は以下の通りとする

> (root)
>   ├ dokuji（ライブラリフォルダ）/
> 　　　　- dokuji(ソースフォルダ)
>   ├ sample_prj（プロジェクトフォルダ）/
>

以下の通り行うことで、ライブラリのインストールが可能。

```shell

> .\[newenvname]\Scripts\activate
# => venvを有効化
  
 newenvname > pip install ..\dokuji
# => インストール

newenvname > pip uninstall dokuji
#=> アンインストール
```

これにより、以下の記述のみで参照が可能となる。

```python
from dokuji.test import test as t
```
RSK USB Serial Portのドライバのインストール

少しハマったのでメモします。

Renesas RX65N Cloud KitをWindows7のPCに接続しようとしたところドライバのインストールに失敗しシリアル通信ができませんでした。
（Windows10では問題ありませんでした）

RSK USB Serial Port 用のドライバを手動でインストールする必要があるようです。

## 解決方法

[ルネサスエレクトロニクスの公式HP](https://www.renesas.com/jp/ja) 内で検索したところ「RSK USB Serial Driver」が見つかりました。

これをダウンロード後、下記手順でインストールできました。

1. デバイスマネージャーを開き、RSK USB Serial Portを右クリック
2. ドライバの更新を選び、コンピュータを参照してドライバを検索するを選択する
3. ダウンロードしたドライバのフォルダを選択
Railsを削除する方法。気付いたらたくさんインストールしてたみたい。

#Rails、 はじめました。

Railsをインストールしました。
でも、はじめてなので、私はよく分からずにRailsのバージョンを変えて何度もインストールしていたようです。

#Railsを探す
インストールした Rails は以下のコマンドで search することができます。

```
$ gem search ^rails$ -l

*** LOCAL GEMS ***

rails (6.1.2.1, 6.1.2, 6.0.3.4)
```

上のコマンド結果のように、どうやら 6.1.2.1,  6.1.2,  6.0.3.4 という３つのバージョンがインストールしていたようですので、これらを１つに絞ります。

#Railsを削除する。
ここでは、2020年2月16日現在で最新バージョンの6.1.2.1だけ残して、残りの２つのバージョンは以下のコマンドで削除します。

```
$ gem uninstall rails
```

実際にバージョンを指定して、試してみます。

```
$ gem uninstall rails --version 6.0.3.4
Successfully uninstalled rails-6.0.3.4
$ gem uninstall rails --version 6.1.2
Successfully uninstalled rails-6.1.2
```
Successfully uninstalled  と表示されたので、無事にアンインストールが成功したみたいです。

もう一度、search をかけると、

```
$ gem search ^rails$ -l

*** LOCAL GEMS ***

rails (6.1.2.1)
```
最新版の6.1.2.1だけが残りました。
これでスッキリですね。今後起こりうる不具合を潰せたはずです。
【Rspec】fill_inがうまく動作せずとても悩んだので備忘録【capybara】

---------------------------------------
「現場で使えるRuby on Rails5 速習実践ガイド」Chapter5-8,5-11（FutureTest）のfill_inで詰まったので備忘録。

---------------------------------------
・環境
PC : MacBook Pro(2018)
OS : mac os Big Sur ver. 11.1
editor : Vscode ver.1.53.2
・言語&ライブラリ
Ruby : 2.6.3
RubyonRails : 6.1.1
Rspec : 3.10
Capybara : 3.34.0
FactoryBot : 6.1.0

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

**ログインテスト失敗**
---------------------------------------
Chapter5-8-3のRspec&Capybaraを使ったユーザーログインのテストで、

```ruby:tasks_spec.rb
context 'ユーザーがAがログインしているとき' do
before do
    visit login_path #このURLでアクセスする
    fill_in 'メールアドレス', with: 'a@example.com' #メールフォームにa@example.comを入力
    fill_in 'パスワード', with: 'password' #パスワードフォームにpasswordという文字列を入力
    click_button 'ログインする' #ログインボタンを押す
end

```
と教科書通り入力しても、エラーが出て実行されず、、、
![スクリーンショット 2021-02-16 12.25.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1076062/7b822c19-1b48-ce3c-025f-a7075f7b5b1e.png)

どうやら、'メールアドレス'で、views側の入力フォームのラベルを指定しているのですが、
それがうまくいかずに、'a@example.com'がキチンと入力フォームに代入されていないことが原因のようです。

**fill_inに参照させる値を変更する**
---------------------------------------

つまり、ラベル以外の要素で参照させてあげれば、上手くいくのでは、、、？
と思い、Google Chormeの検証で、ソースコードを確認することに。~~(ソースコード直接見たらええやんって声も聞こえてきそうですが、この技術書ではHTML短縮記法のslimを用いて書いていますので今回は割愛。)~~
見てみると、、、![スクリーンショット 2021-02-16 12.33.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1076062/5239c8e7-e3b7-fa76-15cb-e15382c51ac1.png)
name="session[email]"の部分で読み込ませると、無事に値を渡せることができました！！
**ハマると泥沼な凡ミス**
---------------------------------------

ちなみにその後Chapter5-11で、値を渡す部分(with:'〇〇')がlogin_user.emailとlogin_user.passwordと言う変数に変わります。
理由としてはユーザーAだろうがユーザーBだろうが誰がログインしても同じログイン処理コードを使えるようするためなのですが、
その時に元々は文字列を入れていたのでシングルクォーテーションを付ける必要があったのですが、変数の場合は~~当たり前ですが~~シングルクォーテーションを外す必要があります。
自分はこの凡ミスで半日程無駄にしました、、、泣

**まとめ**
---------------------------------------
まとめると、
・fill_inはラベルで参照できない時は、view側(またはchromeの検証)を確認して、IDやnameを指定して上げてください！
・変数にシングルクォーテーションはダメ絶対！！

以上です。
最後まで閲覧頂き、誠にありがとうございました！！
Github DesktopのDefault Branchを変更する方法

![スクリーンショット 2021-02-16 12.48.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9875/dcd7b3c9-1673-a1b3-1898-92a4980244d8.png)

# Default Branchの変更方法

Github Desktopは以下のファイルを見てDefault Branchを判断しているようなので、
ここを書き換えれば反映されます。

```zsh
% cat .git/refs/remotes/origin/HEAD
ref: refs/remotes/origin/develop
```
DisplayPort仕様との戦い

# Displayportとマルチモニタ
自分がPCで使っているグラフィックボードはDPx3、HDMIx1でマルチモニタで使うためには必ずDP接続が必要となります。
しかしDPは仕様としてスリープする時接続解除の信号を送るようで、これが原因でスリープから復帰すると開いていたウインドウが一つのモニタにまとまってしまう、という問題があります。
# 対策
レジストリの修正、ケーブル2本差し等色々な対策があるようですが、自分の環境ではなかなかうまくいかなかったのですが、[MonitorKeeper](https://github.com/hunkydoryrepair/MonitorKeeper/releases)というソフトとDP->HDMI変換のケーブルにすることで現象は起きなくなりました。

EIZOのモニタ等は対策されているようなのですが、悩ましい問題ですね。
そもそもDPの仕様が変わってくれるとありがたいんですが一度決めてしまったものは難しいのでしょうか。
グラフィックボードの出力がHDMIたくさんになればいいような気もしますが、現状無いですよね、なんででしょう。
微分方程式 - 同次形

# 解法

```math
\begin{array}{l}
y' = f \left( \frac{y}{x} \right)　　\cdots (*) \\
\\
u = \frac{y}{x} とおく。\\
このとき、y = ux であるので両辺を微分すると y' = u'x + ux' = u'x + u \\
これを（*）に代入すると、\\
u'x + u = f(u) \\
\\
u' = \frac{du}{dx} とおいて整理すると、\\
\frac{du}{dx} = \frac{1}{x} \left( f(u) - u \right) 　　\Rightarrow 変数分離形 \\
\\
f(u) \ne u のとき \\
\int{\frac{1}{f(u) - u}}du = \int{ \frac{1}{x} } dx \\
\rightarrow uとxの関係式を求めて、uを\frac{y}{x}に戻す。\\
\end{array}
```

# 例題

- ex1)　$y' = \frac{y^2}{x^2 + xy}$

```math
\begin{array}{l}
右辺をx^2で割ると、y' = \frac{(\frac{y}{x})^2}{1 + \frac{y}{x}} \\
\\
u = \frac{y}{x} とすると、y = ux から y' = u'x + u \\
u'x + u = \frac{u^2}{1 + u} \\
u' = - \frac{u}{1 + u} \frac{1}{x} \\
\frac{du}{dx} = - \frac{u}{1 + u} \frac{1}{x}　\cdots ①\\
u = 0 は①を満たす解である。\\
u \ne 0 のとき \\
\int{ \frac{1 + u}{u} }du = - \int { \frac{1}{x} } dx \\
\int{ \left( 1 + \frac{1}{u} \right) }du = - \int { \frac{1}{x} } dx \\
\int{ }du + \int{ \frac{1}{u} }du = - \int { \frac{1}{x} } dx \\
u + log \left| u \right| = -log \left| x \right| + C \\
log \left| ux \right| = -u + C \\
| ux | = e^{-u + C} \\
ux = \pm e^{-u + C} \\
ux = \pm e^C e^{-\frac{y}{x}} \\
ux = C' e^-u (C' は \pm e^C)\\
\\
\frac{y}{x}x = C' e^{-u}\\
y = 0 の解は、C'=0 とすれば表せるので、改めてCとすれば、\\
\\
y = C e^{-\frac{y}{x}} \\
\end{array}
```

- ex2)　$y' = \frac{y}{x} + cos^2\frac{y}{x},　y(1) = \frac{\pi}{4}$

```math
\begin{array}{l}
tan \frac{y}{x} = log |x| + 1\\
\end{array}
```
【boto3】LambdaでS3のディレクトリ削除

LambdaからS3のディレクトリ削除、正確にはS3にはディレクトリがないので同一prefixのオブジェクトの削除をするやり方です。

```python:delete_objects.py
def lambda_handler(event, context):
    s3 = boto3.resource('s3')
    bucket = s3.Bucket('your_bucket_name')
    bucket.objects.filter(Prefix="insert/prefix/name/").delete()
```

上記コードのバケット名とPrefixを環境に合わせて変更しましょう。またLambdaのロールにS3への削除権限が必要なのでそれも付与しておきましょう。
tipsですがやり方調べるのに時間がかかったり、冗長なやり方を多く見かけたので記事にしておきます。
【Jekins pipeline】CurlでChatwok APIのメッセージ送信を使う


```javascript

pipeline {
  agent any

  stages {
    stage('exec') {

      environment {
        apiKey="xxx"
        roomId="yyy 数字のみ"
        url="https://api.chatwork.com/v2/rooms/${roomId}/messages"
        message="Jenkins Job ${env.JOB_NAME} : ${currentBuild.currentResult}"
      }

      steps {
        sh('curl -X POST -H "X-ChatWorkToken: $apiKey" -d "body=$message" "$url"')
        // bad
        // sh '''
        //   curl -X POST -H "X-ChatWorkToken: $apiKey" -d "body=${message}" "${url}"
        // '''
      }
    }
  }
}

```
【Git】 リモートブランチをローカル環境で取得する

この書き方で取得可能

```
git checkout -b <ブランチ名> origin/<ブランチ名>
```

### 例

```
git checkout -b develop origin/develop
git checkout -b feature/hoge origin/feature/hoge
```

## checkoutに失敗した場合の対応

```
> git checkout -b develop origin/develop
fatal: 'origin/ブランチ名' is not a commit and a branch 'ブランチ名' cannot be created from it`

> # ローカル環境にリモートの情報を取得
> git pull

# 再度チェックアウトする
> git checkout -b develop origin/develop
```
AWS S3 で複数条件で特定ディレクトリ以下のファイルをコピーするときの exclude & include オプション


S3 にあげたログを調査したい時に、一部のログだけを、DLしたい場合があります。
その時に、exclude & include オプションでコピーします。


参考: AWS CLI での高レベル (S3) コマンドの使用::s3 コマンドでよく使用されるオプション
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-services-s3-commands.html#using-s3-commands-managing-objects-param


例: my-bucket/path に保存した Nginx ログの中から、特定の月(YYYY-MM)のログファイルを今のディレクトリにコピーしたい場合

ターミナルだと

```
$ cp /var/log/nginx/access_log_YYYY-MM-*.gz ./
```

とかシンプルに条件をつけられますが、S3 の CLI は単純なワイルドカードが使えないようです。


Nginx ログは access_log_[YYYY]-[MM]-[DD].gz と言うフォーマットで保存されているとする。

```
$ aws s3 cp s3://my-bucket/path  ./ --recursive --exclude "*.gz"--include "access_log_YYYY-MM-*.gz"
```

これで、SSH の例文のようなアクションを起こすことができます。
DaVinci Resolve16から17 BETAにアップデートする方法

#まえがき
ある日、DaVinci Resolve16から17（Beta版）へとアップデートしたいな～と思い、既存のファイルなどをどうすれば良いのか（そのまま引き継がれるのかなど）を調べてみると、、、なかなか欲しい情報が無い！ということで、簡潔に書いてみました。
※当記事は絶対性を保証するものではありませんので、不安な方は正式アップデートまでお待ちください。

#結論
[DaVinci Resolveのページ](https://www.blackmagicdesign.com/jp/products/davinciresolve/)からインストーラをダウンロードし、新規インストールの手順通りに進める（デフォルトのディレクトリに保存する、つまり16と同じディレクトリを指定する）ことにより、僕の場合は問題なくアップデートすることができました。ちなみに、僕の環境は以下の通りです。
・C:\Program Files\Blackmagic Design\DaVinci Resolve下に本体
・D:\DaVinciResolve\ProxyMedia
・D:\DaVinciResolve\CacheClip
・D:\DaVinciResolve\.gallery
上記のDドライブは独立したSSDです。
C:\Program Files\Blackmagic Design\DaVinci Resolve下にDaVinci Resolve17をインストールすることで、アップデート前のファイル（DaVinci Resolve16など）が自動的に置き換わりました。
別のドライブに格納していたキャッシュなども、設定し直すことなく読み込んでくれました。
WEBエンジニアになりたい理由と現在している努力

###WEBエンジニアになりたいと思ったきっかけ
--------
高校時代は、中学時代から現れ始めた不眠と鬱が悪化してしまい不登校を経験しました。何度も辞めようかと思ったほどでしたが、高卒資格もないようじゃと思いつらいけど踏ん張った結果、人より遅くなりましたがちゃんと卒業しました笑

家庭環境も悪く、家族仲も経済的にも精神的にも苦しんだ経験からソーシャルワーカーを高校時代から志すようになり、高校卒業後は働きながら通信課程の大学の社会福祉士養成課程で勉強していました。
通信課程になった理由は、母親が奨学金の保証人になんかなるか！！！と怒鳴ってくるし、自分でバイトしながら受験料、参考書、入学金など貯めようと計画立てながら勉強していたら、

###「そんなに働いてるならご飯ださないいでいいよね。家にお金入れないし」

と、まさかのご飯3食スーパーやコンビニになりお金貯まらず、普通の大学断念しました笑

その後は人と関わる接客業やリラクゼーションサロンなどなどしながら社会福祉士目指して単位取得の日々でした。

22歳半ばぐらいの時、若いうちにやっておくべきことはないか？学生がやっておいたらいいものはないか？と色んなことに好奇心を持ち調べているときが沢山ありました。
その中には英語、読書、旅行、情報発信、お金の勉強などなど沢山ありました。

###その中に、[プログラミング]が入っていました。これが、私とプログラミングの出会いです。

自分自身に確かなスキルをつけることができる、自分自身でWEBサイトやWEBアプリケーションを生み出し作り上げることができる、企業で働くことや自分自身で案件を受注することもできる。
調べれば調べるほど私もやってみたいと興味は深まっていきました！
その後、長い時間悩みに悩み更に悩み倒し、続けられるか不安でしたが
###本当に、PHPとJavaScriptとWEBデザインを学べるコースで学び始め、（沢山迷ったので実行するまで本当に時間かかりましたが笑）
諦めることなく主にPHP/Lalavelの勉強を続けていきました。最初は意味が分からないと思ったけどしがみ続けることが出来ていたので、このままポートフォリオを作り、どこかの企業に入り技術をどんどん磨き学んで行きたいと思うようになりました。

そのため、福祉系からIT、WEB系に進路転向という形になりました。こちらの勉強に夢中になってしまったからです。

---------------------------------------
###現在している努力
-----------------------------
・PHPのLalvelを使用して猫好きのための猫の画像と日記を投稿出来るサイトを制作中です。
メンターさんに見てもらったり、TwitterやQiitaやテラテイルで聞いてみたり、自分でググってみたり四苦八苦しながらしています。

・IT、WEB業界未経験なのでITパスポートや基本情報技術者などの勉強を進め、知識や用語の勉強もするように心がけています。

・Lalavelだけでなく、実務に就いた後のことも考えてLinuxやAWSやDockerの基本なども理解するべく入門書を読むことも始めました。
MySQLやGidHubの勉強も進めていかなくてはですね（笑）

###詰め詰めですが一歩一歩頑張って行こうと思います！よろしくお願いします！！
get object or field name in apex

salesforce skill

1.how to get the field name of a object in apex


String type='account';

Map<String, Schema.SObjectType> schemaMap = Schema.getGlobalDescribe();
Schema.SObjectType leadSchema = schemaMap.get(type);
Map<String, Schema.SObjectField> fieldMap = leadSchema.getDescribe().fields.getMap();


for (String fieldName: fieldMap.keySet()) {

System.debug('##Field API Name='+fieldName);// list of all field API name

 

fieldMap.get(fieldName).getDescribe().getLabel();//It provides to get the object fields label.
}


2.how to get the object label in apex

String objectName = 'Contact';

List<Schema.DescribeSObjectResult> describeSobjectsResult = Schema.describeSObjects(new List<String>{objectName}); // this can accept list of strings, we describe only one object here
String objectLabel = describeSobjectsResult[0].getLabel();
MacBookProの設定

###環境
macOS Big Sur（バージョン11.2.1）
MacBook Pro（チップApple M1, 16GB`）

##デフォルトからの変更点
・カバーを閉じてもスリープさせない
　どうやらGUIからは設定できないみたい。
　出典1を参考にコマンドから設定変更した。

```
スリープを禁止
   sudo pmset -a disablesleep 1
スリーブを許可
   sudo pmset -a disablesleep 0
```
※出典
1. http://t-ishii.cocolog-nifty.com/blog/2020/03/post-e9849b.html
【OpenCVSharp】Mat.ForEachByteの使い方Memo

すみません。positionがちょっと思ったのと違うみたいです。
以下は失敗してます・・・。


なんだか意外と検索に引っかからなかったので備忘録です。

以下は指定領域のピクセル画素のRGBをジャグ配列に詰めている様子です。

```Csharp
            using (var roiImg = new Mat(img, roi))
            {
                var channels = img.Channels();
                var tempArray = new byte[roi.Width * roi.Height][];
                for(int i=0; i < tempArray.Length; i++)
                {
                    tempArray[i] = new byte[channels];
                }
                unsafe
                {

                    roiImg.ForEachAsByte((pixel, position) =>
                    {
  
                        for (int i = 0; i < channels; i++)
                        {

                            tempArray[position[1] * roi.Height + position[0]][i] = pixel[i];
                        }
                    });
                }

                return tempArray;
            }
```

positionがどう使うのか良く分からなかったですがとりあえずこれで通りました。
ポインタの指す先がxで1個次にyが入ってる？？
pixelはよく使うのはRGBかBGRもしくはグレースケールの1チャンネルでしょうか。
RGBの場合はpixel[0] : R / pixel[1] : G / pixel[2] : Bで、
グレースケールの場合の場合はpixel[0]のみ使う感じですね。
Amazon WorkSpaces で Amazon WorkDocs を有効にする（Microsoft AD 環境）

ちょっとハマったのでメモ

Amazon WorkSpaces でサクッと使える共有ストレージとして Amazon WorkDocs を使いたかったのですが、 WorkSpaces 側のディレクトリが Microsoft AD だと WorkDocs を**マネジメントコンソールから選択することができません。**

cli からなら設定できるということなので、[Developers.io さんの記事を参考に](https://dev.classmethod.jp/articles/microsoftad_workspaces_workdocs_enable/) や
ってみました。

```
aws workspaces register-workspace-directory --directory-id {ディレクトリ ID} --enable-work-docs
```

エラーも出ずに正常終了するのですが、なぜかディレクトリのステータスで WorkDocs が「無効」のまま。反映までに時間がかかるのかなと思ってしばらく置いても変わらず・・・。

## AWS に問い合わせ
AWS に問い合わせたところ、コマンドが違っていたようです。
正しくは `modify-workspace-creation-properties` でした。
https://docs.aws.amazon.com/cli/latest/reference/workspaces/modify-workspace-creation-properties.html

```
aws workspaces modify-workspace-creation-properties --resource-id {ディレクトリ ID} --workspace-creation-properties EnableWorkDocs=true
```

コマンド実行後、無事 WorkDocs が有効化されました。

![スクリーンショット 2021-02-16 12.02.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149365/acd52b28-75d7-4384-e263-a0a34399a967.png)

以上
[Android]RecyclerViewのアイテムが表示されない？

#Android開発は始めたばかり
Adapterのオーバーライドメソッドが呼ばれないため表示されないようでした。
#原因はLayoutManager

```xml
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
```

これを明示的に入れなければいけませんでした。
【Rails】Whenever gemを使って、ゲストユーザーの投稿を定期的に自動削除する

## 前提・実装イメージ
+ Rails5
+ Whenever gem使用
+ 特定できる固定のデータをゲストユーザーが持っている（今回はemailで特定します。）

ゲストログイン機能の実装は割愛します。
参考：[簡単ログイン・ゲストログイン機能の実装方法（ポートフォリオ用）](https://qiita.com/take18k_tech/items/35f9b5883f5be4c6e104)

各項目に参考にさせて頂いた記事を記載しながら進めていきます。
実装後の投稿のため、
抜けている、間違っている、補足等あればご教授いただけますと幸いです。

## Whenever gemインストール
参考：[Railsでwheneverを使ってcronを設定する](https://qiita.com/Esfahan/items/e7a924f7078faf3294f2)

```ruby:Gemfile
gem 'whenever', require: false
```

```command
bundle install
```

## 初期化
下記コマンドでconfig直下にschedule.rbファイルが生成されます。
すでにgemインストール済でschedule.rbがある場合は不要です。

```command
bundle exec wheneverize
```
後ほど、schedule.rbへの記述を行います。

## ゲストユーザーの投稿を削除するメゾッドを作成
参考：[find、find_by、whereの違い](https://qiita.com/tsuchinoko_run/items/f3926caaec461cfa1ca3)
参考：[【Rails】destroy_allメソッドの使い方を徹底解説！](https://pikawaka.com/rails/destroy_all)

app/libの配下にdata_guest.rbを作成し、以下のように記述します。
find_byでゲストユーザーを特定し、destroy_allでその投稿を削除します。
※ゲストの特定条件や、削除する投稿のテーブル名は適用するものに変更してください。
ゲストユーザーが投稿したpostとcommentを削除する場合は下記の感じです。

```app/lib/data_guest.rb
class Guestuser::DataGuest

  # guestuserの投稿を削除
  def self.data_reset
    user = User.find_by(email: "ゲストユーザーのemail")
    user.tweets.destroy_all
    user.comments.destroy_all
  end
end
```

## data_guest.rbへのpathsを設定
参考：[Rails5のproduction環境でlib/配下のクラス読込みがNameErrorになるのはautoloadが無効化されたからだった](https://qiita.com/yagi___/items/edc46fd976526279312b)

上で作成したdata_guest.rbが読み込まれるようconfig/application.rbへ下記1行を追加。

```config/application.rb
config.paths.add 'lib', eager_load: true
```

## schedule.rbへの記述
data_guest.rbで定義したdata_resetメゾッドを定期的に実行する命令を
先ほど生成したschedule.rbへ記述します。

```config/schedule.rb
# Rails.rootを使用するために必要
require File.expand_path(File.dirname(__FILE__) + "/environment")
# cronを実行する環境変数
rails_env = ENV['RAILS_ENV'] || :development
# cronを実行する環境変数をセット
set :environment, rails_env
# cronのログの吐き出し場所
set :output, "#{Rails.root}/log/cron.log"

#30分に一度、data_resetメゾッドが実行される記述
#テストする際は下記を3.minuteとかに変えた方がいいかもしれません。
every 30.minute do
  begin
    runner "Guestuser::DataGuest.data_reset"
  rescue => e
    Rails.logger.error("aborted rails runner")
    raise e
  end
end
```

## 定期処理実行の確認
以下コマンドでschedule.rbの内容をcrontabに反映させます。

```command
bundle exec whenever

bundle exec whenever --update-crontab
```

cronの起動

```command
sudo systemctl start crond

# 止める際は下記
sudo systemctl stop crond
```

これで定期的にdata_resetメゾッドが実行されてゲストユーザーの投稿が削除されるはずです。

## 補足
ゲストログインをfind_or_create_byで実装した場合は、
毎度ユーザー自体を消すというやり方でも可能と思いますが、
ゲスト操作中に消えてしまう恐れがある点と、
消す投稿データを選べるという点でこちらで実装しました。
（postは消すが、いいねは消さない…　等）

同じ要領で、他の定期処理も増やしていけます。

なお、本番環境では、bundle exec whenever RAILS_ENV=productionを実行する前に、
export RAILS_ENV=productionを実行しなければ、
developmentの方に上書きされて反映できません。
結構ハマってしまったポイントですので参考記事を貼っておきます。

 参考：[【rails】production環境でバッチ処理の環境読み込みがdevelopmentになってしまうときの対処法](https://qiita.com/kaino5454/items/8bb663ff69c387f16597)
Rでラベルの読み替え（数値⇔ラベルの変換）

# はじめに
例えば以下のようなデータがあった場合を考える。

|NAME|HEIGHT|SEX|y|
|--:|--:|--:|--:|
|Taro|170.6| 1| 0 |
|Hanako|158.3|2|0|
|Jiro|172.1|1|1|

三列目は性別を表していて、1=male（男性）、2=female（女性）である。四列目はアンケートの回答を表していて、0=no、1=yesである。これを文字列を含んだデータに直したいというのが今回の課題。

# データ生成
上記のテーブルをRに組み込む。csvからの読み込みを想定してdata.frameにしておく。

```R:コード
NAME <- c("Taro", "Hanako", "Jiro")
HEIGHT <- c(170.6, 158.3, 172.1)
SEX <- c(1, 2, 1)
y <- c(0, 0, 1)

dat <- data.frame(NAME, HEIGHT, SEX, y)
dat
```

```:出力
    NAME HEIGHT SEX y
1   Taro  170.6   1 0
2 Hanako  158.3   2 0
3   Jiro  172.1   1 1
```

# name 付きベクトルで一括変換
nameが付いたベクトルを用いてリストの中身を一括変換する方法で実装する。

```R:コード
#male, female に直す関数
tomf <- function(x) { 
  label2mf <- c("1"="male", "2"="female")
  label2mf[as.character(x)]
}

#yes, no に直す関数
toyn <- function(x) { 
  label2yn <- c("0"="no", "1"="yes")
  label2yn[as.character(x)]
}

#列名から列番号を取得
n.sex <- which(colnames(dat)=="SEX")
n.y <- which(colnames(dat)=="y")

#変換
dat[,n.sex] <- tomf(dat[,n.sex]) #dat[,3] のように直接指定しても問題無し。
dat[,n.y] <- toyn(dat[,n.y])

dat
```

```:出力
    NAME HEIGHT    SEX   y
1   Taro  170.6   male  no
2 Hanako  158.3 female  no
3   Jiro  172.1   male yes
```

性別、yが文字列に変換されているdata.frameが出来上がった。
逆に文字列から数値に直したい場合は label2mf <- c("male"=1, "female"=2) などベクトルの中身を逆にすればよい。

# おわりに
この方法だと確かに変換はできるが、変換ごとに関数を作る、列名から列番号を吸い出す作業が必要になる。もっといい変換方法があれば是非コメント下さい！
[Git] サイズのでかいファイルをコミットして github にpushできなくなった人が読むと幸せになれるかもしれない記事

# はじめに
gitは差分を管理したりするのに便利な一方で最初に一気にプログラムを書き上げてからfirst commitする人も結構いると思います。
このときに面倒なのが git add です。

横着して `git add .` とかすると意図しないファイルを巻き込んでいることがあります。
例えば機械学習をされている方でしたら、機械学習のモデルのファイルとかです。

本来であれば最強のオリジナル `.gitignore` を作れば解決することが多いですが、うっかりやらかしてしまうことがあるとおもいます。
そしてそれに気づいたとき、既に大量にコミットをしていて死にたくなることがあると思います。

そういう時に事故は起こるわけです。


# push できない！
githubでは1ファイルあたりの制限があり、100MB以上のファイルをpushすることができません。
じゃあそのファイルを `.gitignore` に追加すればええか！となるのですが、あとから追加しても時既に遅し、`.gitignore` に追加して追跡対象外にした、つまり「ファイルを削除した」という履歴が残ってしまいます。
そのため git 上の歴史では **あるでかいサイズのファイルが存在して、そして消えていった** と残されることになり、結果としてでかいファイルの生きた証がでかいファイルサイズのまま残っているため、今は実際にそのファイルがなくても以下のようなエラーが出ます。

> remote: error: GH001: Large files detected. You may want to try Git Large File Storage — https://git-lfs.github.com.

直前のコミットででかいファイルを追加しただけなら、そのコミットをなかったことにして `.gitignore` に追加してコミットしなおせば良いだけですが、first commitとかでやらかしているとそうはいきません。

# 歴史からでかいファイルの生きた証を抹消する
というわけでgitの歴史からでかいファイルの存在を抹消すればよいわけです。

```bash
% git filter-branch -f --index-filter "git rm -rf --cached --ignore-unmatch [歴史から抹消したいファイル名]" --prune-empty HEAD
```

`HEAD` の部分を `--all` にすると全ブランチを対象に同じ操作が行えるらしいです。

ただしこの方法を取るとそのファイルが存在したコミットから先の歴史がすべて改変されることになるためハッシュが変わります。
そのため、もし既に何らかの方法でgithub等にpushされていた場合、そのままpushできないので`git push -f` とかしないといけません。(通常ならでかいファイルはgithub上に存在し得ないですが、何らかの理由でファイルサイズが増大して100MBを一時的にでも超えると起こりうる)

おそらくこれでpushできるようになるはずです。`.gitignore` にでかいファイルを対象外に設定しておくことを忘れずに。

# 終わりに

- でかいファイルはgit-lfsを使ったりとか、driveなりdropboxからダウンロードするようにしましょう
- でかいファイルをaddしないようにしましょう
- でかいファイルは `.gitignore` で無視するようにしましょう
- 横着して `git add .` しないようにしましょう
- 横着して `git add .` しないようにしましょう

大事なことなので2回言いました。おわり。

# 参考
https://note.dokeep.jp/post/git-filter-branch-rm/
【kintone】標準機能で「年度」を計算する

日付フィールドから年度を~~無理やり~~計算するアプリを作ってみました。

@nakaji32 さんに計算フィールドでDATE_FORMAT(日付, "YYYY", "Asia/Tokyo")ができると教えてもらいまして、修正しました(*ﾉω・*)ﾃﾍ
nakaji32 さん、ありがとうございました✨✨

日付を選ぶと年度を計算してくれます↓

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/90dbd6a2-6468-cff4-4a2c-842961ab2d08.gif" width="600px">


# フォーム

年度始まりの月を設定します。
変換した月が年度始まりの月未満だったら年から1を引きます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/4e5c5d07-6785-68e6-763a-d46b8d96a849.png" width="500px">


## フィールド
|フィールド種類  | フィールド名／コード式 | 計算式など|
|:-:|:-:|:-:|
| 日付  | 日付  |   |
| 計算  |  年 | DATE_FORMAT(日付, "YYYY", "Asia/Tokyo")  |
| 計算  |  月 | DATE_FORMAT(日付, "M", "Asia/Tokyo")   |
| 数値  | 年度始まりの月  |   |
| 計算  | 年度  | IF(月<年度始まりの月,年-1, 年) |


# しくみ

## 年の文字列を年の数値に変換する
~~まず、kintone標準機能では文字列→数値の変換ができないので
日付の年を数値で取り出すことができません。
そこで、テーブルに↓のような文字列→数値変換対応する値を入力しておき（Excel読み込み）
IF(年文字=年文字t, 年数値,0)
の数式で、日付から取り出した年と等しければその年を、等しくなければ0とします。
この列のSUMをとれば、年の文字列を年の数値に「無理やり」変換することができます。
月も同様です。~~

## 年を年度に変換する

同様に日付の月も数値で取り出したら、年度始まりの月（例では4にしています）と比較し、4以上だったら今年を年度に、4未満だったら昨年を年度にします。

`IF(月<年度始まりの月,年-1, 年)`

# まとめ
以上のように、日付から年度に無理やり変換してみました。
kintoneの日付はUNIX時間のようなので2038年問題が関係してきますが、きっとその前に日付などの仕様が変更になって使いやすくなるんじゃないかなぁ～と思います。