OmniAICreator/Qiita-1.07M huggingface dataset:
[py2rb] 自作ライブラリの関数の呼び出し

---
# はじめに
移植やってます。
( from python 3.7 to ruby 2.7 )
# 関数 (Python)
```python:bb.py
def make_qv(x):
    return x + 1

qv = make_qv(1)
```
```python:main.py
import bb

print(bb.make_qv(2))
print(bb.qv)
```
```python:output
3
2
```
`def make_qv`は`main`と`bb`の双方から呼び出し可能です。
# どうすRuby
```ruby:bb.rb
module BB
  def make_qv(x)
    return x + 1
  end

  qv = make_qv(1)
end
```
```ruby:main.rb
require_relative 'BB'

puts BB.make_qv(2)
puts BB.qv
```
```ruby:output
undefined method `make_qv' for BB:Module
```
おお、`qv = make_qv(1)`でメソッドが見つからないと仰せですか。
ここは、モジュールの特異メソッドで。

```ruby:bb.rb
module BB
  def self.make_qv(x)
    return x + 1
  end

  qv = make_qv(1)
end
```
```ruby:output
3
undefined method `qv' for BB:Module
```
ああ、`ゲッター`が無いのか。

```ruby:bb.rb
module BB
  def self.make_qv(x)
    return x + 1
  end

  def self.qv
    @qv ||= make_qv(1)
  end
end
```
```ruby:output
3
2
```
よしよし。

今回の例では、`module_function :make_qv, :qv`でもいけますが、`module BB`内で`@qv`を利用する場合は特異メソッドでないと、動作しないようです。
# メモ
+ Python の 関数の呼び出し を学習した
+ 百里を行く者は九十里を半ばとす
Microsoft Developer Day最新レポート～.NET 6 最新アップデート～

### .NET vision

.net frameworkや.net coreやxamarinを統合した新しいフレームワーク
ASP.net web formの様にサポート対象外となるものがある
2021年11月にGAされている。

### VisualStudio2022
ホットリロードのメニューからファイルの保存時にホットリロードを指定すると常時ホットリロードされる

### Blazor
C#でwebフロントエンド開発ができる。
ASP.NET WebFormsとコンセプトが似ている。Blazorに置き換えかな。
全ての処理がブラウザ上で完結する。オフライン実行も可能。
初回実行時に事前コンパイルにかかる処理速度が改善された

開発者ツールのキャッシュストレージにwebassembleとして見れる
サンプルコード

```buttonsample.razor
<p>@count</p>
<button @onclick="incrementCount">click</button>
@code {
	private int count;
	private void incrementCount() {
		count += 1;
	}
}
```
Blazorで書いたコードがコンポーネント化されるため
Reactのように`<buttonsample(コンポーネント名) />`として利用できる。
PWAにも対応しており、表示したブラウザからインストールすればデスクトップアプリとしても使用できる。

### .NET MAUI（preview）

.NET Multi-platform App UI。windows･iOS･･クラスプラットフォームで実行可能なUIフレームワーク。
C#でネイティブアプリを作成できる。Xamarinの上位フレームワーク？
Blazorの上で実行でき、配信アプリのような利用が可能となる。
MAUI＝マウイと呼ぶらしい。

### MinimalAPI

APIの開発効率アップを目的としたクラス定義をしなくてもRestfulなAPIを作成できるフレームワーク。
pythonのflaskやFastAPIに似ている気がする。

### .NETFrameworkの今後

.NETFrameworkの4.8が最後のメジャーバージョンとなる。
WindowsOSのコンポーネントでサポートされる。(Windows Update)
.NETFrameworkで作成された既存アプリは4.8へ移行、新規アプリは.NET6の導入を推している。
バージョン移行ツール`.NET Upgrade Assistant`も提供されるので、.NET6へ移行しやすくなるみたい。

> AzurePaasサービスへの対応は？

以下のサービスで.NET6に対応している

1. Azure App Service
2. Azure Static Web Apps
3. Azure Functons

### まとめ

.NET6は開発者のための統一プラットフォーム。
ASP.NET MVCで新しいプロジェクトを作る際、.NETCoreか.NETFrameworkか、テンプレートの選択が省略できるようになるのはありがたい。
.NET6の今後が楽しみだ。
【Java】なんとなくわかった気になれるラムダ式の解説

## はじめに
よくわからず使っていたラムダ式ですが、JavaSilver取得を機に自分なりにまとめてみました！

## そもそもラムダ式とは？

今まで**匿名クラス**でできた処理をより簡潔に記述できるようにしたもの（要は書き方のこと！）

## で、匿名クラスって何？

匿名クラスとはインタフェース実行のステップを簡潔にしたもの。

従来、インタフェースの実行は**①インタフェースの作成→②インタフェースの実装用のクラスを作成→③インタフェースの実行用クラスの作成**の3ステップを踏む必要があった。

```java
// 1.インタフェースの作成
interface Car {
	String carType(String typeName); // 車の種類（抽象メソッド）
}

// 2.インタフェースの実装
public class CarImple implements Car {
	@Override
	public String carType(String typeName) { // 抽象メソッドのオーバーライド
		return "carType:" + typeName;
	}
}

// 3.インタフェースの実行
public class CarActu { 
	public static void main(String[] args) {
		Car sportsCar = new CarImple(); // 実装クラスのインスタンスを作成し、変数sportsCarに代入
		String car = sportsCar.carType("レクサス RC F"); // メソッドの戻り値を変数carに代入
		System.out.println(car); // 出力：carType:レクサス RC F
	}
}
```

しかし、匿名クラスを利用することで、**①インタフェースの作成→②インタフェースの実装と実行を同時に行うクラスの作成**の2ステップにまとめることができるようになった。

```java
// 1.インタフェースの作成
interface Car {
	String carType(String typeName); // 車の種類（抽象メソッド）
}

// 2.インタフェースの実装と実行
public class CarActu { // 実行クラス
	public static void main(String[] args) {
		new Car() { // インタフェースの実装
			@Override
			public String carType(String typeName) { // 抽象メソッドのオーバーライド
				System.out.println(typeName);
				return "carType" + typeName;
			}
		}.carType("レクサス RC F"); // 実装クラスに対してメソッドの呼び出し
	}
}
```

## 匿名クラスの説明を踏まえラムダ式のおさらい

匿名クラスでも処理を簡潔に書くことができたが、ラムダ式を利用するとさらに簡潔に書くことができる。（コメントアウトしている部分は匿名クラスの場合の処理）

**①引数の宣言（4行目のString name）**、**②アロー演算子（->）**、**③処理ブロック（アロー関数の後ろの中括弧の中の処理）**の3つによって「実行したいコード」を表したのがラムダ式である。

```java
public class CarActu { // 実行クラス
	public static void main(String[] args) {
		
		Car car = (String typeName) -> { // String name は抽象メソッドcarType(String typeName)のこと
			return typeName;
		};
		
		System.out.println(car.carType("レクサス RC F"));
		
//		new Car() { // 実装クラス
//			@Override
//			public String carType(String typeName) { // 抽象メソッドのオーバーライド
//				System.out.println(typeName);
//				return "carType" + typeName;
//			}
//		}.carType("レクサス RC F"); // 実装クラスに対してメソッドの呼び出し
	}
}
```

## ラムダ式の書き方

### 1.基本型

・処理が**複数行**の場合は**（）**をつける。

・引数には**型（intやStringなど）**を明示することができる

```java
(int num1, int num2) -> {
	return num1 + num2;
}
```

### 2.型定義の省略

・引数の型は省略可能。

```java
(num1, num2) -> {
	return num1 + num2;
}
```

### 3. 1行で書く処理

・処理を1行で書く場合、**中カッコ**と**return**が省略できる。

```java
(num1, num2) -> num1 + num2;
```

### 4.引数が1つの処理

・引数が1つの場合、カッコを省略できる

```java
num1 -> return num1 * 2;
```

### 5.引数なしの処理

・引数がない場合の処理は、カッコで表現する

```java
() -> return "こんにちは";
```

## ラムダ式の注意

・メソッド内で宣言したローカル変数と同じ変数名をラムダ式で使うことはできない。

・ラムダ式の外で宣言されたローカル変数にラムダ式の中からアクセスするには、定数（final）でなければならない。

```java
// NG処理
public static void main(String[] args) {
	String str = "ABC";
	Function f = (str) {
		System.out.println(str);
	}
}
```

## さいごに
最後までご覧いただき有難うございます！

個人的にラムダ式での記述は読めるようにはなったかなと思います。
自分で考えて記述するには練習が必要そうだなという感じです。。。

認識が異なる点があれば、ご指摘いただけると嬉しいです。



## 参考

Java SE11 Silver 第8章

[https://www.bold.ne.jp/engineer-club/java-lambda-expression](https://www.bold.ne.jp/engineer-club/java-lambda-expression)
flexboxで画像が縦に伸びる原因

flexboxで画像を横並びにするとき、画像が縦に伸びることがある

---

この場合は元の縦横比のまま
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2519620/c1759737-d83c-75e8-c818-bc39ba0262b4.png">

<br>

横要素のheightが画像より長くなると、それに合わせて画像の縦幅が伸びる
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2519620/1c3abe35-5797-aaa0-906d-ecb70d3def74.png">

<br>

---
### 原因は align-items の指定

align-items は要素の垂直方向の位置を指定するプロパティ。
align-items を指定していなくても、
デフォルトでは stretch になっているため、横要素の縦幅に合わせて画像が伸びてしまうことがある。

<dl>
<dt>stretch（デフォルト）</dt>
<dd>アイテムを上下の余白を埋めるように配置</dd>
<dt>flex-start</dt>
<dd>アイテムを上揃えで配置</dd>
<dt>flex-end</dt>
<dd>アイテムを下揃えで配置</dd>
<dt>center</dt>
<dd>アイテムを上下中央揃えで配置</dd>
<dt>baseline</dt>
<dd>アイテムをベースラインに合わせて配置</dd>
</dl>

<br>

::: note info
flexbox 内に画像を入れる時は align-items を stretch 以外に指定する
:::
vistaでillustrator その5

#概要

vistaでillustratorやってみる。
アートボード作って、sin波書いて、png出力してみた。

#写真

![ill4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/9f492503-47da-027c-b90e-278a38c601cc.png)


#サンプルコード

```
var v = [];
for (var i = 0; i < 400; i++)
{
	var s = Math.sin(i * 2.0 * Math.PI / 100.0) * 200 + 200;
	v.push([i, s]);
}
var docRef = documents.add(DocumentColorSpace.RGB, 400, 400);
var lineColor = new RGBColor();
lineColor.red = 255;
lineColor.green = 0;
lineColor.blue = 0;
var line = activeDocument.pathItems.add();
line.filled = false;
line.strokeColor = lineColor;
line.setEntirePath(v);
var pngOpt = new ExportOptionsPNG24();
pngOpt.artBoardClipping = true;
var filePath = new File("/Users/ore/ill4.png");
activeDocument.exportFile(filePath, ExportType.PNG24, pngOpt);
alert("ok");


```

以上。
vistaでillustrator その4

#概要

vistaでillustratorやってみる。
アートボード作って、ベジェ曲線書いて、png出力してみた。

#写真

![ill3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/5c502ed6-7c77-488e-480a-0e1ae3858f75.png)


#サンプルコード

```
var docRef = documents.add(DocumentColorSpace.RGB, 400, 400);
var pObj = activeDocument.pathItems.add();
pObj.filled = false;
pObj.stroked = true;
pObj.strokeWidth = 0.3;
var pt = pObj.pathPoints.add();
pt.leftDirection = [100, 50];
pt.anchor = [100, 100];
pt.rightDirection = [100, 150];
var pt = pObj.pathPoints.add();
pt.leftDirection = [200, 150];
pt.anchor = [200, 100];
pt.rightDirection = [200, 50];
pt = pObj.pathPoints.add();
pt.anchor = [0, 0];
pt.leftDirection = [-100, -50];
pt.rightDirection = [50, 200];
pt = pObj.pathPoints.add();
pt.anchor = [300, 200];
pt.leftDirection = [200, 250];
pt.rightDirection = [350, 200];
var pngOpt = new ExportOptionsPNG24();
pngOpt.artBoardClipping = true;
var filePath = new File("/Users/ore/ill3.png");
activeDocument.exportFile(filePath, ExportType.PNG24, pngOpt);
alert("ok");




```


以上。
豆まきをDX化したぞい

## 2月3日
社長「毎年豆撒きするのって面倒じゃないか？」

ぼく「そうですかね？」

社長「それに、**賃貸だから共有部で鬼の仮面着て踊ってたら通報されてしまいかねん。**」

ぼく「そうですかね....？」

社長「DXの時代だから、**豆まきももう自動化しちゃおう。**」

ぼく「は、はぁ....」
ぼく「ところで、節分の鬼ってなんなんですか？」

社長「諸説あるが、鬼は5種類の色に分けられ、それぞれ特性があるとされている。」
社長「赤は貪欲、青は憎悪、黄は執着、緑は惰性、黒は疑惑を司るとされている。」

ぼく「それは普通に知らなかったです。」
ぼく「鬼がわからないとどうにもできなくないですか？」

社長「それについては問題ない。**今私が持っている煩悩をまとめておいた。**」

ぼく「ええ...」

社長「ちなみに福については、起きたらラッキーなことを書いておいた。」

ぼく「......わかりました。こっちで仕分けておくので、豆を用意してもらえますか？」

社長「すまん。豆はこれだけしか用意できなかった」

ぼく「1.2.3....全然足りないじゃないですか！」

社長「歳の分だけ食べなきゃいけないからごめんな。まあ頼むわ」

ぼく「おかのした。。。。。。」 

| text       | isHuku     |
|:-----------|------------:|
| 景気が良くなる| true        |
| 景気が悪くなる| false      |
| 給料が上がる | true        |
| 給料ダウン   | false       |
| 出世する    | true       |
| 左遷させられる| false     |
...

## 鬼と福の仕分け
まずは節分クラス(これが本当のBean！？)を作ってみるぞい！

```dart:setsubun.dart
class Setsubun {
  final String text;
  final bool isHuku;

  Setsubun(this.text, this.isHuku);
}
```

もらったデータから節分リストを作ったぞい！

```dart:setsubun.dart
List<Setsubun> setsubunList = [
      Setsubun("景気がいい", true),
      Setsubun("景気が悪い", false),
      Setsubun("給料ダウン", true),
      Setsubun("給料が上がる", true),
      Setsubun("出世する", true),
      Setsubun("左遷させられる", false),
      ....
    ];
```

もらったデータをシャッフルさせらたのでどれが福か鬼かわからなくなったぞい！

```dart:setsubun.dart
setsubunList.shuffle();
```

豆まきのメソッドを用意したぞい！

```dart:setsubun.dart
void mamemaki(bool isHuku) {
    if(isHuku) {
      print('福は内');
    } else {
      print('鬼は外');
    }
}
```

振り分けて豆まきしてみたぞい！

```dart:setsubun.dart
setsubunList.forEach((setsubun) {
  mamemaki(setsubun.isHuku);
});
```

これだと何回も豆撒く回数が多いぞい！福用のリストと鬼用のリストを分ければいちいち「鬼は外、福は内」を考えて豆まきしなくてもいいぞい！！

```dart:setsubun.dart
List<Setsubun> hukuList = [];
List<Setsubun> oniList = [];

setsubunList.forEach((setsubun) {
  if(setsubun.isHuku) {
    hukuList.add(setsubun);
  } else {
    oniList.add(setsubun);
  }
});

// 振り分け(whereの利用)
hukuList = setsubunList.where((setsubun) => setsubun.isHuku);
oniList = setsubunList.where((setsubun) => !setsubun.isHuku);
```

本当に福しかないとこれで確認できるぞい！！

```dart:setsubun.dart
hukuList.every((huku) => huku.isHuku);
```
これで鬼は外と福は内一回で効率よく豆まきできるぞい！
ただ、豆まきのような伝統文化を効率化させるべきなのか？技術と文化の両立は一生考えるべきことだぞい！

## 最後に
豆まきをしながらdartでよく使用する配列メソッドを紹介しました。頻繁に使用するメソッドだと思うのでぜひ活用してみてください！
今年は22個豆を食べたましたが、そろそろお腹にしっかり溜まってくる量になってきました、、、

最後にはなりますが、現在開発しているアプリに関してご紹介させていただきます。

就活の管理を行うアプリ**Jobhun**です！
Jobhunは「就活状況を一括管理したい...」　「自分が就活の時、予定を組むのが大変だった...」という就活生の声から生まれたアプリです。そのため、実際に就活を経験してきた方の意見を参考に、「本当に必要な機能」をまとめました！

以下のような機能があります。

* 志望企業管理機能
* 就活用カレンダー機能
* ES管理機能 etc...

気軽に就活管理ができるようになっているので、是非ダウンロードしてみてください！！
[LP](https://jobhun.jp/lp)・[IOSダウンロード](https://apps.apple.com/jp/app/jobhun-%E5%B0%B1%E6%B4%BB%E7%94%9F%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%82%B9%E3%82%B1%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E7%AE%A1%E7%90%86%E3%82%A2%E3%83%97%E3%83%AA/id1546735909#?platform=iphone)・[Androidダウンロード](https://play.google.com/store/apps/details?id=jobhun.jobhun)
![1639120308483.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612338/dc6bf51e-0e2d-ac6f-baf4-35286d36a04c.jpeg)
Bookmarkletでネット廃人になろう

## ０．はじめに

この記事は以下に当てはまる方が対象です。

* 初心者
* Chromeでよく調べ物をする
* パソコンを複数持っていてブックマークを同期している
* Chrome拡張機能は便利だけどなんとなくセキュリティが心配
* Javascriptなら少しわかる

そういう貴方にはブックマークレットがおすすめです。

## １．作ったもの

以下のようなものをつくりました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Bookmarkletは便利、拡張機能つかうまでもない。 <a href="https://t.co/gcEuGzg40h">pic.twitter.com/gcEuGzg40h</a></p>&mdash; basictomonokai (@basictomonokai) <a href="https://twitter.com/basictomonokai/status/1489112830024433664?ref_src=twsrc%5Etfw">February 3, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

* Keepa拡張機能のかわり
* CPU型番をドラッグしてPassmarkを調べる

あとおまけで、以下も作りました。

* ブラウザー表示の拡大縮小
* Gmailの画面を表示してるときに未読のみ表示させる
* Aliexpessのaliprice拡張機能のかわり

## ２．コード

* Keepa拡張機能のかわり

```javascript:bookmarklet
javascript:(function(){if(location.href.search(/[^0-9A-Z]([0-9A-Z]{10})([^0-9A-Z]|$)/)!=-1){location.href='https://keepa.com/#!product/5-'+RegExp.$1;}})();
```

* CPU型番をドラッグしてPassmarkを調べる

```javascript:bookmarklet
javascript:var%20sel%3Bif(window.getSelection().toString()%3D%3D%22%22)%7Bsel%3D'N3450'%7Delse%7Bsel%3Dwindow.getSelection().toString()%3B%7D%3Bvar%20cpu%3Dprompt('CPU%E5%9E%8B%E7%95%AA'%2Csel)%3Blocation.href%3D'https%3A%2F%2Fwww.passmark.com%2Fsearch%2Fzoomsearch.php%3Fzoom_query%3D'%2Bcpu%2B'%26zoom_cat%3D5'%3Bvoid(0);
```


* ブラウザー表示の拡大縮小

```javascript:bookmarklet
javascript:void(document.body.style.zoom=eval(prompt('enter%20percent',100)/100));
```

* Gmailの画面を表示してるときに未読のみ表示させる

```javascript:bookmarklet
javascript:document.querySelector(%22%23gs_lc50%20%3E%20input%3Anth-child(1)%22).value%3D%22is%3Aunread%22%3Bvar%20KEvent%3Dnew%20KeyboardEvent(%22keydown%22%2C%7BkeyCode%3A%2013%7D)%3Bdocument.querySelector(%22%23gs_lc50%20%3E%20input%3Anth-child(1)%22).dispatchEvent(KEvent)%3Bvoid(0);
```

* Aliexpessのaliprice拡張機能のかわり

```javascript:bookmarklet
javascript:var%20ali%3Dlocation.href.replace(%2F%5C%3F.*%24%2F%2C%22%22)%3Bvar%20pri%3D'https%3A%2F%2Fwww.aliprice.com%2FIndex%2Fsearch.html%3Flink%3D'%2Bali%3Bwindow.open(pri%2C'_blank');
```


## ３.終わりに

ブラウザー好きの人にはブックマークレットは気楽で簡単で良いと思います。

では、良いネット廃人ライフをww

以　上
MacDownで願望ノートを書きGithub上に更新する。

#MacDownとは
Macでマークダウン記法が書けて、プレビューもしてくれる便利エディタ。
コマンドでインストールが簡単で良い。

インストール方法はコマンドがおすすめ。
ターミナルを開いて

```
brew cask install macdown 
```


を実行する。

#願望ノートとは
主婦から東大大学院に３ヶ月で合格したただっちさんという方の本で知った、夢を実現させる方法。（怪しい）
と、思うけど。実はちゃんと理にかなってて、
過去形（←ポイント）で自分の達成したい目標をリストとして書いて行くと
脳が
「これは達成されて当然のことだ」
と錯覚してなんだか色々いい方向に働く、ということらしい。
・・・上手く説明できないなぁ。

とにかく転職するためにどうすればいいか悩んでる、藁にもすがる思いの私にとっては必要なものです。

http://tadanotodai.blog.jp/

##Githubにあげておこう。
エンジニアで転職するとなると、これまでどんな事をしてきたか評価をするためによくGithubのコードなどが見られるらしい。
プログラミング歴が浅く、まだあげられるコードが無いのなら
とりあえずGithubに願望ノートをマークダウンであげておけば、
とりあえずGithubに草が生えるのでモチベーションが上がるかもしれない。

#Githubの環境設定、Gitの使い方
Githubの登録方法についてはこちらのサイトを参考に
https://techacademy.jp/magazine/6235

Gitの操作については簡単ですが以下のような感じです。
ターミナルでGithub用のフォルダを作成し、

```
mkdir フォルダ名
```

下記のコマンドを実行します。

```
git init
```

すると、そのフォルダがGitで管理できるようになります。

```
git remote add origin 自分のリモートリポジトリのURL
```

でGithubのリモートリポジトリと関連付けられます。

次は試しにMacDownでマークダウンファイルを作成し、プッシュしてみましょう。
Gitのアップロードのステップは
add → commit → push です。

```
git add .
```
でステージに上げて、

```
git commit -m "コメント"
```
でコミットします。

```
git push origin master
```
最後にプッシュでアップロード完了です。

 

#新米エンジニアさん、一緒に頑張りましょう。
Ruby on Rails 主要なDockerコマンド一覧

# 前提

`ruby 2.7.0`
`rails, ~> 6.0.3`
`mysql 5.7`

# rails new
`MySQL`を利用して**railsプロジェクト**を作成する場合

```shell
docker-compose run --rm web rails new . --force --database=mysql
```

| オプション | 効果 |
|:-|:-|
| `--rm`  |  コンテナ終了時に自動的にコンテナを削除する |
| `--force`  |  ファイルが存在する場合に上書きする |
| `--no-deps`  | 依存先のコンテナを起動させない  |
| `--database=postgresql`  |  PostgreSQLを利用する |
| `--skip-bundle`  | `bundle install`をスキップする  |
| `--api`  | APIモードで作成する場合に使用(不要ファイルが作成されない) |

# gem更新時

```shell
docker-compose build web
```

**コンテナに`gem`が存在するか確認する場合**

```shell
docker compose run --rm web bundle info （gem名）
```

# モデルの作成

```shell
docker-compose run --rm web bundle exec rails g model（モデル名）（カラム名）...
```

`user`モデルを作成 + カラムを2つ追加した場合

```shell
docker-compose run --rm web bundle exec rails g model user name:string email:string
```

# カラムの追加

```shell
docker-compose run --rm web rails g migration Addカラム名Toテーブル名 カラム名:データ型

# Userテーブルに profile カラムを追加する場合
docker-compose run --rm web rails g migration AddProfileToUsers profile:text
```

# カラムの削除

```shell
docker-compose run --rm web rails g migration Removeカラム名Fromテーブル名 カラム名:データ型

# Userテーブルに profile カラムを削除する場合
docker-compose run --rm web rails g migration RemoveProfileToUsers profile:text
```


# 中間テーブルの作成
```shell
docker-compose run --rm web bundle exec rails g model （モデル名）（モデル名①:references）（モデル名②:references）
```

**`course`と`user`の間を結ぶ中間テーブルを作成する場合**

```shell
docker-compose run --rm web bundle exec rails g model course_user course:references user:references
```

```ruby:db/migrate/xxxx_create_a_b.rb
class CreateCourseUsers < ActiveRecord::Migration[6.0]
  def change
    create_table :course_users do |t|
      t.references :course, null: false, foreign_key: true
      t.references :user, null: false, foreign_key: true

      t.timestamps
    end
  end
end
```

# コントローラの作成

```shell
docker-compose run --rm web rails g controller (コントローラ名) (アクション名)...

# api/v1/以下に ユーザーコントローラを作成する場合
docker-compose run --rm web rails g controller api/v1/users index create ...
```

# マイグレーション

```shell
docker-compose run --rm web bundle exec rails db:migrate
```

# ルーティングの確認

```shell
docker-compose run --rm  web bundle exec rails routes
```

# Railsコンソール

サービス名・・・`docker-compose.yml`で設定した`services`を指します。

```shell
docker compose run --rm （サービス名） rails c
```

もしくは

```shell
docker exec -it （イメージ名） /bin/bash
```

上記出力後、`rails c`を入力して実行する

```shell
root@xxxx:/xxxx# rails c
```

# binding.pry

```shell
docker compose up -d && docker attach （コンテナ名）
```

https://qiita.com/hb5kz/items/7c9d266480079910de5c

# seedデータ読み込み

```shell
docker-compose run --rm  web bundle exec rails db:seed
```

# RSpecテスト

全てのテストを実行する

```shell
docker-compose run --rm  web bundle exec rspec
```

- テストするファイルを指定する場合
 - 例題：「`spec`ディレクトリ→`models`ディレクトリ→`user_spec.rb`ファイル」

```shell
docker-compose run --rm  web bundle exec rspec spec/models/user_spec.rb
```
“cap.get(cv2.CAP_PROP_FPS))” がMontereyでうまく動作しない


## 不具合

動かしたいpythonプログラム

```python
cap_device = 0						# built-in camera of MacBook Pro 2018
cap = cv2.VideoCapture(cap_device)	
print(int(cap.get(cv2.CAP_PROP_FPS)))
```

出力結果

```sh:BigSur
30
```

```sh:Monterey
NaN
```

以前までは(BigSurまで)、このプログラムでカメラのfpsが取得できていたのですが、montereyになってから仕様が変更した？ようで、これだと、NaNが出力されてしまいました。

# 解決策

そのため、`cap.set(cv2.CAP_PROP_FPS, 60)`を追加することで解決しました。

```python
cap_device = 0	                    # built-in camera of MacBook Pro 2018
cap = cv2.VideoCapture(cap_device)	
cap.set(cv2.CAP_PROP_FPS, 60)           #新しく追加した部分
print(int(cap.get(cv2.CAP_PROP_FPS)))
```

出力

```sh
60
```

これで、うまくいくようです。もちろん、fpsを30に設定したい場合、`cap.set(cv2.CAP_PROP_FPS, 30)`と入力してください。

検索しても出てこなかったので、とりあえず書いてみました。
pingが飛ぶのに接続不可ならネットワークの設定を見る。

#環境
AWS上にあるAPサーバ上のアプリケーションにオンプレから接続したいという状況。
接続後はテストを実行する予定だった。
オンプレからブラウザでURLを叩いて接続しようとしてもできなかった。
その時「まずpingを飛ばしましょう」と上司が言った。


#pingとは何か
TCP/IPやUDP通信でエラーが起きた時に使われるプロトコルの一つにICMPがある。
これがエラー内容を伝えてくれる役割を持つのだが、
ICMPでサポートされているechoという機能を使い、引数にIPアドレスを設定し実行すると
実行元に結果を表示するという処理をしてくれる。

pingはecho機能を使用して平均応答時間などを返してくれるコマンドです。

WindowsであればコマンドプロンプトやPowerShellなどから

```
ping ipアドレス
```
で実行できる。


##実行した結果
平均応答時間が返ってくる。
パケット自体は宛先のサーバに届いているという事だろう。
ではなぜアクセスできないんだろう。


##問い合わせる
ネットワークチームに問い合わせた所、AWSの方の設定で私たちのIPからプロトコルのICMP（ping）での通信は許可されていたが、SSHでの接続ができないようになっていた。

##学んだこと
AWSだとパッと画面上で簡単に設定を変えられる。すぐ対応してもらえ、サーバに接続できるようになった。

私はネットワークの対応していないのだけれど、VPCのルートテーブルとかの設定だったのかな。
今度このような状況になったら、ネットワークの方で拒否設定になってないか一度確認してみようと思う。
FAQサイトをSalesforceで立ち上げる！

# Experience CloudでFAQサイトを作る！（ゲストユーザ対象で
Experience Cloudは公開サイト作れます。公開サイトといえばFAQ、ということでFAQサイトを作る道のり。

+ サイトを立ち上げる
+ ナレッジ設定する

## サイトを立ち上げる
普通にExperienceのサイトを立ち上げます。
気を付けるというか好みの問題ですが、Themaは「カスタマーサービス」が良いかと思います。
かつ「ウェブスター」にすれば悩ましいユーザプロファイルやらナビゲーションバーが消えて幸せになれます。
「ウェブスター」はサイト作成時には選べないので、**いったん「カスタマーサービス」で作成してからビルダーでテーマ変更すれば「ウェブスター」が選択可能**です。

ゲストユーザがアクセスできるようにビルダーの設定から「公開アクセス」にチェックを入れるのを忘れずに。
またページのバリエーション作るとゲストのアクセス権限が外れる可能性があるので、利用者をデフォルト以外にする場合は注意を。

FAQはナレッジを表示することで対応したので、「トピックカタログ」コンポーネントでナレッジを一覧表示して選べるようにしました。
トピックから「トピックディテール」いってそこから「記事」のページに遷移する感じですね。

また検索も「ディスカッション」を検索するようにして記事を検索結果として出すようにしてます。検索は「ヒーロー」コンポーネントの中にあります。ヒーローなんて初めて見ましたが。

なんか余計なものが表示されたり（検索結果の左側にでるオブジェクト一覧とか。。。）して意に沿わない画面になったりましますが、「コンポーネントの定義なんで無理っす」、「標準機能なんで変わらないっす」って言い張るか、
CSSを頑張って書けばある程度は修正できます。。。display:noneをひたすら書くのです。。。
ChromeとかのF12コンソールつかってクラス名見つけてCSSを書いてくださいませ。。。案外しんどいです。

## ナレッジ設定する
ナレッジです。私もよくわからないのですがヘルプやらみて対応しまくったです。
なので要点のみだけで。。。詳しくはGoogle大先生に教えを請うてくださいませ。

+ ナレッジを有効可しませう
+ データカテゴリーも有効可しませう
+ 記事をつくりませう
+ トピックを設定しませう（これはサイトの設定）

てな感じで進めるわけですが注意するとこは、

1. ナレッジのページレイアウトに**「知識ベースに公開」**というチェックボックスがありませんので、ページレイアウトに追加してチェックしてやりましょう。出ないとゲストユーザからは見れないです。
2. トピックとデータカテゴリはなるだけ合わせたほうがよいっす。サイトはトピックで表示を行うのでデータカテゴリーとずれるとややこしいです。かつ、自動でトピックを割り当てることもできるのでデータカテゴリーが一緒だと幸せになれます。
3. トピックは2階層までつかえます。なのでFAQで階層を2階層まで設定できるんですが、トピックは1階層、2階層まで割り当てる必要があります。
4. ゲストユーザプロファイルからナレッジを見れるようにする。

トピックの割り当てをちょっと説明しておくと、
1階層：哺乳類
2階層：わんちゃん
3階層：柴
となっていた場合に「柴」に割り当てる記事は「わんちゃん」トピックも割り当てておかないとサイト上で遷移がうまくいかないと思います。
使ってるコンポーネントによって色々違うんでトライ＆エラーっす。

ゲストユーザからナレッジを見るのはプロファイルをいじります。
ゲストユーザのプロファイルはビルダーの設定にある「ゲストユーザプロファイル」から行きます。ここからしか行けない。
プロファイルの設定で気を付けるのは、「知識ベースの権限」の必要な権限にチェック（参照だけでいいと思いますが）と「カテゴリグループ表示設定」に権限を与えておくことです。
「カテゴリグループ表示設定」に権限を与えておかないとデータカテゴリによっては出ない出たりするので適切な権限を与えてくださいませ。

## 終わりに
Experiaence Cloudはとても強力です。こんなに簡単にサイトが立ち上がるのは幸せだと思います。おまけにページまで作ってくれる！
ただ簡単だからといって安易に上げるのはエライ目にあう可能性もあります。セキュリティなんかはその最たる例だと思います。。。書いてないですが。
ぜひとも色々気をつけてFAQサイトがすんなり立ち上がることをお祈りしています。
【Python逆引き】やりたいこと・知りたいこと記事まとめ

# この記事の目的・背景
普段業務で使用している**Python関係**（各種ライブラリも含む）の調べ物を繰り返しがちな筆者の
自分へのメモとちょっとした参考書までは行かないが、この記事内を逆引きで検索して答えを探す手助けになれば思って記載します。
また記載する内容については、筆者が１度調べた物をどんどん追加していき
重複が無いようには記載しますが、細かな部分で紹介する内容が異なっているが大元の情報（〇〇の仕方、など）が同様になっている可能性はあります。

※初めてQiitaの記事を書くので、誤字脱字・見辛いなどありましたらコメントなど頂けると修正等改善出来るよう善処します。


# Python標準
- lambda式の使い方
    - https://note.nkmk.me/python-lambda-usage/
- 内包表記でif句を使用する
    - https://esu-ko.hatenablog.com/entry/2016/02/13/Python%E3%81%AE%E3%83%AA%E3%82%B9%E3%83%88%E5%86%85%E5%8C%85%E8%A1%A8%E8%A8%98%E3%81%A8if%2Celse
- 自動整形・コードフォーマット
    - black（文字列の括りのルール決めから開放されたい）
        - https://hesma2.hatenablog.com/entry/2021/01/18/080000
- ２つの辞書を比較したい
    - https://teratail.com/questions/106010
- ファイルパスから拡張子なしのファイル名を取得したい
    - https://www.delftstack.com/ja/howto/python/python-get-filename-without-extension-from-path/#%25E3%2583%2591%25E3%2582%25B9%25E3%2581%258B%25E3%2582%2589%25E3%2583%2595%25E3%2582%25A1%25E3%2582%25A4%25E3%2583%25AB%25E5%2590%258D%25E3%2582%2592%25E5%258F%2596%25E5%25BE%2597%25E3%2581%2599%25E3%2582%258B-python-%25E3%2581%25AE-os.path.basename-%25E3%2581%25A8-os.path.splitext-%25E3%2583%25A1%25E3%2582%25BD%25E3%2583%2583%25E3%2583%2589%25E3%2582%2592%25E4%25BD%25BF%25E7%2594%25A8%25E3%2581%2599%25E3%2582%258B
- CSV等の行処理速度の比較（pandas, numpy等）
    - https://resanaplaza.com/2021/09/19/%E3%80%90python%E3%80%91pandas%E3%81%A8numpy%E3%81%AE%E9%81%95%E3%81%84%E3%81%A8%E9%80%9F%E5%BA%A6%E6%AF%94%E8%BC%83/#pandas_numpy-2



# Django
- 構築
    - ディレクトリとファイル構成
        - https://note.com/saito_pythonista/n/nb95c54f4c327
- Viewの使い方
    - https://note.crohaco.net/2018/django-rest-framework-view/
- reverseの使い方
    - https://codor.co.jp/django/how-to-use-render
- Serializerに受け渡したいデータがあるとき
    - context={'名前': 渡したいデータ}
        - https://qiita.com/montanha_masu536/items/4eecefaf6132babbca7a
- Model
    - Model Fieldの一覧
        - https://kuma-server.com/model-field/
    - Image Fieldの使い方
        - https://self-methods.com/django-imagefield-basic/
- django-extensions
    - 便利な使い方
        - https://zenn.dev/shimakaze_soft/scraps/1e61519eb122e2
- アップロードしたCSVファイルを直接pandasで読み込む
    - https://qiita.com/vossibop/items/258a147f185da5c480d4

# pandas
- DataFrameの空判定したい
    - パフォーマンス別
        - https://chico-shikaku.com/2020/12/pandas-dataframe-check-empty-performance/
- DataFrameを辞書（dict）に変換
    - https://note.nkmk.me/python-pandas-to-dict/
Sketchfabにアップロードする3Dモデル要件を日本語訳する

3DModelViewerとして便利な[Sketchfab](https://sketchfab.com)に3Dモデルをアップロードするときに

- ファイル形式は？
- Material数は？
- Textureは？

など、色んな疑問を調査する記事になります。

結論、ドキュメントに書いてありますが、英語なんですよね...なので日本語でガシガシまとめていきたいと思います。

https://help.sketchfab.com/hc/en-us/articles/201766675-Improving-Viewer-Performance

# Improving Viewer Performance (Viewerのパフォーマンス向上)

## 結論
- 極力マテリアル数は少なく
- 50以下のジオメトリ/メッシュ数
- テクスチャは10枚以下 (4Kテクスチャの場合)
- 50万ポリゴン以下
- ボーン数は1ジオメトリあたり35以下
- シーンが複雑でない
- 立地な透明化方式は避ける
- カメラをアタッチしたときに、ライトが影を落とさないようにする
- 適切にShadelessモードを検討する
- ファイルサイズは圧縮して500MB以下

## ダウンロード時間
極力ダウンロード時間が短いほうがいい。そのためにできること
### Textures
> we will never use a texture larger than 8192×8192 pixels.

8192×8192 pixelsより大きなサイズを決して使わないこと。(8192を含むのかは調査中)
極力、Texture数とTextureサイズを小さくする努力をする。

### Mesh Size
頂点数、ポリゴン数が多いほどダウンロードに時間がかかります。

### Background
HDRi environmentsは大きい画像データになる。また、固定画像の背景も同様にダウンロードが必要。
一方でSolid Colorの背景はダウンロードが必要ないため、一番最適である。

## Scene最適化
できること

- 同一のマテリアルをマージする
- 同じマテリアルを共有するメッシュ（ジオメトリ）のマージ
- シーングラフの簡素化
- 未使用のUVを削除
- 未使用の頂点カラーを削除
- 未使用の法線と接線を削除
- チャンネルパックテクスチャ

## Rendering Performance

### Materials
Material数が多いとレンダリングのボトルネックになる。
Sketchfabは1つのシーンで**最大100のマテリアル**をサポートしている。

### Textures
- テクスチャサイズの数は少ないほどよい
    - 例えば4Kテクスチャは50MBほどのメモリを必要とする
- 4Kがちょうどよい限界であることが多い

### Meshes

シーン内のメッシュ/オブジェクト/ジオメトリが別れているほど、パフォーマンスは低下する。理想は各マテリアルに対してメッシュが1つであること。

### Polygons / Vertices (ポリゴン/頂点)

ポリゴン数を減らすことは有効である。殆どの場合数百万ポリゴンというのは不要。
Normal Mappingを使用することで、ポリゴン数を偽装することができる。
モバイル端末で閲覧する場合は、100万~150万ポリゴンを最大として考えると良い。

# Supported 3D File Formats (対応している3Dファイル形式)

## おすすめ
|ファイル形式|ファイル名|
|---|---|
|.obj|Alias Wavefront|
|.blend|Blender|
|.fbx|Autodesk Filmbox, FBX|
|.gltf (+.bin), .glb|GL Transmission Format|

## その他対応している形式

|ファイル形式|ファイル名|
|---|---|
|.3dc|3DC point cloud|
|.3ds|3DS|
|.abc|Alembic|
|.dae,.zae|Collada|
|.igs,.iges|Initial Graphics Exchange Specification, IGES|
|.las|LIDAR point clouds|
|.ply|Polygon File Format|
|.stl|Stereolithography, Standard Tessellation Language|
|.usd,.usdz,.usda,.usdc|Universal Scene Description (USD)|

# Uploading 3D Models (3Dモデルのアップロードの仕方)

## Zipアップロード

ファイルサイズを削減するためにも、Zipにしてアップロードすることをおすすめする。必要なのは

- Textureファイル
- Materialファイル (OBJ形式の場合)
- 3Dモデルファイル

である。
このようにサブフォルダーを作っても良い。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96970/c23259fa-47f3-17ff-0bf1-4f7e8f05bedb.png)

ファイルサイズの制限は[プラン](https://sketchfab.com/plans?utm_source=help_center&utm_medium=referral&utm_campaign=help_article_content&utm_content=360031770411&utm_source=help_center&utm_medium=referral)によって異なる。
Premiumプランは500MBが上限。

## [Textures](https://help.sketchfab.com/hc/en-us/articles/202600873-Materials-and-Textures)

### 対応形式

**アップロード時の対応形式**
.JPG
.PNG
.TIFF
.TGA
.DDS
.GIF
.BMP

**3D Setting時の対応形式**

.JPG
.PNG
.TGA
.VTF

### Processing & Compression

サイズを2のべき乗にする。
32×32 ~ 8192×8192
「Announcing TypeScript 4.6 Beta」を読む

## はじめに

少し前になりますが、TypeScriptのブログで4.6 Betaがアナウンスされました。

https://devblogs.microsoft.com/typescript/announcing-typescript-4-6-beta/

個人的に気になるものをメモしてみたいと思います。

## Improved Recursion Depth Checks

再帰的な定義の場合にループ検知するのですかね。今までもヒューリスティックに検知していたので、効果としてはスピードアップということのようです。

## Indexed Access Inference Improvements

[こちら](https://devblogs.microsoft.com/typescript/announcing-typescript-4-6-beta/#indexed-access-inference-improvements)より引用:

```ts
interface TypeMap {
    "number": number;
    "string": string;
    "boolean": boolean;
}

type UnionRecord<P extends keyof TypeMap> = { [K in P]:
    {
        kind: K;
        v: TypeMap[K];
        f: (p: TypeMap[K]) => void;
    }
}[P];

function processRecord<K extends keyof TypeMap>(record: UnionRecord<K>) {
    record.f(record.v);
}

processRecord({
    kind: "string",
    v: "hello!",

    // 'val' used to implicitly have the type 'string | number | boolean',
    // but now is correctly inferred to just 'string'.
    f: val => {
        console.log(val.toUpperCase());
    }
})
```

これは、過去に遭遇したことがあるかもしれません。すぐには思いつきませんが、こういうことをするケースはありそうです。

## Control Flow Analysis for Dependent Parameters

[こちら](https://devblogs.microsoft.com/typescript/announcing-typescript-4-6-beta/#control-flow-analysis-for-dependent-parameters)より引用:

```ts
function func(...args: ["str", string] | ["num", number]) {
    // ...
}
```

これは、やりたかったことがある記憶です。ただ、ぱっとは思い出せない。結局戻り値を変えたくなったら、function overloadするしかないということですかね。

## More Syntax and Binding Errors in JavaScript

TSがJSの領分に入ってきてますね。良いですが。

## TypeScript Trace Analyzer

[analyze-trace](https://www.npmjs.com/package/@typescript/analyze-trace)なんていうものがあるんですね。

## おわりに

単なる個人的な感想だけになってしまいました。興味ある方は元の投稿を参照されるのが良いかと思います。
Java,Kotlin上からJDBCでSQLite接続しているときに、IDEA上でUnable to resolve tableと表示されてしまう時の対処法

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362835/09e8379b-c957-3cc2-bebb-8fe026409b46.png)
これをなおしたい。5分くらいハマったのでメモ。

# 解決方法
File > Settings > Languages & Frameworks > SQL Dialects
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362835/71bb2aa0-5d1c-ef72-c7ab-e8b9b5c3f3a0.png)
ここを両方SQLiteにする
DynamicLinksをカスタムドメインにする

## なぜカスタムドメインにするのか
なぜ、DynamicLinksのサブドメイン(https://XXX.page.link/)

をそのまま使わないかというと、そのリンクを添付したメールが迷惑メールに入るようになったから😭

## AWSのドメインとHostingを紐づける作業は基本的にはこの記事通り
https://qiita.com/mag-chang/items/6706f27207f694049423

## 状況
ドメインのレコードにすでに、AレコードとTXTレコードが保存されていた。
複数保存することも可能だが、Aレコードはエイリアスで保存されていたため複数保存することが不可能だった。

## 解決策
ホストゾーンにサブドメインで作成してAレコードとTXTレコードを追加する。

まず、ホストゾーンにサブドメインを追加する。すると以下のレコードができる。
![Route_53_Console_Hosted_Zones.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422935/3f70db1b-a1bf-d233-92a9-595e2c7f6f6a.png)


サブドメインをドメインと繋げるために、サブドメインを作成した時につくられた①をコピーして、親のドメインのレコードに追加する。

![Route_53_Console_Hosted_Zones.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422935/1cadc447-96d6-8d3b-69d9-a465da40a747.png)

添付した記事
TXTレコードの設定反映は少し時間がかかった気がする。

新しく作成したホストゾーンの中身
![Route_53_Console_Hosted_Zones.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422935/0cac9fd9-cf6c-3e1e-e46a-99a09e99b98a.png)

Firebase
![coetto-stg_-_Firebase_コンソール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422935/5e05a20d-c36b-66f6-6bbd-84a356500099.png)

## DynamicLinksをカスタムドメインにする
AレコードとTXTレコードを設定しないと追加できない
こんなエラーがでる
![coetto-stg_-_Dynamic_Links_-_Firebase_コンソール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422935/df8db87b-70a6-0971-8bb0-2a0a7cf1c0da.png)

青矢印をクリックするとURL接頭辞を追加できる
![coetto-stg_-_Dynamic_Links_-_Firebase_コンソール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422935/3bc36219-fe52-9255-a3bc-cb5d2c7fb0e9.png)

カスタムドメインにしたのに、`/links`を付けるよう言われる。
`firebase.json`をいじるとこの`links`を変更できたり、うまく設定できると、`https://sample.jp/`をURL接頭辞にすることもできる。
![coetto-stg_-_Dynamic_Links_-_Firebase_コンソール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422935/dbc11fd2-628f-f967-3bc3-49113d48b358.png)


ちなみに、Hostingが保留中状態のドメインでもダイナミックリンクを使用することはできた。
MinGWのインストールで「The file has been downloaded incorrectly」のエラーが出るときの対処法

### はじめに

こんにちは。
昨日、新しいPCが届いて各種環境設定などをしていたのですが、mingwをインストールする際に少し詰まった部分があったので書き残しておきたいと思います。

### 環境
OS:Windows11

### 発生した問題
MinGW-w64を[ここ](https://sourceforge.net/projects/mingw-w64/)から、[このサイト](https://joho.g-edu.uec.ac.jp/joho/gcc_win/)を参考にインストールしようとしたが、インストール先を指定してNextをクリックしたときに「The file has been downloaded incorrectly」というエラーダイアログが表示されインストールが停止してしまった。

###最初に試したこと
1. 指定しているパス内に日本語等が含まれていないかを確認。（このプログラムに限らず、インストールの際にパス上に日本語などが含まれていることは予期せぬエラーの原因になる。）
2. 管理者権限でインストーラを起動。
3. インストーラをダウンロードしなおし、PCを再起動。

### 結果
改善せず。

### 解決策
根本的な話になるのですが、使用するインストーラを[これ](https://osdn.net/projects/mingw/downloads/68260/mingw-get-setup.exe/)に変更しました。このリンクに飛ぶと、mingw-get-setup.exeが自動的にダウンロードされます。このexeファイルを起動してダイアログに従って進めていくと、Mingw-installation-managerをインストールできます。[このサイト](https://qiita.com/ryo-sato/items/00c17469978e47d91a09)などが参考になると思います。
![MinGW Installation Manager 2022_02_03 13_37_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/881013/e39d181a-a109-89f5-c7b4-5a359bd4d62b.png)

上の画面が表示されたら、C言語のコンパイラを使いたい場合は上から２つ目、C++のコンパイラを使いたい場合は上から５つ目を選択して、Installation→Apply Changesをしてください。他にFortranやObjective Cも使えるようです。

最後に環境変数を設定し、PCを再起動すればgccコマンドなどが使えるようになっているはずです。（具体的にはシステム環境変数のPATHの末尾に、gcc.exeやg++.exeが入っているbinフォルダのパスを追加すればOK。）
QiitaのMarkdownパーサー変更にともなう、補足説明の書き方と注意点

## 記事投稿シリーズについて

QiitaでGitHub Flavored Markdown (以下GFM) に準拠したMarkdownパーサーが[ベータ版として公開されました！](https://blog.qiita.com/replace-markdown-parser-beta/)

[Qiitaアカウントによる説明記事](https://qiita.com/Qiita/items/e87ebe3138f62b0e8b58)にも書いてあるのですが、今までと記法が変わっている箇所があるので注意が必要です。
せっかく書いた記事の表示が崩れてしまうのは困るので、可能な限り防ぎたいと考えています！

そこで、記事を書く時に注意すべき記法などについて、Qiita運営から5日間に分けて10記事のシリーズで投稿することになりました！
少しでも皆様が執筆する際の助けになればと思います。

詳しくはQiitaアカウントによる説明記事に、投稿シリーズの説明や、他の記事一覧が載っていますのでぜひ他の記事も読んでみてください！

https://qiita.com/Qiita/items/e87ebe3138f62b0e8b58

GFMの記法とは少し違いますが、この記事ではQiita独自の「補足説明のための記法（以下ノート記法）」について説明します。

## ノート記法の説明

[2021年7月21日にリリースしたQiita独自の記法](https://qiita.com/release-notes#%E3%83%8E%E3%83%BC%E3%83%88%E8%A8%98%E6%B3%95%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F)です。

目を引く形で補足説明をしたい場合、補足したい内容を`:::note info`と`:::`で囲みます。
補足したい内容と`:::note info`と`:::`はそれぞれ別の行にする必要があります。
noteの後のinfoは省略可能です。
また、 noteの後に`warn`をつけると警告メッセージとして、`alert`をつけるとより強い警告メッセージとして表現することができます。

```
:::note info
インフォメーション
infoは省略可能です。
:::

:::note warn
警告
○○に注意してください。
:::

:::note alert
より強い警告
○○しないでください。
:::
```

:::note info
インフォメーション
infoは省略可能です。
:::

:::note warn
警告
○○に注意してください。
:::

:::note alert
より強い警告
○○しないでください。
:::

## パーサー変更にともなうアップデート

ノート記法の中で一部のマークダウンが使えるようになりました！

これまではプレーンなテキストと絵文字しか扱えませんでしたが、今回のアップデートにより以下をご使用いただけます！

- リンク
- 箇条書き
- コード
- 太字
- 斜体
- 打ち消し線
- 画像

実際にノート記法の中で使ってみるとこのように見えます。

:::note
[リンク](#リンク)

1. 順序有りの箇条書き
1. 順序有りの箇条書き
1. 順序有りの箇条書き

- 順序無しの箇条書き
- 順序無しの箇条書き
- 順序無しの箇条書き

`code`

**太字**

*斜体*

~~打ち消し線~~

画像↓
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/064c6d3f-f241-8ff9-1a78-46a5100ebed7.png)
:::

正確に言えば他のMarkdownの書き方も使えるのですが、現在は表示が崩れたり余白が空きすぎたりしてしまいます。
こちらは順次アップデートしていきますのでお待ちください :bow:

## 最後に

記事投稿シリーズはこちらの記事をもって完了です。

全て読んでいただいた方、ありがとうございます！
まだの方は、他の記法についても[Qiitaアカウントによる説明記事](https://qiita.com/Qiita/items/e87ebe3138f62b0e8b58)でまとめていますので、合わせて読んでみてください！

また、Qiitaは今後も改善を続けていきます。
その中ではエディタの使い勝手向上や機能の追加も予定しており、皆さまに心地よく書いていただけるようにアップデートしていきます！

エディタを使ってみての感想も含め、[Qiita Discussions](https://github.com/increments/qiita-discussions/discussions)でいつでもお待ちしています。
ご意見がありましたら是非お寄せください！

---

↓記事投稿シリーズまとめ

https://qiita.com/Qiita/items/e87ebe3138f62b0e8b58

↓前の記事

https://qiita.com/mziyut/items/bc00ed7396bd60a717b8
Windowsサービスの実行状態を取得/実行

###Windowsサービスの状態を取得したり動かしたり

```
using System.ServiceProcess;

// Print Spooler = サービス名
using (ServiceController sc = new ServiceController("Print Spooler"))
{
  //プロパティ値を更新
  sc.Refresh();

  if (sc.Status == ServiceControllerStatus.Stopped)
  {
    // サービスが止まってたら動かす
    sc.Start();
    // サービスが動くまで最大1分間待つ
    sc.WaitForStatus(ServiceControllerStatus.Running, new TimeSpan(0, 0, 1, 0));
  }
}
```
古いバージョンのSwiper.jsを使ったら詰まったお話 Ver3.4.1

WEBデザイナー＆コーダーのYJ2222です。
JSを使ったスライダープラグインSwiperについてのメモです。

## 経緯と概要
今回は最新(2022/2/3時点)の事についてではなく、古いVerのものになります。
経緯としてはコード改修案件で古いVerのまま実装しなくてはならなくて検索に困ったので自分用にまとめることにしました。
わざわざ古いVerを使うことはないかと思いますが、もし同じ境遇の方いたら助けになれば思います。
ただ詳しくは書けないので、参考程度にお願いします。

▼正式マニュアル（最新版）
https://swiperjs.com/get-started

▼Ver3.4.1で参考にした記事
https://www.willstyle.co.jp/blog/724/

## 完成計コード
先に完成形を載せていきます。

```html:html
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/Swiper/3.4.1/css/swiper.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/Swiper/3.4.1/js/swiper.min.js"></script>

<div class="swiper-container">
  <div class="swiper-wrapper">
      <div class="swiper-slide"><img src="../img/store_image_1.jpg" alt=""></div>
      <div class="swiper-slide"><img src="../img/store_image_2.jpg" alt=""></div>
      <div class="swiper-slide"><img src="../img/store_image_3.jpg" alt=""></div>
  </div>
  <div class="swiper-button-prev"></div>
  <div class="swiper-button-next"></div>
</div>
```
※画像URL等は適宜変えてください。

```css:css
.swiper-container {
    width: 100%;
    max-width: 800px;
}
.swiper-slide img {
    width: 100%;
}
.swiper-button-prev,
.swiper-button-next {
    background-color: rgba(0, 0, 0, 0.5);
    width: 50px !important;
    height: 50px !important;
}
.swiper-button-prev:hover,
.swiper-button-next:hover {
    background-color: rgba(0, 0, 0, 1);
}
.swiper-button-prev {
    background-image: url(../img/chevron-left.svg) !important; 
}
.swiper-button-next {
    background-image: url(../img/chevron-right.svg) !important; 
}
```

```html:html
window.onload = function() {
  var mySwiper = new Swiper('.swiper-container',{
    loop: true,
    nextButton: '.swiper-button-next',
    prevButton: '.swiper-button-prev',
    speed: 1000,
  });
}
```

## 最新版との変更点

### CDNが違う
当たり前といえば、当たり前ですが、Verの数字が違いますよ～レベルじゃなく変わってますね^^;

### コンテナ名が違う
スライダーをかこってる大元のクラス名が違います。
旧：`.swiper-container`
新：`.swiper`

### JSの記述が違う
ここが結構大きいかもしれません。今回の例で行くと左右のアイコンの表示部分です。最新版だと配列が多次元になっているのと、そもそもキーの名前が変わってます。

```javascript:旧
nextButton: '.swiper-button-next',
prevButton: '.swiper-button-prev',
```

```javascript:新
navigation: {
    nextEl: '.swiper-button-next',
    prevEl: '.swiper-button-prev',
},
```

`pagination`などもこのような感じで変わってました。
よく使いそうな、`direction`（方向）や`speed`、`loop`などは変わってなかったみたいです。

## まとめ
冒頭にも書きましたが、まぁわざわざ古いVerを使うことはないのでこれから実装する人には要らない情報です。
ただ案件によってはVerそのままでってなることもあるのでその時にお役に立てればと思います。
比較と向きの小技

比較の結果を `-`, `0`, `+` で表すと都合良く扱えることがあることがあります。比較演算子 (`<`, `>`, ...) をカスタマイズできない言語でよく使われます。

## 比較を正負にする例

* C の `strcmp`, `memcmp` 関数。
* C の `qsort` 関数が受け取る関数。
* Python 2 の `cmp` 組込み関数。
* Java の `Comparable` インタフェース。
* JavaScript の `Array.prototype.sort` に渡す関数。

どの言語でも `(a, b)` の順で引数に渡すと `a < b` なら負の値、 `a > b` なら正の値を返すため、

```c
if (compare(a, b) < 0) {
    // a < b のとき
}
```

のように右辺の 0 と比較した場合と記号が一致するようになります。また、比較結果の値に -1 を掛けることで不等号を反転できます。

オーバーフローを無視した簡単な `compare` 関数の実装例は以下のようになります。

```c
int compare(int a, int b) {
    return b - a;
}
```

:::note warn
実際の製品のコードではオーバーフローを避けるようにしましょう。
:::

## 向き

例えば数直線の値を扱うときは、右向きを正、左向きを負として定義すると、比較がより便利に使えます。

```c
const int RIGHT = 1;
const int LEFT = -1;

int direction = /* RIGHT or LEFT */;
if (compare(a, b) * direction < 0) {
    // a から b が direction の向きの場合
}
```

この方法を利用していなければ、以下のようなコードになっていたかもしれません。

```c
const int RIGHT = 0;
const int LEFT = 1;
int direction = /* RIGHT or LEFT */;

if (direction == RIGHT) {
    if (a < b) {
        // a から b が右の向きの場合
    }
} else if (direction == LEFT) {
    if (a > b) {
        // a から b が左の向きの場合
    }
}
```

現在動かしている方向・検知した方向・設定で保存された方向・入力された方向…など様々な方向が与えられると、そのたびに if 文を足すと循環的複雑度がどんどん膨れ上がってしまいますが、この方法だと掛け算で 1 つにまとめて対処できる場合が出てきます。例えば、組み込みでモーターの回転と連動するセンサーを同時に扱うコードでは、分岐やネストを減らして見通しの良いコードを書くことができます。

ちなみにすでに `boolean` や `0`/`1` で定義してしまっていた場合、 `-n | 1` で `1`/`-1` になります。

## まとめ

* 比較の結果を -, 0, + で表すと都合良く扱えるケースがあります。
* 向きを -1, 0, 1 で定義すると、比較と組み合わせて便利に扱うことができるようになります。
    * 順序の種類や特性については [Wikipedia: 順序構造](https://ja.wikipedia.org/wiki/Category:%E9%A0%86%E5%BA%8F%E6%A7%8B%E9%80%A0) を読むと良いかも。
ServiceNow - CSVファイルをインポートセットにアップロード（PowerShell）

#目的：
次ぎのServiceNowページにはCSVファイルをインポートセットにアップロードするサンプルコードが記載されている。
https://docs.servicenow.com/bundle/rome-platform-administration/page/administer/import-sets/reference/r_PerlExample.html
また、REST API Explorerを利用してファイルをアップロードするスクリプトを生成することもできる。
ただし、Windowsを利用している場合はPowerShellを利用したファイルをアップロードする場合が多い。サンプルコード及びREST API ExplorerからPowerShellを利用したファイルをアップロードするサンプルのスクリプトが提供されていない。本記事ではPowerShellでServiceNowのインポートセットにファイルをアップロードする例を提示する。

#サンプルスクリプト
```
$user = "<username>"                           # ServiceNowにログインするユーザ名
$pass = "<password>"                           # ServiceNowにログインするパスワード
$instanceName = "<instance name>"              # ServiceNowのインスタンス名
$fileName = "<name of file to upload>"         # アップロードするファイル名
$fieldName = "csvfile"                         # フィールド名
$filePath = "<path to file>" + $filename       # アップロードするcsvのパス
$tableName = "<name of table>"                 # アップロード先のテーブル名 

# ヘッダの定義
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $user, $pass)))

$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
$headers.Add('Content-Type', 'multipart/form-data')
$headers.Add('Authorization',('Basic {0}' -f $base64AuthInfo))
$headers.Add('Accept','application/json')

# URI
$uri = "https://" + $instanceName + ".service-now.com/sys_import.do?sysparm_import_set_tablename=" + $tableName + "&sysparm_transform_after_load=true"

# HTTPメソッド
$method = "POST"

$FileBytes = [System.IO.File]::ReadAllBytes($filePath)
$FileEnc = [System.Text.Encoding]::GetEncoding('UTF-8').GetString($FileBytes)
$Boundary = [System.Guid]::NewGuid().ToString()
$LF = "`r`n"

$BodyLines = (
    "--$Boundary",
    "Content-Disposition: form-data; name=`"$fieldName`"; filename=`"$fileName`"",
    "Content-Type: text/csv$LF",
    $FileEnc,
    "--$Boundary--$LF"
) -join $LF


try {
    Invoke-Restmethod -Method $method -Headers $headers -ContentType "multipart/form-data; boundary=`"$Boundary`"" -Uri $uri -Body $BodyLines -ErrorAction Stop

    $response.RawContent
} catch {
    $_
    throw "Unable to import Data"
}
```

以上
IBMCloud AppIDでCRN番号を取得する方法

## この記事の目的

IBMCloudでAppIDで問題が発生した際に、ケース作成した際にサポートから利用しているAPPIDを特定するためにCRN番号の提示を求められるため、確認する方法を記述いたします。

CRN番号は、なかなか馴染みがないのですが、サポート問い合わせではよく利用するので頭の片隅に入れておいていただくといいかもしれません。

## はじめに
CRN番号とは、クラウド・リソース名(Cloud Resource Name)のことで、IBMCloud上のリソースを一意に特定するために使用する番号です。そのため、CRNはAppIDのサービスに限らず、色々なサービスで割り振られています。

[IBMCloud クラウド・リソース名](https://cloud.ibm.com/docs/account?topic=account-crn&locale=ja)

## AppIDにおけるCRN番号の確認方法

1. IBMCloud -> ResourceList -> Services and software を展開 -> 対象AppIDインスタンスを選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703075/19c0ad82-ff85-f37f-0776-391046655ba3.png)

2. 画面右にインスタンス詳細が表示されるため、CRN番号をコピーする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703075/54136359-28ad-4cd0-a3d9-30f3577cd48b.png)
AI-900:Microsoft Azure AI Fundamentals試験に向けて part4

#Azure Machine Learning デザイナーを使用してクラスタリング モデルを作成する

- MSLearn
    - [リンクはコチラ](https://docs.microsoft.com/ja-jp/learn/modules/create-clustering-model-azure-machine-learning-designer/)

- クラスタリング モデル
    - 前回・前々回の統計と同じ機械学習手法の1つ
    - 機械学習の1種でデータ間の類似度にもとづいて、データをグループ分けする手法

- ワークスペース・コンピューティグリソースの作成
    - 特に注意点もないので省略

- データ正規化
    - だんだん慣れてきたな
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219847/408ffaee-e1b7-10e5-d97c-9997f9fa938a.png)

- トレーニングモジュールの追加
    - Random seedって何だっけ？って思ったけど乱数作ってるだけだった。
    - トレーニング完了、各クラスターの中心までの距離を示す列も出来ている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219847/bf0692cd-d70d-4111-b85b-d07b4a44f8b0.png)

- 推論パイプラインの作成
    - ここまでサックリと進んだ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219847/1d15dea4-173e-58a2-7465-38e8f8ae6d75.png)

- サービスデプロイ＆チェック
    - 後は手順通りデプロイしてテストして終了。わりとサックリ進められた。
AngularFireのGuardを導入する

#概要
AngularFireを利用していて、Guardを導入する際、Firebase製のGuardがあることを知り、導入してみたら想像以上に簡単にGuardを実装することができたので、記事にして共有しようと思います。

#導入
例のごとく、app.module.tsにモジュールを追加してください。firebase関連のモジュールも一応記載しておきます。

※古いAngularFire系の記事を参考にする場合、v8系のコードを使うにはfireの後に`compat`が入るようになっていますので、迷走している方は参考にしてください。

```ts:app.module.ts
// firebase
import { AngularFireModule } from '@angular/fire/compat';
import { AngularFireAuthModule} from '@angular/fire/compat/auth';
import { AngularFireAuthGuardModule} from '@angular/fire/compat/auth-guard';  // ← 追加
import { environment } from 'src/environments/environment';

@NgModule({
  imports: [
    // firebase
    AngularFireModule.initializeApp(environment.firebase),
    AngularFireAuthModule,
    AngularFireAuthGuardModule,  // ← 追加
  ],
})
export class AppModule { }
```

次にルーティングモジュールにGuardの記載を追加します。
大抵の場合は認証が切れたらログイン画面に戻るようにしたいと思いますので、今回はログイン画面にリダイレクトする方法も併せて記載します。

Guardを設定したいパスの部分に`canActivate:[AngularFireAuthGuard]`を追加することでGuardが設定され、
`data: {authGuardPipe: redirectUnauthorizedToLogin }`で認証が通らなかった際のリダイレクト先を指定しています。
他にもいくつかカスタマイズできるみたいです。

※`loadChildren: () => ~~Module`のように記載していますが、いつも通りの`component: ~~component`でも問題ありません

```ts:app-routing.module.ts
import { AngularFireAuthGuard, redirectUnauthorizedTo } from '@angular/fire/compat/auth-guard';  // ← 追加

const redirectUnauthorizedToLogin = () => redirectUnauthorizedTo(["auth"]);  // ← リダイレクト先を指定したい場合に使用
const routes: Routes = [
  { path: '', redirectTo: '/auth', pathMatch: 'full' },
  { path: 'auth', loadChildren: () => AuthModule },
  { path: 'main', canActivate: [AngularFireAuthGuard], data: {authGuardPipe: redirectUnauthorizedToLogin }, loadChildren: () => MainModule},  // ← 追加
  { path: '**', redirectTo: '/auth' },
];

@NgModule({
  imports: [RouterModule.forRoot(routes), ReactiveFormsModule],
  exports: [RouterModule]
})
export class AppRoutingModule { }
```

以上で終了です！

これでfirebaseを使った認証ならばGuardが働いてくれる状態になりました。


#まとめ
実質、ルーティングモジュールにちょちょっと追記するだけでGuardの設定をすることができてしまいました。
お気づきになりましたか？
そうなんです。Guardを作成しなくて良いんです。良い時代になりましたね。


#参考
- [@angular/fireのAuth Guardsで認証チェックをする](https://qiita.com/MoguraStore/items/2abfc9493d121d223c45)
- [これからFirebaseでプロジェクトを始めようとする全ての人が知っておくべきこと v8→v9リリース](https://zenn.dev/hiro__dev/articles/605161cd5a7875)
ARメジャーのアレ　ARKitで2点間の距離を測る

#ARメジャーの機能を手軽に実装します
<img src="https://user-images.githubusercontent.com/23278992/152272928-bfc8660d-fae8-4bda-96dc-e087877961e5.gif">

#３次元上の2点間の距離をはかりたい
複雑な計算が必要なのでしょうか？

#ARKitでかんたん計算

iOSには平面へのヒットテストや、三次元の2点間の距離を手軽に測れる機能があります。
ARはセンシングが肝なので、距離計算はなかなかに正確です。

#手順

ヒットテストで、画面タップと平面との交点座標を検出します。

```swift
@objc func tap(recognizer: UITapGestureRecognizer) {
    let hitTestResults = sceneView.hitTest(recognizer.location(in: sceneView),types:[.estimatedHorizontalPlane,.estimatedVerticalPlane])
    guard let result = hitTestResults.first else { return }
    let worldCoordinates = simd_float3(x: result.worldTransform.columns.3.x, y: result.worldTransform.columns.3.y, z: result.worldTransform.columns.3.z)
}
```

あとは、１回目のタップの座標と２回目のタップの座標の距離をプリセットのdistance関数で計算します。

```swift
if coordinates1 == nil {
    coordinate1 = worldCoordinates
} else {
    coordinate2 = worldCoordinates
    let distance = distance(coordinate1, coordinate2)
    print(distance)
}
```

> 0.40427696

関数はメートル単位の結果を返します。

４０cmの物差しを測ってみると、ちゃんと４０cmと計算されました。

<img src="https://user-images.githubusercontent.com/23278992/152272928-bfc8660d-fae8-4bda-96dc-e087877961e5.gif">

#ARKitのセンサーは優秀
意外と正確に距離が取れるので、いろいろなアプリケーションに使えそうですね。

🐣
****
フリーランスエンジニアです。
お仕事のご相談こちらまで
rockyshikoku@gmail.com

Core MLやARKitを使ったアプリを作っています。
機械学習／AR関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
[py2rb] sorted key=itemgetter

# はじめに
移植やってます。
( from python 3.7 to ruby 2.7 )
# sorted (Python)
```python
import operator as op
import string
from itertools import count

psms = list(zip(count(), string.ascii_uppercase + string.ascii_lowercase,
            np.arange(0.01, 0.062, 0.001)))
key = op.itemgetter(0)  # 関数を設定
ipsms = iter(psms)
spsms = sorted(ipsms, key=key)  # 今回はここの話
```
`sorted`のオプション`key`に関数を指定することにより、その戻り値によってソートすることができます。

分かりやすい記事はこちら

https://qiita.com/tag1216/items/485217b5c88dfcf00d34

ただし、今回のソート対象の場合、`key = lambda x: x[0]`でも行けそうな気もしますし、途中の`iter()`が無くても動作します。
# どうすRuby
まずは、小手調べで絶対値の昇順でソートする例。

https://note.nkmk.me/python-key-sort-sorted-max-min/

```ruby
l_2d = [[2, 10], [1, -30], [-3, 20]]

p l_2d.sort_by{ |x| x.map{ |y| y.abs }.max }

# [[2, 10], [-3, 20], [1, -30]]
```
ふむふむ。

```ruby
l_2d = [[2, 10], [1, -30], [-3, 20]]

key = lambda { |x| x.map{ |y| y.abs }.max }
p l_2d.sort_by{ |x| key.call(x) }

# [[2, 10], [-3, 20], [1, -30]]
```
これで、`lambda`によりソート方法を後から変更することが可能に。
# メモ
+ Python の sorted を学習した
+ 百里を行く者は九十里を半ばとす