OmniAICreator/Qiita-1.07M huggingface dataset:
ABC227 チャレンジ結果

ABC227結果：A(1)B2完

まさかのCで問題の読み違え...頭の中で$A+B+C\leq N$を満たすのは？と変換されておりもちろん解けるはずもなく撃沈.

A：$K$が大きくて何周することになっても, 結局問題となるのは余りの部分. 余りを求めてから調整をどうするかで意外と時間がかかってしまった.

```C++:Last_Card.cpp
#include <iostream>
#include <vector>
#include <algorithm>
#include <set>
#include <cstdlib>
#include <cmath>
#include <tuple>
using namespace std;

int main(){
    int n, k, a;
    cin >> n >> k >> a;

    int b = k % n;
    int ans = a + b - 1;
    
    if (ans == 0){
        cout << 1 << endl;
    }
    else if (ans > n){
        cout << ans % n << endl;
    }
    else{
        cout << ans << endl;
    }

    return 0;
}
```

B：入力される$S_i$の範囲が$1\leq S_i\leq1000$であるため, まず可能性として$3a+3b+4ab$が取りうる値を1000程度まで全列挙する. 全列挙した集合に入ってるかどうかで答えを計算.

```C++:KEYENCE_building.cpp
#include <iostream>
#include <vector>
#include <algorithm>
#include <set>
#include <cstdlib>
#include <cmath>
#include <tuple>
using namespace std;

int main(){
    int n;
    cin >> n;

    vector<int> S(n);
    for (int i=0;i<n;i++){
        int x;
        cin >> x;
        S[i] = x;
    }


    set<int> kanousei;
    for (int a=1;a<=143;a++){
        int j = (1000 - 3 * a) / (4 * a + 3) + 1;
        for (int b=1;b<=j;b++){
            int x = 3 * a + 3 * b + 4 * a * b;
            kanousei.insert(x);  
        }
    }

    int ans = 0;
    for (int i=0;i<n;i++){
        if (kanousei.find(S[i]) == kanousei.end()){
            ans++;
        }
    }
    
    cout << ans << endl;
    return 0;
}
```

C：反省点は3点. 
・まず問題文をちゃんと読みましょう. 
・long long形でやらないと変な値になって返ってくる. 
・三乗根を取ると誤差でWAとなりかねないので, 積を用いた形で条件式を立てること.

```C++:ABC_conjecture.cpp
#include <iostream>
#include <vector>
#include <algorithm>
#include <set>
#include <cstdlib>
#include <cmath>
#include <tuple>
#include <math.h>
using namespace std;

int main(){
    long long n;
    cin >> n;

    long long ans = 0;

    for (long long i=1;i*i*i<=n;i++){
        for (long long j=i;i*j*j<=n;j++){
            long long le = j;
            long long ri = n / (i * j);
            
            long long kanou = ri - le + 1;
            ans += kanou;           
        }
    }
    cout << ans << endl;

    return 0;
}
```
余談だが, Cの問題名「ABC conjecture」とあってあの望月教授のABC予想に絡めた問題...!?とちょっと浮かれてしまった.

中々停滞を脱出できず...また灰に戻ってしまった.しかしこれが自分の真の実力とは認めない！という意気込みで次回に望む.
Android Studioでadbのパスを通すのに手間取った（Windows）

以下記事を参考にパスを通そうとしてもうまく通らないので、ウンウンうなってました。

[Android Studio's toolsのセットアップ](https://qiita.com/krile136/items/47b2e2cf2a7e586b6da3#android-studios-tools%E3%81%AE%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97)

なにが悪いんだろう？と思いながらターミナルで`echo $PATH`と打って
パスを確認してみると気づいたことが。

```bash:GitBash
echo $PATH
C:/Users/username/AppData/Local/Android/Sdk/platform-tools:/c/Users/username/bin:...
```

あ、**/c**/Users/username/binってなってるじゃん。。

ということで、

```bash:GitBash
export PATH=/c/Users/username/AppData/Local/Android/Sdk/platform-tools:$PATH
```

としたら、しっかりとパスが通り、adbコマンドが使えるようになりました。

Windowsだと「Android SDK Location」が`C:\Users\username\AppData\Local\Android\Sdk`のようになっていて、まるっとコピーできないので注意が必要ですね。
Googleアナリティクスの基礎的なマーケティング指標を解説

### 概要
マーケティングでは目標を達成できているか判断するために、必ず分析を行います。

分析を行うために使われるのが「指標」です。指標とはいわば目標をどれくらい達成できているのか、あるいは達成できていない場合はどのくらい乖離があるのかを判断する基準です。しかし指標の種類は多く、マーケターとして駆け出しの方はどれを追って分析すればよいのか判断しにくいかと思います。

そこで今回は初心者マーケター向けに、「Googleアナリティクス」といった分析ツールでよく使われる基礎的な指標を優しく解説していきます。

### 指標はなぜ必要か？複数組み合わせることで正確な分析が可能に！

指標が必要なのは、分析のとき勘だけに頼らずに数値でマーケティングパフォーマンスを計測する必要があるからです。

たとえばWebサイトのコンバージョン数が増えた際、なぜ増えたのかを「多分レイアウトを変更したからだ」というように多分で終わらせるのは危険です。これでは他メンバーにコンバージョン数が増加した理由をしっかり説明できませんし、ノウハウとしても社内で分析結果を蓄積しにくいです。

しかし「レイアウト変更前のCTAボタンのCTRは5％だったが、変更後は10％になった」というように数値で情報の補足ができるようになれば、説得力が増しますし「このCTAボタンパターンは前デザインより2倍のパフォーマンスを残した」というように数値で結果を整理して後の分析にもつなげることが可能です。

また「Webサイトデザイン全体の変更によりUU数が10％上昇、また直帰率は20％下がっているので上手く回遊性も確保できている」というように指標を組み合わせることで、分析結果をさらに深堀できるのもポイントになります。

### まずはこれだけ覚えよう！グーグルアナリティクスでも使われる基礎的な指標

ここからはグーグルアナリティクスといったツールで使われる代表的な指標を厳選してご紹介していきます。

<PV>

「ページビュー」の略です。要は期間内にどのくらいWebサイト内のページが閲覧されたかを示しています。

ページビューはこの後説明する「セッション数」や「UU数」と重なっている指標です。単にPVが稼げているからといってUUやセッション数が目標通り増えているとは限りません。

<セッション数>

期間内に何回Webサイトへ接続があったのかを計測して表示します。たとえば「20セッション中に30PＶが発生した」というように計測が可能です。

セッション数というのは、サーバーへ接続して閲覧を行うWebコンテンツ独特の考え方になります。

ユーザーのWebサイト離脱
Webページを指定時間放置（ツールの設定によって変わる）
日にちが次の日をまたぐ（4日23時30分～5日0時30分まで閲覧するなど）

といった条件が発生するとカウントが増えていきます。

<UU>

「ユニークユーザー」の略です。期間内にどれくらいのインターネットユーザーがWebサイトを訪問してくれたかを表しています。

指標の大きさ比較としては

PV＞＝セッション数＞＝UU

です。

PVはセッション数なしでは発生せず、セッション数もUUがいないと発生しないものだからです。

UUを計測する際は

IPアドレスを使う
Webブラウザー内にCookieを埋め込む

といったいくつかの方法があります。

方法によって計測の結果が変わるので、グーグルアナリティクスを始めとしたツール導入の際はUUをどうやって計測しているのか事前確認が必要です。

<回遊率>

Webサイト内ページをユーザーがどれくらい移動しながら閲覧したか（回遊したか）を表す指標です。

回遊率は

PV/セッション数

で計測されます。

セッション数に対してPVが多ければ平均的な回遊率が高い、つまり1セッションで何ページも閲覧されているWebサイトだと判断ができます。

<直帰率>

Webサイト内ページを1ページだけ見てブラウザーバックした割合を示します。1ページしか見ていないということは、ユーザーが最初に到達したページの内容に問題があると判断できます。

たとえばグーグルアナリティクスの場合

参照元をベースにした直帰率
ページをベースにした直帰率

といったように、複数の直帰率確認方法が活用できます。

「自社でアクセスした際に発生した直帰」といった不要な数値を排除しながら、直帰率の高いページを探して改善策を練ることがポイントです。

<離脱率>

ユーザーがそのページを最後にWebサイトを離脱した率を表しています。離脱は必ず発生するので高いからといって悪くはありませんが、内容によっては改善策を練る必要があります。

たとえば

資料請求ページ
問い合わせページ

といったコンバージョンにつながるページは、ユーザーがコンバージョン達成を完了させてから離脱するケースが多いため離脱率の高さが比較的問題になりません。しかし

回遊の際基点になるトップページ
資料請求や問い合わせページなどへ誘導するための宣伝ページ

などの離脱率が高いと、目的を達成できていないため改善を行い離脱率を下げる必要があります。

<CVR>

セッション数の中で、自社が設定した目標（コンバージョン）をどれだけ獲得できたかを表す割合です。

たとえばECサイトでは

会員登録
商品購入

といったアクションがコンバージョンになります。

グーグルアナリティクスといったツールでは、コンバージョンを事前に設定して計測が可能です。実装して計測する前にぜひ自社内でコンバージョンを明確に決めてツールへ埋め込みましょう。

### まとめ

今回はグーグルアナリティクスといったツールで使われる基礎的な指標を解説してきました。
二要素認証・二段階認証 とは

## 勉強前イメージ

なんだっけ・・・パッと出てこなかったんだけど
二要素認証がMFA認証も組み合わせる的なやつだっけ？

## 調査

### そもそも認証方式とは

本人確認を行うための認証で、以下の認証のための要素があります。

- 知識要素

ユーザが知ってる内容や知識を使用して認証する方式です。
例えば、よくあるのが `秘密の質問` として出身校などを登録して、
パスワードが忘れた際にメールアドレスと一緒に提出するものになります。
覚えてるものを提出するだけなので導入しやすい面、ずさんな管理をしていると
流出してしまうのでデメリットになります。

- 所有要素

ユーザの所有物で認証する方式で、ハードウェア等で認証します。
例えば、ワンタイムパスワードなどスマホの本体を登録して認証します。
この認証方式であれば、スマホが必要になりますのでセキュリティ対策として有効になります。

- 生体要素

ユーザの身体的特徴を利用するのが生体認証です。
顔認証や指紋認証などがこれに当たります。
ユーザ固有のものなので安全性が高い認証方式になります。

### 二要素認証 とは

上記から、二要素認証とは `異なる要素を2つ組み合わせる` 認証方式です。
例えば、AWSであれば `パスワード(知識認証)とMFA認証(所有要素)` でログインすると二要素認証になります。

### 二段階認証 とは

二段階認証とは、二段階に分けて認証を行う方法で、段階ごとに要素は同じでよいです。
例えば、パスワードと秘密の質問の知識要素を二段階で行うことでも二段階認証になります。

### 二要素認証と二段階認証の違い

違いは以下になります。

- 二要素認証 → 異なる要素を使用する
- 二段階認証 → 同じ要素を使用する

## 勉強後イメージ

パッと出てこなかったけど、調べたらたしかにそうだなって思った。
そう考えたら二要素認証の方がセキュリティ高そうだけど、ユーザ的にめんどくさくなるよね。

## 参考

- [「二要素認証」と「二段階認証」の違い](https://www.segunabe.com/2018/08/31/passclipnews180831/)
- [二要素認証と二段階認証の違い](https://www.techfirm.co.jp/blog/two-step-verification-two-factor-authentication.html)
VMware Hands-on Lab (VMware HoL)でお手軽ハンズオン体験 (VMware Cloud on AWS編)

# 1. はじめに
VMware仮想化製品について学びたい方、新しいテクノロジーのハンズオン体験をしてみたい方。
VMware社が提供する仮想ハンズオン環境([VMware HoL](https://web.hol.vmware.com/landingPages/index.html?id=HOL-Japan))で、なんと誰でも無料でハンズオン体験ができちゃいます！

日本語版VMware HoLは[こちら](https://web.hol.vmware.com/landingPages/index.html?id=HOL-Japan)。（グローバル版は[こちら](https://hol.vmware.com/)）
※ちなみにグローバル版(英語)は３種類のコースがあって、完了まで３０分以下お手軽シミュレーションの「Lightning Labs」、より詳しくVMware製品が分かる「Comprehensive Labs」、腕試しをしたい方向け「Odyssey Game Labs」に分かれています。

もうちょっと詳しくVMware HoLについて知りたい、という方はこちらVMware Japan社の解説記事もご参照ください。
##### [さわってわかる ハンズオンラボ！ (VMware Japan)](https://www.vmware.com/content/microsites/learn/ja/jphol.html)

> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/27d02b1a-5b13-36cf-13a4-aadff5048ba9.png)

# 2. My VMwareアカウント作成 (作成済みの方はスキップ)
VMware HoL環境を利用するには、まずはMy VMwareアカウントを作成する必要があります。(もちろん無料！)
「ラボを開始する」をクリックすると、下図の画面に遷移するので指示に従ってアカウント作成します。
> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/ccbcd5c7-a2f9-9b6b-50dc-be5d4b06c967.png)

> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/c4bebe65-9ef7-06f0-1a71-0fcdf5da859c.png)

# 3. おすすめVMware HoLコース (VMware Cloud on AWS編)
##### [VMware Cloud on AWS ライトニング ハンズオン ラボ](https://customerconnect.vmware.com/jp/web/vmware/evalcenter?p=vmc-on-aws-hol-lightning-21)
30分で完了するお手軽コースです。VMware Cloud on AWSの雰囲気を体感できます。

##### [Amazon FSx for NetApp ONTAP integration with VMware Cloud on AWS のハンズオンラボ](https://vmc.techzone.vmware.com/?share=isim_demo2842&title=hands-on-lab-demo-vmware-cloud-on-aws-integration-with-amazon-fsx-for-netapp-ontap)

ログインなど一切不要で、アクセスすればすぐにどなたでもAmazon FSx for NetApp ONTAP連携の簡易シミュレーションを体験できます。（便利！）
10-15分ぐらいで完走できるので、イメージ掴むのに最適かと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/d5ec24a8-7a83-64c1-f730-eded64b554bf.png)

## そのほかおすすめ (英語版のみ)
各1.5時間ぐらいかかりますが、ライトニングのコースだけではもの足りない！という方におすすめです。
最初は入口が少し分かりにくいのですが、こちらの[VMware HoLカタログサイト](https://labs.hol.vmware.com/HOL/catalogs/catalog/)に遷移すれば日本語版以外の全コースが閲覧できます。コースはアップデートされたり新規追加もされるのでたまに覗いてみると良いかもしれません。

##### VMware HoLカタログサイト: https://labs.hol.vmware.com/HOL/catalogs/catalog/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/a8a3f1b7-4487-59e8-cff6-366bbdf1e51f.png)


##### Cloud Migration to VMware Cloud on AWS (HOL-2287-02-ISM)
パワフルなマイグレーションツールである"[VMware HCX](https://www.vmware.com/jp/products/hcx.html)"を利用して仮想マシンのマイグレーションをハンズオン体験できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/da58c019-98ee-aae7-fa72-1e974c993684.png)

##### HOL-2193-01-ISM - VMware Cloud Disaster Recovery
VMware Cloud on AWSを利用した災害対策(DR)ソリューションである"[VMware Cloud Disaster Recovery (VCDR)](https://www.vmware.com/jp/products/cloud-disaster-recovery.html)"をハンズオン体験できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/141e6620-d6a4-0d46-3a0b-397b31cd031a.png)

他にもたくさんコースがあります。興味があるものからお手軽にお試しください。

# 4. 関連記事

https://qiita.com/sanjushi003/items/175aad0ccdbb3488bfda
Windows App SDK, WinUI3, Desktopでファイル選択ダイアログを表示する

この記事はWindows App SDK Preview 3をベースにしています。

今回の目標はファイル選択ダイアログを表示することです。

WinUI3 DesktopではUWPと同じようにFileOpenPickerを使います。フォルダを選択したい場合はFolderPickerです。

``` cs
public sealed partial class MainWindow : Window
{
    public MainWindow()
    {
        this.InitializeComponent();
        Handle = this;
    }

    public static MainWindow Handle { get; private set; }
}
```

MainWindowのインスタンスをゲットできるようにしておいて…。

``` cs
using MvvmGen;
using System;
using Windows.Storage.Pickers;

[ViewModel]
public partial class SamplePage1ViewModel
{
    [Property]
    private string sampleText = "N/A";

    [Command]
    private async void SampleButton()
    {
        var picker = new FileOpenPicker();
        picker.FileTypeFilter.Add("*");

        InitializeWithWindow.Initialize(picker,
            WindowNative.GetWindowHandle(MainWindow.Handle));

        var file = await picker.PickSingleFileAsync();
        if (file != null)
            SampleText = file.Path;
    }
}
```

FileOpenPickerを生成してファイル選択ダイアログを表示します。

`InitializeWithWindow.Initialize`でダイアログのハンドルをメインウィンドウのハンドルで初期化しています。これがないとお約束の`System.Runtime.InteropServices.COMException`の例外がまた発生してしまいます。

この回避策は、嫌な回避策です。Windows App SDKがこなれてきたら、いずれ不要になると思いたいです。

``` cs
<StackPanel>
    <TextBlock Name="SampleText" FontSize="100" Text="{Binding SampleText}"/>
    <Button Content="Fire!" Command="{Binding SampleButtonCommand}"/>
</StackPanel>
```

そしてもちろん、XAMLでボタンを設置してコマンドにバインドします。

コマンドの実装にはMvvmGenを使用しています。MvvmGenを使わなくてもダイアログの表示はできます。`[ViewModel]`属性、`[Command]`属性についての詳細は以下の記事を参照してください。

https://qiita.com/hayashida-katsutoshi/items/9f6f08e224f2fee23e4b
Reactを基本からまとめてみた【17】【Props（プロップス）②】

##Propsとは

- 親コンポーネントから子コンポーネントへ値を渡すための仕組み
- 子コンポーネントの引数にpropsを指定する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939638/8a4e3815-0d6d-db21-cae0-d10763dbf2d3.png)

- コンポーネント<br>⇨　画面要素の１単位。大（１画面）からの小（１つのテキストボックまだ様々）
- Props<br>⇨　コンポーネントに渡される引数的なもの

##propsでデータを受け渡す

```App.jsx
import Article from './components/Article';

function App() {
  return (
   <div>
    <Article 
      title={'React入門'}
      content={'propsについて'}
   </div>
 );
};
export default App;
```
```conponents/Article.jsx
const Article = (props) => {
　return (
     <div>
      <h2>{props.title}</h2>
      <p>{props.content}</p>
     </div>
  );
};  
export default Article;
```

##propsで受け渡セルデータ

- propsのデータは{}に記述
- 文字列、数値、真偽値、配列、オブジェクト、日付などOK
- 変数を渡すことも可能
- 文字列は{}なしでもOK







##Hands on

```App.js
import React from "react";

const App = () => {
  const onClickButton = () => alert();
  const contentStyle = {
    color: 'blue',
    fontSize: '18px'
  };
  const contentSecondStyle = {
    color: 'yellow',
    fontSize: '18px'
  };
  return (
    <>
      <h1 style={{ color:'red'}}>おはよう</h1>
      <p style={contentStyle}>お元気ですか？</p>
　　　 <p style={contentSecondStyle}>お元気です</p>
      <button onClick={onClickButton}ボタン</button>
    </>
  );
};
export default App;
```
##上記のコードをcomponentを使用して書き換える

```App.js
import React from "react";
import Message from "./components/Message";

const App = () => {
  const onClickButton = () => alert();
  
  return (
    <>
      <h1 style={{ color:'red'}}>おはよう</h1>
      //Patern 1
      <Message clolor='blue' greeting='お元気ですか？'/>
　　　 <Message clolor='yellow' greeting='お元気です'/>

     //Patern 2
      <Message clolor='blue'>お元気ですか？</Message>
　　　 <Message clolor='yellow'>お元気です!</Message>

      <button onClick={onClickButton}ボタン</button>
    </>
  );
};
export default App;
```

```Message.js
import React from "react";

const Message = (props) => {
//console でpropsの中身を確認する
　//console.log(props);

  const contentStyle = {
    color: props.color,
    fontSize: '18px'
  };

return
//Patern 1
<p style={contentStyle}>{props.message}</p>;
//Patern 2
<p style={contentStyle}>{props.children}</p>;
};
export default Message;
```




##参考サイト
[モダンJavaScriptの基礎から始める挫折しないためのReact入門]
(https://www.udemy.com/course/modern_javascipt_react_beginner/learn/lecture/21899530#overview)
[propsとstateのイメージをつかむ【はじめてのReact】]
(https://qiita.com/rio_threehouse/items/7632f5a593cf218b9504)
[#04 新・日本一わかりやすいReact入門【基礎編】コンポーネントとprops]
(https://www.youtube.com/watch?v=Q-df0QgZuhE&t=325s)
FirebaseCLIを使ってFirebase AuthenticationをExport/Importする

# Export
## コマンド
```bash
$ firebase auth:export 出力するファイル名とパス --format=フォーマット(CSVかJSON) --project=firebaseプロジェクトID

# 具体例
$ firebase auth:export prod_authentication.json --project=sample-project-prod
Exporting accounts to prod_authentication.json
✔  Exported 1000 account(s) successfully.
...
```
## 解説
* 基本的には[Firebase公式ページ](https://firebase.google.com/docs/cli/auth?hl=ja#auth-export)記載の通りだが、--projectを付けて明示的にプロジェクトを指定しないと```Error: An unexpected error has occurred.```というエラーが発生し、実行することができない
    * 同じ事象に遭遇している[Stackoverflow記事](https://stackoverflow.com/questions/59831286/export-firebase-user-account-emails)を参考
* フォーマットはCSVとJSONを選択できる。構造的にはJSONの方が美しく見やすいのでお勧め。
* ファイル名にフォーマットの拡張子(.csv, .json)を付けると--formatを付けていようが拡張子のフォーマットが優先される
* ファイル名にパスを指定しない場合、Firebaseプロジェクトのルートにファイルが出力される
* 1000件を超える場合、1000件出力が成功するごとにコンソール上にログが出力される
* 処理自体は2万件ほどであれば1分かからない程度で終了する

# Import
## コマンド
```bash
$ firebase auth:import ACCOUNT_FILE    \
    --hash-algo=HASH_ALGORITHM         \
    --hash-key=KEY                     \
    --salt-separator=SALT_SEPARATOR    \
    --rounds=ROUNDS                    \
    --mem-cost=MEM_COST                \
    --project=project                  \

# 具体例
$ firebase auth:import prod_authentication.json   \
    --hash-algo=SCRYPT                            \
    --hash-key=key                                \
    --salt-separator=XXX                          \
    --rounds=100                                  \
    --mem-cost=100                                \
    --project=sample-project-dev
Processing prod_authentication.json (XXX bytes)
Starting importing 1000 account(s).
✔  Imported successfully.
...

```
## 解説
* Exportと同様に基本は公式ページ記載の通りだが、単純にImportしたいだけの場合、上記のパラメータが最小限の設定となる
* それぞれのパラメータはImportしたいFirebaseプロジェクトの「パスワードハッシュパラメータ(hash_config)」に記載の値を設定する。パスワードハッシュパラメータはAuthentication->Usersのテーブルヘッダーの三点リーダーから表示することができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133960/51e20ac5-65f1-1a62-c9a5-06d8d5193784.png)
* 上記コマンドのパラメータとhash_configのマッピングは以下の通り

| パラメータ | hash_configのフィールド |
| ---- | ---- |
| hash-algo | algorithm |
| hash-key | base64_signer_key |
| salt-separator | base64_salt_separator |
| rounds | rounds |
| mem_cost | mem_cost |

* Exportと同様に、1000件を超える場合、1000件出力が成功するごとにコンソール上にログが出力される

# まとめ
* 公式ページに足りていない情報を補足しつつ、Export/Importコマンドを具体的に解説しました
* 多くのFirebaseプロジェクトで、本番環境のデータをDevやStagingに移したいというユースケースがあると思う。本記事を元に、小さな調べごとをせずにデータ移行して頂ければ幸いです。

# 参考資料
* [Firebase公式ドキュメント - auth:import と auth:export ](https://firebase.google.com/docs/cli/auth?hl=ja)
VSCode : keybindings.jsonで押しにくいキーを押しやすいようにカスタマイズしよう

ctrl shift P で「基本設定：キーボードショートカットを開く（JSON）」をみつけてkeybindings.jsonを開く

ctrl shift P で「基本設定：キーボードショートカットを開く」も開いておき、

現在設定されているキーをとそのキーが持つコマンドを確認できるようにしておく。

今回自分はgit copilot によるサジェストが出てきたときに望んだものでなければサジェストを消したかった。

もともとはそうするにはEscキーを押せばよいのだが、いかんせん端にあるので非常に押しにくい。

そこで基本設定：キーボードショートカットからEscapeで検索をかけて、サジェストが消えそうなコマンドをしらみつぶしに探していったところ以下のコマンドの時に目的が達成された。

![スクリーンショット 2021-11-14 143359.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697447/8c5ccfb8-00f0-395d-19a5-2bbfafd5a608.png)



最後にkeybinds.jsonに以下のコードを描いて,ctrl + n を押したらescキーを押したときと同じ動作にできる。

```
{
"key": "ctrl+n",
"command" : "editor.action.inlineSuggest.hide",
"when": "editorTextFocus"
}
```

### 余談：

ほかにも自分は　ctrl + j, k, l, ; , のコマンドでカーソル←↓↑→を設定したりしている。

たとえばctrl + j で左に一つカーソルを移動するには以下のようにする。

```
{
"key": "ctrl+j",
"command": "cursorLeft",
"when": "editorTextFocus"
}
```
kubectlでTLS(SSL)証明書のSecretをKubernetesに作成する

```bash
kubectl create secret tls {Secret名} \
  --cert={証明書ファイルのパス} \
  --key={鍵ファイルのパス} \
  -n {お好きな名前空間}
```

このコマンドを実行すると、下記のようなYAMLのリソースが作成される。kubectlで作成したくない場合はYAMLを作成してから、`kubectl create -f`としても同じ結果になる。

```yaml
apiVersion: v1
kind: Secret
metadata:
  name: test-tls
  namespace: default
data:
  tls.crt: >-
    {証明書ファイルをBASE64エンコードしたもの}
  tls.key: >-
    {鍵ファイルをBASE64エンコードしたもの}
type: kubernetes.io/tls
```
Macのターミナルでたまに使うコマンド一覧 ファイル操作編

## ファイルの更新時間の変更 touch(touch)

ファイルのタイムスタンプを現在日時に変更するコマンド。ファイルが存在しない場合は中身が空の0バイトのファイルを作成する。

**touch [オプション] ファイル名**

**書式例**

```shell:touch
touch abc.txt
```

**オプション**

```shell:-t
touch -t 11141200 abc # ファイルの更新時間を指定。時間は[MMDDhhmm]
```

## ファイルの先頭の一部の取得 head(head)

ファイルの先頭の一部を閲覧するためのコマンド。エディタを使用しなくても確認できる。

**head [オプション] ファイル名**  

**書式例**

```shell:head
head abc.txt
```

**オプション**

```shell:-n
head -n 10 abc # 先頭から指定した行数を出力。例では10行
```
```shell:-c
head -c 100 abc # 先頭から指定したバイト数を出力。例では100バイト
```

## ファイルの末尾の一部の取得 tail(tail)

ファイルの末尾の一部を閲覧するためのコマンド。エディタを使用しなくても確認できる。

**tail [オプション] ファイル名**  

**書式例**

```shell:tail
tail abc.txt
```

**オプション**

```shell:-n
tail -n 10 abc # 末尾から指定した行数を出力。例では10行
```
```shell:-c
tail -c 100 abc # 末尾から指定したバイト数を出力。例では100バイト
```
```shell:-f
tail -f abc # ファイルの状態をリアルタイムでモニタリングする
```
エンジニアになって半年が経ったので、振り返り

# はじめに

2021年5月より、大阪のベンチャー企業でエンジニアとして働かせてもらっています。

入社時はエンジニア完全未経験、更には会社所属歴もない28歳でしたが、いまは人間関係もすごくいい環境で働けています。
早々に戦力になるべく精進の毎日です。

この記事では自分自身の振り返りをつらつらと書いていきます。これからエンジニアを目指している方や、エンジニアデビューしたばかりの方の参考になれたらと思います。

2ヶ月の段階でも気づいたことの記事を書いていますので、こちらもよろしければ。

[https://qiita.com/keitaUenishi/items/b09a34bcbf02ffff8e67]

# 今やっていること

主な業務として、企業向けの営業支援アプリケーションを開発しています。

使用している技術は以下です

言語・FW

- C#, [ASP.NET](http://ASP.NET) MVC
- HTML
- CSS
- JQuery
- SQL

開発環境

- Git
- Redmine
- Visual Studio
- Oracle DB

また、最近は自社のオウンドメディア開発にも参加させてもらったりします。

こちらで使用されている技術は

- React
- TypeScript
- Gatsby.js
- GraphQL
- Netlify
- Docker

などなど。

こうしてみると、いろんな技術に触れさせてもらっているなと感じます。

まだどれも「ﾅﾝﾓﾜｶﾗﾝ」と「ｶﾝｾﾞﾝﾆﾘｶｲｼﾀ」を毎日往復しているような感じです。

# やって良かったこと

### 毎日勉強を続けた

平日、帰宅後もとりあえず22時頃まではPCの前にいよう。というゆるい考えから習慣を作ってみたらいい感じに継続できています。仕事でも家でもハマりまくって何してたんやこの時間……となることもありますが、最近ようやく、そういった経験とかが活きてるなと感じられるようになってきました。

勉強を続けていくうちにできることも少しだけ増えてきて、いろいろな技術を触るのが楽しくなってきてるので、継続は本当に効果絶大だなと日々感じています。

### DBの基本をしっかりと学習したこと

入社前、DBの基礎もSQLもほぼ無知でしたが、今ではかんたんなSQLとかならなんとか書けるようになってきました。まだ入社前の自分にいうとするならば、正規化だけでも勉強すると理解速度がだいぶ変わるぞ！ と言うと思います。

### 学習と同時に、自分なりのクソアプリを作ってみた

こんな感じのお遊び占いアプリ作ったりしました。

[https://jolly-ramanujan-636c00.netlify.app/](https://jolly-ramanujan-636c00.netlify.app/)

コード
[https://github.com/KeitaUenishi/monster-divination](https://github.com/KeitaUenishi/monster-divination)

Reactチュートリアルやって、そのあとすぐ見様見真似で作ったのでコードは悲惨ですが、動くものとして作るとやっぱり楽しいし、理解が深まります。

リファクタリングして、もっとふざけたアプリにしていこうか考え中。

### 社内で積極的にアウトプットした（勉強会したり、ドキュメント作ったり、会社のブログ書いたり）

これはまだまだの部分もありますが、これからもどんどんやっていこうと思います。

### 筋トレ

1年ちょっと、マイペースに週3で続けてますが明らかに体が変わってきました。

仕事後のジムは頭がスッキリするので、いい意味で中毒感あります。

### マイキーボード買った

楽器とかもまずは形からといいますが、自分のお気に入りはやっぱりテンションが上がります。毎日使うものなので、お金かけて間違いないです！ 沼ですが！

現在の愛用機。
[https://rog.asus.com/jp/keyboards/keyboards/compact/rog-falchion-model/](https://rog.asus.com/jp/keyboards/keyboards/compact/rog-falchion-model/)

光らせるの、はじめは興味なかったんですがいざ持ってみると「ふつくしい……」という感情でいっぱいになり、幸福度が上がることを知りました。ぜひぜひ、みんなでギラギラ光っていきましょう。

# 反省など

### もっと技術的なアウトプットをやっていく

アウトプットしたら理解が深まるのはわかっているが、なかなかできてない。習慣化してどんどんアウトプットしていくようにする。

### 何をやるのかを明確にする

いろいろ触っているので、今日はどれをやるとかどんなことをやるとか明確にしとかないと一瞬で時間が溶ける（というか溶けまくった）

無駄ではなかったとは思っていますが、ある程度どんなエンジニアになりたいのかの具体像はもっと明確にしていかなければなと感じました。

今後より一層考えていきたいと思います。

### 個人開発

いろいろ作りたいアプリはあるが、どんな技術を使おうか → 色々触ってみよう！（今ここ）
になっていて全然開発を始められていない。

まずやってみるスタイルでどんどんやっていきたい。


### その他いろいろ

細々としたことはたくさんありますが、上げていくときりがないのでこんなところで……

# まとめ

半年経って、まだまだわからないことだらけで道は果てしないな……と感じつつも、結果としてはエンジニアになれてよかったなとずっと感じられています。

最も感じられる点として、

- スキルやコードで、自分の成長を客観的に見れる
- IT知識がわかってくると、世の中のニュースや動きがわかって楽しい
- 努力次第で、いろいろなんとかなりそうと考えられるようになった

かなと思います。「いろいろなんとかなりそう」ってめちゃくちゃアバウトですが、心理的にこれがあるのはすごく大きいです。（大変なのはもちろん承知のうえです）
業界に入ってから「技術力がある人」は本当に重宝されているなと日々感じるので、自分も努力してああなっていければ！ という気持ちがモチベーションになっています。

まだまだ発展途上の業界だと思うので、これから先どうなっていくのかを考えながら積み重ねていくのが楽しいです。1年経った頃にはもっと色々できるように頑張っていこうと思います。

以上、個人的な振り返りをつらつらと書きました。ありがとうございました！
Windows App SDK, WinUI3, Desktopでダイアログボックスを表示する

この記事はWindows App SDK Preview 3をベースにしています。

![p5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568364/3ef67cb9-cc76-5db6-3bcb-c80650804fce.png)

こいつを表示するのが今回の目標です。これまでのWPF/Windows Forms/Win32 APIではMessageBoxを使っていました。しかしWinUI3 Desktopでは基本的にこれらは使えません(使えなくはありませんが、WinUI3である意味が…)。

WinUI3 DesktopではUWPと同じようにMessageDialogまたはContentDialogを使います。

``` cs
public sealed partial class MainWindow : Window
{
    public MainWindow()
    {
        this.InitializeComponent();
        Handle = this;
    }

    public static MainWindow Handle { get; private set; }
}
```

MainWindowのインスタンスをゲットできるようにしておいて…。

``` cs
using Microsoft.UI.Xaml.Controls;
using MvvmGen;

[ViewModel]
public partial class SamplePage1ViewModel
{
    [Command]
    private async void SampleButton()
    {
        var cd = new ContentDialog
        {
            Title = "Sample Application",
            Content = "Hello World!",
            CloseButtonText = "OK"
        };

        cd.XamlRoot = MainWindow.Handle.Content.XamlRoot;
        await cd.ShowAsync();
    }
}
```

ContentDialogを生成してダイアログを表示します。

XamlRootにMainWindowのXamlRootを指定しているところが肝になります。desktopではこれがないと`System.Runtime.InteropServices.COMException`の例外が発生してしまいます。これはいずれ解消されるバグだと思いますが…。

``` xml
<Button Content="Fire!" Command="{Binding SampleButtonCommand}"/>
```

そしてもちろん、XAMLでボタンを設置して、SampleButtonにbindします。

コマンドの実装にはMvvmGenを使用しています。MvvmGenを使わなくてもダイアログの表示はできます。`[ViewModel]`属性、`[Command]`属性についての詳細は以下の記事を参照してください。

https://qiita.com/hayashida-katsutoshi/items/9f6f08e224f2fee23e4b
iOSのAudioSessionを理解するのに役立ったサイト5選


仕事でiOSのAudioSessionについていろいろ調べる機会がありまして、その際に役になったサイト様を紹介します。

# AppleDeveloper（公式）

- https://developer.apple.com/documentation/avfaudio/avaudiosession
- https://developer.apple.com/documentation/avfaudio/avaudiosession/mode
- https://developer.apple.com/documentation/avfaudio/avaudiosession/category

まずは公式を抑えておきましょう。

# iOSアプリ開発 入門 (6) - AVAudioSession

- https://note.com/npaka/n/nfaf451311d56

AudioSessionについての説明と扱い方のとてもわかりやすい説明がされています。入門記事としておすすめです。

# iOS Apps Developer's Note

- https://mozx.org/coursenote/AudioSession/

こちらのサイトが一番勉強になりました。全17回に渡って、AudioSessionについての概要や、各CategoryやMode挙動などが解説されています。少し古いですが、基本的な部分は変わっていないと思うのでまず最初に読む記事としておすすめです。

# AVAudioSessionの深い話

- https://blog.meteor.ne.jp/2019/12/avaudiosession

こちらもModeとCategoryの簡単な説明や、VoiceChatモードを指定したときの挙動、CategoryOptionsの紹介などがありました。

# AVAudioSessionで録音する際に、音はbluetoothイヤホン、マイクはデバイスマイクを使いたい

- https://zenn.dev/yoonchulkoh/articles/073bdcd1f7f818

録音するときに音声出力はBluetoothイヤホンで、マイクはデバイスで使いたい場合のやり方の解説でした。音声再生や録音のBluetoothのプロファイルは主にハンズフリー通話用のHFPと、ステレオ再生用のA2DPがありますが、A2DPを使うことで結果的にBluetoothによる音声キャプチャを無効化し、デバイスのマイクを使えるようになるということです
【Python】NetCDFの作成方法

## 概要
気象データなどでよく用いられるNetCDF（拡張子.nc）。
Pythonでかなり簡単に扱えるので、使い方を説明。

- PythonでNetCDFを使いたい！
- NetCDFの形式を知りたい！

な方の参考になれば。


## 事前準備
netcdf4を入れておく必要がある。pipなら以下のコマンドで。

```bash:bash
pip install netcdf4
```

## 書き込み方

今回は全球気温データ（lon, lat, temp）の格納を想定。

### 簡略版

```python:python
import netCDF4 as nc4

nc = nc4.Dataset(ncPath, "w", format="NETCDF4")

"""
lonList(1d), latList(1d), tempList(2d)にデータを格納
"""

nc.createDimension("x", len(lonList))
nc.createDimension("y", len(latList))

lon = nc.createVariable("lon", "i2", "x")
lat = nc.createVariable("lat", "i2", "y")
temp = nc.createVariable("temp", "i2", ("y", "x"), fill_value=99999)

lon[:], lat[:], temp[:, :] = lonList, latList, tempList

nc.close()
```
netCDF4.Dataset()でファイルを開く。
Python3.9で可能なフォーマットは以下の通り（何が違うのかはよくわからない...）。

- NetCDF
- NetCDF4
- NetCDF4 Classic
- NetCDF3 Classic
- NetCDF3 64Bit Offset
- NetCDF3 64Bit Data


また、**createDimension**で次元を設定後、**createVariable()**で変数を作成可能。
引数は`データ名称、型（i1=int8, i2=int16, etc.）、形状`。
fill_valueで欠損値の登録が可能なのも非常に便利。


### 各種情報追加
上記でデータとしては問題ないが、NetCDFファイルではデータ内の変数の単位などの登録が可能。

```python:python
nc.history = "Create New"
temp.long_name = "Temperature"
temp.units = "Degree of Celsius"
```

**history**でファイルの履歴を登録可能。データ作成日時などを入れたら良さそう。
変数については**long_name**で名称、**units**で単位を登録可能。
内容はprintすれば簡単にみれる。

```python:python
print(temp)
"""
<class 'netCDF4._netCDF4.Variable'>
int8 t(lat, lon)
    _FillValue: -97
    long_name: Temperature
    units: Degree of Celsius
unlimited dimensions: 
current shape = (13, 36)
filling on
"""
```


## ターミナル上での中身の確認

中身はターミナル上で**ncdump**コマンドを使って確認可能。
オプションは色々ありますが、ヘッダのみ良い方はhオプションを入れてください。

```bash:bash
$ ncdump {ファイルパス}
```

## 読み込み

読み込むときも書き込み時とほぼ同じ。
nc.variblesで該当する変数名を入れたらデータが取り出せる。

```python:python
import netCDF4

nc = netCDF4.Dataset('netcdf.nc', 'r')
temp = nc.variables['t'][:]
```

## まとめ

NetCDF4で簡単にNetCDFのデータの扱いが可能。
ncdumpで確認しなくても、Pythonソース上で情報を見ることもできる。

## その他

GitHubに今回実装したソースを置いています。

https://github.com/khfkd/netcdf
rosoutのトピックを見る

rosプログラム内でデバッグ用のloginfoなどを使用すると`rosout`というメッセージが出力されます。今回はこのトピックがどんな感じか見てみます。

まず,roscoreと以下URLのプログラムを実行します。

https://qiita.com/hoshianaaa/items/5c5738e85221a86efa90

そして,`rostopic echo /rosout`を実行します。

結果は以下のように,`メッセージ`やその`ログレベル`,`実行ファイル名`などが表示されます。

![rosoutのトピック様子.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/0d73dab7-45bc-7451-5833-61df44160b7a.gif)

因みに`rosout`のメッセージ型は`rosgraph_msgs/Log`というものみたいです。

```
$ rostopic type /rosout
rosgraph_msgs/Log
```
MAMPで「Operation not permitted」phpファイルが表示しない

##phpファイルが表示しない

PCを買い替えて（MacOS Monterey（M1チップ））
MAMPでphpのお勉強をしようとしたら、表示しなくなった:thinking:

##解決できた参考サイト
知らなかった・・・
>OS X 10.11 El Capitanより追加されたセキュリティ機能、SIP（System Integrity Protection）によって以下の領域がガードされています。
/bin
/sbin
/System
この配下では，rootユーザでも書き込みできません。

>[初心者向け　MacでOperation not permittedの解決方法]
(https://qiita.com/iwaseasahi/items/9d2e29b02df5cce7285d)　より

##解決にいたるまで
>このページは動作していません
localhostでは現在この処理を操作できません
HTTP ERROR 500

**①MAMPの設定（Preferences）の確認**　**←問題なさそう**　
・Apache Port:80
・Nginx Port:80
・MySQL Port:3306
・Document root　も確認した。

**②ファイルを開いているURLのパスの確認**　**←問題なさそう**　

んー、今まで通りの設定にしたはずなんだが・・・

**③エラーメッセージの表示** **←おっ！**　
すると、以下のようなエラーメッセージ　**←パスとパーミッションが通ってなさそう！**　

>
Warning: Unknown: failed to open stream: Operation not permitted in Unknown on line 0
>
Fatal error: Unknown: Failed opening required 
'/Users/（ユーザー名）/(パス)/index.php' (include_path='.:/Applications/MAMP/bin/php/php7.4.21/lib/php') in Unknown on line 0

※phpのバージョンは各々で。自分は、この時のphpのバージョンは7.4.21

[参考]
>[MAMPでエラーメッセージを表示させる方法【php.iniの変更】
](https://sunsukeblog.com/mamp_error)

**④phpのパスを確認**

```
$ which php
```
すると

```
php not found
```
パスが通ってなかったのか

```
export PATH=/Applications/MAMP/bin/php/php7.4.21/bin:$PATH
```
設定を反映させる

```
$ source ~/.bash_profile
```

```
$ which php
```
すると、

```
/Applications/MAMP/bin/php/php7.4.21/bin/php
```
期待して、ブラウザに表示させるが、**「Operation not permitted」**
んー？？

[参考]
>[MAMPの環境構築](https://takashinoda.hatenablog.com/entry/2019/08/16/013126)

**⑤やはり、パーミッション？　**
参考にさせていただいた[MAMPの環境構築](https://takashinoda.hatenablog.com/entry/2019/08/16/013126)より、

```
$ sudo mv /usr/bin/vim /usr/bin/old_vim
```
してみると、

```
mv: rename /usr/bin/vim to /usr/bin/old_vim: Operation not permitted
```
んんん？？　参考ページどおりにいかないんだが・・・
どこか、セキュリティ機能が効いてる？？？

**⑥セキュリティ機能の確認**　**←ここだった！**
[参考]
>[初心者向け　MacでOperation not permittedの解決方法]
(https://qiita.com/iwaseasahi/items/9d2e29b02df5cce7285d)　より

・Macを一度シャットダウン。
・起動時に電源ボタンを10秒間以上長押し。
（※Intel Macの場合は、command + R　だが、M1チップのMacの場合は、電源長押しなので注意）
しばらくするとリカバリーモードが起動
・メニューバーの「ユーティリティ」からターミナルを選択

```
$ csrutil status
```
ステータスを確認すると、

```
System Integrity Protection status: enabled.
```
「enabled」を「disabled」に変える

```
$ csrutil disable
```
ステータスを確認すると、

```
$ csrutil status
```

```
System Integrity Protection status: disabled.
```
System Integrity Protection (SIP) が無効になったので、再起動する

```
$ reboot
```

**これで、ブラウザにphpファイルが表示されるようになりました！！**


##thanks！　今回の参考サイト
[MAMPでエラーメッセージを表示させる方法【php.iniの変更】](https://sunsukeblog.com/mamp_error)
[MAMPの環境構築](https://takashinoda.hatenablog.com/entry/2019/08/16/013126)
[初心者向け　MacでOperation not permittedの解決方法]
(https://qiita.com/iwaseasahi/items/9d2e29b02df5cce7285d)
Dartのジェネリクスは共変である

# Dartのジェネリクスは共変
タイトルでオチがついている。Dartのジェネリクスって共変なんだねえ。

The Dart type system | Dart
https://dart.dev/guides/language/type-system#generic-type-assignment

# 共変って何？
あるクラス`Tsuper`がサブクラス`Tsub`をもつ場合に、
- `Tsuper`による総称型に`Tsub`による総称型を代入できることを共変といいます
    - Dartはこれに該当するということです。
- 対して、`Tsuper`型の変数に`Tsub`型の変数を代入できないことを不変といいます
    - Javaがこれに該当します。

# 具体的なコードによる説明
ジェネリクス型に互換性があり、代入ができるということを共変といいます
dartは互換性があるので共変です

```dart:dart
List<num> numList;
List<double> doubleList = [];

numList = doubleList; // 代入ができる。これが共変
```

一見この互換性は便利そうですが、以下のようなリスクがあります。

```dart:dart
List<num> numList;
List<double> doubleList = <double>[]; // [];の丁寧な書き方

numList = doubleList; // 代入ができる

// コンパイルこそ通るものの、
// doubleのリストにintをaddすることによって実行時エラーが発生する。
// 変数にnumListって書いてあるから動きそうなのにね。
numList.add(2 as int); // 実行時エラー！

```


ちなみにJavaはジェネリクス型に互換性がありません（不変）[^1]

```java:java
List<Number> numberList;
List<Double> doubleList;

// numberList = doubleList; // コンパイルエラー
```
[^1]: この制約を緩めて使いやすくするために、型の設計者はextendsとかsuperとかワイルドカードとかの署名をこねくり回します。

# Flutterにおける身近な共変の利用
例えばこういう画面クラス。
`createState()`について、`MyState`の型は`State<MyPage>`であるにもかかわらず、`State<StatefulWidget>`　という戻り値として成立していますね。

`State<StatefulWidget>` ∋ `State<MyPage>` であり、`State<MyPage>` を `State<StatefulWidget>` として扱ってよいことになっているので、この書き方が許容されます。



```dart:dart
class MyPage extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return MyState();
  }
}

class MyState extends State<MyPage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(body: Text("this is view"));
  }
}
```


MyPage.createState()の中身を冗長に書くとこういう風になります。

```dart:dart
class MyPage extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    State<StatefulWidget> returnValue;
    State<MyPage> myState = MyState();
    returnValue = myState; // 共変なので代入ができる
    return returnValue;
  }
}

class MyState extends State<MyPage> {
  // (略)
}
```
EC Cubeで英語対応

#経緯
「このサイト海外向けのサイトなので全部英語で管理画面は日本語にしてね」って以前言われましたので、ハマったポイントをメモとして公開します。

##ポイント1
まず、.envファイルを書き換えればすべて英語になると思って書き換えたら管理画面しか英語にならなかった

```/.env
#英語に変更
ECCUBE_LOCALE=en
```
↑実はEC Cubeからダウンロードできるデフォルトテーマは何故か英語対応されていないのでGithubからテーマをダウンロードする必要がある

https://github.com/EC-CUBE/ec-cube/tree/4.0/src/Eccube/Resource/template/default


##ポイント2
管理画面は日本語にしたい
全ての管理画面を継承しているコントローラーに日本語設定にすれば良いというのは分かるが書き方が思いつかない...
調べた所ルーティングを管理している.yamlに記述すれば良いらしい

```app/config/eccube/routes.yaml
# ユーザー側画面のルーティング
controllers:
    resource: ../../src/Eccube/Controller/
    type: annotation
    defaults:
         _locale: en
# 管理画面のルーティング
admin_controllers:
    resource: ../../src/Eccube/Controller/Admin/
    type: annotation
    defaults:
        _locale: ja
```

##ポイント3
1と2で英語化できたと思ったが管理画面のプラグイン設定ページが英語になるものが出てきた。
なので最終的に下記のような設定に変更することで解決

```/.env
#日本語に戻す
ECCUBE_LOCALE=ja
```

```app/config/eccube/routes.yaml
# ユーザー側画面のルーティング
controllers:
    resource: ../../src/Eccube/Controller/
    type: annotation
    defaults:
         _locale: en
# 管理画面のルーティング
admin_controllers:
    resource: ../../src/Eccube/Controller/Admin/
    type: annotation
    defaults:
        _locale: ja

#customize_controllers「日本語にしなくても良いかも」
customize_controllers:
    resource: ../../app/Customize/Controller/
    type: annotation
    defaults:
         _locale: ja
```

#感想
EC Cubeを理解するにはsymfonyを勉強する必要があるなと感じた
PHPの条件分岐を、条件演算子でやってみましょう！

#条件演算子
<br>
条件演算子を使って、条件分岐を楽に書きます！

以下の条件があったとします。

$total が 0 以上なら合計数を戻り値に返して、

$total が 0 以下なら 0 を返します。
<br>

```php:index.php
<?php
function sum($a, $b, $c) {
  $total = $a + $b + $c;
  if ($total < 0) {
    return 0;
  } else {
    return $total;
  }
}
echo sum(1, 2, 3) . PHP_EOL;
echo sum(-100, 2, 3) . PHP_EOL;
```
<br>
ターミナルに以下を入力します。
<br>

```
~$ php index.php
```

<br>
条件式の結果が出力されました！
<br>

```
~ $ php index.php
6
0
~ $ 
```

<br>

この条件式を条件演算子でもう少し短く書いてみます。

  条件　？　値 (true)　：　値　　(false) と書きます。

  $total　が　0 以下？だったら 0 を、　そうじゃなければ　$total を

<br>

```php:index.php
<?php
function sum($a, $b, $c) {
  $total = $a + $b + $c;
  return $total < 0 ? 0 : $total;
}
echo sum(1, 2, 3) . PHP_EOL;
echo sum(-100, 2, 3) . PHP_EOL;
```

<br>
ターミナルで以下を実行します。
<br>

```
~$ php index.php
```

<br>
同じ結果になりました！
<br>

```
~ $ php index.php
6
0
~ $ 
```

<br>
条件演算子を使うとコードが見やすくなりました　☆
<br>
Gitでpushができない時 "remote: No anonymous write access." というエラーの原因と対処法

# 参考

https://www.d-wood.com/blog/2013/08/29_4522.html

https://www.fenet.jp/infla/column/server/github%E3%81%ABssh%E3%81%AEkey%E3%82%92%E7%99%BB%E9%8C%B2%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%E3%81%A8%E3%81%AF%EF%BC%9Fssh%E6%8E%A5%E7%B6%9A%E3%81%A7%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA/


# エラー
 
```
remote: No anonymous write access.
fatal: Authentication failed for 'https://github.com/username/repo.git/'
```

gitでpushをすると、このようなエラーが出ました。

# 原因

1. SSH接続を行なっていない
- SSH接続を行なった上で↓ 

```
git remote add origin
```

の設定がhttps://...になっていた。


# 対処法

## 1 ) SSH接続を行う

- ターミナルを開き、下記コマンドを実行します

```
cd ~/.ssh 
```

```
ssh-keygen -t rsa
```

- １行めはそのままエンターを押し、任意のパスワードを入力(忘れないように)

```
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/(username)/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
```

.pubは公開鍵で、もう一つが秘密鍵です。下記コマンドのどちらかで確認が可能です。

```
ll
ls -l
```
- 下記コマンドをそのまま入力します。実行するとクリップボードに内容が保存されます。

```
pbcopy < ~/.ssh/id_rsa.pub
```


- Githubにアクセスし、右上のプロフィールから"Setting"に移動し、"SSH and GPG keys"に移動します。
- "New SSH kye" を押して、"Title"に任意の文字列、"Kye"に先ほどコピーされたものをペーストします。

## 2 ) git remote add を変更

- ターミナルに戻り、pushを行うフォルダに移動します。下記コマンドを実行します。

```
git remote -v
origin  https://github.com/username/repo.git (fetch)
origin  https://github.com/username/repo.git (push)
```
このように https://... となっている場合は変更が必要です。

```
git remote set-url origin git@github.com:username/repo.git
```

Githubアカウントのユーザーネームとリポジトリ名を入力したら再度"git remote -v"で確認し、買いのようになっているか確認してください。

```
origin  git@github.com:username/repo.git (fetch)
origin  git@github.com:username/repo.git (push)
```

以上で正常にpushができました。
Laravelをすぐに使いたい？じゃあこれを使いなよ

Homesteadを使っていたがなんか重たいし、シェルスクリプトの勉強も兼ねて自分で開発環境を作ろうかなと思った。
## ソース
これが欲しいんやろ！

https://github.com/GoodWave2020/vagrant_laravel

入っているものとして、

- Node.js 16.x
- PHP 7.4
- Redis
- MySql 5.7
- Composer
- Nginx
- git
- zip

としている。これくらいあればとりあえずいいかな？使っていて不便だったらまた追加していこうかと思います。

## 使い方
1. git cloneしたら中でsrcディレクトリを作る。もし既存プロジェクトを使用したいときは中でさらに自分のプロジェクトをcloneしてディレクトリ名をsrcとする。
1. sample.envを参考に.envを作る。`vagrant plugin install dotenv`でdotenvを使えるようにする。
1. `provision/provision.env`にMySqlのルートパスワードを書き加える。最終的に以下のようになっていたら問題ないかと思います。

    ```
    vagrant_laravel
    ├── .vagrant
    ├── conf
    ├── provision
    ├── src
    ├── .env
    ├── .gitignore
    ├── boot.sh
    ├── README.md
    ├── sample.env
    └── Vagrantfile
    ```

4. `vagrant up`実行！ちょっと時間かかります。
5. vagrant sshで潜ってlaravelの初期設定をしてください。

## 個人的こだわり
`conf/nginx/my_nginx.conf`でnginxの設定ファイルを同期させていじれるようにした。複数プロジェクトを1つの仮想環境で管理したいときなど微調整必要なときにすぐ修正できる。
[js]文字列から繰り返し出現する文字列の間を取得する

# やりたいこと：文字列から繰り返し出現する文字列の間を順番に取得する。

例：
- **元の文字列**: "あいうえおかきくけこさしすせそあいうえおかきくけこ2さしすせそ"
- **抽出したいもの**：'かきくけこ', 'かきくけこ2'

```js
str = "あいうえおかきくけこさしすせそあいうえおかきくけこ2さしすせそ";
const before = "あいうえお";
const after = "さしすせそ";

stock = [];
while(1){
	// strの中のbeforeを前から検索
	const beforeIdx = str.indexOf(before);
	// strの中のafterを前から検索
	const afterIdx = str.indexOf(after);

	if (beforeIdx >= 0 && afterIdx >= 0) {
	    // 両方とも見つかったら中身を取り出す
	    const result = str.substring(beforeIdx + before.length, afterIdx);
	    // console.log(result);//"かきくけこ"
	    stock.push (result);
	    str = str.replace(result, "").replace(before, "").replace(after, "");
	}else{
		break;
	}
}
console.log(stock);//['かきくけこ', 'かきくけこ2']
```
正規表現を使いたかった。
バーチャルカルーセルを自作する

# 始めに
以前[カルーセルを自作する方法](https://qiita.com/wintyo/items/a37a197f69aa205297a5)について記事をまとめましたが、項目数が多くなったときに動作が重くなってしまう問題がありました。
そこで今回は見えている項目だけ出すバーチャルカルーセルの自作アイデアをまとめたいと思います。また、最近はVue3が使えるようになったのでそちらの書き方で作りました。

# 実装方法
## 各項目の表示と位置について
今回は`position: absolute`で1つ1つに対して位置を指定するようにします。absoluteでは`top: 50%; left: 50%`も加えて、いわゆる中央配置を全ての要素に設定します。その後、通常は`transform3d(-50%, -50%, 0)`ですが、前後で100%分ずつずらして横に並ぶようにします。要素間のmarginは前回と同じようにpaddingを入れて対応します。
これによって最低5枚分表示するだけで済むようになります。この5枚に対してidxを中心とした前後2枚分の情報をslotで提供して表示させればOKです。もしindex値がマイナスや配列数を超えて中身がない場合は単純に非表示にすれば良いです。

![カルーセルのコピー.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187768/7e01718b-98fe-ed19-8dfd-750ddce68ded.jpeg)

## スワイプ中の処理
こちらは前回と同じように開始位置と移動中の位置を取得して、その差分だけずらすようにします。`transform: translate3d(-100%, 0, 0) translate3d(-30px, 0, 0)`のように%とpx指定を重ねることや、スワイプ中はアニメーションを切っておくことも同じです。

![https___qiita-image-store.s3.ap-northeast-1.amazonaws.com_0_187768_7e7890a3-1930-bcc3-211a-d04b0cf3354a.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187768/ec1c5a85-e127-291d-a975-f71c0108f906.jpeg)

ただ注意として、ポジションの移動はいきなり設定するのではなく、一旦どっちに移動したかを変数で持っておく必要があります。アニメーション中はこの変数を元に表示位置だけ移動し、アニメーションが終わったら実際のidxも変更します。


![カルーセルのコピー2.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187768/871559a2-cfc1-4dc4-87cd-5be2d587b0c7.jpeg)

## ループの実装
ループは今回のやり方だと非常に簡単で、通常は要素がなかったら非表示ですが、こちらは1周回って表示される要素を出してあげるだけです。どっちでも対応できるようにgetItemメソッド経由にすると扱いやすいです。

```javascript
const getItem = (index) => {
  // ループの場合
  if (props.loop) {
    const idx = (index + props.items.length) % props.items.length;
    return props.items[idx];
  }
  // 通常の場合はそのまま返す
  return props.items[index];
}
```

# 終わりに
以上がバーチャルカルーセルを実装する方法でした。absoluteで配置するやり方は以前も作ったことはありましたが、SlickやSwiperのライブラリを見ていると1つの大きなラッパーでまとめて全体を移動しているものが多かったのでそちらの実装方法を紹介していました。ただ要素数が多くなってきたときに最低限の枠を使い回す実装になるとabsoluteで作った方がやりやすいなと思って今回そのやり方を紹介しました。要素数も限定されるのでこちらの方が使い勝手良さそうだなと個人的には感じています。
サンプルコードはCodePenに書きましたので、詳細の実装を見たい方はこちらの方をご参照ください。

<p class="codepen" data-height="642" data-default-tab="js,result" data-slug-hash="VwzGodw" data-user="wintyo1024" style="height: 642px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/wintyo1024/pen/VwzGodw">
  カルーセル</a> by wintyo (<a href="https://codepen.io/wintyo1024">@wintyo1024</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>
JupyterLabにてスクリプトを非表示にする in R

JupyterLabで資料共有するときに、スクリプトが邪魔なので非表示にしたいと思いました。

KernelがPythonの場合については、下記にやり方が書いてあります。

https://teratail.com/questions/273170

しかし、今回はKernelとしてRを使用していたので、これをそのまま使うことはできませんでした。

ググったところ、R使用時にHTMLを挿入する方法を見つけました。

https://stackoverflow.com/questions/37793888/r-how-to-embed-html-code-into-jupyter-notebook-output

これを使って、以下のようにR用のコードを書いたところ、うまくいきました。

```sample.r
library(IRdisplay)

display_html("
<script src='//code.jquery.com/jquery-3.3.1.min.js'></script>
<script>
code_show=true; 
function code_toggle() {
 if (code_show){
 $('div.input').hide();
 $('div .jp-CodeCell .jp-Cell-inputWrapper').hide();
 } else {
 $('div.input').show();
 $('div .jp-CodeCell .jp-Cell-inputWrapper').show();
 }
 code_show = !code_show
}
$( document ).ready(code_toggle);
</script>
<form action=\"javascript:code_toggle()\"><input type=\"submit\" value=\"Code on/off\"></form>")
```

めでたしめでたし。
MongoDB バージョニング（5.0以降のバージョン番号の意味付けの変更）

<!-- Qiita https://qiita.com/kabao/items/9e7726624708d0ed6caf -->
<!-- マニュアルっぽいので「ですます」で -->
<!-- 他のマニュアルを参照する場合、どちらかというと英語タイトルそのままで。文章の一部になっていて、訳さないと変な場合は日本語に訳す。 -->
<!-- NOTE: とかの囲みは、QiitaのMDで対応するものがなさそうなので、注意：brなどとしてごまかす？ ```text: かと思ったがそうすると中身のMD記法が解釈されない。divかと思ったがQiitaはstyle属性適用されない。divで囲んでタイトルはstrong、中身は自前でタグを書くのが見た目的には一番マシっぽい。 -->
<!-- SEE ALSO: は参照：、WARNING: は警告： -->
<!-- deprecated 非推奨 -->
<!-- 英単語・数字の周りに空白をいれるか？ -->
<!-- restの`、``と、Qiita Markdownの対応は？ -->
[MongoDB Versioning](https://docs.mongodb.com/manual/reference/versioning/)の翻訳です。原文はMongoDB Documentation Teamによるものです。ライセンスは[CC BY-NC-SA 3.0](https://creativecommons.org/licenses/by-nc-sa/3.0/deed.ja)となっています。

[CONTRIBUTING.rst](https://github.com/mongodb/docs/blob/master/CONTRIBUTING.rst)

> MongoDB documentation is distributed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported license.

------------------------------

# MongoDB バージョニング

<div><strong>重要：</strong><br />
常に当該リリースの最新安定リビジョンにアップグレードするようにしてください。</div>

MongoDBのバージョン番号は`X.Y.Z`という形を持っており、`X.Y`はリリースを表し、`Z`はパッチ番号を表します。

MongoDB 5.0以降、MongoDBは2つの異なるリリースシリーズでリリースされます。

- メジャーリリース
- ラピッドリリース

MongoDB 4.4およびそれ以前では、プロダクション用バージョンと開発バージョンからなるバージョニングが用いられていました。[過去のリリース](#過去のリリース)を参照してください。

## メジャーリリース

メジャーリリースはおおよそ1年に1回出荷され、たいていは新機能や改善が導入されます。メジャーリリースはすべてのMongoDB利用環境に適切なものです。

*バージョン番号の例：*

- `5.0`
- `6.0`

## ラピッドリリース

ラピッドリリースは、おおよそ、メジャーリリースの無い四半期ごとに出荷され、たいていは新機能や改善が導入されます。
ラピッドリリースは[MongoDB Atlas](https://www.mongodb.com/cloud/atlas?tck=docs_server)で使われるよう設計されており、オンプレミス環境では一般的にはサポートされません。
ラピッドリリースは[MongoDB Ops Manager](https://docs.opsmanager.mongodb.com/current/?tck=docs_server)とともに利用することはできず、[アービター](https://docs.mongodb.com/manual/core/replica-set-members/#std-label-replica-set-arbiters)はサポートされません。
もしMongoDB環境の一部にアービターを利用している場合は、最新のメジャーリリースを利用してください。

*バージョン番号の例：*

- `5.1`
- `5.2`
- `5.3`

## パッチリリース

パッチリリースは、メジャーリリースとラピッドリリースの両方に対して必要に応じてリリースされます。
一般的にはバグ修正や後方互換性を保った変更が含まれます。

*バージョン番号の例：*

- `5.0.1` (メジャーリリースとパッチバージョン)
- `5.2.1` (ラピッドリリースとパッチバージョン)

## リリース候補（RC）

メジャーリリースやラピッドリリースの前に、早期のテストのためリリース候補が出荷されます。
リリース候補は次のリリースが十分に安定しているかどうかテストするために出荷されますが、プロダクション環境には適切ではありません。

*バージョン番号の例：*

- `5.0.0-rc0`
- `5.0.0-rc1`
- `5.1.2-rc5`

## ドライバのバージョン

MongoDBサーバ本体のバージョニングと、[ドライバ](https://docs.mongodb.com/drivers/drivers/)のバージョニングは異なります。

## MongoDB Shell (`mongosh`)

MongoDB 5.0以降、[MongoDB Shell](https://docs.mongodb.com/mongodb-shell/) (`mongosh`) はMongoDBサーバ本体とは個別にリリースされており、バージョニングも異なります。

## データベースツール

MongoDB 4.4以降、[MongoDBデータベースツール](https://docs.mongodb.com/database-tools)はMongoDBサーバ本体とは個別にリリースされており、バージョニングも異なります。

## 過去のリリース

MongoDB 4.4およびそれ以前では、プロダクション用バージョンと開発バージョンに分ける考え方が採用されており、
バージョン番号は`X.Y.Z`の形をしていて、`X.Y`はプロダクション用バージョンもしくは開発バージョンを示し、`Z`はリビジョン/パッチ番号を示していました。

- `Y`が偶数の場合、`X.Y`はプロダクション用バージョンを示します。たとえば`4.2`系や`4.4`系がそれにあたります。これらのプロダクション用リリースは**安定**していてプロダクション環境に適しています。

- `Y`が奇数の場合、`X.Y`は開発バージョンを示します。たとえば`4.3`系や`4.5`系がそれにあたります。開発用リリースは**テスト目的限定でありプロダクション環境には適しません**。

たとえばMongoDB `4.4.7`では、`4.4`はプロダクション用の系列を示し、`.7`はリビジョンを示します。
【個人開発】不幸な体験を暴露してお金をもらうアプリを作ってみた

## はじめに

![ogp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684591/68e8d2f2-12c2-fd10-00f7-8c137a2dbc94.png)

皆さんにお聞きします。
何か不幸な体験をして、それを友達や家族に話したとき、一度は<strong>「同情するなら金くれよ！！」</strong>と思ったことあるのではないでしょうか？

そんな不幸な体験をされた人たちが「少しでも報われたら」という思いで~~クソ~~アプリを作りました。

https://fuko-ziman.herokuapp.com

<br>

## アプリの使い方
自分が体験した不幸を投稿し、twitterでシェアします。
「みんなの不幸一覧」を押すと、投稿された記事を全て見ることができます。

[![Image from Gyazo](https://i.gyazo.com/b9cf5d724292be22edbff98bd445f94b.png)](https://gyazo.com/b9cf5d724292be22edbff98bd445f94b)

記事を選択して詳細画面の中にある「¥100」ボタンを選択すと、投稿された記事に非同期でお金が入るようになっています。
この処理を一番こだわりました。

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

## 「¥100」ボタンのコードの中身
「¥100」ボタンの中身のコードはこんな感じになっています。(コード汚くてごめんなさい...)

boards_controller

```Ruby
def likes
  @board = Board.find(params[:board_id])
  @like = @board.likes + 100
  @board.update(likes: @like)
end
```

show.html.erb

```Ruby
<span id="js-board-likes-<%= @board.id %>"><%= @board.likes %></span>

<%= link_to board_likes_path(@board), class: "level-item", method: :post, remote: true do %>
  <button class="btn-circle-3d-emboss button is-large fas fa-yen-sign mt-3 mb-6">100</button>
<% end %>
```

下記記述でパッと見ダブルクオーテーションが変な位置についてるように見えますが、Rubyのコードが反映されるようにしています。

```Ruby
$("#js-board-likes-<%= @board.id %>").replaceWith("<span id=js-board-likes-" + <%= j(@board.id) %> + ">" + <%= j(@board.likes) %> + "</span>");
```

## 使用技術
### バックエンド
- Ruby 2.7.2
- Rails 6.1.4

### フロントエンド
- HTML
- CSS
- jQuery
- BULMA

### 主要なgem
- rubocop
- pry-rails
- pagy
- meta-tags
- webpacker

### デプロイ
Heroku

### データベース
PostgreSQL


## 最後に
今回製作したアプリは、元々CRUDの復習を目的としていて、アプリとしてリリースする予定はありませんでした。
実装していく過程で少しずつプログラミングの楽しさを感じることができ、「2週間で作り切る」という目標を掲げてリリースしたことで、一つ自信に繋げることができました。

次作も「締切駆動開発」を意識し、また人に遊んでもらえるサービスを作っていきたいと思います。

最後まで読んでいただきありがとうございました。


Twitter:https://twitter.com/wataru_pgm

https://fuko-ziman.herokuapp.com
dotnet-6.0におけるシングルファイルアプリの変更点(5.0からの差分)

# はじめに

以前[dotnet-5.0におけるシングルファイルアプリの記事](https://qiita.com/skitoy4321/items/e8a43881456edc1f2c61)を書いたが、dotnet-6.0リリースに当たり、また変更点が入ったので、差分について書く。

上記記事を読んだ前提で進めるので、わからなくなった場合は上の記事を読むことを推奨。

# ネイティブDLLの統合

5.0の時は、シングルファイルをPublishすると、下記のようなネイティブDLLが出力されていた(Linuxの場合は拡張子が".so")

* coreclr.dll
* clrjit.dll
* clrcompression.dll

また、`IncludeNativeLibrariesForSelfExtract=true`しても、実行時には結局テンポラリディレクトリに展開されるため、完全なるシングルファイルアプリとは言い辛かった。
しかし、6.0以降はこれらを統合したので、特にフラグを立てなくても完全に単一の実行可能ファイル(とWindowsの場合pdb)が出力されるようになった。

ただし、WPFとWinFormsの場合、以下のネイティブDLLは引き続き統合がされてないので注意が必要。

* D3DCompiler_*_cor3.dll
* PenImc_cor3.dll
* PresentationNative_cor3.dll
* vcruntime140_cor3.dll
* wpfgfx_cor3.dll

# 実行ファイルの圧縮

素の状態でのPublishは、5.0とそう変わらないサイズだが、新しいオプションとして、`EnableCompressionInSingleFile=true`を指定することによって、
アセンブリを圧縮した状態でシングルファイルとして出力できるようになった。

圧縮率に関しては調整はできないが、Hello Worldレベルでは大体半分くらいのサイズになる(70MB→30～40MB位)。

ただし、実行時の展開処理が入るため、代償として立ち上がりがある程度遅くなる。

# TrimModeのデフォルト値の変更

[PublishTrimmedしたときのTrimModeのデフォルト値が、"copyused"から"link"に変わっている。](https://docs.microsoft.com/en-us/dotnet/core/deploying/trimming/trimming-options)
これにより、net5.0からnet6.0にアップデートした後、PublishTrimmedしたアプリの挙動が変わる可能性があるので、
安全策を取りたいならば明示的に"TrimMode"の値を指定した方が良いかもしれない。

# WPFとWinFormsアプリのPublishTrimmedの無効化

dotnet-sdk-5.0以前では、WPFやWinFormsアプリでもPublishTrimmed=trueでトリミングが動いたが、
実際に走らせる段になるとエラーが出て終了する場合が多かった。(TrimmerRootAssemblyである程度回避もできるという報告もあったようだが)
dotnet-sdk-6.0ではPublish時に明確にNETSDK1168(WPF),NETSDK1175(WinForms)エラーが出るようになった。
これはSDKがやっていることなので、TargetFramework=net5.0でも該当するので注意。
https://docs.microsoft.com/en-us/dotnet/core/deploying/trimming/incompatibilities

# 終わりに

短めだが、差分なのでこんなものである。TrimModeの変更は大きいところなので注意が必要かもしれない。
[net7.0では、NativeAOTがメインブランチに入る予定なので、また書くことが増えるかもしれない。](https://github.com/dotnet/runtime/issues/61231)

## 参考リンク

* [単一実行ファイルについての公式ドキュメント](https://docs.microsoft.com/en-us/dotnet/core/deploying/single-file)