OmniAICreator/Qiita-1.07M huggingface dataset:
Lookerでのモデル作成の基本

## はじめに
Lookerはデータを効果的に可視化し、分析するための強力なツールです。このガイドでは、Lookerでの基本的なモデル作成手順を紹介します。架空のテーブル名と列名を使用し、簡潔なコードサンプルを交えて説明します。
## 1. データベース接続の設定

まず、Lookerがデータベースに接続できるように設定を行います。接続設定は、Lookerの管理コンソールで行います。接続名を `example_connection` としましょう。

1. Looker管理コンソールにログインします。
2. **Admin** -> **Connections** をクリックします。
3. **New Connection** をクリックし、接続情報を入力して保存します。

## 2. モデルファイルの作成

モデルファイルでは、データベース接続とインクルードするビューを指定します。

#### model.lkml

```lookml
connection: "example_connection" #　※ここを変えると繋がらなくなる可能性があるので、注意

include: "/views/*.view.lkml"  # views フォルダー内の全てのビューをインクルード

explore: orders {
  join: customers {
    relationship: many_to_one  # 多対一のリレーションシップを指定
    sql_on: ${orders.customer_id} = ${customers.id} ;;
  }
}
```

#### リレーションシップについて

`relationship` は、テーブル間のデータの関連性を指定します。Lookerでは以下のリレーションシップタイプを使用します：

- `many_to_one`: 多対一の関係。例えば、`orders` テーブルの複数の行が `customers` テーブルの一つの行に関連付けられている場合に使用します。
- `one_to_one`: 一対一の関係。例えば、`users` テーブルと `user_profiles` テーブルの各行が一対一で対応する場合に使用します。
- `many_to_many`: 多対多の関係。複数の行が互いに関連している場合に使用しますが、Lookerでは一般的に避けるべきです。

また、`sql_on` にはリレーションシップを確立するためのSQL条件を指定します。通常、主キーと外部キーを使用してテーブルを結合します。例えば、`orders` テーブルの `customer_id` 列と `customers` テーブルの `id` 列を結合します。

## 3. ビューファイルの作成

ビュー定義では、テーブル名と各列をディメンションやメジャーとして指定します。

### orders.view.lkml

```lookml
view: orders {
  sql_table_name: my_database.orders ;;  # 実際のテーブル名を指定

  dimension: id {
    primary_key: yes
    type: number
    sql: ${TABLE}.id ;;
    label: "Order ID"
  }

  dimension: order_date {
    type: date
    sql: ${TABLE}.order_date ;;
    label: "Order Date"
  }

  dimension: customer_id {
    type: number
    sql: ${TABLE}.customer_id ;;
    label: "Customer ID"
  }

  measure: total_amount {
    type: sum
    sql: ${TABLE}.order_amount ;;
    label: "Total Amount"
  }
}
```

### customers.view.lkml

```lookml
view: customers {
  sql_table_name: my_database.customers ;;  # 実際のテーブル名を指定

  dimension: id {
    primary_key: yes
    type: number
    sql: ${TABLE}.id ;;
    label: "Customer ID"
  }

  dimension: name {
    type: string
    sql: ${TABLE}.name ;;
    label: "Customer Name"
  }
}
```

## 4. モデルとビューのデプロイ

1. **Develop** -> **Manage LookML Projects** に移動します。
2. 該当するプロジェクトを選択します。
3. **Validate LookML** ボタンをクリックして、エラーがないことを確認します。
4. **Deploy to Production** をクリックしてデプロイします。

## 5. Exploreの使用

デプロイが完了したら、LookerのUIで新しいExploreを使用してデータを可視化します。

1. **Explore** メニューから **orders** を選択します。
2. 必要なディメンションやメジャーを選択して、データを表示します。

## まとめ

以上が、Lookerでの基本的なモデル作成手順です。これで、データベース接続の設定からモデルとビューの定義、デプロイまでの流れが理解できたと思います。適切なリレーションシップを定義することで、複数のテーブルからデータを引き出し、効果的に可視化することが可能になります。
GoogleのBloggerの記事Feed取得API

rss2jsonがうまく動作しなくなったので、GoogleのBloggerから記事を取得するAPIの方法を利用しましたメモ

GoogleAPIのキーが必要なので、参考サイトを参照してAPIキー作成してます


IDやKEY,URLの設定

``` js
//0000000000000000000やAAAAAAAAAAAAAAA-AAAAAAAAAAAAAAAAAAAAAAAの箇所は自身のIDやKEYを入力
const BLOG_ID = '0000000000000000000',
  API_KEY = 'AAAAAAAAAAAAAAA-AAAAAAAAAAAAAAAAAAAAAAA',
  BLG_API_URL = `https://www.googleapis.com/blogger/v3/blogs/${BLOG_ID}/posts`,
  FEED_NEWS_URL = `${BLG_API_URL}?q=${'news'}&maxResults=${'2'}&key=${API_KEY}`,
  FEED_KNGE_URL = `${BLG_API_URL}?q=${'knowledge'}&maxResults=${'2'}&key=${API_KEY}`,
```

データ問い合わせ

``` js
async function getData(url = '') {
  const response = await fetch(url, {
    method: 'GET', // *GET, POST, PUT, DELETE, etc.
  });
  //console.log(response)
  return response.json();
}
```

``` js
 getData(FEED_NEWS_URL)
    .then((data) => {
      //console.log(data)
      data.items.forEach((item) => {
        console.log(item)
       });
    })
```



### 参考サイト

https://note.com/bunsekiya_tech/n/ncbe5f2121268

https://apexugj.blogspot.com/2023/02/goolgle-blogger-api.html
AWS の EC2(Amazon Linux 2023) で 起動時にコマンド実行

EC2(Amazon Linux 2023) にサービス登録して起動時に実行するようにしたときの備忘録メモ
なんとなく Linux OS なら他のやつでも使えそう

- ざっくり流れ
    - サービス定義作成
    - サービス自動起動の設定
- 環境情報
    - EC2 (Amazon Linux 2023)

# サービス定義作成

- サービス定義ファイル作る
    `/etc/systemd/system/` の中に `サービス名.service` でつくる
    ```
    touch /etc/systemd/system/samp.service
    ```
    
- サービス定義ファイルを編集
    `StandardOutput`, `StandardError` はログ出力不要な時はなくてもOK
    実行したいコマンドで作ったシェルも実行できるのでちょっと処理を入れたいときはシェル作る
    `Restart=always` を入れておくと起動失敗してもリトライしてくれる
    ```service:samp.service
    [Unit]
    Description=samp service
    
    [Service]
    Type=simple
    User=実行ユーザ(なくてもOK, デフォルトは root)
    WorkingDirectory=作業ディレクトリ(なくてもOK, デフォルトは /)
    ExecStart=実行したいコマンド
    StandardOutput=append:/your/logpath/logfile.log
    StandardError=append:/your/logpath/logfile.log
    Restart=always
    
    [Install]
    WantedBy=multi-user.target
    ```
# サービス自動起動の設定

- 自動起動の設定
    `samp` の箇所は上で登録したサービス名（`/etc/systemd/system/サービス名.service` ）
    ```
    systemctl enable samp
    ```

# サービス再読み込み

service のファイルを修正した時など念のため再読み込みのコマンド

```
systemctl daemon-reload
```
cscの作法 その510

# 概要
cscの作法、調べてみた。
vbsから操れるUIコンポーネント(DLL)をC#で書いてみた。
vbsから操ってみた。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/40e7cf97-e57e-a76c-c596-a95be073db86.png)

# 環境

windows 11

# サンプルコード
ohi0.vbs
```
Dim o
Dim fs
Dim fp

Set o = CreateObject("Ohi.Compo7")
o.Put "hello world!"
a = o.Open()
msgbox a
Set o = Nothing
Set fs = WScript.CreateObject("Scripting.FileSystemObject")
Set fp = fs.CreateTextFile("tmp.txt")
fp.Write(a)
fp.close
Set fs = Nothing


```

# 実行手順

```
>%systemdrive%\Windows\SysWoW64\CScript.exe ohi0.vbs

```

# じゃんけん

https://qiita.com/ohisama@github/items/4ca66658b3357205f483

# 湯婆婆

https://qiita.com/ohisama@github/items/f543ca943b210e261fec

# fizzbuzz

https://qiita.com/ohisama@github/items/026edd7ede7697ef74c2

# 九九

https://qiita.com/ohisama@github/items/489aaaabd0348adce7e1

# zundoko

https://qiita.com/ohisama@github/items/a0a692cbbab438140e7c


以上。
Perplexity Proでの画像生成

# はじめに

Perplexity Pro（有料版）では画像生成ができます。
生成の方法など、詳しくは以下のページを参照してください。

https://www.perplexity.ai/ja/hub/faq/images-media

# 制限事項

> 1日に最大50枚のイメージを作成できます。生成に使用したいモデルを選択するために、設定ページに移動することもできます。

1日に最大50枚ということで、次の日になればリセットされると思っていましたがそうではなさそうでした。
直近24時間以内に50枚と思われます。（今日はまだ１枚しか画像生成していなかったのですが、このような表示が出ました。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/42dbc673-1545-6e72-bc34-84c04f2685a0.png)

:::note info
生成された画像の使用に関しては「個人用非商業目的」のみのようです。
:::

> # サービスを通じて生成されたイメージを商業目的で利用できますか？
> サービスのユーザーとして、個人用非商業目的でのみアクセスが許可されています。詳細については利用規約を参照してください。



:::note warn
その他エラーに関して
:::

> # イメージを生成しようとするとエラーが発生する理由は何ですか？
> 次のいくつかの理由が考えられます：
> イメージを生成することを妨げる明示的またはモデレートされたコンテンツがクエリに含まれています。
> 接続が不安定かもしれません。
> 当社の側で技術的な問題が発生している可能性があります。サポートメールを介してバグレポートを提出してください（最もありそうもないシナリオ）


# おわりに

生成した画像例を載せました。まだまだプロンプトを勉強する必要がありそうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/6e99cbd0-0883-3026-7993-bd35e20871c7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/ae0ba609-0f2f-e4ad-66ae-098ddd80736e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/7090ed61-cccf-7f64-4d8b-b36d13d440d9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/22c4f09c-7896-8018-5c1b-18d167618e40.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/3154f8cc-c9a6-8afc-1545-b35dc00280ce.png)
nodeコマンドのオプションと環境変数


## コマンドのオプションと環境変数

nodeコマンドにはさまざまなコマンドラインオプションが用意されています。

コマンドラインオプション一覧は **-h** や **--help** をつけてnodeコマンドを実行することで表示できます。

### ヘルプ

```javascript
node -- help
```

![001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544972/25ecdfb5-f166-c1fc-14dc-7e564127984b.png)


### バージョン確認をする

nodeコマンドのバージョンは **-v** オプションで確認できます。

```javascript
node -v
```


### ワンライナーコードを実行をする

**-e** オプション似続けてJavaScriptのコードを記述すると、そのコードを実行させることが可能です。
ワンライナーコードを実行させる場合に便利です。

```javascript
node -e 'console.log("HelloWorld!")'
```

**-p** オプションを指定すると、コードの実行結果、戻り値も表示することがデキます。

```javascript
node -p -e  'console.log(Math.PI)'
```

### 標準入力を利用する

nodeコマンドでファイルに記述されたプログラムを実行する際、引数としてファイル名を与える代わりに、標準入力からプログラムを与えて実行させることも可能です。

```javascript
node < hello.js
```

**-i** オプションを付ければ、実行結果を逐次表示できます。

```javascript
node -i < hello.js
```

### デバッグモードを利用

debugオプションを付けると、デバッグモードでスクリプトを実行できます。

```javascript
node debug hello.js
```
python exe化

# pythonプログラムをexe化する
exe化ツールはいくつかあるが、pyinstallerを利用
Nuitkaはexeファイルが大きくなる傾向
* pyinstaller
* Nuitka

`pyinstaller  --clean --onefile --noconsole`

使ってみたけど `--noconsole` だとexeが落ちた時に気付けないので、最近は`--noconsole`は外して実行
pyinstallerもexeファイルはでかい。。。

Edgedriverexeを取り込みたい
--binary "edge.exe;edge.exe" 
でうまくいかない

アイコンのオプションもあったな。
--icon=test.ico

アイコンファイルの作り方
https://service.tree-web.net/icon_converter/
Blenderなどの3DCGのモデルでの罠（サイズ＝大きさ）

# はじめに

どーも、ひまじんです。
就職作品に着手している際に、Blenderを使ってFBXファイルを出力して実装してみたら、
**モデルが大きすぎて**、凄く遠ざけないと画面に表示できない**罠**にハマりました。

なので、FBXなどの3D形式モデルで出す際に、サイズを変更する方法を記しときます。



# サイズを変更する方法

モデルを選択した状態で、**Nキー**を押すと編集画面の右上に**サイドバー**が出ます。

![Blender No.1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817208/65f9b5d7-4745-9a94-23e0-87a5ddcfb99a.png)


**寸法**（英語版だと**Dimensions**）の下にデフォルトで2mとそれぞれ設定されているので、**0.005m**に変えましょう。

![Blender No.2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817208/c2315542-6bbe-7c65-17ae-e2470af1fd19.png)


これで、モデルの大きさに困ることはありません！


# おわりに
今回初めての記事なので、大目に見てくれると助かります。
また次の記事でお会いしましょう。

X：[https://x.com/himajindesu0429](https://x.com/himajindesu0429)
note：[https://note.com/himajin0429_desu](https://note.com/himajin0429_desu)
Action View Bug Report with View Paths

Recently there was a [bug](https://github.com/rails/rails/issues/52142) reported to rails which results in an infinite loop when passing a form builder object into a partial.

```ruby
<%= form_for [:admin, @author], html: { class: 'form form-horizontal', multipart: true, style: 'margin-bottom: 0' } do |f| %>
  <%= render partial: 'my_partial', locals: { f: f } %>
<% end %>
```

This would result in:

```ruby
Completed 500  in 1701ms (ActiveRecord: 1314.9ms | Allocations: 163362)

SystemStackError (stack level too deep):

app/views/admin/authors/_form.html.erb:357
```

The bug report, and following comments which acknowledged the bug were helpful, but there was no simple way to reproduce it without building an app to test.

I was able to [come up](https://github.com/rails/rails/issues/52142#issuecomment-2178512223) with an executable bug report, which I wanted to share because I think it's not well documented how to test Action View with paths in a single file. This is very useful for investigating bugs and various behaviors in the framework.

```ruby
# frozen_string_literal: true

require "bundler/inline"

gemfile(true) do
  source "https://rubygems.org"

  gem "rails"
end

require "minitest/autorun"
require "action_view"

class BugTest < ActionView::TestCase
  def setup
    @controller.append_view_path "."
  end

  def test_stuff
    partial = <<~ERB
      <%= puts f %>
    ERB

    File.write("_partial.html.erb", partial)

    render inline: <<~ERB
      <%= form_with model: false, url: false do |f| %>
        <%= render(partial: 'partial', locals: { f: f }) %>
      <% end %>
    ERB
  end
end
```

However, the script could not reproduce the infinite loop bug.

As one person pointed out, the issue was actually not Rails, but a third-party gem `meta_request` and removing it would resolve the issue.

This is still a really helpful script, and I want to re-use it so I'm sharing it here.
cscの作法 その509

# 概要
cscの作法、調べてみた。
vbsから操れるUIコンポーネント(DLL)をC#で書いてみた。

# 環境
windows 11

# サンプルコード

```
using System;
using System.Windows.Forms;
using System.Drawing;

namespace Ohi
{
	public class Compo7: Form {
		private static string retValue = String.Empty;
		private TextBox textBox1;
		private TextBox textBox2;
		private Button button1;
		private Button button2;
		private Button button3;
		private Button button4;
		public Compo7() {
			Text = "Ohicompo7";
			ClientSize = new Size(550, 550);
			textBox1 = new TextBox();
			textBox1.Location = new Point(30, 30);
			textBox1.Multiline = true;
			textBox1.Size = new Size(400, 400);
			textBox1.TabIndex = 2;
			textBox1.Text = retValue;
			textBox2 = new TextBox();
			textBox2.Location = new Point(30, 450);
			textBox2.Size = new Size(400, 40);
			textBox2.Text = "";
			button1 = new Button();
			button1.Location = new Point(450, 50);
			button1.Text = "0";
			button1.Click += new EventHandler(button1_Click);
			button2 = new Button();
			button2.Location = new Point(450, 100);
			button2.Text = "1";
			button2.Click += new EventHandler(button2_Click);
			button3 = new Button();
			button3.Location = new Point(450, 150);
			button3.Text = "2";
			button3.Click += new EventHandler(button3_Click);
			button4 = new Button();
			button4.Location = new Point(450, 450);
			button4.Text = "send";
			button4.Click += new EventHandler(button4_Click);
			Controls.AddRange(new Control[] {
				textBox1,
				textBox2,
				button1,
				button2,
				button3,
				button4
			});
		}
		private void button1_Click(object sender, EventArgs e) {
			retValue = "0";
			this.Close();
		}
		private void button2_Click(object sender, EventArgs e) {
			retValue = "1";
			this.Close();
		}
		private void button3_Click(object sender, EventArgs e) {
			retValue = "2";
			this.Close();
		}
		private void button4_Click(object sender, EventArgs e) {
			retValue = textBox2.Text;
			this.Close();
		}
		public void Put(string str) {
			retValue = str;
		}
		[STAThread]
		public string Open() {
			Application.EnableVisualStyles();
			Application.Run(new Compo7());
			return retValue;
		}
	}
}
```

# コンパイル手順

```
>set PATH=C:\Windows\Microsoft.NET\Framework\v4.0.30319;%PATH%


>csc /target:library /platform:anyCPU ohicompo7.cs


>regasm /codebase ohicompo7.dll

```


以上。
Unreal Engineでincludeされたヘッダ一覧を表示する

## 概要
Unreal Engineで、ヘッダファイルがどのようにincludeされているか確認したいことがあります。
一般的なVisual Studioのプロジェクトでは、プロジェクトのプロパティからConfiguration Properties -> C/C++ -> Advanced -> Show Includes を Yesにすることで可能です。
しかし、Unreal Engineで同コンパイラオプションを付与するにはUnreal Build Toolsを編集する必要があります。確認したところ、Epic Games Launcherからインストールしたエンジンでも可能でしたので、手順をまとめます。

## Unreal Build Toolの変更
Engine/Source/Programs/UnrealBuildTool/UnrealBuildTool.sln を開きます。ただし、ランチャーからインストールした場合はRead-only属性が付与されていて、開く事に失敗しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66160/75fbd81f-7d8b-33d2-e279-f5f249b0e625.png)

Read-onlyを解除します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66160/b49b2730-a631-f206-4816-19c6a23f2d28.png)

VCToolChain.csのAppendCLArguments_CPP関数に以下の一文を加えます。
```C#
		protected virtual void AppendCLArguments_CPP(CppCompileEnvironment CompileEnvironment, List<string> Arguments)
		{
			Arguments.Add("/showIncludes");//---yorung
```

Ctrl+Shift+Bでビルドすれば変更完了です。

## 結果

以下のようcppファイル毎にincludeされたヘッダが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66160/c0df23dc-53d5-91d1-a06e-ef2081a9bd4b.png)
e2studioネタ

# ビルドオプションを表示する。

Project -> C/C++ Project Settingsと開き  
C/C++ Build -> Settings -> Tool SettingsのMiscellaneousのVerboseにチェックを入れる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3786381/90d99a02-cab2-736d-8791-6398a89791e6.png)

Toolchainタブの Echo tool commandにチェックを入れる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3786381/7f72ee97-38e9-4252-c2c2-cc725f006084.png)

# 最適化を抑止する

Project -> C/C++ Project Settingsと開き  
C/C++ Build -> Settings -> Tool SettingsのOptimizationにフラグを設定する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3786381/7b4138a5-b7fa-1d56-23aa-85a26720cab0.png)
AHC034 参加記（本番12位解法解説）

# はじめに
アルゴ、ヒュ共に水色コーダーの私が、[トヨタ自動車プログラミングコンテスト2024#6（AtCoder Heuristic Contest 034）](https://atcoder.jp/contests/ahc034)にて、割と単純な解法で12位を取ることができたので、思考の変遷と解法を書いておこうと思います。（こんな高順位を取ることはもう無いと思うので…）
ヒューリスティックコンテストはアルゴリズムコンテストと毛色が違い、何となく敬遠している人も多いと思うので、単純な実装でも筋の良いロジックを見つけることが出来ると案外戦えるぞ！という事が伝われば嬉しいです。
※この記事では焼きなましもビームサーチも最小費用流も出てきません。ただの貪欲です。

# 問題について
詳細はAtCoderのサイトから読んでいただきたいですが、簡単に説明すると地面を出来るだけ最小の手間で平らにすることが目的です。
高い所の土をトラックに積み込んで、抉れている所を埋め立てる、というのを繰り返します。
以下のようなマス目上で赤色ほど地面が高く、青色ほど地面が抉れているイメージです。（余談ですが、問題を読んだ時に子供の頃巨人のドシンでひたすら地面を平らにしていた事を思い出しました）
![vis.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/917732/46a0051c-f1f5-70df-3590-2c5532f88df2.png)

# 解法の変遷
ここからは時系列順に解法を記載していきたいと思います。

##### 15:05（コンテスト開始5分）
AHCが開催されていることに気づき、参加登録。

##### 15:10（コンテスト開始10分）
ひとまず問題文を読み終わる。（これって「なにもしない」をすることでも点が貰えるのか？）と思いprint()とだけ書いたコードを提出、正の得点をとりあえずゲット。
問題文を自分の中で落とし込むも、どう移動するのがコスト最適か？と考えても方針が全く思いつかない。
積み込み上限も無い事だし、とりあえず時計回りに回って、足りなければ前方のマスから貰ってくるようにしてみるか、と実装開始。

##### 15:51（コンテスト開始51分）
実装完了、提出。3.74Gのスコアを獲得。（この時の順位はあまり覚えていませんが60位前後だったような気がします）
![vis (2).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/917732/1f6e5a47-e90c-5062-977f-367375fbfc5c.gif)
ビジュアライザで動きを眺めていると、低いエリアでは何度も前方から土を積み込んでいるため、やたらと前後の往復をしているな、と気づく。

##### 16:00（コンテスト開始60分）
何度も前方から貰ってくるために往復するのは無駄な気がしたので、前方と、右手側（時計回りで内側）どちらか都合の良さそうな方から土を貰ってくるように修正。
![vis (3).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/917732/3eda44df-8e0f-4fc1-f0b4-7f4ad3e52d4c.gif)
6.24Gのスコアを獲得。この時点で9位だったので、どうせその内落ちるし今の内だ、と嬉しそうにスクショを撮る。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/917732/78aebecb-e034-b7aa-dcfd-a57a45dc532d.png)

##### 16:18（コンテスト開始78分）

移動には定数分のコストがかかるが、積み降ろしには定数分のコストがないな、とふと思う。
手持ちが足りない場合で前方か右手側から取ってくる場合、とりあえず手持ちを降ろしてから取りに行くように修正、加えてどちらか判定するロジックを微修正。
6.27Gへスコア微増。

##### 16:30前後（コンテスト開始90分）

あまり手持ちの重量が多いまま移動すると移動コストが無駄にかかるかな？と思い、150以上持っている場合内側に捨てる処理を追加するも、ローカルでのスコアが明らかに悪化したので提出すらせずにこの方針は棄却。

##### 17:03（コンテスト開始123分）

開始地点が左上だけど、とりあえず四隅のどこかに移動してそこから処理を開始したほうが良い場合もあるかな？と思い実装。ついでに時計回りと反時計回りどちらにも対応。四隅スタート×2（時計回り、反時計回り）の8通りからの最善を選択する。6.95Gのスコア獲得。

##### 17:32（コンテスト開始152分）

反時計回りにしたときの判定の最適化など軽微な修正をして7.25Gまでスコアを微増させる。
ビジュアライザを眺めてスコア改善できそうなエリアを探す。
以下心の声
（高い所と低い所を交互に移動するのが理想だよな～…時計回りか反時計回り固定だと、エリアの形状的に高い場所、低い場所、それぞれがしばらく続いてしまいがちか？角にぶつかる度、時計回り、反時計回りをランダムに切り替えるようにしてみればスコアが上がる気がする。）

##### 18:47（コンテスト開始227分）

元の実装が悪いため、動的に時計周り、反時計回りを切り替えるにはどうしたらいいか1時間程悪戦苦闘する。普通に時間かけ過ぎでは？
1.7秒間ランダムに切り替えるパターンを探索し続けて、最もスコアが良かったものを提出するように修正。8Gのスコアを獲得。
![vis (4).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/917732/411452cd-b581-79d9-70c2-8b3a220090ca.gif)

##### 18:58（コンテスト開始238分）

探索時間を1.87秒にする修正と、判定の最適化など軽微な修正をして8.4Gまでスコアを微増させ12位を獲得。

# 解法について
結局、ポイントは内側から取ってくるようにしたことと、曲がり方をランダムにしたことぐらいです。非常にシンプルですね。
ここからは妄想でしかありませんが、焼きなましやビームサーチなどのアルゴリムでは区間を決め、その区間内での最適化をする必要があるかと思いますが、区間の最適を全体の最適と結びつけるのが難しかったのかな、という気がします。
上位や、私より下位の方の解法でも、区間の最適化アルゴリズムが到底思いつけそうにない物ばかりで皆頭が良すぎる…と慄いています。
何も思いつけず、最初から最後まで乱数に身を任せた私が取って良い順位ではない気がしますが、ヒューリスティック初学者の方でも、運よく筋の良い解法が実装できれば高順位が取れる！という事を知っていただければと思います。
【Rails】手動テストでカバレッジを計測する

# はじめに

Ruby on Railsプロジェクトの手動テストでもコードカバレッジできたので、その方法をメモしておきます。

通常、カバレッジは自動テストコードの実行とともに計測するものですが、何らかの事情で自動テストコードが不足していてカバレッジが計測できない、あるいはカバレッジがとても低いといったことがあるかと思います。

本来、自動テストコードを書き足してカバレッジを上げるべきなのですが、それができない場合、せめて手動テストのカバレッジを計測できれば、手動テストの有効性が可視化できるのではないかと考えました。

# 前提

カバレッジ計測用のgemとしてSimpleCovが導入されている前提です。

このgemを普通に使うための導入や設定方法は他の記事を参考にしてください。この記事では手動テストでカバレッジする方法にフォーカスしてお伝えします。

# 計測の流れ

- 手動カバレッジの設定を行う（下記参照）
- Rails起動時にカバレッジの計測を開始する
- 各種手動テストを行う
- 手動テストが終わったらカバレッジの計測を止めてレポートを出力する
- レポートを見る

# 設定方法

### Gemfile

```ruby
group :development do
  gem 'simplecov'
end
```

通常はtest環境で読み込むようになっていると思いますが、development環境でも読み込むようにします。

### config/routes.rb

```ruby
if Rails.env.development?
	get 'simple_coverage', to: 'simple_coverage#output'
end
```

development環境のルーティングを追加
「手動テストが終わったらカバレッジの計測を止めてレポートを出力する」を実現するため

### config.ru

```ruby
if Rails.env.development?
  require 'simplecov'
  SimpleCov.start 'rails' do
    add_filter '/test/'
    add_filter '/config/'
    add_filter '/vendor/'
  end
end
```

「Rails起動時にカバレッジの計測を開始する」
development環境のみ。
フィルターやグループ設定ができます。これらはレポートを見やすくためのものです。

### app/controllers/simple_coverage_controller.rb

```ruby
class SimpleCoverageController < ApplicationController
	def output
		SimpleCov.result.format!
	end
end
```

新しくコントローラーを用意して、ルーティングの設定と合わせます。
（既存のコントローラーにメソッドを追加するのでも問題なし）
「手動テストが終わったらカバレッジの計測を止めてレポートを出力する」を実現するため
必要に応じてセッションの無効化など行ったください。

# 結果を見る
アプリケーションフォルダ下のcoverageフォルダにあるindex.htmlをブラウザで開く
（SimpleCoverの設定によります）

# 最後に
今回、手動テストでコードカバレッジを計測したわけですが、何のために行うテストか、テストの回数や頻度はどれくらいか、テストにかかる時間はどれくらいか、といったことを考えて対応したいものです。
手動テストを完全になくすのは難しいですが、やっぱり自動テストでコードカバレッジできる方が嬉しいですね！
【Figma Plugins】コンポーネント プロパティを編集する

## はじめに
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/3aeb8977-f590-69b1-f7ad-e491e21f9a09.png)

FigmaのPluginを開発する際、コンポーネントのプロパティを入れ替えたいと思ったことはありますか？
この記事では、コンポーネント プロパティを編集する方法を解説します。

## コンポーネント プロパティを編集する
### コンポーネントを取得する
コンポーネントを取得方法は以下の記事で詳しく解説しました。
ぜひご覧ください。

https://qiita.com/degudegu2510/items/b1faa95f5b575a889587

```ts
const componentKey = '****************************************'

const createComponent = async () => {
  const component = await figma.importComponentByKeyAsync(componentKey)
  component.createInstance()
}
```


### コンポーネントプロパティを編集する
コンポーネントプロパティを編集するには、`Instance`に`setProperties`を記載するだけです。
`setProperties`の引数にプロパティ名と値を指定することで、変更することができます。

プロパティの値は、`string`・`boolean`・`VariableAlias` を受け取ることができます。

`VariableAlias` は、以下の記事をご覧ください

https://www.figma.com/plugin-docs/api/VariableAlias/

以下のように記載することで、プロパティを編集することができます。

```ts
const componentKey = '****************************************'

const createComponent = async () => {
  const component = await figma.importComponentByKeyAsync(componentKey)
  const instance = component.createInstance()
  
  instance.setProperties({
    "propertyName": string,
    "propertyName": boolean,
    "propertyName": VariableAlias
  })
}
```

## まとめ
この記事では、コンポーネント プロパティを編集する方法を解説しました。

ぜひこの記事を参考にコンポーネントを変更してみてください。

---

最後まで読んでくださってありがとうございます！

普段はデザインやフロントエンドを中心にQiitaで記事を投稿しているので、ぜひQiitaのフォローとX(Twitter)のフォローをお願いします。

https://twitter.com/degudegu2510
Astro で class:list を使って Tailwind CSS のクラスを追加ライブラリなしに整理する

## この記事の概要

Astro のスタイリングにおいて、`class:list`というディレクティブが用意されています。

これを上手く使って、Tailwind CSS のクラスを追加ライブラリなしに整理してみようという試みです。

複雑なスタイルを実現しないといけないのであれば Tailwind Variants などを使った方が良いと思いますが、例で紹介する程度であれば依存関係を増やさずとも良いのでは？と思って記事にしてみました。

:::note
ごく個人的な主張ですが、私は dependencies を少なめに抑えておきたいタイプです。

アップデート対応やライブラリ間の不整合を解消している時間などがあまり好きではなく、ちょっとした実装であればライブラリ無しに解消できないかな？と考えてしまいます。

そういった前提の記事である、とご理解いただけると幸いです。
:::

## 環境

| 依存関係 | バージョン |
| --- | --- |
| astro | 4.9.2 |
| tailwindcss | 3.4.3 |

## 作るもの

`priority`と`direction`を受け取るコンポーネントを作るとします。

- `priority`には`primary`, `secondary` があり、それぞれにあわせてスタイルが変わる
- `direction`には`horizontal`, `vertical` があり、それぞれにあわせてスタイルが変わる
- props がどうであれ変わらない、ベースとなるスタイルもある

### 初期状態

以下の`div`にスタイルを追加していきます。

```
---
type Props = {
  priority: "primary" | "secondary";
  direction: "horizontal" | "vertical";
};

const { priority, direction } = Astro.props;
---

<div>
  ...
</div>
```

### ベースのスタイル

props に関わらず適用するクラスを登録します。

```diff
- <div>
+ <div
+   class:list={[
+     "flex text-lg p-4",
+   ]}
+ >
    ...
  </div>
```

`class:list={[]}`の書式で、配列としてクラスを登録できます。
中身が 1 つだけでも問題ないので、まずは共通部分を記載します。

### props による変化の整理

`class:list`へ追記する前に、props による変化を整理しておきます。

今回は以下とします。

- priority
    - primary なら `bg-red-500 text-white`
    - secondary なら `bg-blue-100`
- direction
    - horizontal なら `flex-row`
    - vertical なら `flex-col`

これを、`class:list`に適用できるように書くと、以下のようになります。

```diff
  <div
    class:list={[
      "flex text-lg p-4",
+     { "bg-red-500 text-white": priority === "primary" },
+     { "bg-blue-100": priority === "secondary" },
+     { "flex-row": direction === "horizontal" },
+     { "flex-col": direction === "vertical" },
    ]}
  >
    ...
  </div>
```

マークアップ部分にクラスの記載がたくさん入って長くはなるものの、三項演算子がたくさんあるコードよりは見やすいと思っています。
あくまで私の感覚ではありますが……。
闘魂Elixir ーー AtCoder Beginner Contest 335(B)をElixirで楽しむ

<b><font color="red">$\huge{元氣ですかーーーーッ！！！}$</font></b>
<b><font color="red">$\huge{元氣があればなんでもできる！}$</font></b>

<b><font color="red">$\huge{闘魂とは己に打ち克つこと。}$</font></b>
<b><font color="red">$\huge{そして闘いを通じて己の魂を磨いていく}$</font></b>
<b><font color="red">$\huge{ことだと思います}$</font></b>


# はじめに

[AtCoder Beginner Contest 335](https://atcoder.jp/contests/abc335)を[Elixir](https://elixir-lang.org/)で解いてみます。

[AtCoder](https://atcoder.jp/)を解くのが趣味で、休憩時間に解いているという若い人がいて、それってすごい意識の高い休憩時間の過ごし方だと思って、私も真似してみることにしました。


# [AtCoderをElixirでやってみる](https://zenn.dev/torifukukaiou/articles/ac84c87736ceebf4da01)

入力の読み取り方や解答の作り方は、別の記事にまとめています。


https://zenn.dev/torifukukaiou/articles/ac84c87736ceebf4da01

ご参照くださいませ。

[Elixir](https://elixir-lang.org/)で[AtCoder](https://atcoder.jp/)を楽しむためには、エントリポイントを`Main.main/0`にする必要があります。つまり`Main`モジュールを作って、その中に`main/0`関数を定義するわけです。

# [B - Tetrahedral Number](https://atcoder.jp/contests/abc335/tasks/abc335_b)

問題はリンク先をご参照くださいませ。
私の解答を貼っておきます。


<details><summary>私の解答</summary>

_問題文を読んでいることを前提にひとこと解説をしておきます。_


[Elixir](https://elixir-lang.org/)の[for](https://hexdocs.pm/elixir/Kernel.SpecialForms.html#for/1)は、List comprehensionです。その使い方を問われているかのような問題でした。

```elixir
defmodule Main do
  def main do
    n = IO.read(:line) |> String.trim() |> String.to_integer()
    
    solve(n)
    |> IO.puts()
  end
  
  def solve(n) do
    list_of_tuples = for x <- 0..n, y <- 0..n, z <- 0..n, x + y + z <= n, do: {x, y, z}
    
    list_of_tuples
    |> Enum.map(fn {x, y, z} -> "#{x} #{y} #{z}" end)
    |> Enum.join("\n")
  end
end
```




</details>




---

# さいごに

[AtCoder Beginner Contest 335](https://atcoder.jp/contests/abc335)を[Elixir](https://elixir-lang.org/)で解くことを楽しみました。

あなたのお好きなプログラミング言語でお楽しみください。

---


**闘魂**とは、  **「己に打ち克つこと。そして闘いを通じて己の魂を磨いていくことである」** との猪木さんの言葉をそのまま胸に刻み込んでいます。
知っているだけで終わらせることなく、実行する、断行する、一歩を踏み出すことを自らの行動で示していきたいとおもいます。
**アントニオ猪木さんのメッセージから元氣をもらったものとして、それを次代に語り継ぎ、自分自身が「闘魂」を体現するものでありたいとおもいます。**

---

<b><font color="red">$\huge{元氣ですかーーーーッ！！！}$</font></b>
<b><font color="red">$\huge{元氣があればなんでもできる！}$</font></b>
<b><font color="red">$\huge{１、２、３ ぁっダァー！}$</font></b>
[Next.js App Router]メタデータの設定をしよう

# はじめに
Next.js(App Router)でメタデータを生成する方法について書いていきます。

# 参考

https://nextjs.org/docs/app/building-your-application/optimizing/metadata

# 静的メタデータの設定方法

https://nextjs.org/docs/app/building-your-application/optimizing/metadata#static-metadata

静的メタデータを設定するには、以下のように書きます。
「metadata」関数をエクスポートする形で定義し、その中で、静的なメタデータを定義できます。

``` /app/blog/page.tsx
import { Metadata } from "next";

export const metadata: Metadata = {
  title: "タイトル",
  description: "説明",
};
```

# 動的メタデータの設定方法

https://nextjs.org/docs/app/building-your-application/optimizing/metadata#dynamic-metadata

例として、ブログの詳細ページなどで、ブログのタイトルをメタデータに設定したい場合などがあります。
その時は、以下のようにすると、動的にメタデータを設定できます。

``` /app/blog/[blogId]/page.tsx
import { Metadata } from "next";

export const generateMetadata = async ({ params }: { params: { blogId: string } }): Promise<Metadata> => {
　// ブログの詳細データを取得する関数
  const blogData: ArticleContent = await blodDetailData(params.blogId);

  return {
    title: blogData.title,
    description: blogData.title
  };
}
```

このように、「generateMetadata」関数をエクスポートする形で定義、その中でデータの取得、メタデータの設定を行うことができます。

# Faviconを設定

https://nextjs.org/docs/app/api-reference/file-conventions/metadata/app-icons

最後に、Faviconを設定する方法です。
いくつか方法があるみたいですが、今回は「icon.tsx」を設置する方法について書いていきます。
まず、ルートディレクトリにある「page.tsx」と同じ階層に「icon.tsx」を設定し、以下のようにソースを書いていきます。

### **〇設定する項目**
- **runtime**
ランタイム(実行中にコードで使用できるライブラリ、API、および一般的な機能)を設定
- **size**
画像のサイズを設定
- **contentType**
画像の形式を設定
- **Iconメソッド**
ICONを生成するメソッド

```/app/icon.tsx
import { ImageResponse } from 'next/og'
 
// Route segment config
export const runtime = 'edge'
 
// Image metadata
export const size = {
  width: 32,
  height: 32,
}
export const contentType = 'image/png'
 
// Image generation
export default function Icon() {
  return new ImageResponse(
    (
      // ImageResponse JSX element
      <div
        style={{
          fontSize: 24,
          background: 'black',
          width: '100%',
          height: '100%',
          display: 'flex',
          alignItems: 'center',
          justifyContent: 'center',
          color: 'white',
        }}
      >
        A
      </div>
    ),
    // ImageResponse options
    {
      // For convenience, we can re-use the exported icons size metadata
      // config to also set the ImageResponse's width and height.
      ...size,
    }
  )
}
```


以下の記事に、主な実装例が書いてあります。

https://zenn.dev/ksyunnnn/articles/615679bc316870


# 最後に
他にも色々な記事を書いているので、よければ読んでいってください！

https://qiita.com/hukuryo/items/97797a91d7e2ee0bcabc

https://qiita.com/hukuryo/items/2c07c52ff3386d5d75b9

https://qiita.com/hukuryo/items/ebeb26823f944f143b11
refusing to allow a Personal Access Token to create or update workflowエラーの解決法


# はじめに

https://qiita.com/Qiita/items/32c79014509987541130

最近 Qiita CLI を使って記事を管理し始めたのですが、
以下の token エラーに遭遇して push できなかったので、対処法を備忘録として残そうと思います。

```
$ git push origin main
Enumerating objects: 10, done.
Counting objects: 100% (10/10), done.
Delta compression using up to 8 threads
Compressing objects: 100% (6/6), done.
Writing objects: 100% (9/9), 26.54 KiB | 8.85 MiB/s, done.
Total 9 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0)
To https://github.com/skido32/qiita-content.git
 ! [remote rejected] main -> main (refusing to allow a Personal Access Token to create or update workflow `.github/workflows/publish.yml` without `workflow` scope)
error: failed to push some refs to 'https://github.com/skido32/qiita-content.git'
```

# 対処法

`Settings`→`Developer settings`→`personal access tokens`からアクセストークン設定を確認

![スクリーンショット 2024-06-19 23.28.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2518928/ac230a5b-67a7-632f-8896-de5b8973a611.png)

私の場合は`Fine-grained personal access tokens`を利用していたので、
対象のアクセストークン設定画面を開き、`Access on`→`Edit`

![スクリーンショット 2024-06-19 23.37.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2518928/079385f8-e274-e912-9d44-db4559cfc80d.png)

`Permissions`→`Repository permissions`→`Workflows`
`Access: Read and write`に変更し、`update`をクリックで設定完了

![スクリーンショット 2024-06-19 23.46.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2518928/97173727-86ba-ff5b-91d1-ba9386778342.png)

無事 push することができました！

```
$ git push origin main
Enumerating objects: 10, done.
Counting objects: 100% (10/10), done.
Delta compression using up to 8 threads
Compressing objects: 100% (6/6), done.
Writing objects: 100% (9/9), 26.54 KiB | 13.27 MiB/s, done.
Total 9 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0)
To https://github.com/skido32/qiita-content.git
   c69fcf3..e8cf83e  main -> main
```
アウトプットのための準備をスクリプトで最大限効率化してみた

# はじめに
初めまして、フロントエンドから新卒でSREに転生した🦊です。
今回は以下の記事を見て、**アウトプットのための準備**を最大限効率化するためのスクリプトを作成したのでその紹介です。

https://qiita.com/Sicut_study/items/9b20ac5ded003cb6d55a

# 問題
この記事では「高速に雑に記事を書くフレームワーク」に沿ってアウトプットを行っていけば、時間をかけずいい感じのアウトプットができるというものでしたが、そもそも怠惰な私にはこのテンプレートを毎回用意するのが面倒だなと感じていました。
似た様なフレームワークを用意して、普段はNotionなどを使用していましたが、最近はいちいちNotionを開いてページ作成して、タグをつけてを毎回していると割と手間がかかってしまう課題があります。

# 解決方法
そこで今回は、ターミナル上からスクリプトをいい感じに実行して、テンプレートを任意のディレクトリに作成して、最速でアウトプットを行うための下地を作りました。(雑に作ったので不具合は後ほど修正)

```
#!/bin/bash

# デフォルトのディレクトリと日付の取得
DIRECTORY=~/blog/articles
DATE=$(date +%Y%m%d)

# ヘルプメッセージ
show_help() {
  echo "使用方法: $0 [-t タイトル] [ファイル名]"
  echo
  echo "オプション:"
  echo "  -t タイトル     ファイルのタイトルを指定"
  echo "  -h              ヘルプメッセージを表示"
}

# オプション解析
while getopts ":t:h" opt; do
  case $opt in
    t)
      TITLE=$OPTARG
      ;;
    h)
      show_help
      exit 0
      ;;
    \?)
      echo "無効なオプション: -$OPTARG" >&2
      show_help
      exit 1
      ;;
    :)
      echo "オプション -$OPTARG には引数が必要です" >&2
      show_help
      exit 1
      ;;
  esac
done

shift $((OPTIND - 1))

# ファイル名を設定（デフォルトは "blog_post"）
if [ -n "$TITLE" ]; then
  BASENAME=$TITLE
elif [ $# -eq 1 ]; then
  show_help
  exit 1
else
  BASENAME="blog_post"
fi

FILENAME=$DATE-$BASENAME.md

# 保存先パス
FILEPATH=$DIRECTORY/$FILENAME

# 固定のコンテンツ
CONTENT="# はじめに

# 問題

# 解決方法

# おわりに

# 参考
"

# ディレクトリが存在しない場合、作成
if [ ! -d "$DIRECTORY" ]; then
  mkdir -p "$DIRECTORY"
fi

# テキストをファイルに書き込む
echo "$CONTENT" > "$FILEPATH"

echo "ファイルが $FILEPATH に作成されました。"

# VSCodeでファイルを開く
code "$FILEPATH"

```

## スクリプトを実行
```
sh ./create_blog_post.sh 任意のタイトル
ファイルが /fuga/hoge/blog/articles/20240620-任意のタイトル.md に作成されました。
```

## おまけ
私は、aliasを貼っているので、より効率的にコマンドを実行できます。
```
# alias
alias blog='sh ~/blog/scripts/create_blog_post.sh'

# 実際に実行するコマンド
blog -t 任意のタイトル

```
# おわりに
今回はサクッと雑に作りましたので、これから育てていこうと思います。

一応repositoryはこちらです。

https://github.com/yk-mt12/blog
【ブックマークレット】マケプレ商品を除いて再検索するブックマークレット「マケプレ・ニフラム」

進学、就職、服選び。
選択肢が多いというのはだいたいの場面で嬉しいことです。

プライムセールのマーケットプレイス商品。君以外は。

マケプレを除くためのパラメータを追加し、再検索するブックマークレットです。
# マケプレ・ニフラムのコード
毎回URL手打ちするのはプログラマーの美徳である「怠惰」が足りないのでブックマークレットにしましょう。
```javascript
javascript: (function () {
  let url = new URL(window.location.href);
  let params = new URLSearchParams(url.search);
  params.set("emi", "AN1VRQENFRJN5");
  url.search = params.toString();
  window.location.href = url.toString();
})();
```
# 使い方
1. ブックマークのURLに上記ブックマークレットを設定
2. 検索結果ページでブックマークをクリック


これで、検索結果がグッと減ってAmazonから出品されたものだけを選べるようになるはず。

:::note warn
2024/06時点の仕様で動作しています。仕様変更等で動作しなくなる可能性があります
:::


:::note warn
ニフラム伝わるかな。。。
:::
Rubyでnullを扱うには

## 環境
Ruby 2.6

## はじめに

SIerで長らくエンジニアをしていた自分は、もっぱらVBer（造語）でした。多くのVBerを悩ませた問題の一つにnull問題がありす。nullはOracleにもSQLServerにも存在する概念です。業務アプリを開発する現場では避けて通ることはできません。とにかくこのnullですが、便利などころか厄介モノ扱いでした。VBerから離れてRubyerになった現在でも、null問題はついて回ります。nullという概念はPostgreSQLにもMySQLにも同じように存在します。Rubyでnull（正確にはnil）をスマートに扱う方法について書いてみました。

## VBでnullを扱う

VBでnullを扱う場合、nullを""に変換する関数を作成して対応していました。型をVariantにしているのは、どのような型にもオールマイティに対応するためです。もちろん、nullにも対応させる必要があります。Variant型にすると処理が重くなるといった副作用が発生しますが、いたしかたありません。また、Trimをかけて、空白スペースが入っていた場合は""に変換しています。このような関数を作成して各項目に対応していました。

```VB
Public Function NullPadS(vData As Variant) As String

    If IsNull(vData) = True Then
        NullPadS = ""
    Else
        NullPadS = Trim$(vData)
    End If
    
End Function
```

## Rubyでnullを扱う

Rubyでnullを""に変換するメソッドを作ると次のようになります。VBよりも随分とシンプルなコーディングになりました。if文がワンライナーで書けるといった利点もあります。

```Ruby
def test_nil(data)
    data.nil? ? "" : data.to_s.strip
end
```

実は、Rubyの場合、メソッドを作成しなくても、変数に下記を付けただけでも対応ができるようになります。null.to_sをすれば、""になってくれます。100.to_sは、"100"になってくれます。これで、変換用のメソッドを作成する必要はありません。

```Ruby
data.to_s.strip
```

## 動作確認


```Ruby
puts nil.to_s.strip			>= ""
puts "".to_s.strip			>= ""
puts "  ".to_s.strip		>= ""
puts 11.to_s.strip			>= "11"
puts "aa".to_s.strip		>= "aa"
puts " bb ".to_s.strip		>= "bb"
puts " 22 ".to_s.strip		>= "22"
```
[Nginx] nginx.confファイルでドメインを複数指定する方法

# 複数のドメインをカバーする例
```nginx.conf
upstream gunicorn {
    server unix:///project_name/tmp/gunicorn_socket;
}

server {
    listen 80;
    server_name api.example.com internal.example.com api.example.test.com internal.example.test.com;
    server_tokens off;

# 省略
```

複数のドメインをカバーする方法：単にserver_nameに複数のドメインを列挙します


# ワイルドカードを使用する例
```nginx.conf
upstream gunicorn {
    server unix:///project_name/tmp/gunicorn_socket;
}

server {
    listen 80;
    server_name *.example.com *.example.test.com;
    server_tokens off;

# 省略
```
ワイルドカードを使用する方法：*.example.comのようにワイルドカードを使用して共通部分をカバーします


# 正規表現を使用する例
```nginx.conf
upstream gunicorn {
    server unix:///project_name/tmp/gunicorn_socket;
}

server {
    listen 80;
    server_name ~^(api|internal)\.example\.(com|test\.com)$;
    server_tokens off;

# 省略
```

正規表現を使用する方法：server_nameに正規表現を使用して、より柔軟なドメインマッチングを行います
ChakraUIで全体のテーマを変えよう！

# はじめに
こんにちは、H×Hのセンリツ大好きエンジニアです。（同担OKです😉）
ChakraUIを使用して、リポジトリ内の全体テーマを変更するやり方を簡単にご紹介します！

# ChakraUIとは？
ChakraUIは、UIコンポーネントライブラリの一つです。

https://v2.chakra-ui.com/


コンポーネントをimportして利用する形で簡単にイケてるUIが作れちゃう優れ品です。
例えば、例にあるようなものをimportするだけで実装できちゃいます。
![スクリーンショット 2024-06-20 0.26.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2653241/40547c6a-0468-558b-27f7-021b30a034a1.png)

# ChakraUIを使った全体のテーマをカスタマイズする方法
`theme.js`というファイルを使って管理します。

`theme.js`は、ChakraUIのテーマをカスタマイズするためのファイルで、色、フォント、ブレークポイント、コンポーネントのスタイルなどを設定できます。
(既存のコンポーネントのスタイルも自由自在！)

このファイルを使うことで、アプリケーション全体のデザインに統一感を持たせられるんですよね！
`global.scss`みたいなものです。

ChakraUIのテーマを適用するためには、ルートの`layout.jsx`で`children`をラップする形で`ChakraProvider`を配置します。

また、この時にカスタムしたテーマを渡します。
``` layout.jsx
import { ChakraProvider } from "@chakra-ui/react";
import customTheme from "./theme";

export default function RootLayout({ children }: { children: React.ReactNode }) {
  return (
    <html lang="ja">
      <ChakraProvider theme={customTheme}>
          {children}
        </ChakraProvider>
    </html>
  )
}
```

この`customTheme`なるものを、`theme.js`で作成していきます！

``` theme.js
import { extendTheme } from "@chakra-ui/react";

// カスタムカラー
const colors = {
  brand: {
    50: "#e3f2f9",
    100: "#c5e4f3",
    200: "#a2d4ec",
    300: "#7ac1e4",
    400: "#47a9da",
    500: "#0088cc", // プライマリカラー
    600: "#007ab8",
    700: "#006ba1",
    800: "#005885",
    900: "#003f5e",
  },
};

// カスタムフォント
const fonts = {
  heading: "Arial, sans-serif",
  body: "Georgia, serif",
};

// ブレークポイント
const breakpoints = {
  sm: "30em",
  md: "48em",
  lg: "62em",
  xl: "80em",
};

// コンポーネントのスタイル
const components = {
  Button: {
    baseStyle: {
      fontWeight: "bold", // ボールドフォント
    },
    sizes: {
      xl: {
        h: "56px",
        fontSize: "lg",
        px: "32px",
      },
    },
    variants: {
      solid: {
        bg: "brand.500",
        color: "white",
        _hover: {
          bg: "brand.600",
        },
      },
    },
  },
};

// カスタムテーマの作成
const customTheme = extendTheme({ colors, fonts, breakpoints, components });

export default customTheme;
```

ざっくりとこんな感じで作成できます！
作成したものは、`color`、`fonts`,`breakpoints`,`components`,`customTheme`になります！
上記のように、簡単に定義することが出来るので楽々ですね！

この値は、実際にアプリケーション内で利用できます！
例えば、Buttonコンポーネントのwindow幅が`48em`で色を変更したい時は以下のように指定できます！

``` button.js
<Button color={{ base: "brand.50", md: "brand.100" }}>
  チェンジ！
</Button>
```

また、全体のテーマだけではなく、コンポーネント毎にスタイルを調整できるのでButtonコンポーネントに対してのみテーマを変更するといったことも可能となっています！

色々カスタマイズできるので自分好みにUIを作り込めますね！

# おわりに
今回は簡単なChakraUIの紹介とテーマの変更方法について解説しました！
自分も、個人的にCSSが苦手なのでChakraUIのようなコンポーネントライブラリは重宝しています！
（本当はCSS得意になりたい。。。🥹）

ここまで読んでいただきありがとうございました！
センリツでした🤓
可読性  EarlyReturnと  蝉の声

この記事では、early returnというコードの可読性を向上させるコーディング方法について簡単に紹介する。


タイトルに特に意味はない。夏っぽさとプログラミングっぽさを感じさせる俳句のようなものだね(？)。

:::note info
この記事は、5分以内で読むことができます。
:::

## early returnとは
まず、early returnは直訳すると**早期リターン**になる。

関数やメソッドの途中で、特定の条件が満たされた場合に、処理を早期(early)に終了(return)して関数から抜けるプログラミング技法だ。

early returnを用いることで、不要なネストや複雑な条件分岐を避け、コードの可読性と保守性を向上させることができる。

つまり、場合にもよるが、**early returnを用いることでリーダブルになる**わけだ。

## early returnを使わない場合と使った場合
実際に、処理は同じだけどearly returnを使っていない場合のコードと、使った場合のコードを見比べて、可読性が向上しているかを見てみよう。

例として、認証情報がある場合に、何らかの処理をさせたいコードを記述し比較を行う。

#### early returnを使わない場合
```javascript:early returnなし

// 認証情報があるかどうかを判定する関数
const authenticateUser = (user) => {
  if (user) {
    if (user.username) {
      if (user.password) {
        if (isCorrectCredentials(user.username, user.password)) {
          return 'User authenticated successfully';
        } else {
          return 'Invalid username or password';
        }
      } else {
        return 'Password is missing';
      }
    } else {
      return 'Username is missing';
    }
  } else {
    return 'User object is null or undefined';
  }
};

// 正しい資格情報かどうかをチェックする関数
const isCorrectCredentials = (username, password) => {
  return username === 'admin' && password === '1234';
};

// 定義
const user = { username: 'admin', password: '1234' };
const result = authenticateUser(user);

// 結果の参照
console.log(result); // User authenticated successfullyとなる

```

少し大袈裟に書いているものの、ネストがかなり深くなっていることが見て取れる。

次に、上記とまったく同じことを実現できるコードをearly returnを使って記述する。

#### early returnを使った場合
```javascript:early returnあり

// 認証情報があるかどうかを判定する関数
const authenticateUser = (user) => {
  if (!user) {
    return 'User object is null or undefined';
  }
  if (!user.username) {
    return 'Username is missing';
  }
  if (!user.password) {
    return 'Password is missing';
  }
  if (!isCorrectCredentials(user.username, user.password)) {
    return 'Invalid username or password';
  }
  return 'User authenticated successfully';
};

// 正しい資格情報かどうかをチェックする関数
const isCorrectCredentials = (username, password) => {
  return username === 'admin' && password === '1234';
};

// 定義
const user = { username: 'admin', password: '1234' };
const result = authenticateUser(user);

// 結果の参照
console.log(result); // User authenticated successfullyと出る


```
early returnを使用することでネストがなくなり、かなりスッキリしたことがわかる。
early returnを使わない場合、user情報がある場合は次々に下のネスト(次の処理)に進むように記述されていた。一方、early returnを用いる記述方法では、user情報がない場合、つまりfalsyな場合は、早期に処理を抜けるように記述している。

#### 2つの比較からわかること

early returnを使うことで、大きく以下4つのメリットが考えられる。

- **可読性の向上**
各条件を満たさない場合、即関数から抜けるため、コードが直線的になり読みやすくなる。ネストが深くならず、複雑さを回避できる。


- **保守性の向上**
コードの変更や新しい条件の追加が容易になる。各条件が独立しているため、新しいチェックを追加しても全体の構造が複雑になりにくい。


- **バグの減少**
早期に異常な状態を検出し、処理を中断することは、バグの発生を未然に防ぐことにつながる。異常な状態が続くことを避けることで、予期しない動作を削減できる


- **パフォーマンスの向上**
不要な処理を早期に終了することで、無駄な計算や処理を省略でき、パフォーマンスの向上につながる。

## おわりに

可読性  EarlyReturnと  蝉の声
(QA) RDiでReplace(*YES)でテーブル(PF)をCRTPFしたい

## Q.RDiでテーブルのコンパイルをする際、既に存在している場合、PDMと同様に既存テーブルを削除、コンパイルできないか？

というご質問です。

RPG,COBOL,etc.のコンパイルの場合、コンパイルコマンドに既存オブジェクトが存在する場合、REPLACEしていいか？のパラメーターがあります。が、テーブル、ビュー作成コマンド（CRTPF, CRTLF）にはありません。


### PDMで既にテーブルがある場合にコンパイルすると、、

下記のような確認画面が出て、リプレースしていいか（既存テーブルを削除していいか？）聞かれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/26dbd22a-69d5-4cbd-fd57-86f1781a4c79.png)

これはCRTPF, CRTLFコマンドがしているのではなくて、PDMでコンパイルコマンドを呼び出した際、PDMが出してくれてるんですね。

### RDiでPDMと同様な動作ができるか？

RDiでコンパイルするにはソースメンバーを右クリックして、コンパイル または コンパイル（プロンプト） を選択します。
下記はプロンプトの例です。画面上は途中で切れてしまっていますが、スクロールするとすべてのコンパイルパラメーターを指定（変更）可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/7d5a2326-cd11-c23b-a9e1-a8ab4d329b47.png)

・・がここには既存オブジェクトの置換YES(NO)はありません。当然ですね…

代替案の一つは、RDiではIBM i OSコマンドなどをユーザーで登録する機能があります。これにDLTFコマンドを登録しておけば、5250など別なコマンドラインを起動せずに置換したいテーブル（ビュー）を削除することはできます。

下記はユーザーコマンドを作成している例です。ソースを右クリック→コンパイルコマンドの処理 を選択すると、ユーザー独自のコマンドを登録できます。パラメーターの組み立てにはアシスト機能もあり、使いやすいとは思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/2d91be78-30dd-184f-532d-2b25e6c5ce2f.png)

上記コマンドを登録すると、右クリックで呼び出せます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/60750267-c479-3886-969d-465905530625.png)

この方法でも一先ず代替できますが、ファイル削除、コンパイルと２つコマンド投入が必要になってしまいます。


### RDi PDMパースペクティブではできないか？

RDiには 5250 PDM環境をエミュレートするPDMパースペクティブという機能が追加されています。（RDi V9.6.0.4以降から）

ウィンドウのパースペクティブを開くから PDM を選択します。無い場合は その他からすべてのパースペクティブを検索すれば見つかると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/1ba40a12-f5b1-a61d-4f40-6a63318b2288.png)

こんな画面です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/95bf49ee-16f6-2272-052c-139e3fc0168c.png)

① DDS(PF)を編集する際は、下記のように左下の窓で、編集したいソースやライブラリー名などを入力します。ここはPDMと同様です。

② 右下に①で指定したオブジェクトが表示されます。たとえば 2 (PDMのエディター起動)を選択すると、画面上部にソースが読み込まれ編集モードで開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/e1400d52-2b33-06e0-4b1f-27e4c6781e0d.png)

②のオプションOptionに 14 コンパイルを指定してみますと・・

無効なオプション（Invalid Option 14）となってしまいました。。どうやらPDMのパネル（今回だと既存ファイルを置換する　YES/NO　）は使えないようです。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/adb6a2a5-682a-eb36-bf46-5c138665f875.png)

### 他に方法はないか？

RDiの中を調べたのですができそうなものはありませんでした・・

RDi以外ですと、下記のACS SQLスクリプトの例に CREATE or REPLASE というのが見つかりました。

![thumbnail_image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/93522d35-bd07-1e79-e120-03e7fbfa7b29.png)

これですと既存テーブルが存在する場合削除＆コンパイルを実行できそうです。
ACS SQLスクリプト実行画面 -> 編集 -> 例 -> 例から挿入
```
CREATE OR REPLACE TABLE table1 (column1 INTEGER NOT NULL, column2 VARCHAR(100) ALLOCATE(20));
```
yumのメモ

# 登録されているリポジトリ一覧

`yum repolist` を使う

```
 $ yum repolist
repo id                   repo name                                       status
base/7/x86_64             CentOS-7 - Base                                 10,072
centos-sclo-rh/x86_64     CentOS-7 - SCLo rh                               8,170
centos-sclo-sclo/x86_64   CentOS-7 - SCLo sclo                               816
extras/7/x86_64           CentOS-7 - Extras                                  526
updates/7/x86_64          CentOS-7 - Updates                               6,149
docker-ce-stable/7/x86_64 Docker CE Stable - x86_64                          337
epel/x86_64               Extra Packages for Enterprise Linux 7 - x86_64  13,791
...
```

# 特定のリポジトリからインストールされたパッケージの一覧

epelが供給元のパッケージを調べたいとき

```sh
$ yum list installed | grep "@epel"
bubblewrap.x86_64                  0.3.0-1.el7                   @epel
clang.x86_64                       3.4.2-9.el7                   @epel
cmake3.x86_64                      3.17.5-1.el7                  @epel
cmake3-data.noarch                 3.17.5-1.el7                  @epel
darcs.x86_64                       2.8.4-4.el7                   @epel
epel-release.noarch                7-14                          @epel
ghc-array.x86_64                   0.4.0.1-26.4.el7              @epel
ghc-base.x86_64                    4.6.0.1-26.4.el7              @epel
...
```

`yum list installed --disablerepo="*" --enablerepo="epel"` でも行けそうな気がするのだけど、期待した結果にならなかった。
Windows環境でのSSHキーインストールとSFTP接続でデータをダウンロードする手順

この記事では、Windows環境でSSHキーを正しく保存し、SFTPで接続する手順を解説する。

# この記事の背景
オープンソースのデータをダウンロードする機会があったのだが、そのデータのダウンロードの手法がSSHキーでダウンロードする手法という、さっぱりやり方がわからなかった手順だったので記載する。用語や概念を正確に理解しているわけではないので、間違いがあったらご指摘を。

## SSHキーとは？
SSHキー（Secure Shellキー）は、ネットワーク上での安全な通信を確立するために使用される暗号鍵。SSHキーを用いることで、パスワードを使わずにサーバーへのアクセスが可能になり、セキュリティが向上する。

## 手順

### 1. メモ帳を開く
スタートメニューから「メモ帳」を検索して開く。

### 2. SSHキーを貼り付ける
受け取ったSSHキーの内容をクリップボードにコピーし、メモ帳に貼り付ける。

### 3. ファイルを保存
メモ帳の「ファイル」メニューから「名前を付けて保存」を選択し、以下の設定で保存する。

- **保存場所**: `C:\Users\[あなたのユーザー名]`
- **ファイル名**: `filename.key`
- **保存する形式**: 「すべてのファイル」

### 具体的な手順（イメージ図）
1. メモ帳にSSHキーを貼り付けた状態：
   ```
   -----BEGIN OPENSSH PRIVATE KEY-----
   （SHHキーの文字列）
   ...
   -----END OPENSSH PRIVATE KEY-----
   ```
2. 「名前を付けて保存」ダイアログの設定：
   - **場所**: `C:\Users\[あなたのユーザー名]`
   - **ファイル名**: `filename.key`

### 注意点
メモ帳の「名前を付けて保存」ダイアログで「保存する形式」が「すべてのファイル」になっていることを確認し、拡張子が`.txt`にならないように注意する。

## ファイル権限の設定
Windowsでは、ファイルの権限を設定するためにコマンドプロンプトを管理者として実行し、以下のコマンドを使用する。

```sh
icacls C:\Users\[あなたのユーザー名]\filename.key /inheritance:r
icacls C:\Users\[あなたのユーザー名]\filename.key /grant:r %username%:F
```

## SFTPクライアントの使用
SFTPクライアントとしてWinSCP（無料）やFileZilla（有料）を使用する方法がある。ここではWinSCPを例にとる。

### WinSCPでの手順

1. [WinSCPのダウンロードページ](https://winscp.net/eng/download.php)からWinSCPをダウンロードしてインストールする。

2. WinSCPを起動し、新しいセッションを作成する。

3. 接続情報を入力する：
   - **ファイルプロトコル**: `SFTP`
   - **ホスト名**: `（ホスト名）.blob.core.windows.net`
   - **ユーザー名**: `（ユーザー名）
   - **秘密鍵ファイル**: `C:\Users\[あなたのユーザー名]\filename.key`

4. 「Advanced...」をクリックし、「SSH」→「Authentication」を選択して秘密鍵ファイルを指定する。

5. 「OK」をクリックし、「Login」をクリックして接続する。

### OpenSSH形式の鍵

「接続」ボタンを押すと、WinSCPがOpenSSH形式の鍵をサポートしておらず、PuTTY形式の鍵を必要とするというエラーがでた。OpenSSH形式の秘密鍵をPuTTY形式に変換する必要がある。「接続」ボタンを押せるページのまま、WinSCP上で、PuTTY形式に変更すれば、ダウンロードができた。

（PuTTYgenというツールを使用してPuTTY形式に変換するというオプションもあるが、それをおこなわなくてもできた。）

### FileZillaでの手順

私はFileZillaではダウンロードしなかったので下記でできるか確認はしていないが、一応手順を記載する。

1. [FileZillaのダウンロードページ](https://filezilla-project.org/)からFileZillaをダウンロードしてインストールする。

2. FileZillaを起動し、新しいサイトを設定する。

3. 接続情報を入力する：
   - **ホスト**: `（ホスト名）.blob.core.windows.net`
   - **プロトコル**: `SFTP - SSH File Transfer Protocol`
   - **ログオンの種類**: `Normal`
   - **ユーザー**: `（ユーザー名）`

4. FileZillaのメインメニューから「編集」→「設定」→「SFTP」と進み、「追加」をクリックして`C:\Users\[あなたのユーザー名]\filename.key`を追加する。

5. 「接続」をクリックしてSFTPサーバーに接続する。


これでSFTPを使用して安全に接続し、データセットをダウンロードできるはず。SSHキーの呪文をみて「？」となった私のような方がもしいれば、この記事が助けになることを願う。
【Python】条件付き反復(while文)

Pythonのwhile文は、特定の条件が満たされるまでコードを繰り返し実行するために使われる制御構造です。条件がTrueである限り、while文の中のコードが繰り返されます。条件がFalseになるとループが終了します。
# while文の基本構造
以下が基本的なwhile文の構造です。

```python
while 条件:
    実行するコード
```
## 簡単なサンプルコード
**サンプル1: カウンタを使ったwhileループ**
```python
# カウンタ変数を初期化
count = 0

# countが5より小さい間、ループを実行
while count < 5:
    print("Count is:", count)
    count += 1  # カウンタを1増やす
```
説明: このコードは`count`が5未満である間、`"Count is:"`と`count`の値を表示し、`count`の値を1ずつ増やします。

**サンプル2: ユーザー入力を使ったwhileループ**
```python
# 無限ループを使う場合の例
while True:
    user_input = input("Type 'exit' to stop: ")
    if user_input == "exit":
        break  # "exit"と入力されたらループを終了
    else:
        print("You typed:", user_input)
```
説明: `True`である間、ユーザーからの入力を受け取り、`"exit"`が入力された場合に`break`文でループを終了します。それ以外の入力は表示されます。

**サンプル3: 合計を計算するwhileループ**
```python
total = 0
number = 1

# numberが5以下の間、合計を計算
while number <= 5:
    total += number
    number += 1

print("The total is:", total)
```
説明: numberが5以下の間、totalにnumberを加算し続け、最後に合計を表示します。
## whileループのポイント
- 無限ループに注意: 条件が常にTrueの場合、ループは永遠に続きます。無限ループはプログラムが終了しなくなる原因になるので、条件がFalseになるようにするか、break文で抜ける方法を用意しておく必要があります。
- 条件を適切に設定する: ループが終了する条件を明確に設定しないと、期待した結果が得られない可能性があります。
- 変数の更新を忘れない: ループ内で使用する変数を適切に更新しないと、予期せぬ無限ループが発生することがあります。
######
参考)　[東京工業大学情報理工学院 Python早見表](https://chokkan.github.io/python/index.html)