OmniAICreator/Qiita-1.07M huggingface dataset:
エンジニアが入りたいスタートアップの特徴

## ISSUEに単価表の記事を追加しました
https://i-ssue.com/topics/de478ab0-b0d1-4449-a8ff-0d4c8f403896

## はじめに
普段、スタートアップでフリーランスとして活動していますが、エンジニア採用に困っている企業が多いように感じます。そんな方々に少しでも優秀なエンジニアとの接点を増やしてもらいたくて、私個人が思うエンジニアが入りたい企業の特徴を考えてみました。

## エンジニアが入りたい企業の本質

それはこちらの2つだと思っています。後述する特徴というのはこの2つを満たしている内容になります。

### 1. 自分(エンジニア)がしていることに価値を感じられる
エンジニアは自分の仕事に**価値があると実感しているとき**に、「開発していて面白い」と感じます。
価値を感じるのは社会的に評価されているサービスや企業で働いているときです。

### 2. エンジニアとして市場価値を上げられる環境がある
スタートアップは体制が整っていないので、エンジニアのキャリアに責任を持つことが難しいです。それでもスタートアップならではの方法でエンジニアとして市場価値を高める方法はあります。

## エンジニアが入りたいスタートアップの特徴


### 1. VCから出資を受けている
TechCrunchの資金調達リリースの調達先としてよく名前が挙げられていたり、有名なスタートアップに投資しているイケてるVCから投資を受けている場合は社会的に評価されている企業だと思います。社会的に評価されている企業で働くことは価値のある仕事をしていると実感できるのでエンジニアを惹きつけます。


### 2. TVやTechCrunchなどメディアで取り上げられている

VCから投資を受けているのと同じで社会的評価を受けている証拠だと思います。また広く世間に認知されているサービスを開発したいというエンジニアは多いです。


### 3. 代表がエンジニアもしくは優秀なCTOがいる
トップのエンジニアによって開発組織のレベルは決まると思います。また経営のTOPに優秀なエンジニアがいると、技術分野へのリソース配分が増え下記のようなことが起きます。スタートアップで身軽な分最新技術などを取り入れやすく、比較的モダンな開発環境を用意できます。

- 経営の意思決定が技術ファーストになる
- 将来性のある技術選定をする
- 技術的な評価がシビアになりやすく、結果に対する良し悪しが分かり改善ができる。

### 4. 開発速度よりもコードの質を優先する時がある
スタートアップでは投資家からのプレッシャーや利益を出さなくてはいけない焦りから **開発速度** > コードの質 になることが多いです。しかしSaasなど技術ドリブンなサービスであったり、技術的な負債を考慮して開発速度に注力しすぎない企業もあります。PRはたくさん作成されているが、マージされているものものが少ない場合、マージする内容を精査してコードの質を保とうと意識している可能性が高いです。


### 5. トレンドな専門領域を扱っている
単なる専門領域ではなく、トレンドである必要があります。トレンドな専門領域はある程度基礎の出来上がったエンジニアのキャリアステップの1つになりやすいです。ブロックチェーンやIotや画像認識、自然言語処理、音声、動画、ヘッドレスCMS、No Code、AR、VRなど領域は様々です。

### 6. モダンorニッチだが人気のある開発言語を使っている

開発に知見がある組織はその時々でモダンであったり最新、もしくはニッチだが密かに人気のある言語を使います。例えばWebサービスではフロントにReact.js, TypeScript, Next.jsバックエンドにGoなどを使っているところが多いです。ニッチな言語としてはRustやScalaなどが挙げられます。スタートアップなら憧れることが多い、[海外のユニコーン企業が使う言語](https://www.businessinsider.jp/post-194733)も参考になります。

### 7. 開発ツールや言語のバージョンが常に最新(の安定版)
開発に力を入れている組織とそうでないところでわかりやすく差が出ます。ライブラリや言語のバージョンアップはバグのリスク、確認コストがあり大変な作業の割に売上に直結する大きな変化はないのでBiz側には敬遠されることが多いです。しかしバージョンアップをしないことによるセキュリティリスクや利便性の向上を理解している開発組織は早い段階でバージョンアップを行います。

### 8. 技術情報を発信している
自社の技術に自信を持っていたり、その逆で自信をつけるために技術内容の情報発信をしている企業です。両者とも技術に対する熱量が高く技術に対するリソース配分が多いです。Qiitaのorganizationで記事の投稿数やLGTMが多い企業、自社ブログでもよく目にする企業は参考にしてみましょう。なんの見返りもないのに大変な執筆作業はしません。

最近見たブログ
[ARIGATOBANK](https://medium.com/arigatobank-tech-blog)
[inSmartBank](https://blog.smartbank.co.jp/)
[Gaji-Labo　blog](https://blog.gaji.jp/author/suzuki/)

## おまけ
開発プラットフォーム運営してます！副業や業務委託時する際に参考にできる[単価診断](https://i-ssue.com/surveys/b2cca0dc-7870-6c91-19e9-d97218416e91)もあるのでぜひ使ってみてください！


https://i-ssue.com/

エンジニアの副業やフリーランス、スキルアップについての情報発信してるのでフォローしていただけると励みになります！
[@twinsdevelopper](https://twitter.com/twinsdevelopper)
Typescript勉強ノート #1_Everyday Types編

# はじめに
Typescriptを使いこなせるようになるためにドキュメントを読んで勉強する。
typescript Documentation:  https://www.typescriptlang.org/docs/handbook/intro.html
自分用なのであるていど把握できていると思う部分はスキップしていく。

今回は、ドキュメントのEveryday Typesを参考にしてまとめる。
https://www.typescriptlang.org/docs/handbook/2/everyday-types.html


# Everyday Types
## Type Aliase
まとまった型を定義することができる。複数回利用する場合に役立つ。

```ts
type Animal = { //頭文字は大文字
  name: string;
  age: number;
};
```

## Interfaces
Type Aliase と似たように使い方をする。まとまった型を定義することができ、複数回利用する場合に役立つ。
基本的にはType Aliaseよりinterfaceを使えば良いらしい。

```ts
interfave Animal { //頭文字は大文字
  name: string,
  age: number,
}
```

### Differences Between Type Aliases and Interfaces
interfaceは拡張が容易にできるという特徴がある。
#### interface
- extendsをつかって継承（拡張）できる
- 新しいフィールドを既存のinterfaceに追加できる

```ts
// extendsをつかって継承（拡張）できる
interface Animal {
  name: string,
  age: number
}

/*
type Animal = { 
  name: string;
  age: number;
};
*/

interface Owner extends Animal { // Animalはinterfaceでもtypeでもよい
  ownerName: string
}

const owner: Owner= {
  ownerName: "Bob",
  name: "pochi",
  age: 5,
}

---

// 新しいフィールドを既存のinterfaceに追加できる
interface Animal {
  weight: number
}

const pet: Animal = {
  name: "pochi",
  age: 5,
  weight: 10
}
```

#### type
- typeもintersections（交差型）を使って拡張できる

```ts
type Animal = { 
  name: string;
  age: number;
};

type Owner = Animal & {
  ownerName: string;
}

const owner: Owner= {
  ownerName: "Bob",
  name: "pochi",
  age: 5,
}
```

## Type Assertions
as typeを使うことで型を指定、変換することができる。

```ts
interface Animal {
  name: string,
  age: number
}

interface Owner extends Animal {
  ownerName: string;
}

const a = { name: "pochi" } as Animal; // aのtypeはAnimal
const b = { name: 'hoge' } as Animal as Owner; // bのtypeはOwner
const c = { name: "pochi" } as Owner as Animal; // cのtypeはAnimal 
const a = { hoge: "hoge" } as Animal; // NG
```

## Literal Types
特定の文字列や数値を代入することができる型を作ることができる。

```ts
const fruit: "apple" = "apple"; // OK
const fruit: "apple" = "orange" // NG
const fruit: "apple" | "orange" | "lemon" = "apple"; // OK
const fruit: "apple" | "orange" | "lemon" = "grapes"; // NG
```

```as const```を使うとオブジェクト全体にリテラル型を適応することができる。

```ts
const fruit = { name: "apple", quantity: 5 } as const;
fruit.name = "orange" // NG
```

## おわり

次回は Narrowing（https://www.typescriptlang.org/docs/handbook/2/narrowing.html） についてまとめる。
https://qiita.com/demizoo/items/2816264d1f78d0d5ed39
【oracle】ORA-00257:アーカイブ・エラーです。解除されるまでAS SYSDBAにのみ接続してください。

# はじめに
ただの調査メモなので変に検索された方ごめんなさい。
ORA-00257が起きたらどうすりゃいいのか調べた結果をまとめます。

# 原因：アーカイブログの容量が限界超えた
https://www.teamxeppet.com/ora-00257/

によると、一般的に収集しているアーカイブログは、フラッシュリカバリ領域に蓄積されるので
そこの許容量を超えたら、アーカイブログが保管できないのでエラーになる。と。

# 解決方法１：アーカイブ・ログ・ファイルの削除
「アーカイブログ領域がいっぱいなら、削除してバックアップする容量を確保してやればいいじゃない」の精神で
やってしまう。

具体的には、db_recovery_file_destのアーカイブ・ログ・ファイルを削除して、フラッシュリカバリ領域の使用領域を解放する、って話。

以下、注意があったのでメモ残す。

```
OSコマンドで削除するとOracle Databaseとアーカイブ・ログ・ファイルの整合性がとれなくなるので、RMANを使用してアーカイブ・ログ・ファイルを削除する必要があることに注意してください。
```

# 解決方法２：DB_RECOVERY_FILE_DEST_SIZEの拡張
「アーカイブログ領域がいっぱいなら、サイズを増やせばいいじゃない」の精神で
やってしまう。

具体的には、db_recovery_file_dest_sizeを現在の値よりも大きく設定することでORA-00257を解消する。

# まとめ
どちらも「アーカイブログの容量不足」に対する対処で、これは日々インフラを面倒見ている人からすれば
「ディスク容量不足」が起きた時の対処と原理的には一緒なのでとても理解しやすかった。

強いて気になるとすれば、アーカイブ・ログ・ファイルを削除すると、直近のバックアップ分がなくなるけど、大丈夫？ってところか。
ここについての説明がなかったけど。。。まぁ別の機会で調べようと思う。
.Net6 Controller DateOnly型のAPIのエラー


# 環境

```
C#
.Net6
EFCore6
Blazor
```

# はじめに
API作成なんぞただの文字列だからエラーなんて起こらないだろうとおもってたら
DateOnly型でエラーになったのその原因の解決方法を書いておきます。
まだ日本語記事がどこにもなさそうなので

# 原因
モデル

```c#:/Shared/Models/Renter.cs

namespace BlazorApp.Shared.Models
{
    public class Renter
    {
        [Display(Name = "生年月日")]
        [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
        public DateOnly? BirthDate { get; set; }

略
```

コントローラー

```
using ChintaiApp.Server.Data;
using ChintaiApp.Shared.Models;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;

namespace BlazorApp.Server.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class RentersController : ControllerBase
    {
        private readonly AppDbContext context;

        public RentersController(AppDbContext context)
        {
            this.context = context;
        }

        [HttpGet]
        public async Task<ActionResult<List<Renter>>> ListAsync()
        {
            var renters = await context.Renters.ToListAsync();
            return Ok(renters);
        }
    }
}

```

これを https://localhost:7029/api/renters にアクセスすると

![スクリーンショット 2022-01-24 002042.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180419/364c6d0f-93b1-af54-f2c3-ecf4118bafbd.png)

こんな感じのエラーになります。文字に起こすと

```
NotSupportedException: Serialization and deserialization of 'System.DateOnly' instances are not supported.

とか

NotSupportedException: Serialization and deserialization of 'System.DateOnly' instances are not supported. The unsupported member type is located on type 'System.Nullable`1[System.DateOnly]'. Path: $.BirthDate

ですね
```
要は、.Net がDateOnly型を標準でサポートしていないから。


# 解決
これですね
https://www.nuget.org/packages/DateOnlyTimeOnly.AspNet/

```:パッケージマネージャーコンソール
PM> Install-Package DateOnlyTimeOnly.AspNet 
```

```c#:Server/Program.cs
// 以下を追加
builder.Services
    .AddControllers(options => options.UseDateOnlyTimeOnlyStringConverters())
    .AddJsonOptions(options => options.UseDateOnlyTimeOnlyStringConverters());
```

これ先ほどのURLにアクセスするとJSONが取得できました.

# Page
こちらのAPI をBlazor側が受け取るとエラーになるな。。。

うーん解決方法がわからない。


# 最後に
ぼちぼちがんばるでー
【oracle】REDOログとアーカイブログの違いがわからない

# はじめに
アーカイブログって何者なのかを調べていたらREDOログが急に現れて焦ったので調べることにした

# 結論：アーカイブログ＝REDOログをコピーしたもの
https://tech.mamezou00000.com/entry/oracle-archive-log

によると、以下の通り。なるほど、要するにデータは同じってことね。

```
アーカイブログは、アーカイブログファイルに保存されています。アーカイブログファイルは、REDOログファイルをコピーしたバックアップです。
```

# REDOログとは
曰く、

```
REDOログは、create、insertやupdateなど、データの変更履歴です。REDOログが書き込まれたファイルのことをREDOログファイルと呼びます。
```

構造的にはLGWRプロセスがREDOログバッファからとってきたデータをファイルに書きこんだものらしい。

```
LGWR（ログライター）というバックグラウンドプロセスがREDOログバッファというメモリ領域に溜まっている変更履歴をREDOログファイルに書き込みます。
```

# REDOログの有効期限ってどれくらい？
https://docs.oracle.com/cd/E16338_01/server.112/b56301/onlineredo.htm

によると、

```
LGWRは、REDOログ・ファイルに循環方式で書き込みます。
つまり、現行のREDOログ・ファイルが一杯になると、LGWRは次に使用可能なREDOログ・ファイルへの書込みを開始します。
使用可能な最後のREDOログ・ファイルが一杯になると、LGWRは最初のREDOログ・ファイルに戻って書込みを行い、再び循環を開始します。
```

とあるので、ログファイルの構成次第、ってことだろう。時間や量ががどうとかというよりも、
循環式なのでいっぱいになると、古い方から遠慮なく上書きってこと。

そういうことならREDOログが後からでも参照できるようにアーカイブログに保管しておこうって気持ちもわかってきた。
AWS Cloud9を停止させる

# この記事を書いた理由
　タイトルの様にCloud9の停止をさせたくて調べました。結果として満足する者がありませんでした。 **回答は待っていれば停止する** という回答しか検索されませんでした。
　そこで調べたことを記載しておきます。

## Cloud9の停止方法
* マネジメントコンソールでCloudformationサービスに移る
* スタックをクリック
* 相当するCloud9のスタックを削除（スタックの名前にCloud9のコンソール名が含まれている）

以上で削除できます。
![スクリーンショット 2022-01-24 102634.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296147/5f519c8f-80c7-7d3b-34bd-ff1d0e2dbedc.png)

今回はCloud9に「handson」と「handson2」を名前につけたので、それが入っています。
GINZAのOSError【jupyter lab】

jupyterLab上にGINZAをインストールした際のエラーとその回避方法です。


## ginzaだけだとエラー
```
pip install ginza
```

```
OSError: [E050] Can't find model 'ja_ginza'. It doesn't seem to be a shortcut link, a Python package or a valid path to a data directory.

```

ginzaをインストールしようとしましたが、ja_ginzaが見つかりませんというエラーが出ます。

なので以下のように実行します。



## ja-ginzaを足す
```
pip install -U ginza ja-ginza
```

```
OSError: [E049] Can't find spaCy data directory: 'None'. Check your installation and permissions, or use spacy.util.set_data_path to customise the location if necessary.
```

するとまたOSErrorが出ますが、カーネルをrestartしたら問題なく動きます。
Hello Qiita 記事

#目次サンプル
- サンプルモクジ
- さんぷるもくじ
- sanpuru mokuji
- sample table of contents
- ←の点は - 、後ろに半角スペース
- 半角スペースを入れないと改行してるのに、こうなる→
-ハイフンを入れませんでした

####書き方は下記の通り
```
- サンプルモクジ
- さんぷるもくじ
- sanpuru mokuji
- sample table of contents
- ←の点は - 、後ろに半角スペース
- 半角スペースを入れないと改行してるのに、こうなる→
-ハイフンを入れませんでした
```


#大見出しサンプル
タイトルサンプル

####小見出しサンプル
本文サンプル

####書き方は下記の通り
```
#大見出しサンプル
タイトルサンプル

####小見出しサンプル
本文サンプル
```


#コードっぽい背景

```
# ココの書き方 ` * 3
for i in range(3):
    print(i)
```

####書き方は下記の通り
```
`　`　`
# ココの書き方 ` * 3
for i in range(3):
    print(i)
`　`　`
```


#表を作ってみた
|左寄せデータサンプル|右寄せデータサンプル|中央揃えデータサンプル|
|:-|-:|:-:|
|データ①|データ①|データ①|
|データ②|データ②|データ②|
|データ③|データ③|データ③|
|データ④|データ④|データ④|
|データ⑤|データ⑤|データ⑤|
####書き方は下記の通り
```
|左寄せデータサンプル|右寄せデータサンプル|中央揃えデータサンプル|
|:-|-:|:-:|
|データ①|データ①|データ①|
|データ②|データ②|データ②|
|データ③|データ③|データ③|
|データ④|データ④|データ④|
|データ⑤|データ⑤|データ⑤|
```


#このリンク先はこちら
[いい記事が投稿できる素敵なサイト](https://qiita.com/)
####書き方は下記の通り
```
[いい記事が投稿できる素敵なサイト](https://qiita.com/)
```

#引用はこちら
>夏草や
兵どもが
夢の中

続けて書くと引用扱いになるようだ

####書き方は下記の通り
```
>夏草や
兵どもが
夢の中

続けて書くと引用扱いになるようだ
```

#まとめ
####この記事は練習も兼ねています
今後は技術に関する投稿をしていきます
おわり
巨大なログにも負けない高速で無料なログエクスプローラを紹介したい

# はじめに
手元でサクッとログファイルを解析したいことってありませんか？対象のファイルが数十メガくらいのうちは適当なエディタで問題ないですが、１ギガを超えた辺りからファイルを開くのにも苦労したり、すごく重かったりしてフラストレーションが溜まりますよね。

そこで今回はログ解析が捗るツール KLOGG を紹介します！
リンク先の Releases から各プラットフォーム向けのバイナリファイルがダウンロード出来ます。

https://github.com/variar/klogg

ここ迄でこの記事で語りたいことの９割は語りましたが、時間のある人はもう少しだけお付き合いください😅

# 機能紹介
触ってもらえれば直感的に理解してもらえるとは思うのですが、せっかくなので主要機能を紹介していきます。

## 前提

### ログファイル
下記のツールを使って Apache 形式のダミーログを用意しました。大きなログを作成するのに使用したのですが、継続的に書き込まれるようなログも再現できて非常に便利でした。

https://github.com/mingrammer/flog

:::note warn
後続の画面ショットに IP が表示されている部分がありますが、実在の IP とは何ら関係はありません。
:::

### PC スペック
大きなファイルを扱ったり、処理速度なども見ていくので参考までに実行環境のスペックを記載しておきます。

* Windows 10 Enterprise (1909)
* Intel(R) Core(TM) i5-8265U CPU @ 1.60GHz
* 16GB Memory
* SSD Storage

## 巨大ファイルオープン
手始めに５ギガのファイルを開いてみました。かかった時間は１７～１８秒といったところでしょうか。多少時間はかかりましたが、ファイルの大きさを考えると合格点ではないでしょうか。また、開いたあとは非常にキビキビ動きました。

![load.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1036913/41e8ef25-1f23-ec21-1998-66c373f9ccd6.gif)

次に１０ギガのファイルを用意して試してみましたが、こちらも４０秒くらいで開き、動作も軽快でした。さらに大きなファイルも扱えそうですが、このくらいのサイズが扱えれば現実的に困る場面は殆どないと思います。

## 検索速度
先程開いた５ギガのファイルに対して検索を実行してみましたが、かかった時間は１７～１８秒で、ファイルを開くのにかかった時間とほぼ同じでした。他のファイルサイズも同様の傾向で、１ギガ程度のファイルであれば３秒もあれば検索が終わりました。速い！！

![search.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1036913/5e09a4a2-9d70-644f-3ee9-45149906e1f3.gif)

また、検索にヒットした箇所はログウィンドウ右のスペースに赤いバーで表示されるので、出現位置が一目瞭然です。例えば特定の時間帯からエラーが出始めたような場合も、これを見れば何時からエラーが発生したがすぐに分かります。

## 検索範囲指定
ログの解析が進んでくると、ある程度怪しい箇所が特定できてくると思います。そういった場合、毎回大きなファイル全体に対して検索をかけるのは非効率なので、検索範囲を絞ることが出来ます。

ログウィンドウで検索開始位置としたい行を選択し、右クリックから「Set search start」を選び、検索終了位置では「Set search end」を選ぶだけです。

## 多段検索
`Ctrl + F` キーを押すと多段検索用のフィールドが画面最下部に表示されます。残念ながら正規表現は使えませんが、検索結果をさらに絞り込むのに有効です（ログ部分にもヒットします）。

![search2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1036913/7d22925f-dded-1d87-35dd-e70238db0c6a.gif)

## マーキング
気になった行をマーキングすることが出来ます。マーキングをすると、結果ウィンドウに対象行が表示されるので、検索でヒットした行と並べて確認することが出来ます。

![mark.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1036913/52115cbf-7cca-af40-dcbc-6a2b45049d40.gif)

## ハイライト
事前に定義を作成し、適用することでログ及び結果ウィンドウをハイライトすることが出来ます。例えば GET メソッドを青、POST メソッドを赤で表示するように定義した場合、下図のように色分け表示してくれます。

![highlighters.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1036913/e8598680-4a17-44a8-c542-67b8c31455dc.gif)

## 書き込み中ファイルのオープン
書き込み中ファイルを開くだけで差分を読み込み続けてくれます。画面上部のアイコンをクリックして「Follow File」を有効にすると `tail -f` のようにログの終端を追いかけてくれます。

![grow.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1036913/d4fc16dd-e399-2710-12a9-fc50e4063dbe.gif)


## 結果の保存
解析を行って抽出したログを保存したいときがありますよね。そんなときは結果ウィンドウで右クリックして「Save to file」すれば OK です！

# まとめ
私自身これまでログ解析用途で様々なエディタを試してきましたが、最終的に KLOGG に落ち着きました。巨大ファイル対応、高速、無料と三拍子揃っていて非常に強力なツールなのですが、知名度が今ひとつで Qiita にも記事がなかったので紹介記事を書いてみました。

ログ解析の心強いお供として活用して頂けたら嬉しいです！
Functions が利用しているランタイムを確認する


こんなメールが来たので
![Azure Functions support for Node 6 is ending on 28 February 2022](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4914/784372e0-242c-c1bd-dfd8-fd2e29b356de.png)

一覧確認

```shell.sh
ids=`az functionapp list --query '[].id' -o tsv`
while read id
do
  read rg name <<< $(echo $id | awk -F '/' '{print $5, $9}')
  SETTINGS=$(az functionapp config appsettings list -g $rg -n $name --query "[[?name == 'FUNCTIONS_WORKER_RUNTIME'].value, [?name == 'WEBSITE_NODE_DEFAULT_VERSION'].value]" -o tsv)
  FUNCTIONS_WORKER_RUNTIME=$(echo $SETTINGS | head -1)
  WEBSITE_NODE_DEFAULT_VERSION=$(echo $SETTINGS | tail -1)
  LINUXFXVERSION=$(az functionapp config show -g $rg -n $name --query "linuxFxVersion")
  echo $rg, $name, $FUNCTIONS_WORKER_RUNTIME, $WEBSITE_NODE_DEFAULT_VERSION, $LINUXFXVERSION
done << DATA
$ids
DATA
```
VS Codeのターミナル（PowerShell）で日本語が文字化けしてしまった件

前回の[GitのエディターをVS Codeに変えようとしたらはまった件](https://qiita.com/shoji9x9/items/1e1ef3de207e4c984499)に引き続き、VS Code、Git関連ネタです。

# 何が起こったか？
GitのコミットログをVS Codeのターミナル（PowerShell）で確認したところ、日本語が文字化けしてしまった。

# 原因
PowerShellのコードページはデフォルトではCP932になっているが、GitのコミットログはUTF-8で書かれていたため。

# 対策
[VSCodeの統合ターミナルでPowerShell起動時、文字コードをUTF-8に変える方法](https://qiita.com/s4i/items/d6d19c24b9d8ff193f72)を参考にさせて頂きました。

VS Codeのsettings.jsonに以下を追加することで解決しました。

```settings.json
"terminal.integrated.defaultProfile.windows": "PowerShell",
"terminal.integrated.profiles.windows": {
    "PowerShell": {
        "source": "PowerShell",
        "args": [
            "-NoExit",
            "-Command",
            "chcp 65001"
        ],
    }
}
```

# ご参考
VS CodeのPowerShellではなく、通常のPowerShellの文字コードをUTF-8に変更する方法は[Powershellの文字化けを直す方法](https://www.oresamalabo.net/entry/2021/09/15/003143)を参考にさせて頂きました。VS CodeのPowerShellも通常のPowerShellも基本的には、

* -NoExit：コマンド実行後もPowerShellを閉じないオプション
* -Command：コマンド実行
* chcp 65001：コードページを65001（Unicode (UTF-8)）に変更

を付けてPowerShellを起動するといいようです。ちなみにコードページの一覧は[コードページ識別子](https://docs.microsoft.com/ja-jp/windows/win32/intl/code-page-identifiers?redirectedfrom=MSDN)にあります。
【oracle】アーカイブログってなんのためにあるの？

# はじめに
障害で「ORA-00257: アーカイブ・エラー」が発生した。
過去に言われるがままに対応した記憶があるけど、正直コイツがなんなのかよくわからなかった。
で、今日、先週おきた↑↑のアラートが再発したようで何が起きたらしいが、
そろそろコイツなんなのかわからないと話題に入れないので調べることにする。

# アーカイブログとは？
https://cosol.jp/knowledge/knowledge_post/ob0001_archivelog/

によると、

```
アーカイブログモードとは、障害発生直前までの復旧や、運用中のバックアップ取得を可能にするためのデータベースの運用モードです。
本番環境では、たいていの場合「障害発生直前までの復旧」が必須要件であるため、原則的にアーカイブログモードでの運用が必須です。
```

MySQLにとってはbinlogみたいなものか？

# アーカイブログ運用の注意点
続けて、肥大化の懸念について言及があった

```
アーカイブログモードでは、データベースに対して適用された更新履歴が失われることがないように、
更新履歴を記録したアーカイブログファイルが定期的に出力されます。
このため、運用を継続するとアーカイブログファイルの数が増えてゆき、ディスク容量を圧迫するため、定期的に削除を実行することが必要でした。
```

なんだってRMAN、すごいじゃないか！

```
しかし、Oracle Database 10g以降では、RMANで適切にバックアップを取得し、
適切なサイズのフラッシュリカバリ領域を構成すると、
アーカイブログファイルの定期的な削除作業をOracle Databaseが自動的に実行してくれるため、
通常運用ではメンテナンス作業は不要です。
```

今回障害が起きたってことはRMANが適切なサイズのフラッシュリカバリ領域を構成できなかったからってことかな？

### 豆知識：RMANとは？
https://docs.oracle.com/cd/E16338_01/backup.112/b56269/rcmquick.htm

```
Recovery Manager(RMAN)とは、データベースでバックアップおよびリカバリ・タスクを実行し、
バックアップ計画の管理を自動化するOracle Databaseクライアントのことです。
Recovery Managerによって、データベースのバックアップ、リストアおよびリカバリが大幅に簡単になります。
```

### 豆知識２：フラッシュリカバリ構成とは？
すぐにリカバリできるようのデータ置き場なのかな？それはすごいね。
MySQL的にはスレーブDBみたいなものなのかもしれない。。。ちょっと違うけど。

```
データベース構成ファイルとは別のディスク装置上に、フラッシュリカバリ領域（11.2より高速リカバリ領域に名称変更）を構成します。
```

# アーカイブログでの適切な運用について
やり方は３つ。

## RMANによる定期的なデータベース全体バックアップ
RMAN起動して、バックアップ。まぁ…MySQLでも日次再起動やってるからいつものことかなと。

```
RMAN> BACKUP DATABASE;
```

## RMANのバックアップ保存方針(RETENTION POLICY)の設定
"7日前までの状態に復旧できるだけのバックアップを保存する場合"とか
"過去2世代分のバックアップを保存する場合"とか、
RMANの設定項目であるバックアップ保存方針(RETENTION POLICY)を運用ポリシーに合わせて設定する。
binlogでも保存期間を設定するから、まぁこれもそこまで珍しくないかなと。

なお、もっとも一般的な要件は、「障害発生直前に戻せればよい」だそうなので

```
REDUNDANCYを指定して、過去1世代分のバックアップを保存しておけば十分です。
```

とのことです。



```:設定例）7日前までの状態に復旧できるだけのバックアップを保存する場合
RMAN> CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;
```

# フラッシュリカバリ領域を構成する＆バックアップファイル、アーカイブログファイルの出力先をフラッシュリカバリ領域にする

↑↑の説明を見ると当たり前かもしれないけど、フラッシュリカバリ領域は作らなくてもいいそうなので
参考サイトではあえて説明してくれてるんだと思う。

# あれ？アーカイブログエラーってどういうときに起きるのかよくわからなかったぞ？
アーカイブログがあるとすぐに復旧できるってことが分かった。
で、そいつがなくなってもたちまち困ることは無いってことはわかった。
（ただ、アーカイブログを削除すると即座の復旧ができなくなるので、再度バックアップ取り直してアーカイブログの取得を再開する必要がある）

あとは、、、アーカイブログがおかしくなったときはどうすりゃいいのか、と
アーカイブログがおかしくならないようにどうするかってのはちょっと考える必要がありそうだ。
Microsoft の OpenHack (Modern Data Warehousing) に参加してきた


# OpenHack とは？

このあたりを見てもらうとよく分かる
https://zine.qiita.com/event/202112-microsoft/

# 何するの？

私が参加したのは、Modern Data Warehousing という OpenHack。
1チームあたり5人で2チームに分かれ、Azure の様々なリソースを使って Data Ware House をメンバーとあれやこれやと言いつつ開発していく。
もちろん困ったときは、MS のコーチがヒントを出してくれる(答えは教えてくれない)。
開発は段階的にゴールが設定されており、そのゴールを達成すると次のステップへ進める。
ステップは全部で7~8くらいあったが、OpenHack としての合格はステップ4まで。4まででも時間的にはけっこうギリギリ。
そこまでクリアすると LinkedIn などで自慢できるバッチをもらえる。達成感がありけっこう嬉しい😆

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1743460/0d777d8c-952d-6761-557a-c2f0a69aff12.png)

期間は3日間で、9～17時までがっつり OpenHack を行う（といっても業務都合とかで中抜けはできる）ので、けっこう疲れた。
具体的な内容は書いてしまうとネタバレになってしまうので書かないけど、Azure を使っている or これから使おうとしていて、データに関わる人は参加する価値ありだと思う。
Azure Data Factory だったり、Synapse Analytics だったり Azure DevOps だったりがキーワード。
難易度としては、まったくの0から参加するのは辛いと思う。
ある程度 DB だったり SQL だったり上記キーワードのリソースについての知識はあった方が良い。

# 良かったところ

* 自分たちで考えて実際に手を動かして、サービスを触りながら学べる！
  * これに尽きる！手を動かすのは大事！
  * データの ETL 処理について具体的に学べる
    * 個人的に、Azure Data Factory の使い方を学べたのは良かった（実業務で使うので）
  * ドキュメントやハンズオンの説明を読むだけでは分からない部分を理解できる
    * ハンズオンとかって基本的に正しく動く内容でしか説明が書いてないよね
* コーチに色々と聞ける！
  * 細かい設定方法や便利ツールなど教えてくれる
  * 分からないときにはやっぱり詳しい人に聞くのが一番良い
  * 自分たちで変な設計にすると後から困る
* 色んな業種の人と関われる！
  * がっつり IT 系の人だったり製造業だったり、普段関われない人とお知り合いになれる
  * 3日目の終わり際には「LinkedIn とかでつながってくださいね～」とコーチからも言われるのでつながりやすい
    * 全員が積極的という訳ではないけどw

# 微妙なところ

* コロナ禍なのでリモート開催ということもあり、メンバーとのコミュニケーションはちょっと難しい…
  * 作業を分担しようにも画面共有できる場が1つだけなので分担は基本的にできなさそう
  * メンバーと直接通話とかすればできたのかも？
* 理想的な形も知りたい…
  * 自分たちで開発していくので、完成した DWH が100点とは限らない
  * 設定がイマイチだったり、柔軟性・拡張性がなかったりするので、コーチ陣が100点とする設計と対比して最終的なフィードバックをもらえると嬉しかった
    * そういう場として想定されていないのかもだけど
* メンバーのスキルレベルはけっこうバラバラ…
  * スキルのある人だけで進めてしまって、置いてけぼりになりがち
    * ファシリテート役になったので、そういうところもできるだけケアしたつもりだったけど大丈夫だっただろうか
  * そういうところを助け合うのがハッカソンでもあるけど

# 総括すると

参加する価値あり！参加して良かった！
最近は、あちこちで DX だ！データドリブンだ！内製化だ！と言われているので、自分たちで手を動かすのはやっぱり重要。

# 参加するには

確かいろんなサイトをたどって申込みした気がする。Twitter とかでアナウンスはされているので、MS をフォローしてみると良いかも。
次回は、[AI-Powered Knowledge Mining](AI-Powered Knowledge Mining) (2/14~16)らしい (MS コーチの LinkedIn でシェアされていた) ので、ご興味のある方はどうぞ。
時間の都合がつけば参加したい…
【Postgres】SQLの勉強のために大量のテストデータを登録してみる

# 目的
SQLを極めようと思って、本を読んでいると思ったことがある。
データの登録が面倒すぎる！！！！！！！！！
ということで何か簡単にINSERTできる方法はないかと調べた。

データの数は多い方が、文によって実行速度が変わりやすいため、今回は100レコード登録することにする。

# 環境
PostgreSQL 14.1 (Ubuntu 14.1-1.pgdg18.04+1) on x86_64-pc-linux-gnu

# DB作成
```bash
$ create database <database_name>
```

# データベースを指定
```bash
\c <database_name>
```


# テスト用テーブルを作成
この時のカラムとのちに追加するデータの制約などは一致させる必要がある

```bash
$ create table customer (profile_id int, first_name char(10), last_name char(10), age Char(5))
;
```

# データを投入する
この追加するレコードのフィールドと先ほど作成したテーブルのカラムデータの制約などは一致させる必要がある

```sql
$ INSERT INTO customer (profile_id,first_name,last_name,age)
SELECT
-- idのvalueだが、iとすることでi行目のレコードとなる。つまり1,2,3...となる -- 
i,
format('田中%s', i),
format('太郎%s', i),
format('%s才', i)
-- 100件のデータを登録するため100としているが、ここは自由 --
-- 100回for文を回しているイメージ --
from generate_series(1,100) as i;

--INSERT 0 100--
```

# 結果
```
select * from customer;
 profile_id |  first_name  |  last_name   |  age
----------+--------------+--------------+--------
        1 | 田中1        | 太郎1        | 1才
        2 | 田中2        | 太郎2        | 2才
        3 | 田中3        | 太郎3        | 3才
        4 | 田中4        | 太郎4        | 4才
        5 | 田中5        | 太郎5        | 5才
        6 | 田中6        | 太郎6        | 6才
        7 | 田中7        | 太郎7        | 7才
        8 | 田中8        | 太郎8        | 8才
        9 | 田中9        | 太郎9        | 9才
       10 | 田中10       | 太郎10       | 10才
       11 | 田中11       | 太郎11       | 11才
       12 | 田中12       | 太郎12       | 12才
       13 | 田中13       | 太郎13       | 13才
       14 | 田中14       | 太郎14       | 14才
・
・
・
       95 | 田中95       | 太郎95       | 95才
       96 | 田中96       | 太郎96       | 96才
       97 | 田中97       | 太郎97       | 97才
       98 | 田中98       | 太郎98       | 98才
       99 | 田中99       | 太郎99       | 99才
      100 | 田中100      | 太郎100      | 100才
(100 rows)
```

できた。

おそらくこのようにテストデータを欲しい人はたくさんいると思うので、どんどん使って欲しい。
ジョーアカウント攻撃 とは

## 勉強前イメージ

アカウントを乗っ取る的な感じ？
ただ、ジョーってなに？

## 調査

### ジョーアカウント攻撃 とは

まず、 `ジョーアカウント` についてですが、これは
IDとパスワードに同じ文字列を設定してるアカウントになります。
例としては、 「ID:admin password:admin」 こんなアカウントを指します。
セキュリティの観点から最も脆弱なパターンの一つにされていて、webサイトでは登録できない対策もされています。

そして、 `ジョーアカウント攻撃` は、上記の通り
IDとパスワードに同じ文字列を設定しているアカウントを狙って不正アクセスを試す攻撃手法になります。
webサイトでは登録出来ないところもあるかと思いますが、
攻撃手法としてもあるので、IDとパスワードは同じ文字列にしないようにしないといけないです。

ディクショナリアタック という辞書攻撃と日本語では呼ばれますが、
パスワードを不正に入手するための攻撃があります。
こちらの攻撃でもジョーアカウントがまず狙われますのでパスワードはきちんと設定しないといけません。

## 勉強後イメージ

だいたい設定できないけどね・・・
これにも名前があるんや。。

## 参考

- [ジョーアカウント](https://www.sophia-it.com/content/%E3%82%B8%E3%83%A7%E3%83%BC%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88)
- [辞書攻撃](https://www.f5.com/ja_jp/services/resources/glossary/dictionary-attack)
Next.jsのISRの挙動をもう少し深掘ってみる

こんにちは。みやぞんです。

前回の記事ではLPの記事投稿部分のヘッドレスCMS化に伴い、Next側ではどのようにレンダリングするのが正解なのだろうと色々考え、結果的にはSGを選択したと説明しました。しかし後になってISRに関する理解が誤っていたことに気が付き二転三転としたところでISRの採用に落ち着きました。(修正してます)

https://zenn.dev/hk_206/articles/6981eca2fb56c5

今回は、そのときに少し深掘して学んだISRの挙動についての記事になります。

## CDNとは
まずはWebの基本知識であるCDNについてです。ISRを理解する上でキャッシュやCDNの理解は必須です。CDNとはContents　Delivery Networkのことで**複数のキャッシュサーバ(エッジサーバとも呼ばれる)で構成されたネットワーク**のことです。オリジンサーバとクライアントの間に位置するネットワークで、以下の利点があります。

- 負荷分散（オリジンサーバにアクセスが集中しない）
- キャッシュによるコンテンツ配信の高速化
- 可用性向上

![](https://storage.googleapis.com/zenn-user-upload/6390d596cf0d-20220123.png)
画像：[カゴヤのサーバ研究室](https://www.kagoya.jp/howto/it-glossary/web/cdn/)

CDNではアクセスするクライアント間でキャッシュが共有されます。

もう少し詳しい説明はこちら。

https://gihyo.jp/book/pickup/2021/0012

## Vercel　エッジネットワーク
**Vercel製のCDN**のようなものです。エッジネットワークは世界中の数十の場所で稼働しています。

![](https://storage.googleapis.com/zenn-user-upload/728d7190bdf0-20220123.png)

https://vercel.com/docs/concepts/edge-network/overview

AWSもエッジロケーションっていうのが至るところにありますよね。

## Vercelのキャッシュについて
静的ファイルは最初のリクエストの後、自動的にキャッシュされます。(最大31日間)
また、再デプロイ時にはキャッシュは事実上無効となります。

静的ファイルはハッシュによってキャッシュされるため、ファイルが変更されない場合はデプロイをまたいで持続することができます。

https://vercel.com/docs/concepts/edge-network/caching

### stale-while-revalidate
Vercelのキャッシュの特徴は「stale-while-revalidate」というCache-Controlヘッダーの拡張機能をサポートしている点です。

簡単に説明すると、キャッシュが再生成される時間を決めて、キャッシュ生成されてから指定の時間が生成するとリクエストをトリガーにして新しいキャッシュがバックグラウンドで生成されるというものです。
つまり動的コンテンツであっても静的ページを定期的に更新することでキャッシュできるようになります。

詳しい挙動はISRと一緒に追っていくとわかりやすいと思います。


## ISRの挙動について
ここまできたらISRは実際にどのように動いているのかを追ってみましょう。

Vercel公式の画像を借りて説明します。
![](https://storage.googleapis.com/zenn-user-upload/94090434b8d6-20220123.png)

1. コンテンツのキャッシュが未生成の場合はオリジンサーバにリクエストを送りSSRでページを生成する。またこのときキャッシュサーバー(CDN)にキャッシュを作る。
2. 次のリクエストからキャッシュサーバがキャッシュを返す。
3. キャッシュが生成されてからrevalidationで設定した秒数が経過するまでは同じキャッシュを返し続ける。
4. 指定した秒数が経過してから初めてのリクエスト時に、それがトリガーとなってキャッシュ(ver.2)を再生成する。このアクセスではまだ古いキャッシュ(ver.1)が返される。(つまり単に指定した秒数が経過しただけでは勝手にキャッシュを再生成することはない)
5. 新しくキャッシュが生成されてからその次のリクエストからは新しいキャッシュが返される。

これが「stale-while-revalidate」というキャッシュ戦略を利用したISRの動作です。

ちなみに、developer toolでCache-Controlを確認するとISRのどのフェーズにいるのかがわかります。

`MISS`: キャッシュが生成されていないのでSSRによってページを生成した
`HIT`: ISRによって生成された新しいキャッシュを利用中
`STALE`: キャッシュのrevalidate秒数を超えているので古いキャッシュを返しつつ、裏で新しいキャシュを生成します。次のアクセスから新しいキャッシュを返します(HIT)

https://vercel.com/docs/concepts/next.js/incremental-static-regeneration

CDNは共有キャッシュなのでこのサイクルはクライアント一人ひとりで生じるわけではなく、サイクルごと共有されている。つまりAさんが「キャッシュが作られていない状態のアプリケーション」にアクセスしたとき、それがトリガーとなってSSRが実行され同時にキャッシュも生成されます。その後すぐにBさんがアクセスしたらBさんが受け取るのはすでに生成されているキャッシュとなるのです。

なので最初にアクセスしたAさんは二回目のアクセスからからキャッシュが提供がされ、それ以外のクライアントは初回からキャッシュが提供されます。

ここまでISRのことを学んでみると、前の記事でも書いたとおり、強整合性が求められるようなページでない限りは動的ページはISR一択なのでは改めて感じます。(SEOやOGPの関係ないところではCSRもありだとは思います。)


## 最後に
今回は悔しい勘違いでしたが、おかげでISRの正しい理解にたどり着くことができました...。
公式ドキュメントに必ず正しい仕様は書いてあるので、面倒臭がらずに穴が空くほど目を通さないとなと感じました。エンジニアになりたての頃は心がけていたはずでしたが...。精進します！
Jupyterで特定のセルの入力と出力を参照する小ネタ

Jupyterで特定のセルの入力値や出力値を別のセルから参照する際の短いライトな小ネタです。

# 使うもの

- Python 3.9.0
- Jupyter (notebook==6.4.7)

※本記事ではVS Code上のJupyterを使っていきますが普通のJupyter notebookやJupyterLabなどでも動作すると思われます。

# 直前のセルの出力値を取得する

アンダースコアの記号（`_`）を特定のセルで実行すると、直前に実行したセルの出力（notebookであれば`Out [n]:`といった表示になっている部分）を取ることができます。

```py:セル1
x: int = 10 + 20
x
```

```
30
```

```py:セル2
y: int = x + 30
y
```

```
60
```

```py:セル3
_
```

```
60
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228778/877a8116-9502-aea3-b020-26326a9f786b.png)

# 特定のセルの出力値を取得する

`_n`（nは1以降の整数）といったようにアンダースコアの後に数字を指定することで任意のセルの出力値を取得することができます。例えば`_1`とすれば1番目の実行セルの出力値（`[1]`や`Out [1]:`といった表記になっているセルの値）を参照でき、`_2`とすれば2番目の実行セルの出力値（`[2]`や`Out [2]:`といった表記になっているセルの値）を参照することができます。

```py:セル1
x: int = 10 + 20
x
```

```
30
```

```py:セル2
y: int = x + 30
y
```

```py:セル3
_1
```

```
30
```

```py:セル4
_2
```

```
60
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228778/a6ae0295-2d20-bc91-8291-94beb01a03af.png)

# 特定のセルの入力値を取得する

今度は出力ではなく特定のセルの入力値を取得してみます。`_in`（nは1以降の整数）といったように、アンダースコアと整数の間にinputとしての`i`を挟みます。例えば1番目のセルであれば`_i1`、2番目のセルであれば`_i2`と指定します。

```py:セル1
x: int = 10 + 20
x
```

```
30
```

```py:セル2
y: int = x + 30
y
```

```py:セル3
_i1
```

```
'x: int = 10 + 20\nx'
```

```py:セル4
_i2
```

```
'y: int = x + 30\ny'
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228778/66abc44a-5cee-db3f-bef5-0d01c547e2e9.png)


これで入力値を文字列として取得することができました。

# 参考文献・参考資料

https://www.amazon.com/Symbolic-Computation-Python-SymPy-Manipulation-ebook/dp/B09HV4RQFS/
プログラミングを学んで2週間。PowerAutomate Desktop のレコーダー機能を使って社内イントラのログインと自部署のファルダまでを1クリックで入ってみました

私は、スタッフとして小売業のレジ業務のオペレーション改善を担当しています。
社内では資料などのデータ類はTeamsと社内イントラを使用して保存されています。
Teamsはショートカットを使用していますが、社内イントラは①デスクトップのアイコンをクリック→②社員番号とPASSを入力→③部署ごとに割り振られているファイルまでクリック数回、と大雑把に3段階あります。
今回、Power　Automate　Desktopを使用してボタン一つで社内イントラの自部署のサイトにジャンプできないか、を試してみました。


#使用した機能
・Power Automate desktop（以下PAD）
・Google Chrome


#PADの構成について
Power Automate desktopのフローは以下の通り
![社内イントラ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2495333/0e6d6f76-6afd-4201-9a98-f7d7b78de583.png)



#PAD　項目ごとの説明
##1.【新しいChromeを起動する】
社内イントラ用のブラウザ、今回はChromeを起動させ、社内イントラ用のURLにJumpさせます。


##2.【レコーダー◎】をクリック
chromeで社内イントラのトップページを準備し、フローの上部にあるレコーダーボタンを押します。
そして、社内イントラ内の自部署のサイトに行くまでのステップを記録させます。
途中で、社員番号/PASSを入力する項目では、「クリック」→「テキストを入力」を行いました。
一次保存を忘れずに。


#出来上がり
![サイト.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2495333/d06cad67-b9d5-8cb5-af8c-718d28c9f3c3.png)


#今後
これまで当たり前のように社内イントラの自部署サイトまでたどり着くのに数十秒かけてましたが、レコーダー機能によってボタン１つで到達できました。
違うサイトアクセスもどんどん自動化しちゃいます。
[OutSystems]Action実装方法の比較（Server/Service/Expose REST API）

OutSystemsでサーバーロジックを作成するときにServer Action/Service Action/Expose REST APIという選択肢がある。
それぞれの特徴と使い所をまとめ。

# 比較表

|  | Server | Service | REST |
|:-:|:-:|:-:|:-:|
| トランザクション[^1]  | ○ | ☓ | ☓ |
| パフォーマンス[^2]  | ○ | △ | △ |
| 認証の引き継ぎ  | ○ | ○ | ☓ |
| 整合性チェック[^3]  | ○ | ○ | ☓ |
| 利用箇所の検索[^4]  | ○ | ○ | ☓ |
| モジュール更新の独立性[^5] | ☓ | △ | ○|
| 用途[^6]  | ドメイン内から利用  | 同じOutSystems環境の他ドメインから<br>設計上の理由で依存関係を弱めたいとき  | OutSystems外の環境から<br>他のOutSystems環境から  |

[^1]: Consumerと同じトランザクションで動作するか？　○：同じトランザクション
[^2]: Action呼び出しのパフォーマンス。Service Action・Expose REST APIはHTTP通信のオーバーヘッドがかかる
[^3]: コンパイル時に、既存Consumerとの整合性チェック（引数の数や型等）を行うか。
[^4]: Service StudioのFind UsageやService CenterのDependeiciesなどで呼び出し元を発見できるか？
[^5]: Producerの変化がConsumerに与える影響の強さ（Consumerで再Publishや参照更新が必要になる）。☓：全てのPublishがConsumerに影響を与える　△：I/Fが変更したときのみConsumerに影響を与える（内部ロジックだけの変更はConsumerの参照更新不要）
[^6]: ドメインの意味については[OutSystemsのDDD情報まとめ](https://qiita.com/jyunji_watanabe/items/357470b3b632c232ce76)参照

# その他のActionの整理
## Screen Action
Screen ActionとはScreen（画面）の下に作成するAction。
画面のライフサイクルイベント（Readyなど）やUIイベントハンドラーの役割。

Traditional WebではServer Action、Reactive Web AppやMobileではClient Actionでもある。

## Client Action
Reactive Web AppやMobileで作成できるActionの種類。
この形式で作ったロジックは実行時にJavaScriptに変換され、ブラウザ内で実行される。

## SOAP
SOAPとしてActionを作成し、公開することもできる。
Expose REST APIと同様の操作方法で作れる。
VirutalBoxを6.1.32にアップデートしたらHomesteadサーバーにhttp接続出来なくなった

# 事の始まり
Mac OSX Big Surをアップデートしたら、いつものごとくvagrant up出来なくなった。VirtualBoxが新しいOSに対応していないのだろう。いつものごとくVirtualBoxをアップデートするとvagrant upでサーバーは起動するようになった。しかし、httpでMacからhomesteadに接続出来なくなっている。sshではログインできるのでどこかで遮断されているようだった。

# VirtualBoxが変わっていた
VirtualBoxは6.1くらいから接続許可IPアドレスの設定が変わったようだ。192.168.10.10は遮断対象で、192.168.56.0/21が許可対象になっている。
https://download.virtualbox.org/virtualbox/6.1.28/UserManual.pdf
116ページ目参照。

```
On Linux, Mac OS X and Solaris Oracle VM VirtualBox 
will only allow IP addresses in 192.68.56.0/21 
range to be assigned to host-only adapters.

```

networks.confに許可アドレスを設定する方法も有るようですが、
Homesteadのアドレスを変更しました。


# Mac側で変更したファイル
Macの~/Homestead/homestead.yaml

ip: "192.168.10.10"
を以下の様に変更
ip: "192.168.56.10"

/etc/hostsで192.168.10.10になっていた部分を192.168.56.10に変更。


# 仮想機側で変更したファイル
/etc/netplan/50-vagrant.yaml 192.168.10.10を192.168.56.10に変更。

```
---
network:
  version: 2
  renderer: networkd
  ethernets:
    eth1:
      addresses:
      - 192.168.56.10/24
```
redis/redis.conf 192.168.10.10の部分を192.168.56.10に変更。

```
bind 127.0.0.1 ::1 192.168.56.10
```


これは私だけの環境だと思いますがLaravelの.envで192.168.10.10になっていた部分全部192.168.56.10に変更しました。

他にも192.168.10.10を設定しているところも変更しないといけない。PHPStormのファイル転送設定とか。

なんだかんだで２時間くらいかかってしまった。
ORACLEが設定変更したおかげで時間を取られてしまった。
Railsにおけるto_jsonのオプション

## 概要
今回は先日改めて学んだto_jsonのオプションについてアウトプットしたいと思います。
Railsのコントローラーなどでよく使用します。

## 環境
ruby: '3.0.1'
rails: '6.1.4.1'

## to_jsonについて
### to_jsonとは
`to_json`とはオブジェクトをJSON形式に変換してくれるメソッドです。

```ruby
user = { id: 1, name: 'user1', age: 22 }

user.to_json #=> "{ \"id\":1, \"name\":\"user1\", \"age\":22 }"
```
なお上記user定義はこの後の説明で使用していきます。

### よく使用するオプション各種
#### 1. include
`include`は__関連付けされているテーブルのカラムも一緒に取得__できるオプションです。
例えば、`user`を取得するときにその`user`が投稿した`post`データも一緒に取得したい場合などに使用します。

```ruby
class User < ApplicationRecord
  has_many :posts
end
```

```ruby
user.posts = [{ id: 1, content: 'example_content' }] # userのpostデータ

user.to_json(include: :posts)
#=> "{ \"id\":1, \"name\":\"user1\", \"age\":22, \"posts\":[{\"id\":1, \"content\":\"example_content\"}] }"
```
#### 2. except
`except`はデータを取得するときに__指定したカラムを排除__できるオプションです。
例えばuserを取得する際に`age`カラムが必要ない場合

```ruby
user.to_json(except: :age)
#=> "{ \"id\":1, \"name\":\"user1\" }"
```
上記のように`age`を排除することができます。

#### 3. only
`only`は`except`とは違いデータ取得の際、__指定したカラムのみ取得__するオプションです。

```ruby
user.to_json(only: :name)
#=> "{ \"name\":\"user1\" }"
```

#### 4. methods
`methods`はデータ取得の際に、__メソッドの実行結果を取得__するオプションです。
例えば、下記のように`user`の`name`が10文字以上であるかを判定するインスタンスメソッドが定義されていると仮定します。

```ruby
def over_name?
  name.length >= 10
end
```

```ruby
user.to_json(methods: :over_name?)
#=> "{ \"id\":1, \"name\":\"user1\", \"age\":22, \"over_name?\":false }"
```
#### <備考>
##### 複数のオプションを使用する場合
複数のオプションを使用する場合はオブジェクト形式で渡します。

```ruby
user.to_json(include: { posts: { only: :content } }
#=> "{ \"id\":1, \"name\":\"user1\", \"age\":22, \"posts\":[{\"content\":\"example_content\"}] }"
```

## まとめ
`to_json`はのコントローラーで結構使用するのでもし詳しく確認したい場合は下記参考文献を参照ください。

## 参考文献
https://api.rubyonrails.org/classes/ActiveModel/Serializers/JSON.html#method-i-as_json
身の回りの小さな課題解決②【PAD】を使ったスクレイピング

<h1>WEB上の情報をまとめて取得したい！</h1>
私は現在入社2年目で旅行会社に勤務しております。(BtoC向けの旅行商品を扱う部署にてWEB販促などを担当しています。)<br>
日々の業務では、新規の特集を組むために他社サイトの動向チェックを行うことも多いのですが中々ルーティン化ができず、また今後の参考に残せるような綺麗な纏めができていないなという反省があります。
今回は、覚えたての<B>【Power Automate Desktop】通称PADを使って業務自動化</B>をすることで、身の回りの課題解決に挑戦しました。
<br>尚、こちらのアイデアは、会社全体の課題をハイテク技術で解決！というより、<B>小さな課題を一瞬で解決する</B>ということを目的としています。PADの操作を覚えてすぐに活用してみた事例となるので、<B>【PAD初心者の方】</B>や<B>【自動化できそうな業務を探している方】</B>
は是非ご覧ください。
<h1>部署内の小さな課題②</h1>
※今回の内容と同様に、PADを活用して<B>課題解決①</B>の解決も考えてみましたので良ければ併せてご覧ください。

https://qiita.com/maria9/items/1cee1f116c6265a35855

／
<B>他サイトの事例を集めるのに手間がかかる。簡単にできない？？</B>
＼
具体的には…
◆他サイトで掲載中の特集ページの情報収集の時間を短縮したい
◆複数サイトにそれぞれアクセスするだけで時間がかかってしまう
◆ルーティンとしていても定期的に見にいけない時がある

<h1>以上の課題を踏まえ</h1>
サイト自体は、文字だけでない情報も多くあるため自分で確認しにいくことは必要だと感じつつも、<B>そこから文字情報を抜き出し→Excelに纏めるという２STEPの手間をまずは削減したい</B>と思い<B>PADを活用してスクレイピング</B>を行うことに挑戦しました。

<h1>使用ツール</h1>
下記のサービスはインストールやアカウント登録などの事前準備が必要になります。
*<a herf='https://powerautomate.microsoft.com/ja-jp/desktop/'>Power Automate Desktop</a>

<h1>最終完成イメージ</h1>
▼以下のサイトの特集箇所から<B>「特集タイトル」</B>と<B>「説明文」</B>を抜き出しました。
※ここでは「WEBページからデータを抽出する」のアクションを使用していますが、以下の特集のように複数同型の情報が並んでいる場合、初めの2セットを抽出した時点で全てを認識し、一つずつ最後まで選択せずとも自動で抽出をしてくれます。
![スクリーンショット (558).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2496382/a0e8b9fa-8936-f5c3-2240-133557155424.png)
▼1行目に日時、2行目以降に抜き出した情報を転記させました。
![スクリーンショット (557).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2496382/f8d419aa-2131-1a38-00fc-02603de901ad.png)
<h1>PADのフローがこちら</h1>【フロー開始～完了までの時間：<B>約14秒</B>】
![スクレイピング.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2496382/02443d86-24f4-ffd3-3eb1-3f1e721f1591.png)
<h1>最後に</h1>今回は、多くのWEBサイトでも既に紹介されている<B>スクレイピング</B>に、<B>抽出日の記載</B>を加えて実務に結び付けてみました。この作業を自動化することで、情報収集の時間短縮はもちろん、今後のための情報まとめにも活用できると思います。また、このフローを応用して、タブ分けで複数のサイトから情報を集めたり、週次で更新をしたりとさらなる自動化もできるかと思いました。スクレイピングについては、応用の活用法を引き続き調べて実際にフローを真似ながら習得していきます。<br>

最後までご覧いただき、ありがとうございました:airplane::sparkles:
PADを使って業務準備を自動化してみた

##はじめに
皆さまこんにちは😊とある企業でデジタル化を推進する部署に所属しているかきもとです。
今回は、普段している業務の前準備を自動化してみました。
なぜかというと‥面倒だからです！~~仕事に対して面倒っていうの抵抗がありますね笑~~
さて、今回行うのは『Excelファイルに添付されている画像データをペイントで加工し、WEBへアップロード』するための**下準備**です。
上記を行うにあたって、①ブラウザを開く　②Excelファイルを保存しているフォルダを開く⇒Excelファイルを開く　③画像加工専用のjpgをペイントで開く　を実行し、操作しやすいようにデスクトップに配置します。ここから、やっと『Excelファイルに添付されている画像データをペイントで加工し、WEBへアップロード』が出来るというわけです。長い！！
ということで、今回はこの下準備を自動化してみました。
前置きが長くなりましたね。早速始めてみます。
##使用したもの
・PowerAutomateDesktop

##PowerAutomateDesktopのフロー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2487483/bbc76c95-151b-571d-6ee6-33934888f06c.png)

##制作過程
###①PowerAutomateDesktopを開き、新しいフローを追加する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2487483/3cdd6dd1-198e-6467-f633-fee694fef657.png)

前の記事と同様にまずは新しいフローを追加します。フローの名前は『下準備』としました。
前の記事はこちらから　https://qiita.com/natsumi_644/items/7b058716948f6bba37ec

###②レコーダーを起動する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2487483/fdcee3ba-4259-5b42-a25c-07bb62920ab8.png)

ツールにカーソルを合わせると、レコーダーが表示されるのでクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2487483/f5b0f44f-b871-5660-e6a4-1cbe732a3b28.png)

あとは記録をクリックして、必要なファイルを開いていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2487483/8179a327-ffff-7bbe-3490-4fbdb77fe8b8.png)
画像のように赤枠が表示されれば、正しくレコードされています。


今回実行したものは
ブラウザを開く⇒フォルダを開き、画像加工専用のjpgを開く⇒ペイントで開き直す⇒位置を調整⇒不要なフォルダを閉じる⇒別フォルダを開き、Excelファイルを開く⇒終了したらメッセージを表示
という流れになっています。

**※ブラウザーを使用する場合は『ブラウザー拡張機能』のインストールが必要です。**


##感想
今回はレコーダーとメッセージを表示するアクションのみで作成をしてみました。
なかなか正しく読み取れず時間がかかりましたが、比較的簡単に作成することが出来ました。

ただ今回、実は違うアクションを使用し、WEBページ上でのデータ収集やExcelへの書き込みをしたかったのですが会社システムとの調整が出来ず断念しました。今できることを見つけていくとともに、どう社内で活用していくのか、社内システムと連動させていくのかが課題だと感じています。
PowerAutomateDesktopの中で使用していないアクションはまだまだたくさんあるので、もっと勉強して活用したいと思います✨

最後まで読んでいただきありがとうございました😀
身の回りの小さな課題解決①【PAD】を使ったメールの一斉送信

<H1>一斉送信メールの手間を減らしたい！</H1>私は現在入社2年目で旅行会社に勤務しております。(BtoC向けの旅行商品を扱う部署にてWEB販促などを担当しています。)<br>
日々の業務では、宿泊プランを提供してくださる施設担当者の方々と<B>メールで確認事項やお知らせなどのやり取り</B>を行うことが多く、部署内でも<B>もっと簡単にできないか？</B>との声が上がっています。
今回は、覚えたての<B>【Power Automate Desktop】通称PADを使って業務自動化</B>をすることで、身の回りの課題解決に挑戦しました。
<br><br>
尚、こちらのアイデアは、会社全体の課題をハイテク技術で解決！というより、<B>小さな課題を一瞬で解決する</B>ということを目的としています。PADの操作を覚えてすぐに活用してみた事例となるので、<B>【PAD初心者の方】</B>や<B>【自動化できそうな業務を探している方】</B>
は是非ご覧ください。

<H1>部署内の小さな課題①</H1>
／
<B>宿泊施設とのメールのやり取りが煩雑になってしまう。簡単にできない？？</B>
＼
具体的には…
◆担当者の方が変更になった際の都度のリスト更新が大変
◆メールの履歴から施設ごとの情報を探すのに時間がかかる
◆一斉送信後、担当者アドレス変更や登録ミスによる配信エラーの後追いに時間がかかる
<H1>以上の課題を踏まえ</H1>まずは、<B>すぐにできる簡単な部分</B>から<B>メールの一斉送信をPADで行う</B>ことに挑戦しました。現在もメールの一斉送信は別のシステムを活用して行っていますが、上記の課題解決のためにはPADの活用が有効ではないかと考えました。
<H1>使用ツール</H1>下記のサービスはそれぞれインストールやアカウント登録などの事前準備が必要になります。
*<a herf='https://powerautomate.microsoft.com/ja-jp/desktop/'>Power Automate Desktop</a>
*<a herf='https://www.office.com/'>Office365 Outlook</a>
<H1>最終完成イメージ</H1><B>PADの【実行】ボタンを一度押すとExcelの表にある宿泊施設の担当者の方へ一斉にメールが送信されました。</B>
※最後にも述べていますが、セキュリティソフトの関係で送信前の宛名確認チェックなどは手動で行いました。
※今回はTEST配信となるため、実際に送信した年末のご挨拶メールを参考に仮で文案作成、宛先も自分のアドレスを使用しています。<br>
▼実際に届いたメール
![メール受信例.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2496382/0bcb216b-691b-cac9-c8f2-6c4a3f27cf52.png)
▼上記オレンジ枠の部分は、施設メアドリストを想定したこちらのExcelから変数で情報を引っ張っています。
![スクリーンショット (556).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2496382/f3812ace-6d2c-1f4c-de5d-3a7d67f722c2.png)

<H1>PADのフローがこちら</H1>
【フロー開始～し完了までの時間（セキュリティソフト前まで）：<b>約10秒</B>】
簡単なフローをいくつか試すことで、変数ごとに持っている意味が少しづつ分かるようになりました。
![PADフロー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2496382/6ce40999-e558-4183-ad8a-3c49794d873e.png)

<H1>最後に</H1>
今回は、【宿泊施設とのメールのやり取りが煩雑になってしまう。簡単にできない？？】という課題から比較的簡単に実装できる【一斉送信】のみ切り抜いて自動化を試しました。Outlookから送信をする場合、誤送信防止セキュリティソフトの関係で最終確認には手作業が入りましたが、この部分を考慮しても一つのリストさえ確実に更新をすれば担当者変更の対応などもスムーズになるため、<b>作業時間短縮</b>にはつながると感じます。業務では、<B>まず課題保持者の部署の方々にもテストフローを試していただき、できる部分から実際に活用していければと思います。</B><br>
今回の内容と同様に、PADを活用して<B>部署内の小さな課題②</B>の解決も考えてみましたので良ければ併せてご覧ください。
最後までご覧いただき、ありがとうございました:airplane::sparkles:
M1 Macにnumbaをインストールする (numpy-quaternion)

numpy-quaterionをインストールして使用すると，

```
/Users/yura/.pyenv/versions/3.8.11/lib/python3.8/site-packages/quaternion/numba_wrapper.py:23: UserWarning: 

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Could not import from numba, which means that some
parts of this code may run MUCH more slowly.  You
may wish to install numba.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
```

のような警告がでるので，`pip install numba`が通らなかったのでインストール方法をメモ

```
＄ brew install cmake
$ arch -arm64 brew install llvm@11
$ LLVM_CONFIG="/opt/homebrew/Cellar/llvm@11/11.1.0_3/bin/llvm-config" arch -arm64 python3 -m pip install llvmlite
$ pip install numba
```
ReactとFirebaseでギターマニアのためのSNSを作った話

Qiita初投稿です。

#いきなりですが
今回作ったSNSはこちらになります。
![名称未設定.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565564/aec6f2ab-03d1-f648-d14a-2eddc3123cd2.gif)

https://my-newgear.web.app/

https://github.com/rokina/mynewgear

####その名もmy new gear...
####新しく手に入れた楽器や機材を共有するためのSNSです。

#my new gear...って何？
「__my new gear__」とは、新しい楽器や機材を手に入れたことを
Twitter等のSNSに投稿する際に使われる文言です。

![名称未設定.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565564/4aebda7f-3526-e573-1019-0649c387d6d4.gif)

Twitterで「__my new gear__」と検索すれば
杢目が美しいハイエンドギターや、めったにお目にかかれないビンテージの希少なアンプなど
様々な機材を見ることができます。

#そんなmy new gearですが
もともとは音楽機材のみに使われていた文言。
しかし、最近では音楽機材以外の投稿が急激に増えていっています。

例えば、洋服や食べ物、スマホアプリなど、もう何でもありです。

機材だけを見たい私にとっては、機材成分が薄まってしまうのは好ましくありません。
####そこで音楽機材に特化したSNSを制作することを決意しました。

#くわしく紹介します。
####まず、名前は「__my new gear...__」です。

そのまんまです。
![名称未設定](https://user-images.githubusercontent.com/42371397/150672028-305cd80a-f3e1-440a-94d0-c4be8742bb49.gif)

ファーストビューはこんな感じで

投稿された機材たちを一覧で見られるようにしています。

###詳細画面
一覧から、もっとよく見たい機材をクリックすると、モーダルが開いて詳細が表示されるようになっています。
ここでは、いいねやコメントがおこなえます。
また、投稿者はここから投稿を削除することもできます。
![名称未設定](https://user-images.githubusercontent.com/42371397/150672637-4c7a83d6-2ee0-45b4-b290-01393bef356b.gif)

モーダルは[Material UIのmodal](https://mui.com/components/modal/)を使っています。

###マイページ
画面右上のアイコンをクリックすることで、マイページに遷移することができます。
マイページではユーザーがいいねした投稿とユーザー自身の投稿を一覧で見ることができます。
ログアウトもこちらからおこなえます。
![名称未設定](https://user-images.githubusercontent.com/42371397/150672761-43f9205b-0253-44fa-b058-b56d89682245.gif)

###ログイン/新規登録
このSNSでは投稿やいいね、コメントをするのにログインが必要になります。
ログイン方法はTwitter、Googleアカウントを使ったログインとメールアドレス、パスワードを使用したログイン方法を用意しています。
メールアドレスでのログインはアカウントの新規作成が必要になるので、一度アカウントを作成しその後ログイン可能になります。
![名称未設定](https://user-images.githubusercontent.com/42371397/150672930-273ff2dd-aba4-4ad6-b7d7-2a39fa9ec1b2.gif)
ログインや新規登録の機能は「[Firebase Authentication](https://firebase.google.com/docs/auth?hl=ja)」で実装しています。
Twitterなどあらゆるアカウントを使った認証を簡単に実装できるのでかなりおすすめ。

###投稿画面
投稿画面もログイン画面と同じような作りになっています。
投稿された画像はwidth,heightが2200px以下になるようにリサイズされて、なんかいい感じに圧縮されます。
リサイズ＋圧縮には「[browser-image-compression](https://www.npmjs.com/package/browser-image-compression)」を使っています。かなりファイルサイズを減らせるのでびっくりです。
しっかりとファイルサイズを落としたところでfirebaseのストレージに保存されます。
![名称未設定](https://user-images.githubusercontent.com/42371397/150673091-6c6fb4a7-e148-42ce-8bf8-e72fbb52a951.gif)

####使用技術
react v17.0.2
firebase v8.10.0
typescript v4.4.2
tailwindcss v2.2.8

####環境
MacBook Air (M1, 2020)
macOS Monterey 12.1
Visual Studio Code 1.63.2

#まとめ
ログインや投稿など、一通りの機能がついたSNS？を開発するのは初めてのことだったので
まずはどこから手を付けていけば良いかがわからず、正直かなり苦戦しました。

開発を進めていく中で、追加したい機能は色々思いついていたのですが、
いつまでも完成しない状態になりそうだったので、シンプルな機能を実装したところで一旦完成としました。

とりあえずリリースすることができて良かったと思います。

#今後のこと
投稿単体のSNSシェアなど、開発中に思いつきまだ実装できていない機能があるので
そのあたりもゆるりとつくっていきたい。
Generic型のインターフェイスの型をダイナミックに定義する

DIを使っているプロジェクトで、Generic型のインターフェイスの型名をダイナミックに取得する必要があった。`Type.MakeGenericType` がそれなのだが、簡単なサンプルを書いてみて理解してみることにした。

# 定義
[Type.MakeGenericType(Type[]) Method](https://docs.microsoft.com/en-us/dotnet/api/system.type.makegenerictype?view=net-6.0)

 > Substitutes the elements of an array of types for the type parameters of the current generic type definition and returns a Type object representing the resulting constructed type.

という説明なのだが、これを読んだだけではいまいち理解できなかった。具体的なサンプルを書いてみる。

# サンプル

本来は、C# で使う `IOption<T>` をダイナミックに指定したいだけなのだが、ノイズが多くなるのでシンプルなクラスを作る。単純にジェネリック型を使って、定義している。さて、このインターフェイスをどうやってダイナミックに取得するか？

```IOptions.cs
    public interface IOptions<T>
    {
        T GetValue();
    }

    public class Options<T> : IOptions<T>
    {
        private readonly T _value;

        public Options(T value) {
            _value = value;
        }
        public T GetValue()
        {
            return _value;    
        }
    }
``` 

`MakeGenericType(Type[])` を使っているのはこんなコード

```csharp:MakeGenericType(Type[])の使い方
// サービスコレクションの定義
var services = new ServiceCollection();

// サービスコレクションに、Options<T> のインスタンスを IOptions<string> インターフェイスとして登録
services.AddSingleton<IOptions<string>>(new Options<string>("hello"));

// IOption<T> の型に `MakeGenericType()`を使って、パラメータとして型を渡す。
Type interfaceType = typeof(IOptions<>).MakeGenericType(typeof(string));

// どのようなインターフェイスの型になっているかを見てみる 
Console.WriteLine($"InterfaceName: {interfaceType.Name}<{interfaceType.GenericTypeArguments[0].Name}>");

// 取得したインターフェイスの型を渡してサービスの実体 Options<string>("hello") を取得する
var serviceProvider = services.BuildServiceProvider();
var option = serviceProvider.GetService(interfaceType);

// リフレクションでメソッドを実行
MethodInfo methodInfo = interfaceType.GetMethod("GetValue");
var result = methodInfo.Invoke(option, new object[] { });
Console.WriteLine(result);
```

```:実行結果
InterfaceName: IOptions`1<String>
hello
```

ちなみに、MakeGenericType(Type[] types) が本来の引数なので、必要な数のジェネリックパラメータを渡せばよい。

# ネステッドクラス

ドキュメントに面白い例が載っていた。このような場合は、どうやって、メソッドを使えばよいだろう？

```NestedClass.cs
    class NestedClass<A>
    {
        public class Second<B>
        {
            public class Third<C> { }
        }
    }
```

公式のドキュメントに乗っていたが、これは IL では次のように解釈される様子。

```
.class public NestedClas<A> {  
    .class nested public Second<A, B> {  
        .class nested public Third<A, B, C> {  
        }  
    }  
} 
```

この例で、`Third<C>` のインターフェイスを取得したければ、３つのパラメータを渡すとよい。

```csharp:ネステッドクラスサンプル
Type nestedType = typeof(NestedClass<>.Second<>.Third<>).MakeGenericType(new Type[] { typeof(string), typeof(int), typeof(byte[]) });
Console.WriteLine($"NetstedType: {nestedType.Name}<{nestedType.GenericTypeArguments[0].Name},{nestedType.GenericTypeArguments[1].Name},{nestedType.GenericTypeArguments[2].Name}>");
```

予想通り

```:実行結果
NetstedType: Third`1<String,Int32,Byte[]>
```

# まとめ

`MakeGenericType(Type[])`を使うと、ジェネリックインターフェイスやクラスの型を動的に作成することができるので、ジェネリック型のリフレクション操作を行いたいときや、DIのジェネリックインターフェイスを動的に指定したい場合に使えそう。
Expo Android apk テスト時に AdMob の広告が表示されず [ERROR_CODE_NO_FILL] エラーが返却される

# ソースコード

```jsx
<AdMobBanner
  key={index.toString()}
  adUnitID={
    Platform.select({
      ios: 'xxxxxxxx',
      android: 'xxxxxxxx',
    })
  }
  servePersonalizedAds
  onDidFailToReceiveAdWithError={(err) => console.error(err)}
/>
```

# 現象

`expo build:android`
で apk 作成し、実機でテストをすると、広告が表示されず、以下のエラーが発生している。

```console
ERROR_CODE_NO_FILL
```

（実際には `console.error` は確認できないので、サーバに送るとか、なんらかの方法で `err` を確認すると、上記内容が返却されていることに気付く）

# 解決策

単刀直入

PlayStore に登録すると問題が解決する。

https://github.com/expo/expo/issues/5420
2022/1/24主にITとかセキュリティの記事

通販、宅配装うメールに注意　県内、サイバー犯罪相談が増加(1/21)
https://www.iwate-np.co.jp/article/2022/1/21/108471

NFT×CC0の可能性(1/21)
https://hedge.guide/feature/possibility-about-cc0-nft-bc202201.html

AWS 環境への一時的な昇格アクセスの管理(1/21)
https://aws.amazon.com/jp/blogs/news/managing-temporary-elevated-access-to-your-aws-environment/

企業の老朽ソフト、世界で5割放置　サイバー攻撃懸念(1/22)
https://www.nikkei.com/article/DGXZQOUC106IK0Q1A211C2000000/

「中国当局に情報を抜かれる」北京五輪の出場選手に通達が出た異常事態(1/21)
https://www.mag2.com/p/news/525529

盗聴器、スパイツールは誰でも買うことができる…スマホ時代の予防策(1/22)
https://news.nicovideo.jp/watch/nw10435190

なぜ金融機関は「高齢者」に厳しくなったのか？厳重な「本人確認」のウラ事情(1/22)
https://gendai.ismedia.jp/articles/-/91234?page=1&imp=0

iOS15.3RCで「Safari」の個人情報が盗まれるおそれのあるバグを修正(1/21)
https://www.appps.jp/361277/

Wine 7.0が正式リリースへ(1/21)
https://www.zaikei.co.jp/article/20220121/657031.html

マイクロソフトも「カオス」参入　疑似障害で回復性をテスト(1/20)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020800017/011300665/

ヤマトHDが新データ分析基盤　AzureのPaaSで運用負担を軽減(1/20)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020800017/011300662/
UbuntuのVagrant Boxへのssh接続方法

ubuntuの公式でVagrant Box落としてくると毎回初回ログインの方法忘れるのでメモ。今更vagrantってのも芸が無いけど。

#####方法1
フツーに```vagrant ssh```で繋ぐ。自分の環境がwinなので、初回の設定用。


#####方法2

```
vagrant ssh-config
```

で鍵ファイルの場所を教えてくれる。

#####方法3
/etc/ssh/sshd_configのPasswordAuthenticationをyesに変える。```vagrant ssh```で繋いで変更した後自分の好きなターミナルで繋げば良い。UsePAMはyesのままで大丈夫。

いじょ
【Rails】dotenv-railsの導入方法

## はじめに
　本記事は、プログラミング初学者が、学習を進めていて疑問に思った点について調べた結果を備忘録も兼ねてまとめたものです。
　そのため、記事の内容に誤りが含まれている可能性があります。ご容赦ください。
　間違いを見つけた方は、お手数ですが、ご指摘いただけますと幸いです。

## dotenv-railsの導入方法

### dotenv-railsを導入
Gemfileに以下を追加

```:Gemfile
gem 'dotenv-rails'
```

`bundle install`する

```:Terminal
$ bundle install
```

### .envファイルの作成
アプリケーションフォルダの直下に.envファイルを追加

```:Terminal
~~~/sample_app $ touch .env
```

### .envファイルに環境変数を記述

```.env
SECRET_KEY= "test"
```

### rails cで確認

```:Terminal
~~~~/sample_app $ rails c
```

ENV['SECRET_KEY']と入力し、以下のように表示されれば成功

```:Terminal
 > ENV['SECRET_KEY']
=> "test"
```

以下のように表示された場合には、一度`exit`で抜け、`spring stop`を実行。
再度`rails c`で確認。

```:Terminal
 > ENV['SECRET_KEY']
=> "null"

 > ENV['SECRET_KEY']
=> "0"
```

### .gitignoreに.envを追加
.gitignoreに以下の通り記述し、Git管理下から除外する。

```.gitignore

/.env

```

記述後、念の為、`git status`で除外されていることを確認。

```:Terminal
$ git status
```