OmniAICreator/Qiita-1.07M huggingface dataset:
PHPとは何？

PHPとは何？

       PHP言語の正式名称は(PHP:Hypertext Preprocessor)であり、ASP、JSPなどはいずれも動的Web開発言語ですが、PHPはクロスプラットフォーム対応でLinux(最適)、Unix上で実行可能、または Windows。Windows プラットフォームでのみ実行できる Microsoft の ASP とは異なり、PHP は無料であり、MySQL、PostgreSQL、dBase、mSQL、Informix、ODBC、Oracle などのさまざまなデータベース サーバーと組み合わせることができます。など

PHP言語はサーバー側で実行されるWebページであり、通常のHTML Webページとは異なり、スタンドアロンのマシンでファイルを開けばWebページを表示できます.PHPはサーバー側で実行してから送信する必要があります結果をクライアント側に送信します。) 結果をブラウザーで表示するには、Web サーバーを使用する必要があり、サーバーが PHP をサポートしている必要があります。 <a href="https://www.globalhome.com.hk/%e5%8f%b0%e7%81%a3%e6%8a%95%e8%b3%87%e7%a7%bb%e6%b0%91">移民台灣</a>  

PHPを上手に学ぶには？ <a href="https://www.globalhome.com.hk/%E5%8A%A0%E6%8B%BF%E5%A4%A7%E5%90%84%E5%80%8B%E7%A7%BB%E6%B0%91%E8%A8%88%E5%8A%83">加拿大技術移民</a> 

PHP をよく学ぶこと、目的を持つこと、何かを書くこと、学校のウェブサイトを書くこと、卒業生システムを書くこと、簡単なニュースエリアや写真アルバムを書くこと...などなど、できるだけ多くの仕事をすることができます。と人生 プログラムを組み合わせることで、面倒な手作業を簡素化したり、作業効率を向上させたりすることができます.目標がある場合にのみ、モチベーションとアイデアが生まれます。<a href="https://www.globalhome.com.hk/%e5%8f%b0%e7%81%a3%e6%8a%95%e8%b3%87%e7%a7%bb%e6%b0%91">台灣移民</a>  

PHP を学ぶ必要はありません。理解している限り、PHP を学ぶことはできません。機能のように暗記する必要はなく、よく使うものは久しぶりに暗記することができ、いらないときはどこに行けばいいのかを知ることができます。つまり、機能を理解すればするほど、スキルが強化されます。

コードはコピーして貼り付けることができますが、なぜこのように書きたいのかを理解する必要があります. ばかげて入力しないでください. できれば、自分で入力するのが最善です. 、コードの各行の原因と結果。または、意図的に間違えて、何が起こるかを見てください。エラーメッセージを長く見ていると、スキルが向上します。

PHPコードの実行方法<a href="https://www.globalhome.com.hk/%E5%8A%A0%E6%8B%BF%E5%A4%A7%E5%90%84%E5%80%8B%E7%A7%BB%E6%B0%91%E8%A8%88%E5%8A%83">加拿大移民</a>
Web サーバー経由:

Web サーバー経由: たとえば、 <a href="https://www.globalhome.com.hk/%e5%8f%b0%e7%81%a3%e6%8a%95%e8%b3%87%e7%a7%bb%e6%b0%91">台灣投資移民條件</a>  Apache HTTP サーバーを使用して、拡張子が .php (または .php3) の Web ページを実行します。

プログラムをテキスト モードで実行します。<a href="https://www.globalhome.com.hk/%E5%8A%A0%E6%8B%BF%E5%A4%A7%E5%90%84%E5%80%8B%E7%A7%BB%E6%B0%91%E8%A8%88%E5%8A%83">加拿大投資移民</a>  

つまり、php.exe (Windows の場合) または php (Unix の場合) を介してテキスト コマンド モードで、PHP コマンドを含むコードを実行します。<a href="https://www.globalhome.com.hk/%e5%8f%b0%e7%81%a3%e6%8a%95%e8%b3%87%e7%a7%bb%e6%b0%91">台灣投資移民</a>  

ps: 一般的な Web ページの拡張子 (.html) を .php に変更すると、その中に PHP コードがなければ、元の html  <a href="https://www.globalhome.com.hk/%e5%8f%b0%e7%81%a3%e6%8a%95%e8%b3%87%e7%a7%bb%e6%b0%91">台灣移民流程</a>  コンテンツのみが出力されます。
Unity ゲームのリトライ（現シーンの再読み込み）

##0.0 はじめに
現在アクティブになっている（プレイ中の）シーン（Scene）をもう一度読み込む方法です。
ゲームオーバーになった際のリトライやリプレイの処理を実装する方法です。
備忘録としてまとめます。


##1.0 スクリプト
下記のみです。

```C#:Test.cs
    SceneManager.LoadScene (SceneManager.GetActiveScene().name);
```

SceneManager.GetActiveScene().nameで現在アクティブなシーンの名前を取得しています。
その名前のシーンをSceneManager.LoadScene()で呼んでいます。

👍**ポイント**
SceneManagerを使うためには下記が必要になりますのでご注意。
using UnityEngine.SceneManagement;
要求工学ランキング

要求工学について調べたときに参考になった記事

#第1位
https://qiita.com/digdagdag/items/2808205d89344ab8a3a1

#第2位
https://qiita.com/Qiitaman/items/17a1e7e7c6cf33ce4079

#第3位
https://qiita.com/taumax/items/5330b47da1330fdc64cd

#その他
https://qiita.com/OzoraKobo/items/5e51c080e84dc00de5b0
https://qiita.com/shoki_kitajima/items/0f6ac36602a8a9044cb1

いつもわかりやすい記事ありがとうございます
mixhostのSOFTACULOUS APPS INSTALLERでLaravelをインストール

##はじめに
mixhostのコントロールパネルの一番下にあるインストーラが、以前から気になっていたので使ってみました。


![スクリーンショット 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1325744/d43e158c-ae0d-446f-cab5-9b580c61595b.png)



##操作
今回は、Laravelをインストールしてみます。
![スクリーンショット 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1325744/b283e562-509b-b1e4-5e77-ef908c967f90.png)
「今すぐインストール」をクリック。

---

![スクリーンショット 3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1325744/78f27a3c-8c69-612c-3380-626ec8307449.png)


ディレクトリを設定してインストールします。既に存在しているディレクトリは設定できないとのことなので、今回は「test01」としました。

---

![スクリーンショット 4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1325744/7e63ce94-efa1-0c58-3c73-a9c6b3f199c6.png)


インストールに３、４分かかります・・・のようなメッセージが出ていたような気がしますが、スクリーンショットを撮ろうとした瞬間終わりました。体感では10秒経っていないくらいなので、成功したのか少し心配になります。
なお、この画面からツイートもできるようです。（やりませんでした）

---

![スクリーンショット 5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1325744/74e032f8-49e8-2742-0c1f-5b5f1ac535ba.png)

問題なく動作しました！

##おわりに

インストールは簡単ですが、バージョン指定ができないので注意が必要です。
（2021/06/08現在は、バージョン8です。）
Laravelでタイトル共通化＋ページごとに個別設定する方法

##タイトルを共通化したいとき
###①.envファイルの変更
共通タイトルを「taro」とする場合、

```:.env
APP_NAME=taro
```
上記のように記述します。
なお、半角スペースを入れるとエラーになります。
上記「taro」としていますが、例えば「test taro」みたいにするとエラーになるということです。

###②bladeファイルを編集
```php:app.blade.php
<title>{{ config('app.name') }}</title>
```
これでソースのtitleおよびブラウザのタブ内を見ると、先ほど設定した「taro」になります。
ちなみに、上記app.nameはconfig/app.phpのnameを読み込んでいます。

さて、そのnameはというと

``` php:config/app.php
'name' => env('APP_NAME', 'Laravel'),
``` 
ここでの'APP_NAME'は.envファイルの’APP_NAME’を読み込んで、
空欄であればLaravelと表示するという意味です。

##ページごとにタイトルを設定したいとき
bladeファイルのtitleタグ内に以下のように記述します。

```php:
<title>@yield('title')</title>
```

また、各ブレードファイルには以下のように記述します。

```php
@section('title', 'ページごとのタイトル')
```


##個別設定もしたいけど共通タイトルも使いたいとき
条件分岐を使います。
各bladeファイルに@section('title')があればそれを表示し、ない場合はconfig('app.name')のみ表示させるよう記述していきます。

```php:
@hasSection('title')
    <title>@yield('title')</title>
@else
    <title>{{ config('app.name') }}</title>
@endif
```
これで個別タイトルが記述されていればそれを表示し、なければ.envファイルのAPP_NAMEで設定した共通タイトルを表示するようになります。

##参考
https://note.com/koushikagawa/n/n33a561590aee
ブログをするなら被リンクを貼れ


ブログを運用したいなら、まずドメインランクを上げることを考えましょう。
中古ドメインを購入してもいいですが、過去にペナルティを受けてしまったドメインもあるので注意しましょう。

被リンクは、自然につく被リンクとそうでない被リンクがあります。
<b>やる過ぎてしまうとあまり良くないので、自演で被リンクを設定する際はほどほどに行いましょう。</b>

https://www.fukumap.com/

https://casinosence.com/
readonlyのセレクトボックスを値変更不可にするjavascript

# 概要
htmlのselectタグにreadonly属性をつけても、見た目それっぽくなるだけで変更できてしまう。
それを解決する方法の1つである「選択中以外の選択肢をすべてdisabledにする」の汎用コード。


# 本題

## jQuery版

```javascript
$(function(){
  $("form select[readonly] > option:not(:selected)").attr('disabled', 'disabled');
})
```

## 素のjs版

@sgn9 さんにコメントで頂きましたので並べておきます

```javascript
window.addEventListener('DOMContentLoaded', () => {
  document.querySelectorAll('select[readonly] option')
    .forEach(e => e.disabled = !e.selected);
});
```

# ポエムな背景

そこそこ汎用的だと思うのだけどそのへんに転がってると思ったら見当たらなくて久しぶりにセレクタ調べました
文字列の時間を分とか秒へ変換したい

<h1>やりたいこと</h1>
Youtubeのコメントによくある、「5:11 めっちゃおもろいw」のようなコメントから

5:11の部分を持ってきて、秒数などに変換したい。


<h1>どうすればいいか</h1>
文字列の時間(1:38:30みたいなの）から時、分、秒を取ってくる必要がある。

2:23:11→２時間２３分１１秒

1:34→１分３４秒

同じような表記なのでどこが時で分で秒か？ということを考慮する必要がある。

調べてみると、文字列→時間に変換するには、

strftime(),strptime()を使うことでできるらしい。

使用例：
import datetime 
tt = datetime.datetime.strptime('1:23:32', '%H:%M:%S').strftime('%H:%M:%S')
print(tt)

>>01:23:32

時、分、秒を別々に取得するには
cmt = '2:4:22'
hour = datetime.datetime.strptime(cmt, '%H:%M:%S').strftime('%H')
min = datetime.datetime.strptime(cmt, '%H:%M:%S').strftime('%M')
sec = datetime.datetime.strptime(cmt, '%H:%M:%S').strftime('%S')


print(int(hour) * 60 * 60)
print(int(min) * 60)
print(sec)

このようにすれば、それぞれの秒数を取得できる、

注意点は、文字列を格納しているcmtの表記が分:秒であるときはエラーになるので、
分：秒ように分岐させる必要あり。
git便利コマンドメモ

## ある文字列を変更したときのログを表示
```
$ git log -S"文字列"
```
## ログをgrep
```
$ git log grep 検索する単語
```
## ブランチのログをグラフィカルに表示
```
$ git log --graph
```
## リモートブランチとの差分を見る
```
$ git diff origin/ブランチ名..コミットID
```
..の左側(origin/ブランチ名)から右側(コミットID)での差分を見ることができる。
## コミット内容を詳細に表示
```
$ git show コミットID
```
Anacondaにpipインストールする

#condaとpip
Anaconda はPythonユーザ向けに作られた便利なツールです
今回はAnacondaの基本的なインストールコマンド"conda"ではなく，Pythonの基本的なインストールコマンドの"pip"で環境を作成していきます

#対象
・pipが使いたい
・Anacondaを使いたい
・condaとpipが乱立する世界から脱却したい


#環境作成
ANACONDA.NAVIGATORを使用します
Environmentsタブを開き，Createボタンを押せば仮想環境の名前とPythonのバージョンを聞かれます
名前，バージョンを入力したら終了です

↓Youtube リンク

https://youtu.be/QS6R5DymPWw


今回はpipenvという名前で開始します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412006/59d7a01c-9651-62ce-766f-4c38506356bf.png)

#pipインストール
次にHomeからCMD.exe Promptをインストールします
すでにインストールされている場合は，
Applications on pipenv になっていることを確認してください

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412006/1762bd2f-1b41-cf24-76fd-eb9a6fa5fc84.png)

インストールが終了したらCMDを起動します
あとは通常のCommand Promptを使ったpipインストールと同様です
環境はすでに選択されているのでactivateは必要ないです
また

```
pip install -r requirements.txt
```
でインストールする場合はCMDに表示されているフォルダにインストールしたいrequirements.txtが存在することを確認してください


#あとがき
ためしにNumpyをpipでインストールしました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412006/f27e744e-dee0-8bd8-9e91-2fa7b5c83515.png)
ちゃんとpipでインストールされたことがアイコンでも表示されています

Anaconda 便利

#似ている記事
GUIで仮想環境を作成した記事が見当たらなかったので書きました
下はCMDで作成されています

https://qiita.com/ell/items/fb60d2fd765650417c7a

#こぼれ話
なぜかインポートしたはずのパッケージが正しく読み込まれないということも起こっていたのでもう少し原因を探ってみるべきかもしれないです
iPhoneでGoogleService-Info.plistを置かずにFCMからのPushの受信

FCM(Firebase Cloud Messaging)をつかったPush通知の際、
通常、GoogleService-Info.plistをXcode プロジェクトのルート以下に配置して実装しているかと思います。

GoogleService-Info.plistはFCMのアカウント(およびプロジェクト)に紐づくファイルとなっており、
基本的に1つのFCMアカウントからのメッセージしか受診できません。

同じアプリでユーザーによって送信元のFCMのアカウントを切りかえたいという話があったので
その調査のメモ書きになります。
※[前の記事](https://qiita.com/nishi-sankosc/items/60a0b5c2febb0ae1ed3d)のiPhone版になります。

###前提事項

前提事項として、GoogleService-Info.plistを配置した状態でFCMのPush通知が届いている環境であることを想定しています。

Push通知が届かない場合の問題の切り分けとして、単純に設定不足なのか
今回の設定が効かなかったのかを区別するため上記前提となっております。
なので、GoogleService-Info.plistありの状態との差分の説明になります。

###GoogleService-Info.plistから必要な情報を取得
後で、GoogleService-Info.plistファイルの読み込みの代わりを実装しますので
GoogleService-Info.plistから[アプリケーションID]、[GCM_SENDER_ID]、[APIキー]、[プロジェクトID]をコピーするなりして保存しておいてください。
後で使います。

```xml:GoogleService-Info.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>CLIENT_ID</key>
	<string>XXX</string>
	<key>REVERSED_CLIENT_ID</key>
	<string>XXX</string>
	<key>API_KEY</key>
	<string>[APIキー]</string>
	<key>GCM_SENDER_ID</key>
	<string>[GCM_SENDER_ID]</string>
	<key>PLIST_VERSION</key>
	<string>1</string>
	<key>BUNDLE_ID</key>
	<string>XXX</string>
	<key>PROJECT_ID</key>
	<string>[プロジェクトID]</string>
	<key>STORAGE_BUCKET</key>
	<string>XXX</string>
	<key>IS_ADS_ENABLED</key>
	<false></false>
	<key>IS_ANALYTICS_ENABLED</key>
	<false></false>
	<key>IS_APPINVITE_ENABLED</key>
	<true></true>
	<key>IS_GCM_ENABLED</key>
	<true></true>
	<key>IS_SIGNIN_ENABLED</key>
	<true></true>
	<key>GOOGLE_APP_ID</key>
	<string>[アプリケーションID]</string>
</dict>
</plist>
```

###GoogleService-Info.plistの削除
必要な情報を取得したので、
GoogleService-Info.plistファイルをXcode プロジェクトのルート以下から取り除きます。
Xcode プロジェクトのルートフォルダを開いて削除します。

###FireBaseの初期化の実装
実装済みの```FirebaseApp.configure()```の代わりにoptions指定付きの初期化メソッドを呼び出します。

```swift:FireBaseの初期化
// Firebase初期化
let options = FirebaseOptions(googleAppID: "[アプリケーションID]", gcmSenderID: "[GCM_SENDER_ID]")
options.apiKey = "[APIキー]"
options.projectID = "[プロジェクトID]"
FirebaseApp.configure(options: options)
```
(ソースはSwiftのプログラムになってます。)
状況に合わせて[アプリケーションID]、[GCM_SENDER_ID]、[APIキー]、[プロジェクトID]を変えれば、
FCMのアカウントの切替などができるかと思います。
※アプリ内の操作をトリガーに上記を呼び出して切り替えをすると、
　消したはずのFCMアカウントからもPushが届いたりするので
　初回インストール時点での切替にした用が良さげです。

###余談
今回は割愛していますが、
iPhoneのPush通知はそもそも端末に届くようにするまでに
苦労をしている気がします。

この記事では、アナリティクスを利用していないですが、後述の参考にしたFirebaseのドキュメントにも
「このアプローチは、状況によってはアナリティクスの収集に影響する可能性があります。信頼できるアナリティクスのセクションをご覧ください。」
とあり、アナリティクスを活用される場合は、ディレクトリを分ける方法を試してみるといいかもしれません。


###参考
下記Firebaseのドキュメントを元に試した内容になります。

https://firebase.google.com/docs/projects/multiprojects?hl=ja
RailsでMaterial Design Iconsを使おう！(もともと使っていたGemが削除されたので新しいのを作ったという話）

とにかくRailsでMaterial Design Iconsつかいたい！
という方はインストールと使い方を読んでもらえれば大丈夫です。
Gem作った背景などはそのあとに続きます。

## インストール

Gemfileに以下を追加します。

```ruby
gem 'rails_material_design_icons'
```

を追加し、`bundle install` を実行します。

## 使い方

application.css`で、cssファイルをインクルードします。

```css
/*
 *= require materialdesignicons
 */
```

おめでとう! 公式サイトで利用可能なアイコンをチェックしましょう。
[https://materialdesignicons.com/](https://materialdesignicons.com/)。

### Sass

以下を `application.scss` ファイルに追加してください。

```scss
@import "materialdesignicons";
```

# Gem作った背景

仕事でなんとなくあるMaterial Design IconsのGemを使っていたが、ある日それがRubygemsから削除されました。

使っていたのはこちらのMaterial Design Iconsです。
https://github.com/barrymieny/material_design_icons

ですが、Rubygemsをみると以下の記載があります


> This gem previously existed, but has been removed by its owner. The RubyGems.org team has reserved this gem name for 36 more days. After that time is up, anyone will be able to claim this gem name using gem push.
If you are the previous owner of this gem, you can change ownership of this gem using the gem owner command. You can also create new versions of this gem using gem push. 

https://rubygems.org/gems/material_design_icons

Gem自体がもうないです。
他に似たGemもありましたが、最近更新されているものはなかったです。
またinline_svgなどの機能もいらないので、できればない方が嬉しいです。

もともと使っていたGemのコードをみると、テストもなく、これだときつい・・・と思ったのですが、[FontAwesomeのRailsインテグレーションのGem](https://github.com/bokmann/font-awesome-rails)だとコードがキレイで、Github Actionsで自動テストもされていました。これをMaterialDesignIcons用に改修しよう！と決めて、一日有給取って、初めてのGem公開しました！
（仕事で使えなくなって困っていたので。。。それに有給使ってしまいました。楽しかったです。）

またMaterial Design Iconsの新しいバージョンがでたらアップデート作業もありますが、すくなくともSVGはないです。
まえ使っていたGemは実は3200個のSVGファイルを読み込んでいたみたいで、使っていなかったので、もったいないという感じでした。
Gemを入れるときはちゃんとソースまで確認しましょう！
という話でした。

ソース自体はこちらです
https://github.com/sampokuokkanen/rails_material_design_icons

# 失敗は成功の元

ちなみに、バージョンを見ると
https://rubygems.org/gems/rails_material_design_icons
最新のバージョンだけにフォントファイルなどが入っているのがわかります。
初めてのGemだったので、Gemspecファイルでファイル取り込みで失敗していました。
基本的にはデフォルトで入るコマンドでいいかと思いますが、もともとのGemのコマンドが入っていて、ちゃんとファイルが入らなかったです。
これもGitから直接Railsに取り入れるとちゃんと入っていたので、解決にはちょっと時間かかりました。

今はデフォルトでも入っているコマンドの以下にしています:

```ruby
gem.files = Dir.chdir(File.expand_path(__dir__)) do
  `git ls-files -z`.split("\x0").reject { |f| f.match(%r{\A(?:test|spec|features)/}) }
end
```
【Ruby】逆数の足し上げ

逆数の和に関する問題を解きました。

【問題】
整数Nについて、1からNまでの整数の逆数の和を「Nまでの逆数和」として、Nまでの逆数和が8を超えるような最小のNを求めてください。

【回答】

```ruby:Ruby

def reciprocal
  array = []
  sum_array = 0
  n = 1
  while sum_array < 8
    r = (1.0 / n)     
    array << r
    sum_array = array.sum
    n += 1
  end
  return n - 1
end

puts reciprocal

```
ATOM Liteのシリアルドライバー(Windows)

# 概要
M5StackのATOM LiteをWindows PCにUSB接続する際、シリアルドライバーが必要になることがある。要否はPCの環境によるようだが、うちでは必要になったのでメモ。

# 手順
## ドライバーをダウンロードする
以下のページからWindows用のVCP Driverをダウンロードする。うちでは手動セットアップは失敗。よって、「setup executable」をダウンロードする。

https://ftdichip.com/drivers/vcp-drivers/

## ドライバーをインストールする
ダウンロードしたzipを展開し、現れた「**CDM21236_Setup.exe**」を実行するとインストール完了。

## ATOM Liteを接続する
デバイスマネージャのポート(COMとLPT)に「USB Serial Port(COM○)」が表示されれば成功。

# 最後に
インターネットを検索しても、このトラブルの事例は少ない。ほとんどの場合、何もせずに認識される様子。ただ、身の回りにも一人、認識されない人がいた。
【React】You should not use <Link> outside a <Router>の対処法

<h2>症状</h2>
react-router-domのLinkを使用としたとき、下記エラーが発生してしまいました。
翻訳すると 「<Link> を <Router> の外で使用しないでください」でした。

```terminal:error
Error: Invariant failed: You should not use <Link> outside a <Router>
```

```react:App.jsx
import React,{ Fragment } from "react";
import './App.css';
import {
  BrowserRouter as Router,
  Switch,
  Route,
} from "react-router-dom";
import HogeIndex  from "HogeIndex";
import Hoge from "Hoge";
import { Link } from "react-router-dom";

function App() {
  return (
    <Fragment>
    <Link to={`/`}>
    <Router>
      <Switch>
        <Route
          exact
          path="/">
          <HogeIndex />
        </Route>
          }
        >
        </Route>
        <Route
          exact
          path="/hpge">
          <Hoge />
        </Route>
          }
        >
        </Route>
      </Switch>
    </Router>
    </Fragment>
  );
}

export default App;
```


<h2>解決策</h2>
Linkタグを内部に入れたら、解決しました。
構成上Router外部から、ページ遷移させたい場合はhistoryを使ったりするようです。
下記参照

https://aknow2.hatenablog.com/entry/2018/05/11/182638

<h2>参考</h2>
https://teratail.com/questions/134856
さよならmacOS Server

もう3年も前のことなんですね、appleが「今後のmacOS ServerにはメールサーバやWebサーバの機能は組み込みませんので」と発表したのは。

https://qiita.com/Keiyaku_Shine/items/864143c4b0e7dde0c2aa

「これは困ったことになる」と思いIMAPが使えるレンタルメールサーバを探したわけですが、帯に短したすきに長しという感じでしたし、macOS Serverも問題なく動いていたので「こんなもんか」と放置していましたが。

今年に入り何度かメールサーバが詰まっているような気がして重い腰を上げてみたところ、迷惑メールフィルタのバージョンが古すぎてファイルがダウンロード出来ず警告を受けてはまたダウンロードしに行きというループに陥ってしまっていたため、機能を外して迷惑メールを受け入れるか別のメールサーバに乗り換えるかの選択を迫られる事態に。

「これではいかん」という気持ちと、固定IPを維持するためのプロバイダ費用と自宅サーバに使う電気代をレンタルサーバに使えばいいんでしょと思い、すぐにWebARENAのレンタルサーバーSuiteXを契約して移行しました。

####契約してよかった点
+ 電気代もUPSもプロバイダ契約も、たまに調子が悪くなってメンテナンスする手間も省けて楽
+ ユーザの追加や管理がブラウザで出来るので、いちいち本体の前に立つなりリモート接続なりしなくて済む←結構重要

####契約して「ん？」と思った点
+ SSL証明書を購入して反映させようとしたけど、メールサーバには使えなかった。というかメール送受信用に無料SSLを用意してあった
+ しかし暗号化接続をする場合には独自ドメインは使用できず、所属サーバ名（*.etius.jp）でのみ接続可であった

####契約して「これはアカン」と思った点
+ macOS Serverを使い続けていた最大の理由である、iOS標準のメールアプリで常時プッシュ通知がされなくなってかなり不便
+ 充電中＆Wi-Fi接続中であれば疑似プッシュ通知状態になるけど、四六時中充電してるわけでもないし外出時はほぼその状態にならないし

###ということで
iOS標準のメールアプリで常時プッシュ通知の恩恵にあずかるために、Z-push環境を導入しようということになりました。

https://z-push.org

ただこれ、ファイルをWebサーバのどこかに設置して設定ファイルをいじればOKというものではないようで、WebARENAのSuiteXでは動かせず別途VPSの契約が必要になってしまうんですよね。

ということで、次回はVPS契約〜設置編になると思います。いつになるかわかりませんが。
Xcode13から追加されたXCTestの連続実行を試す。

## テストを実行すると、成功したり、失敗したりする場合が・・・
こんなことがたまにあるかと思います。  
手動で10回くらいテスト実行して問題ないか確認するかと思いますが、今回のアップデートによって楽にできるようになりました！

## 成功したり、失敗したりするサンプルテストコードを作成
- Sample.swift

```swift
import Foundation

class Sample {

    func random() -> Int {
        let array = [1, 2, 3, 4, 5]
        return array.randomElement()!
    }
}
```

- SampleTest.swift

```swift
class SampleAppTests: XCTestCase {

    func testExample() throws {
        let sample = Sample()
        XCTAssertEqual(sample.random(), 1)
    }

}

```
## 試してみる
- 繰り返したいクラスorメソッドを副クリックし`Run "クラスorメソッド"　Repeatedly...`をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470777/3181eb0b-c827-78f2-9492-fe41c7e8d09a.png)

- リピートの設定をする
    - Stop After...テストを停止するタイミング
        - Failure...失敗時
        - Success...成功時
        - Maximum Repetitions...とりあえず全部実行
        
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470777/b2bf28ca-c6cb-7d69-83ea-09752c05a714.png)

## 実行結果
- 100回分の実行結果がまとめて表示される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470777/9373d537-a93b-b220-cb3e-66051624726e.png)


## まとめ
これは良いアップデートだ。
Haskellのリストでいろいろやってみた

# リストの要素数を調べる

* 正直、　用意されているプレリュード関数lengthを使用してしまえば、終わりの話だが、それだとつまらないので、プレリュード関数lengthを自作してみるとこんな感じになります。

```length.hs
main :: IO ()
main = print (length [0..9])
```

* ここで注目したいのが、myLength :: [a] -> Intです。
* プレリュード関数lengthもそうなのですが、意味的には任意の型aに対して、関数myLengthが型[a] -> Intを持つことになります。
* つまり、１つ以上の型変数を含む型ということになります。(=> 多相型)

```myLength.hs
main :: IO ()
main = print (myLength [1, 2, 3])

myLength :: [a] -> Int
myLength [] = 0
myLength (_:xs) = 1 + myLength xs
```

# リストの要素数を加算する

* ここで面白いのは、関数呼び出し時に、引数にパターンマッチングを行なうことです。
* 空集合[] の時とそれ以外。それ以外の場合は、引数を先頭要素とそれ以降に分けている。
* 引数に、(x:xs)と書くと、[1,2,3]というリストが渡って来た場合、x には、先頭の要素 1 が、xsには、残りの[2,3]が渡ります。
* その為、再帰処理が可能になるのです。

```mySum.hs
main :: IO ()
main = print (mySum [1, 2, 3])

mySum :: Num a => [a] -> a
mySum [] = 0
mySum (x:xs) = x + mySum xs
```

* また、面白いのが、最後の演算でこの場合、最後は空の集合なので下記のようになります。

```
1 + [2,3]
-> 1 + [2,3]
-> 1 + 2 + [3]
-> 1 + 2 + 3 []
-> 6
```

# リストの最初の要素を調べる

* 関数myHeadの型が、[a] -> Maybe a とここではしています。
* このMaybeなのですが、「1個までしか値が持てないリスト」に相当するモナドです。

| モナド  |  0個  | 1個 |
| ---- | ---- | ---- |
|  リスト  |  [] | [x] |
|  Maybe  |  Nothing  |  Just x  |


```myHead.hs
main :: IO ()
main = print (myHead [3, 2, 1])

myHead :: [a] -> Maybe a
myHead [] = Nothing
myHead (x:xs) = Just x
```

# リストの最後の要素を調べる

```myLast.hs
main :: IO ()
main = print (myLast ["w", "aaaa", "bbbb"])

myLast :: [a] -> Maybe a
myLast [] = Nothing
myLast (x:[]) = Just x
myLast (_:xs) = myLast xs 
```

# 参考文献
https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0Haskell-%E7%AC%AC2%E7%89%88-Grahum-Hutton/dp/4908686076
【備忘】S3にアクセスするユーザーを作成する

# 概要
S3にアクセスするだけのユーザーを作成する方法です。
主に備忘目的で残しています。

# 1. ポリシーの作成

`IAM -> ポリシー -> ポリシーの作成`

IAMユーザーに付与するポリシーを作成します。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:ListAllMyBuckets",
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::YOUR-BUCKET-NAME",
                "arn:aws:s3:::YOUR-BUCKET-NAME/*"
            ]
        }
    ]
}
```

※YOUR-BUCKET-NAME
適宜置き換えてください。

※s3:ListAllMyBuckets 
CloudBerryでバケットを一覧表示するために権限を与えます。

# 2. ユーザーを追加
## 2-1
`IAM -> ユーザー -> ユーザーを追加`

バケットにアクセスするためのユーザーを作成します。
「プログラムによるアクセス」のみチェックを付けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/503672/9ae17870-b735-ee50-518c-641b973a9e47.png)
## 2-2
アクセス許可のステップで「既存のポリシーをアタッチ」を選択し、
先ほど作成したポリシーを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/503672/0008a682-3390-a57e-ae10-963d2e2d646a.png)
## 2-3
CSVをダウンロードして保管しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/503672/b63b4420-3926-0c22-2253-9077c7c8e07b.png)

# CloudBerry からアクセス
アクセスキーIDとシークレットアクセスキーを使ってアクセスします。
バケットの一覧が表示されますが、許可したバケット以外は開くことができません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/503672/e8be05e1-d15f-2fc9-2a72-2023a414f2da.png)
ImageJでOlympusViewerを用いてVSIファイルをTiffにする奴

#背景
僕の研究室ではオリンパスの蛍光顕微鏡を使ってオリンパスのソフトで撮影して出力している。撮影したときのファイルが__VSIファイル__で、本来ImageJ等では扱えないファイル。
でも、それを可能にしてくれているのがFijiにも付属している__OlympusViewer__というプラグインである。

上記のオリンパスのソフトでTiff出力をしたい所だが、なんか上手くいかないのでVSIファイルをImageJ(Fiji)上でTiffに変換して保存する方がその後の使い勝手が良いだろう、と言うことでちょっと開発した。

#コード
このコードはFijiのエディタで動かせるのでFijiでRunをクリックして使ってほしい。


```python:SaveAsTiff_fromVSI
from ij import IJ

#Run Olympus viewer 
IJ.run("Options", " ")
IJ.run("Viewer", "open=")
imp = IJ.getImage()

#Save as tiff
if IJ.saveAs(imp, "Tiff", ""):
    imp.close()
else:
    imp.close()
```

内容がメチャクチャ簡単だけど一応解説。

```python
from ij import IJ
```
なんか必要な奴。モジュールのインポートに必要。

```python
#Run Olympus Viewer
IJ.run("Options", " ")　#OlympusViewerの設定画面を起動、チェックを二つとも外す
IJ.run("Viewer", "open=")　#Viewerを起動
imp = IJ.getImage() #開いた画像をimpという変数に収納
```
2行目の"open="の＝の先に絶対パスを置けば画像を指定で開けるし、何も書かなければ選択画面が表示される。

```python
#Save as tiff
if IJ.saveAs(imp, "Tiff", ""):
    imp.close()
else:
    imp.close()
```
すごく怪しい部分。
画像を開いた後立て続けに保存画面が出てくるが、名前をつけて保存を押せば勝手にTiffファイルで保存され、開いた画像は閉じられる。
一方、保存ボタンが押されなければそのままだとエラーを吐いてプログラムが止まるので、保存しなかったときにもプログラムが正常終了するようにした。メジャーな書き方では無いと思う。
ちなみにそもそも画像を開かなかったときはエラーを吐いて止まる。

#やりたかったけど出来なかったこと
○勝手に保存するシステム
保存画面で名前をつける行程すら省きたかったが、そもそもそんな必要が無い(手作業で名前つける方が色々効率的)なのと、そんな技術が無かった。
開いた画像のpathを取得する方法がわからない、それが出来ると次のアプリ開発も上手くいくんだけどナァ…
元居酒屋の店長がITILについて理解する(初心者向け)

##１．はじめに
　現在の業務に携わるにあたり、ITILの知識を求められましたが、私自身5、6年前にITILファンデーションV3の勉強をして合格した以来、ほとんど触れていませんでした。
  
その当時、私は居酒屋の店長からIT業界に飛び込んで間もない時期で、未経験の私からすると用語や意味を理解するのに必死でした。

今回改めて学び直してみると、サービスマネジメントの手法のため、IT業だけではなくサービス業を含むあらゆる業務に適用でき、当時の私にも教えてあげたかったと思う内容も多かったです。 
 
そこで今回は「へぇ～！」「なるほど！」と思った内容についてまとめていきたいと思います。  

------
##２．ITILとは
まず、そもそもITILとは何なのか、記述していきます。  
  
ITIL（Information Technology Infrastructure Library）とは、ITサービスマネジメントにおけるベストプラクティス（成功事例） をまとめた書籍群[（ウィキペディア参照）](https://ja.wikipedia.org/wiki/Information_Technology_Infrastructure_Library)です。
  
ざっくりまとめると、IT（情報技術）をビジネスに活かすための世界中のノウハウをまとめたものです。
どのような観点で、具体的にはどのようなことをすればいいのか、世界中の成功事例をもとに共通の事柄を抽出し、まとめたものです。
  
------
##３．ITIL導入の利点
はじめに、「ITILはIT業だけではなく、サービス業を含むあらゆる業務に適用できる」と記述しましたが、「顧客目線」「ビジネス的な観点」から、以下のような利点があります。
  
　〇顧客満足度の向上とリピート客の増加
　〇売上向上と利益拡大
　〇組織力の強化
　〇マネージャの育成
  
------
##４．当時の私が「なるほど」と思いそうなこと
  
####①サービスの本来の意味
　一般的に、「お得なことをしてあげること」がサービスと捉えられがちですが、受け手（顧客）が"お得"と思わなければそれはサービスではありません。
　受け手（顧客）にとって「本当に価値があること」を提供するのがサービスと言えます。
####②サービスの明瞭な説明が鍵
　様々なサービスを提供していても、それらを受け手（顧客）に理解してもらわなければ良いサービスとは言えません。
　そこでサービス・カタログを作成し、提供している内容について理解してもらうことが鍵となります。
####③今後の戦略を事前に内部で共有する  
　今後どのようなサービスを提供していくかといった戦略を内部で共有するため、サービス・ポートフォリオを使用します。関係者が理解し、適切な準備を進めるために用いられます。
####④ITIL特有の読みにくい日本語はわざと？
　翻訳者の経験をもとに訳すと、微妙なニュアンスの違いが生まれる可能性があるため、「あえて直訳する」ルールが設定されているそうです。
　例えば、『インシデント』という言葉一つとっても、運用の経験がある方と開発の経験がある方では、微妙にニュアンスが違ってくると思います。

------
##５．ITIL3⇒ITIL4へ
私が学習した当時はITIL3でしたが、IT技術の進化に伴い、新たな成功事例も世界中で生まれてきたことにより、ITILもバージョンアップしていたようです。
  
詳細については書ききれないのでまたの機会にでもまとめたいと思いますが、今回はITIL3から追加された成功事例を記述しておきます。
  
####①リーン（Lean）
　「贅肉の取れた」「無駄のない」という意味の英単語。
　顧客に価値を提供するために、過程のムダを徹底的に減らし、継続的に組織を改善し続けるための手法。
####②アジャイル（Agile）
　「俊敏な」「素早い」という意味の英単語。
　アジャイルソフトウェア開発とは、迅速かつ適応的にソフトウェア開発を行う開発手法の総称。  
####③DevOps
　「Development(開発)」と「Operations(運用)」を結合した造語。
　ITの開発チームと運用チームが協働し、顧客に価値を迅速に届けることを目指す考え方と手法を指す。  
  
------
##６．最後に
今回は、ほんの一部ですがITILについてまとめてみました。
今でも分からない用語は調べて自分なりに解釈できるようにしていますが、当時未経験だったに私にとっては、用語の意味を理解するのに苦労しました。
  
今回参考にした書籍は、初心者の方向けに嚙み砕いて説明されており、ITILの勉強のはじめの一歩として読みやすいと思います。
  
ITILを学ぶと、実業務を俯瞰的に見たときに業務全体が見渡せるようになると思います。
ITILは比較的取得しやすい資格だと思いますので、ぜひおススメします。
  
------
##７．参考文献
・『ITIL はじめの一歩 スッキリわかるITILの基本と業務改善のしくみ』
　　　　　　　　　　　　　　　　　　　　　　　　　著　最上 千佳子
・[『Wikipedia』](https://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8)
【rails6】Action Cableのチャットにユーザーのアイコン画像も送信したい

こんにちは！

今日は「**Action Cableを用いて作成したメッセージ機能の不具合解消**」のご報告となります。
最後までお付き合いくださいませ

「Action Cableを用いたメッセージ機能を実装したい！！」という方は予め下記をご参考に実装くださいませ

### 参考文献（メッセージ機能の実装について）
https://qiita.com/Takahiro_Ito/items/f27cc9e991fdb9347eee
https://techtechmedia.com/action-cable-rails6/
https://qiita.com/take18k_tech/items/00cc14c0eff45073ffc7


## 解消したかった事
メッセージ送信時に**ユーザーのアイコン画像が送付できなかった**

## 環境
- Ruby on Rails 6.0
- AWS/EC2
- Nginx
- MariaDB
- unicorn
- エディタはVS Codeを使用しています
- jQuery導入
- 既にAction Cableで非同期通信に成功していること




まずは今日の完成形を見てみましょう

## やりたい事
![631e697cbcb1ddf261d073e4298808be](https://user-images.githubusercontent.com/80019801/121147856-37a51e00-c87c-11eb-9d1b-1a1a1b7023ae.gif)
この通り、非同期でメッセージを送信していますが、
メッセージだけでなく「**ユーザーのアイコン画像**」も表示できていることがわかります。

これを実装しましょう！！

## javascript/channels/room_channel.js を編集する

```javascript/channels/room_channel.js
received(data) {

  // アイコン情報を取得します
  const $userIcon = document.getElementById('js-user-icon');
  const $defaultIcon = document.getElementById('js-default-icon');

  // 条件分岐でアイコン情報を返却します
  function icon(){
    if( $userIcon === null ){
      return $defaultIcon
    } else {
      return $userIcon
    };
  }

// 〜 中略　〜 

  const html =
    `<div class="incoming-msg">
       <div class="img-box">
         <div class="avatar-img">
           // ↓ここに画像配置の記述をしていきます
           <img src= "${icon()["src"]}" width="50" height="50" class="img-circle">
         </div>
       </div>
       <div class="partner-info">
         <div class="partner-name">
           ${data.user_image.record.nickname}
         </div>
         <div class="received-msg">
           <div class="received_withd_msg">
             ${data.message.message}
           </div>
           <div class="created-time">
             今
           </div>
         </div>
       </div>
     </div>`;
}
// 見づらくて申し訳ないですが、上記記述は全てreceived(data)の中に記述しているものです
```

では、肝心な画像の部分を抜粋して見てみましょう

```
<img src= "${icon()["src"]}" width="50" height="50" class="img-circle">
```
- icon() => 先ほどの条件分岐を呼び出しています
- ["src"] => 下記をご確認ください

![スクリーンショット 2021-06-08 17.31.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1422262/3c584395-23f3-51e9-ae2e-95b789007812.png)

画像はIcon情報内の「 src 」に含まれていますので、icon()["src"]と記述しましょう

## viewにid情報を付与して完成です
処理の記述は上記で完了です、viewファイルにidを付与してあげましょう

```show.html.erb
<div class="img-box"> 
  <div class="avatar-img">
    <%= link_to user_path(m.user.id) do %>
      <% if m.user.avatar.attached? %>
        ↓ 以下が画像の欄です idを付与しましょう　↓
        <%= image_tag(rails_blob_path(m.user.avatar), size: "50x50", class: "img-circle", id:"js-user-icon") %>
      <% else %>
        <%= image_tag("default_user.png", size: "50x50", class: "img-circle", id:"js-default-icon") %>
      <% end %>
    <% end %>
  </div>
</div>
```

これで完成です！
今日もご覧いただきありがとうございました！

もし、もっと簡単に書ける方法や処理を軽くする方法などございましたら是非コメント頂けますと幸いです
制御構造 - 条件分岐 case..when

## case..when文について
コーディングテスト対策をする上で、多くの場合if文による冗長なアルゴリズムが作成されていた為、その対応策の一つとして、`case..when`構文に関して、再度学習した。その内容をここに記録する。
結論として、if文と役割はそこまで変わらないが、自分なりの利点にあげる。

1. 可読性が上がる
2. 変数を扱う場合はスタイリッシュになる。

ここから下は公文の説明になります。コードについては、コーディングテストの内容をそのままにしてあります。

### 制御構造 - 条件分岐 case..when文

if文の場合

```ruby
if score >= 80
    array << "A\n"
elsif score >= 70 && score < 80
    array << "B\n"
elsif score >= 60 && score < 70
    array << "C\n"
elsif score < 60
    array << "D\n"
end
```

case..when文の場合

```ruby
case score
when 80..100
    array << "A\n"
when 70..79
    array << "B\n"
when 60..69
    array << "C\n"
when 0..59
    array << "D\n"
end
```

最後のcase分では、同一の変数を扱っている利点を活かし、条件式において変数を省略できるという利点を持つ。この点がif文と比較し、優位にあると考えています。
AndroidStudioのファイル構成

勉強していて、AndroidStudioのフォルダやファイルが何を意味するのかを理解する為にまとめていきます。


##androidビューのファイル構成

主に使用するファイルは**manifesuts**,**java**,**res**の3フォルダに分かれます。

**`manifesuts`**
このフォルダには、**AndroidManifest.xml**ファイルが格納されています。**AndroidManifest.xml**は、このアプリの実行に必要な設定が記述されています。

**``java``**
このフォルダの中には、.javaファイルと.ktファイルを格納する。なお、パッケージ右側に「（androidTest）」や、「（Test）」と記述されているのは、Androidアプリをテストするための。javaファイル、.ktファイルの格納先です。


**``res``**
Androidでは、画面構成をXMLファイルに記述する。そういった.xmlファイルや、アプリで使われる画像ファイルなどを格納するのが、resフォルダである。ちなみにresはresorceの略です。

####resフォルダ内のサブフォルダ構成

| サブフォルダ名 |内容| 
|:-----------|:------------|
|drawable|画像を格納|
|layout|画面構成に関わる.xmlファイルを格納|
|mipmap|アプリのアイコンを格納|
|values|アプリで表示する固定文字列(string.xml)、画面のスタイル（styles.xml）、色構成(colors.xml)を表す.xmlファイルを格納|


####補足　
**``Gradel Scriptsノード``**
Android StudioではビルドシステムとしてGladleを使用していますが、そのビルドスクリプトは目的ごとにファイルが分かれ、配置ディレクトリも分散されています。それをまとめて表示してくれるのが、このGladel Scriptノードです。

##実際に編集する主なファイル

通常のアプリ開発でよく編集するファイルは以下の3つ
``[1]res/layoutフォルダ中のレイアウトXMLファイル``
``[2]javaフォルダ中の.ktファイル``
``[3]res/valuesフォルダ中のstrings.xmlファイル``

画面構成を.xmlファイルに、処理をKotlinクラスに記述する為、.xmlファイルとKotlinクラスのペアで1つの画面が作られる。
画面構成用の.xmlファイルを``レイアウトファイル``と呼び、
Kotlinクラスのことを``アクティビティ``を呼ぶ。
つまり、**[1],[2]**はこのペアを表している。
それ故に、プロジェクトを進めていく上で、**[1][2]のファイル名を関連した名前を設定する**と効率が上がる。

[3]は、アプリ中で使われる画面に表示させる文字列は、[1]のファイルや,[2]のソース中に直接入力するのではなく、[3]の**strings.xml**に記述する。

##アプリ開発の手順
1,プロジェクトを作成する。
2,strings.xmlに表示文字列を記述する。
3,レイアウトxmlファイルに画面構成を記述する。
4,アクティビティなどの.ktファイルに処理を記述する。
5,アプリを起動して動作確認をする。
[SQL] MySQLでSQLを学ぶ~DDL編①~

## はじめに
前回に引き続きデータベース関連です。
ここからはMySQLを使ってSQLを学んでいきたいと思います。よろしくお願いします。

なお、これはあくまでSQLを学びアウトプットをすることを目的としており、私がMySQLを使ってきたのでMySQLで作業を行なっていきます。PCへMySQLを導入する方法や、設定方法は記載しておりません。

Railsを使っているとデータベース作成する時はコマンドで**rails db:create**を実行し作成します。シークエルプロというアプリを使いGUI操作をすることもありました。
しかしながら、GUIではできない操作やコマンドが用意されていない操作を行う場合はSQLを使う必要があります。


## ターミナルでMySQLを扱う

ターミナルでMySQLを使うにはログインする必要があります。
まずはホームディレクトリに自分がいることを確認し下記のコマンドを実行します。

```:ターミナル
# ホームディレクトリに戻る
% cd

# MySQLに接続
% mysql -u root
```

**-u root**というコマンドはオプションで「ルート」でログインするという意味になります。
このルートはMySQLで元々用意されているユーザーのことです。このユーザにはパスワードはありません。

```SQL:ターミナル
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 744
Server version: 5.6.51 Homebrew

Copyright (c) 2000, 2021, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 
```

これで準備完了です。

## DDL(Data Definition Language)

前回SQLは大きく分けて三つの命令に分類できると説明しました。
その中で今回はデータを定義するDDLを詳しく見ていきます。

**DDLの主な命令文**

| 命令 | 機能 |
| ---- | ---- |
| CREATE | データベースやテーブルの作成 |
| ALTER | データベースやテーブルの更新 |
| DROP | データベースやテーブルの削除 |

## CREATE文
まずはデータベースやテーブルを作成できるSQL文**CREATE**文です。
いつもRailsでは、　rails db:createというコマンドでデータベースを作成していましたが、SQLを使ってデータベースを作成してみます。

データベースを作るには**CREATE DATABASE**文を実行します。
実際実行する時はデータベース名も必要です。

```sql:ターミナル
mysql> CREATE DATABASE 《データベース名》;
```

実はSQL文は小文字でも動いてくれるそうなのですが、SQL文と他の文字列が混ざると読みづらくなるので、一般的には大文字で記述するそうです。
あと、文の最後には必ずセミコロンをつける必要があります。

今回は「sqltest」という名前でデータベースを実際に作ってみます。

```sql:ターミナル
mysql> CREATE DATABASE sqltest;
Query OK, 1 row affected (0.02 sec)
```
1行目を実行して、2行目が表示されたら成功です。データベースの作成ができました。
ちゃんとできているかデータベースの存在を確認するために**SHOW文**を使います。

## SHOW文
SHOW文はデータベースやテーブルを一覧表示できるSQL文です。
作成されているデータベースを一覧で表示させるには**SHOW DATABASES**文を実行します。
*個人的には、DATABASESって複数形だ、気をつけよって思いました*

```sql:ターミナル
mysql> SHOW DATABASES;
```
を実行すると

```sql:ターミナル
mysql> SHOW DATABASES;
+------------------------+
| Database               |
+------------------------+
| 省略                    |
| sqltest                |
| 省略                    |
+------------------------+
65 rows in set (0.10 sec)
```

今まで作成してきたデータベースも含めたくさん出てきたかと思います。

## DROP文
**DROP文**は、データベースやテーブルを削除できるSQL文です。
既に存在しているデータベースを削除するには**DROP DATABASE**文を実行します。
削除したいデータベース名も必要です。

先ほど作成したsqltestを削除します。

```sql:ターミナル
mysql> DROP DATABASE sqltest;
Query OK, 0 rows affected (0.03 sec)
```

上記のように表示されれば成功です。SHOW文でちゃんと消されているか確認してもいいでしょう。

とりあえず今回はここまでとします。

## 最後に
今回はデータベースの作成と表示、削除の簡単な操作を行いました。
次回はここからデータベースの中にテーブルを作成し、カラムを作成したりといった作業をSQLでできるように学習します。
外部のHTML,CSS,JavaScriptをRailsで表示させる（Turbolinksが原因っぽい）

自作のWebアプリケーションを作成するときに、あらかじめHTMLテンプレートでテンプレートを作成した後に、それをRailsのアプリケーションに反映させよう、と言う考えのもと、作成しました。

## 結論めっちゃ失敗した
簡単に失敗したところ記載します。
### 単純にassets/stylesheet/に配置
CSSは読み込んでくれました。
ただ中身に注意。
特にimage-urlなどrubyのcssと通常のcssで記法が異なる点があります。
ここまではまだ良かったです。
### ネックはJavaScript
もうこれは思い出したくないくらいエラーが出ました。
その度に解決方法を模索して、結果として下記を実行したら、解消されました。

①jQueryの導入
これは割と初期でやりました。

②複数のjsファイルを全部application.jsに転記
これは全然ダメでした。

③application.jsの初期で記述されているrequireをコメントアウトして、importで追加のjsファイルを読み込む
これが効果抜群でほぼ解決しました。

## 追記：Turbolinksが悪さをしていたっぽい
特にエラーが出ていた時はjQueryが読み込まれていないことが原因でした。
Uncaught TypeError: __webpack_require__(...) is not a functionが出ていました。
該当の行を確認すると、確かにjQueryが読み込まれていないことが原因。

で、調べてみるとTurbolinksが悪さをしている可能性が。
[【Rails】初心者向け！画面遷移の高速化を行うTurbolinksについて図を用いて詳しく解説](https://techtechmedia.com/turbolinks-rails/)

Turbolinksは簡単に言うとページの表示を高速化させるためのライブラリです。
いわゆる非同期処理というものです。

しかし一方で、readyやwidowのイベントが発火しない、といったトラブルが発生しているようです。

今回はこれがほぼ可能性が高い。

なぜならapplication.jsに

```ruby
window.jQuery = window.$ = require("./jquery.min")
```

というwindowのイベントを定義していたにもかかわらず、イベントが発火していなかったから。

特にRails4以降は標準で入っているライブラリなので、jsが読み込まない、ということであれば、デフォルトで入っているライブラリを一つずつコメントアウトしてみると良いかもしれません。
（もちろんページの表示速度は遅くなるだろうが。）

## 言ってもまだ全部解決してない
まだ解決してないし、なぜ初期で記述されているrequireがダメだったのかは考察が必要ですが、一旦、やりたいことできたので、ほんとにホッとしてます。
PHP71にZipArchiveをインストール

### PHPでUncaught Error発生
Zip関連処理で以下のエラーが発生した

```
Uncaught Error: Class 'ZipArchive' not found
```
PHPのZipArchiveクラスがインストールされていなかった、、、
peclにあるので、インストールする

```shell
[prompt] # yum -y install --enablerepo=remi-php71 php-pecl-zip
[prompt] # systemctl restart php-fpm
```

無事インストール出来た。
【At Corder】【初心者】ABC085C - Otoshidama をRuby で解いてみた


#はじめに
[AtCoder に登録したら次にやること ～ これだけ解けば十分闘える！過去問精選 10 問 ～ - Qiita](https://qiita.com/drken/items/fd4e5e3630d0f5859067)

こちらの記事を参考に初心者がAt corderに挑戦します。
目的としては、就職活動でのコーディングテスト対策です。
毎日１問を目標としてコツコツやってきます:thinking:

わからないことは調べる精神です。ちょっとでもわからないなぁ、と思ったことは調べて解説と参考文献を載せますので、同じ内容でわからない人がいれば参考にししてください:baby:

https://atcoder.jp/home

# 問題文

日本の紙幣(10000,5000,1000円)をN枚使ってY円になるか？

## 成約

- $1 ≤ N ≤ 2000$
- $1000 ≤ Y ≤ 2 \times 10^7$
- $N$は整数である
- $Y$は1000の倍数である

## 入力

```ruby
N Y
```

## 出力

$N$枚のお札の合計金額が$Y$円になることがありえない場合は `-1 -1 -1` と出力

あり得る場合は組み合わせの一例をxを10000円、yを5000円、zを1000円とするとx, y, zを空白で区切って出力せよ。複数の可能性が考えられるときはそのうちどれを出力してもよい。

### 入力例

```ruby
9 45000
```

### 出力例

```ruby
4 0 5
```


# 回答

```ruby
N, Y = gets.split.map(&:to_i)

for x in (0 .. N)
  for y in (0 .. N) 
    
    z = N - (x + y)
    break if z < 0 
    
    sum = 10000*x + 5000*y + 1000*z     
    if sum == Y 
	printf("%d %d %d", x, y, z)
	exit
    end
       
  end          	
end

puts("-1 -1 -1")
```


# 感想

今回はそこまで苦戦せず解くことができました🥳

最初は勘違いでzを0~Nの値まで処理するようにしていました。😱

勘違いミスが多い傾向。。

# 参考文献

[【Ruby】exitでプログラムを終了させる【exit!やreturnとの違い】 | 「ポテパンスタイル」](https://style.potepan.com/articles/27806.html)
もし日本が本気出してPCR検査を日本人全員に検査させたらどうなるのか

かなり前に限定投稿してたのをアップし直しました。

最近、町のあらゆるところで売られ始めたPCR検査キットですが、これらを使って日本人全員がPCR検査をしたらどうなると思いますか。
コロナ陽性者を全員隔離して、コロナ沈静化を早められる？

はっきり言いましょう。そんなことは無理です。



## PCR検査に潜む問題

まず大前提としてPCR検査とは万能ではありません。
本当は陰性（新型コロナに感染していない）なのに、陽性と判定されてしまうケースや、逆に本当は陽性（新型コロナに感染している）なのに、陰性と判定されてしまうケースがあります。

その誤判定のことを一般に、

**偽陽性**：本当は陰性なのに、陽性と判定されること
**偽陰性**：本当は陽性なのに、陰性と判定されること

といいます。

また、新型コロナに対して偽陽性、偽陰性の割合を下記のとおりとします。
（様々な情報が飛び交っており、検査の条件にも左右されるので一概には断言できないのですが、この記事では下記のとおりとします。一応ネットで調べた値です。）

**偽陽性の割合**：$1$%
**偽陰性の割合**：$20$%


このPCR検査の誤判定の割合が高いために、日本人全員がPCR検査を受けると**「ある問題」**が起こります。
もっとわかりやすくいいますと、絶対にコロナに感染していない人にもPCR検査を実施させた場合**「ある問題」**が起こります。

## 日本人全員がPCR検査を受けた場合
「ある問題」が何なのかを伝えるために簡単な計算をします。

### 前提条件
新型コロナに感染していない人：$120,000,000$人（約日本の人口）
新型コロナに感染している人：$10,000$人
偽陽性の割合：$1$%
偽陰性の割合：$20$%

### 計算
上記条件下においてPCR検査を全員が受けたとしましょう。

新型コロナに感染している人は100,00人という想定です。
このとき気になるのは偽陰性です。

偽陰性の割合は20%という想定なので、
新型コロナに感染している人のうち、陽性と正しく判定される人：$10,000\times0.8=8000$人・・・①
新型コロナに感染している人のうち、陰性と誤って判定される人：$10,000\times0.2=2000$人・・・②
<br>
また、新型コロナに感染していない人は120,000,000人という想定です。
このとき気になるのは偽陽性です。

偽陽性の割合は1%という想定なので、
新型コロナに感染していない人のうち、誤って陽性と判定される人：$120,000,000\times0.01=1,200,000$人・・・③
新型コロナに感染していない人のうち、正しく陰性と判定される人：$120,000,000\times0.99=118,800,000$人・・・④

となります。まとめると
陽性と判定される人：①+③=$8,000+1,200,000=1,208,000$人・・・⑤
陰性と判定される人：②+④=$2000+118,800,000=118,802,000$人・・・⑥

### 結果
計算結果より日本人全員がPCR検査を受けたときに、陽性と判定される人は$1,208,000$人です。
そのうち本当の新型コロナ感染者は$8,000$人です。

割合に表すと陽性と判定された人のうち、本当に新型コロナに感染している人は$約0.66$%となります。

PCR検査で陽性と判定された人のうち、ほとんどの人がコロナに感染していないとなれば、**本当に新型コロナに感染している人に治療が行き届かない恐れ** や、そもそも約120万人もの人を隔離するためのスペースを準備できません。
これが私が伝えたかった**「ある問題」**の正体です。


## 新型コロナに感染している可能性が高い人に絞ってPCR検査を受けた場合

先ほどの結果からPCR検査を日本人全員が受けて、陽性と判定された人を全員隔離することは無謀であるとわかってもらえたと思います。
次はPCR検査を受ける人をできるだけ絞った場合（20万人くらいまで絞った場合）はどうなるかを考察していきます。

### 前提条件
検査を受ける人の中で新型コロナに感染していない人：$200,000$人
検査を受ける人の中で新型コロナに感染している人：$10,000$人
偽陽性の割合：$1$%
偽陰性の割合：$20$%

### 計算
先ほどと同じ計算過程なので結果だけ

新型コロナに感染している人のうち、陽性と正しく判定される人：$10,000\times0.8=8000$人・・・①
新型コロナに感染している人のうち、陰性と誤って判定される人：$10,000\times0.2=2000$人・・・②

新型コロナに感染していない人のうち、陽性と誤って判定される人：$200,000\times0.01=2000$人・・・⑦
新型コロナに感染していない人のうち、陰性と正しく判定される人：$200,000\times0.99=198,000$人・・・⑧

まとめると
陽性と判定される人：①+⑦=$8,000+2,000=10,000$人・・・⑨
陰性と判定される人：②+⑧=$2,000+198,000=200,000$人・・・⑩

### 結果
計算結果より検査を受ける人を20万人くらいまで絞った場合、陽性と判定される人は$10,000$人です。
そのうち本当の新型コロナ感染者は$8,000$人です。

割合に表すと陽性と判定された人のうち、本当に新型コロナに感染している人は$80$%となります。

20万人にPCR検査を受けさせて、陽性と判定された人のうち、本当に新型コロナに感染している人が80%もいるのだとしたら、陽性と判定された人を隔離するのも少しは現実味があるかもしれませんね。


## 結論
PCR検査を日本人全員が受けた場合、約120万人の人が陽性と判定され、その中で本当に新型コロナに感染している人の割合は約0.66%である。

PCR検査を受ける人を20万人まで絞った場合、約1万人の人が陽性と判定され、その中で本当に新型コロナに感染している人の割合は80%である。

仮に日本人全員を検査して、陽性と判定された120万人もの人を、治療や経過観察していたとしたら、本当に新型コロナに感染している人への対応が間に合わない恐れがあり、明らかにPCR検査を受ける人を絞ったほうが良いことがわかります。

## 終わり
これはあくまで計算上の話なのですが、PCR検査はあくまで目安という意識をもって、仮にPCR検査が陰性であったとしても、むやみやたらに町へ出かけるのは控え、新型コロナが落ち着くまでは人と接触しないように気を付けましょう。
また、遊びでPCR検査キットを使うのも止めましょう。

以上！
バッチ設計・バッチ処理

#【バッチ設計・バッチ処理】

過去にバッチ処理の実務を経験しました。
再度振り返り、学習しました。

野村友規様 ありがとうございます。

参考：[実践Terraform AWSにおけるシステム設計とベストプラクティス 電子書籍版 / 野村友規](https://store.shopping.yahoo.co.jp/ebookjapan/B00162237855.html)

##バッチ設計

バッチ処理は、オンライン処理とは異なる関心事を有している。

>オンライン処理とは、コンピュータシステムの処理方式の一種で、
端末が通信回線などを通じてコンピュータ本体に接続し、
処理要求が発生した時点で即座に送信する方式。

[IT用語辞典 e-Words](https://e-words.jp/w/%E3%82%AA%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%B3%E5%87%A6%E7%90%86.html) より引用

アプリケーションレベルでどこまで制御して、ジョブ管理システムでどこまでサポートするかしっかり設計する必要がある。

##バッチ設計の基本原則

###ジョブ管理

一定の周期で実行されますが、誰かがジョプの起動タイミングを制御しなければならない。
　→ これが**ジョブ管理**になる。この仕組みがが悪いと、最悪の時はジョブが全停止する。

####cron

>ジョブの管理実装で最も簡単な[cron](https://qiita.com/uejima_haruki/items/d875a921361f2d8a9bfe)になる。
しかし、手軽な反面、きちんと管理することが難しい。
影響範囲の不明な謎のcronが発掘されるなど日常茶飯事です。 
また、cronで管理されるバッチは大抵、エラーハンドリングやリトライも適当です。
依存関係制御もできず、cronを動かすサーバの運用にも手間がかる。

cronを用いた開発をしていた。
上記で書かれていたことを思い返してみるとそうだった気がしてくる。
エラーハンドリングやリトライについては、考えて開発されていなかったかも。
これらの重要かつ基本的な処理についてを抑えていこう。

####ジョブ管理システム

>システムが成長するとcronはすぐに限界がくる。
そこで多くの場合、「ジョブ管理システム」を導入します。 
エラー通知やリトライ、依存関係制御の仕組みが組み込まれており、複雑なジョブの管理ができる。
ただし、ジョブ管理システムを稼働させるサーバーの運用は、課題として残ります。

cronとは、対照的こちらは経験したことがないので、改めて学習していく。

###エラーハンドリング

>エラーハンドリングでは「エラー通知」が重要。
なんらかの理由でバッチが失敗した場合、それを検知してリカバリーする必要がある。
スタックトレースなどの情報は、原因調査で必要になるため、確実にログ出力する。

Javaでの開発においては、[例外処理](https://qiita.com/uejima_haruki/items/d12fab75034a2e63a593)で実装をした。
ログからエラーを追跡する処理の理解は今後の課題になる。
経験したことないので自作アプリの中で実装目指してみよう。

###リトライ

**リトライできるアプリケーションを設計**することが超重要。

>リトライバッチ処理が失敗した場合、リトライできなければなりません。
自動で指定回数リトライできることが望ましいです。少なくとも、手動ではリトライできる必要があります。

手動リトライは実装できていたと思う。
自動化で人的ミスを無くせるように今後意識していく。

###依存関係制御

>ジョブが増えてくると、依存関係制御が必要になる。
**「ジョブAは必ずジョブBのあとに実行しなければならない」**
単純に時間をずらして、暗黙的な依存関係生業を行う場合はあるが、アンチパターンなので避ける。

実務で実装した際は、初の開発だったこともあり、設計書通りの実装を求められていた。
上記の内容を振り返ってみると、アンチパターンの実装だった気がする。。
なぜ、アンチパターンなのかなど再学習する必要があると感じた。
過去のコードを見せてもらえると改善していけるから聞いてみよう。

##おわりに。

去年の今頃の自分の振り返りをしてみた。
主体的に開発をおこなうことで気づきがあるとわかった。
今後もこれを続けていきたい。

自分の経験や知識や増えることが楽しい。
もっともっと貪欲に学んで、いろんな開発がしたい。
WWDC 2020 TechTalk 「Create MLの物体検出モデルの改善」のポイントを整理する

# この記事は？

自前の画像を用意しCreateMLを使って物体検出モデルを生成するにあたり、パラメータなど気を付けるべきことは何か？を確認するため、[WWDC 2020 TechTalk 「Create MLの物体検出モデルの改善」](https://developer.apple.com/videos/play/tech-talks/10155/) を視聴しました。
この記事では、その動画で説明されたポイントを整理して、実際にCreateMLを使ってみて表示内容を確認しました。

# WWDC 2020 TechTalk 「Create MLの物体検出モデルの改善」のポイント

## トレーニング時のパラメータ

CreateMLでトレーニングする際に、以下のパラメータを指定できる

- アルゴリズム
- イテレーション
- バッチサイズ
- グリッドサイズ：アルゴリズムがFull netowrkの時のみ

### アルゴリズム

|  | Full network | Transfer Learning |
|-:|:-|:-|
| **特徴** |<ul><li>2019年に導入<li>YOLOv2アーキテクチャに基づく<li>16ビット精度で重みを保存</ul>   | <ul><li>Photosが使う訓練済みバックボーンを利用</ul>  |
|**モデルサイズ**(2019年が65MB)|33MB |7MB  |
|**利用可能なバージョン**|iOS 12以上   |iOS 14以上   |
|**必要なトレーニングデータの目安？**（1クラスあたり）|200 |80   |
|**どういうときに使う？** |訓練データが大量にある場合|データが限られ軽いモデルにしたい時|

#### Full networkのトレーニングパラメータ

![image-param-full-network.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1487167/7ff0a932-f9b9-dc37-2596-ab8a6d3b12b4.png)

#### Transfer Learningのトレーニングパラメータ

![image-param-transfer-learning.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1487167/8c7429b9-ea1f-f061-5ec4-783c5100fa97.png)

### イテレーション

- モデルのパラメータが更新される回数
- デフォルト値はデータセットのサイズにより選択される

### バッチサイズ

- 1回のイテレーションで使われたトレーニング画像の数
- デフォルト値はハードウェアの制約に基づいて選択される
- バッチサイズは大きい方がよいが、制約に合わせて調整するのがよい

### グリッドサイズ

- Full networkのみのパラメータ
- インプット画像のアスペクト比と、モデルがオブジェクトを探す場所を定義する
- デフォルトは13×13のグリッドを使用
- 15×8のような長方形も指定可能
- グリッド数が多くなると検出できるオブジェクトの数が増える一方で、画像当たりの推論の数が増える
    - → 計算コストを考慮することが重要！
- 正方形でないインプット画像に正方形のグリッドを使えば、情報が失われモデルの精度が悪くなる
    -  → グリッドは入力画像のアスペクト比を維持するよう設定するのが良い結果をもたらす

## モデルの評価

物体検出モデルの評価指標には以下の2つを使う

- IoU(=Intersection over Union)
- mAP(=mean Average Precision) 

### IoU

- 推論で描くバウンディングボックスと、注釈でつけたバウンディングボックスの重なり具合
- 0%は重なりがないことを示し、100％は完全に重なっていることを示す

### mAP

- 推論結果のラベルが正しいこと、IoUがある一定の閾値以上であることを使って導き出す指標
- mAP算出にIoU使う
- mAPが高いほど正しい推測
- ビデオではあまり詳しい説明はなし
- [【物体検出】mAP ( mean Average Precision ) の算出方法](https://qiita.com/cv_carnavi/items/08e11426e2fac8433fed) に詳しく解説されています

# CreateMLの画面でIoU, mAPを実際に確認してみる
実際にCreateMLを起動しトレーニングを流して、動画で解説のあったIoU, mAPを確認してみました。

![image-iou.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1487167/b5ca7117-be79-13c8-30fc-7f3a2cfbcff3.png)

## IoU

- 実際のCreateMLの画面では、`I/U 50%`と `Varied I/U`の2つが表示されています
- [【IOU】 Object Detection の性能指標【I/U】](https://qiita.com/john-rocky/items/eacf17648cfb778d8eff) の解説によると
- I/U 50%
  > このIOUが５０％を越えているもの（５０％重なっているもの）を正解とみなして％表示しています。
- varied I/U
  > 閾値を５０％〜９５％まで変化させた時の平均正解率

余談：トレーニングデータがよくなかったのでしょうか、かなり低い値となってしまいました。。。

## mAP

画面上、明示的に`mAP`と書かれた箇所はないのですが、動画では、
> The overall mean Average Precision for our data set can be seen at the top right corner.

と言っているので、右上にある`Validation`の値がmAPにあたる値なのかと思います。
EC2にdockerをインストールする

1. `docker`をインストールします。
1. `ec2-user`を`docker`グループに参加させます。

    ```shell
    sudo yum install docker
    sudo usermod -aG docker ec2-user
    ```

1. シェルからログアウトします。
1. 次のコマンドを実行します。

    ```shell
    sudo service docker start
    ```

[Post\-installation steps for Linux \| Docker Documentation](https://docs.docker.com/engine/install/linux-postinstall/)
vue-chartjsとchart.jsを入れたらエラーが出たのでバージョンを下げた

([The sky is the limitさん](https://www.sky-limit-future.com/entry/error_vue_chartjs_version_1)の記事で解消できました。大感謝です。)

##①何をしたらエラー解消したか
####結論：バージョンを下げた。

グラフを実装してもコンポーネントは表示されず、検証ツールでエラーになってしまう。
どうやら**chart.jsのバージョンが問題らしい。**
以下の手順で無事にエラー解消して表示されました。


1 . vue-chartjsとchart.jsをアンインストール 

```
yarn remove chart.js
yarn remove vue-chartjs
```
2 . バージョンを指定して、再インストール

```
yarn add chart.js@2.8
yarn add vue-chartjs@3.4.2
```

これでエラーが消えて正常に表示された。

##②もう少し調べると・・・

chart.js @2.9.4だとダメで、@2.9.3だと動いたってこともあるみたい。
バージョンって難しい。

https://github.com/chartjs/chartjs-plugin-annotation/issues/276

##③参考にしたサイト 

- [The sky is the limit](https://www.sky-limit-future.com/entry/error_vue_chartjs_version_1)
- [isoroot(開発者ブログ)](https://www.isoroot.jp/blog/3524/)
CSSの詳細度について

#はじめに

cssで装飾する場合に詳細度というものがあり、どのCSSプロパティが適用されるかを決める手段があるのでアウトプットしていきます。

#適用されるstyleについて `span`タグ　

まずは簡単に記述していきます。

```index.html
<!DOCTYPE html>
<html lang="en">

<head>
    <!-- 省略 -->
    <link rel="stylesheet" href="style.css">
</head>

<body>
    <span>こんにちは！ </span>
    <span>こんにちは！ </span>
</body>
</html>
```

```style.css
span {
   width: 100px;
   height: 200px;
   background-color: darkgray;
}
```

このような形でタグ全ての大きさや色を変える事ができます。

では1つだけ変えたい場合がどのようにするのか。
`class`や`id`を使います。

#適用されるstyleについて `class` `id`

```index.html
    <!-- 省略 -->
<body>
    <span class="first">こんにちは！ </span>
    <span id="first">こんにちは！ </span>
</body>

```

classに名前をつけてそれだけを指定する事ができます。
ポイントはclassの場合は `.` が先頭に必要になります。

```style.css
.first {
   width: 100px;
   height: 200px;
   background-color: darkgray;
}
```

またidの場合は先頭に`#`が必要になります。

```style.css
#first {
   width: 100px;
   height: 200px;
   background-color: red;
}
```

今回はあえて同じ名前にしましたが同じ名前でもclassとidは別ものなので適用されます。

#同じ要素に対して複数のstyleが適用された場合

```index.html
<!-- 省略 -->
<body>
    <span class="first" id="second">こんにちは！ </span>
    <span>こんにちは！ </span>
</body>
```
```style.css
.first {
   width: 100px;
   height: 200px;
   background-color: darkgray;
}

#second {
   width: 100px;
   height: 200px;
   background-color: red;
}
```


このように同じ要素に複数のstyleが適用された場合どうなるのか。

結論、*id="second"*が適用されます。

これは**詳細度**を元にしてどのstyleが当たるのかが決定されます。

[MDN Web Docs](https://developer.mozilla.org/ja/docs/Web/CSS/Specificity)に記載されています。

>詳細度Specificityは、どの CSS プロパティが要素に最も関係があるか、すなわち適用されるかをブラウザーが決定する手段です。詳細度は様々な組み合わせの CSS セレクターで構成される一致規則に基づいています。

>以下のリストは、セレクターを詳細度の小さな順に並べたものです。

>* 要素型セレクター (例えば h1) と 擬似要素 (例えば ::before)

>* クラスセレクター (例えば .example)、属性セレクター (例えば [type="radio"])、擬似クラス (例えば :hover)

>* ID セレクター (例えば #example)

以下の場合はどうなるでしょうか。

```style.css
.first {
   width: 100px;
   height: 200px;
   background-color: darkgray;
}

span {
   width: 100px;
   height: 200px;
   background-color: red;
}
```

classの方がより詳細度があるので適用されます。
Databricks　モデルレジストリ

ここでは、モデルレジストリへの保存の記述をまとめていきます。

## モデルレジストリの概念

- **モデル**：モデルフレーバーの`mlflow.<model-flavor>.log_model`メソッドの1つでログに記録される実験または実行からログに記録されたMLflowモデル。ログに記録されたら、モデルをモデルレジストリに登録できます。
- **登録モデル**：モデルレジストリに登録されているMLflowモデル。登録されたモデルには、一意の名前、バージョン、モデル系統、およびその他のメタデータがあります。
- **モデルバージョン**：登録済みモデルのバージョン。新しいモデルがモデルレジストリに追加されると、バージョン1として追加されます。同じモデル名に登録された各モデルは、バージョン番号をインクリメントします。
- **モデルステージ**：モデルバージョンには、1つ以上のステージを割り当てることができます。MLflowは、一般的なユースケースである**None**、**Staging**、**Production**、および**Archivedの**事前定義されたステージを提供します。適切な権限があれば、ステージ間でモデルバージョンを移行したり、モデルステージの移行をリクエストしたりできます。
- **説明**：モデルの意図に注釈を付けることができます。これには、説明と、アルゴリズムの説明、採用されたデータセット、方法論など、チームに役立つ関連情報が含まれます。
- **アクティビティ**：登録された各モデルのアクティビティ（ステージ移行の要求など）が記録されます。アクティビティのトレースは、実験から段階的なバージョン、本番まで、モデルの進化の系統と監査可能性を提供します。



MLflowモデルレジストリは、MLflowの既存の機能に基づいて構築されており、組織がMLモデルを共有し、実験からテストと本番への移行に協力し、承認とガバナンスのワークフローを実装するための1つの中心的な場所を提供します。



![](https://databricks.com/wp-content/uploads/2019/10/model-registry-new.png)

モデルレジストリは、MLモデルをより見つけやすくし、一般的なMLタスクを共同で改善するためのコラボレーション機能を提供することで、チーム間での専門知識と知識の共有を促進します。

開始するには、実験からMLflowモデルを登録するだけです。レジストリを使用すると、モデルの複数のバージョンを追跡し、それぞれにライフサイクルステージ（開発、ステージング、本番、またはアーカイブ）をマークできます。

**MLflowモデルレジストリダッシュボードを介して表示されるサンプルの機械学習モデル**

![](https://databricks.com/wp-content/uploads/2019/10/model-registry-dash.png)

上記の画面で登録されているモデルを一覧で表示されます。



すべての実験実行が完了し、レジストリに追加するのに最も適したモデルを決定した後、指定された名前を持つモデルを登録するには、`mlflow.register_model()` メソッドを使用します。

```
Python
result=mlflow.register_model("runs:<model-path>", "<model-name>")
```



指定された名前で新しい登録済みモデルを作成するには、MLflow Client API `create_registered_model()` メソッドを使用します。 モデル名が存在する場合、このメソッドにより `MLflowException` がスローされます。

```
Python
client = MlflowClient()
result = client.create_registered_model("<model-name>")
```



コマンド以外でレジストリに追加する場合

追加したいモデルの詳細画面を表示

![スクリーンショット (106).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/817530/d885edbb-9e35-26fb-4ac2-19e6ade17fe5.png)

Register Modelボタンをクリックして、登録することができる。

以上がモデルレジストリについてです。

見ていただき、ありがとうございました。

株式会社メソドロジック

川名智士



参照：

https://databricks.com/jp/product/mlflow-model-registry

https://databricks.com/jp/blog/2019/10/17/introducing-the-mlflow-model-registry.html
Node.js 周りの用語整理

普段Node.jsを利用しないため、用語をすぐに忘れるので整理しておく。

## ツール

Node.jsの管理には２つ（？）のツールがある

- Node.js自身のバージョンを管理するツール
- Node.jsのパッケージを管理するツール

## Node.js自身のバージョンを管理するツール


### nvm

Mac以外はこっちが良さそう

### nodebrew

Macならこっちかな？
homebrewがMacにはあるので、名前からしてMacっぽい

### n

シンプルらしいが、「n」だけだと検索してもあまりヒットしないのがデメリット

## Node.jsのパッケージを管理するツール

### npm

他にもあるかもしれないけど、これが一番有名かな
python画像読み込みエラー

import cv2
print(cv2.__version__)

image = cv2.imread("./test.jpg")

image2 = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

cv2.namedWindow('image')

while True:
    cv2.imshow('image', image)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
cv2.destroyAllWindows()


実行後
error: OpenCV(4.5.1) /private/var/folders/nz/vv4_9tw56nv9k3tkvyszvwg80000gn/T/pip-req-build-yvyj7qlp/opencv/modules/imgproc/src/color.cpp:182: error: (-215:Assertion failed) !_src.empty() in function 'cvtColor'



ここを参考に
https://qiita.com/Nw3965/items/5ef4bc82dd9c28e36a19

３行目を絶対パスに変更
image = cv2.imread("./test.jpg")
↓
image = cv2.imread("/Users/○○○/Desktop/test.jpg")