OmniAICreator/Qiita-1.07M huggingface dataset:
SQLSTATE[HY000] [2002] Connection refusedのエラー

Laravelでphp artisan migrateをしようとしたところ、タイトル通りのエラーメッセージが出た。

#MySQLでポート番号を調べる
```
show variables like ‘port’;
```
#envファイルに追加
出てきたポート番号をenvファイルに書き加えます。

```
DB_PORT=3306 //など
```
もう一回php artisan migarateをすると、うまくいきました。
【C#】ショートカットファイルをダウンロードしたい

##概要
画面のボタンクリックで適当なショートカットファイル（.url）をダウンロードする。

##実装
```HTML:HTML
<a type="submit" asp-controller="Sample" asp-action="DownloadShortCutFile" >Download</a>
```


```CS:CS
public class SampleController : Controller
{
	public IActionResult DownloadShortCutFile()
	{
	    // ファイル名
	    string fileName = "ShortCut.url";
	    //作成するURLショートカットのパス
	    string shortcutPath = System.IO.Path.Combine(Directory.GetCurrentDirectory(), fileName);
	    //ショートカットのリンク先
	    string url = "https://www.google.co.jp/";

	    //テキストファイルに書き込む
	    System.Text.Encoding enc = System.Text.Encoding.GetEncoding("utf-8");
	    StreamWriter sw = new StreamWriter(shortcutPath, false, enc);
	    sw.WriteLine("[InternetShortcut]");
	    sw.WriteLine("URL=" + url);
	    sw.Close();

	    // ファイルダウンロード
	    var filePath = shortcutPath;
	    var file = System.IO.File.ReadAllBytes(filePath);
	    return File(file, MediaTypeNames.Application.Octet, fileName);
	}
}
```
PL-900：Microsoft Power Platform Fundamentalsの勉強方法（2021年4月合格）

「PL-900：Microsoft Power Platform Fundamentals」に合格しましたので、その勉強方法を記載したいと思います。

#■[PL-900：Microsoft Power Platform Fundamentalsとは](https://docs.microsoft.com/ja-jp/learn/certifications/exams/pl-900)
Power Platformの一番基礎的な資格です。
公式には以下の証明となることが記載されています。
>この試験の受験者は、Power Platform の機能を理解し、Power Automate で基本的なビジネス プロセスを自動化し、Power BI で基本的なデータ分析を実行し、シンプルな Power App を作成することでより効果的に行動し、Power Virtual Agents を使用して強力なチャット ボットを作成することで、生産性の向上を目指します。

Power Platform＋認定資格で検索すると以下の9資格が表示されます。
その中で唯一の初級資格となります。
![PP認定資格.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561572/e161d02c-0703-1e0f-3a2b-6cd4161e5b98.jpeg)

#■筆者情報（2021年4月時点）
・インフラエンジニア。
・AWS資格はプロフェッショナルを含め6資格取得済み（[体験記](https://qiita.com/gomasa/items/6ce860a2e11a620c92ae)）。
・上記に加えて「AWS認定　機械学習-専門知識-」合格済み（[体験記](https://qiita.com/gomasa/items/b6a6bd2ecc467581e4c7)）。
・「AZ-900：Azure Fundamentals」合格済み（[体験記](https://qiita.com/gomasa/items/8279c389ee10f7226dc4)）。
・「MS-900：Microsoft365 Fundamentals」合格済み。([体験記](https://qiita.com/gomasa/items/3a7873355b8c5507eb97))。
・「AI-900：Microsoft Azure AI Fundamentals」合格済み([体験記](https://qiita.com/gomasa/items/08e6a6c8fb2698901cbb))。

#■受験動機
Microsoftは上記に記載した通りFundamentals資格を取得して、まずは基本を押さえることに力を入れてきました。今回4つの目のFundamentals資格は「Microsoft Power Platform」。私の会社でOffice365を使っていますが、PowerAppsやPowerAutomationに関して使いこなせるようになれば、相当業務効率を上げることができるのではないかと期待しています。その為に、この分野の勉強をしたいと思いました。

#■勉強方法と活用した教材
|教材名 |区分　|勉強方法|
|:------|:------|:-----------------------------------------------|
|[Microsoft Docs(公式)](https://docs.microsoft.com/ja-jp/?source=docs)|Web(無料)|まずはDocsという公式サイトにアカウントを作成する必要があります。トレーニングを実施したり、資格試験の申し込みや、資格情報の管理を実施するサイトです。私は別の試験の際に作成済みでした。|
|[試験 PL-900(公式)](https://docs.microsoft.com/ja-jp/learn/certifications/exams/pl-900)|Web(無料)|試験の説明が記載されています。親切なことにラーニングパスも掲載されています。|
|[ラーニングパス](https://docs.microsoft.com/ja-jp/learn/paths/power-plat-fundamentals/)|Web(無料)|PL-900を受験する人が学習するべきラーニングパスがHPに記載されています。全部実施しても1日で終了します。<br><br>指定されているラーニングパスは以下の通りです。<br><br>・[Microsoft Power Platform の基本](https://docs.microsoft.com/ja-jp/learn/paths/power-plat-fundamentals/)<br><br>ただし、私は今回触れるPower Platform環境が無かったので、資料を読んでのみの学習でした。正直、上記のラーニングパスだけだと全くイメージできず、苦戦しました。私と同じでイメージが出来ずに苦戦する人は、これ以降に記載する資料をみてください。|
|[今日から始めたくなる Power Platform 入門編 ～デモで分かるローコード開発の無限の可能性～](https://www.youtube.com/watch?v=rtM_kDs8pLE)|Web(無料)|とても解りやすい基本説明。この説明を聞けばイメージがつくので、ラーニングパスの説明が頭に入りやすくなります。|
|[Power Virtual Agents : ノーコードでボットを作ろう](https://www.youtube.com/watch?v=Wu5UlOzXAMo)|Web(無料)|こちらはPower Virtual Agentsをとても解りやすく説明してくれています。|
|[はじめてのPower Apps 2020年版](https://www.youtube.com/playlist?list=PLc5FJU2aT4yTQK-NNiAvf4uta6DxAHXQS)|Web(無料)|Power Platformを操作説明を実施してくれるシリーズ。自分のイメージできない所だけこの動画を見ると、操作が理解できて助かります。|

#■受験（2021年4月：合格）
|ポイント|内容|
|:------|:------|
|試験会場|試験会場は「ピアソン VUE」の会場から選択できます。|
|所感|問題内容については記載できません。ただ、試験自体は試験時間の半分以下の30分くらいで解き終わりました。知っているか知らないか、という世界なので、あまり悩むことはありませんでした。|
|結果|800点に届いていなくて、結構焦りました。やはり実際の環境で操作できずにYoutube動画でイメージを掴んでいただけなので、それほど良い点数は取れませんでした。最後に紙媒体のスコアレポートを提供してくれます。|

#■感想
結果的に勉強期間は1週間くらいでした。

会社への行き帰りの電車の中やPower Platformの機能に関する用語を覚え、土日にラーニングパスを実施しました。

PowerPlatformを使いこなすためにも、基礎を学習することは意味があると思います。その方法として、この資格取得を目指すのは、良い方法だと感じました。

以　　上
【MotionBoard】チャート編集のどこで設定するか思い出せない→キーワード検索できる



#目標
やりたいことをチャート編集のどこで設定するか思い出す
（チャート編集に無かった場合は別のところを探そう！力になれなくてすまんがんばれ）

#手順
(1)チャートを右クリックし、メニューから「チャート編集」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278265/2a2ed42a-1b11-f3d5-118c-fabd37e62010.png)

(2)使いたい機能のキーワードのかけらでもいいので必死に思い出し、左上の検索窓に入力
　　→設定するメニューがあるところが<font color="OrangeRed">赤くなるんだ！</font>知ってた？

 例）最大値
「軸」のところが赤くなってるので、移動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278265/8fb75f1b-4a21-e82f-b954-3bad9c132661.png)

「最大値、最小値、単位」が赤くなってる！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278265/21cd9527-56b0-9c11-7c2c-a128f1518bee.png)

#つぶやき
検索窓があることに意外と気づいてない人がいるみたい。

#ウイングアークのユーザコミュニティ「nest」
私も参加しています。多くの有益な情報があり、交流があります。
世の中が変わり、社外活動の重要性がより増していると考えております。
社外で自分の価値を計れるものさしを持とう。

https://www.wingarc.com/wug-nest/

以上
複数のGitHubアカウントを簡単に切り替えるコマンドの作成

# 始めに
GitHubを仕事とプライベートで分けている人にとって、1つのPCでアカウントを切り替えるのは大変だと思います。以下の記事で`git clone`をフックして自動で設定するやり方が載っていましたが、中々難しそうだなと感じました。また、ローカルで初めてgitリポジトリを作った場合は設定されなさそうなのも難点でした。

[複数のGitアカウントを手動切替不要で運用する](https://qiita.com/KeyMama/items/f9291bb125ee94b52b78)

そこで明示的にどちらのアカウントを使っていくかを指定するコマンドを作ることにしました。
こちらの場合だとclone後にコマンドを1つ入力する手間がありますが、それでも比較的簡単に設定でき、ローカルでgit initした場合も対応できます。

## 注意
GitHubアカウントは1つ以上無料のアカウントは作ってはいけないことになっているので、この状況にいる人は少なくともどちらかは有料アカウントを持っている人になります。

https://docs.github.com/en/github/site-policy/github-terms-of-service#b-account-terms

>User Accounts and Organizations have different administrative controls; a human must create your Account; you must be 13 or over; you must provide a valid email address; and **you may not have more than one free Account.**

# 設定方法
まずはそれぞれのGitHubアカウント用の公開鍵を設定します。`github_p`と`github_w`は適当な名前なので、別な名前でも大丈夫です。

```:~/.ssh/config
Host github_p
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_rsa_github_private
  IdentitiesOnly yes
  UseKeychain yes
  AddKeysToAgent yes

Host github_w
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_rsa_github_work
  IdentitiesOnly yes
  UseKeychain yes
  AddKeysToAgent yes
```

グローバルのユーザ情報は消しておきます。これで各gitリポジトリごとに設定しない限り使用できなくなります。

```
$ git config --global --unset user.name
$ git config --global --unset user.email
```

最後にローカルでuser.name, user.email, url..insteadOfを設定します。

```shell
# プライベートの場合
$ git config user.name "個人ユーザ名"
$ git config user.email "個人メールアドレス"
# .ssh/configで設定したHost値を使用します
$ git config url."github_p".insteadOf "git@github.com"

# 仕事の場合
$ git config user.name "仕事ユーザ名"
$ git config user.email "仕事メールアドレス"
# .ssh/configで設定したHost値を使用します
$ git config url."github_w".insteadOf "git@github.com"
```

この`insteadOf`の設定が肝で、`github_p`など本来存在しないHost名を`git@github.com`に変更して送信してくれます。

# アカウント切り替えのコマンド作成
以上が設定内容で、最後のローカル設定を各リポジトリごとに設定すれば良いですが、これを一々やるのは大変です。そこでgitのエイリアスを作って切り替えの手間を少しだけ減らします。unsetの設定は誤って個人と仕事で逆を設定してしまった場合に打ち消せるようにするためです。

```:.gitconfig
[alias]
    account-p = "!git config --unset url.\"github_w\".insteadOf; git config user.name \"個人ユーザ名\"; git config user.email \"個人メールアドレス\"; git config url.\"github_p\".insteadOf \"git@github.com\";"
    account-w = "!git config --unset url.\"github_p\".insteadOf; git config user.name \"仕事ユーザ名\"; git config user.email \"仕事メールアドレス\"; git config url.\"github_w\".insteadOf \"git@github.com\";"
```

エイリアスが設定されれば後はコマンド一発で設定できます。

```
# 個人の場合
$ git account-p

# 仕事の場合
$ git account-w
```

なお、もし設定を忘れてコミットした場合、以下の警告が出されるので気づくことができます。（大体これが出て設定する羽目になってますが。。）

```
Your name and email address were configured automatically based
on your username and hostname. Please check that they are accurate.
You can suppress this message by setting them explicitly:

    git config --global user.name "Your Name"
    git config --global user.email you@example.com

After doing this, you may fix the identity used for this commit with:

    git commit --amend --reset-author
```

# 終わりに
以上が複数のGitHubアカウントを簡単に切り替えるコマンドの作成方法でした。これで比較的切り替えやすくなったとはいえ、それでも手間は出てきます。GitHubはそもそもマルチアカウントで使う想定ではないため、中々厳しいかもしれません。僕はGitHub PagesやGitHub Actionsを使いたいためマルチアカウントで運用していますが・・・。
なので、仕事とプライベートで分けたい場合はGitLabなどの別サービスを利用することも視野に入れると良いと思います。
変数~グローバル＆ローカル~

変数の範囲について学習していきます。

#グローバル変数
関数の外で宣言した変数のことをいいます。
この関数の外で宣言することにより、どこの関数でも共通して使うことができます。
しかし、ここで注意が必要です、どこでも使えるため、大規模な開発の場合、変数を1つ変える事によりバグにつながる可能性があります。
またグローバル変数は、定義されてから、プログラム終了までが寿命になっています。

#ローカル変数
これは、関数の中で宣言された変数のことをいいます。
またこの変数は関数の外では使えないので注意が必要です。
変数の寿命も短く、リターンされた時点で終わりになります。

また、グローバル変数とローカル変数が同じ名前の場合は、ローカル変数が優先的に読み込まれます。
そして、ローカル変数は、letで宣言し、グローバル変数はvarで宣言します。
また、関数内のローカル変数だとしても、varを使って宣言した時点でグローバル化せれてしまいますので、ご注意ください！
url_forが見つからないと言われるエラー

NoMethodError (undefined method `url_for' 
というエラーが発生するので忘備録

```ruby
class Gmap < ApplicationRecord
    require 'digest/md5'
    include Rails.application.routes.url_helpers
    validates :title, presence: true, length: { minimum: 1, maximum: 25 }
    validates :comment, presence: true, length: { minimum: 1, maximum: 255 }
    validates :latitude, presence: true
    validates :longitude, presence: true

    has_one_attached :image
    before_save :encrypt_magic_word
  
    def encrypt_magic_word
      if magic_word.present?
        self.magic_word = Digest::MD5.hexdigest(self.magic_word)
      end
    end
    def image_url
        # 紐づいている画像のURLを取得する
        image.attached? ? url_for(image) : nil
    end
    belongs_to :user

end
```

APIモードでアプリを作っているのですがRails6になってActive Storageを使うにあたって
url_forなんてメソッドは無いよというエラーが出たので調べると

```ruby
include Rails.application.routes.url_helpers
```

をurl_forを使っている所にincludeしないと使えなかったので共有します。


ちなみに　config/environments/development.rb
に下記も追加しないとダメです。

```ruby
  Rails.application.routes.default_url_options[:host] = 'localhost'
  Rails.application.routes.default_url_options[:port] = 3000
```
Active Storageと画像加工ツールの導入

<h2>画像アップロード機能の実装</h2>
<p>画像のアップロードには、画像の保存・表示・サイズの調整が必要です。これらの実装にはまず、RailsのActive Storageという機能を使用します。</p>

<h3>Active Storage</h3>
<p>ファイルアップロード機能を簡単に実装できるGem。Active Storageを使うと、画像などのファイルのアップロードを簡単にするメソッドが使用できたり、画像を保存するテーブルを簡単に作成できます。</p>

<h2>画像加工のツールを導入しよう</h2>
<h3>ImageMagick</h3>
<p>画像の作成やサイズ変更、保存形式の変更。</p>
<h3>MiniMagick</h3>
<p>ImageMagickの機能をRubyで扱えるようにしてくれるGem。MiniMagickによって、ImageMagickの機能がRailsで使用できるようになりますが、画像サイズの変更には、もう1つImageProcessingというGemを追加する必要があります。</p>
<h3>ImageProcessing</h3>
<p>MiniMagickでは提供できない、画像サイズを調整する機能を提供するGem。</p>

<h2>導入手順</h2>
<p>①まずはImageMagickをHomebrewからインストールします。<br>
brew install imagemagick<br>
②MiniMagickとImageProcessingをインストールします。以下のようにGemfileの1番下に追記しましょう。<br>
gem 'mini_magick'<br>
gem 'image_processing', '~> 1.2'<br>
その後、ターミナルでbundle installを実行。<br>
③Active Storageをアプリケーション内で使用する準備を行います。<br>
以下のコマンドを実行しましょう。<br>
rails active_storage:install<br>
続けて、rails db:migrateを実行。<br>
④テーブルが追加されていれば導入完了!</p>
Rubyでカラオケマシン問題のコードを書いてみた

##はじめに
この記事は以下のサイトにあった問題を解いてみたものです。Rubyのアウトプットを目的として作成しました。
[アウトプットのネタに困ったらこれ！？Ruby初心者向けのプログラミング問題を集めてみた（全10問）]
(https://blog.jnito.com/entry/2019/05/03/121235)

##問題

[CodeIQに「カラオケマシン問題」を出題しました。みんなチャレンジしてね！](https://blog.jnito.com/entry/2014/06/06/104420)より引用。
>みなさんには、「かえるのうた」を自由自在にキーチェンジするプログラムを作成してもらいます。


>かえるのうたのメロディは以下のような文字列で表現されます。

>"C D E F |E D C   |E F G A |G F E   |C   C   |C   C   |CCDDEEFF|E D C   "

>縦棒( | )は小節の区切りです。
半角スペースは休符です。
音符と休符が8つ集まると1小節になります。


>このメロディ(文字列)を変更するKaraokeMachineというクラスを作ります。
このクラスはインスタンス作成時にメロディを受け取ります。
transposeというメソッドに変化させたいキーの量を渡すと、その分だけキーを上げたり下げたりしたメロディが返却されます。

## コード
```ruby
class KaraokeMachine
  def initialize(melody)
    @melody = melody
  end
  def transpose(amount)
    melody_line = %w(C C# D D# E F F# G G# A A# B)
    changed_melody = ""
    calc_amount = amount % -12  

    @melody.each_char do |m|
      if m =~ / |\|/            
        changed_melody = changed_melody + m
      else                      
        new_key = melody_line.index(m) + calc_amount
        changed_melody = changed_melody + melody_line[new_key] 
      end
    end
    return changed_melody
  end
end
melody = "C D E F |E D C   |E F G A |G F E   |C   C   |C   C   |CCDDEEFF|E D C   "
karaoke = KaraokeMachine.new(melody)
```

## 方針
音階は全部で12種類あります。そこで、音の配列を用意してやり、１音ずつ変換させていけば、目的が達成できそうです。変換については、当初12で割ったあまりを利用する予定でしたが、問題が発生したので-12で割ったあまりを利用することで問題を解決しました。

##解説
まずは音階を用意します。

```ruby
melody_line = %w(C C# D D# E F F# G G# A A# B)
```

例えばドの音はCと表されますが、Cはこの配列のインデックスの0にあたります。
音を変換する際に、インデックスの値を利用するためにそれぞれの音に対して
`index`メソッドを利用しました。
今回用意した配列のインデックスは-11~11の値を取りうることができます。当初は12で割った余を`index`メソッドを使った後の値に足していたのですが、これだと用意した配列のインデックスの取りうる値の範囲から逸脱することがある問題が発生しました。そこで-12で割った余を利用することでこの問題を回避しています。

あとは、melodyに出てくる音以外の文字列の処理です。
これには" "と"|"が含まれます。これらはそのまま表示させたいので、

```ruby
  m =~ / |\|/ #" "または"|"にマッチする正規表現
```
が含まれる際はそのままとしました。


##参考にしたサイト
[Array#find_index (Ruby 3.0.0 リファレンスマニュアル)](https://docs.ruby-lang.org/ja/latest/method/Array/i/find_index.html)
[String#each_char (Ruby 3.0.0 リファレンスマニュアル)](https://docs.ruby-lang.org/ja/latest/method/String/i/each_char.html)
React初学者がReactとは何か調べてみた。


#Reactについて
ReactはFacebook社が開発しているJavaScriptのライブラリらしい。

##メリット

 - **コンポーネントベース**
    - UIコンポーネントを使いまわせる。(同じコードを何回も書かなくて済む)

 - **Virtual DOM**
    - 適切なコンポーネントだけを効率的に更新してレンダリングすることがでる。

 - **JSX**
- jsxファイルにすることでHTMLと似た記載ができる。
　 

⏬　こんな感じで


```react
/*reactを使うよという宣言*/
import React from 'react';

const sample = () => {
  return <h1>よしあきだよ</h1>;
};

export default sample;
```


ついでにNext.jsについても書こうかな。そんな知らんけど笑

##Next.jsの便利なところ

###Pre Rendering
  - Server-Side Rendering
  - Static Generation

###ルーティングなどのサポート



##Pre Rendering
 
- **Server-Side Rendering**
  - ユーザーがアクセスした時、サーバ側でHTMLをレンダリングする
  
   
- **Static Generation　(Next.jsさんが推奨してるらしい)**
   - ビルドしたタイミングでHTMLをレンダリングしているからすでにHTMLが準備されている状態
   
##ルーティングなどのサポートしてるらしい
　Reactだと**react-router**とかメタタグを付与する**react-helment**などのライブラリの追加や設定を追加しないといけないらしいがNext.jsだとそれが標準で装備されているらしい。


以上！初学者がReactを軽くまとめた記事でした。
[KNIME] コンソールへのログ出力

コンソールに表示するログレベルは、Preference のKNIME > KNIME GUI ページのConsole View Log Level を調節できます。

![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1284134/9ad05a1a-19ab-1197-ffbd-02be0143b83b.png)
【MotionBoard】「該当データが存在しません」ダイアログを出ないようにする

#目標
チャートに該当データ無し時に出る↓このダイアログ、出ないようにする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278265/e3e419a1-9252-c5de-4f78-4fe1b6daf4d8.png)

#手順
(1)チャートを右クリックし、メニューから「プロパティ」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278265/1f2c90a4-9fa1-1444-3b07-b30a599e38eb.png)
(2)データ取得時の表示の「データがなかった場合のダイアログを表示しない」をチェック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278265/3f636fdf-91f3-775b-5762-4ff046676975.png)

#つぶやき
現場の人はこのダイアログ見ると「わっ何？エラー？」って思っちゃうみたい。主張強め。
この機能、よく使うのによく忘れる。そのたびに自分の脳みそのダメさを味わっている。

#ウイングアークのユーザコミュニティ「nest」
私も参加しています。多くの有益な情報があり、交流があります。
世の中が変わり、社外活動の重要性がより増していると考えております。
社外で自分の価値を計れるものさしを持とう。

https://www.wingarc.com/wug-nest/

以上
左の値から右の値まで足した和の計算

```VB.NETPublic
Class Form1

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        'messageBox表示後にループから抜けるための変数を用意する
        Dim endSign As Integer = 0

        Do until endSign = 1

            Dim strText1 = TextBox1.Text
            Dim strText2 = TextBox2.Text          
            Dim strText_str1 As String = strText1
            Dim strText_str2 As String = strText2           
            Dim strText_int1 As Integer = strText_str1
            Dim strText_int2 As Integer = strText_str2

            '数値でなければエラーを表示する
            If IsNumeric(strText1) = False Or IsNumeric(strText2) = False Then
                MessageBox.Show("整数を入力してください。")
                Exit Do
            End If


            '小数であればエラーを表示する
            If InStr(strText_str1, ".") <> 0 Then
                MessageBox.Show("小数は計算できません。")
            ElseIf InStr(strText_str2, ".") <> 0 Then
                MessageBox.Show("小数は計算できません。")
                Exit Do
            End If


            'テキストボックス内の値が、左 < 右であるか判別する
            If strText_int1 > strText_int2 Then
                'ループから抜けるための変数
                endSign = 1
                MessageBox.Show("左の値 < 右の値で入力してください。")

                'それ以外(整数)であれば計算結果を表示する
            Else
                Dim i As Integer
                Dim sum As Integer = 0

                For i = strText_int1 To strText_int2 Step 1
                    sum = sum + i
                Next

                'ループから抜けるための変数
                endSign = 1
                MessageBox.Show(sum)
                Exit do
            End If

        Loop

    End Sub

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    End Sub
End Class
```
for文とWhile文どっち？？

#while文

```index.html
<script>
    'use strict'

    let i = 0;
      while (i < 10) { 
        document.write( i+ '枚' );
        i++;
      }
<script>
```
#for文
```index.html
<script>
for (let i=0; i < 10; i++){
      document.write(i + '枚')
    }
<script>
```
どちらも同じ表示になるはずです。

![スクリーンショット 2021-04-06 15.08.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1033397/ae36a873-4617-45c8-7b67-e40c02da3ae7.png)


これどっちつかうの？ってなりますよね。

while文では、変数letを宣言していますね。
ということは、それ以後その変数を宣言することができません。

for文では、カウンター用の変数を使います。そのような変数は繰り返し処理の中でしか使わないことが多いです。なのでfor文の初期化式でカウンター変数を宣言すれば、for文の外からは使えない変数となりますので、プログラム全体が読みやすくなりますね！！

このように短いプログラムではわかりにくいですが、大きいプロジェクトになると、更に複雑化してくるので、For文とWhile文の使い分けはしっかりしたほうがいいですね👍
iOS14 DatePickerの表示部分をカスタマイズしたい

# 前提
提供部品(UIKit)のプロパティで変更することは厳しかったため
DatePickerにラベルを重ねることによって実装しています。

# 実装
## カスタムクラス作成

```swift:CustomDatePicker
import UIKit

class CustomDatePicker: UIDatePicker {
    let label = UILabel()
    // こちらはフォーマットのデフォルトです
    // 変更予定のため任意で構わないです
    private var format = "MMM d yyyy hh:mm"
    
    private func updateLabel() {
        let formatter = DateFormatter()
        formatter.locale = Locale(identifier: "ja_JP")
        formatter.setLocalizedDateFormatFromTemplate(self.format)
        label.text = formatter.string(from: date)
    }
    
    // このメソッドより↑のデフォルトを書き換えます
    func setLabelFormat(format: String) {
        self.format = format
    }
    
    override func willMove(toSuperview newSuperview: UIView?) {
        super.willMove(toSuperview: newSuperview)
        addSubview(label)
    }
    
    // カスタマイズに苦戦したものとはお別れ
    func makeTransparent(view: UIView) {
        view.subviews.forEach({ $0.subviews.forEach({ $0.removeFromSuperview() }) })
    }
    
    override func layoutSubviews() {
        super.layoutSubviews()
        makeTransparent(view: self)
        label.frame = CGRect(origin: .zero, size: frame.size)
        updateLabel()
    }
}
```

# 使用方法
## storyboard, xib使用

DatePickerを配置
![スクリーンショット 2021-04-06 15.04.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185455/0a582441-f5dd-96f0-c2f6-98790001a9ee.png)

Classにさきほど作成したものを適応
![スクリーンショット 2021-04-06 15.05.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185455/15e1fdc2-1c05-5611-3628-b75cd8c02fb4.png)

ViewControllerに紐付けて

```swift:ViewController
@IBOutlet weak var timeDatePicker: CustomDatePicker!

func configDatePicker() {
    // format指定
    self.timeDatePicker.setLabelFormat(format: "Hm")
    // DataPicker自体のカスタマイズ
    self.timeDatePicker.datePickerMode = .time
    // 表示部分のカスタマイズ
    self.timeDatePicker.label.textAlignment = .center
    self.timeDatePicker.label.backgroundColor = .darkGray
}
```

# 結果
動画の撮り方わからないため画像ですみません。

|Label|Picker|
|:---:|:---:|
|![スクリーンショット 2021-04-06 15.12.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185455/adf05d71-5f28-34b2-4387-420be585c549.png)|![スクリーンショット 2021-04-06 15.12.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185455/d8e607c0-6ca0-c223-d564-6b6a13e69759.png)|

# 最後に
Pickerの使用するModeによってフォーマットを変更する必要がありますが、
プロジェクト単位で仕様が決まっていればそこもカスタムViewに組み込む形でいいかと思います。

またコードにてレイアウトを使用している方も同様に利用できます。(当たり前ですが、、w)

簡易的な記事なため、「もっとここ詳しく」などのコメントもお待ちしております。

pickerの仕様が変わりTextFieldにaddするような形じゃないため、
以前のものよりレイアウトに制限があるとおもい使用をさけてましたが、
ios14以上のみをターゲットにするアプリを作成する予定が入ったため
ドラムはなーーーと思い作成しました。

同じような問題をかかえて使用をやめた方などの参考に少しでもなればなと思います。

短いですが以上です。
VSCodeからVagrantにリモートアクセスする

## 概要
VisualStudioCodeからVagrantに直接リモートアクセスできることを知ったので、早速トライしてみました。
が、意外とハマってしまったので、備忘録がてらメモを残します。

## 前提
- Vagrant, VirtualBoxをインストールしていること
- Vagrantによる仮想サーバーの設定を完了していること

## 手順
1. "vagrant up"コマンドで仮想サーバーを立ち上げる(WindowならコマンドプロントかPowerShell、Macならターミナルから起動)
1. 拡張機能"RemoteDevelopment"をインストールする
<img width=400 alt="VSCode拡張" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656610/acaf06a7-6556-92b1-596b-c6d586a2dfe7.png">
インストール後、画面左側にSSH用のアイコンが追加されます。

1. アイコン"Remote Explorer"をクリックし、画面左上のリモートエクスプローラーのプルダウンから`SSH Target`を選択する
1. 画面左上の設定ボタン(歯車アイコン)をクリックし、コンフィグファイルを選択する
通常は下記のリンクを選択します。<br>
`Users¥username¥.ssh¥config`

1.  リモートアクセスするサーバー情報を追加する
表示されたテキストデータの一番下の行で1行改行し、下記の情報を追加する

```
HostName  XXXXXXX(ここの名称は何でもよさそう)
User XXX(vagrantにアクセスするユーザ名)
Port 22(設定したポート番号)
IdentityFile C:¥username¥Documents¥XXXX(秘密鍵のファイルパス。通常、.vagrantディレクトリ配下にある様子)
```

ここの設定に失敗していたため、アクセスに何度も失敗しました。
ここの情報は、ターミナルの下記コマンドで確認する必要があります。
`vagrant ssh-config`
ここで出てきたHostName、User、Port、IdentityFileを設定すれば良いようです。
上記設定により、画面左側の"SSH TARGETS"内に、HostNameで設定したホスト名が追加されます。

1.  新規に追加されたホスト名を右クリックし、"Connect to Host in Current Window"をクリックする
最初の接続時には、下記を選択する
    - OSを聞かれるのでVagrantで設定したOSを選択する
    - Continueを選択する

上記完了後、VSCodeでvagrant上のディレクトリを開くことができるようになります。
黒丸や数字のリストCSS

黒丸や数字のリスト

```scss
// list ・
.list {
	li {
	position: relative;
	padding-left: 24px;
	
	&::before {
		position: absolute;
		left: 0;
		content: "・";
	}
}

// number ex 1. 
.list-type01 li {
	counter-increment: cnt;
	&::before { content: counter(cnt) "."; }
}

// number ex (1)
.list-type02 li {
	counter-increment: cnt;
	&::before { content: "(" counter(cnt) ")"; }
}

// asterisk
.list-type03 li {
	&::before { content: "※"; }
}
```
KNIME紹介スライド

ノンプログラミングでデータを処理できるツールKNIMEの紹介スライドです。
各種ノードを連結することでデータを処理するワークフローを作成します！
https://www.docswell.com/s/sasuke_sss/LZ8L15-2021-04-06-154106
https://docs.google.com/presentation/d/1hHZFe5UcagPp78m7mLcN004nSI_VUhX1-XxwYL8mAV0/edit?usp=sharing
GitHub ActionsでECRのプライベートイメージを使う。2021-04-06

# 概要

* ECRからpullするときに `docker login` する必要がある
* `aws ecr get-login-password` で取得したパスワードには有効期限がある

で一手間必要です。

参考:

* https://github.community/t/github-actions-new-pulling-from-private-docker-repositories/16089
* https://agileek.github.io/software/aws/2020/10/28/using-an-ecr-image-in-github-actions/

# 設定例

以下の設定で動いた雰囲気。

```yaml
name: Test

on:
  - push
  - pull_request

jobs:
  login:
    runs-on: ubuntu-latest
    outputs:
      password: ${{ steps.get_password.outputs.password }}
    steps:
      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: ap-northeast-1
      - id: get_password
        run: echo "::set-output name=password::$(aws ecr get-login-password)"

  test:
    needs: login
    runs-on: ubuntu-latest
    container:
      image: xxx.dkr.ecr.ap-northeast-1.amazonaws.com/test:latest
      credentials:
        username: AWS
        password: ${{ needs.login.outputs.password }}
    steps:
      - run: node -v
      - run: npm -v
```

## ポイント
* job: loginで `aws ecr get-login-password` してパスワードを取得
* job: testでそのパスワードを利用してECRのプライベートコンテナ利用

# 気になるポイント（懸念点）

パスワードがログに出力されてなかったから大丈夫だと思うけど `aws ecr get-login-password` してるところ

# まとめ

ちょっと気になるポイントがありますが、GitHub ActionsでECRのプライベートイメージを使えました。

# 参考
* https://github.com/aws-actions/configure-aws-credentials
    * AWSの認証とかをよしなにやってくれるやつ
* https://docs.github.com/ja/actions/reference/workflow-commands-for-github-actions
    * 出力の利用とか
* https://docs.github.com/ja/actions/reference/workflow-syntax-for-github-actions
    * container.imageとかの設定
Reactのカスタムフックについて

ReactHooksってとても便利ですね...!
React初心者ではありますが、stateなどのReactの機能をクラスを書かずに使えるのは本当に助かリます。

最近になってReactHooksには独自のフックを作成する機能があると知って、なんだそれは？使ってみたい！ってなったので、どのような機能なのかものすごくざっくり纏めてみました。

##カスタムフックとは？メリットは？
コンポーネントからロジックを抽出して再利用可能な関数を作ること。つまりはただの関数のこと。

コンポーネントからロジック（処理）を分離させることが出来るようになる、それにより、使い回し可能でコードの見通しもよくなるというメリットがある。またかなり自由度が高く自分の好きなカスタムフックを作ることが出来ます。

カスタムフックを作る際には慣習的にuse~という名前で作っていく必要があるので、そこは注意が必要になって来るかなと思います。


##最後に
現在、ポートフォリオを載せるサイトを作成しているのでが、お問い合わせフォームにロジックがかさんで見通しの悪くなってしまっているので、カスタムフックを使って見通しをよくしてみたいと思います。

参考サイト

https://ja.reactjs.org/docs/hooks-custom.html
Dockerコンテナ上でDjangoチュートリアルを実施

#はじめに
・「dockerで開発環境用意してみようかな！」「Djangoのチュートリアルをおさらいがてらやるか！」という思いつきの結果散々詰まった。解消できた項目について記述していく。

###環境
・macOS Mojave 10.14.3
・docker 20.10.5
・Ubuntu 18.04
・Python 3.8.1
・Django 3.1.7

#注意
- あくまで「個人利用」での環境における話です。商用利用などの場合は当てはまらないケース（DBの向き不向きや利用可否など）があります。
- あくまでも、**個人利用の上でdjangoのチュートリアルを実施する場合**の記述になります。
- 実際に初めてDockerを使ってみた上での記述です。誤りや勘違いが含まれている可能性があります。
- そもそもこの記事が人生初qiita記事です。不慣れな点ばかりですが、ご指摘等いただけましたら幸いです。


###ポート指定してコンテナをたてないとダメ
- ホストのポートとコンテナのポートが紐づいていないとアクセスできないため、指定する必要がある。
- 以下では、「ホスト：コンテナ」としてオプションで指定している。

```
docker run -it -d -p 8000:8000 --name myubuntu ubuntu:18.04
```

・上記におけるオプション`-p 8000:8000`にてポートを指定
　※参考：[DockerとDjango：runserverしてもlocalhostにアクセスできない](https://teratail.com/questions/235303)

・runserverするときにポート指定することに留意

```
python3 manage.py runserver 0:8000
```
ブラウザにて http://localhost:8000/ にアクセスが可能となった

###「MySQL」は相性が悪そうなので使わない

- 「使い慣れている（つもり）」のMySQLにしておこう。という理由のみで使おうとしたが、様々な面で詰まった。
- 推奨しない方も多いように見受けられるので使わない。
- どのような点に詰まったかは以下の通り。

・MySQLのrootユーザの情報はdjangoでは扱えない場合がある（別のユーザを登録する必要がある）
　※参考：[pythonでmysqlに接続できない](https://teratail.com/questions/83388)

・匿名ユーザが邪魔をすることがあり手間がかかる
　※参考：[MySQLの罠？ユーザー名指定しても匿名ユーザーログインになる](https://qiita.com/RyutaKojima/items/fe039a5a718dd51d6fa7)

・SQLlightであればあれこれ設定しなくてもdjangoのチュートリアルがスムーズに進められる
> SQLite を使っている場合は、前もってすることはありません。必要であればデータベースファイルが自動で生成されます。

 ※参照：[はじめての Django アプリ作成、その2](https://docs.djangoproject.com/ja/3.1/intro/tutorial02/)


###タイムゾーンで詰まる
- django のチュートリアルでは、タイムゾーンを変更する手順がある。
- Django側では`UTC`から`JST`に変更しても、OSの設定が`UTC`のままである場合に設定の差異が生まれる。
- Ubuntu と django で、`UTC`か`JST`どちらかに揃える必要がある
- どのような点に詰まったかは以下の通り。


> mysite/settings.py を編集する際、 TIME_ZONE に自分のタイムゾーンも設定します。

 ※参照：[はじめての Django アプリ作成、その2](https://docs.djangoproject.com/ja/3.1/intro/tutorial02/)



・チュートリアル中の以下の場面でadminの画面にアクセスができなかった。

> 開発サーバーの起動¶
Django adminサイトはデフォルトで有効化されます。開発サーバーを起動して探索を始めましょう。

 ※参照：[はじめての Django アプリ作成、その2](https://docs.djangoproject.com/ja/3.1/intro/tutorial02/)

・mysite/settings.py で編集したTIME_ZONEを`UTC`に戻すことで接続できるようになった。


#おわり
今の所上記の点に詰まりつつ解消しつつチュートリアルを進めている。が、あくまでチュートリアルを行うにあたっての設定が多いので、今後の作り込みに置いてこの設定のままではいられないこともあるのかなと怯えている。
WSL上のVSCodeでターミナルが開かなかった

# はじめに
VSCodeのリモートWSLでWSL上のプロジェクトを開いたときのこと、
いつもなら`ctrl + shift + @`でターミナルが開けるはずが、ターミナルウィンドウとカーソルが現れるだけでした。
色々見たところ、「**新しい統合ターミナルを作成（ローカル）**」というコマンドを見つけました。
コマンドパレットから実行すると、ちゃんとターミナルが開きました。

`ctrl + shift + @`には「新しい統合ターミナルを作成」が設定されており、
リモートWSLではローカルの方でなければ開かないようです。

# 環境
*Windows10 19042.867*
*VSCode 1.55.0*

# キーバインド追加
`ctrl + shift + @`をWSL用に定義します。
コマンドパレットを開き、`keyboard`などと打ち、キーバインド設定をJSONで開きます。
@は`oem_3`なので、`ctrl+shift+oem_3`の設定を追加します。
whenの部分で、`remoteName == 'wsl'`とし、WSLのときにローカルのターミナルを開くようにします。

```json:keybindings.json
[
    {
        "key": "ctrl+shift+oem_3",
        "command": "workbench.action.terminal.newLocal",
        "when": "terminalProcessSupported && remoteName == 'wsl'"
    },
]
```

# おわりに
デフォルトでは何も追加しなくても開いてたような気がしましたが、気づいたらできなくなっていました。
拡張機能を入れたり消したりしてたので、その影響かもしれません。
この程度なら再インストールするよりキーバインドを追加した方が簡単ですね。
phpでmysqlに接続する時にアホハマりした話

もうイヤほどやってるWordpressの構築にまたハマった。

正しい設定してるのにエラーが出るのである。

```
Uncaught PDOException: SQLSTATE[HY000] [1045] Access denied for user 'wp_yakitori_user'@'localhost'
```

```appache:wp_config.php
define( 'DB_NAME', "wp_yakitori_db" );
define( 'DB_USER', "wp_yakitori_user" );
define( 'DB_PASSWORD', "s2wC4hPft$c" );
```

**なぜ！？**

# 問題の切り分け
apache？MySQL？php？SElinux？

### こういうときは大体SELinux

```bash
getenforce 
Disabled
```
**違った**

### MySQLのパスワード間違えてる疑惑

```bash
mysql -u wp_yakitori_user -p
Enter password: （s2wC4hPft$c）
Welcome to the MySQL monitor.  Commands end with ; or \g.
```

**合ってる**

### localhostへのアクセスが禁止されている疑惑

```sql:mysql.user
SELECT host,user from user;
+-----------+------------------+
| host      | user             |
+-----------+------------------+
| localhost | mysql.session    |
| localhost | mysql.sys        |
| localhost | root             |
| localhost | wp_yakitori_user |
+-----------+------------------+
```

**設定してある...**


### phpで繋げない疑惑

とりあえずphpをコマンドライン上で実行してみる

```bash
root@htdocs php -r '$dbh = new PDO("mysql:host=localhost;dbname=wp_yakitori_db;charset=utf8mb4", "root", "9XIJK39MGCG");'
root@htdocs
```
**いける**

```bash
root@htdocs php -r '$dbh = new PDO("mysql:host=localhost;dbname=wp_yakitori_db;charset=utf8mb4", "wp_yakitori_user", "s2wC4hPft$c");'
root@htdocs PHP Notice:  Undefined variable: c in Command line code on line 1
PHP Fatal error:  Uncaught PDOException: SQLSTATE[HY000] [1045] Access denied for user 'wp_skrmc_user'@'localhost' (using password: YES) in Command line code:1
Stack trace:
#0 Command line code(1): PDO->__construct('mysql:host=loca...', 'wp_yakitori_user', 's2wC4hPft')
#1 {main}
  thrown in Command line code on line 1
```
**wp_yakitori_userだとAccess deniedエラー、何故？**
Undefined variable cって何？
というか何かコンストラクタがおかしい

よく見たら第三引数が変なところで切れている
ドルマークが悪さしているようである

なんとなく見えてきたがパスワードを変更する

```sql
set password for 'wp_yakitori_user'@'localhost' = 's2wC4hPft&c';
```

確認

```bash
root@htdocs php -r '$dbh = new PDO("mysql:host=localhost;dbname=wp_yakitori_db;charset=utf8mb4", "wp_yakitori_user", "s2wC4hPft&c");'
root@htdocs
```
**いけた**

**そもそもphpで文字列に$マーク使うの注意しろよって話**

**おわり。**
Yii 環境構築 with PostgreSQL

#PostgreSQLログイン

```
psql -h localhost -U postgres
```

#Yiiその他メモ

マイグレーションを適用するときにオプションつける
./yii migrate --interactive=0 --env="local"

#Yiiマイグレーション

https://www.yiiframework.com/doc/guide/2.0/ja/db-migrations#creating-migrations


#PostgreSQLコマンド

https://qiita.com/Shitimi_613/items/bcd6a7f4134e6a8f0621

#.shをlinuxで実行

```
sh script.sh
```

https://k99-tech.com/blog/archives/22
ページトップへ戻るボタンの作成

①hederの中に下記を記載する
```<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.6.4/css/all.css">```


②bodyの中に下記を記載する
```<div id="page_top"><a href="#"></a></div>```

③CSSに下記を記載する
#page_top{
  width: 50px;
  height: 50px;
  position: fixed;
  right: 0;
  bottom: 0;
  background: #3f98ef;
  opacity: 0.6;
  border-radius: 50%;
}
#page_top a{
  position: relative;
  display: block;
  width: 50px;
  height: 50px;
  text-decoration: none;
}
#page_top a::before{
  font-family: 'Font Awesome 5 Free';
  font-weight: 900;
  content: '\f102';
  font-size: 25px;
  color: #fff;
  position: absolute;
  width: 25px;
  height: 25px;
  top: -5px;
  bottom: 0;
  right: 0;
  left: 0;
  margin: auto;
  text-align: center;
}
Jekyllでpostにあるマークダウンをレンダリングなしで出力したい

Jekyllはpostにあるマークダウンを`{{ content }}`にレンダリングして埋め込んでくれるのですが、このマークダウンをRAWデータとして埋め込みたいときの解決策

調べても出てこなかったので残しておきます。

# やり方

なにもしない"無"のレンダラーを自作します。

`_plugins`というフォルダを作ります。そこに適当なRubyファイルを作り、以下のコードを打ちます。

```ruby:_plugins/unrendered.rb
class Jekyll::Converters::Markdown::ProcessorUnrendered
  def initialize(config)
  end
  def convert(content)
    content
  end
end
```

次に、`_config.yml`でこのレンダラーを使うように設定します。

```yml:_config.yml
markdown: ProcessorUnrendered
```

以上です。

注意ですが、Front Matterは出力されません。
つまり、

```markdown
---
layout: default
---

# Hello
[Google](https://google.com)
```

というファイルは

```
# Hello
[Google](https://google.com)
```

このように出力されます。

# 何に使うの？

スライド資料を作れる[`Reveal.js`](https://revealjs.com/)と組み合わせるときに使うといい感じになります。

```html:slide.html
<div class="reveal">
  <div class="slides">
    <section data-markdown data-separator="^\r?\n---\r?\n$" data-separator-vertical="^\r?\n--\r?\n$">
      <script type="text/template">
        {{ content }}
      </script>
    </section>
  </div>
</div>
```

こんな感じで使う

# 参考にしたものなど

[Markdown Options](https://jekyllrb.com/docs/configuration/markdown/#custom-markdown-processors)
公式のやつです。カスタムmarkdownプロセッサについて詳しく書かれています


以上
Oracle Cloud Infrastructureで「ORA-12170」出現！さてどうする？

##それはある朝突然に
微妙に忙しくてひーこらしていた月曜のことでした。クライアントさんから「システムが開かない」という連絡が。これ、Oracle Cloud Infrastructure（以下OCI）上にRDBMS置いてるんですが、そこへの接続エラーだったんですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324863/fd673d56-b41d-7564-37f3-b256cd58c323.png)
（画像出典：Pixabay）

当然ですが、先週までは問題なく使えていたシステムですので。原因を探るべくいろいろ確認してみました。
###Webコンソールからは異常なし？
まず、OCIのWebコンソール（って言うのかしら）から、データベースノードの状態を確認してみました。ステータス見た限り起動はしてるっぽいです。ですが、SSH接続が出来ません。
###手動で起動をかけてみる
このシステム、データベースノードを夜間止めてます。起動とかシャットダウンは、こちらのサーバ上にあるシェルスクリプトで、cronからキックしてます。ですので、そのシェルスクリプトを直打ちで再起動かけました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324863/6a007ebd-2903-130d-4c96-e35cd8da4fa5.png)（画像出典：Pixabay）
が、やっぱ、だめぽ。
##Oracleサポート騒動記？
でまあ、Oracleサポートに連絡を試みたのですが。なんか、いろいろめんどくさくて使いづらい（のはあそこの伝統だと思ってる）というわけで。ここで大した解決策を見出すことはできませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324863/07cb1c6a-bd5e-2ec8-08d6-4419cf987ac9.png)（画像出典：Pixabay）
時間だけが行き過ぎる。
##問題の整理
考えられそうな問題は
- OCI本体のエラー（先日大規模なのが発生した）
- 通信ルールがどっかでリセットされた(TCPポート1521と23だったかがダメ）
あたりかなと。

とりあえず、先日大規模なのが発生したらしいのですが、OCIのトラブルの可能性を考えて、[こちらのサイト](https://ocistatus.oraclecloud.com/)からチェックを試みました。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324863/e0e7e04d-d793-659d-e7f5-3b7cbdc9a634.png)
あ、画像はトラブル発生時のものではありませんが、正常が確認されました。序に、コールドスタンバイ用の別データベスノードを起動、こちらは生きてましたので、OCIのトラブルという可能性は消えました。
Webコンソールから通信ルールもチェックしたんですが、これも勝手に変更とかされてはいませんでした。ついでに、SQL Developerからのアクセスを試みましたら。できません。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324863/962ad569-4d51-3a17-7717-235ccada8d0c.png)
エラーコードちょっと変わったっぽいんですが。大勢に影響はなさそうです。ううう、なんなんだこれ。

##こんなときにはノードの再起動
というわけで、Webコンソールは生きていることがわかりましたので。そこから、だめもとで手動でデータベースノードの再起動を実施しました。シャットダウンに、通常よりえらく時間がかかりましたが。再起動は無事完了。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324863/db7cba31-b5e5-2f6d-8cee-88fc92423717.png)
（画像出典：Pixabay）
たぶん、Oracle本体に原因を確認しても「わかりません」で終わる気がします。おそらくなんですが、データベースノードの起動の最中に、なんらかの不幸な出来事が発生。うまく起動はできなかったのですが、Webコンソール上からは起動しているように見えた、って感じなんでしょうね。
##まとめます
Oracle Cloud Infrastructureで、前日まで稼働できていたシステムに「ORA-12170」でアクセスできなくなったときは
    - 何はなくともノードの再起動
    - それでダメなら致命的な問題の可能性
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324863/b97b6a3a-bc12-40f0-13ca-5f2e400b8887.png)（画像出典：Pixabay）
身も蓋もありませんね。
notes 入力した文言が含まれるフィールドを一覧表示

Sub Initialize
	
	Dim ss As New NotesSession
	Dim db As notesDatabase	
	Dim ws As New NotesUIWorkspace
	Dim col As NotesDocumentCollection
	Dim doc As NotesDocument
	Dim askme As Variant
	Dim srchword As String
	Dim Ref As Variant	
	Dim Result As Variant
	Dim Result2 As Variant
	Dim Result3 As Variant
	Dim j As Integer
	
	Set db=ss.CurrentDatabase	
	
	Dim PathText As String
	Dim fileNum As Integer
	Dim onflg As Integer
	onflg=0
	
	fileNum% 				= Freefile()	
	PathText				="c:\temp\ワードサーチの結果"+".csv"	
	Open PathText For Output As fileNum%	
	
	askme = ws.Prompt (PROMPT_OKCANCELEDIT, _
	"対象文書を選択し、検索ワードを入力してください", _
	"検索ワード")
	If askme="" Then
		Goto ObjNull
	End If
	
	Set col  = db.UnprocessedDocuments
	Set doc	=Nothing
	Set doc=col.GetFirstDocument
	Do While Not(doc Is Nothing)
		Forall i In doc.Items
			Ref=Instr(1,i.text,askme,5)
			If Ref>=1 Then
				Result=Result+i.name+","+i.text+"¶"
				onflg=1
			End If				
		End Forall			
		Set doc=col.GetnextDocument(doc)			
	Loop
	
	
	
	If onflg=1 Then
		If Len(Result)>=1 Then
			Result=Left(Result,Len(Result)-1)			
		End If
		Result2=Split(Result,"¶")		
		Result3=Arrayunique(Result2)
		
		For j =0 To Ubound(Result3)
			Print #fileNum%,Result3(j)
		Next
		Close fileNum%	
	Else
		Close fileNum%	
		Msgbox "1件もヒットしませんでした。"
		Goto ObjNull
	End If	
	
	
	Dim XObj As Variant
	Dim XBook As Variant
	Dim XSheet As Variant
	
	Set XObj 					= CreateObject("Excel.Application")
	XObj.DisplayAlerts			= True
	XObj.Visible 				= True
	XObj.DisplayAlerts = False
	
	Set XBook				= XObj.Workbooks.add
	XBook.Saved			= True
	
	
		'Call XBook.SaveAs(Prodoc.AnalysisfileExcel(0),-4143)	
	Set XSheet 				= XObj.Workbooks(1).Worksheets(1)  	
	XSheet.Activate		
	XSheet.Range("A1").Select
	
	
	
	
		'/外部データの取込
	With  XSheet.QueryTables.Add("TEXT;"+PathText, XSheet.Range("A1"))
		.Name 						= ""
		.FieldNames 				= True
		.RowNumbers 				= False
		.FillAdjacentFormulas 	= False
		.PreserveFormatting 		= True
		.RefreshOnFileOpen 		= False
		.RefreshStyle 			= 1		
		.SavePassword			= False
		.SaveData					= True
		.AdjustColumnWidth		= True
		.RefreshPeriod			= 0
		.TextFilePromptOnRefresh	= False
		.TextFilePlatform			= 932
		.TextFileStartRow		= 1
		.TextFileParseType		= 1
		.TextFileTextQualifier	= -4142 
		.TextFileConsecutiveDelimiter	= False
		.TextFileTabDelimiter			= False
		.TextFileSemicolonDelimiter 	= False
		.TextFileCommaDelimiter 		= True
		.TextFileSpaceDelimiter 			= False
			'.TextFileColumnDataTypes 		= CellDataType
		.TextFileTrailingMinusNumbers 	= True
		.Refresh		
	End With
	
	XSheet.Range("A1").Select
	
ObjNull:
	
	Set XObj =Nothing
	Set XBook =Nothing
	Set XSheet =Nothing
	Set ss =Nothing
	Set db =Nothing
	Set ws  =Nothing
	Set col   =Nothing
	Set doc  =Nothing
	Set askme  =Nothing
	Set Ref  =Nothing
	Set Result   =Nothing
	Set Result2   =Nothing
	Set Result3   =Nothing	
	
End Sub
Raspberry Pi Imagerを使って4GPiのOSイメージを簡単カスタマイズ

こんにちは。メカトラックスの@mtx06です。

以前@kiyonagaがRaspberry Pi Imagerを用いて4GPiのOSイメージをSDカードに書込む方法についてご紹介しました。

https://qiita.com/kiyonaga/items/73fa842ddcde0e028294

今回はRaspberry Pi Imager(v1.6)に新しく追加されたOSイメージのカスタマイズ機能についてご紹介します。

https://www.raspberrypi.org/blog/raspberry-pi-imager-update-to-v1-6/

この機能を使って、4GPiのOSイメージ([4gpi-buster-lite-20210327.img](https://github.com/mechatrax/4gpi/blob/master/os/4gpi-buster-lite-20210327.md))[^1]に
Wi-Fi接続とsshサーバ有効化のカスタム設定を追加してみます。

#目次
[準備したもの](#準備したもの)
[OSイメージのカスタマイズ手順](#osイメージのカスタマイズ手順)
[動作確認](#動作確認)
[まとめ](#まとめ)

# 準備したもの
* Raspberry Pi 3 Model B
* ノートパソコン
* SDカード
* [Raspberry Pi Imager(v1.6以降)](https://www.raspberrypi.org/software/)
* 4GPiのOSイメージ([4gpi-buster-lite-20210327.img](https://github.com/mechatrax/4gpi/blob/master/os/4gpi-buster-lite-20210327.md))[^1]

# OSイメージのカスタマイズ手順
1. SDカードをノートパソコンに接続します。
2. Raspberry Pi Imagerを起動し、[Operating System > Use custom]を選択して  
使用するイメージを選択します。
3. Raspberry Pi Imagerのウィンドウがアクティブな状態で`Ctrl`+`Shift`+`X`を押します。  
するとオプションウィンドウが出現するので、ホスト名とssh接続パスワード、Wi-Fi設定（SSID・Password・Wifi country）を使用環境にあわせて設定します。
![カスタマイズ1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1283849/c4908878-8e9d-5e9c-7c15-88e1352df631.jpeg)
![カスタマイズ2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1283849/5d438425-9536-bd68-9247-6a3086c0433e.jpeg)
4. 設定を保存[SAVE]し、[Storage]でSDカードを選択して、書き込みます[Write]。

# 動作確認
書き込みが完了したSDカードをRaspberry Piに接続し、電源を入れて起動します。
設定が正しければ、Raspberry Piは自動的に無線でLANに接続するはずです。

ノートパソコンでsshクライアントを立ち上げてRaspberry Piにログインしてみます。
![ssh接続.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1283849/e3542911-2430-9508-a627-c56540b304c0.jpeg)

無事接続できました。

# まとめ
Raspberry Pi Imagerを使うと、4GPiのOSイメージ[^1]を簡単にカスタマイズできます。
Wi-Fi接続やsshサーバ有効化のほかにも以下のような設定も可能です。

* オーバースキャン無効化
* ロケール設定（タイムゾーン・キーボードレイアウト）

ぜひご活用ください。

[^1]: 4GPiのOSイメージはRaspberry Pi OSをベースに作られています。
Azure IoT開発環境のため、Raspberry Pi(ARM64 OS)でAzure CLIインストール

# 概要

Azure CLIはRaspberry PiのようなARM基盤ではまだ正式サポートしてないですが、使える方法があるため、紹介したいと思います。
言うまでもないですが、検証で使ってください。

# 準備

[Ubuntu Server 20.04.x LTS ARM64 インストール](https://qiita.com/motoJinC25/items/5696e25e7d445a7d7817)

# インストール

```bash
$ curl -L https://aka.ms/InstallAzureCli | sudo bash
```

## 確認

`初期化ファイル(.bashrc)の再読み込み必要`

```bash
$ az login
```

# 拡張機能インストール

``` bash
# Azure IoT Hub と Azure Digital Twins
$ az extension add --name azure-iot
# Azure Time Series Insights
$ az extension add --name timeseriesinsights
```
Azure Machine Learning デザイナーでデプロイしたモデルをAPIとして利用する

# はじめに
Azure Machine LearningのAuto MLやデザイナーでモデルを簡単に作れることは分かったけど実際どうやって利用するのかに関しては情報が探しづらいため残しておきます。

# モデルのデプロイ
今回はデザイナーを例にとります。デザイナーでモデルのデプロイをする際にはその推論パイプラインを丸ごとデプロイすることになります。Webのエンドポイントとしてデプロイする際には`Web Service Input`と`Web Service Output`が必要になります。このモジュールを追加しておくことによってエンドポイントに対するリクエストを受け付け、推論パイプラインからの出力を受け取ることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205918/0de59d66-a7cb-bbce-120d-b5d26f95ca12.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205918/eafc70d1-7df8-699e-4fe6-e607f5c41291.png)

デプロイは画面右上のデプロイボタンから実行します。これを押下することでAzure Container InstanceもしくはAzure Kubernetes Service上に展開できます。テスト環境であればACI、本番環境であればAKSのような使い分けのイメージです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205918/693ad3c3-b355-bec9-adaf-efe7c3a5bd30.png)

エンドポイントの設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205918/329b3fd6-d94a-35ff-4140-c965a58d0c0d.png)

エンドポイントをデプロイすると、Azure Machine Learningのワークスペースから参照できるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205918/46af38ee-3170-02c3-11c0-5930bd96d250.png)

# エンドポイントの使用

[テスト]タブから新しいデータに対する推論結果をテストすることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205918/ef8d35b2-19ef-9c75-b8e2-89b29b7926e4.png)

[使用]タブでは、実際にアプリケーションに組み込む際にそのまま利用できるC#,Python,Rのサンプルコードが用意されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205918/deef524c-24ed-0065-3d8d-4a9d0a0ef632.png)

pythonコードを見てみると以下のJSONをエンドポイントに投げればよいことが分かります。

```python:payload.py
data = {
    "Inputs": {
        "WebServiceInput0":
        [
            {
                '年月日': "2020-10-01",
                '曜日': "木",
                '平均気温(℃)': "21.9",
                '最高気温(℃)': "27.7",
                '最低気温(℃)': "17.7",
                '降水量の合計(mm)': "2",
                '最深積雪(cm)': "0",
                '平均雲量(10分比)': "4.3",
            },
        ],
    },
    "GlobalParameters": {
    }
}
```

念のためHTTPリクエストのクライアントアプリであるPOSTMANからPOSTできることを確認します。リスト末尾の項目の後ろについているカンマを取り除かないとスキーマのエラーになるのでご注意ください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205918/b0b69e7a-f0b7-5d36-114e-6d87e72e172e.png)

以下のようにresponseが返ってくることを確認しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205918/3966222b-dec3-06f0-a572-5bdcdc97514b.png)

# おわりに
APIとして公開してしまえばあらゆるアプリケーションから呼び出して使うことができます。デプロイまでの流れが簡潔かつすぐに展開できてしまうのでその辺りもAzure MLの強みですね。

## リアルタイム推論 vs バッチ推論
リアルタイム推論パイプラインのデプロイはリアルタイム性を担保するため、AKSもしくはACI上にデプロイされます。一方でバッチ推論パイプラインはパイプラインエンドポイントという少し異なる仕様になるようです。アプリケーションとリアルタイムに相互通信する場合はリアルタイム推論を利用し、バッチ的にデータを投入しオンデマンドで分析する場合にはパイプラインエンドポイントを利用すればよさそうです。リアルタイムの場合はAKS等が走るのでそれらのインスタンスの時間課金が発生します。バッチ推論については調査中です。
アーキテクチャについて

#はじめに
この記事では、アーキテクチャについて簡単にまとめました。
⚠️当方初学のため認識違いがある可能性大です
誤りを見つけた際はコメントにて指摘していただけると幸いです🙇‍♀️🙇‍♂️


#参考
この記事は、以下の情報を参考にして執筆しました。

- [プログラミング用語解説](https://gimo.jp/glossary/details/architecture.html#:~:text=%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3%E3%81%A8%E3%81%AF%E3%80%81%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%AE,%E6%A7%8B%E9%80%A0%E3%82%92%E6%8C%87%E3%81%99%E8%A8%80%E8%91%89%E3%81%A7%E3%81%99%E3%80%82)


#アーキテクチャとは
アーキテクチャとは、プログラミングの過程において、開発するソフトウェアの用途や目的に応じて、変数や関数、クラスやアルゴリズム等のプログラムを構成する要素どのように組み合わせるか、といったプログラムの構造を指す言葉。


#なぜ使うのか
責務を適切に分離するため。
依存関係に明確なルールを設けることでリファクタリング等の際、予期せぬエラーが出ることを未然に防ぐため。


#アーキテクチャの種類
ここでは、主なアーキテクチャをいくつか紹介します。

###MVC
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790168/174122b9-4e04-832d-8eae-a7c60817086f.png)
(https://developer.apple.com/library/archive/documentation/General/Conceptual/DevPedia-CocoaCore/MVC.html から引用)
￼
###MVP
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790168/0c3b29df-2a0a-72ad-7ac6-e19ecba54fbd.png)
￼(https://dev.classmethod.jp/articles/backbonejs-mvp/ から引用)

###MVVM
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790168/c8eecb0d-df3e-cdaf-46a6-8f6bf1234092.png)
(https://www.keyman.or.jp/kn/articles/1906/26/news033.html から引用)

###Flux
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790168/6352ea86-abe5-7806-ff89-b292c502e9dc.png)
(https://facebook.github.io/flux/docs/in-depth-overview/ から引用)

###Clean Architecture
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790168/21ac3bdd-4979-c722-c75e-b8be8ea35fb2.png)
（https://qiita.com/nrslib/items/a5f902c4defc83bd46b8 から引用）
￼
###Redux
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790168/108d346e-3f14-7a10-4e44-4f7aedfee0a5.png)
（https://blog.catalyst-system.jp/userful-004/ から引用）

###VIPER
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790168/013f6aa7-7524-8fda-f389-be5dac284cc6.png)
（https://qiita.com/hicka04/items/09534b5daffec33b2bec から引用）
AWS環境のお片付けで引っかかること

AWSで構築していた環境を破棄するために諸々の削除を進めている中で２つ引っかかっったことを書き残す


#1.RDSのシステム取得スナップショットは手動で削除できない

RDSのDBインスタンの設定でメンテナンスを自動実行していた場合に取得されるスナップショットがDBインスタンスを削除したあとに消そうとしてもできなかった。
原因不明のためサポートに問い合わせ中

↓　追記

下記で回答を得たため実施したところ無事削除できた。

>
保持されている自動バックアップを削除するには
>
1. AWS マネジメントコンソールにサインインし、Amazon RDS コンソール (https://console.aws.amazon.com/rds/ ) を開きます。
2. ナビゲーションペインで、[Automated backups (自動バックアップ)] を選択します。
3. Retainedタブで、削除する保持された自動バックアップを選択します。
4. [アクション] で、[削除] を選択します。
5. 確認ページで、「delete me」を入力し、[Delete (削除)] を選択します。
```
>
もしも上記の手順で当該システムスナップショットを削除できない場合はその旨をご共有ください。その際には合わせて以下の AWS CLI コマンドの実行結果をご共有いただけますと幸いです。
>
```
aws rds describe-db-instance-automated-backups --db-instance-identifier subak-arm
```



#2.CloudWatchのメトリクスは手動で削除できない

こちらのテクニカルサポートノートによると手動削除をできず、有効期限が自動的に切れるのを待つ必要があるとのこと。

https://dev.classmethod.jp/articles/tsnote-support-cloudwatch-delete-metrics-launch-001/
Vite + Docker環境で無限リロード編に突入してしまうときの対処法

# 結論
port `24678`を割り当てる

# 経緯
SvelteKit + Dockerで環境構築していたら、ソースコードに何も変更を加えていないのに無限にホットリロードが発生する問題に出くわした。(SvelteKitはバンドルツールにViteを用いている)

環境は以下の通り

- Vite 2.1.5
- @sveltejs/kit 1.0.0-next.71
- @sveltejs/vite-plugin-svelte 1.0.0-next.5

```yaml:問題が発生したときのdocker-compose.yml
version: '3'
services:
  web:
    image: node:14-alpine
    working_dir: /app
    volumes:
      - ./:/app
    ports:
      - 3000:3000
    command: npm run dev
```

こちらのissueを参考にした。どうやら、Viteは`ws://localhost:24678`を参照しにいくらしい。このポートを開けていないがために、無限にリクエストが飛び、無限にホットリロードが発生してしまっていた模様。

https://github.com/sveltejs/kit/issues/844

# 解決法
```yaml
version: '3'
services:
  web:
    # (中略)
    ports:
      - 3000:3000
      - 24678:24678 # <--- 追加
    command: npm run dev
```
JS~if文②~

# ①　a && b
aとb両方Trueのとき、全体がTrueになります。

#②　a || b
aとbどちらか一方がTrueのときに全体がTrueになります。

#③　!a
aがfalseのときにTrueになります。

```index.html
 <script>
    'use strict'

    const time = new Date().getHours();


  if (time >= 18 && time < 22) {
    window.alert('お疲れ様です');
  } else if (time === 10 || time === 15) {
    window.alert('もうひと頑張りですね！');
  } else {
    window.alert('ファイト！！')
  }
  </script>
```

今回はブラウザを開いたときに表示されるメッセージを固定にしたいと思います。
時間は適当に指定しました。

New.Dateで現在の日時を取得します。また、getHoursメソッドで時間を0~23時の整数で返します。
Gitのコミットを取り消したい

* 直前のコミットをなかったことにする  
```  
$ git reset --hard HEAD~  
```  
* 直前のコミットをなかったことにしてインデックスに戻す  
```  
$ git reset --soft  
```  
* addした変更を作業ディレクトリに戻す  
```  
$ git reset  
```