OmniAICreator/Qiita-1.07M huggingface dataset:
【Win32】WindowsAPIを利用したC++自作ソフトにおける描画乱れ

#トラブル内容
WindowsAPIを利用したC++自作ソフトを起動後、10分ぐらい放置するとスタティックコントロールの色が乱れ始めた。

＜正常時＞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1989967/650c8c14-9aea-2008-602a-a4cf506d2b21.png)
＜異常時＞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1989967/a98713f9-d6ee-7322-e1ea-6e562b7aa628.png)

#原因
色塗りを行うために、CreateSolidBrush関数でブラシを作成していたが、ブラシ作成後削除していなかった。
ソフトは定期的に色塗りを自動で行うようにしており、ブラシ作成 → 未削除 が繰り返し発生したため、ブラシが大量に残った。
これによって、GDIオブジェクトが大量に生成され、オブジェクトの枯渇によってスタティックコントロールの色が乱れ始めた。


```cpp
int Coloring(){
    HBRUSH BrushYellow;
    BrushYellow = CreateSolidBrush(RGB(255, 242, 0));  //黄色のブラシを作成
    // 色塗りを実施(省略)
}
```

最初は問題ないにもかかわらず、ある時点から描画が乱れるという場合には、WindowsのGDIオブジェクトが大量に消費されて枯渇している可能性がある。 

＜正常時のタスクマネージャーの状態 GDIオブジェクト数:159＞
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1989967/a5f890b6-f3f4-04e2-8648-262b354a1580.png)
＜異常時のタスクマネージャーの状態 GDIオブジェクト数:9999＞
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1989967/0a5498ae-2397-e2d6-bc60-774e5adba349.png)

#対策内容
①色塗り実施後に、DeleteObject関数でブラシを削除する。

```cpp
int Coloring(){
    HBRUSH BrushYellow;
    BrushYellow = CreateSolidBrush(RGB(255, 242, 0));  //黄色のブラシを作成
    // 色塗りを実施(省略)
    DeleteObject(BrushYellow);
}
```

②必要なブラシは事前に作成し、以降、ブラシを作成しないような作りに変更する。
　具体的には、ブラシの作成はソフト起動時のみ、ブラシの削除はソフト終了時に実施するように変更する。

#参考
http://www.astec-x.com/FAQ/restrict_gdi_region.html
JLCPCBで基板実装（PCBA）するときに注意したいこと

# この記事について

回路設計もしたことなかった私が、[JLCPCB](https://jlcpcb.com/)で基板の実装サービスを利用したときに経験した失敗談です。

KiCad[^1]で回路設計し、JLCPCBに注文するまでの基本的な流れは、[KiCadで]JLCPCBにPCBAを発注する手順[^2]を参考にさせていただきました。

[^1]: [KiCad](https://www.kicad.org/)
[^2]: [[KiCadで]JLCPCBにPCBAを発注する手順] (https://qiita.com/platypus5384/items/605e28d0cd89402a8672)

# 失敗談

注文する前にJLCPCBのFAQs[^3]を確認しても、理解できなかったです。
失敗してみると、ちゃんと書いてあったんだなぁという感じです。
[^3]: [JLCPCB FAQs SMT Assembly](https://support.jlcpcb.com/category/78-smt-assembly)


## 失敗１：　回路がショートしてた
#### レイアウトし直した後は、再度、詳細チェック！

小さい基板を複数作成したいときに、複数の基板を１枚のボードにまとめて注文することがあります。これを、面付けと言い、同じ回路図の基板を複数まとめることを同種面付けと言います。
私は、この同種面付を行う際、KiCad においてミシン目を使って面付けをする[^4]を参考にしたのですが、基板のレイアウトを修正しているうちに、意図せず１つの配線をずらしてしまったのです。
両面基板だったので、裏側で回路が全部繋がっていました。


[^4]: [KiCad においてミシン目を使って面付けをする](https://qiita.com/BotanicFields/items/973794b7ba5a4c6071ea)


## 失敗2：　部品の型が違った
#### データシートは、必ず丁寧にチェック！

JLPCBで基板実装の再注文をするとき、部品欠品で購入履歴から再注文ができないことがよくあるんです。
部品はいつ調達される予定なのか分からないので、別の部品に差し替えるのですが、部品の写真とデータシートをざっとチェックして注文すると全く型の違う部品でした。
部品の一辺一辺、ひとつづつ丁寧に確認しましょう。

## 失敗3：　部品の向きが逆

座標ファイルには、部品の配置座標や取り付け向きが記載されているおですが、KiCadが出力したものを信じてしまっていました。
しかし、部品は基準になる向きがそれぞれ異なるので、JLCPCBにて各部品の基準となる向きを調べないといけないようなのです。
![スクリーンショット 2021-09-10 13.59.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517188/db9dddfc-f260-db52-0422-abf9f4a9097d.png)

ピンヘッダーでも向きが違います。
![スクリーンショット 2021-09-10 13.52.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517188/7d7e81e0-0c68-4c7b-9021-1b8d23c6daf5.png)
座標ファイルのRotationには、黒背景の図の部品を何度**反時計回り**に回転させるかを記入しておけば大丈夫そうです。





# おまけ

JLCPCB側のミスもありました。
基板が届いたときに、チェックしましょう！
どちらも部品が基板に対し水平に付けられてなかったです。

### ピンヘッダーが倒れてる

### タクトスイッチが斜め
【ROS】音が途中で止まる

# はじめに

ROS(ROS2ではない)で開発をしているものです。
ROSは用意されているライブラリが多いのですが、環境がPython2で止まっているのでPython3以降のライブラリが使えないという問題点が有ります。そのためROS・Pythonを使って開発をしている場合、音再生にはROSで用意されているsound_playというライブラリを使用します。

# 起こったこと

waveファイルを再生しようとしたのですがなぜか10秒ほど再生したところで止まってしまう...
ソースコード的には間違っていないし、再生も途中で止まるようにはしていないのですが、何故か自動で止まります。
以前はoggファイルに変えるとすんなり解決できたのですが、それも刺さらず...

で、調べていたら既に解決していた（アップデート済み？）でした。しかし私のライブラリはなぜか書き換えられていなかったので手動で書き換えた次第です。

# 解決方法など

https://github.com/ros-drivers/audio_common/issues/96

↑解決済みのソース

既にGitHub上で問題提起されており、開発者が対応済みでした。
しかしながら先程述べた通り私のPCではまだ対処されていなかったので自分で書き直す必要が有りました。

書き直した場所はリンク先にも有りますが、ここです。

```python:/opt/ros/melodic/lib/sound_play
def get_staleness(self):
.....
# ここが0になっていたら1に変える
position = self.sound.query_position(Gst.Format.TIME)[1] 
duration = self.sound.query_duration(Gst.Format.TIME)[1]  

```
管理者権限が必要なのでsudo vimとかで開きます。

で、再度音を再生してみると、最後まで再生してくれるようになりました!!!

一応[最新バージョン](https://github.com/ros-drivers/audio_common)では（というか2020年初期には）修正されているようですがなぜか私のPCは直っていなかったので...
もしまだ音の再生が途中で止まるという方は試してみると良いかもしれません！
R でドットを変換する方法

# はじめに
R で文字列にドットが含まれていた場合、それを変換する方法を調べた。

# `str_replace_all` を用いた変換
以下にサンプルコードを示す。

```R
library(stringr)

dt <- "2021.9.10"
```

この「.」を「/」に変換したい場合、`str_replace_all`を何も考えずに使うと、

```
dt_bad <- str_replace_all(dt, pattern=".", replacement="/")
print(dt_bad)
```

```:出力
[1] "/////////"
```

数字と「.」がすべて「/」になってしまった。この場合、`pattern`の中身を「[.]」とすると解決できる。

```R
dt_good1 <- str_replace_all(dt, pattern="[.]", replacement="/")
print(dt_good1)
```

```:出力
[1] "2021/9/10"
```

もしくは「\\\\.」としても同様の動作をする。

```R
dt_good2 <- str_replace_all(dt, pattern="\\.", replacement="/")
print(dt_good2)
```

```:出力
[1] "2021/9/10"
```

# おわりに
これからもRを扱う上で調べたtipsについては、備忘録も兼ねて記事に残していきたいと思う。
VSCodeでPrettier Apex 

# 前段 - npmエラー解消

まずは昔のゴミか何か残っていてコマンドプロンプト上で`npm install -g npm`が動かない状態だった

```
C:\>npm install -g npm
npm ERR! cb.apply is not a function
```

なので一旦以下を消した
C:\Users\XXX\AppData\Roaming\npm
C:\Users\XXX\AppData\Roaming\npm-cache

そして改めて https://nodejs.org/en/download/ のインストーラを実施して念の為コマンドプロンプトも起動し直したら`npm install -g npm`が動くようになった

# Prettier Apexインストール

もともと拡張機能PrettierはVSCodeに入れてあったがとにかく対象プロジェクトディレクトリにて以下を実行

```
C:\myapexproject>npm install -save-dev -save-exact prettier prettier-plugin-apex
```

# VSCodeのコマンドパレットからPrettier Apexを使ってみる

VSCodeにてApexコード編集中にコマンドパレット(CTRL+SHIFT+P)にて「ドキュメントのフォーマット(Format Document)」を選ぶとフォーマットされた
ショートカットキー「SHIFT+ALT+F」でも行ける

# 保存時にフォーマットされるように設定する

CTRL+,(カンマ)にて設定画面を開き、「設定の検索」で「save」を入力して「Editor: Format On Save」にチェックをつける

Apexコード編集中に保存すると、フォーマットされて、それから組織にソースがデプロイされた

以上
postgresql install 〜スキーマ作成

brew install

起動（電源切った時）
postgres -D /usr/local/var/postgres

db作成（ターミナル上）
createdb drugdb

ユーザー作成（ターミナル上）
createuser drug_user

dbに接続
psql -U drug_user drugdb


create schema drug_user;
ERROR:  permission denied for database drugdb
→スキーマを作成するにはコマンドを実行するロールがスーパーユーザーか、
　　スキーマを作成するデータベースで CREATE 権限を持っている必要がある。


PostgreSQLのロール：
ユーザやグループがデータベースへアクセスすることを管理するための仕組み。
ロールには名前が付けられ、データベース・オブジェクト（テーブルや関数など）を所有し、
他のロールからのアクセスを制限する権限を持つ。
オペレーティング・システムのユーザとは完全に独立したもの。

最初にPostgreSQLが立ち上がるとpostgresという名前のロールが作成されている。
このロールは何でもできるスーパーユーザ。
それで、postgresという名前のロールから他のロールに与える権限の管理が始まる。

例えば、postgresが作成したデータベースに別のロール：Aがアクセスしようとすると、データベースへのアクセスは拒否される。

しかし、データベースを作成して所有者となったpostgresからアクセス権限がAに与えられると、Aはデータベースへのアクセスが可能になる。

権限を与えるなら、
ALTER ROLE 名前　LOGIN;

スーパーユーザー権限を与えるなら、
ALTER ROLE 名前　SUPERUSER;
(その時点でのスーパーユーザーから権限を与える必要があるため、
スーパーユーザーにログインし直さないと、
must be superuser to alter superusersが出る。)
ラズパイとiPhoneのBLE接続時に「Peer removed pairing information」が発生した件

# 概要
　　ラズパイとiPhoneとのbluetooth(BLE)接続テストをしたかった。
　　ラズパイをperipheral、iPhoneをcentralに設定した事例は少ないなか、
　　参考サイトを見つけ、接続テストを実施。
　　テストが終盤に差し掛かった頃、iPhoneとの接続エラーが発生
　　その時のエラーメッセージが「Peer removed pairing information」

# やりたかったこと
 raspberryPiとiPhoneとのbluetooth(BLE)接続テスト

# 機器の前提
　①raspberryPi
　　・raspberryPi4(Model B Rev 1.4)
　　・Raspbianのバージョン：10.10
　②iPhone
　　・iPhoneSE(第１世代)
　　・IOS１４．６

# 接続テスト時に参考にしたサイト
　・[iOS/SwiftUIとRaspberryPi/Bleno間でBluetooth LE通信【１・サーバー編】](https://www.servernote.net/article.cgi?id=swiftui-raspberrypi-bluetooth-le-1)

　・[iOS/SwiftUIとRaspberryPi/Bleno間でBluetooth LE通信【２・クライアント編】](https://www.servernote.net/article.cgi?id=swiftui-raspberrypi-bluetooth-le-2)


# エラー発生の経緯
　①上記の参考サイトに従い、raspberrypiとswiftUIの設定をする。
　　　※書き換える箇所はUUIDぐらいであとはコピペでOK。（ありがとうございます）

　②Bluetoothの動作確認はXcodeのシミュレーターではできないようなので実機でテスト起動
　　　※「信頼されていないデベロッパ」のエラー対処法
　　　→　iPhone → 設定 → 一般 → プロファイルとデバイス管理 → デベロッパAPP
　　　→　デベロッパAPP欄にある自身のアカウントを選択
　　　→　ページ遷移後にもう一度自身のアカウントを選択　→ 信頼　

　③iPhoneのアプリ画面上に「Peer removed pairing information」が発生。
　　code参照し、以下２点を理解
　　　・peripheralのNGであること
　　　・エラーの吐き出し元が「e.localizedDescription」であること

　④エラーを頼りに検索すると、appleのデベロッパ向けページがヒット
　　[Apple Developer Forums](https://developer.apple.com/forums/thread/132488 "CBATTErrorDomain Code=14 "Peer removed pairing information"")

　⑤replyを頼りに、Bluetoothの接続端末を一掃
　　iPhone　→　設定　→ Bluetooth → 自分のデバイスに表示される端末を全削除
　
　⑥iPhoneアプリ上で、再度接続を試すと成功！


　※一度上記対応を終えた後は、その他Bluetoothの機器を接続してもエラーは発生しない。
　※日本語の対処法が無かったので、Qiitaに残します。


以上。誰かの参考になれば幸いです！
Pepper SDK入門(35) LocalizeでPepperに相対的な立ち位置を自覚してもらう

#はじめに
なんだか世知が激辛そうなタイトルですが、あくまでも物理的な意味であり社会的な話は登場しません🍀☕️
PepperはLocalizeAndMapアクションで、ExplorationMapを内部に配置します。つまりLocalizeAndMapアクションを使って周辺環境の地図を作成した後、Localizeで相対位置の情報を保持するのですね。(極局所的)土地勘ゲットだぜ🐭⚡️
ExplorationMapはLocalizeアクションのビルドに使用されます。Localizeアクションが実行されている間、相対的な位置の軌道は保持されたままです！消失したりそこからずれたり、転がったり煮られたりすることはないため安心してください🌷
コード上では以下のようになります↓

```java
//探索マップを取得
ExplorationMap explorationMap = ...;

//アクションをビルド
Localize localize = LocalizeBuilder.with(qiContext)
                                   .withMap(explorationMap)
                                   .build();

//アクションを非同期に実行
localize.async().run();
```

LocalizeAndMapについては次回の記事で、ExplorationMapについても改めて特集しますので、ここでは聞き流しておいてください👂🍃

#Pepperの探し方🕳🔎
Localizeが実行されている間、Pepperは自分の相対位置を保持しています。アプリはrobotFrame.computeTransform(mapFrame)で地図上のPepperの相対位置を知ることができます。
LocalizeAndMapを実行した場所を座標で言うところの(0,0)として、Pepperの現在地を知ることが出来るのです。下にいるのはセーブポイントや黄金比、モノリスの中などさまざまな場所で観測されたPepperです。
![game_savepoint.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574697/99d01a01-0cd3-0b9f-5fc8-ada19902badc.png)<img width="200px" alt="art_ougonhi_nobg.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574697/6c91e140-86e6-0cdd-0e3d-33192b6069b5.png"><img width="160px" alt="landmark_monolith.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574697/a7ea297c-dd6a-d5e8-97f6-2f39afa02630.png">


ちなみにPepperはLocalizeとLocalizeAndMapを実行している時に走行距離の変動を計算して相対位置を割り出しているため、どちらも実行されていない時には相対位置が分かりません。

また、他のアクションが実行されていてLocalizeがアニメーションをスキャンできない場合には、LocalizeはAnimation failedエラーを投げます👻❌

#センサー(ざる)
Pepperの位置を計算して特定するためには、センサーの情報を使用します。主に数メートル先の障害物が見える程度のレーザセンサを使うのでPepperの得られる情報は少な目で、位置を特定しようとしても一貫性のない結果となります。Pepperがウォーリー状態です🦓つまるところ壁際や柱が適度にある場所でないとLocalizeの意味がないため、目印を設置するのがおすすめです🖼🎄📮🛋🛒🗿

なおLocalizeが実行されていない間、長時間前方に移動してその後バックで元の位置に戻ろうとするとホイールの誤差が生じます。

#あとがき
今回も[PepperSDKforAndroid](https://android.aldebaran.com/sdk/doc/pepper-sdk/ch4_api/movement/reference/localize.html)を参考に書かせていただきました。
さらに詳しい情報は、[LocalizeのAPIドキュメント](https://android.aldebaran.com/sdk/doc/javadoc/qisdk/com.aldebaran.qi.sdk.object.actuation/-localize/index.html)を参照してください！

次回のPepperSDK入門は、今回フライングでたくさん登場していたLocalizeAndMapです🕊それでは〜🧟🍥
【20代後半インフラ女子に聞く】未経験からインフラエンジニアを目指した理由

## はじめに
こんにちは、日本リック エンジニア採用チームです。

今回は日本リックの女性エンジニアとして働くKさんのお話です。

Kさんの前職は事務職。そんなKさんが未経験からインフラエンジニアを目指した理由と、転職活動をしていた当時のエピソードをくわしく紹介します。


## 私のプロフィール（20代後半 女子）
### 現在の職種・仕事内容
現在は通信キャリア様の情報システム本部NW構築チームに所属しております。主な業務内容としては国内外拠点のOA系NW、業務システムが接続されるサーバ系NW、システム開発系NWなど、社内イントラネットに関する設計構築業務に携わっております。

### 前職は事務職
前職は事務職にてアシスタント業務等をしておりました。

## 私が未経験からインフラエンジニアを目指した理由
### 通信インフラは必要不可欠なもの
日々の仕事やプライベートを通して、通信インフラは必要不可欠なものであると考えておりました。身近で利用していながらも何故ネットワークへ接続できるのかを知らなかった為、徐々にネットワークの仕組みへ興味を持ち始めていきました。ネットワークの仕組みを調べていくうちに魅力を感じるようになり、通信インフラへ携わる仕事はどのようなものがあるのか調べた結果インフラエンジニアを知り目指そうと考えました。
### キャリアアップやステップアップのチャンスが多い
これまでの職種はある程度のところまで習得するとそれ以上得られるスキルがなくなってしまい、ステップアップが見込めない職種でした。しかし、IT技術は奥が深く多岐にわたるため覚えることは無限にあるかと思います。仕事を徐々にこなし技術を身につけていくと規模の大きな案件を任せて貰えたり、性別問わずステップアップするチャンスは多くあると思います。
## 私が未経験からインフラエンジニアになった方法
### ITスクールにて資格取得
未経験でも資格取得(CCNA)から転職までサポートし、紹介された企業へ転職すると受講料が免除されるというスクールへ行きました。該当のスクールでは1ヶ月で資格取得する必要がありましたが、自分は全く知識がなかったので短期間で取得できるとは到底思えず、数ヶ月前からネットワークの勉強を開始しました。
### 転職活動と日本リックへ就職
資格取得後は転職活動が始まり数社面接を受けました。中でも[日本リック](https://recruit.nipponrick.co.jp/expert-it/)の雰囲気が最も良いと感じられ、自分に合っていると思ったので入社を決めました。入社後も皆さんに優しくサポートして頂き、感謝しています。向上心がある人が多くいて、とても良い会社だと思います。
### 勉強に役に立ったもの
・パケットトレーサー：Cisco機器でNW構築が出来ます、初心者でも使いやすかったです
・ping-t：資格取得の勉強に役立ちました
・EVE-NG：マルチベンダーで幅広くNW構築が出来ます
## 私が思うインフラエンジニアに向いている人
### 地道な作業が得意な人
IT系の仕事はPCに向き合うイメージが強いのかもしれませんが、通信インフラはリモート対応できない作業も沢山あり、現地へ足を運び作業をする機会があります。2m近くあるラックの扉を外して機器を確認したり、数百本あるLANケーブルが全て疎通出来るか床を這って1本1本確認したり、無線APの電波確認で大きなビルの中を数km歩くこともあります。デスクワークだけではなく、体力の必要な作業や地道な作業も中にはあります。地道なことは多いですが、利用者のことを考えると責任ややりがいを感じます。
### コミュニケーション能力がある人
どんな職場でも大切なスキルかとは思いますが、通信インフラの仕事も例外ではなくある程度のコミュニケーション能力は必要であると日々感じます。入社前のインフラエンジニアのイメージとして、人と関わるというよりは延々と実機を触っていたりconfigの設計をしているのかなとイメージをしておりましたが、実際に業務を行うとユーザや関係者とのやり取りは多くコミュニケーション能力は重要なものであると感じました。技術系の会話になると伝えるのが難しく感じる時もあり、認識に差異がないように進めていく必要があるので常に慎重です。多くの人と関わり、一つのプロジェクトを進めていくので、私自身も円滑に進められるように日々勉強しております。
## 私が思うインフラエンジニアに向いていない人
### 全てを自分の手でやりたい人
インフラの仕事はプロジェクトの規模が大きくなるほど一人で完結出来るものは少なくなると思います。多くの人が関わってスケジュールを合わせながら進めていく為、時には他のメンバーの手も借りて任せるところは任せて自分がやるべきことは自分がやる、という分担や調整も必要になる場面があると思います。そのため、1から10まで自分で判断して自分の手で完結させたいと思う几帳面な方は厳しいのかなと思います。そういった方が一概に不向きであるとは言えませんが、実績や知識を積んでスキルアップしてくると自分で決められる範囲も多く柔軟になっていくと思います。
### スケジュール管理が苦手な人
通信インフラは文字通り基盤となるものなので、それがないことには業務やサービスの提供が止まってしまいます。ネットワーク開通が後ろ倒しになると影響は大きいので、遅れないようなスケジュール管理は重要と考えています。私自身も得意ではありませんが、進捗を自分のわかりやすい方法で記録しておくことで対策しています。
## さいごに：これから“インフラ女子”を目指す方へ！
未経験からこの業界に飛び込んだときは多くの不安がありましたが、仕事はやりがいがあって楽しいです。もちろん大変な時もありますが、インフラエンジニアは現代に必要不可欠な通信技術を支える一人になれるとても魅力がある業種です。女性でも活躍している方は多くいる為、性別問わず少しでも興味があるということであれば勉強しやすいサイトやツールが多くありますので触ってみるのをお勧めします。
[React]chart.jsで縦軸に小数点を表示させない方法[TypeScript]

#　はじめに
デフォルトのままだと、データがない場合に、
なぜか縦軸が小数点表示されてしまう現象が発生しました。

縦軸が[人]なのに、小数点付くとおかしいので、修正しました。

# やり方
以下付け足すだけです。

```tsx
yAxes: [
          {
            ticks: {
              beginAtZero: true,
              userCallback: function (label: any) {
                if (Math.floor(label) === label) {
                  return label;
                }
              },
            },
          },
        ],
```

# 参考
https://hacknote.jp/archives/28022/
コマンドプロンプトでDドライブに移動する

<h2>コマンドプロンプトでDドライブに移動する</h2>
windowsのコマンドプロンプトで、以下のようにDドライブに移動しようとしても移動できませんでした。。。

```terminal:NG
C:\>cd D:
```

調べたところＤドライブに移動する際は、通常とは違う方法が必要なようです。
参考の記事に記載通りにコマンドを打ったところ「アクセスが拒否」されてしまいました。。。

```terminal:NG
C:\>cd C:\Users\ユーザー名>D:
アクセスが拒否されました。
```

<h2>解決方法</h2>
cdコマンドを使わずにCドライブディレクトリでDドライブを指定すると移動できました。

```terminal:OK
C:\>D:

D:\>
```

または、dスイッチと呼ばれる「/d」を入れると移動できるようです

```terminal:dスイッチ
C:\>cd /d D:

D:\>
```

あと、アクセス拒否された件に関しては、一つずつ階層を上るようにしたら、アクセス拒否がされなくなりました。

```terminal:OK
C:\>cd C:\Users
C:\Users>

C:\Users>cd ユーザー名
C:\Users\ユーザー名>cd D:

D:\>
```

<h2>参考</h2>

https://qiita.com/Nemy/items/3ab1f91010ea9908d673

https://nemoplus.hateblo.jp/entry/20090130/1233321806
Azure Data Factory - Data Flowで重複行を取り除く (最初の行だけ選択する)方法メモ


# はじめに
Azure Synapse Pipeline (Azure Data Factory)のDataFlowで、ある列に重複した値があった場合に、最初の行だけを選択するフローを作ります。
自分用のシンプルなメモです。

# 方法
1. Aggregate (集約)アクティビティを置きます。
2. 「グループ化」タブ「列」の設定項目に重複を除きたい対象の列を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57724/31429590-1c94-49ef-aa13-ac84a7f268b0.png)
列名の部分は既にある列名と被らないものを指定します。
※今回はデータを入力していないのでエラー表示が出ておりますが、ソースデータセットに列が入っていればエラー表示は消えます。

3. 「集約」タブ→「追加」で、「列パターンの追加」を選択します。
4. 「式ビルダーを開く」を選択し、下記内容を書きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57724/7a3340af-77df-7c85-39ec-aced8deac3f9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57724/6d2be762-c27f-3748-2202-0125be4fafcf.png)

全ての列を対象にし、列名は元をそのまま出力し、重複があった場合は`fist($$)`によって最初の行が出力される、というイメージです。
'$$' は、一致した列の既存の列値を表します。

# おわりに
これで対象列において重複があった場合に、最初の行のみ残すフローが作成できました！
元々は[ドキュメントのスニペット](https://docs.microsoft.com/ja-jp/azure/data-factory/data-flow-script#distinct-row-using-all-columns)を参考にしております。
スニペットは全列を対象に重複があった場合に最初の行のみ残す、という形になっていたので、それを特定の行を選択する形でトライしました。

# 参考
[マッピング データ フロー スクリプト - Azure Data Factory | Microsoft Doc](https://docs.microsoft.com/ja-jp/azure/data-factory/data-flow-script#distinct-row-using-all-columns)
[first()](https://docs.microsoft.com/ja-jp/azure/data-factory/data-flow-script#distinct-row-using-all-columns)
HEBI Robotics X-Series ActuatorがHEBI Scopeに表示されない場合にチェックすること

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329116/f9a77e5e-b930-144d-4eda-e37ddab7a123.png)

HEBI Robotics社のスマートアクチュエータであるX-Series Actuatorが便利なのに日本ではあまり使用例が見当たらず，日本語で参照できる資料もほとんど無いため，セットアップ時に躓いた点などを書き残します．

#この記事の目標
X-Series Actuatorが[Scope](https://docs.hebi.us/tools.html#scope-gui)に表示されない場合にチェックすべきことを整理する．

#本題に入る前に
X-Series Actuatorの基本的なセットアップ方法は[公式ドキュメント](https://docs.hebi.us/index.html)にかなり分かりやすく書いてあります．

#本題
###症状：電源・Ethernetケーブルを繋いでいるにもかかわらず，Scopeで認識されない
1. ルーターを介してEthernetケーブルを接続していますか？
    - `PC - Actuator`と直接繋いでも認識されず，`PC - ネットワークに接続されたルーター - Actuator`とすることで認識されます．
2. 以前にリセットボタンを押していませんか？
    - Actuatorの電源がONのままリセットボタンが押された場合，静的IPが`10.11.12.13`に強制的に変更され，その状態では認識されないことがありますっぽいです．
    - [Resetting Module back to DHCP](https://docs.hebi.us/core_concepts.html#resetting-module-back-to-dhcp)を参考に，動的IPの設定に戻すと認識されます．

#最後に
[公式ドキュメント](https://docs.hebi.us/index.html)をしっかり読みましょう．
【AWS】ACMでLaravelアプリをSSL化したが、フォーム送信でセキュリティ保護されていないメッセージがでるときの対処法

個人アプリの作成で、ALBを使用しACMで証明書を取得。
https化までできたところでフォームを送信すると、、、
![スクリーンショット 2021-09-10 125515.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/933058/71a080ed-8895-c22f-e40d-a2aed104d175.png)

このようなエラーが。。。:sweat:

httpで通信が行われるようになっていたため、
ALBのリスナーの設定がまずいのかといじってみたが改善せず。

#対処法

Laravel側でAWSのロードバランサ用のプロキシ設定が必要でした。

```php:App\Http\Middleware\TrustProxies
<?php

namespace App\Http\Middleware;

use Illuminate\Http\Middleware\TrustProxies as Middleware;
use Illuminate\Http\Request;


class TrustProxies extends Middleware
{
    /**
     * このアプリケーションで信頼できるプロキシ
     *
     * @var string|array
     */
    protected $proxies = '*'

    /**
     * プロキシを検出するために使用すべきヘッダ
     *
     * @var int
     */
    protected $headers = Request::HEADER_X_FORWARDED_AWS_ELB;
}
```

https://readouble.com/laravel/8.x/ja/requests.html
Centos7にバーション8のVimをインストールする．

今回はDockerイメージから作成したCentos7のコンテナを用意しました．
環境整備は[こちらのWebサイト](https://weblabo.oscasierra.net/docker-centos7/)に従いました．

Centos7にVimが入っていないことを確認します．

```bash
[root@64b0fdff7950 /]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (AltArch)
[root@64b0fdff7950 /]# vim
bash: vim: command not found
```

[こちらのWebサイト(＊1)](https://genzouw.com/entry/2019/02/27/075021/1006/)を参考にvim8をインストールします．

```bash
[root@64b0fdff7950 ~]# yum install curl git make gcc ncurses-devel
Complete!
```

`/usr/local/src/`に`vim`をインストールします．

```bash
[root@64b0fdff7950 ~]# ls /usr/local/src/
[root@64b0fdff7950 ~]# cd /usr/local/src/
[root@64b0fdff7950 src]# git clone https://github.com/vim/vim.git
Cloning into 'vim'...
...
Resolving deltas: 100% (115143/115143), done.
[root@64b0fdff7950 src]# cd vim
```

＊1のサイトでは`./configure`のオプションでいろいろ設定されています．それぞれの意味を考え，調べました．

- disable-selinux: selinuxを無効にするためのオプションだと考えられます．selinuxとは，[このQiitaの記事](https://qiita.com/chi9rin/items/af532d0dd9237cc65741)によると，セキュリティホールを突かれてもファイルの読み書きを防ぐためのシステムのようです．セキュリティを守るために，今回は無効にしないでおきます．つまりこのオプションは取り除きます．

- enable-cscope: cscopeを有効にするためのオプションだと考えられます．cscopeとは，[このWebサイト](https://docs.oracle.com/cd/E19957-01/806-4836/cscope.html)によると，C言語のコードを解析するのに便利なツールのようです．いずれ利用するかもしれないので有効にしておきます．このオプションは利用します．

- enable-fontset: fontsetを有効にするためのオプションだと考えられます．フォント関係は入れておいた方がのちのち便利だと思うので，このオプションは利用します．

- enable-gpm: gpmを有効にするためのオプションだと考えられます．gpmとは，[このWebサイト](https://vim-dev.vim.narkive.com/iyr8aeGs/gpm-support-in-vim)に

  > the gpm support (copy and paste from/to a terminal) 

  とあることから，ターミナルからコピーしたり，ターミナルへ貼り付けするための機能のようです．便利なので入れておきます．このオプションは利用します．

- enable-multibyte: 1バイトでは表現できない言語をサポートするようです([参考のWebページ](https://vim-jp.org/vimdoc-ja/mbyte.html))．私はvimで日本語も使いたいので，このオプションは利用します．
- enable-rubyinterp: vimの機能をRubyで拡張させることができるらしく，その拡張をするためにはこのオプションをつける必要があるらしいです([参考のWebページ](https://vim-jp.org/docs/build_linux.html))．Rubyで拡張させることはいまのところ考えていないので，このオプションは取り除きます．
- enable-xim: ximを有効にするためのオプションだと考えられます．[このWebサイト](https://vim-jp.org/vimdoc-ja/mbyte.html#XIM)によると，XIM(X input method) はXの国際化入力機構であるらしいです．日本語の入力に関わりそうなので，このオプションは利用します．

これらを踏まえて以下の通りに実行しました．

```bash
[root@64b0fdff7950 vim]# ./configure --enable-cscope --enable-fontset --enable-gpm --enable-multibyte --enable-xim
[root@64b0fdff7950 vim]# make
[root@64b0fdff7950 vim]# make install
[root@64b0fdff7950 vim]# vim -version
VIM - Vi IMproved 8.2 (2019 Dec 12, compiled Sep 10 2021 03:43:07)
Garbage after option argument: "-version"
More info with: "vim -h"
```

バージョン8のVimをインストールできました．
Node.js 使用流れ

Node.jsの学習の備忘録と振り返りの記事です。
何かの参考になれば幸いです。
付け足しや訂正などある場合ご教授いただけると
大変嬉しく思います！！

###Node.js 手順
１　npmインストール(パッケージ管理システム)
２　パッケージインストール``npm install パッケージ名``
３　パッケージ読み込み``const パッケージ名 = require("パッケージ名");``
　　　　&
　　使用準備``const app = パッケージ名();``
4　サーバー起動``app.listen(localhost);``
5　ファイル実行``ターミナルで『node ファイル名』``

<details><summary> **ルーティング作成(URLに対応する処理)**</summary>
<div>

```node.js
app.get('/URL',(req,res) => {
処理内容
});
```

</div></details>

<details><summary> **見た目を表示する処理**</summary>
ルーティング処理の中で``res.render('表示したいファイル名');``とかくと指定したビューファイルをブラウザに表示できる
<div>

```node.js
//app.get('/URL',(req,res) => {
 res.render('表示したいファイル');
//});
```

:::note info
画面作成簡易手順
１　ejsに対応するルーティング＆処理していく
２　ejsファイル作り
3　ファイル内のコード作成
:::

</div></details>


<details><summary> **CSS適用**</summary>
**1　読み込むフォルダの指定**
**ルーティングファイル内**のパッケージ読み込み下あたりにCSSを読み込むコードを書く
``app.use(express.static('読み込みたいフォルダ名'));``
<div>

```js
//const express = require('express');
//const app = express();

app.use(express.static('読み込みたいフォルダ名'));

//app.get('/URL',(req,res) => {
//処理内容
//});
```

**2　CSSのパス指定**
**EJSファイル内**の＜head＞の中の＜link＞タグ内にCSSのパスを指定し読み込む
``href = "/フォルダ名/ファイル名"``

```html
<!-- <!DOCTYPE html> -->
<!-- <html> -->
  <!-- <head> -->
    <!-- <meta charset="utf-8"> -->
    <!-- <title>LIST APP</title> -->
     <link rel="stylesheet" href="/フォルダ名/ファイル名">
  <!-- </head> -->
```
**画像の読み込み**
**EJSファイル内**の＜img＞タグ内にCSSのパスを指定し読み込む
``img src = "/フォルダ名/ファイル名"``

:::note info
css簡易適用手順
１　CSSを置くフォルダの作成
２　ルーティングファイル内で読み込みたいフォルダの指定
３　EJS内で使用したいCSSパスを指定し読み込む(画像の読み込みも同様)
４　CSSファイルの作成
５　コード書く
:::

</div></details>

<details><summary> **ページ間リンクボタン作成**</summary>
**１　ルーティング内**でそれぞれファイルのURLを設定
**２　EJS内**でボタンクラス内のリンクタグに遷移したいファイルのURLを指定
</details>
20代後半以上の初学者が必ずぶちあたる問題に今ある知識で立ち向かう。

プログラミング学習をしているといつか遭遇する世界のナベ○ツ問題。私は今朝でした。
中々具現化せずにスルーしていく人が多いであろうなか締切が迫っているプロジェクトを差し置いてやる。やらねばならない。

【問題】
「「3の倍数と3のつく数字のときだけアホになります」をターミナルに出力しなさい。」

【構想】
条件分岐と条件の組み合わせを利用して実装ができそうです。
範囲→メインとなる30代の数字は全部出力したいので40までとしましょう。
アホになる→リスペクトも込めて「語尾に"!!!"を付与する」あたりで手を打ちましょう。

【step1】
whileメソッドを使って指定した条件下で繰り返し処理を行うよう大枠を作成しましょう。

```ruby:qiita.rb
def everything_that_happens_twice_will_surely_happen_a_third_time
num = 1
  while num <= 40 do

  ここに条件を書くよ
  
  num = num + 1
  end
end
```
1から始まるようnumを定義し、ｗｈｉｌｅメソッドで40以下と設定してdo~end間の処理を繰り返します。※doは省略可
num = num + 1　とすることで繰り返し処理の流れでnumを変化させます。

【step2】
3の倍数と3のつく数字のときだけアホになるを条件としてコード化します。

```ruby:qiita.rb
if num.to_s.include?("3") || num % 3 == 0
　　puts "#{num}っ！！！"
else
　　puts num
end
```
3の倍数に関しては％を使い3で割った際の余りが0であれば達成。
問題は3のつく数字のときを条件式に落とし込む点。私の引き出しには数値を参照するメソッドがないため、'to_s'を使ってnumを一度文字列にした上で'include?'を使って文字として"3"を参照しました。include?って数値参照できないのね！

【step3】
だいたい完成ですね。どきどきしてきました。
ただ、思い返していると度々数字を言い切った後に締めの一言を発していたような
範囲を41までにしてnum == 41のときに締める条件を足して完成させましょう。

```ruby:qiita.rb
def everything_that_happens_twice_will_surely_happen_a_third_time
num = 1
  while num <= 41 do
    if num.to_s.include?("3") || num % 3 == 0
      puts "#{num}っ！！！"
    elsif num == 41
      puts "ぁおもろぉーぅ！"
    else
      puts num
    end
  num = num + 1
  end
end
```
できたっっっ！
ターミナルで実行してみます。

![3の倍数だけ、、、.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1836714/d87f3ef9-b2f4-a04a-782f-9f537aed8b11.png)


楽しかったです。
メソッド名だけでも覚えて帰ってください。

以上。
EC2でZabbixの構築

AWSのEC2でZabbixを公式の手順で構築しようとすると、リポジトリと依存関係の問題で、インストールがつまってしまいます。
そんな時は下記の手順で、mirror を試してみるとうまくいくかもしれません。

```
wget mirror.yandex.ru/centos/7.9.2009/extras/x86_64/Packages/centos-release-scl-rh-2-3.el7.centos.noarch.rpm

rpm -Uvh centos-release-scl-rh-2-3.el7.centos.noarch.rpm

```

あとはひたすら公式の手順で作業を進めていけばいけます。

```
rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm
yum install zabbix-server-mysql zabbix-agent
yum install centos-release-scl

vi /etc/yum.repos.d/zabbix.repo
下記書き換え
[zabbix-frontend]
...
enabled=1
...

yum install zabbix-web-mysql-scl zabbix-apache-conf-scl
```
MariaDBをダウンロード

```
yum install mariadb mariadb-server

systemctl start mariadb

mysql -u root  

```
```
update mysql.user set password=password('1111') where user='root' ;
# mysqlの中にあるuser というテーブルにあるパスワードというカラムのパスワードを暗号化して保存。今回はその中のroot
flush privileges;

mysql> create database zabbix character set utf8 collate utf8_bin;
mysql> create user zabbix@localhost identified by 'password'; #passwordにはてきとうなパスワードをいれてください
mysql> grant all privileges on zabbix.* to zabbix@localhost;
mysql> quit;
```

```
zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix -p zabbix

vi /etc/zabbix/zabbix_server.conf
#yypで行をコピペできます
DBPassword=password

vi /etc/opt/rh/rh-php72/php-fpm.d/zabbix.conf
php_value[date.timezone] = Asia/Tokyo
#php_value の一番左 ；は外す

systemctl restart zabbix-server zabbix-agent httpd rh-php72-php-fpm
systemctl enable zabbix-server zabbix-agent httpd rh-php72-php-fpm

```

これで構築できると思います。
【Rails】ActiveRecord の order(:count_all) とは何なのか

ActiveRecordにて`GROUP BY`の`COUNT`を取りたいとき、[他の記事](https://site-builder.wiki/posts/1449)を参考に以下のようなコードを書いたのですが、

```ruby
Article
  .where(is_published: true)
  .group(:id)
  .order(:count_all)
  .count
```
（例文なので全く意味のないクエリですが、本来はjoinsとか色々やって集計してます）

この`order(:count_all)`の`count_all`がどこから来たのか分からず、調べてもわからなかったのでメモとして残しておきます。

## 結論

結論として、この`count_all`というカラム名は、引数なしの`.count`を呼び出した時に`AS`として追加される`COUNT(*)`のエイリアス名を指定しています。

今回のクエリは最後に引数なしの`.count`という集計関数を呼び出していますが、これがないと`order(:count_all)`は機能しません。

実際に吐かれるSQLを見た方が早そう。

```SQL
SELECT
  COUNT(*) AS count_all,
  [Article].[id] AS article_id
FROM
  [Article]
WHERE
  [Article].[is_published] = 1
GROUP BY
  [Article].[id]
ORDER BY
  [count_all] ASC
```

このように、たんに`.group`のみを行なったカラムには`AS`で`テーブル名+カラム名`が、`.count`を用いた場合には`count_all`というエイリアスが指定されています。

もうわかると思いますが、ちなみに`.count(:id)`など引数にカラムを追加した場合のエイリアス名は`count_id`になります。

## 最後に

ちゃんと理解せずにググりながらORMをガチャガチャしていたので`count_all`が何なのかよくわからずになってしまったのですが、ちゃんと吐き出されるSQLと見比べながらやったら一発でわかる疑問でした。

普通のSQLを書く時は自分でエイリアスを設定するし、感覚的に`order_by`のあとに`count`が来ることはないので、慣れていないと脳がバグりがちですが頑張りたいです。
FortiGate トランスペアレントモード(transparent mode)への切替え

FortiGateのサポートをおこなっておりますが、
お困りの方が多いので、ここに紹介します。

※FortiOS v6.0以上を対象。

まず、FortiGateを工場出荷状態に戻します。

※余計な設定の関連付けが多々あり、
　その関連付けをひとつひとつ外す作業を省略する意図です。

execute factoryreset

FortiGateを工場出荷状態に戻したあと、
トランスペアレントモードへの切替えは、
Fortilinkを無効化、switch-controllerを無効化する必要があります。

config system interface
(interface) # edit fortilink
(interface) # set fortilink disable
(interface) # end

config system global
(global) # set switch-controller disable
(global) # end

config system settings
(settings) # set opmode transparent
(settings) # set manageip xxx.xxx.xxx.xxx 255.255.255.0
(settings) # set gateway xxx.xxx.xxx.xxx
(settings) # end

これで、再起動が掛かり、トランスペアレントモードに切替わります。
ネームエラー　uninitialized constant NameError

お疲れ様です。
今日はこのエラーを解消できたので備忘録として書かせていただきます。


エラー内容
-------
![A44277D5-02FD-4CC7-8744-87D79B1F1B3A_1_105_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1829786/805b0507-7872-4145-1ec4-9b4c69b99f15.jpeg)

![5D59C0B0-9483-470C-B141-68C054E5022B.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1829786/eb505b3a-4095-5992-5c9f-d3d005c4fddf.png)





このエラーで活用させていただきました（ありがとうございます）

https://qiita.com/ngron/items/96664e754a6853591f39


しかしながら、、クラス名とファイル名はあってました。


原因
------

クラスの規則として_を使用してはいけないこと！！

```
shipping_fee.all,
````
クラス名として、
shipping_feeは_が使っているからクラス名として成り立たない。



解消法
----

```

ShippingFee.all,

````

アンダーバーを使わない代わりに、
アンダーバーのあとの文字を大文字に変えます！




何時間悩んだんだろうか、、、:baby_tone5:
CyberduckでPrivate EC2へファイル転送

## これは何

WinSCPがMacで使えなさそう（使えるけど設定が面倒くさそう）、ということで、Cyberduckを使ってファイル転送してみました。のメモです。

## 前提

踏み台EC2からPrivate EC2へ、Cyberduckを使ってファイル転送します。
ローカルマシンのポートをリモート先に転送します。

## 早速やってみた

**踏み台にSSHポートフォワーディングを張る**

```
$ ssh -f -N -L 10220(任意):Private EC2のPrivate IP or ドメイン:22 -i 秘密鍵 OSユーザー名@踏み台EC2のPublic IP
```

-f : バックグラウンドで動作
-N : コマンド実行無し
-L : Localのことを表す

**CyberduckでCMSのアクセス情報入力**

サーバー名 : localhost
ポート名 : 10220（任意）
ユーザー名 : Private EC2のOSユーザー名
SSH Private Key : 秘密鍵のFull Path

これで接続できました。

あとは適当にファイル転送します。

![スクリーンショット 2021-09-10 11.42.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740345/cb4def6f-717e-707a-18ba-ae1355bff78c.png)


一応、CLIでも見てみます。

![スクリーンショット 2021-09-10 10.25.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740345/7e09830f-b3ce-c042-ea9e-a499d7212c5d.png)

## 総括

使う前は、CLIでファイル転送に慣れてしまっているので、GUIはかえって面倒くさいのでは？
と思っていましたが、使ってみると思いのほか便利ですね。
ローカルマシンから、ドラッグ&ドロップで転送できるのがこんなに楽とは…

## 参考

```
https://qiita.com/Ayaka14/items/449e2236af4b8c2beb81
https://ja.stackoverflow.com/questions/49344/scp%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88%E3%82%92%E7%94%A8%E3%81%84%E3%81%9F%E8%B8%8F%E3%81%BF%E5%8F%B0%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E7%B5%8C%E7%94%B1%E3%81%A7%E3%81%AE%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6
```

参考にさせていただきました。ありがとうございます。
気になっていたIT用語

---
title: 初心者のストックしたIT用語
tags: 初心者  IT用語 
author: s_o
slide: false
---
<h1>初めに</h1>
<b>アウトプットの練習で投稿します！</b>
<b>いずれは技術記事も書けるように努力していきますのでご容赦ください</b>
<b>IT業界へ興味を持ってから、ストックしていた気になる言葉をまとめました</b>

<h1>気になった言葉</h1>
<b>_DX_</b>
>データやデジタル技術を駆使して、ビジネスに関わるすべての事象に変革をもたらすこと。2025年までに国から企業へ条件を満たせば補助金が出ることもあったりと国も本気の施策。
https://monstar-lab.com/dx/about/digital_transformation/

<b>saas</b>
>Software as a Service アプリケーションを実行するためのプラットフォームを、インターネットを介して提供するサービス。
https://digital-shift.jp/flash_news/s_210518_4

<b>ホリゾンタルsaas/バーティカルsaas</b>
>（ホリゾンタル）人事向け」や「マーケ向け」など特定の職種が使用するSaaS
（バーティカル）業種ごとに特化した機能を持つ、業界特化型SaaSとも呼ばれます。
https://ferret-plus.com/12454

<b>スクレイピング</b>
>データを収集した上で利用しやすく加工すること
ツールやプログラミング言語を用いる。
https://data.wingarc.com/scraping-27053
<b>ユニコーン企業</b>
>評価額が10億ドル（約1040億円）を超える未上場のスタートアップ企業
ベンチャーキャピタルからの出資がほぼ必須の為、日本の企業は少ない。
https://www.bridge-salon.jp/toushi/unicorn/
<b>ベンチャーキャピタル</b>
>ベンチャー企業やスタートアップ企業など、高い成長が予想される未上場企業に対して出資を行う投資会社のこと。
https://www.smbc-card.com/hojin/magazine/bizi-dora/finance/venture-capital.jsp

<b>UI・UX</b>
>UI（ユーザーインターフェース）Webサイトのデザインやフォント、パソコン自体の外観など、ユーザーの視覚に触れるすべての情報。
UX（ユーザーエクスペリエンス）とは、ユーザーが製品やサービスを通して得られる体験や経験のことです。サービスを利用する中でユーザーが感じたことがすべてUXとして認識されます。UXはIT分野だけではなく、さまざまな分野で重視されている概念。
https://www.webstaff.jp/guide/trend/ui-ux/

<b>リーンスタートアップ</b>
>リーンスタートアップとは、コストをかけずに最低限の製品・サービス・機能を持った試作品を短期間でつくり、顧客の反応を的確に取得して、顧客がより満足できる製品・サービスを開発していくマネジメント手法のこと。
https://www.kaonavi.jp/dictionary/lean-startup/#:~:text=%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%88%E3%82%A2%E3%83%83%E3%83%97%E3%81%A8%E3%81%AF%E3%80%81%E3%82%B3%E3%82%B9%E3%83%88,%E3%81%8C%E5%8F%96%E3%82%8A%E5%85%A5%E3%82%8C%E3%82%89%E3%82%8C%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82

<b>ソリューション</b>
>ビジネスやサービスでかかえている問題を解消すること。
ITによる問題解決はITソリューションと呼ばれる。
https://orange-operation.jp/business-app/16413.html
<b>タイムマシン経営</b>
>「タイムマシン経営」とは、海外で成功したビジネスモデルやサービスを日本でいち早く展開する経営手法のこと。ソフトバンク創業者の孫正義氏が命名したとされています。タイムマシン経営には、海外で成功したサービスの日本法人を立ち上げるパターンと、ビジネスモデルを模倣して日本向けにアレンジするパターンとがある。
https://jinjibu.jp/keyword/detl/1235/

<b>バックボーン</b>
>ビジネスシーンでは人や組織の考え方、信条の背景、精神的な支柱。
IT用語としては、ネットワークとネットワークを結ぶ基幹ネットワーク部分や、インターネットサービスプロバイダ同士を結ぶインターネットネットワーク部分。
https://mayonez.jp/topic/1030775?page=2#num_3279486

<h1>以上となります</h1>

IT業界に興味を持ってから動画やニュースでIT関連の情報を見る、聞くするのが楽しく
なかなかそれをアウトプットするということはなかったので今回記事を書くのも勉強になりました。
まだ他の方に比べて拙い記事となってますがご容赦ください。
初学者の方、一緒に頑張っていきましょう！
ここまで読んでくださった方本当にありがとうございます。
Elasticsearch ThreadPool Rejectedの値をDatadogで監視する

# 背景
- ElasticsearchのThreadPoolごとのRejected数はノードを再起動しないとリセットされない
- つまりstatsを取得しても、その数値は過去の累積値であって、直近発生した拒否数は分からない

そういう事情のもとで、Datadogで監視する方法をメモ

# 前提
## メトリクスの取得方法
https://www.elastic.co/guide/en/elasticsearch/reference/8.0/cluster-nodes-stats.html#cluster-nodes-stats

```shell-session
$ curl -s 'https://hoge.com/_nodes/stats?human&pretty' | jq '.nodes.XXXXXX..thread_pool.write'
{
  "threads": 2,
  "queue": 0,
  "active": 0,
  "rejected": 10000,
  "largest": 2,
  "completed": 123456789
}
```

AWS OpenSearch(旧AWS ES)ではこちらを参照。
https://docs.aws.amazon.com/ja_jp/opensearch-service/latest/developerguide/managedomains-cloudwatchmetrics.html

## ElasticsearchのThreadPoolごとのRejected数はノードを再起動しないとリセットされない
こちらのフォーラムにもQ&Aがあるとおり、ノードの再起動でリセットされるものだそうです。

https://discuss.elastic.co/t/how-to-reset-no-of-rejected-count-in-thread-pools/191353/3

つまり、直近1分で発生したRejected数を見るには、1分前との差分で見ないといけないです。

# Datadogで監視
## グラフデータ
Timeseriesグラフで見る時、上述のとおり今のメトリクスと1分前のメトリクスの差をグラフ表示させることができます。

![Datadog.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249168/e538101f-ba3a-a37e-ec29-3d582f8f59f0.png)

## Timeshift
https://docs.datadoghq.com/dashboards/functions/timeshift/

ここで使った方法は上記のTimeshift関数を使うものです。
`timeshift(metrics, time_in_second)`という形式で指定したメトリクスの指定した時間だけ前の値を取得する関数です。
例えば、前述のグラフデータを数式表現した以下図をみると、`timeshift(avg:aws.es.threadpool_wirte_rejected{}.by{}.as_count(), -60)`のように使われています。

![Datadog.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249168/68fcb5a5-082e-e238-8e21-b32ad5d8c8d7.png)

ちなみに、上図ではa, bとそれぞれ定義されていますが、aだけ定義して、式で`a - timeshift(a, -60)`と入力することも可能です。
ただし、グラフを保存すると、自動的にa, bという形で再定義されてしまうので要注意。
自分用　メモ

マルチカーソル
カーソルおく　Ctrl＋Shift＋Alt＋下
　　　　　　　Alt＋クリック
まとめて消したい　Ctrl＋Shift＋L

行コピー、移動
コピー　選択　Shift＋Alt＋下
　移動　　Alt＋下


リネームリファクタリング
F２　単語入力　変更したい単語入力

インデントを整える
PowerAutomateDesktopを用いてexcelの表まとめの自動化までのメモ　その4

フォルダのコピーすると
\\192.168.7.77\事業実績\202108Z\202108Z
って2つフォルダが出来る……
なぜーー
Folder.Copy Folder: copySrcDir Destination: copyDestDir IfFolderExists: Folder.IfExists.DoNothing CopiedFolder=> CopiedFolder

ってやっているだけなんだけどな……(+_+)
ESXi コンフィグバックアップと世代管理

# ESXiコンフィグバックアップの世代管理

ESXiのコンフィグバックアップとその世代管理をpowershell(ps1スクリプト作成)で行った。
要件としては週1回のバックアップで世代数は2。(今週分と先週分)
作成したps1スクリプトをWindowsタスクに仕込んだ。
今回はそのスクリプトの一部を紹介。(簡素化のためエラー処理などは省略)

## バックアップ

バックアップ自体は`Connect-VIServer` からの `Get-VMHostFirmware -BackupConfiguration` で行った。

パスワード暗号化周りは後述の参考ページで確認して頂きたい。

```バックアップ
$ESX = "192.168.1.1"
$USER = "root"
[byte[]] $EncryptedKey = (211,32,・・・,100)
$PassWD = cat SecurePassword.txt | ConvertTo-Securestring -key $EncryptedKey
$credential = New-Object System.Management.Automation.PSCredential($USER, $PassWD)
$BKPPATH = "D:\Backup\ESX01\"

Connect-VIServer -Server $ESX -Credential $credential
Get-VMHostFirmware -VMHost $ESX -BackupConfiguration -DestinationPath ${BKPPATH}

```

## 世代管理
世代管理はバックアップフォルダ内のオブジェクトの作成日時から判断するようにした。
今回の例では$DAYS=8日以上前のファイルは削除する。

```世代管理
$DAYS = 8

Get-ChildItem ${BKPPATH} | Where-Object{ ! $_.PSIsContainer } | Where-Object{ $_.CreationTime -le ( Get-Date ).AddDays( -$DAYS ) } | Remove-ITEM
```

## 参考
暗号化はこの方を参考にさせていただきました
> https://github.com/senkousya/usingEncryptedStandardStringOnPowershell

世代管理はこの方を参考にさせていただきました
> https://pig-log.com/powershell-delete-period/
yarnの処理でEACCESエラーが出たときの対処法

## 参考

https://qiita.com/Gaddict/items/8c76d92bd0adec2bfb6a

## エラー内容

EACCESのpermission deniedエラーが出ました。

```
 FATAL  EACCES: permission denied, mkdir '/home/xx/Documents/xxx-toC/frontend/node_modules/.cache/nuxt'




╭──────────────────────────────────────────────────────────────────────────────╮│                                                                              ││   ✖ Nuxt Fatal Error                                                         ││                                                                              ││   Error: EACCES: permission denied, mkdir                                    ││   '/home/xx/Documents/xxx-toC/frontend/node_modules/.cache/nuxt'   ││                                                                              │╰──────────────────────────────────────────────────────────────────────────────╯

error Command failed with exit code 1.

```

## 対処法

node modules のcacheへの権限がなさそうなので、そこに権限を与えました。

```
sudo chmod 777 node_modules/.cache/
```
Overlayfsを有効化したRaspberryPiでcronを実行するときの注意点

ユアスタンド株式会社所属

筆者は[ユアスタンド株式会社](https://yourstand-ev.com/)のインターン生です.

ユアスタンド株式会社では電気自動車（EV）の充電器をマンションを中心に導入し、自社開発のアプリによる運用に取り組んでいます.

普段は電気自動車充電器の充電スイッチのon, offを制御するソフトウェアの改修業務を担当しています.

本記事ではOverlayfsを有効化したRaspberryPiにて, 定期的に再起動する機能を作成している時に発見した注意点についてまとめています.

## 環境
Raspberry Pi 3 Model B+
Raspberry Pi OS with desktop(32bit) Released: 2021-05-07

## 事象
crontabでラズパイを再起動する処理を設定し, Overlayfsを有効化すると永遠に再起動され続ける.

### 事象の再現方法
1.crontabの設定

```
$ crontab -e

/tmpcrontab.FcGKNr/crontab

----------------------------------------------
* * * * * sudo reboot #任意の時刻を設定
```
2.Overlayfs有効化

```
$ sudo raspi-config nonint enable_overlayfs
```
3.手動で再起動

```
$ sudo reboot
```

4.設定した時刻まで待つ
5.再起動され続ける
### 事象が起きる原因
前提としてラズパイはデフォルトでRTCが装着されていません.
従って, ネットワークに接続しないと時刻の同期ができません.
Overlayfsを有効化すると, 有効化してシャットダウンした時点のラズパイの設定を保持します.
つまり, Overlayfsを有効化したラズパイを再起動すると, ラズパイの時刻はOverlayfsをかけてシャットダウンした時点の時刻を保持します. 
その後,　ネットワークに接続するとラズパイは時刻を同期します. 
時刻がcronで設定した時刻を跨ぐことでcron処理が発火します. 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500962/8ef5e806-f958-3e72-fc5a-dba807828015.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500962/ee2dfc08-178b-ad9b-f9dc-62b5525e4f39.png)

###ラズパイのワークフロー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500962/169316f9-efb7-343a-341b-e14767beff1d.png)
###具体例
1. 2021/1/1 00:00:00 に2021/1/2 00:00:00で再起動するcronを設定してOverlayfsを有効化し,再起動した
2. 2021/1/2 00:00:00 に予定通り再起動処理が実行された
3. 2021/1/2 00:00:00~ 再起動で立ち上がったラズパイの時刻は2021/1/1 00:00:00に設定されている
4. NTPにより2021/1/1 00:00:00から2021/1/2 00:00:00以降に時刻が更新される
5. cronが発火, 再起動処理が行われる

## 解決策
[同僚](https://qiita.com/maachan_9692)が考案してくれました.

###Overlayfsを有効化する時, 時刻を未来に設定する

過去から発火時刻を跨ぐのがダメなら未来から時刻を更新すれば良いのです.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500962/90869e38-7b52-b0bd-c833-04cf6684dc08.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500962/4362ff54-108c-2c3b-4f97-92d05b599c75.png)

###ラズパイのワークフロー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500962/3cf1ef2d-c5b1-c657-3859-9187bd0d6ef7.png)

###具体例
1. 2021/1/1 00:00:00 に2021/1/2 00:00:00で再起動するcronと再起動時にNTPを有効化するcronを設定. NTPを無効化, 時刻を2038/1/19 03:14:07に設定. Overlayfsを有効化し,再起動した
2. 2021/1/2 00:00:00 に予定通り再起動処理が実行された
3. 2021/1/2 00:00:00~ 再起動で立ち上がったラズパイの時刻は2038/1/19 03:14:07に設定されている
4. NTPにより2038/1/19 03:14:07から2021/1/2 00:00:00以降に時刻が更新される
5. cronは発火せず, 再起動処理が行われない

###コマンド
1.crontabで再起動時NTPの有効化

```
$ crontab -e

/tmpcrontab.FcGKNr/crontab

----------------------------------------------
* * * * * sudo reboot #任意の時刻を設定
@reboot sudo timedatectl set-ntp true #追記
```

2.Overlayfs有効化と時刻の設定

```time.sh
sudo raspi-config nonint enable_overlayfs
sudo timedatectl set-ntp false
sudo date --set="2038/01/19 03:14:07"
sudo reboot
```










###
specified type "0x0" but including maxFeePerGas and maxPriorityFeePerGas requires type: "0x2"

昨日動いていたプログラムが突然動かなくなって焦った。

Dappを作っていて、Txを発行したところMetamaskから以下のエラーが届いた

```
Invalid transaction envelope type: specified type "0x0" but including maxFeePerGas and maxPriorityFeePerGas requires type: "0x2"
```

![MetaMask_Notification_と_display_property_and_staking_-_CodeSandbox.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25625/363fde5d-de69-3d75-1b90-d4dec5e5c421.png)


はじめは、コントラクトやDappのコードを怪しんだが、特に動いていた時から変更はしていなかったので、まったく原因がわからず焦った。

以下の記事から原因がわかったのだが、ChromeにアドオンしているMetamaskが最新版になっており、DappのWeb3.jsのバージョンが古く、そのWeb3.jsに最新のMetamaskが対応していないのが原因でした。

https://githubmemory.com/repo/MetaMask/metamask-extension/issues/11824?page=2

# Web3.jsのバージョンを上げて問題は解決しました。

Chromeにアドオンしているアプリケーションのバージョン管理はしていないので、いつの間にか上がっていたのでわからなかった。DappでMetamaskを内包するとか無理なのかな…？そうすれば、この問題は起きないと思うんだけど
【RSpec】ActiveRecord使った複数画像添付のテストコードについて

## 前提
Rails 6.1.4
ruby 2.6.5
ActiveRecord

## 状況
現在Railsを使ってアプリケーションを開発しています。
model単体テストで画像添付のコードを書くのにかなり時間を要しました。（まず正常系のテストが通りませんでした）


## コード

sotreというモデルについてテストしています。
画像ファイル名は「xxx」「yyy」と置き換えてあります。

spec/models/store_spec.rb

```rb
RSpec.describe Store, type: :model do
  describe '店舗情報の投稿' do
    let(:store) { FactoryBot.build(:store) }
    # let(:images) { fixture_file_upload('/xxx.jpeg', '/yyy.png') }

    context '店舗情報が投稿できる' do
      it '必要な情報が全て入力されていれば投稿できる' do
        store.images = [ fixture_file_upload('xxx.jpeg', 'image/jpg'),  fixture_file_upload('yyy.png', 'image/png') ]
        expect(store).to be_valid
      end
    end
  
　　　　(中略)

  end
end
```

４行目でコメントアウトしているコードは修正前のコードです。
第一引数と第二引数それぞれに画像のパスを指定していました。

8行目のstore.images~というのが今回追記したコードです。
fixture_fire_uploadが2回出てくるのは、複数の画像を添付するためです。
画像1枚のみなら2回目の表記は不要です。
第一引数では画像のパスを、第二引数ではファイルの種類を指定しています。

下記コードはRailsのバージョンが6.1以降であれば必須ですが、それ以前（6.0）のバージョンであれば必須ではありません。  
spec/rails_helper.rb

```rb
FactoryBot::SyntaxRunner.class_eval do
  include ActionDispatch::TestProcess
  include ActiveSupport::Testing::FileFixtures
end
```

## なぜテストで通らなかったのか考える
４行目のテストに通らなかったコードでは第一、第二引数ともにファイルのパスを指定しています。
本来第一引数はファイルのパスを指定して、第二引数にファイルの種類を記載するのがルールのようです。

以上です。
テストコードに苦手意識がありますが、品質の担保には必須なので積極的に挑んでいこうと思いました。
内容に不備がございましたらご指摘いただけますと幸いです。
【β版ローンチ】「アイデアが無いから個人開発やらない」を無くしたい

## 世界をちょっとだけ良くするアプリを作りました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498701/ec2e9e0d-64df-38b5-e53a-8e748526480a.png)



## なぜやるのか？

私は`もったいない`という感情がとても嫌いな人間です
この感情に動かされ、誰かのためになったら良いくらいの精神で作りました


### 考える課題

**個人制作者：**

個人開発などでアイデアがない人が多過ぎる
せっかく作れる人なのにその労力を有効活用できていない

ユーザーが全然いなかったり
そもそも認知がなかったりするのは**もったいない**


**アイデア側：**
非製作者には妄想を豊かにふくらませてくれる人が多かった
実体験からくる課題感や異なる発想を持っての
「こんなのあったら良いのに」がとても面白いのに**形にできない**

### アプリ

```
アイデアとエンジニアのマッチングプラットフォーム
```

https://www.ideee.tech/about?utm_source=qiita&utm_medium=article&utm_id=launch_post


### メリット


**個人制作者：**

- 開発したいアイデアが見つかる👀
- 一緒にサービス開発をしたいと言ってくれる人が見つかる


**アイデア側：**

- アイデアを形にしてもらえる
- 自分の「困ってる」が誰かを手助けするきっかけになるかもしれない


## コンセプト

```
アイデアと個人制作のもったいないを無くす
```


### 実現したい世界観

```
「社会に役に立ちそう！」「あると助かるな！」を投稿
ユーザーが共感すれば投票
共感が集まればサイト上で上位に表示
```

```
エンジニアはサービスの需要があらかじめわかる
市場調査もできる上、需要がわかった上で開発ができる
サービスに貢献している人に投げ銭で応援できる
```

**けど待って**


#### そもそもエンジニアは誰かのアイデアをわざわざ作りたいの？


### 個人開発のメリットは大きい
みんなやってる個人開発


- コードを極めた人もOSS活動などで個人開発
- 駆け出しエンジニアはポートフォリオとして個人開発
- 勉強のためにコーディングやる人も個人開発
- 一発サービスで当てたい人も本気で個人開発


### シンプルに楽しい

ものづくりは楽しい
人に使ってもらうはもっと嬉しい


`権利関係ですが、楽しくWin-Winを築けるための仕組みを仕込み中！`


**需要チェックのためアイデアをさらしてみた**

https://qiita.com/naruqiita/items/77e5cf5dd84d5e6a82fd


### 需要はありそう

累計で
👀 View数 **2.5万**
👍 LGTM **275** 　2週連続Qiitaメールランキングに載った
🎁 ストック 352

ありがたいことにコメントもたくさん頂き
個人開発のアイデアを欲している人の需要を感じた🙇‍♂️
投稿しまくった結果、欲しくなったアプリがこちらです

### アプリの構成

![CDN.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498701/f0c1d457-88bf-bfbb-62a3-63f5866d5897.png)

アイデアを気軽に投稿できるようにするため
アイデア名から自動で画像を作る機能をつけました

[![Image from Gyazo](https://i.gyazo.com/2bf9bd8104a8e2e2e226dbca2a6e5bf8.gif)](https://gyazo.com/2bf9bd8104a8e2e2e226dbca2a6e5bf8)

### プラットフォームでの循環

*投げ銭でおうえん！*


- 投げ銭で感謝や応援をできる
    - アイデアにも投げ銭
    - 開発者にも投げ銭

```
応援されるアイデアに投げ銭が集まり
エンジニアとアイデアマンに平等に分配される
結果、大勢の需要を満たすように目指す
```


### ターゲット

- 社会貢献に興味がある人
- 自分の身の回りで改善点見つけられる人
- 個人開発をしたい人

### メッセージ

```
世の中にお金を産むサービスはいくらでもあります
けど「お金はあまり産まないけど社会に必要とされているサービス」が少ない
そこに本当に必要とされるサービスがあると思います
```

**個人開発の才能**をぜひお貸しください


## 💡ideee

Ideaを
Designし
Engineerが
Encounter(出会い)を
Encourage(盛り上げる)

アイデアとエンジニアのマッチングサービスideee(アイディー)


## β版スタート

＼β版ユーザー募集！／

https://www.ideee.tech/about?utm_source=qiita&utm_medium=article&utm_id=launch_post


## 自己紹介

個人開発について発信しています！
Twitterもフォローください👏
なる [@1026NT](https://twitter.com/1026NT)


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498701/3db40e7d-3213-be1f-8650-c6ad5dff69c9.jpeg" width="300px">
ESP32 に MacOS + Arduino IDE から書き込むとエラーになるとき

ESP-WROOM-32 を搭載したボードを買い足したら、前から使っていた同形状のボードと同じ設定の Arduino IDE では書き込めなかった。具体的には（Arduino IDE のエラーメッセージを詳細モードにしたとき、赤文字で）以下のようなエラーが出る。

```
Connecting....
Chip is ESP32-D0WDQ6 (revision 1)
Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None
Crystal is 40MHz
MAC: xx:xx:xx:xx:xx:xx
Uploading stub...

A fatal error occurred: Failed to write to target RAM (result was 01070000)
A fatal error occurred: Failed to write to target RAM (result was 01070000)
```

いろいろ調べると、ボード搭載されている usb-to-serial のチップ WCH CH9102 が macOS Big Sur そのままでは対応していないためのようだ。


<img width=700 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2003223/f00fe8f4-e8ed-9c51-448a-6319a864336a.jpeg">

前に買ったボードは違うチップが載っていた。以下の方法で書き込めるようになったので、上のエラーが出た場合、ボード上のチップと OS を調べて該当するときは以下の方法を試してほしい。

1. 以下のいずれかのドライバーをダウンロードしてインストールする。MacOS はドライバのセキュリティチェックがあるので、機能拡張 - セキュリティから操作しないとドライバは動作しないので要注意。
    * http://www.wch-ic.com/downloads/CH341SER_MAC_ZIP.html
    * https://github.com/Xinyuan-LilyGO/LilyGo-T-Call-SIM800/files/7037260/CH9102_Mac_Driver.zip
2. 再起動してボードを USB につなぐ。/dev/cu.wchusbserialxxxx のようなデバイスが現れればOK。usbmodemxxxx も現れるが、こちらは使えない。
3. Arduino IDE で上記 /dev/cu.wchusbserialxxxx のほうのシリアルポートを選んで書き込む。
さくらのオブジェクトストレージを独自のドメイン経由にする方法 - オブジェクト編 -

# TL;DR
2021/09現在で、独自ドメインを経由する方法は2通り（3つ目は2つ目の変わり種なので...）ありそうです。

1. さくらのウェブアクセラレータを利用する
1. 独自ドメインを終端できるリバースプロキシを建てる
1. 独自ドメインを終端できるWebサーバを建てリダイレクトする

# さくらのウェブアクセラレータを利用する場合

さくらのクラウドにログインして、https://secure.sakura.ad.jp/webaccel/#/regist にて独自ドメインを設定できます。

オリジン（ウェブアクセラレータの接続先）やオブジェクトストレージにアクセスするためのアクセスキー・シークレットキーが必要になるので、予め`さくらのクラウド＞オブジェクトストレージ`にて作成しておきましょう。

# 独自ドメインを終端できるリバースプロキシを建てる場合

どうしてもウェブアクセラレータを使いたくない（使えない）理由がある場合、独自ドメインを終端するnginx等のリバースプロキシを建てることで解決できます。

以下では、nginxを用いて独自ドメインで`public read`なオブジェクトにアクセスする方法を示します。

オリジンとなるオブジェクトストレージのオブジェクトを`public read`に設定し、nginxの設定ファイル(ここでは `default.conf` という名前で作成しています)

```
server {
    listen       443;
    ssl on;
    ssl_certificate ssl.mydomain.com.pem; # 独自ドメインの証明書
    ssl_certificate_key ssl.mydomain.com.key; # 独自ドメインの証明書の秘密鍵

    server_name  localhost;

    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        proxy_pass https://my-bucket.s3.isk01.sakurastorage.jp; # my-bucketは自分のバケット名
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}
```

これを nginxサーバの`/etc/nginx/conf.d/`以下に配置し、nginxサーバ内で

```
systemctl start nginx
```

を叩けば、独自ドメインで公開済みオブジェクトにアクセス可能です。
リバースプロキシ先の名前解決ができない場合は、必要に応じて`dnsmasq`などをインストールして下さい。

手元のマシンで確認したい場合は、`default.conf`があるディレクトリにて、

```
docker run --rm -p 80:80 -v $(pwd)/default.conf:/etc/nginx/conf.d/default.conf bradjonesllc/nginx-dnsmasq
```
を実行すれば、

```
curl localhost:80/公開済みオブジェクト名
```

という感じでアクセスし確かめることができます。

# 独自ドメインを終端できるWebサーバを建てリダイレクトする場合

前述のリバースプロキシしたものをリダイレクト方式に変えたものになります。

```
server {
    listen       443;
    ssl on;
    ssl_certificate ssl.mydomain.com.pem; # 独自ドメインの証明書
    ssl_certificate_key ssl.mydomain.com.key; # 独自ドメインの証明書の秘密鍵

    server_name  localhost;
    return       301 https://my-bucket.s3.isk01.sakurastorage.jp$request_uri; # my-bucketは自分のバケット名

    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}
```

こちらはリダイレクトなので、`dnsmasq`などは不要で

```
docker run --rm -p 80:80 -v $(pwd)/default.conf:/etc/nginx/conf.d/default.conf nginx
```
を実行すれば、

```
curl localhost:80/公開済みオブジェクト名
```

という感じでアクセスし確かめることができます。



## もう少し頑張ると・・・

nginxにて、当該バケットへアクセス可能なアクセスキー・シークレットキーを設定すれば（lua等でゴリゴリ書くことになるかもしれませんが）、公開済みオブジェクト以外もアクセスできる（はず）。
→試していないです。
[paiza]スキルチェック見本問題 Java 一番小さい値 (paizaランク D 相当)

<h2>初めに</h2>
今回はpaizaラーニングの以下のスキルチェック見本問題に挑戦します。
見本問題なのでコードの公開は自由です。

<h2>一番小さい値 (paizaランク D 相当)</h2>

https://paiza.jp/works/mondai/skillcheck_sample/min_num

```
問題：
5 つの正の整数が入力されるので、最も小さい数字を出力して下さい。

入力例1
10
12
4
8
46

出力例1
4
```

<h2>解答コード</h2>

以下が、正解のコードですが、なかなかできませんでした。

```java:
public class Main{
	public static void main(String[] args){
		Scanner sc = new Scanner(System.in);
//100までの数字なので、answerに最大値を設定しておく
		int answer = 101;
//数字は５つ与えられるので、iは0-4までの変化をする
		for(int i = 0; i < 5; i++){
//標準入力の値をnに代入する		    
			int n = sc.nextInt();
//nがanswerより小さければansewerにnを入れる
//最終的にanswerに最小値が入る
			if(n < answer){
				answer = n;
			}
		}

		System.out.println(answer);
	}
}
```



<details><summary>自分なりに考えたけどできなかった記録</summary><div>


```java:
import java.util.*;


public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String line = sc.nextLine();
        System.out.println("XXXXXX");
    }
}

```



まずは、全行読み込みする

```java:
import java.util.*;


public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        // 行がある間は読み込み
        while(sc.hasNextLine()){
        String line = sc.nextLine();
        System.out.println(line);
    }
    }
}
```

この時点での出力結果
10
12
4
8
46

配列に格納する

```java:
import java.util.*;


public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        ArrayList<String> array = new ArrayList<String>();
        // 行がある間は読み込み
        while(sc.hasNextLine()){
        String line = sc.nextLine();
        array.add(line);
        }
        for(String i :array){
            System.out.println(i);
        }
    }
}
```

</div></details>