OmniAICreator/Qiita-1.07M huggingface dataset:
Laravelの基礎 ~マイグレーション~

Laravel(6系)の公式ページで紹介されているマイグレーションについて簡単にまとめました。

##マイグレーションファイルの作成
マイグレーションファイルを作成する時の基本的な書き方

```:ターミナル
php artisan make:migration すること_テーブル名_table
```

新しくテーブルを作成する時はオプションに--createを指定します。

```:ターミナル
php artisan make:migration create_テーブル名_table --create=テーブル名

php artisan make:migration create_users_table --create=users
```
既存のテーブルに変更や追加をする時はオプションに--tableを指定します。

```:ターミナル
php artisan make:migration すること_テーブル名_table --table=テーブル名

php artisan make:migration add_pic_to_posts_table --table=posts
```

##マイグレーションの記述

```.php
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class □□○○Table extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('テーブル名', function (Blueprint $table) {
             // マイグレーション実行した時の処理
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('テーブル名', function (Blueprint $table) {
             // ロールバックした時の処理
             // up()の処理を取り消す
        });
    }
}
```

###よく使うカラム

|コマンド|説明|
|:---:|:---:|
|$table->integer('votes');|INTEGERカラム|
|$table->unsignedBigInteger('votes');|符号なしBIGINTカラム|
|$table->string('name', 100);|文字長を指定したVARCHARカラム|
|$table->text('description');|TEXTカラム|
|$table->timestamps(0);|有効（全体）桁数指定でNULL値可能なcreated_atとupdated_atカラム追加|
|$table->boolean('confirmed');|BOOLEANカラム|
stringはnameなど短い文字列、textはコメントなど長い文字列。

###よく使う修飾子

|修飾子|説明|
|:---:|:---:|
|->after('column')|指定カラムの次に他のカラムを設置|
|->autoIncrement()|整数カラムを自動増分ID（主キー）へ設定|
|->charset('utf8')|カラムへキャラクタセットを指定
|->collation('utf8_unicode_ci')|カラムへコレーションを指定|
|->comment('my comment')|カラムにコメント追加|
|->default($value)|カラムのデフォルト(default)値設定|
|->first()|カラムをテーブルの最初(first)に設置する
|->nullable($value = true)|（デフォルトで）NULL値をカラムに挿入する|
|->storedAs($expression)|stored generatedカラムを生成|
|->unsigned()|整数カラムを符号なしに設定|

##マイグレーションの実行

マイグレーションファイルのup()の処理を実行する時、migrateを使います。

```:ターミナル
php artisan migrate
```
マイグレーションファイルのdown()の処理を実行する時、rollbackを使います。

```:ターミナル
php artisan migrate:rollback
```

rollbackにstepオプションを付けることで、巻き戻す数を指定できます。

```:ターミナル
php artisan migrate:rollback --step=5
```
バージョン管理しているXcodeのファイル右横にあるマーク

#はじめに
私は、バージョン管理システムにGitを使用してソースコードを管理しています。
開発している際に、ファイル右横にマークが出てくるけど何だろう？とずっと思っていました。

気になるし、後から見たいので備忘録としてまとめます。

そもそも、バージョン管理って何？という方はこちらの記事を読んでみて下さい。
[ガチで5分で分かる分散型バージョン管理システムGit](https://www.atmarkit.co.jp/ait/articles/1307/05/news028.html)

#本題
調べてみると、このマークは「**バージョン管理ステータスラベル**」を表しているそうで
ファイル等に何らかの変更があれば、自動的にXcodeが記してくれます。

下記にマークとその意味をまとめてみました。

|マーク|意味|
|:---:|:---:|
|A|追加されたファイル|
|M|変更が加えられたファイル|
|D|削除されたファイル|
|R|ファイルが置き換えられている|
|-|フォルダの内容のステータスが混在している|
|?|何らかの理由でgitの管理対象から外れている|

#まとめ
上のマークの意味が間違っていたり、他にもマークがあるよ！っていう方は
気軽にコメントして下さると嬉しいです。
2020年プログラミング学習アウトプットの総括

#はじめに
　2020年最後の投稿は、今年投稿した中で、特に力を入れたものやそれに関連する投稿をまとめてみました。

##Rails編


###deviseでユーザー管理機能

- [初見で難解だったdeviseを改めてまとめてみた](https://qiita.com/TerToEer_sho/items/b5523ad100d08126a547)

- [続・初見で難解だったdeviseを改めてまとめてみた](https://qiita.com/TerToEer_sho/items/9231d4fd8155dd3063be)

- [ブラックボックスに感じていたdeviseのコントローラーを触ってみた
](https://qiita.com/TerToEer_sho/items/edb101ce4dcbfd45b4a0)

- [本日の学習まとめ　ユーザー管理機能実装にて](https://qiita.com/TerToEer_sho/items/36ef668e52883e9939a4)

- [deviseでサインインのエラーハンドリング の方法](https://qiita.com/TerToEer_sho/items/bbd1318022d35c198160)

- [deviseだけで管理者を設定したい
](https://qiita.com/TerToEer_sho/items/07b64f72bc6e8660103b)

- [そうだったのか、user_signed_in?メソッド](https://qiita.com/TerToEer_sho/items/cf9ad88593b4c8b8cdbb)

---

###ActiveStorageで画像を投稿・表示


- [ActiveStorageを使って、画像投稿機能実装までの流れ
](https://qiita.com/TerToEer_sho/items/7f8f42503e3100c652d5)

- [続・ActiveStorageを使って、画像投稿機能実装までの流れ
](https://qiita.com/TerToEer_sho/items/045c46d9f5e10ce91d5e)

---

###ActiveHash

- [データベースになくても、データとして扱える活動的なハッシュ](https://qiita.com/TerToEer_sho/items/9b6fa469e1808f015582)

- [続・データベースになくても、データとして扱える活動的なハッシュ　〜表示編
](https://qiita.com/TerToEer_sho/items/27794690dd602b8ba786)

---

###RSpec
- [もう迷わない！RSpec導入の流れ](https://qiita.com/TerToEer_sho/items/472e14df6fbb8e83ebf9)
- [RSpec導入後、モデルの単体テストコードを書き始めるまで](https://qiita.com/TerToEer_sho/items/2d42c0cdb7a623a32119)
 
- [RSpecのテストコード実行編](https://qiita.com/TerToEer_sho/items/1d67ac953a91c03d70ed)

- [FactoryBot、外部キーバリデーションで弾かれたときの解決方法
](https://qiita.com/TerToEer_sho/items/a2973d05c1de6eba2b6a)

##Notion編

###Notionにコードをメモと共にストックしておく方法
- [Notionこそ、codeのストックにおいて最強！
](https://qiita.com/TerToEer_sho/items/c553b1d26fef86c186ef)

###NotionにWebページを保存する方法
- [NotionにQiitaのストックをストック、かつ、様々なWebページも一元管理
](https://qiita.com/TerToEer_sho/items/a33366b09fdba72fc12e)

##おわりに
　今年の9月26日に初めて投稿してから、今日まで毎日投稿してきました。12月31にち現在で、96投稿することができました。正直、日によっては質の低い投稿もあったかと思います。それでも、投稿内容に間違いや補足があると、コメントをくださり、投稿することを通して、受け身で学習するよりも理解度は遥かに濃くなったと思います。来年も引き続き毎日投稿することを目標にして、プログラミングを中心に学習をしていく予定です。来年は今年以上に成長できる年になりますように☺️
ValueError: only one element tensors can be converted to Python scalars の対処法

# はじめに
pytorchをいじっていると稀によくわからないエラーに出くわします．今回は私が遭遇したValueError: only one element tensors can be converted to Python scalars の対処法を紹介します．

# 原因
torch.Tensorをlistにしてそれをまるごとtorch.tensor()やtorch.as_tensor()につっこむとタイトルにある通りのエラーが吐き出されます．ただし，Tensorのサイズが１より大きいときにしか発生しないです (多分)．TensorのlistをまとめてTensorに変換したい場合はtorch.stackを使いましょう．以下，コード例です．

# コード例
```python3
a = torch.ones([1])
b = torch.tensor([a])
c = torch.as_tensor([a]) # ここまでは大丈夫

a = torch.ones([2, 2])
b = torch.tensor([a]) # 死ぬ
c = torch.tensor([b]) # 死ぬ
d = torch.stack([a], dim=0) # size = (1, 2, 2) のテンソルができる．defaultではdim=0
```

# おわりに
二次元リストの場合はこの方法は使えないです．
Ruby には型が無い，のか？

「Ruby は型が無い」という記述をときどき目にします。
本当でしょうか。
~~あまり正確な表現とは言えません。~~何をもって「型がある／ない」とするかによりますが，「Ruby は型が無い」は誤解を招くおそれがあります。

データ自身の型と，データを受けるもの（変数・仮引数など）の型を分けて考えるべきでしょう。

Ruby では

* 変数
* 定数
* メソッドの仮引数
* ブロックパラメーター

には型がありません。
型宣言というものが文法的に存在しませんし，文字列を代入した変数に浮動小数点数を再代入することもできます。引数を取るメソッドにどんなオブジェクトを渡すことも可能です[^m]。
つまり，データの受け側には型は無いということですね。

[^m]: ただし，実引数を渡してメソッドが実行されたところで TypeError を出すことはあります。

一方，組込みクラスだけ見てもデータの型は豊富です。
まあ，ナウいヤングは Ruby のクラスが豊かと言われてもピンとこないかもしれませんが，大昔は文字列型，整数型，実数型（浮動小数点数），論理型，配列型といったように，数えるほどしか型の無いプログラミング言語はざらにあったのです。
現代のプログラミング言語のなかでも，どちらかと言えば組込みの型（クラス）が充実しているほうではないでしょうか。

さて，なんとなく Ruby のデータの型はクラスであるとして書いてきましたが，もう少し広く捉えることもできます。
公式リファレンスの用語集の「データ型」をご覧ください。
[Ruby用語集 (Ruby 3.0.0 リファレンスマニュアル)](https://docs.ruby-lang.org/ja/3.0.0/doc/glossary.html)

Ruby 3.0.0 で受け側にも型が導入されました。といっても，Ruby のプログラム自体には型の記述をしないのですが。
VueでFirebaseを使うと "export 'firestore' (imported as 'firebase') was not found in 'firebase/app' 解決法

#VueプロジェクトでFirebaseが見つからないと言われた
[こちらのサイト](https://savvyapps.com/blog/definitive-guide-building-web-app-vuejs-firebase)を参考にVue + Firebaseのアプリケーションを作成した時、思わぬところで詰まった。。。:sweat:

そう、**タイトル通りfirebaseが見つからないと言われるのだ。。。**

firebaseをインストール

```console
npm i firebase
```

firebase.jsを作成

```javascript:src/firebase.js
import * as firebase from 'firebase/app'
import 'firebase/auth'
import 'firebase/firestore'

// firebase init - add your own config here
const firebaseConfig = {
  apiKey: '',
  authDomain: '',
  databaseURL: '',
  projectId: '',
  storageBucket: '',
  messagingSenderId: '',
  appId: ''
}
firebase.initializeApp(firebaseConfig)

// utils
const db = firebase.firestore()
const auth = firebase.auth()

// collection references
const usersCollection = db.collection('users')
const postsCollection = db.collection('posts')
const commentsCollection = db.collection('comments')
const likesCollection = db.collection('likes')

// export utils/refs
export {
  db,
  auth,
  usersCollection,
  postsCollection,
  commentsCollection,
  likesCollection
}
```

`firebase.js`でexportしたものを`main.js`でimport

```javascript:src/main.js
import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
import { auth } from './firebase'

Vue.config.productionTip = false

let app
auth.onAuthStateChanged(() => {
  if (!app) {
    app = new Vue({
      router,
      store,
      render: h => h(App)
    }).$mount('#app')
  }
})
```

これで`npm run serve`したら、、、

```console
 warning  in ./src/firebase.js

"export 'auth' (imported as 'firebase') was not found in 'firebase/app'

 warning  in ./src/firebase.js

"export 'firestore' (imported as 'firebase') was not found in 'firebase/app'

 warning  in ./src/firebase.js

"export 'initializeApp' (imported as 'firebase') was not found in 'firebase/app'
```

**なんでやねーーーん！！！**

#Firebaseのバージョンアップによる変化でした
[こちら](https://firebase.google.com/support/release-notes/js#version_800_-_october_26_2020)を確認するとわかるように、Firebaseのバージョンが8.0.0以上で、大きな変化があったようです。。

まずpackage.jsonでインストールしたfirebaseのバージョンを確認しましょう。

```json:package.json
 "firebase": "^8.2.1",
```

ふむ。確かに8以上だ。

と言う訳で、

```javascript
// Before 8.0.0
import * as firebase from 'firebase/app'

// After 8.0.0
import firebase from 'firebase/app'
```

`firebase.js`上記のように編集


```javascript:src/firebase.js
import firebase from 'firebase/app'
```

これで解決しました:smile:


#参考
https://stackoverflow.com/questions/64545862/upgrade-to-firebase-js-8-0-0-attempted-import-error-app-is-not-exported-from
Ubuntuに最速でVisual Studio Codeをインストールする

## 結論

```bash
$ sudo apt install -y apt-transport-https \
      echo -e "deb [arch=amd64] https://packages.microsoft.com/repos/vscode stable main" | sudo tee /etc/apt/sources.list.d/vscode.list \
      wget -O - https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add - \
      sudo apt update \
      sudo apt install -y code
```

今まで公式サイトから.debファイルをダウンロードしてインストールしていたが、めんどくさいのでPPA経由でインストールできないか調べてみた。いろんなやり方があるようだが、公開鍵が.asc形式なら.gpg形式に変換しなくてもいいのではないかと思いメモ。

## 前提
- snapやflatpakではなくaptを使う

## 解説
```bash
$ sudo apt install -y apt-transport-https
```

MicrosoftのPPAがhttpsのため、`apt-transport-https`というパッケージを入れてあげる必要があるらしい。

```bash
$ echo -e "deb [arch=amd64] https://packages.microsoft.com/repos/vscode stable main" | sudo tee /etc/apt/sources.list.d/vscode.list
```

PPAのファイルを作成する。ファイルの場所のパーミッションの関係で、リダイレクトではなく`tee`コマンドを使用する。

```bash
$ wget -O - https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -
```

公開鍵を取得してaptに追加する。あとはパッケージリストを更新してインストールするだけ。

## 参考文献
- [UbuntuにVSCodeをインストールする3つの方法 - Qiita](https://qiita.com/yoshiyasu1111/items/e21a77ed68b52cb5f7c8)
-  [【サクッと解決】Ubuntu VSCodeをインストールする │ wonwon eater](https://wonwon-eater.com/ubuntu-vscode/)
UE4　第3日目　年末マテリアル廻り強化プログラム


今回は雲海を作ろうと思います。
以前仕事で雲海的な事を表現しようとした時にカスケードだと、
魔改造でもしないと、出来ない事に気づいたので、カスケードなしでの
雲海の作成の仕方について書きたいと思います。


まずカスケードの悪い点がビルボードの仕組みです。
カスケードは基本的にカメラビルボードしかなく、画面ビルボードが設定できません。
どうなるかって言うと以下の設定でこうなります。

ＰＳＡSquareで雲配置してカメラを回転させると雲一緒に回転します。
（回転するのはいいんだが回転の仕方が変。カメラビルボードだからだとおもう。）
（GIFでも乗っけられないのがうざい。。。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/989363/0b053510-adfd-077b-c84d-164d1cd874ba.png)

https://www.youtube.com/watch?v=TGE7LlelDz0&feature=youtu.be

またPSA　Facing Camera Positionでやると以下のようになります。
カメラが移動するとくるくる回る！
（いつもより多めに回っております！）
うん　うざい　　回って欲しくない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/989363/488bf31d-037e-8db8-b03f-c4254bb8364d.png)

https://www.youtube.com/watch?v=LfqXuPP0uSU&feature=youtu.be

そこで解決する方法がSpriteって言うのノード使って雲を配置すると
みんなが求めてビルボードになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/989363/ad72c510-0d34-55d1-22bb-1a6bb6559f40.png)

これをワールド位置オフセットに差し込めば、画面ビルボードになる
ただしBPとか回転の制御をしようとしても、上書きができないので逆回転とかできない。


そうするとエフェクターが求めてる回転にはなる。

それで作った雲海の動画です。

https://www.youtube.com/watch?v=cUSRU4o-uv0&feature=youtu.be

マテリアル内はでは色々複雑な事をやっているのでいつかご紹介を。
基本的には今日によって雲が透けていくレンジオパシティ、フローマップを中心からではなく全体が歪むようにしたり、その他も。
MacのAutomatorを使ってターミナル上で複数の画像ファイルからPDFを作成する

# はじめに
Macで複数の画像ファイルからPDFファイルを作成する方法は、GUI・CUI合わせて複数存在する。
いくつか例を示すと以下が存在する。

1. Finderで画像ファイルを選択し、副クリックからクイックアクション(「PDFを作成」)で作成（GUI）
2. プレビュー.appで作成（GUI）
3. ImageMagickをインストールして、`convert *.png hoge.pdf`（CUI）

GUIで行う場合、標準機能を用いるため操作が楽である反面、欲しいPDFファイルが複数ある場合などに都度操作をする必要がある。
また、CUIでImageMagickを用いる場合、欲しいPDFファイルが複数ある場合にループの処理で扱える反面、数値の指定など設定が必要であり解像度に不満が残るケースがある。
手元の環境では、1の方法と3の方法で作成したPDFファイルを比較すると、1の方法では素直に画像ファイルをPDFに変換しているように見える。
それに対し、3の方法では解像度などが落ち、ジャギーが発生するなど損失が起こる。

この問題に対し、Macの標準に備わっているPDFの作成機能をCUIで用いる解決策を本記事では述べる。

手順のフローを以下に示す。

1. Automatorで「複数の画像ファイルからPDFを作成する」.appを作成する。
2. 1で作成したappを端末上から実行する。

また、画像ファイルのディレクトリ構成は以下を想定している。
ImageDirの中に連番で画像ファイルが配置されている。

```
|--ImageDir0
  |- 001.png
  |- 002.png
  |- 003.png
|--ImageDir1
  |- 001.png
  |- 002.png
  |- 003.png
|-ImageDir2
  |- 001.png
  |- 002.png
  |- 003.png
```

## アプリケーションの内容
Automatorを起動し、「新規作成」から「アプリケーション」を選択し、以下の内容のアプリケーションを作成する。
![スクリーンショット 2020-12-30 17.29.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180925/16424ced-1330-9468-c86f-3198ce346acf.png)

「Finder項目を並び替える」では、PDFファイルのページの並び方を画像ファイルの連番の並びになるよう指定している。この項目がないと、画像ファイルが連番となっていても、ページの並びがあべこべになった。

「イメージから新規PDFを作成」では、デスクトップに「イメージから作成した新しいPDF出力.pdf」が保存される。出力の保存先に汎用性がない設定となっている。

## アプリケーションの保存
「アプリケーションの内容」で作成したものを、適当な名前（本稿では「gen_pdf.app」とする）で適当なディレクトリ（本稿ではホームディレクトリ）に保存する。

## アプリケーションの実行
ちなみに作成したappにImageDirをドラッグアンドドロップすると、デスクトップにPDFファイルが作成される。
![スクリーンショット 2020-12-30 17.48.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180925/80d0ebd9-cdf2-26a9-3e7d-1087451dcce9.png)


以降では、作成したアプリーケションを端末上から実行する
ImageDirの階層から、以下を実行することで、上と同じ実行が行われる。

```bash:端末
open -a ~/gen_pdf.app ImageDir
```

## Pythonからの実行

複数のPDF作成を行うため、また、出力PDFのファイル名を指定しやすくするため、Pythonからsubprocessを用いる。

流れとして

1. ImageDirからPDFを作成（Automator上で指定した保存先に保存）
2. 同時にImageDirの番号を保存したいフォルダへの`mv`コマンドを作成

2でmvコマンドを作成する理由は、`open`コマンドの実行終了の通知がPDFの作成実行のタイミングより早く、subprocessで`mv`コマンドが実行できないためである。
そのため、`print`で`mv`コマンドを出力し、全てのPDFが作成完了した段階で、出力をコピーし`mv`コマンドをペーストし実行することで解決する。

```python:python
import os
import glob
import subprocess

# 最終的なPDFの保存先
out_dir = 'pdf'
if not os.path.exists(out_dir):
    os.mkdir(out_dir)

n = {フォルダ数}
for i in range(n):
    in_path = './ImageDir{}'.format(i)
    subprocess.call(['open', '-a', '/${appのパス}/gen_pdf.app', in_path])
    if i == 0:
        print('mv ${appで指定したPDFの保存先}/story.pdf ./{}.pdf'.format(i, i))
    else:
        print('mv ${appで指定したPDFの保存先}/story-{}.pdf ./{}.pdf'.format(i))
```

```text:端末の出力
mv ${appで指定したPDFの保存先}/story.pdf ./0.pdf
mv ${appで指定したPDFの保存先}/story-1.pdf ./1.pdf
mv ${appで指定したPDFの保存先}/story-2.pdf ./2.pdf
```

端末の出力をコピーし実行することで、最終的に保存したいフォルダへPDFファイルを保存する。

# 最後に
GUIで動かすものをCUIで動かすため、少しひねくれた方法となった。
しかし、素直に画像からPDFファイルを作成でき、繰り返しによる多量の作成を可能にした。
APIを『叩く』ってなんだ

# 共通言語

どれほどプログラミングに慣れるとこういうことを言うようになるのかわからないが、なぜかみんな知らないうちに「**よしなに**」とか「**まさかり**」とか掲題のような言い回しをするようになる。不思議だ。
そうした言葉を検索してみると、ぼくに関わる一部の人だけが言ってるわけではないようだ。
初めは違和感を持っていた入門者が、そのうちそれを口にするようになる。

**不思議の国のSE用語**
https://qiita.com/t_nakayama0714/items/478a8ed3a9ae143ad854

そうして慣れていくのだ。
しかし謙虚な気持ちは忘れないようにしたい。

## APIを叩く

『**APIキーとパラメータを持って提供先のドアを叩きに行く**』というイメージで覚える。
APIキーは会員証みたいなもので、提供先との取引に必要になる。
パラメータは例えば音楽関係のAPIの場合、入力フォームに曲名（パラメータ）を書くと、提供先がそれに対して**JSON形式**でアーティスト名や収録アルバムなどをデータを送ってきてくれる。その中から必要なデータのみ（例えばアーティスト名のみ、など）を抽出して使う。

入社時期の近い同僚が「**ここでAPIを叩くとですね**」みたいなことをあまりにも慣れた口調で言うもんだから「ちょっと待ってくれよ」という気持ちになってしまう。
EclipseのProject FacetsにJavaServer Faces(JSF)がない

# 事象 : Project FacetsにJavaServer Facesがない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/0dd4f35b-68e9-adb2-3ffd-51d0a52bf957.png)

## 原因 : Javaのプラグインがインストールされていないから
最近Pleiades All in One(https://mergedoc.osdn.jp/) ばかり使っていてたところ、久しぶりに普通のEclipse(https://www.eclipse.org/) を使ったら何がプラグインか分からなくなっていた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/6cc31d97-3baf-649b-0adf-3779c6968161.png)

### 対応 : Eclipse Enterprise Java Developer Toolsをインストールする
1. [Help] > [Market place...]でダイアログを表示
2. 「Java Developer Tools」を検索
3. 「Eclipse Enterprise Java Developer Tools」の[Install]ボタンでダイアログを表示
4. ダイアログに従ってインストールしてEclipseを再起動する
5. [Project Explorer]でプロジェクトを選択して右クリック > [Properties]でダイアログを表示
6. [Project Facets] > [JavaServer Faces]が表示された！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/f782af1b-b24f-05d2-c6f6-6a0acfa89133.png)
画像ダイエットアプリ「little wings」をリリースしました!!

![https://kiwing.ddns.net/](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246065/d4f6ed15-7994-a82e-432a-d8d3f5768a22.gif)


# みんな使ってね！！＼(^o^)／

大晦日ですが、Webアプリ開発しています。
せっかくリリースしたんですが誰も利用してくれなくて泣きそうなのでPRがてら紹介させてください...ｗ

## 履歴

12/20 着想
12/28 v0.1リリース
12/31 v0.4リリース

## 制作までの経緯

最近のスマホカメラの画像って性能が良くなっているので、当たり前に4Kサイズだし、調子に乗って風景とか撮ると普通に1枚**5MB**とかあったりするんすよね。

なので私はWebにD&Dするだけで画像のサイズが半分くらいになる**[kraken.io](https://kraken.io/)**というサービスを愛用していました。画像の劣化も300%ズームして見比べても、よく分からないレベルなのに、ファイルサイズは半分!!とかすごい技術ですよね。

ただフリーミアム型のサービスなんで課金しないと結構制限があるんです。

1. 1ファイル**2MB**まで
2. zipとか圧縮ファイルは駄目

## 文句があるなら自分で作る

幸い自分にはラズベリーパイという**神が作り給うた機械**があったので、それを母艦に**kraken.io**を超えるサービスを出すぜ!!

## 実装した機能

1. 上限いっぱい夢いっぱい(1ファイル100MBまで)
2. 複数ファイルをD&D出来ること
3. 投げっぱなしでOK(ドラッグアンドフォーゲット)

## Appオーバービュー

- フロント
    - [bootstrap 5](https://getbootstrap.com/)
    - js + [axios](https://github.com/axios/axios/)
- サーバー
    - ラズベリーパイ4 8GB
        - [nginx](http://nginx.org/)
        - [PHP](https://www.php.net/)(APIゲートウェイ)
        - [python](https://www.python.org/)(画像最適化, ファイル圧縮解凍)

## 強み

- 上限100MB
- zipで投げられる
- 鯖が俺の布団の横にある(ラズパイ4)

## 反省

- テスト書いてないから、バグがあった時凄く辛い(当たり前)
- jsのフレームワークとか使ってないから、状態遷移が全手動で頭痛が痛い(偏頭痛)

### 2021年もよろしくお願い申し上げます



#### [＼(^o^)／](https://kiwing.ddns.net/)
Cognitive Searchメモ

#はじめに
CognitiveSearchにindex定義、インデックスデータを投入するメモです。

#サポートされているデータ型
https://docs.microsoft.com/ja-jp/rest/api/searchservice/supported-data-types

- Edm.String	テキストデータ。
- Edm.Boolean	true または false
- Edm.Int32	32 ビット整数値
- Edm.Int64	64 ビット整数値
- Edm.Double	倍精度の IEEE 754 浮動小数点値
- Edm.DateTimeOffset	OData V4 形式で表される日付と時刻：`yyyy-MM-ddTHH:mm:ss.fffZ`
- Edm.ComplexType  JSON階層化時にこのタイプで定義
- Collection (Edm.XXX)　配列

#Service limits in Azure Cognitive Search
https://docs.microsoft.com/en-us/azure/search/search-limits-quotas-capacity

#Azure Cognitive Search の Java コード サンプル
https://docs.microsoft.com/ja-jp/azure/search/samples-java

SDKのazure-search-documentsライブラリを使う際には: https://github.com/Azure/azure-sdk-for-java/tree/master/sdk/search/azure-search-documents


OData: https://www.odata.org/documentation/

以上
Roman Numerals

\![Mac OS X-10.15.7](<https://img.shields.io/badge/MacOSX-10.15.7-brightgreen>) \![ruby-2.7.1p83](<https://img.shields.io/badge/ruby-2.7.1p83-brightgreen>) 


# 課題

アラビア数字(arabic numerals)を受け取って，ローマ数字(roman numerals)を返すmethodを書きなさい[https://qiita.com/daddygongon/items/2d0a73a51ddab2d9da1b](https://qiita.com/daddygongon/items/2d0a73a51ddab2d9da1b)


# 解答


## コード

注意点：4はIV、9はIX、99はXCIX

```lisp
 def to_roman()
   roman_key = ['I', 'V', 'X', 'L', 'C', 'D', 'M']
   result = ""

   if n >= 4000 then
   puts"4000未満の数字にする！！"
   else
   i = 0
#+BEGIN_SRC lisp
class Integer
  def to_roman()
    rkey = ['I','V','X','L','C','D','M']
    troman = ""
    roman = self.digits.each_with_index.map do |num,i|
      one_c = rkey[i*2]
      five_c = rkey[i*2+1]
      ten_c = rkey[(i+1)*2]

      case num
      when 1..3 then troman += one_c*num
      when 4 then troman += one_c+five_c
      when 5 then troman += five_c
      when 6..8 then troman += five_c + one_c * (num-5)
      when 9 then troman += one_c + ten_c
      end

    end
    return troman
  end
end

[1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 14, 15, 19, 38, 42, 49, 51, 97, 99, 100, 200, \
439, 483, 499, 732, 961, 999, 1999].each do |i|
  puts "#{i}: #{i.to_roman}"
end
```


## 結果

```lisp
   1: I
   2: II
   4: IV
   5: V
   6: VI
   9: IX
  10: X
  11: XI
  14: XIV
  15: XV
  19: XIX
  38: XXXVIII
  42: XLII
  49: XLIX
  51: LI
  97: XCVII
  99: XCIX
 439: CDXXXIX
 483: CDLXXXIII
 499: CDXCIX
 732: DCCXXXII
 961: CMLXI
 999: CMXCIX
1999: MCMXCIX
```



------
 - **source** ~/grad_members_20f/members/wjswnsrud12/roman.org
core-jsの依存関係エラー（core-js/～/～）対処法

今回は、タイトルの通り、core-jsの依存関係のエラーの解決方法を書いていきます！！！

同じエラーにぶつかった方の助けになればいいなと思うので、ぜひストックしておくと良いかと。

ふと、Vue.jsでPromiseを使った非同期処理を行う関数を作りたいと思ったのですが、下記のようなエラーが発生しました。

```
error: npm i --save core-js/fn/promise
```

エラー内容通りに、モジュールをインストールしても解決されない。。。。

こりゃ、困った。

色々と調べたところ、原因は２つあった。

``1.キャッシュの問題``

``2.最新版のダウンロード``

それでは、この２つの問題を解決していこうと思います。

#キャッシュのクリア#

```
npm cache clean --force
```

#最新版ダウンロード#

```
npm install core-js@latest
```

そして、必ずテキストエディタを<font color="red">再起動</font color>してください（これをやらなくてめちゃ時間かかった）

一応、この２つの問題を解決することで無事エラーは解消されました。

依存関係のエラーって時間食うよね。。。

以上、「core-jsの依存関係エラー対処法」でした！！！

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

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

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

Thank you for reading
【Swift】自動販売機の例外処理の修正(番外編)

本記事は、[【Swift】自動販売機の例外処理を実装してみた](https://qiita.com/Kai_82/items/043f575af904bb8070a4) の続きです。

前回までの記事で基本的な処理と例外処理を記述しましたが、
例外処理に改善点があったのでそちらについての対応を行いたいと思います。

前回までの内容をご存知ではない方はそちらをご覧ください。

##前回のおさらい

商品を購入する際の処理で、在庫の確認とお金が足りるかを確認しています。

どちらかの結果がNGだったら例外処理を行うわけですが、
if文を2回使って処理を記述するのはあまりきれいではない気がします。

また、**各ケースにこの処理を記述するのは可読性やメンテナンス性が低くなります。**
なので、新しい関数を定義しそちらで購入時のチェックを行う様にしたいと思います。

```swift:ViewController.swift

    var irohasuStock = 3
    var ryokuchaStock = 2
    var gogothiStock = 1

    // 購入処理
    func buyDrink(product: Drink) {
        switch product {
        case .irohasu:
            if !inventoryControl(product: product) {
                print("在庫がありません。")
                return
            }
            if inputMoney - 100 < 0 {
                print("お金が足りません。")
                return
            }
            inputMoney -= 100
            inputMoneyLabel.text = "金額：\(inputMoney)円"
            print("いろはすを購入しました。")
        }
    }

    // 在庫管理
    func inventoryControl(product: Drink) -> Bool {
        switch product {
        case .irohasu:
            if irohasuStock == 0 {
                return false
            }
            irohasuStock -= 1
            return true
        }
    }
```

##修正



まず初めに詳細のエラーを表示するために列挙型SomeError型を定義しました。
それと同時に購入処理のメソッドの変更と購入条件チェックメソッドを作成しました。
(別のケースはほぼ同じ処理なので省略しました。)

在庫管理メソッドは、購入条件メソッドと被っているので削除しました。

```swift:ViewController

enum SomeError: Error {
    case inventoryShortage   // 在庫切れ
    case lackOfMoney   // 金額不足
}

    // 購入処理
    func buyDrink(product: Drink) {
        switch product {
        case .irohasu:
            do {
                try checkCondition(product: product, price: 100)
            } catch {
                print(error)
                return
            }
            inputMoney -= 100
            inputMoneyLabel.text = "金額：\(inputMoney)円"
            print("いろはすを購入しました。")
        }
    }

    //購入条件チェック
    func checkCondition(product: Drink, price: Int) throws {
        switch product {
        case .irohasu:
            if irohasuStock == 0 {
                throw SomeError.inventoryShortage(reason: "いろはすの在庫がありません。")
            } else if inputMoney < price  {
                throw SomeError.lackOfMoney(reason: "\(inputMoney)円しか入れられていないので、いろはすを購入できません。")
            }
            irohasuStock -= 1
        }
    }
```

実際の挙動は次のようになります。
![スクリーンショット 2020-12-31 21.15.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/797483/83f1010a-6c34-d54e-a446-c16629cae75d.png)

３００円入れた後に緑茶を２本購入しました。
その後緑茶を購入すると、在庫は無いので在庫なしのエラーが出ます。
いろはすを購入するとお金が足りないので購入できないとエラーが出ます。

これで結構きれいなコードになったのではないでしょうか！？
独学の範囲内での修正ですのでもっといい修正があると思います。

いい案がありましたら教えていただけると嬉しいです。

以上、最後までご覧いただきありがとうございました。
PDF からコピペしようとしたら怒られた

# やろうとしたこと

PDF を開いてその中の文章をコピーしようとした

## 結果

![Screen Shot 2020-12-31 at 21.04.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252342/687ee3dd-aa59-a559-3a3f-627bbe99d801.png)

```
Without the owner password, you do not have permission to copy portions of the document.
```

権限がないとできませんって怒られた

(コピーするだけやん...)

# 解決方法

PDF のページ全てを選択して(`cmd + a` とかで)、`File > Export as PDF` で複製する。
新しく作った方ではコピーでも改変でもやりたい放題。
ACP-600(Jira Project Administration) 合格体験記

#はじめに
2020年8月、アトラシアンの資格の1つである"Atlassian Certified in Jira Project Administration"に合格したので、この資格試験の勉強方法や受験した感想を書きます。

また、この記事は[ACP-300(Jira Agile) 合格体験記](https://qiita.com/aykooo/items/cd46741c72332e13d5af)の続編の立ち位置です。「アトラシアンの資格試験って何？」という方は、まずそちらを読んでいただければ幸いです。

# ACP-600の試験概要
[公式HP](https://www.atlassian.com/university/certification/certifications/exam-acp-600)に記載の通り、概要は下記のとおりです(2020年9月時点)。

- 内容：「Jiraプロジェクト管理者」について
- 時間：3時間
- 受験料：USD $100（e-learning込み）
- 言語：日本語受験可（ただし付随のe-learningは英語のみ）

ACP-600の特徴は、他のACP試験と異なり**e-learning**と試験バウチャーがセットで販売されている点です。片方のみの購入はできません。購入時点から60日以内にe-learningも試験バウチャーも期限が切れる設定のため、計画的に勉強・受験を進めざるを得ない状況になります（笑）
[ACP-300(Jira Agile) 合格体験記](https://qiita.com/aykooo/items/cd46741c72332e13d5af)にも記載しましたが、ACP-600は他のACP試験に比べ内容が易しいこと、公式のe-learningでしっかり試験対策ができること、試験が日本語対応していること、そして安い（他のACP試験はUSD $250）ことから、手始めにおすすめのACP試験です。

#ざっくり受験感想

試験勉強開始前の私の状態はこんな感じでした。

- 業務でJiraプロジェクト管理者権限での操作を行うことがままあり、割と慣れている
- ACP-300を受験した経験から、Jiraの基本的な知識はある程度体系的に頭に入っている

…ということで、経験・座学の両面からアドバンテージがあり正直最初は試験を甘く見ていました。一応e-learningを一通り見て（詳細は後述）知らない知識を洗い出し、準備OK！のつもりでしたが、ふたを開けるとだいぶギリギリの合格でした。点数が思うほど伸びなかった原因はおそらく、提示された具体的なユースケースをもとに最適な操作・設定を選ぶタイプの問題で、理解不足が出たのかなと思います（実際、最後2択までは絞れるが…という問題が多々ありました）。経験に頼るとどうしても普段自分が行っている操作に考えが偏りがちなので、"座学→ハンズオン"の流れでの体系的な勉強は大事だと感じました。
日本語での試験ということで時間にはだいぶ余裕があり、2時間半で見直しまで十分行えました。
また、職場のACP-600受験経験者の話を後日伺ったところ、ACP-300と同じく問題は割と使いまわされているかもしれません。

#ACP-600の問題内容

[公式情報](file:///C:/Users/AYako/AppData/Local/Temp/ACP-600%20Exam%20Topics-2.pdf)にある通り、現時点では
1. 役割、権限、および課題レベルのセキュリティ (25-35%)
2. プロジェクトの構成（5-15%)
3. 課題の種類、ワークフロー、フィールド、画面、通知（35～45％)
4. レポート、ダッシュボード、JQL (10-20%)
5. グローバル構成 (1-5%)
となっています。

特に1, 2, 3の範囲の問題は一問一答形式は少なく、簡単なユースケースが与えられたうえで最適な操作や設定を考えさせる問題が多いです。無機的な知識の詰め込みだけでなく、ある権限を持つ人・持たない人など、様々な立場に立ってJiraの使い方、見え方を考えながら勉強すると良いです。


#ACP-600の勉強法

ACP-300の記事では「実務でひたすら使ってJiraに慣れるに越したことはありません」と書きましたが、ACP-600の場合はちょっと趣向が違うかもしれません。
ACP試験の中でACP-600のみ懇切丁寧なe-learningが用意されていることから、「今は自分でJira（のプロジェクト管理者）経験を積める環境ではないが、直近でそのスキルが必要だ/将来的なJira導入検討のため興味を持っている」等の立場の方をmotivateするための試験だと感じました（※個人の感想です）。
ということで、実務経験はあればもちろんアドバンテージになりますが、なくても心配ご無用です。

## e-lerning

試験対策として公式にセット販売されている以上、もうこれをしっかりやる他ありません。試験の全範囲カバーできます。
e-lerningの内容は、詳しくは書けませんが「Jiraプロジェクト管理者」になるうえで知っておくべきJiraの知識や考え方が基礎からまとまっています。そのうえ、各章毎にご丁寧にハンズオン付き！ボリュームは文句なしです。e-lerningの内容をマスターすれば、実務経験がなくても合格できると思います。
しかしすべて英語なので、私は動画を見るのは挫折し、途中からはPDF資料を落として読むだけにしました。結果として、個人的には非常に効率よく勉強できました。英語リスニングが苦にならない、という場合以外はこれで十分だと思います（実務経験の少ない方は、ハンズオンパート部分は動画も確認することをお勧めします）。
前述の通り、プロジェクト管理者権限での操作経験はそれなりにある私でしたが、知らない知識も多々出てきたのでひたすらそれをまとめていく作業をしました。

## 公式ドキュメントを読む
ACP-30合格体験記でも同じく[公式ドキュメントを読む](https://qiita.com/aykooo/items/cd46741c72332e13d5af#%E5%85%AC%E5%BC%8F%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88%E3%82%92%E8%AA%AD%E3%82%80)ことを勉強法として挙げましたが、この章のうち「チャートやレポートの読み方」は本試験でも有用でした。
Jiraには多くの種類のレポートが用意されているので、それぞれの内容や、何を知りたいときに使うものなのかを整理しておくことで、上記問題内容4が解きやすくなります。
レポートに限らず、e-learningに出てきた知らない単語は逐一検索して、アトラシアン公式ドキュメントを確認することをお勧めします。アトラシアンの公式ドキュメントは非常に内容豊富なので、必ず知りたい情報に行き当たると思います。


#最後に


資格をゲットして、ますますアトラシアン製品を楽しく使いこなせるようになりましょう！
【Ruby】odd? even? の使い方を学んで配列の中の偶数・奇数の数をカウントしよう！

## 概要

配列から偶数 or 奇数の要素数のカウントの方法を学んでいきます。

## 目次

- odd?
- even?
- Array#count

- 実践
    - 問題
    - 解答（解説）
        - odd?
        - odd? + count

- まとめ
- 参考文献

## odd?

対象の数値が奇数かどうかを判断するメソッドです。奇数であれば真を返し、そうでない場合は偽を返します。

## even?

対象の数値が偶数かどうかを判断するメソッドです。偶数であれば真を返し、そうでない場合は偽を返します。

## Array#count

配列の要素数を返します。

## 実践

#### 問題

>配列にある値から奇数の数をカウントして出力しよう！

#### 解答(解説)

##### odd?

```ruby:解答
def count_odds(nums) # 配列受け取り
  count = 0           # カウントした数を入れる 変数count を定義

  nums.each do |num|  # 配列から要素を一つずつ取り出す
    if num.odd?       # 取り出した値が奇数か？
      count += 1      # 値が奇数であれば 変数count に1を足していく
    end
  end
  p count             # eachの処理が終わったらcountを出力
end

# メソッド呼び出し
count_odds([3, 5, 2, 2, 1])
count_odds([3, 1, 0])
count_odds([2, 4, 6])

# ターミナル出力結果
# 3
# 2
# 0
```

##### odd? + count 
上記よりもさらに簡単に書くことができます。

```ruby:別解
def count_odds(nums)
  p nums.count { |num| num.odd? }
end

# メソッド呼び出し
count_odds([3, 5, 2, 2, 1])
count_odds([3, 1, 0])
count_odds([2, 4, 6])

# ターミナル出力結果
# 3
# 2
# 0
```

## まとめ

- odd?は対象の数値が奇数であれば真、そうでない場合は偽を返すメソッド
- even?は対象の数値が偶数であれば真、そうでない場合は偽を返すメソッド
- 配列にcountメソッドを使うことで、要素数を返すことができる

## 参考文献

- [Ruby 3.0.0 リファレンスマニュアル(odd?)](https://docs.ruby-lang.org/ja/latest/method/Integer/i/odd=3f.html)
- [Ruby 3.0.0 リファレンスマニュアル(even?)](https://docs.ruby-lang.org/ja/latest/method/Integer/i/even=3f.html)
- [Ruby 2.7.0 リファレンスマニュアル(count)](https://docs.ruby-lang.org/ja/2.7.0/method/Array/i/count.html)
IPv4 CIDRブロック


AWSを勉強しています。仮想ネットワークを構築できる「Amazon VPC」を作成する部分、
「IPv4 CIDRブロック」の意味がよくわからなかったので、記事にさせていただきました。
![2020-12-30_09h39_49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/383237/a6205e1d-8c0b-3818-f54a-8a7fbb17d8de.png)
######Amazon Virtual Private Cloud
https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/what-is-amazon-vpc.html
* * *
######そもそもIPアドレスとは？
TCP/IPプロトコルでは通信先を特定するのに使用 
※Transmission Control Protocol /Internet Protocol

* ユニーク
* 住所に相当
* 32ビット構成で8ビットずつ10進数に変換したもの
* 一区切り「0～255」まで「 0.0.0.0～255.255.255.255」の範囲
* ICANN（アイキャン）が一括管理
※Internet Corporation for Assigned Names and Numbers

* * *
######IPアドレスの主な種類は2種類

パブリックIPアドレス（グローバルIPアドレスとも呼ぶ）

* インターネットに接続するために用いるIPアドレス

プライベートIPアドレス

* 申請不要で自由に利用できる
* サーバー、ネットワーク機器に割り当てる

![2020-12-30_09h54_51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/383237/d53fd9b2-71ff-2ec4-c103-894fc314bc60.png)

* * *

######IPアドレス範囲は、4個,8個,16個,32個,64個,128個,256個・・・65536個と2のn乗個で区切る

* よく使われるのは「256個」と「65536個」区切り
* 前半部分「ネットワーク部」、後半部分「ホスト部」
* 同じネットワークに属しているならネットワーク部は同じ
* ホスト部をサーバー、ネットワーク機器に割り当てる

![2020-12-30_10h39_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/383237/5cc0d712-1b06-2103-87a6-b36a58eda1d3.png)


* * *
######通常IPアドレス範囲を表す表記は2種類

CIDR表記（Classless Inter-Domain Routing、サイダー）
「/ ビット長」でプリフィックス（ネットワーク部）示す表記

サブネット表記
プリフィックスのビット数だけ2進数の1を並べ、残りは0を記述した表記
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/383237/77cfd59d-0ff2-42b2-5754-d080d0038592.png)

* * *
######まとめ
AWSの記載内容に沿って、IPv4 CIDR ブロックを「10.0.0.0/28」として作成しました。
「10.0.0.1 ～ 10.0.0.14」の範囲でIPアドレスが使用できることがわかりました。
※先頭（ネットワークアドレス）と終端（ブロードキャストアドレス）は使用できない。
![2020-12-30_10h56_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/383237/0a6f2a70-f0c0-9114-3e42-af84a5afb642.png)
Pythonでふつうは解けない微分方程式を解けたふうに見てみる



##オイラー法


$\dot{x} =f(x)$のとき、理想的には$x$を時間で積分して、$x=g(t)$となるような関数$g$を見つけたい。しかし非線形系においては解析的な積分はできない。そこで、時間を離散化することで数値的に解くことを考える。$f(x)$を時間で積分したのと近いような数値を、それぞれのtについてもとめることができればよい。そこで、長方形を組み合わせた区分求積法を応用したものであるオイラー法がつかえる。

わずかな時間幅$\Delta{t}$をとって,高さ$f(x_0)$、幅$\Delta{t}$の長方形の面積をもとめれば、その時間幅における積分値(＝求める解$g(t)$）に近い値が得られる。なので、これを使って初期値から$\Delta{t}$だけ進んだところに対応した値$x_1$を考えると、$$x(t_0+\Delta{t})\approx x_0+f(x_0)\Delta{t}=x_1$$とできる。一般化すると、$$x_{n+1}=x_n+f(x_n)\Delta{t}$$で、これを繰り返すことによって$g(t)$に近いものを求めることができる。

しかし、これは近似値によって次の近似値を求めていくという方法だから誤差がどんどん蓄積していく。近似の精度を高めるために、長方形の面積を求めるところでもう少し細かくみていくことにする。

##修正オイラー法

かんたんに考えつくのが、長方形の高さとして$f(x_n)$だけではなくて$f(x_{n+1})$との平均を使うことである。これは修正オイラー法と呼ばれる。オイラー法より誤差の収束がはやいが、誤差の計算理論はよくわからない。$\Delta{t}$の区間で単調な関数をイメージすれば、こうすることによって長方形からのはみ出し、削れがすくなくなることは簡単にわかる。


##Runge-Kutta法


オイラー法では（若い方の）一端、修正オイラー法では両端を長方形の高さとして採用したが、採用する数値をさらに巧妙に選んだものがRunge-Kutta法である。
計算量とのバランスをみて、ちょうどよいのが四次のRunge-Kutta法である。四次のRunge-Kutta法では、区間内の4つの点について長方形の値をもとめ、重み付きで平均することで区間内の積分値をもとめる。具体的には以下の通り

$$
x_{n+1}=x_n+\frac{1}{6}(k_1+2k_2+2k_3+k_4)
$$
$$k_1 = f(x_n)\Delta t
$$
$$
k_2 = f(x_n+\frac{1}{2}k_1)\Delta t
$$
$$
k_3 = f(x_n+\frac{1}{2}k_2\Delta t
$$
$$
k_4 = f(x_n+\frac{1}{2}k_3)\Delta t
$$

(なぜかふつうに改行できなかったので段落マシマシでお送りします)(最近は様々な改良版が知られていて、たとえばnumpyのstreamplotでは二次の適応刻み幅制御のRunge-Kutta法が使われている。)
よく使われるのは、いちばん興味のある初期値を与えてみたときの解軌道をRunge-Kuttaを何度もやって関数のグラフみたいに描いてみて、他の初期値については色々与えてみてRunge-Kuttaをそれぞれについて一度だけやってみてベクトル場や傾き場として描くことで全体の雰囲気を掴む、というもの。
以下に実装してみる。


```Python
import numpy as np
import matplotlib.pyplot as plt

#調べたい関数を定義
def dotx(x):
  return x*(1-x) 

#Runge-Kutta法でt-x平面にプロット
def rk4th(x0, n, dt):#x0:初期値、n：ｔの範囲、dt：ステップ幅
  t=0
  x=x0
  xvalues=[]
  tvalues=np.arange(0,n,dt)
  scope=len(tvalues)#要素数はこれで統一しておく

  #RungeKuttaをdotxに適用してx0に対応した軌道を描く
  for i in range(scope):
    xvalues.append(x)
    k1 = dotx(x)*dt
    k2 = dotx(x+k1/2)*dt
    k3 = dotx(x+k2/2)*dt
    k4 = dotx(x+k3)*dt
    x = x + (k1+ 2*k2 + 2*k3 + k4)/6
    t += dt  

  #他の初期値から求めてかたむき場を描く
  T, X = np.meshgrid(
    np.arange(0,n,1),
    np.arange(0,2,0.1)
  )
  k1 = dotx(X)*dt
  k2 = dotx(X+k1/2)*dt
  k3 = dotx(X+k2/2)*dt
  k4 = dotx(X+k3)*dt
  V = (k1+2*k2+2*k3+k4)/6
  plt.quiver(T,X,dt,V)
  plt.plot(tvalues, xvalues)
  plt.show()

rk4th(2, 10, 0.1)
```
以下に結果をしめす。これはほんとうは横軸がtだからベクトルではなくたんに傾きである
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234736/ad67ed88-3584-a300-a343-8c4e3027f36d.png)
PHPでMySQLデータテーブルの表を作成する

##参考
・https://techacademy.jp/magazine/12348


##データベースに接続

MySQL サーバーへの接続をオープンするために[mysql_connect](https://www.php.net/manual/ja/function.mysql-connect.php) メソッドを使用してインスタンスを生成する。host,user,password,nameに接続するサーバーの情報を入れる。
※パスワードが無い場合空白にする。


``` php
$link = mysqli_connect('localhost', 'root', ''   ,'eccube001');
//　　　　　　　　　　　     ↑host　　  ↑USER   ↑PW(空白)   ↑DB(名前)
```


##接続エラー処理
データベースに接続しているかの状況をチャックする。

```php
// 接続状況をチェックします
if (mysqli_connect_errno()) {
    die("データベースに接続できません:" . mysqli_connect_error() . "\n");
}else {
    echo "データベースの接続に成功しました。\n";
}


```





##テーブルデータ取得
mtb_order_statusテーブルに入っているデータをすべて取得する。

``` php
<?php
// ステータスの一覧を表示する
$query = "SELECT * FROM mtb_order_status;";
//　　　　　↑まずはサンプルで固定のSQLを入れる（サンプル・動作確認としてこのまま）

```

##表示処理
変数$resultに対し、mtb_order_statusテーブルの中に入っている内容を代入しながら、配列を使用して表示しています。

```php
// クエリを実行します

if ($result = mysqli_query($link, $query)) {

echo "SELECT に成功しました。\n";

foreach ($result as $row) {

    var_dump($row);


  }

}
```


##データベース接続終了
最後にデータベースとの接続を閉じる。閉じれないときを表すのならif文を使って表すとできる。


```php

// 接続を閉じます
mysqli_close($link);

?>
```
Railsと上手く付き合っていく方法

# 何これ
今居る会社のメンバーはあまりRailsに慣れてなく、自分に質問が結構来るので社内向けwikiにまとめていた。
評判よかったのでせっかくなのでQiitaにも投稿。

個人的な思想も含まれてるので過信禁物。

必要になったら必要な分だけ導入する。

# アーキテクチャ
## Presenter
viewのために、データを用意する
controllerに記述してしまうとfatになってしまいがちなviewの特異的なロジック等を記述する

- viewと1:1
- イメージ的にはviewのためにデータを用意したりするために使う
- 基本的にpresenterに全部持たせて、controllerはpresenterを生成するだけにし、viewはpresenterから必要な値などを利用する
- 例: 画面上のオススメ記事一覧のために`recommend_articles` を用意したい

## Decorator
modelのために、modelをデコレーションする
modelに記述してしまうとfatになってしまいがちなメソッドを記述する

- modelと1:1
- イメージ的にはアプリケーション全体で整形後のmodelの値を使いたいときに使う
- 例: modelの`last_name` と `first_name` を `last_name + first_name` として使いたいので `full_name` メソッドを定義する

## Finder
複雑になりがちな検索クエリを生成する
modelに記述してしまうとfatになったり、スパゲッティ化してしまうクエリを記述する

友人がいい感じに実装してたので詳しくは以下
https://furaji.hatenablog.jp/entry/2020/05/09/043924

## Service
複数model間にまたがる処理など、単一のmodelに書きづらい処理を記述する

- 基本的に単一責務でいきたいので、 `動詞 + 対象 + Service` といった名前にする
- 例: ユーザー生成時にUser modelだけでなく複数のmodelにまたがった処理をするので `CreateUserService` を作る
- 使う側はできるだけServiceに関与しない
- 例: `CreateUserService.call(args)` で使う側は完結したい

## ValueObject
オブジェクト(特にmodel)の値を値ではなくオブジェクトにすることにより、値に対する責務をもたせる。
- ActiveRecordなら `composed_of` が使えるので楽
- 例: `user.address` の `address` を ValueObjectとしてクラスを分割すれば、User modelを汚すことなく、 `address` にのみ関心がある処理を書くことができる。 `user.address.tokyo?` など
- Decoratorがmodel全体に関心があるのであれば、ValueObjectはmodel内の一つの値に関心がある

説明しづらいので丸投げ
https://qiita.com/okuramasafumi/items/16bcda8f6382a3db47c9

## Concerns
~~`rails new` したらまずは消せ~~
強力だが一番治安が悪くなりやすいので、適切な設計が必要。

modelやcontrollerの関心を切り出す。
この関心は、大体においては機能。

たとえば、

1. サイトのメイン記事(Article)にタグ(Article::Tag)をいくつか紐付けたい
2. サイトのお知らせ(News)にタグ(News::Tag)をいくつか紐付けたい

この場合、1と2はどちらも**タグをつける/はずす** といった関心があるので、`Taggable` といったconcernsによってタグ周りの共通化が可能。

開発というものは要件定義段階で何も考えないと**同じようで別な機能**がいくつも出来がちなので、
要件定義段階からエンジニアが茶々をいれてシンプルにしていくと、共通化しやすくなる。

# ルーティング
基本的にRESTful
たとえば、userのcsvをdownloadしたい場合、userに直接アクションはやしたくなるけど、
`user/csv` でgetできるようにすると、RESTfulで何が起こるか明確だよねっていう話。

これを読んでうまく書こう
https://tech.kitchhike.com/entry/2017/03/07/190739

# テスト
RailsについてくるのはMinitestだけど、デファクトスタンダードはRSpec.
あまり力強いテストコードを書くと、テストコードのテストが必要になってしまうので要注意。

- 「何をテストしたいか」を明確に
  - DRYとかはあまり意識しなくてよい
- 基本的にオブジェクトは使い捨てでok
  - 変に使い回すと意図しない影響が出たりするよ
- 時間が関係するテストは`travel_to` などを使って時間を操作する
  - `Time.now` とか使ったりすると時限爆弾が出来るからやめようね

これをよんでうまく書こう
https://www.betterspecs.org/
マルチスケールシミュレーション特論まとめ

\![Mac OS X-10.15.7](<https://img.shields.io/badge/MacOSX-10.15.7-brightgreen>) \![ruby-2.7.1p83](<https://img.shields.io/badge/ruby-2.7.1p83-brightgreen>) 

マルチスケールシミュレーション特論の講義内容などのまとめサイトです。


# 概要

1.  [README.orgの雛形](https://qiita.com/cyoukou/private/86d7bc308ef1c934c690)


# メニュー

・[Commandまとめ](https://qiita.com/cyoukou/items/27ae8fe873157d31252b)
・week12::
・week11::Class化
・week10::Recursion(再帰)&Class化
・[week9::Assert&rubular](https://qiita.com/cyoukou/items/ab6162ae521ac9fa2500)
・[week8::rake](https://qiita.com/cyoukou/items/67555d7b622e3b476d03)
・[week7::Rubyのif,case](https://qiita.com/cyoukou/items/ee00bc4379ce664d56b0)
・[week6::Rubyの変数とMethod](https://qiita.com/cyoukou/items/abbf8a64f9f99fa3e05c)
・[week5::Rubyの入出力](https://qiita.com/cyoukou/items/08c70cce32ceaf92d8c5)


# 最終課題


## Google Recruit

[google recruit](https://qiita.com/cyoukou/items/4c62b72d9724771d4060)


## Roman Numerals



------
 - **source** ~/grad_members_20f/members/wjswnsrud12/README.org
【SpringSecurity】SpringbootでのSpringSecurityの認証失敗時の制御設定について

# 概要
以下、SpringBootでSpringSecurityの認証を実装する際のメモです。
`SecurityConfig`の設定において、認証失敗時のリダイレクト設定方法について記載しています。
SpringBootでのSpringSecurity認証までのService,Entityなど設定については他の方の詳細な記事を参考にたほうがいいかと思いますので省略します。

# 前提およびやりたいこと
ユーザIDとパスワードだけでなく３つ目の入力項目を持つ独自認証を作る必要があったため[認証処理の拡張](http://terasolunaorg.github.io/guideline/5.6.1.RELEASE/ja/Security/Authentication.html#id127)をしました。
その上で

- 認証失敗時にリダイレクトするURLを設定する
- 該当ユーザがアカウントロック中である場合にリダイレクトするURLを設定する・

の２つを設定する場合について記載します。
独自認証をしていない場合filter周りの記載が不要ないし変更する必要があると思います。



# 方法
```OriginalSecurityConfig.java
//import省略

@EnableWebSecurity
public class OriginalSecurityConfig extends WebSecurityConfigurerAdapter {

    //独自認証処理をしているProvider
    @Autowired
    OriginalUsernamePasswordAuthenticationProvider originalProvider;

    //その他の@Autowired等省略

    @Override
    protected void configure(WebSecurity web) throws Exception {
        web.ignoring().andMatchers(
        //各種静的ファイル除外設定を記載
        );
    }
    
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        
        //独自認証用filterの設定
        OriginalUsernamePasswordAuthenticationFilter myFilter = new OriginalUsernamePasswordAuthenticationFilter();
        myFilter.setRequiresAuthenticationRequestMatcher(new AntPathRequestMatcher("/admin/login/","POST");
        myFilter.setAuthenticationSuccessHandler(new SimpleUrlAuthentificaonSuccessHandler("/top"))        
      
        //独自認証用filterの設定
        ExceptionMappingAuthenticationFailureHandler failurehandler = new ExceptionMappingAuthenticationFailureHandler();
        Map<String, String> urlMap = new HashMap<>();
        urlMap.put(BadCredentialExceprion.class.getname(), "/admin/login/?error=1"); 
        urlMap.put(LockedExceprion.class.getname(), "/userLocked/"); 
        failurehandler.setExceptionMappings(urlMap);
        myFilter.setAuthenticationFailureHandler(failurehandler);

        http.addFilter(myFilter);

        http
            .antMatcher("/admin/**")
            .authorizeRequests()
            .antMatchers("/admin/login/").permitAll()
        //...以下任意の設定を記載
           
    }

    @Override
    protected void configure(AuthenticationmanagerBuilder auth) throws Exception {
        auth.authenticaitonProvider(originalProvider);
    }
}
```

configureの中でも`ExceptionMappingAuthenticationFailureHandler`に関する部分だけをメインに記載しています。流れとしては

- `Map<String, String>`に発生させるExceptionとその場合のリダイレクトをセットで登録する
- 各リダイレクト設定を持ったマップを`ExceptionMappingAuthenticationFailureHandler`にセットする
- 独自認証filterの`OriginalUsernamePasswordAuthenticationFilter`に上記で作ったHandlerをセットする
- `HttpSecurity`に独自認証のfilterをセットする
- その他各URLの許可,不許可設定等を適宜`HttpSecurity`に対して登録していく

今回の例では`BadCredentialException`と`LockedException`だけを登録していますが、これ以外のExceptionでも登録可能です。
あとは独自認証をしているOriginalUsernamePasswordAuthenticationProviderの中でそれぞれのExeptionを発生させることで設定したリダイレクト先へと遷移することになります。

当然ですが、それぞれのリダイレクト先をController側で制御する必要があります。

```OriginalController.java
@RequestMapping(value="/userLocked/")
public String locked() {
  //アカウントロック画面を返却などする
}
```
Loguruでsyslogに出力

お手軽に使う

```py:logt.py
from loguru import logger
import logging
import logging.handlers
import os


def main():
    handler = logging.handlers.SysLogHandler(address='/dev/log')
    logger.add(handler, format="{level} | {message}")
    logger.info("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx")


if __name__ == '__main__':
    main()
```

```
# tail -f /var/log/messages
Dec 31 20:11:00 localhost journal[42166]: INFO | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
```
Firebase Storage で attempt to insert nil object from objects[1]


基本下記に答えがあったが、Refの設定が間違っていてRootにファイルを作ろうとしているためのエラーだった。
https://teratail.com/questions/132989

以下のページを参考にしていたけど、storageRefのインスタンス化の場所が違っていたために起こった不具合だった。
https://orangelog.site/firebase/upload-image-to-firebasestorage/

```swift
func viewDidLoad() {
  override viewDidLoad()
  let storageRef = Storage.storage() // ここでStorageRefのインスタンスを作っていたいので
  // 省略
}

fileprivate func upload(completed: @escaping(_ url: String?) -> Void) {
        let date = NSDate()
        let currentTimeStampInSecond = UInt64(floor(date.timeIntervalSince1970 * 1000))
        // let storageRef = Storage.storage().reference().child("images").child("\(currentTimeStampInSecond).jpg")
        // 以下のように意味のないコードを書いていた
        storageRef.child("images").child("\(currentTimeStampInSecond).jpg")
        let metaData = StorageMetadata()
        metaData.contentType = "image/jpg"
        if let uploadData = self.imageView.image?.jpegData(compressionQuality: 0.9) {
            // このstorageRefがrootなのでクラッシュしてしまう
            storageRef.putData(uploadData, metadata: metaData) { (metadata , error) in
                if error != nil {
                    completed(nil)
                    print("error: \(error?.localizedDescription)")
                }
                storageRef.downloadURL(completion: { (url, error) in
                    if error != nil {
                        completed(nil)
                        print("error: \(error?.localizedDescription)")
                    }
                    completed(url?.absoluteString)
                })
            }
        }
    }
```
README

\![Mac OS X-10.15.7](<https://img.shields.io/badge/MacOSX-10.15.7-brightgreen>) \![ruby-2.7.1p83](<https://img.shields.io/badge/ruby-2.7.1p83-brightgreen>) 


# 概要

マルチスケールシミュレーション特論のまとめ


# qiita\_links

-   [第5回](https://qiita.com/drop-sd/items/707c1497d15b520198d3)
-   [第6回](https://qiita.com/drop-sd/private/26227e55461e704579fb)
-   [第7回](https://qiita.com/drop-sd/items/07aacb3c3532807ff6db)
-   [第8回](https://qiita.com/drop-sd/items/611ef35a013ea7352e37)
-   [第9回](https://qiita.com/drop-sd/items/e263a579b8f5613b4fb2)
-   [第10回](https://qiita.com/drop-sd/items/c72c7e4ba5ab2463c727)
-   [第11回](https://qiita.com/drop-sd/items/57b41189949316a70992)
-   [第13回](https://qiita.com/drop-sd/items/a6384d97e1057e5c9449)


# 追加課題

-   [google](https://qiita.com/drop-sd/items/f79e36b9ec3e37617219)



------
 - **source** ~/my_ruby/grad_members_20f/members/drop-sd/README.org
extra課題(google)

\![Mac OS X-10.15.7](<https://img.shields.io/badge/MacOSX-10.15.7-brightgreen>) \![ruby-2.6.3p62](<https://img.shields.io/badge/ruby-2.6.3p62-brightgreen>) 


# 課題内容

自然対数の底e(200桁まで)の値で連続10桁で最初の素数を求める.以下をexp.txtとして入力として使用する．

    2.71828182845904523536028747135266249775
    7247093699959574966967627724076630353547
    5945713821785251664274274663919320030599
    2181741359662904357290033429526059563073
    81323286279434907632338298807531952510190


# 方針

素数を特定するために, 以下サイトを参考にした.<https://qiita.com/evendemiaire/items/f7069a77b7432a3622a3>


# コード

```ruby
# require './aeroc'
require 'prime'
require 'colorize'


def puts_vals(expected, result)
    puts "expected :: #{expected}"
    puts "result   :: #{result}"
end


def assert_equal(expected, result)
    puts_vals(expected, result)
    print  case expected == result
	when true  ; "succeeded in #{__method__}.\n".green
	when false ; "failed in #{__method__}.\n".red
	end
end


def check(num)
    2.step(to: Math.sqrt(num), by: 1) do |i|    
    return false if num%i==0
    true
    end
end


def read_exp(path)
    exp = File.read(path).delete(".")
    return exp
  end


def exp_check(exp)
    0.step(to: exp.length-10, by: 1) do |i|
	num = exp[i..i+10-1].to_i
	if check(num)
	result = num
	end
	if Prime.prime?(num)
	assert_equal(num,result)
	break
	end
    end
end


if $PROGRAM_NAME == __FILE__
    exp = read_exp("exp.txt")
    exp_check(exp)
end

```


# 参考サイト

-   <https://qiita.com/daddygongon/items/ba94b0f2a73990fc6a07>
-   <https://qiita.com/evendemiaire/items/f7069a77b7432a3622a3>
-   <https://qiita.com/musutafakemaru/items/872870c52b170d510309>



------
 - **source** ~/my_ruby/grad_members_20f/members/drop-sd/lectures/ex_google.org
The selected JRE does not support the current compliance level of 15

# 事象 : Eclipseの設定を見たらなんか言われてた
- 環境
    - Windows10 Pro バージョン1903
    - openjdk version "11.0.2" 2019-01-15
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/1eb06a74-a4d6-7e33-9f22-f2c509b2c5c3.png)

## 原因 : コンパイラに設定したJavaのバージョンとずれてるから
[Java] > [Complier]をみると「15」になっていた・・・
こっちでも`When selecting 15 compliance, make sure to have a compatible JRE installed and activated(currently 11).`って言われている・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/3de34e74-a5da-9c4d-b88e-700811459916.png)

### 対応 : コンパイラをインストール済みJREsに設定したバージョンに合わせる
1. [Preferences]ダイアログ > [Java] > [Compiler]
2. [Compiler compliance level:]をインストール済みJREsに設定したJavaのバージョンに合わせる > [Apply]ボタンで適用する
3. [Installed JREs]と[Compiler]に出ていたメッセージが消える
Vision TransformerのGitHub(google-research / vision_transformer)は、Windowsでは素直には動かないみたいです。

#概要

Vision TransformerのGitHub(google-research / vision_transformer)は、Windowsでは素直には動かないみたいです。

具体的には、
https://github.com/google-research/vision_transformer

を動かそうとして、

```
pip install -r vit_jax/requirements.txt
```

とすると、

```
ERROR: Could not find a version that satisfies the requirement jaxlib (from clu)
```

のエラーで終わっていまう。

#このエラーは回避できないのか？

## stackoverflowでは

https://stackoverflow.com/questions/62585395/not-able-to-install-jaxlib

引用すると、
>Jaxlib is not supported on windows you can see it here.. https://github.com/google/jax/issues/438

**windowsは、サポートされないよう。**

## リリース元のgithubでも

https://github.com/google/jax/issues/438

以下は、上記の引用。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/bfb4906c-a153-4268-5820-b62eaaf7469a.png)


**windowsは、サポートされていないよう。**

### 余談
githubのissuesの見方がよくわかっていなかったが。。。。
進入禁止マークで、線が引かれて、closedになっていたら、そこで結論が出てるんですね。。。
かなり後ろに長く続く場合があるけど。。。
それは、参考？、関連？情報

#まとめ
windows環境で、WSLに逃げるとかもあるかもしれないが、GPU関係がよくわからないし、
冷たくされているなら、諦めるべきだと思いました。
Google Colabかな。
コメントなどあれば、お願いします。