OmniAICreator/Qiita-1.07M huggingface dataset:
httpdとphp-fpmが動かない

EC2でwordpress環境を、codeDeployで自動デプロイ時に「systemctl start httpd.service」
「systemctl start php-fpm.service」を実行するのだが、1度目は動いて、二度目は動かない

#httpd原因

```
#ログをコマンドで確認
vi /var/log/httpd/error_log
```

```
#ログ内容
[Mon Jul 19 13:41:39.413688 2021] [suexec:notice] [pid 3196] AH01232: suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
[Mon Jul 19 13:41:39.440099 2021] [lbmethod_heartbeat:notice] [pid 3197] AH02282: No slotmem from mod_heartmonitor
[Mon Jul 19 13:41:39.440194 2021] [http2:warn] [pid 3197] AH10034: The mpm module (prefork.c) is not supported by mod_http2. The mpm determines how things are processed in your server. HTTP/2 has more demands in this regard and the currently selected mpm will just not do. This is an advisory warning. Your server will continue to work, but the HTTP/2 protocol will be inactive.
[Mon Jul 19 13:41:39.566770 2021] [mpm_prefork:notice] [pid 3197] AH00163: Apache/2.4.48 () PHP/7.4.21 configured -- resuming normal operations
[Mon Jul 19 13:41:39.566799 2021] [core:notice] [pid 3197] AH00094: Command line: 'httpd'
```

「AH01232: suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)」を見る限り、[Apacheの公式](https://httpd.apache.org/docs/2.4/ja/suexec.html)を確認すると、削除すれば良いとのこと

```
#mvでファイル名を変更
mv /usr/sbin/suexec /usr/sbin/suexecbackup
#suexecがないこと、suexecbackupがあるか確認
ls /usr/sbin/suexec /usr/sbin/suexecbackup
```

#php-fpm原因
```
#ログをコマンドで確認
vi /var/log/php-fpm/error.log
```

```
#ログ内容
[19-Jul-2021 14:05:36] ERROR: Another FPM instance seems to already listen on /run/php-fpm/www.sock
[19-Jul-2021 14:05:36] ERROR: FPM initialization failed
```

調べたところ、[こちら](Plesk PHP FPM 7.0 service is down after switching to it from another FPM handler)を参考に暫定対応

```
vi /etc/systemd/system/plesk-php70-fpm.service
```
```
#記載内容
.include /lib/systemd/system/plesk-php70-fpm.service
[Service]
Restart= on-failure
RestartSec= 3
```

<font color="red">上記は暫定対応</font>
できるだけ手作業は減らしたいので、初回起動以降も同じスクリプトを使えるかつ、エラーを無くすように対応予定
残プロ　第-48回　~pythonとLanguageAppで翻訳~

# 変数名が思いつかない！

皆さんはコーディングの際，変数名や関数名で困ったことはありますか？
英語力のない私にとって，これは深刻な問題です．

今回はLanguageAppとPythonを使ってコンソール上で文字の翻訳を行います．
なお，GoogleAppScriptの操作は[こちらの記事](https://qiita.com/tanabee/items/c79c5c28ba0537112922)を参考に行ってください．

~~~ python:translate.py
import requests
import sys

base_url = ('https://script.google.com/macros/s/hoge/exec')
text = sys.argv[1]
source = 'ja'
target = 'en'

url = '{}?text={}&source={}&target={}'.format(base_url, text, source, target)

print(requests.post(url).text)
~~~


~~~ terminal:
>python translate.py 翻訳

translation
~~~

プログラムの内容はurlを用意してrequests.postで叩くだけです．
あとはpyinstaller等でexe化すれば翻訳アプリの完成です！
【PythonのORM】SQLAlchemyの基本的な使い方！

![sql-alchemy.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/659561/ff4e850e-f1d4-4566-4b03-a67f9f094ffe.jpeg)


# はじめに

SQLAlchemy とは、Python で使用できる ORM です。

Python コミュニティにおける最も使用されている ORM ライブラリの一つとなっているので、使用する機会も多いかと思います。

そんな SQLAlchemy の基本的な使い方をまとめてみました。

まずは、ここから基本的な操作を学び、応用的なものについては、随時調べながら実装すると良いかと思います。

# 使い方

## インストール

```
$ pip install sqlalchemy
```

## モデルの作成

以下のようにモデルを定義することで実行のタイミングでテーブルが生成されます。

```python
engine = sqlalchemy.create_engine('sqlite:///db.sqlite3', echo=True)
Base = declarative_base()


class Account(Base):
    __tablename__ = 'account'

    email = Column(String, primary_key=True)
    password = Column(String)


Base.metadata.create_all(bind=engine)
```

## 基本操作

### Insert

データを追加する際は、まず、session を生成します。

その後、作成したモデルにデータを入力し、session に対して追加します。

追加したデータを commit でデータベースへ反映して、session を閉じます。

```python
db_session = sessionmaker(bind=engine)()
account = Account(email=email, password=password)
db_session.add(account)
db_session.commit()
db_session.close()
```

### Select

データを参照する際も、まず、session を生成します。

その後、query を使って、参照したいデータを指定します。

今回は、all で全てのデータを取っていますが、ここでフィルタリングを行ったり、ソートを行ったりすることができます。

最後に、session を閉じます。

```python
db_session = sessionmaker(bind=engine)()
db_session.query(Account).all()
db_session.close()
```

### Update

データを更新する際も、まず、session を生成します。

その後、更新したいデータをモデルから作成し、session に対して追加します。

追加したデータを commit でデータベースへ反映して、session を閉じます。

```python
db_session = sessionmaker(bind=engine)()
account = Account(email=email, password=password)
account = new_email
db_session.add(account)
db_session.commit()
db_session.close()
```

### Delete

データを削除する際も、まず、session を生成します。

その後、削除したいデータを query を使って、取得します。

delete を使って取得したデータを削除して、データベースに反映、session を閉じます。

```python
db_session = sessionmaker(bind=engine)()
account = db_session.query(Account).first()
db_session.delete(account)
db_session.commit()
db_session.close()
```

## 直接SQL文を実行

上記で示した指定の方法のほかにより細かな操作などしたいときは、直接 SQL 文を実行します。

以下のように engine.execute で実行できます。

select の場合の例を示していますが、渡す引数の文字列を変えてあげることで他の操作も可能です。

```python
from sqlalchemy import *

engine = create_engine('sqlite:///db.sqlite3')

result = engine.execute("select * from sample_table")

for row in result:
    print(row)
```

# おわりに

いかがでしたか。

SQLAlchemy を使い始める第一歩になっていただけると幸いです。

フレームワークによっては、SQLAlchemy を使うことなくアプリケーションを作成することもできますが、

軽量なフレームワークを使う際は、SQLAlchemy を重宝するかと思います。

ぜひ、色々触ってみて、慣れていってください。

https://note.com/ryoka_in
こちらのサイトで一部の記事を先行して有料公開しています。ぜひご覧ください。

# 参考

https://www.sqlalchemy.org/
備忘録(jquery)

jqueryでeach文を回して、href要素から特定の文字列を変換する方法

  $(".sideNavMod .list a").each(function() {
    var obj = $(this);
    var link = obj.attr("href");
    link = link.replace(/\/i\//g , "\/");
    $(".sideNavMod .list a").attr("href",link);
    console.log(link);
  });
PHP 任意の文字列の中に指定の文字列があるかどうかを調べる

# 目的

- 任意の文字列の中に指定の文字列があるかどうかを調べる`strpos()`メソッドについてメモ的にまとめる

# 情報

- 筆者は下記のサービスを使用して当該メソッドの動作検証を行った。
    - [https://paiza.io/ja](https://paiza.io/ja)

# 方法

- 下記のように記載することで任意の文字列中に指定の文字列があるかどうかを調べる事ができる。

    ```php
    strpos('任意の文字列', '指定の文字列');
    ```

- `strpos()`メソッドの戻り値
    - 任意の文字列内に指定の文字列が存在した場合、「任意の文字列の先頭から指定の文字列までの文字数」をバイト単位で返す。~~（日本語は2バイト文字なので注意）~~
    - 任意の文字列内に指定の文字列が存在しなかった場合、`false`を返す。（この関数はboolのfalseを返すが、「falseとして評価される値」を返す可能性があるらしい。戻り値の比較には`===`演算子を使用して厳密に比較する必要がある。）

# 例

- 下記の内容を実行すると「30」が返され、表示される。

    ```php
    <?php
    $str = 'おはようございます、こんにちは、こんばんは';

    echo strpos($str, 'こんにちは');
    ```

# 参考文献

- [https://www.php.net/manual/ja/function.strpos.php](https://www.php.net/manual/ja/function.strpos.php)
Deviseで論理削除を実装する

## この記事の内容
DeviseでUser論理削除機能を実装する機会がありました。
Deviseを使うのが２年前のスクール卒以来...？というのもあり、機能の理解含めてなかなか勉強になったので、記事にして書き留めておこうと思います。
なお、実装時のバージョンは以下の通りです。

- `Rails 6.0.0`
- `Devise 4.6`

## 参考にした情報

Deviseの論理削除に関しては、[公式のドキュメント](https://github.com/heartcombo/devise/wiki/How-to:-Soft-delete-a-user-when-user-deletes-account)に載っている他、[それを翻訳した記事](https://qiita.com/t1gert1ger/items/0b90040085005f0860bf)も存在します。

- [How to: Soft delete a user when user deletes account](https://github.com/heartcombo/devise/wiki/How-to:-Soft-delete-a-user-when-user-deletes-account)
- [【翻訳】deviseで論理削除を実装する方法](https://qiita.com/t1gert1ger/items/0b90040085005f0860bf)

本記事では、上記に加えてユーザーのメールアドレスも変更していること、実装時にもらったアドバイスも含めている点に違いがあります。

## 仕様
今回は、ユーザーが「他のユーザー」を削除する機能で、ユーザーは自分自身を削除することはできません。
また、削除されたユーザーには、`delete`フラグをつけるとともに、
メールアドレスを以下のように変更しようと思います。

```
hoge@example.com_deleted_削除された日時
```
削除された日時などをメールアドレスに追加するのは、万が一同じメールアドレスで再度登録があっても、DBの一意性制約に引っ掛からず登録できるようにするためです。

## 実装
### 公式ドキュメント等と同じところ
途中までは[上記の参考記事](https://github.com/heartcombo/devise/wiki/How-to:-Soft-delete-a-user-when-user-deletes-account)と同じです。

`user`モデルに`deleted_at`カラムを作ります。

```sh
rails g migration AddDeletedAtColumnToUsers deleted_at:datetime
rails db:migrate
```
今後、`deleted_at`カラムに値が入っていれば「削除済みユーザー」とみなします。

削除時のルーティングをオーバーライドします。

```rb
devise_for :users, :controllers => { :registrations => 'users/registrations' }
```

### ここからがオリジナルポイント
`users::registrations_controller`の`destroy`メソッドをオーバーライドします。実際に書いたコードはこんな感じです。

```ruby:controllers/users/registration_controller.rb
class Users::RegistrationsController < Devise::RegistrationsController

  def destroy
    user = User.find(params[:id])
    soft_delete(user)
    set_flash_message :notice, :destroyed
    yield resource if block_given?
    respond_with_navigational { redirect_to root_path }
  end

  private

  def soft_delete(user)
    deleted_email = user.email + '_deleted_' + I18n.l(Time.current, format: :delete_flag)
    user.assign_attributes(email: deleted_email, deleted_at: Time.current)
    user.skip_reconfirmation!
    user.save!
  end
end
```

まず、今回は「画面上から自分以外の誰かを選択して、その人を削除する」仕様だったので、該当userのidを`params`で飛ばして変数`user`に代入しています。

`soft_delete`の部分は、[公式のドキュメント](https://github.com/heartcombo/devise/wiki/How-to:-Soft-delete-a-user-when-user-deletes-account)とだいぶ違くなりました。

まず、ユーザー自身に「削除」という振る舞いを持たせる仕様ではないので、モデルメソッドではなく、`controller`のメソッドとして記載。

```
2021-07-18_20-10-44
```

の様に、秒まで記載してくれて、間に空欄のない日付形式をメールアドレスに足したかったので、
`format: :delete_flag`で`delete`メソッド用の日付けフォーマットを定義。

最後に、deviseはユーザーのメールアドレスが変更されると確認メールを飛ばしてしまうので、

```ruby
user.skip_reconfirmation!
```

で削除したユーザーに確認メールを飛ばすのをスキップしています。

### 安全・安心のために（削除したユーザーのログアウト）
さらに、削除したユーザーがログイン中の場合、そのユーザーを強制サインアウトさせられると安心です。
`user`モデルにて以下の様に設定しました。

```ruby:models/user.rb
class User < ApplicationRecord
  def active_for_authentication?
    super && !deleted_at
  end
end
```

これは公式ドキュメントの記載の通りです`active_for_authentification?`メソッドの理解に少し時間がかかったので[deviseのドキュメント](https://www.rubydoc.info/github/plataformatec/devise/Devise/Models/Authenticatable)へのリンクも追記しておきます。

## 完成！
以上で、完成でした。
`devise`を理解する初期に実装した機能だったので、当初はかなり複雑な様に思えたのですが、実際にはそうでもなかったですね＾＾
他にも、deviseは複雑な内容が多かったので、またノートを書きたいと思います。
SVNで困ることいろいろ（バージョン管理初心者向け？）

# この記事について
Git信者の私が、SVN管理のプロジェクトで困ったことをいろいろ書いていきます。
Qiitaの皆さんはGitがお好きだと思いますのであまり需要は無さそうですが、「なぜSVNはダメなのか」という点はあまり書かれてなかったような気がしたのでとりあえずｻﾞﾗｯと書き込んでみます。ｻﾞﾗｻﾞﾗ

Git初心者がなぜGitを使わなければならないのか、とかその辺の参考になるかもしれません。

# GitとSVNどちらが人気か
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1642231/2b747339-ab38-d385-7634-e2d15db3dd0c.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1642231/dcec66cd-b19e-d7f8-7187-b92ed815e9d2.png)
どうみてもGitが人気です。
本当にありがとうございました。

# トランクやブランチ、タグごとにチェックアウトする必要がある
ブランチやタグがたくさんあったり、ファイル容量デカい物（PDFとか色々）がコミットされている場合
まとめてチェックアウトするのは時間かかって大変です。
トランクやブランチを指定してチェックアウトすることも可能ですが、何かあったとき新しくチェックアウトしたりする必要があるので面倒ですね。
Gitならブランチやらタグやら選んで変えるだけ。超楽。

# ログからコミットを消すのが大変
SVNではコミットを取り消すのが大変らしいです。
どうやら「svn コミット なかったことにする」とかでぐぐってしまえば方法はあるみたいなんですが、リポジトリサーバー側にあるファイルを消し飛ばしたりとか色々危険な方法が書かれてます。
Gitならリセットやらチェリーピックやら色々使えば、特定のコミットをなかったことに出来ます。あとはRevertしてあげるとか。

# ロック解除忘れ問題
よくExcelのファイルとかに対してロック機能を使うこと多々あるでしょう。
他人が編集できないのはいいことかもしれませんが、解除のし忘れでやりとりが多々発生するのも事実。。
Gitにはこの機能ないんですよね。逆に言えばSVNの唯一のメリットかも。

# `git svn fetch`がめっちゃ時間かかる
じゃあgit-svnを使おう！と思ってコマンドを打つわけですが
リビジョンが4桁を超えると、普通に数時間かかります。
で、気付いたら途中エラーが出て止まるとか。悲しい。

# 後からトランク、ブランチ、タグフォルダを用意されると色々面倒
git-svnを使う場合、branchesフォルダとかを見てブランチを切ってくれるのですが途中からbranchesやらtagsやら用意した場合は特定のリビジョンでクローンする必要があります。
そのリビジョンから過去の履歴を引っ張る場合は、別のリポジトリを用意してリモート追加してリベース、など結構面倒な作業をする必要があります。。

# 最後に
「後からgit-svnでどうにでもなるから...」というのは甘え。
こんな問題で困るぐらいなら、最初からGitやろう！
単体試験について学んだことを文系SEがまとめてみた

<h1>はじめに</h1>

####「単体試験？何するん？ブラックボックス？ホワイトボックス？なんだそれ」
という状況だった文系卒SEの人間です。
そんな私のような単体試験って何？と初めて取り組む人にとっての少しでも参考になればと思います！
レッツゴー★

<h1>単体試験ってまずどの工程でやるもの？</h1>
今回はウォーターフォールモデルでの作業工程で説明します。
単体試験は以下の順番に沿い、製造（プログラミング）後に行います。

①要件定義
②基本設計
③詳細設計
④製造
⑤単体試験←ココ!!
⑥結合試験
⑦総合試験
⑧納品

製造（動作するモノを作る）をして、それに対して間違いがないかどうかをチェックするというのが単体試験です。
単体試験はWEB開発であれば、画面単位、Windowsアプリ開発であればフォーム単位といった単位で行います。場合によってはフロントサイドとサーバーサイドで単体試験を行う人が違うこともあります。
製造でバグ（不具合）がないということは必ずしも良いということではありません。見つからなかった=見つけられなかったという場合もあるからです。単体試験の項目をどう抽出するかにも試験者の腕の見せどこです☆彡

###ポイント💡
単体試験項目(単体試験法案)を作成して単体試験に挑んだ方が確実にミスは少なくできます！
単体試験項目を作る際にもどのテストの種類で実際にテストを進めていくのか考えながら作成しましょう。
確認してもらえる環境なら、他の方にレビューしてもらいましょう。

####単体試験をする際に何を元に単体試験項目って作っていくもの？
→基本設計書、詳細設計書などのドキュメント
→ソースコード

####単体試験項目を作らなくてもやっていける場合ってある？
→画面単位やフォーム単位ではなく、メソッド単位で行う単体試験の場合は書き出さなくても洗い出せることがあります。

<h1>単体試験ってどのくらい時間をかけるもの？</h1>
製造にかけた時間の半分が目安と言われています。
例）製造が8時間なら単体テストが4時間

<h1>単体試験の種類</h1>
ここからは単体試験の種類について説明します。
###①ホワイトボックステスト
プログラムが想定通りに動くかどうか確認します。ソースコードを確認します。製造者が原則行います。
例えばif文の処理があれば、記述したコード全て通っている（フルパス）であることが必要です。逆に言えば、通らなかったコードは不必要なコードということになります。ポイントは**網羅的**に確認を行うことです！

###②ブラックボックステスト
ソースコード側を確認するのではなく、設計書通りに動いているかどうか画面やフォームを見ながら確認を行います。
レイアウト崩れがあるかどうかといった性能面までを確認します。
製造者以外が行うことが原則です。

###③同値分割
　有効値と無効値でグループ分けをし、それぞれ代表的な値をテストデータとします。
1月～12月までをテキストボックスに入力するとOKで13以上ならNGの場合、有効値である1～12のいずれか1つをテストすれば、他の項目のテストを行う必要はありません。NG値も同様に1つテストすればよいのです。このように代表的な値を選択し、テストすることが同値分割です。

###④境界値分析
有効値と無効値の境界となる値をテストデータとします。
12以上がNGであれば、OKとNGの境界値である12と13の値をテストします。このように、OKとNGの瀬戸際の値でテストを行うのが境界値分析です。

※いずれの手法に関しても、DBがあると確認すべき点は増えます（データ登録、削除、DB接続、処理時間など）

<h1>単体試験で確認すべき項目の例</h1>
- 入力チェック
    - 端数処理（四捨五入など）
    - 入力文字数制限
    - メール形式確認

- 表示チェック
    - 数値（3桁区切り、数値右詰めなど）
    - 全般（レイアウト崩れ）
- ログチェック
  - 不要なエラーが発生していないか

詳細設計書に記載されていないことでも当たり前に確認すべきことだと設計者が認識している場合があります。詳細設計書がすべての正ではなく、自分で何が必要か必ず考えて単体試験項目作成や単体試験に取り組むようにしましょう。

<h1>最後に</h1>
　慣れないうちは単体試験項目を考えすぎても時間が足りなくなってしまいます。私もまだまだ試験項目を考えることに頭を悩ませています。
しかし、必ず押さえるべき点は押さえ、時間配分を上手くやっていく必要があります。
他の方から指摘をもらうことで気づくこともあるので、自分じゃ無理だ！と思ったときは周りの人を頼ることも実践してみましょう★
単体試験についてちんぷんかんぷんだった私も段々と掴んできましたので、経験に勝るものはありません。。。
少しでも皆さんの力になれていれば幸いです。では✋
初めてのDjango　Windowsで詰まったこと

Python、Djangoのインストールから起動して「The install worked successfully! Congratulations!」が見れるまで。

#1．参考にしたサイト
https://docs.djangoproject.com/ja/3.2/intro/tutorial01/#creating-a-project
https://docs.djangoproject.com/ja/3.2/intro/install/#install-python
https://qiita.com/t-iguchi/items/f9052d259cec7fe54a00

#2.詰まったポイント、いけたポイント
- [x] Pythonのインストール自体
- [ ] Djangoのインストール自体
- [ ] django-admin startproject mysite の実行　→　うまくいけば、「The install worked successfully! Congratulations!」が見れる

簡単なステップしかないように見えるのに、ほとんどのフェーズで詰まりました。 

#3.何に詰まったのか？
##詰まったポイント１
DjangoのインストールはPythonの仮想環境内で行わないといけない。
しかし、仮想環境外でコマンドを実行してDjangoのインストールをした気になっていた。

##詰まったポイント２
django-admin startproject mysite も仮想環境外で行っていた。そのため、「コマンドが見つかりません」と怒られる。

すごく単純ですが、仮想環境内でちゃんとやれ！！という話でした。

これから、Djangoと戯れる日々を開始します。
絵をシャッフルしたクイズが好きなので、再現してみる

# はじめに

最近あまりにも暑すぎて、家にいることが多いですよね。
となると、家で時間をつぶす道具が必要となります。

時間つぶしの道具といえば、発想系クイズ

発想系クイズは、１問１問あたり解くのに時間がかかり
人を選ばないので楽しいです。

なので、低コストでたくさん作ることが出来るクイズを作りましょう。


#　用意するものと手順


![987.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/715986/5d279c0c-a07c-bbe9-6ea4-7a66cd1149d0.jpeg)

ここによくある漢字があります、こいつをバラバラにしていきましょう。
まずは入口です。

```Python
import cv2
import numpy as np
import random
from itertools import chain

PIC = 20
raw = cv2.imread("S20160410022001A_000.png",1)
test = cv2.resize(raw , (int(raw.shape[0]*PIC), int(raw.shape[1]*PIC)))
```

PICで分割する数を決めます。
今回は20なので、20×20に分割されます。

```Python
ans = np.zeros(test.shape)
NUM= PIC**2
new_pic = list(range(NUM))
random.shuffle(new_pic)
```

今回の要となる部分はここです。

ここで20×20のランダムにちりばめられたリストを作ることによって、バラバラにすることを実現させています。
イメージとしては15パズルとかをイメージしていただけると助かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/715986/7a9c7008-2470-be2b-d81f-af680987e8ad.png)

この数字が

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/715986/2bf00c5d-6a28-a29f-7f18-4cadb45462c2.png)

こうなっているとバラバラですよね。
これを再現していきましょう。


```Python
for j in range(NUM):
    ax = (j // PIC)
    hori = ((j)% PIC)
    r_ax = (new_pic[j] // PIC)
    r_hori = ((new_pic[j])% PIC)
    ans[int(r_ax*test.shape[0]//PIC):(r_ax+1)*test.shape[0]//PIC,r_hori*test.shape[1]//PIC:(r_hori+1)*test.shape[1]//PIC] = \
    test[ax*test.shape[0]//PIC:(ax+1)*test.shape[0]//PIC,hori*test.shape[1]//PIC:(hori+1)*test.shape[1]//PIC]
```

商とあまりで座標決めすることによって
このように並び替えることが出来ます。

```Python
img = cv2.resize(ans , (raw.shape[1],raw.shape[0]))
cv2.imwrite("barabara.jpg",img.astype(int))
```

あとは、**サイズをもとに戻して(１回やらかした）**保存して終了です。

![barabara.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/715986/bc5bbe17-0d2c-6cb2-fbe2-ea16132da517.jpeg)

先ほどの密もバラバラですね。疎ですね。
よかった。

あとはPICの数を弄って難易度を調整して遊びましょう。

#　最後に

こうすることによって、簡単にクイズを作ることが出来ます。
皆さんも暇なときに作って遊びましょう！

もっと楽しくできる方法とかあれば教えていただけると幸いです。
実装して遊びます！
CakePHP4 Fakerライブラリーを使って複数ダミーデータを作成

Every Qiita #17
のんびり独学初学者の毎日投稿チャレンジ 17日目
今回は・・・
cakephp4で初期データをランダム生成した際の備忘録です。

###データを複数保存したい
userデータを50程生成したいが、1つずつinsertするのは流石に面倒・・・
ランダムでデータを生成してくれるライブラリーがあれば使ってみたいと思った。

###Fakerライブラリーのインストール
composerからFakerをインストールします。
`$ composer require fzaninotto/faker`
これで準備完了！あとは通常通りseedファイルを作成してFakerオブジェクトから任意のランダムデータを生成します。

###seedファイルの生成
`bin/cake bake seed Users`
まずはusersテーブルのseedファイルをbakeします。

```php:UsersSeed.php
 public function run()
 {
    $faker = Faker\Factory::create();
    $data = [];
    for($i=0; $i < 50; $i++){
        $data[] = [
            'email' => $faker->email,
            'password' => sha1($faker->password)
        ];
    }

    $table = $this->table('users');
    $table->insert($data)->save();
 }
```
1. `$faker = Faker\Factory::create()`Fakerオブジェクトを変数に格納
1. $faker->任意でランダムデータを生成します。
*sha1()でパスワードをハッシュ化します*

###seedファイルの実行
`bin/cake migrations seed`
これでダミーデータが保存されます。


###Fakerメソッドの種類
https://github.com/fzaninotto/Faker/tree/master/src/Faker/Provider/ja_JP

名前や電話番号、住所など様々なものがありますので、上記から用途に合わせて使用してみてください。
Laravel８にBootstrap導入時のエラーと解決

#こんにちは
タイトル通り
Laravel８にBootstrap導入時のエラーと解決について
初学者なりに記事を書いていきます。

#前提に
Laravel8.xからはTailwindというCSSフレームワークが標準となっています。
以前までは、Bootstrapでした。
Laravel8.xでもBootstrapを使いたい！という場合の
エラーと解決までの話になります。

#開発環境
* mac os
* MAMP
* Laravel８系

# Bootstrapのインストール
* Composerを使ってインストール

```
composer require laravel/ui
```
* artisanコマンドを実行

```
php artisan ui bootstrap
```

すると以下のログが出ます

```
Bootstrap scaffolding installed successfully.
Please run "npm install && npm run dev" to compile your fresh scaffolding.
```

その後、

```
npm install && npm run dev
```
をコマンド入力してok、、
かと思いきや
#エラー

```php:/Applications/MAMP/htdocs/プロジェクト名/public/css/app.css
// 2行目
@charset "UTF-8";
```
こいつが原因らしいです。

エラーメッセージを翻訳すると
"ルールまたはセレクターが必要です"、

初学者の自分は

ちょっと意味わからん、、

ということで、

# @charseについてググってみる事に

記事はこちらを参照しました。
https://developer.mozilla.org/ja/docs/Web/CSS/@charset

そこには、

"@charset at-規則 は、スタイルシートで使う文字エンコーディングを定義します。
この規則はスタイルシートの最初の要素でなければならず、
これより前には文字を一切記述してはいけません。"

との事。

ん！
なら、２行目の

```
@charset "UTF-8";
```
を１行目に書いてみると

なんと
エラーが消えました、、笑

ブラウザの方で確認すると
しっかりBootstrap反映されてました。

@charsetについて無知であり
理解しないままのエラー解決？
となりました。

まぁ納得いくはずもなく、、

引き続き調べてみて
また詳細につて
追記できたらと思います。

以上でした。
AtCoderログ：0023 - ABC 210 B

# 問題：[ABC 210 B - Bouzu Mekuri](https://atcoder.jp/contests/abc210/tasks/abc210_b)

## 問題文
> $N$ 枚のカードからなる山札があります。
> それぞれのカードは、「良いカード」か「悪いカード」かのどちらかです。
> 高橋君と青木君は、この山札を使って対戦ゲームをします。
> このゲームでは、$2$ 人は交互に山札の一番上のカードを引いて、そのカードを食べます。
> 先に悪いカードを食べたプレイヤーの負けです。（ここで、山札には少なくとも $1$ 枚の悪いカードが含まれていることが保証されます。）
> 0 と 1 からなる文字列 $S$ が与えられます。$i=1,2,\ldots,N$  について、
> ・$S$ の $i$ 文字目が 0 のとき、山札の上から $i$ 番目のカードが良いカードであることを表します。
> ・$S$ の $i$ 文字目が 1 のとき、山札の上から $i$ 番目のカードが悪いカードであることを表します。
> 高橋君が先手でゲームを始めるとき、高橋君と青木君の**どちらが負けるか**を答えてください

## 制約
> ・$1 \le N \le 10^5$
> ・$N$ は整数
> ・$S$ は 0 と 1 からなる長さ $N$ の文字列
> ・$S$ は少なくとも $1$ 個の 1 を含む。

# 回答1 (AC)
対戦ゲームのルールは、カードを交互にめくり、最初に悪いカードをめくった方が負けるというものです。なので、文字列 s で最初に 1 が現れるときのインデックスを調べれば良いでしょう。コードは以下のようになりました。コードではインデックスが 0 から始まるため、インデックスが偶数なら高橋君、インデックスが奇数なら青木君の順番となることに注意が必要です。

```C++:abc210b-1.cpp
#include <bits/stdc++.h>
using namespace std;
 
int main() {
  int n;
  cin >> n;
  string s;
  cin >> s;

  int index = 0;
  while ( s.at(index)!='1' ) {
    index += 1;
  }

  if ( index%2==0 ) {
    cout << "Takahashi" << endl;
  } else {
    cout << "Aoki" << endl;
  }
}
```

# 回答2 (AC)
回答1のポイントは「文字列の最初の 1 のインデックスを求める」ことでした。文字列に対する find 関数を利用すると、このようなインデックスを簡単に求めることが出来ます。コードは以下のようになりました。私が[提出したコード](https://atcoder.jp/contests/abc210/submissions/24292499)ではこの方針を使用しました。

```C++:abc210b-2.cpp
#include <bits/stdc++.h>
using namespace std;
 
int main() {
  int n;
  cin >> n;
  string s;
  cin >> s;
 
  int index = s.find('1');
  if ( index%2==0 ) {
    cout << "Takahashi" << endl;
  } else {
    cout << "Aoki" << endl;
  }
}
```

# 調べたこと
## [AtCoder の解説](https://atcoder.jp/contests/abc210/tasks/abc210_b/editorial) → [公式解説](https://atcoder.jp/contests/abc210/editorial/2294)
for 文を使ったコーディングが紹介されていました。

# リンク
- 前の記事 → [AtCoderログ：0022 - ABC 210 A](https://qiita.com/RoadLynton/items/5730d21e57a52cf7ca3c)
- 次の記事 → [AtCoderログ：0024 - ABC 210 C](https://qiita.com/RoadLynton/items/2afcfb40b491f276bd2d)
Composerのインストール手順

## Composerとは

PHPの依存管理ツール。パッケージ管理ツール。

## パッケージ管理ツールとは

パッケージとは便利ツールなど複数のファイル一式が集まったもの。
パッケージを使用するには別のパッケージが必要だったりする。これを依存関係という。
インストール時やアップグレード時には依存関係にあるパッケージを自動でインストールやアップデートしてくれる。

## インストール手順

```jsx
//①composerのインストール
curl -sS https://getcomposer.org/installer | php
//-sは通常出力される進捗状況表示やエラーメッセージ表示を表示しないようにする
//ただし-Sを同時に指定することでエラーメッセージの表示抑制は行わない、

//②composerのファイルを/usr/local/binに移動
sudo mv composer.phar /usr/local/bin/composer

//③composerのアクセス権限を変更する
chmod a+x /usr/local/bin/composer
//a+xは全てのユーザーに実行権を付与という意味　

//バージョンが表示されればcomposerのインストール完了
composer -v

```

## Composer.jsonとComposer.lockについて

まず初めに「composer install」するとcomposer.jsonに書かれた情報を基にパッケージがvendorディレクトリ配下にまとめてインストールされる。この時composer.lockが生成される。
2回目以降「composer install」した時はcomposer.jsonではなくcomposer.lockを参照する。

composer.lockのファイルをGit管理して共有するとメンバー間でパッケージやパッケージのバージョンを統一できるので便利。

## 参考
「composer.jsonとcomposer.lockの役割について分かりやすくまとめてみた」
https://www.engilaboo.com/about-composer/
WSLでpyenvで切り替わらない

よくわかってないけど、

```
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
```

なかんじを .bachrc にかいても、pythonのパスが見つからない（デフォから変わらない）。

とりあえず一行付けたしたら動いている

```
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
export PATH="$HOME/.pyenv/shims:$PATH"
if command -v pyenv 1>/dev/null 2>&1; then
    eval "$(pyenv init -)"
fi
```

前者だけでなんでみんな動いているのか、仕組みがよくわかっていない。
落としたアセットをシーンに入れたら真っピンクになるあれ

##アセットが真っピンクに！
![photo01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1779656/02f9d943-59b0-763f-ee17-191a4ddb3d1e.png)
##実行環境
以下の環境で動作確認しました。

Windows 10 Home 21H1
Unity Hub 2.4.0
Unity 2021.1.14f1

##参考サイト
https://light11.hatenadiary.com/entry/2020/05/06/134429

##困っている項目
__・配置したアセットがSceneやGameでピンク色になる__
__・下記のエラーコードが出る__
``Shader error in 'Unlit/Outline': Couldn't open include file 'Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl'. at line ***``
__・Render Pipeline Assetがどこにあるかわからない。__

##まずはRender Pipeline Assetを確認してみよう
``Edit > Project Settings > Graphics > Scriptable Render Pipeline Settings``
を確認する。
![photo02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1779656/05ec9221-68bd-917a-5e39-f0bbe0090141.png)
``None (Render Pipeline Asset)``となっていた場合、__Universal Render Pipeline(URP)__を設定することでピンク色から元の色になります。

一覧を表示してRender Pipeline Assetがあれば、設定をすることでピンクになったアセットを元の色にすることができます。
しかし、プロジェクトを作成してから特に変更を加えてなければ**Render Pipeline Assetがプロジェクト内に存在しません**。

##次にPackage ManagerでUniversal RPをInstallしよう
``Window > Package Manager``を開き、**Packages:をUnity Registryに変更する**。
![photo04.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1779656/ee6b70e9-2ee7-e879-10ce-0c3de2c6270b.png)

``Universal RP``を選択し、インストールする。
![photo06.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1779656/d1d8844d-40d7-a7c2-c832-7e15bdba07cb.png)
>Unity2019.2以前のバージョンではLightweight Render Pipelineと名称が異なります。

##最後はRender PipeLine Assetを設定してみよう
``Edit > Project Settings > Graphics > Scriptable Render Pipeline Settings``
を再び確認し、一覧を開く。
![photo05.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1779656/62debb92-5c31-715c-2564-b95ad37bc981.png)
None以外の項目があるので、好みのQualityを選択する。

##できた
![photo03.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1779656/4d5a1971-81ce-8f0b-f52a-dbd2b787e34a.png)
**アセットが元の色になって一安心！**
Amazon RDS 拡張モニタリング とは

## 勉強前イメージ

有効化しないと見えないログ

## 調査

### Amazon RDS 拡張モニタリング とは

RDSが稼働しているOSのメトリクスを取ることができるもので、
メモリの使用率やどのプロセスやスレッドでCPUが使用されているのか確認することができ、
Cloudwatch logsにデータの保存ができるものです。

これはデフォルトで無効になっていて、設定時に有効にするかあとから設定で有効にすることで
拡張モニタリングを行うことができます。
以下は作成時の設定の箇所になります。

![1RDS Management Console - Google Chrome 2021-07-19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/da5e79db-dd60-5d06-80d5-03dedb961943.png)

### 比較

`拡張モニタリングを有効にしているRDS` と `拡張モニタリングを有効にしていないRDS` で比較してみました

- 拡張モニタリングを有効にしているRDS

![2RDS Management Console - Google Chrome 2021-07-19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/9da29511-5955-65f1-8239-4767620a888c.png)


- 拡張モニタリングを有効にしていないRDS

![3RDS Management Console - Google Chrome 2021-07-19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/7b556c0e-2130-8bed-948b-d7f51dcfd6ca.png)


拡張モニタリングを有効にすると `拡張モニタリング` と `OSプロセスリスト` が有効になります。
それぞれ見れるものとしましては以下になります。

- 拡張モニタリング

![4RDS Management Console - Google Chrome 2021-07-19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/980666fa-c5fc-e5ee-7201-31f741c7e854.png)


- OSプロセスリスト

![5RDS Management Console - Google Chrome 2021-07-19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/6119a6ef-9e12-376f-b418-07cd98c7c16f.png)

### 費用

費用に関しては、RDS拡張モニタリングの費用はかかりませんが、Cloudwatchの費用の費用がかかります。
詳細に関しては [こちら](https://aws.amazon.com/jp/cloudwatch/pricing/) からご確認ください。


## 勉強後イメージ

あるのは知ってたけど、プロセスも見ることできるのか・・・
グラフも結構いろいろ見れるからサーバののtopとかそんな感じのやつ見れるって感じかな

## 参考

- [Amazon RDSの拡張モニタリングのメトリクスをAWS CLIから取得してみた](https://dev.classmethod.jp/articles/collect-rds-enhanced-monitoring-metrics-from-aws-cli/)
- [[AWS SAA対策] CloudWatchの詳細モニタリングと、拡張モニタリング](https://infraya.work/exam/awssaa_summary_cloudwatch/)
- [RDS のトラブル発生に備えて!やっておくべき設定・監視 #jawsdays2021 #jawsdays20](https://speakerdeck.com/_mossann_t/rds-falsetoraburufa-sheng-nibei-ete-yatuteokubekishe-ding-jian-shi-number-jawsdays2021-number-jawsdays2021-b?slide=17)
【AtCoder】ABC210をPython3で解説

ABC210の解説。

https://atcoder.jp/contests/abc210

## A - Cabbages
### 解説
キャベツ1つ$x$円。
**もし、キャベツを$A$個より多く買うとき、次から買うキャベツは$Y$円で買うことができる。**

キャベツを$N$個買うとき、必要な金額はいくらかという問題。

問題文の通り実装すれば、ACできる。注意点は、もし$A$よりも多いとき、というところだ。

### コード
```python
n, a, x, y = map(int, input().split())

if n > a:
    print(x*a+(n-a)*y)
else:
    print(x*n)
```

## B - Bouzu Mekuri
### 解説

問題の解釈をすると、文字列$S$のなかで先に$1$を出したほうの名前を出力するという問題。

文字列$S$を1文字ずつ確認していって、$1$が出たときに条件分岐。偶数番目なら、青木くんの負けなので```print('Aoki')```、奇数番目なら、高橋くんの負けなので```print('Takahashi')```を出力します。

### コード
```python
n = int(input())
slist = list(input())
cnt = 0

for s in slist:
    cnt += 1
    if s == '1':
        if cnt % 2 != 0:
            print('Takahashi')
        else:
            print('Aoki')
        break
```

## C - Colorful Candies
### 解説
$N$個のキャンディーがそれぞれ$c$色になっている。連続した$K$個のキャンディーからとれる最大の色の種類数を取るという問題。

今回の注意点は、$K$と$N$の最大値が$3 \times 10^5$であるということ。つまり、計算量が$O(n^2)$となると、```TLE```してしまう。したがって、これより少ない計算量で解かなければならない。

コードにおいて工夫した点は、```deque```と```dict()```を使ったことだ。いわゆる**しゃくとり法**を用いた。
詳しくはこちらを御覧いただきたい。https://qiita.com/drken/items/ecd1a472d3a0e7db8dce

先にコードを示す。

### コード
```python
# dequeをimport
from collections import deque

# input()
n, k = map(int, input().split())
clist = list(map(int, input().split()))

# 初期設定
dic = {}
cnt = 0
temp = deque()
keep = 0

for c in clist:
    temp.append(c)
    cnt += 1

    # もし辞書にcのkeyがなければ、1をカウント
    # あれば、数える
    if c not in dic:
        dic[c] = 1
    else:
        dic[c] += 1

    # keyの数を取得
    len_dic = len(dic)

    # もしkeyの数が今まで以上ならば、keepに保存
    if len_dic >= keep:
        keep = len_dic

    # tempの長さがk以上、つまり、連続する範囲を超えたなら、一番左にある古い値を取り除き、範囲外になったので、辞書のその値から1を引く
    if cnt >= k:
        t = temp.popleft()
        dic[t] -= 1
        # もしvalueが0になれば、そのまま残すと辞書のkeyの数としてカウントされてしまうので、辞書から取り除く
        if dic[t] == 0:
            dic.pop(t)

print(keep)
```

### 解説続き

連続する$K$個の色を見ていきたいので、それを保存する場所をつくる。これをキューを用いて実装する。なぜなら、キューに```append```、```popleft```のそれぞれの操作は、計算量$O(1)$で実装できるからである。したがって、ループの中に入れても計算量を$O(n)$に保つことができる。

これと組み合わせて使うのが、```dict()```である。```set(list())```で長さを数えればいいじゃないか、という意見もあるが、```list()```を```set()```にする作業で計算量$O(n)$かかってしまう。したがって、キャンディーの色の種類の保存には、```dict()```を用いる。例えば、同じ色がキューに```append```されたときに、辞書のkeyに当たる部分を探し出し、$+1$カウントしてあげるだけで良い。また、キューから値が出る、```popleft()```するときは、もし辞書のvalueが0担った場合、辞書のkeyを消してあげることで色の種類を数えることができる。

これをコードに起こしてあげると上記のようになる。詳しい解説は、コード内にコメントアウトしてあるので、そちらをみていただきたい。

## 編集後記
そろそろC問題で茶diff来そうだなー。
任意の文字列が含まれたファイルを探すワンライナー

Linuxでコード書いていると、「あれ～、どこのヘッダーに定義情報書いてあったっけ？」ってたまになるので、OSの中の全ヘッダーファイルを検索して目的の情報を見つけ出すときのワンライナー。

最近だと WSL なんかを使っている人もいるだろうし、そうするとデフォルトで``/mnt/c``が Windows OS のファイルシステムと繋がっているので Windows 上のファイルもスキャンしちゃっていつまでたっても検索終わらんのでディレクトリの検索除外オプションも入れておく。

```bash
[Ubuntu: ~]$find / -type d -name mnt -prune -o -type f -name "検索したいファイル名" -print 2>/dev/null | xargs grep -i "検索したい文字"
```

- ``-type d -name <ディレクトリ名> -prune``: 指定したディレクトリを検索から除外
- ``-type f -name <ファイル名> -print``: 指定したファイル名を検索してファイルパスを表示
- ``-o``: 前者(``-type d -name <ディレクトリ名> -prune``)が真ならば、後者(``-type f -name <ファイル名> -print``)は評価しない
- ``xargs grep -i "検索したい文字"``: ファイルパスを1行ずつ``grep``に渡して、大文字小文字を無視して検索

e.g) ``/mnt``ディレクトリ以外で、``.h``がファイル名に含まれるファイルから、``tcp_rto``の文字列が含まれるファイルを探す

```bash
[Ubuntu: ~]$find / -type d -name mnt -prune -o -type f -name "*.h" -print 2>/dev/null | xargs grep -i "tcp_rto*"
```

e.g) ``/mnt``ディレクトリ以外の全ファイルから、``tcp_rto``の文字列が含まれるファイルを探す

```bash
[Ubuntu: ~]$find / -type d -name mnt -prune -o -type f -print 2>/dev/null | xargs grep -i "tcp_rto*" 2>/dev/null
```
Web画面の作成①

#### 実装
- 画像の埋め込み
`<img src="./Image/HiroshiInui.jpg" alt="犬井ヒロシ">`で画像の埋め込み。wwwrootからの絶対パスを指定。
![スクリーンショット 2021-07-08 22.37.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391844/cc7e8394-3316-0ec9-ca0a-5f029a5308bf.png)

- localhostでは表示されていた画像が、Webappsにデプロイすると表示されない。「高度なツール」からデプロイしたアプリを参照すると、wwwroot配下に配置したはずの画像ファイルが反映されていない？[Base64に変換](https://enjoyall.comichi.com/image_by_base64/)してから、imgタグのsrcに指定すると画像表示されるようになった。

- formタグを使って入力欄を作成。bootstrapでそれっぽいデザインに。（[参考](https://qiita.com/AquaMeria/items/fe3fd9ebeb4c7171da3b)）

- jqueryで日付などを初期設定させたいが、なぜかうまく動かないので。原因を解明次第次回投稿する。
![prawebapp.azurewebsites.net_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391844/0cd1c882-e87c-c542-fd00-d9919bc00455.png)


#### 想定するゴール
タイトルや備考から文字列を分析。
日付やジャンルで絞り込み。
普段の生活をグラフで可視化できるようにしたい。
F# で CSV ファイルを読み取る方法

1. 作業用ディレクトリを作成して移動する
1. CSV ファイルを用意してカレントディレクトリに置く
1. `dotnet new console -lang F#` でプロジェクトを作成
1. `dotnet add package FSharp.Data` で必要なパッケージをインストール
1. 以下のようなコードを書く
1. `dotnet run` を実行する（終わり）

```fsharp
open FSharp.Data

type CsvType = CsvProvider<"./data.csv">
let rows = CsvType.GetSample().Rows
```
UISliderとCollectionViewの簡単復習App

# 完成形はこんな感じです
<img width="150" alt="5430FE7D-4169-45D4-A910-53AE8A402E9D_1_201_a.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1466343/f9ab16e6-6fe6-2780-2fad-54bf14399098.jpeg">

# 機能説明
　* Sliderを右にスライドさせると、CollectionViewのcellが表示されます。

# コードと簡単解説

* `.sectionInset = UIEdgeInsets(top: 5, left: 5, bottom: 5, right: 5)`の箇所は、CollectionViewのレイアウトを設定
* UISliderの最小値は０、最大値は100にしています(cellを最大100個表示できる様にしている)

```Swift:ViewController
import UIKit

class ViewController: UIViewController{
   
    @IBOutlet weak var collectionView: UICollectionView!
    @IBOutlet weak var cellCountSlider: UISlider!
    
    let collectionViewFlowLayout = UICollectionViewFlowLayout()
    
    var cellCount = 0
       
    override func viewDidLoad() {
        super.viewDidLoad()
        
        cellCountSlider.minimumValue = 0
        cellCountSlider.maximumValue = 100
        
        collectionView.delegate = self
        collectionView.dataSource = self

    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        
        collectionViewFlowLayout.sectionInset = UIEdgeInsets(top: 5, left: 5, bottom: 5, right: 5)
        collectionView.collectionViewLayout = collectionViewFlowLayout        
        
    }
    
    @IBAction func cellCountUpMinus(_ sender: UISlider) {
        
        if sender.value >= 0{
            
            cellCount = Int(sender.value)
            collectionView.reloadData()
            
        }    
    }
}
```

* `func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {}`では表示するcellの個数を設定します。

* `func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {}`では表示するcellとそのcellに表示する内容を設定します。

* `func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {}`ではcellのwidthやheightの設定をしています

```Swift:ViewController
extension ViewController:UICollectionViewDelegate,UICollectionViewDataSource,UICollectionViewDelegateFlowLayout{
    
    
    
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
              
      return cellCount
        
    }
    
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath)
        
        cell.backgroundColor = .systemTeal
        
        return cell
        
    }
    
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        
        return CGSize(width: collectionView.frame.size.width / 4 - 10, height: collectionView.frame.size.width / 4)
        
    } 
}
```

# 終わり
最近、TableViewを使うことが多くて、なかなかCollectionViewを使えてなかったので復習の為に作りました。
ご指摘や質問などありましたら、喜んで受け付けてます。
[HTML]aタグとlinkタグの違い

# はじめに
本記事では、aタグとlinkタグの違いを理解しましたので、
アウトプットも兼ねて改めてまとめました。

# aタグとは
`リンク`という言葉を聞くと、
***「aタグ」***を連想する方は多いでしょう。

### `aタグはHTMLの文章の一部をハイパーリンクにするタグ`  です。
・インライン要素
・「Anchor（アンカー）」とも呼ばれている
・`bodyタグ`に記載　　　＊個人的に重要


aタグ＝ハイパーリンクだと思っても良いと思います。
`文章中でリンクを作る場合`はこのタグを使う必要があります。


# linkタグとは

### `指定しているページと関係のあるページを関連付けるためのタグ`です。
linkタグがWebサイトの`見栄えに直接関係することはありません`。

・`headタグ`に記載　　　　　＊個人的に重要
・外部ファイルになっているCSSを読み込む。





# 終わり
今回のように似た意味でも、全く違う使い方をするものは、
`どのように`使用するかは理解しておきたいです。

また他には、
同じ言葉なのに使う場面が違う
といったものもまとめていきたいと考えております。
引き続き学習を進めます！
hPaからinHgへの変換（簡易版）

## 気圧をhPaで言われてもわからん
M5StackのENVⅡセンサで気圧を取るとhPaなので、inHgに変換する簡易式を。
## 式
標高0メートル、気温０℃と仮定する。
1気圧は1013.25[hPa], 29.92[inHg]
1[inHg] = 33.8639[hPa]
なので、いい感じに小数点を揃えると
$inHg = hPa / 33.86$
で簡易的に計算できる。
例えば、
$1013.25/33.86= 29.9246898996$
## 参考文献
[水銀柱インチ](https://edu.yz.yamagata-u.ac.jp/developer/Asp/Youzan/Physics/Unit/@Unit.asp?nUnitID=255)
FactoryBotでxxとxx_idというカラムが存在した場合設定した値が反映されない

# 環境

- rails 5.2.6
- factory_bot_rails 5.0.2

# 概要

下記の様にモデル内にbarというカラムと、bar_idというカラムが存在する場合、`FactoryBot.build(:foo, bar: "bar", bar_id: 99)`と生成するとbarとbar_idが正しく設定されずnilになってしまう

```ruby
# テーブル
create_table :foo do |t|
  t.string :bar
  t.integer :bar_id
end

# ファクトリー
factory :foo do
  bar {}
  bar_id {}
end
```

# 解決方法

ファクトリーの`after(:build)`で設定した値を上書きする  
（根本の解決方法があれあば教えて下さい。原因の当りはついているがソース見てもイマイチわからず。）

```
after(:build) do |foo, evaluator|
  foo.bar = evaluator.bar
  foo.bar_id = evaluator.bar_id
end
```
【Git】チームから学ぶGitの使い方　GitHubでチーム作成編

####My Profile
プログラミング学習歴②ヶ月目のアカウントです！
プログラミングスクールで学んだ内容や自分が躓いた箇所等のアウトプットの為に発信しています。
また、プログラミング初学者の方にわかりやすく、簡潔にまとめて情報共有できればと考えています。
もし、投稿した記事の中に誤り等ございましたら、コメント欄でご教授いただけると幸いです。　



#対象者

*　GitHubでチーム作成をしたい方


#目的

* GitHubを使ってチームを作成すること

#実際の手順と実例
###1.前回までの流れ
下記のURLを✅です！

https://qiita.com/nao0725/items/93edf410d4951c157dfa

###2.早速チームを作成

下記では３人のチームを想定。
まずは代表者がGitの設定をしていく。

①下記画像のカーソルをあわせた部分　　　**NewOrganaizattion**でチームを作成します。
![スクリーンショット 2021-07-19 21.16.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1681213/3973b610-1d25-3478-dfc1-5a97ce499c44.png)

②無料プラン選択
③必要情報クリック
④メンバーのメールアドレスを入力しチームに招待
⑤peopleを押してから編集・削除の権限を与えるために全員**Owner**に変更
![スクリーンショット 2021-07-19 21.24.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1681213/e304a3f6-5a66-24ea-6111-78f3f2c3e4e1.png)

⑥create repositoryでリポジトリ作成


次回はチームでのアプリケーション立ち上げを行います！
3秒で完成！！！自宅Dropbox～容量無制限～

#はじめに
家のPCを何台か処分したのでそのついでに自宅Dropboxを新しく作り直したのでそのメモです。(家のPCを何台か処分とは？？という突込みはご遠慮ください。)
普段、DropboxやGoogleDrive、OneDriveなどクラウドストレージを使っていると思います。めっちゃ便利ですよね！


困ったことに無料で使おうとすると容量不足に困りませんか？
そんなあなたに朗報です。お家の余っているPCと容量大き目のSSDかHDDでクラウドストレージが無料で作れてしまいます。(SSDで作る人は大金持ちです。。。)
しかもディスクの容量は無制限なのでハードさえあれば実質、容量無制限の専用クラウドストレージの出来上がりです。

#概要
###用意するもの
 - PC(CPUもメモリもしょぼくてOK、我が家は何世代か前のXeon＆メモリ８GB)
 - Linuxのインストールメディア(8GB以上の容量のUSB)
 - HDD or SSD 何Tでも

###どんな感じで作るの？
1. PCにLinuxをインストール(仮想でもよい、ubuntuが楽)
1. IPを固定にする
1. コンソールで1行コマンドを実行
1. Web画面で管理者アカウントを作成
1. スマホ用アプリやPC用クライアントソフトを使ってDropboxのように利用開始！！！

#本編
###PCにLinuxをインストール(仮想でもよい、ubuntuが楽)
- [Download Ubuntu Desktop]
(https://ubuntu.com/download/desktop)

上記からUbuntuをダウンロード。Rufusあたりを使ってubuntuのインストールメディアを作ります。

- [起動可能なUSBドライブを簡単に作成できます - Rufus]
(https://rufus.ie/ja/)

インストールメディアを作ったらそれを使ってPCにubuntuをインストール。

###IPを固定にする
次はIPを固定します。ググればすぐ出てくるので割愛。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365885/415a0b85-00d6-be66-5ca3-6acf5d8aaff2.png)


###コンソールで1行コマンドを実行
とは言いつつubuntuを更新しておきましょう。
以下のコマンドをコンソールで実行。

```
　　sudo apt update
　　sudo apt upgrade
　　sudo apt install snapd -y
```
ubuntuのバージョン20ならsnapは入ってそうだけど一応。
では本チャンのコマンドを実行！！！！

```
　　sudo snap install nextcloud
```

これでDropboxが爆誕しました。(セキュリティとか気にするならなんちゃって証明書とか使ってhttpsとかにしてね)

###Web画面で管理者アカウントを作成
あとはブラウザを使ってNextcloudにアクセスして管理者ユーザーを作れば終わりです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365885/89b97ad4-dee0-3cd9-5518-54f1bab85dc6.png)



###スマホ用アプリやPC用クライアントソフトを使ってDropboxのように利用開始！！！
公式がいろいろとクライアントソフトを出しているのでそれを使えばドロップボックスのように使えます。

#最後に
昔は(Owncloudの時代)はこんな簡単にできなくて、データベースをこしらえたりWebサーバーの設定をしたりで大変だったのですが、めっちゃ簡単になりましたね。びっくりです。

####我が家のNextcloud
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365885/ac4f1cb9-e54d-d1ec-bf18-9280389cfc7b.png)


ちなみにPCとか複数ない人はラズパイでやると安くできます。Zeroとかで構築するのが良いです。あとちょっと難易度上がりますがubuntuをCUIで入れるとかなり低スペックのPCでもサクサク動くのでできる人はそっちでやるほうが良いです。

###ラズパイでのやり方
- [ラズパイでNextCloudサーバを動かす]
(https://raspberrypi.mongonta.com/howto-install-nextcloud-raspberrypi-with-snap/)
- [Raspi 3B+に外付けHDDをつなげてNextCloudでファイルサーバーを作成](https://vasteelab.com/2020/01/26/2020-01-26-raspi_3b%E3%81%AB%E5%A4%96%E4%BB%98%E3%81%91hdd%E3%82%92%E3%81%A4%E3%81%AA%E3%81%92%E3%81%A6nextcloud%E3%81%A7%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC/)

###本物のように外からもアクセスしたければこちらを参考にどぞ
- [NextCloudで外部からのアクセスを可能にする]
(https://satsumahomeserver.com/blog/293491)

###意外詰まるので一応
- [iPhoneで撮影した写真や動画をNextcloudサーバへ自動アップロードするには](https://denor.jp/iphone%E3%81%A7%E6%92%AE%E5%BD%B1%E3%81%97%E3%81%9F%E5%86%99%E7%9C%9F%E3%82%84%E5%8B%95%E7%94%BB%E3%82%92nextcloud%E3%82%B5%E3%83%BC%E3%83%90%E3%81%B8%E8%87%AA%E5%8B%95%E3%82%A2%E3%83%83%E3%83%97)

#参考にした、参考になるサイト
- [Ubuntu20.04(64bit)でラズパイ4をファイル共有＆バックアップサーバーにする。]
(https://raspberrypi.mongonta.com/ubuntu20-0464bit2-2-nextcloud/)
【Minecraft統合版】コマンド解説 〜初心者向け〜

統合版Minecraftコマンド解説
今回は初心者向けの解説をしていきます。
これから中級者向けのコマンド解説もやっていく予定です。

##バージョン情報

・統合版（Windows10版・Switch・PS4）
・ Ver. 1.14.7

##はじめに
　このコマンド紹介は少しでもコマンドに触れやすく、楽しくしていただきたいため、作成しています。見ていただけると幸いです。

##目次

- 対象を打つときに
- ゲームモード変更コマンド
- テレポートコマンド
- 時間を変更するコマンド
- 特定のエンティティをキルする

##対象を打つときに
　Minecraftのコマンドで対象を選ぶ時があります。その時に@p・@s・@aなどを選ぶことができます。
それぞれの使い方は以下の通りです。

|表記方法|対象  　   　|
|---|----------------|
|@s  |自分自身 　　　　　     |
|@a |ワールド内の全員 　　     |
|@p|近い人 　　     |
|@r |ランダムなプレイヤー 　　     |
|@e |エンティティ　     |

##ゲームモード変更コマンド
　これはサバイバルモード・クリエイティブモード・アドベンチャーモードを切り替えることができるコマンドです。設定画面からもできますが、いちいち開くのが面倒なので便利です。

構文
gamemode （ゲームモード） （対象）
です。

入力例
（サバイバルモードから自分をクリエイティブモード）

```gamemode creative @s
```
また、
```gamemode c
```
のように自分のみに実行する際は、対象を付けなくてもよく、対象が誰であっても「survival→s」「creative→c」「adventure→a」と省略することが可能です。

もちろん対象の部分にはプレイヤー名を入力することができます。

##テレポートコマンド
　テレポートは座標を打ち込むとその場所へワープすることができるものです。このコマンドを使うには事前にテレポートしたい場所の座標を知っておく必要があります。

構文１　特定の人を指定した座標へ送る
tp （対象） （座標）

構文２　特定の人を別の人のところへ送る
tp （送りたい人）　（送る先の人）

構文３　全員を自分へ集める
tp @a @s

構文４　特定のmob（エンティティ）を集める
tp @e[type=エンティティのID] （集める先の人・座標）

座標は統合版の場合、設定画面で座標を表示する設定があります。
コマンドで行う場合は
```/gamerule showcoordinates true
```で座標が表示され、

```/gamerule showcoordinates false
```で表示されなくなります。

座標の打ち込み方では、〜が使えます。これは後で紹介するfillコマンドやsetblockコマンドでよく使用しますが、
```/tp @a ~ ~ ~
```と打つと、全員が自分の立っているブロックにtpします。

座標　x=100, y=70, z=200　にtpするとします。自分がもしy=70にいるとすると、
```/tp @s 100 ~ 200
```と打つことができます。

エンティティについても説明をします。エンティティはサバイバルのプレイヤーを含むmobのことです。mobにはゾンビやスケルトン、クリーパーなどがあります。
それらのエンティティの中から特定のエンティティのみを選択することができます。
@e[type=　と打ち、＝の後ろにエンティティのIDを入れます。最後は　] で閉じて実行します。

例
```@e[type=zombie]
```です。これだけでは作動しませんが、この構文の前に　tp や後に紹介する　kill などを当てはめます。

##時間を変更するコマンド
　このコマンドはMinecraft内の時間を操ることができます。

```/time set day
```
これを実行すると時間が昼に設定されます。

時間設定コマンド一覧

|構文|説明  　   　|
|---|----------------|
|/time set day  |昼にする 　　　　　     |
|/time set night |夜にする 　　     |
|/time set noon|昼の真ん中にする　　     |
|/time set midnight |夜の真ん中にする　     |

おまけ

```/gamerule doDaylightCycle false
```

これを実行すると時が止まります。このコマンドは作物の成長やmobの動きを止めることはできません。あくまで時間の値を固定するだけです。

##特定のエンティティをキルする
　キルというのは「殺す」という意味です。

```/kill @s
```と実行すると自分がサバイバルモードの場合、死亡します。
他のバージョンなどでは分かりませんが、自分の使っているMinecraftではクリエイティブモードの場合はkillコマンドは効きません。おそらくkillコマンドはエンティティを対象としているので効かないのだと思われます。

killコマンド構文一覧

|構文|説明  　   　|
|---|----------------|
|/kill @a  |サバイバルプレイヤー全員がkillされます 　　　　　     |
|/kill @s |自分がサバイバルモードの場合、killされます 　　     |
|/kill @e|サバイバルプレイヤーを含む全てのエンティティがkillされます　　     |
|/kill （プレイヤー名） |特定のプレイヤーをkillします　     |

@eは先ほども紹介した通り、特定のエンティティのみを対象とすることができます。

killコマンドでの@eは特定のmobも指定することができます。これはtpコマンドなどと同様に
 kill @e[type=
　の後に続けてmobのIDを指定するとmob全てをkillすることができます。

kill @e 

と打つとボートやアイテム化しているものなどのエンティティも無くなります。

アイテムのみをkillしたい場合は

kill @e[type=item]

と打ち込めばドロップしているアイテムのみがkillされます。

##最後に
　今回は初心者向けとして簡単なコマンドを紹介しました。TPコマンドには視点を固定するコマンドもあるので後々のところで解説していきます。
自宅PC(GPU有)にUbuntu 20.04LTSをインストール

#はじめに
中古で買ったデスクトップPCにGROMACSをインストールする。
結果としてはCentOSに比べるとかなり楽だった。

#環境
CPU：Intel Core i7-4770
グラフィックボード：Nvidia GeForce GTX1650
メモリ：16GB
外付けSSD:240GB
※もともとはWindowsPCのため、外付けSSDにUbuntuをインストールする


#下準備

* USBメモリでインストールメディア作成
* PCシャットダウンし、（電源ケーブルを抜いた後、）WindowsをインストールしているSSDのコネクタを引き抜く


#インストール

下記の記事を参考にした。ただし、後にCUDA-ToolkitをインストールするのでNvidiaドライバーはここでは入れなかった。

https://qiita.com/Shunmo17/items/b18beec90b8ac7463a2c

自分の環境ではいきなりGPUから高解像度の画面出力ができ、インストールも通常のやり方で大丈夫だった。このあたりの違いはよくわかりません。

事前にDisksでSSDの表示がsdaであることを確認すると安心して作業できる


#CUDA-Toolkitのインストール

バージョンは11.4を選択。
nvccのパスが通っていなかったので、/usr/local/cuda-11.4/binをパスに加えた。



#その他もろもろ

## google chromeインストール

https://linuxfan.info/google-chrome-on-ubuntu


##vimインストール

カラフル表示にしたいので。

```
sudo apt-get install vim
```

##ディレクトリの名前を英語にする

https://qiita.com/taiko19xx/items/d1a001bfc25245b91354

##Anacondaインストール
MAMPでタイムゾーン変更が反映されない時

#MAMPでphp.iniファイルのtimezone設定を変更したのにタイムゾーン変更が反映されない
php.iniファイルを編集したはずなのに変更が反映されない
どうして？

##確認１　編集したphp.iniファイルは正しいですか？

### php.iniファイルの場所の確認
1, MAMPコントローラーからWebStartボタンをクリックしMAMPのページを開きます
2, **Tools**メニューから**phpinfo**を選択します。
3, **phpinfo**が表示されたら**Loaded Configuration File**の項目を確認します。
ここに編集すべきphp.iniファイルの場所とファイル名が記載されています。`/Applications/MAMP/bin/php/php(バージョン番号)/conf/php.ini`

このファイルを編集しないと変更が反映されません。

### よくある間違い
`/Applications/MAMP/conf/php(バージョン番号)/`フォルダに有る`php.ini`ファイルを編集した。

##確認２　php.iniファイルの編集
正しい`php.ini`ファイルが分かったらファイルを開きコードを編集します。

```php.ini
変更前
;date.timezone = "Europe/Berlin"

変更後
date.timezone = "Asia/Tokyo"
```
注意
`date.timezone = "Asia/Tokyo"`の前の`;`は削除します。
先頭の`;`はコメントを表しているので`"Asia/Tokyo"`だけ書き換えても変更が反映されません。

##確認3　最後にApachサーバーを再起動
お忘れなく！
kubeflow pipeline をLinuxにデプロイ(kind編)

##　はじめに
`awesome-kfp`というライブラリを現在作成中です。よければStarまたはContributionお願いいたします🙏

https://github.com/ozora-ogino/awesome-kfp

## Kubeflowとは
KubeflowとはMLOpsを実現するためのKubernate上で動作するツール群のこと。
詳しくはこちらの記事にまとめてあります。

https://qiita.com/ozora/items/a5f69072f243a4b3ea21

## Deploy Kubeflow pipeline on Linux
基本的にはKubernatesはクラウド上で運用することが多いと思いますが、今回は実験としてローカル上に仮想Kubernatesクラスターを立ち上げてその上にKubeflowをデプロイしていきたいと思います。
公式のチュートリアルに乗っ取った方法でやっていきたいと思います。

公式ではローカルに仮想クラスターを実現するためにkind(Kubernates in Docker)やk3sというKubernatesよりもライトなローカルやエッジ用ツールを用いたチュートリアルが紹介されています。
今回はkindを使ってDeployしていきます。
kindについては以下参照

https://kind.sigs.k8s.io/docs/user/quick-start/

### Install kind

以下のコマンドでkindをインストールします。YOUR_KIND_DIRECTORYには適宜PATHの通っているディレクトリに変更してください。
kindのバージョンはインストールしたいバージョンを指定してください。2021/7月現在最新は`v0.11.1`です。

```bash
curl -Lo ./kind https://kind.sigs.k8s.io/dl/{KIND_VERSION}/kind-linux-amd64 && \
chmod +x ./kind && \
mv ./kind /{YOUR_KIND_DIRECTORY}/kind
```

### Deploy Kubeflow on kind cluster

まず以下のコマンドでKindのクラスターを作成できます。

```bash
kind create cluster
```

クラスターが無事作成できたらKubeflowをでプロします。
以下のコマンドでデプロイします。（今回はバージョン1.6.0を使用）

```bash
# env/platform-agnostic-pns hasn't been publically released, so you will install it from master
export PIPELINE_VERSION=1.6.0
kubectl apply -k "github.com/kubeflow/pipelines/manifests/kustomize/cluster-scoped-resources?ref=$PIPELINE_VERSION"
kubectl wait --for condition=established --timeout=60s crd/applications.app.k8s.io
kubectl apply -k "github.com/kubeflow/pipelines/manifests/kustomize/env/platform-agnostic-pns?ref=$PIPELINE_VERSION"
```

以下のコマンドでKubeflowのUIをlocalhostにポートフォワードしてデプロイを確認します（数分から数十分かかりますので気長に待ちましょう。）

```bash
kubectl port-forward -n kubeflow svc/ml-pipeline-ui 8080:80
# then open http://localhost:8080/
```

SSH tunnelを使用してリモートサーバ上のKubeflowダッシュボードにアクセスするには

```bash
ssh -L 8080:127.0.0.1:8080 {USER}@{HOST_NAME} -p 22 -i ~/.ssh/id_rsa
```
いいねやRTが多いtweetだけをfeed readerで読む

twitterでtweetが多い人をタイムラインで追い切れない場合、twitterではmuteして、feed readerに登録してまとめて読むと便利です。
しかしもっとtweetが多い人だとこれでも追いつかない。かといって見逃すのも惜しい。
せめていいねやRTが多いtweetだけでも読みたい、という場合の指定方法です。

# twitterでの検索方法
twitterの検索ボックスで

```
from:qiita min_faves:20 OR min_retweets:20
```
のように指定すれば、指定アカウント(qiita)のtweetのうち、いいねが20以上またはRTが20以上のtweetだけが読めます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335774/1429526a-088c-a366-ad68-7cf6bbf3e03f.png)

# Inoreader Proへの登録方法
このURLをたとえばInoreader Proに登録すればOKです。

```
https://twitter.com/search?q=from%3Aqiita%20min_faves%3A20%20OR%20min_retweets%3A20&src=typed_query&f=live
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335774/7d53f082-0582-0bb8-e656-4e3898e79f25.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335774/28d90264-0249-a8c8-1802-247998d1dc34.png)

# 他のfeed readerへの対応
他のfeed readerでも、tweetからfeedへの変換フィルタ(今何が使えるのか把握してませんが…)を通せばできそうです。
ActiveHash用テンプレ

```ruby
class ItemSalesStatus < ActiveHash::Base
  self.data = [
    {id: 1, name: ''},
    {id: 2, name: ''},
    {id: 3, name: ''},
    {id: 4, name: ''},
    {id: 5, name: ''},
    {id: 6, name: ''},
    {id: 7, name: ''},
    {id: 8, name: ''},
    {id: 9, name: ''},
    {id: 10, name: ''},
  ]

  include ActiveHash::Associations
  has_many :items
end
```

使いまわしできそうなので、メモ。
2.16(難) 分布関数，期待値の演算

## 1.方針

XがYよりも確率的に大きい，という条件から，期待値をP[X>t],P[Y>t]を使った形で書けないか考える．すると，2.7で証明した

```math
\begin{align}
\mathbb{E}_{X\sim f_X}[X]&= \int_0^\infty\{1-F_X(x)\}dx-\int_{-\infty}^0F_X(x)dx\\
&= \int_0^\infty P[t\leq X]dt-\int_{-\infty}^0\{1-P[t\leq X]\}dt
\end{align}
```

を用いることができる．ただ，これを初見で思いつくのは無理．

## 1.答案

```math
\begin{align}
\mathbb{E}_{X\sim f_X}[X]-\mathbb{E}_{Y\sim f_Y}[Y]&=\int_0^\infty P[t\leq X]dt-\int_{-\infty}^0\{1-P[t\leq X]\}dt\\
&\ \ \ \  -\int_0^\infty P[t\leq Y]dt+\int_{-\infty}^0\{1-P[t\leq Y]\}dt\\
&= \int_0^\infty\{P[t\leq X]-P[t\leq Y]\}dt+\int_{-\infty}^0\{P[t\leq X]-P[t\leq Y]\}dt\\
&= \int_{-\infty}^\infty \{P[t\leq X]-P[t\leq Y]\}dt
\end{align}
```

今，任意の実数tについて

```math
P[t\leq X]\geq P[t\leq Y]
```

が成り立つのだから

```math
\mathbb{E}_{X\sim f_X}-\mathbb{E}_{Y\sim f_Y}[Y]\geq 0
```

## 2.方針

```math
\begin{align}
x=F_X^{-1}(t)&\Leftrightarrow t=F_X(x)\\
&\Leftrightarrow t=P[X\leq x]\\
y=F_Y^{-1}(t)&\Leftrightarrow t=P[Y\leq y]
\end{align}
```

であることに注意する．

## 2.答案

```math
x=F_X^{-1}(t),\ y=F_Y^{-1}(t)
```

と置く．今，任意の定数cについて

```math
P[X\leq c]\leq P[Y\leq c]
```

が成り立つのだから任意の

```math
t=P[X\leq x]=P[Y\leq y]
```

についてx=>yと言える．

## 参考文献

- 『[現代数理統計学の基礎](https://www.kyoritsu-pub.co.jp/bookdetail/9784320111660)』(久保川達也　著)
サーバーレスについて解説してみた(学習まとめ)

#初めに(前書き)
ネットで調べてみれば大量に"サーバーレス"に関するわかりやすい記事がありますが、
私はもっと(もっと)、誰にとってもわかりやすい記事を書いてみたいと思いました。

#本題(本文)
サーバーレスとは、昨今流行している技術動向であり、これはあらゆるWebアプリケーション(＝Webサービス)を開発する上で避けては通れなかったサーバーインフラの構築・運用を自動化あるいは(大手)他社に丸投げしてしまうことを言います。
たとえば、従来のオンプレではサーバーの構築ですと、イニシャルコストがかかりますし、サーバーの運用ですとランニングコストがかかります。
しかし、サーバーレスを導入することで、イニシャルコストはほとんどかかりませんし、ランニングコストはサービスを利用するユーザーの数(≒リクエストの数)やデータ量(≒サーバーにかかる負荷)によって料金が計算されて課金されたり、稼働時のユーザーの数やデータ量に合わせてハードウェア資源の利用をスケールするというメリットを享受できます。※オートスケールと呼ばれます。
これにより、オンプレで実現していたWebアプリケーションの稼働にかかる手間やコストが少なくなるということです。※つまりはサーバーレスとはクラウドを利用しているということです。
ちなみに、具体的なサーバーレス技術としては、「AWS Lambda」「Azure Functions」「IBM Bluemix 」「Google Cloud Functions」「Oracle Fn」等があります。

#最後に(後書き)
今回の"サーバーレス"については以上です。
どうせ記事を書くなら、(世の中でいちばん)わかりやすい記事を目指したいと思いました。
この記事が(特に)ITに不慣れな方の目に留まり、(さっとでも)一読していただければ幸いです。
Substrate ink! 送金 toContract toSomeone

# 要約
- 以前調べて記事にしたのですが、すっかり忘れてしまっていたので、再度メモをします。
- 今回はContract Addressに送金する方法　と　他のアカウントに送金する方法の二つです。

# Contract Addressに送金する方法
```
        #[ink(message)]
        #[ink(payable)] 
        pub fn transfer_to_contract_address(&mut self) -> Result<(),Error>{
            let caller = self.env().caller();
            if self.env().transferred_balance() <= 0 {
                return Err(Error::TokenValueIsZero);
            }
            Ok(())
        }
```

# コントラクトアドレスの残高を確認する
```
        #[ink(message)]
        pub fn get_contract_balances(&self) -> u128{
            self.env().balance()
        }
```

# 他のアカウントに送金する方法
```
        #[ink(message)]
        #[ink(payable)] 
        pub fn transfer_to(&mut self, to:AccountId) -> Result<(),Error> {
            if self.env().transfer(to, self.env().transferred_balance()) != Ok(()){
                return Err(Error::ErrTransfer);
            }
            Ok(())
        }
```