OmniAICreator/Qiita-1.07M huggingface dataset:
Dataform で利用する sqlx ファイルを編集する時に Vim/VSCode に設定した内容やインストールしたプラグイン


## はじめに

[Dataform](https://dataform.co/) では SQLX ファイルを利用します。
普段使っているエディタでの設定ではハイライト等されないのでプラグインや拡張をインストールする必要があります。

https://dataform.co/

今回私が今回 Vim に設定した内容やインストールしたプラグインをまとめました。

## 設定内容やインストールしたプラグイン

## 設定前

エディタに手を加えずにファイルを開くと以下のように見た目になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55950/373a33f5-4af6-ef2c-bce2-14840abdf039.png)

今回用意したサンプルは、行数・設定共に少ないため問題ありません。
しかし、実際のプロジェクトではファイルサイズや設定内容によっては見づらくなりました。

### VSCode

最初 Vim/Neovim 用の Plugin を見つけるまで filetype を設定して SQLX ファイルを編集していましたが限界だったため公式が出している VSCode 拡張を設定しました。

https://marketplace.visualstudio.com/items?itemName=dataform.dataform

この VSCode 拡張 をインストールすれば シンタックスハイライトだけでなく、
自動コンパイルやコードジャンプを利用することが出来ます。

ただし、 Vimmer な私は VSCode を使い続ける事がストレスでした。
どうにかして Vim/Neovim に戻れるように SQLX ファイルを快適に書ける環境を探すたびに出ました。

### Vim/Neovim

#### filetype sql を設定する

`:set filetype=sql` と設定することでまだましになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55950/38e19808-c445-4ded-4bdb-32843b98fd0e.png)

ただし、 `config {}`, `js {}` 等の SQL にはない 記述には対応していません。

#### `vim-sqlx` を導入する

現時点 Vim/Neovim での最適解は有志の方が作成された、 `andres-lowrie/vim-sqlx` を導入することです。

https://github.com/andres-lowrie/vim-sqlx

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55950/441bc447-a2ca-704f-096c-03edb3440ee2.png)

この Plugin を導入して 40 ~ 50 ファイル程 SQLX を書きましたがとても快適でした。

#### 導入方法 (vim-plug)

:::note info
vim-plug を例に記載します。
他の Plugin マネージャーを利用している方は置き換えてください。

https://github.com/junegunn/vim-plug
:::

:::note warn
vim-plug はすでに導入済みで `Plug xxx` の記述を追加すれば良い状態を前提とします。
:::

以下記述を Vim/Neovim の Config file に追記していただければ OK です :tada:

```vim:
Plug 'andres-lowrie/vim-sqlx'
```

## さいごに

Dataform とても良い。
SQLX 書きましょう :muscle:

## References

https://github.com/andres-lowrie/vim-sqlx

https://dataform.co/blog/vscode-extension

https://marketplace.visualstudio.com/items?itemName=dataform.dataform

https://vim-jp.org/vimdoc-ja/filetype.html
[Tips]ERBで自由にファイルを作ってみる

erb、と聞くとrailsのフロントエンドで使われている印象ですが、実はそれ以外にも応用が効く優れものです。
この記事ははerbテンプレートに変数を入力することでファイルを作成してみます。

## まずerbをインストールする

`gem install`や`bundle install`でerbをインストールします。

ここはお好みで。

## テンプレートファイルを作成する

erbテンプレートを作成します。今回は説明を簡単にするために、簡単なerbファイルを作成します。

```erb:sample.rb
<%= @number %>
```

## erbテンプレートからファイルを作成してみる

先ほど作成したerbテンプレートから実際にrubyコードを書いてファイルを出力してみます。
今回はRake taskとして作成してみます。

```ruby:Rakefile
# frozen_string_literal: true

require 'erb'

task :sample do
  erb = ERB.new(
    File.read('sample.erb')
  )
  @number = 1
  filename = "#{number}.txt"
  File.write(filename, erb.result)
end
```

行っている処理としては、`ERB.new()`でerbファイルの中身を文字列として読み込み、`erb.result`が実行されるときに、変数などを代入した結果の文字列をファイルに出力しています。

`bundle exec rake sample`を実行することで今回は`@number`に1を代入しているので、1という文字列が出力された`1.txt`が作成されます。

## まとめ

今回は簡単なサンプルを用いてerbから簡単なファイル生成を行ってみました。
冒頭にも書いた通りerbはフロントエンドで利用されている印象が強いですが、テンプレートエンジンとしてこのような用途もあるので、何かテンプレートを作成するときに利用してみるのはいかがでしょうか？
Synology RouterでL2TPが繋がらない場合の設定変更

SynologyルーターのVPNでL2TPをONにしても外部から接続できなくて困っていたのですが、実は設定の問題だったことが判明しました。

## 動作検証
- Synology WRX560 (SRM 1.3.1-9346 Update 6)
- MacOS 14.0
- iOS 17.0.2

## 解決方法

VPN Plus → 標準VPN -> L2TPの
「SHA２-256互換モード」のチェックを外す！

![スクリーンショット 2023-09-29 20.42.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14768/9c0fa2dc-d281-3009-e44e-cfa75f5d46de.png)

## 原因

https://kb.synology.com/ja-jp/DSM/tutorial/What_should_I_do_if_I_fail_to_set_up_an_L2TP_connection_to_nas

> 注意: iOS 14 および macOS Big Sur 以降、iOS と macOS は SHA2-256 互換モード (96 ビット) をサポートしません

## むにゃむにゃ

原因がわからず、昔は使えていたのに...とモヤモヤしていました。機器入れ替えをした時の設定漏れかも知れません。調べると、96bitモードはAndroid6の頃の互換性対応のためのようです。

いまさらかもしれませんが、誰かの助けになれば。
NTPの活用方法

# NTPの使い方
## RTCの有無とNTPDATE
NTPは大変高精度でネットワークが繋がっている限りRTCを必要としません。しかしRTCの電池が無くなっていたり、大きく狂っていると同期までに長い時間がかかることがあります。
## NTPの仕組み
NTPは時計を徐々に合わせます。makeコマンドなど時計を使うものを一気に合わせると、その瞬間時計が戻ったように見え誤動作が考えられるからです。
## 時計合わせを切り替える
でも、時計を急いで合わせたい場合もあります。boot時にRTCが狂ってたり、RTCがない場合です。
## NTPDATEを使う
ntpは時計を合わせる仕組みですが、Linuxにはもう一つ時計合わせがあります。ntpdateと言い、即時合わせたり、ずれを読み取る機能があります。
- -B	slew(じわじわ近づける)モードで強制的に時刻を修正する
- -b	step（いきなり合わせる）モードで強制的に時刻を修正する
- -d	デバッグモード（時刻を修正しない）
- -q	日付と時刻の問い合わせのみ実行する（時刻を修正しない）
- -s	コマンドの実行結果をsyslogに出力する
- -v	詳細情報を表示する
「-B」「-b」を指定しなかった場合、時刻のずれが500ミリ秒（0.5秒）より小さい場合はslewモードで徐々に時刻を調整し、それ以外の場合はstepモードですぐに時刻を合わせる。
```
# apt update
# apt install ntpdate
# cat /etc/network/if-up.d/ntpdate
/etc/init.d/ntp stop
ntpdate -b ntp.nict.jp
/etc/init.d/ntp start

# chmod +x /etc/network/if-up.d/ntpdate
```
ntpdateに"-b"を付けていますが、これで瞬時に時計が合います。
これでネットワークが起動した瞬間にntpを一瞬とめてntpdateで即時合わせ、ntpを再起動します。ntpとntpdateは同じポートを使うので、競合を避ける必要があります。
Bing AI Chatライクな、ネット上から最新情報を取得し、情報を返してくれるAI チャット OpenChatAIを作ってみた

# Open Chat AI

Bing AI Chatライクな、ネット上から最新情報を取得し、情報を返してくれるAI チャット

## GitHubリポジトリ

基本的な使い方は下記に記載済み
[open_chat_ai](https://github.com/HawkClaws/open_chat_ai)

## アーキテクチャ
1. `SearchWordExtractor`がInputされた文章から検索キーワードを抽出します
2. `WebSerachEngine`が検索エンジンを使用し、検索ワードでの検索結果URLリストを取得します
3. `LlamaIndex`がURLリストからウェブページの情報を取得し、LLMを使用してInputされた文章に対する回答を生成します

下記図の通り

![arch.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/911989/0d9e7610-bda5-0ed1-6f6e-6678fc68f467.png)

`SearchWordExtractor`,`WebSerachEngine`,`LlamaIndex`全てに抽象基底クラスがあるため、これらを　ベースに実装を行い使用することができます


### 実行時設定
OpenChatAIのコンストラクタは下記３つになります  

```python
llama_index.llms.base.LLM
service.web_serach_engine.WebSerachEngine
service.search_word_extractor.SearchWordExtractor
```

`llama_index.llms.base.LLM`は`llama_index`のLLMを任意に設定  
`WebSerachEngine`及び`SearchWordExtractor`は抽象基底クラスがあるため、それをベースに実装を行い設定可能です  
  
`SearchWordExtractor`は現状`DummySearchWordExtractor`を使用しています  
pke（[pke_japanese_googlecolab](https://github.com/HawkClaws/pke_japanese_googlecolab)）を使用予定ではありますが、必要なキーワードが削られてしまうなど、まだ調査不足です

## 結果サンプル

### 入力値

`WBCでの大谷翔平の活躍は？`

### 出力値


大谷翔平はWBCで非常に印象的な活躍をし、大会全体の成功に大きく貢献しました。特に準決勝では、日本が1点を追いかける状況で、9回裏に大谷は先頭打者として2塁打を放ち、その後派手なガッツポーズで仲間たちを鼓舞しました。そして、決勝戦ではクローザーとして登場し、マイク・トラウトとの一騎討ちで盟友を三振に仕留め、野球ファンに映画のような瞬間を提供しました。

大谷は投手としても28試合に登板し、166回を投げて15勝9敗、219奪三振、防御率2.33という素晴らしい成績を記録しました。同時に、打者としても157試合に出場し、586打数で160安打、34本塁打、95打点、11盗塁、打率.273を記録し、オールラウンドなプレースタイルを披露しました。これらの成績により、大谷翔平は大会MVPに輝き、その二刀流のスター性は一層評価され、知名度を高めました。

さらに、大谷の活躍はWBCの大会全体の成功に不可欠な要素となり、大会が世界的な注目を浴びるきっかけとなりました。彼の野球選手としての卓越した才能は、野球ファンにとっても圧巻のものであり、そのキャリアは非常に注目されています。また、大谷の人間性も大会中に際立ち、特に決勝戦の前に行った感動的なスピーチは、チームメイトに向けた力強いメッセージとして記憶に残りました。そのスピーチは世界中で多くの言語に翻訳され、大谷選手が次に目指すのは、所属するエンゼルスで世界一になることです。多くのファンがその活躍を心待ちにしています。
ScoopでインストールしたGitでTortoiseGitを使用したい。。「git.exe not correctly set up()」を解消する必要あり

## 環境
- Windows10 Pro
- git 2.39.1 (scoopでインストール)
- TortoiseGit 2.41.0.1

## 参考記事
https://mebee.info/2021/02/27/post-29631/

## エラー内容
```
git.exe not correctly set up()
Check TortoiseGit settings and consult help file for "Git.ext Path"
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711955/3c248279-b04d-56ba-d681-c9eb28d35100.png)

## 解決方法
- 検索で「settings」を入力して、「Settings」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711955/426d6e37-e53b-7d17-74bb-c207811b3592.png)

- 「OK」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711955/3ad58643-e534-68ae-6ece-215a4f24ebca.png)

- 「無視」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711955/d07ec7a7-2c30-a2d9-6af8-ee7bcef73b2c.png)

- 「TortoiseGit」の設定画面が開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711955/f34afc5a-afab-ce30-1e39-bf530f20e6c8.png)

- 「C:\Users\ `ユーザー名` \scoop\apps\git」で、対象のディレクトリが存在するか確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711955/d4439dd5-d586-a463-a20d-14120a90a2cb.png)

- Git.exeへのパスを「C:\Users\ `ユーザー名` \scoop\apps\git\2.39.1.windows.1\bin」に変更し、「適用」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711955/e156305c-9dd9-dd04-60c3-2421aec6ff06.png)
個人サイトに動的ogを作ってつまづいたところ

個人サイトを作ろうとしたときのはなしその 2。

## 経緯

なわしろ「ブログ書いたら Twitter とかで共有したいぞ」

識者「動的 og が必要だね。Vercel を利用して動的 og を生成する小さいサービスを作ってみるといいよ」

## vercel/og チュートリアル

なわしろ「今度は古い情報に踊らされないぞ。検索すると`og-image`の使用例が最初に出てくるけど、GitHub に但し書きが書いてある」

> Warning This repo is outdated and only works with Node.js 14. Please use @vercel/og for new projects.
>
> If you have a problem that reproduces using the playground, please create an issue in the satori repo.
>
> For all other issues with @vercel/og, please reach out to Vercel Support.

なわしろ「[公式の案内](https://vercel.com/blog/introducing-vercel-og-image-generation-fast-dynamic-social-card-images)に載ってる[例](https://vercel.com/docs/functions/edge-functions/og-image-generation/og-image-examples)を見て頑張ってみよう」

なわしろ「背景デザインには[haikei](https://app.haikei.app/)を使おう」

## つまづき encodeURI

なわしろ「うーん」

識者「どうしたんだい？」

なわしろ「動的 og を設定したんだけど」

`GitHub Pages & Next.js で個人サイト作ってつまづいたところ`

なわしろ「って表示してほしいのに」

`GitHub Pages`

なわしろ「になっちゃうんだよね」

識者「`&`が含まれているけど、URI エンコードはかけてるんだよね？」

なわしろ「こんな感じにかけてるよ」

```jsx:layout.jsx
<meta
  property="og:image"
  content={`https://example.com/api/og?title=${encodeURI(
    title ? title : siteTitle
  )}`}
/>
```

識者「ああ、それは`encodeURI`を使用しているからだよ」

### encodeURIComponent

識者「正しくは`encodeURIComponent`を使うんだよ」

```diff:layout.jsx
 <meta
   property="og:image"
-  content={`https://example.com/api/og?title=${encodeURI(
+  content={`https://example.com/api/og?title=${encodeComponentURI(
     title ? title : siteTitle
   )}`}
 />
```

識者「`encodeURI`は`&`を含めた機能を持つ文字をエンコードしないんだ。機能があるのにエンコードされたら困るからね」

なわしろ「なるほどなあ」

## まとめ

- `encodeURI`は`&`などの文字をパーセントエンコードしない。
- かわりに`encodeURIComponent`を使う。
RustでAtCoderのログイン認証を通す

# はじめに
RustでAtCoderにログイン認証を通すコードを作成したので備忘録として残しておきます。

# 処理の流れ
1. https://atcoder.jp/login にアクセスしてCookieとcsrf_tokenを取得
1. csrf_token、ユーザ名、パスワードをクエリパラメータに設定してログイン


# コード
reqwestのfeaturesに`"blocking"`、`"cookies"`を追加する必要があります。


```Rust
use scraper::Selector;

use reqwest::{blocking::Client, cookie::Jar};
use std::{io, sync::Arc};

fn get_user_id() -> String {
    let mut input = String::new();
    print!("ユーザ名を入力してください: ");
    io::stdout().flush().unwrap();
    io::stdin()
        .read_line(&mut input)
        .expect("Failed to read line");
    input.trim().to_string()
}

fn login() -> Result<(), reqwest::Error> {
    let user = get_user_id();
    let pass = rpassword::prompt_password("パスワードを入力してください: ")
        .expect("Failed to read password");

    // Cookieストアを作成
    let cookie_store = Arc::new(Jar::default());

    // Cookieストアを持つClientを作成
    let client = Client::builder()
        .cookie_store(true) // クライアントでCookieストアを有効にする
        .cookie_provider(Arc::clone(&cookie_store)) // カスタムCookieストアを設定
        .build()?;

    // csrf_tokenを取得
    let selector = Selector::parse("input[name=\"csrf_token\"]").unwrap();
    let body = client.get("https://atcoder.jp/login").send()?.text()?;
    let document = scraper::Html::parse_document(&body);
    let csrf_token = document
        .select(&selector)
        .next()
        .unwrap()
        .value()
        .attr("value")
        .unwrap()
        .to_string();

    let params = [
        ("username", &user),
        ("password", &pass),
        ("csrf_token", &csrf_token),
    ];

    let response = client
        .post("https://atcoder.jp/login")
        .query(&params)
        .send()?;

    response.error_for_status()?;

    println!("ログイン成功");

    Ok(())
}

fn main() -> Result<(), Box<dyn std::error::Error>> {
    login()?;

    Ok(())
}
```

# まとめ
cookieの保存のあたりで苦戦しましたが[Rustフォーラムの記事](https://users.rust-lang.org/t/confuse-on-construct-cookies-and-pass-them-into-reqwest-client/82953/7)に助けられました。

# 参考文献

- [【備考録】CurlでAtCoderのログイン認証が通るか試してみる - Qiita](https://qiita.com/BambooTuna/items/946d5b1482113acba6a4)
- [AtCoderをrequestsで自動ログインする - Qiita](https://qiita.com/bishop_func/items/bb9071e38ce0d812c115)
- [Confuse on construct cookies and pass them into reqwest::Client - help - The Rust Programming Language Forum](https://users.rust-lang.org/t/confuse-on-construct-cookies-and-pass-them-into-reqwest-client/82953/8)
Mantine UIをNext.js App Routerで使用したいよって話

# Mantine UI とは？
ReactのUIライブラリです。
有名どころだとMaterialUi , ChakraUI と似たようなやつです。 ←適当

特徴としては、
- カスタマイズ性が高く種類か豊富
    - 120種類以上の豊富なコンポーネントがある

- ドキュメントがわかりやすい
    - こんな感じで使いたいコンポーネントの使用方法だったり、Sizeや色などを選択してコードをそのまま持っていくこともできます
     ![スクリーンショット 2023-09-29 19.53.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3566179/02ff1bda-576c-d1e6-83a8-c054afdfa70a.png)
- React-Hook-Formなどの別ライブラリの必要がない
    - Mantine/form自体がform関連のhookを提供しているのでそれを使えば簡単にフォームにバリデーションをつけれる


などなど、比較的独自のスタイルを当てる必要がない管理画面等ではとても使いやすいライブラリです。


# 問題
Mantine UI はCSS in JSのフレームワークであるEmotionを採用しています。
*Mantine v7 alpha ではEmotionを利用してないとのこと

現状App RouterではEmotionをサポートしてません。

https://nextjs.org/docs/app/building-your-application/styling/css-in-js

なのでそのままだと使えないので、クライアントサイドでcss出力処理をするように指定してあげないといけないらしい。

# 対策
appディレクトリに以下のファイルを作成

```react:registry.tsx
'use client'

import React, { useState } from 'react'
import { useServerInsertedHTML } from 'next/navigation'
import { ServerStyleSheet, StyleSheetManager } from 'styled-components'

export default function StyledComponentsRegistry({ children }: { children: React.ReactNode }) {
  // Only create stylesheet once with lazy initial state
  // x-ref: https://reactjs.org/docs/hooks-reference.html#lazy-initial-state
  const [styledComponentsStyleSheet] = useState(() => new ServerStyleSheet())

  useServerInsertedHTML(() => {
    const styles = styledComponentsStyleSheet.getStyleElement()
    styledComponentsStyleSheet.instance.clearTag()
    return styles
  })

  if (typeof window !== 'undefined') return <>{children}</>

  return (
    <StyleSheetManager sheet={styledComponentsStyleSheet.instance}>{children}</StyleSheetManager>
  )
}
```

次にappディレクトリにあるlayoutを修正

```react:latyout.tsx
import StyledJsxRegistry from './registry'
 
export default function RootLayout({
  children,
}: {
  children: React.ReactNode
}) {
  return (
    <html>
      <body>
        <StyledJsxRegistry>{children}</StyledJsxRegistry>
      </body>
    </html>
  )
}
```

はい、これでおしまいです。
上記の対応をしたらApp RouterでもManineUiが使えるようになるかと思います！

# まとめ

今回追加した処理によってRSCを活用できなくなるのでApp Routerとの相性は悪そうですね。
まぁ、個人でお試しでApp RouterとMantine UIを使ってみたい！という方は試してみてくださいー！
質問やご指摘などありましたらコメントいただけると嬉しいです！

以上！
ざっくり理解する AWS Elastic Container Service (ECS)

# ECS とは
AWS が提供するマネージドのコンテナオーケストレーションサービスです。Docker Compose のクラウド版みたいなものです。

# ECS の各要素

![IMG_0570.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493521/845138d3-5c1d-c6f3-848f-ce0d1268197c.jpeg)

## クラスタ
複数のサーバー群をひとまとめにしてひとつのコンテナ実行環境とみなしたものです。後述するタスク・サービスはこのクラスタ上に展開されます。

クラスタのリソースには EC2 インスタンスを使うことができます。

## サービス
サービスはタスクの実行を管理するリソースです。タスクをクラスタ上に展開し維持するための様々な役割を持っています。

**サービスの仕事**:

- タスクのデプロイと維持
- タスクのロードバランサへの紐付け・切り離し
- タスクのヘルスチェック
- ローリングアップデート時の制御

タスクを EC2 インスタンス上に展開する他に Fargate で展開することもできます。タスクを EC2 で実行するか Fargate で実行するかはサービスの設定で選択できます。

## タスク
タスクはコンテナの実行単位です。クラスタ上で実際に実行されるものがこれです。

タスクはタスク定義を元に生成されます。タスク定義というのは Docker Compose における compose.yaml のようなものです。記法や機能差はありますが compose.yaml で定義できることはタスク定義でもだいたいできると印象を持ってよいでしょう。サービス作成時にあらかじめタスク定義を作成しておく必要があります。

一つのタスクに複数のコンテナを含めることができますがライフサイクルはタスク単位になります。

ECS ではウェブサーバーのように永続的なタスクを実行することが多いと思いますが、このようなタスクの実行は一般的にサービスが管理します。
一方タスクはサービスを使わずに直接実行することもでき、ワンショットのタスクは直接実行します。

# ECS サービスの仕事
## タスクのデプロイと維持

![IMG_0568.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493521/2159d926-ba91-4d54-a9a9-b1acd1b39059.jpeg)

サービスはタスク定義に記述されているタスクを要求タスク数だけ立ち上げます。
また実行中のタスクが何らかの理由で終了したときなど、実行中のタスク数が要求タスク数に満たなくなった際にもタスクを立ち上げます。

## ロードバランサーへの紐づけ

サービスの設定では起動したタスクをロードバランサに結びつける設定を記述できます。タスクの健康状態に問題が発生したときにはロードバランサ (ターゲットグループ) から切り離されます。

## ローリングアップデート

![IMG_0569.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493521/c25876b6-2599-afb6-e811-5d8871839391.jpeg)

タスク定義を更新しサービスのアップデートを行う場合ローリングアップデートが行われます。新旧のタスクの合計が desiredCount に対して minimunHealthyPercent と maximumPercent を超えない範囲でタスクを増減させつつ、全体が新しいタスクになるように置き換えていきます。

ECS サービスはローリングアップデート以外に CodeDeploy による Blue/Green にも対応しています。
Qiita記事初投稿

# Ruby on Rrails
マークダウン記法

## マークダウン記法の書き方
基本的にタイトルに関しては「#」をつけること！

### 箇条書きの書き方
- 以下のように記述する

 「-」でスタートさせて記述する。

- 箇条書きのレベルを下げるには？
    - Eneter or returnキーを押してから「tab」を押すと一個レベルを下げることができる


### コードを書くためには？
```ruby
(1..30).each do |numbers|
  if numbers % 15 == 0
    p "FizzBuzz"
  elsif numbers % 3 == 0
    p "Fizz"
  elsif numbers % 5 == 0
    p "Buzz"
  else
    p numbers
  end
end
```

- 上記は開始と終了を「```」のようにバックスラッシュでくくった状態で間にコードを記述するとよい！


### 参照動画

https://youtu.be/pHfIs-5AJ5E?si=A6YISJfoV1PL96kO
NVIDIA Driverの更新でミスって『Signed-By の値が競合します』になったときの対処法

# 状況

NVIDIA Driverの更新をしようと思って
```
sudo apt-get install -y nvidia-driver-***
```
して、脳死で
```
distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
      && curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
      && curl -s -L https://nvidia.github.io/libnvidia-container/experimental/$distribution/libnvidia-container.list | \
         sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
         sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
```
したら、
```
user:~/$ sudo apt update
[sudo] user のパスワード: 
E: ソース https://nvidia.github.io/libnvidia-container/stable/ubuntu18.04/amd64/ / に関してオプション Signed-By の値が競合します: /usr/share/keyrings/libnvidia-container-tools-keyring.gpg != /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
E: ソース https://nvidia.github.io/libnvidia-container/stable/ubuntu18.04/amd64/ / に関してオプション Signed-By の値が競合します: /usr/share/keyrings/libnvidia-container-tools-keyring.gpg != 
E: ソースのリストを読むことができません。
```
あーーー...

# 解決法
```
cat /etc/apt/sources.list.d/nvidia-container-toolkit.list
```
したらnvidia-driver系が複数ごろごろしてたので
```
sudo rm nvidia-container-runtime.list*
sudo rm nvidia-docker.list*
```
でOK。

# 参考
- https://github.com/NVIDIA/nvidia-docker/issues/1626
システム周りの各種マネジメント　〜基本情報技術者試験〜

今回は資格試験の学習です。今回はシステム周りの各種マネジメントを学習していきます。

１．プロジェクトマネジメント

PMBOK（Project Management Body of Knowledge）

PMBOKは、米国のプロジェクトマネジメント協会がまとめたプロジェクトマネジメントの知識体系で、国際的に標準とされているもの。従来、マネジメントといえばQDC（品質、コスト、納期）の3つに着目した管理手法が一般的だったが、PMBOKでは次の10個の知識エリアをもとに管理すべきであるとしている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631873/dfc1bbd3-af4a-1732-3689-263b86b6b134.png)



WBS（Work Breakdown Structure）

プロジェクトに必要な作業や成果物を、階層化した図であらわすもの。PMBOKでいうスコープ管理に活用される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631873/d19d93b3-5eee-af74-c03c-a6ea0577524a.png)


開発コストの見積り

・プログラムステップ法
従来からある見積手段で、ソースコードの行（ステップ）数により、開発コストを算出する手法

・ファンクションポイント法
表示仮面や印刷する帳票、出力ファイルなど、利用者から見た機能に着目して、その個数や難易度から開発コストを算出する手法。利用者にとっては、見える部分が費用化されるため、理解しやすい。
（）

２．スケジュール管理とアローダイアグラム

システム開発というのは、よほどの小さいものでない限り、複数の人間が長期にわたって携わる仕事となる。その時大事になってくるのが、「誰がいつ何をやるべきか」という情報を適切に共有できているかがカギになる。放置していれば各々が勝手に認識できて動ければいいが、プロジェクトはそうはいかない。統制維持が取れていないと、個々がバラバラに動いて崩壊しかねない。そこで管理者がプロジェクトチーム全体を管理する必要がある。特に全体の歩調を合わせるためにはスケジュール管理は欠かせない要素となる。そのために活用されるのが、アローダイアグラムやガントチャートとなる。

アローダイアグラム（PERT図）の書き方
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631873/20b377a6-0aa2-f142-5723-e35585d839a3.png)


３．ITサービスマネジメント

顧客の要求を満たすITサービスを、効果的に提供できるよう体系的に管理する手法

・ITIL（Infomation Technology Infrastructure Library）
ITサービスを提供するにあたっての管理・運用規則に関するベストプラクティスを英国が体系的にまとめたもの。

    サービスサポート・・・ITサービスの日々の運用に関する作業をまとめたもの

    サービスデリバリ・・・長期的な視点でITサービスの計画と改善を図るもの

大きく分けてこの二つによって構成される。

SLA（Service Level Agreement）
サービスレベルアグリーメント（SLA）とは、日本語にするとサービスレベル合意書となる。サービスの提供者とその利用者との間で「どのような内容のサービスを、どういった品質で提供するか」を事前に取り決めて明文化したもの。サービスの目標設定を、両者合意の下で行う。

SLM（Service Level Management）
設定した目標を達成するために、計画-実行-確認-改善というPDCAサイクルを構築しサービスの維持・向上に努める活動を、サービスレベルマネジメントという。

本日のアウトプットはここまでにします。引き続き学習していきます。

エンジニアファーストの会社　[CRE-COエンジニアリングサービス](https://www.cre-co.jp/)　H.M
【Swift】配列から特定要素を削除

# はじめに
配列から特定の要素を削除したい時に見る用記事

# 実装
基本はこっちを使う
```swift
array.removeAll { $0.id == "001" }
return array
```
:::note alert
エラー
```
Cannot use mutating member on immutable value: 'xxx' is an immutable capture
```
:::

このようなエラーが出る場合はこっちを使う

```swift
let newArray = array.filter { $0.id != "001" }
return newArray
```

# 参考記事
https://softmoco.com/swift-basics/swift-array-remove.php
KARTEで同一ページで発生したカスタムイベントをkeyに接客を配信する

KARTEで接客配信を行う際に、つまづいた点について書き留める。

サポートサイトに以下のような記述があった。

> 配信トリガーイベントが発生するよりも前に、対象ユーザーに含まれている必要があります。
> https://support.karte.io/post/2O62eJUNOkhdLT01s3DveM

つまり、配信対象に含まれるのは、`配信トリガーに該当したタイミングで、セグメントに該当しているユーザー`となる。

例として、次のような施策があるとする。
* スクリプトAで送信されるカスタムイベントをkeyにして、該当ユーザーに接客Bを配信したい。
* スクリプトAは接客Bを配信するページを含む複数のページで配信されているが、接客BはページXのみで配信される。
* スクリプトAは配信対象ページを閲覧したすべてのユーザーに配信されている。

<table>
<tr><td>セグメント</td><td>配信トリガー</td></tr>
<tr><td>カスタムイベントAの最新の値が○○に一致するユーザー</td><td>ページCを閲覧した</td></tr>
</table>

これを先に述べた条件に当てはめると、「ページCを閲覧したタイミングで、カスタムイベントAの最新の値が○○に一致するユーザー」に配信されることになる。

`セグメントの合致状況が更新されるのは、接客が配信されるよりも前`になる。
スクリプトAと接客Bは同一ページで配信されるイベントなので、接客Bのセグメント判定に、このページで発生したカスタムイベントAは考慮されない。
そのため、今回ページCを表示するよりも前、他のページで発生したカスタムイベントAが判定に使用され、「ページCでは□□だったが、一つ前のページで○○だったので配信された」「ページCでは○○だったが、一つ前のページで□□だったので配信されなかった」のような事象が発生し、期待通りの接客が行われない。

そこで、設定内容を以下のように修正する。

<table>
<tr><td>セグメント</td><td>配信トリガー</td></tr>
<tr><td>閲覧の最新の値がページCに一致するユーザー</td><td>カスタムイベントAで○○が送信された</td></tr>
</table>

すると、「カスタムイベントAで○○が送信されたタイミングで、閲覧の最新の値がページCに一致するユーザー」に配信されることになる。
実際の配信の仕組みとしては以下？

- ユーザーがページCを閲覧した時、接客Bのセグメントに該当したため接客対象となる。
- ただし、その時点では配信トリガーに該当しないため接客Bは待機状態となる。
- スクリプトが配信され、カスタムイベントAで○○が送信された時、ユーザーは配信トリガーに該当し、接客Bが配信される。

こうして期待通りの接客が行われる。
ESLint 設定ガイド


---

## ESLint 設定ガイド

### 参考URL
- [Zenn - ESLint の設定方法](https://zenn.dev/crsc1206/articles/d92548257fb445#(%E8%87%AA%E5%88%86%E7%94%A8)airbnb-base%E3%81%A7%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E5%AF%BE%E8%B1%A1%E3%81%A7%E3%81%82%E3%82%8B%EF%BC%86%E9%81%95%E5%8F%8D%E3%81%97%E3%81%A6%E3%81%9F%E3%82%89error%E3%81%AB%E3%81%AA%E3%82%8Brule%E3%81%AE%E4%B8%AD%E3%81%A7%E3%80%81%E5%AF%BE%E8%B1%A1%E5%A4%96%2Fwarning%E6%89%B1%E3%81%84%E3%81%AB%E3%81%97%E3%81%9F%E3%81%84%E3%82%84%E3%81%A4%E3%80%82)

### 注意点
- 必要なプラグインをインストールすると、ESLint が自動で実行されるようになります。
- 設定ファイルとして、`.eslintrc.js` と `.eslintignore` を使用します。
- 特定のチェックを除外することも可能です。

### 必要なパッケージ
```markdown
- "eslint": "^8.50.0"
- "eslint-config-airbnb-base": "^15.0.0"
- "eslint-config-prettier": "^9.0.0"
- "eslint-plugin-import": "^2.28.1"
```

### Visual Studio Code 設定 (`settings.json`)
ファイルを保存した際に自動的にチェックが行われるように設定します。
```json
{
  "editor.defaultFormatter": "esbenp.prettier-vscode",
  "editor.formatOnSave": true,
  "editor.codeActionsOnSave": {
    "source.fixAll.eslint": true
  }
}
```

---
【なるほどわからんDDD】ユビキタス言語ってなんなんだ

## はじめに

本記事は、『ドメイン駆動設計(DDD)』について少し勉強し始めた筆者が学ぶ中で「わからん！」→「なるほど！」と思ったことを書いたものです。

間違っていたらそっと教えていただけると幸いです。

## なんで言語の話になるんだ

最初にDDDについて、かる～く学んだ時に、よくわからなかったんですよね。
「エンティティとか値オブジェクトとかは、ドメインの要素って感じで、まあなんとなくわかる(あまりわかっていない)。
だけど、ユビキタス言語って何？　わたしは設計について学んでるはずなのに、なんで言語の話になるの？」

というわけで、ちょっと調べ直してみました。

## 知識の範囲が違う人たちとの、共通のコミュニケーション手段

人間なので、話し相手と認識がずれている、ということはありますよね。

例えば、わたしの住んでいるところの方言では、机を運ぶことを「机をつる」といいます。
この方言を、全然別の地域の人相手に使ったとしましょう。絶対に伝わりません。
わたしの話を聞いている人の頭の中にはきっと、わたしが一生懸命釣り竿で机を釣り上げようとしている姿が浮かんでいることでしょう。

別の例を挙げます。
最近話題のChatGPTを使いたいという非エンジニアの家族。「普通に『ChatGPT』で検索してアクセスすれば使えるよー」と教えました。
しかし「使えない！　検索してもどれかわからない！」と言います。
そこでスマホの画面を見せてもらったところ、表示されていたのはGoogleではなくAppStore。
家族は、そもそもChatGPTがWebサービスだと気付いていなかったのです(一応今はアプリがリリースされています。この会話をした当時はまだでした)。
家族はChatGPTをスマートフォンアプリだと思っていたので、「普通に『ChatGPT』で検索してアクセスすれば使えるよー」という言葉を聞いて、アプリのストアを開き、スマートフォンアプリを『検索』していたのです。

知識を持っている範囲が違うと、同じ言葉であっても思い浮かべていることが違ってしまうことは起こり得ます。
さて、システムの開発者も利用者もすべて全く同じITのドメインの知識を持っている人なのであれば、もしかすると認識のずれは少ないかもしれませんが、実際にはそんなことはありません。
全然違う業種の業務効率化を狙うシステムを開発するときには、知識のドメインが全然違うお客様(=**ドメインエキスパート**)と開発者との間でなんとか頑張って会話を成り立たせて、システムを作り上げなければならないのです。
そのとき、ドメインエキスパートと開発者の間で、共通のコミュニケーション手段として使用するのが**ユビキタス言語**です。

## 例

本を販売するECサイトを例とします。

まず、「本を販売するサイト」なので、販売するアイテムの名前は『本』です。それをドメインエキスパートと開発者の間で合意、共有します。これにより、このECサイトで販売するアイテムの名前は『本』と呼ばれるようになります。
「本でも、書籍でも別に変わらなくない？」と思うかもしれませんが、『本』です。

我々開発者は『本』=『書籍』と思っているかもしれません。しかし、本のことにとても詳しいドメインエキスパートは、『書籍』=『雑誌ではない本』と認識しているかもしれないのです。

開発者側が販売するアイテムのことを『本』のつもりで『書籍』と表現してしまえば、その時点でドメインエキスパートの認識との間に差異が生じます。私たちが『すべての本』の話をしている間に、ドメインエキスパートは『雑誌ではないすべての本』のことを思い浮かべている可能性があるのです。

他にも、サイトに登録した人を『ユーザー』と呼ぶ、本の在庫が全ての店舗でなくなったことを『在庫切れ』と表現する、など、本に詳しいドメインエキスパートとシステム開発に詳しい開発者が、ドメインに関する用語を定義、共有することで、ドメインに関する正確な知識を得てコミュニケーションを取りやすくし、システムの要件がズレてしまうことを防ぐのです。

## さいごに

DDD触りたての頃は何のためにあるものなのか全然わかっていなかったのですが(なんで共通の言語を取り決める必要があるの？ということが理解できず……)、開発経験を積んだり、DDDの本を読んだりしていくうちに何となく重要性が分かるようになっていったように思います。

とはいえ、今回の記事、特に自信がないです。全然違う点があればそっとご指摘ください。
Android Studio を Chromebook にインストール

ディスクサイズは、12.5GB 以上が必要です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/9f43686b-fc39-7f8b-860f-c44c55531dc5.png)


## インストールの準備

```bash
sudo apt install snapd
sudo apt install squashfuse
```

一度 Linux を exit
>設定を反映する為です。

```bash
sudo chown -R root:root /var
```

## インストール

```bash
sudo snap install android-studio --classic
```

```text
$ sudo snap install android-studio --classic
android-studio 2022.3.1.18 from Snapcrafters✪ installed
```

## 起動

```text
$ android-studio 
CompileCommand: exclude com/intellij/openapi/vfs/impl/FilePartNodeRoot.trieDescend bool exclude = true
2023-09-29 15:58:24,897 [ 543233]   WARN - #c.i.d.PerformanceWatcherImpl - UI was frozen for 6508ms, details saved to /home/uchida/.cache/Google/AndroidStudio2022.3/log/threadDumps-freeze-20230929-155823-AI-223.8836.35.2231.10406996-6sec
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/0346135b-67e6-de86-439b-a45c6bbcabcf.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/556686e3-ccd0-6261-54b7-cc92e7ff36f8.png)
Railsでよく使うコマンドをまとめてみた。

本記事では、Railsのよく使うであろうコマンドについてまとめていきます。

# 目次
- [はじめに](#はじめに)
- [開発中よく使う](#開発中よく使う)
    - [railsのアプリ起動](#railsのアプリ起動)
    - [コンソールの起動](#コンソールの起動)
    - [テストの実行](#テストの実行)
- [何かを作りたい](#何かを作りたい)
    - [新しいアプリケーション](#新しいアプリケーション)
    - [様々な種類のファイル](#様々な種類のファイル)
    - [データベース](#データベース)
- [マイグレーション関係](#マイグレーション関係)
    - [未実行のマイグレーションファイルの実行](#未実行のマイグレーションファイルの実行)
    - [マイグレーションの状況を確認](#マイグレーションの状況を確認)
    - [テーブルの初期化](#テーブルの初期化)
    - [データベースに初期データを入れる](#データベースに初期データを入れる)


# はじめに
私は、言語をはじめたてでコマンドを覚えていないときには
コマンドをメモに残すようにしています。
コマンドを覚えるまではそのメモからコピペして使用することが多いです。
この記事がRailsに慣れていない方にとって参考になると幸いです。

# 開発中よく使う
よく使うのですぐに覚えるであろうコマンド達です。

#### railsのアプリ起動
```terminal
$ rails server

//短縮形
$ rails s
```
これでアプリの起動をし、確認することができます。
また、`ctrl + C`でアプリ起動をやめることができます。
<br>
<br>

#### コンソールの起動
```terminal
$ rails console
//短縮形
$ rails s

$ rails console --sandbox
```
以上のコマンドを使うとコンソールの起動ができます。
コマンドラインでrailsアプリケーションとのやり取りが可能になり、
コンソール上で行った操作はデータベースに反映されます。
反映したくない場合には、一番下に記述した`--sandbox`のオプション付きの
コマンドで操作を行うと、終了時に変更をロールバックしてくれます。
<br>
<br>
#### テストの実行
```terminal
$ rails test [オプション] [ファイルまたはディレクトリ]
```
以上のコマンドでテストの実行とデータベースのリセットを行います。
ファイルやファイルの行番号を指定してテストを行うこともできます。


# 何かを作りたい
#### 新しいアプリケーション
```terminal
$ rails new アプリケーション名 [オプション]
```
このコマンドを実行するとアプリケーションに最低限必要なフォルダやファイルが自動的に生成されます。このコマンドはアプリケーションを作る際に一度しか使わないので頻繁に使うとは言えませんが重要なコマンドです。
<br>
<br>
#### 様々な種類のファイル
```terminal
$ rails generate 作成したい物 名前 [オプション]

//短縮形
$ rails g 作成したい物 名前 [オプション]
```
作成したい物の部分にはcontrollerやmigration、modelなど作成したいものの種類を入れます。
それぞれの種類でどのようなファイルができるのかについては[こちらのページ](https://qiita.com/kodai_0122/items/14494a3848654f32909d)で分かりやすく説明されています。
また、名前にはそのファイルにつけたい名前を入れます。

このコマンドを使って自動生成したファイルの削除については以下のコマンドでできます。
```terminal
$ rails destroy ファイルの種類 [削除するファイル名] [オプション]

//短縮形
$ rails d ファイルの種類 [削除するファイル名] [オプション]
```
<br>
<br>

#### データベース
```terminal
$ rails db:create [RAILS_ENV = 環境]
```
このコマンドを実行するとdatebase.ymlの設定に従ってデータベースを作成します。
環境名を設定すると環境ごとでのデータベース作成ができます。

このコマンドを使って作ったデータベースの削除については以下のコマンドでできます。
以下のコマンドではdatabase.ymlの設定に従ってデータベースを削除します。
```terminal
$ rails db:drop [RAILS_ENV = 環境]
```
先程と同じように環境を設定すると環境ごとでのデータベース削除ができます。

# マイグレーション関係
マイグレーションはデータベースの設計書のようなものです。
詳しくは[こちらの記事](https://qiita.com/nakaizumi_slj/items/2f0c05d0465d95c5440b)で紹介しています。

#### 未実行のマイグレーションファイルの実行
```terminal
$ rails db:migrate [VERSION = バージョン番号] [オプション]
```
実行の流れとしては以下のとおりです。
1. rails db:migrateを実行
2. schema_migrationsテーブルを調べ、存在しなければ作成
3. db/migrateディレクトリ内のすべてのマイグレーションファイルを調べる
4. データベースの現在のバージョンと異なるバージョンがあった場合、データベースに適応
5\.schema_migrationsテーブルの更新
<br>
<br>

#### マイグレーションの状況を確認
```terminal
$ rails db:migrate:status
```
どこまでマイグレーションファイルを読み込んだのかわからなくなったときに便利なコマンドです。
ミスした際にもよく使うコマンドですので覚えておいて損はないと思われます。
<br>
<br>
#### テーブルの初期化
```terminal
$ rails db:migrate:reset
```
テーブル内のデータを一度消したい場合に使います。
<br>
<br>
#### データベースに初期データを入れる
```terminal
$ rails db:seed 
```
以上のコマンドで初期データの設定ファイルに入れた内容をデータベースに読み込むことができます。

# まとめ
私がよく使ったなと思ったコマンドをまとめてみました。
網羅はできておりませんのでそのほか必要なコマンドは自分で調べてみてください。
また、記述に不備などございましたらコメントして頂けると幸いです。

#### 参考・引用

https://railsdoc.com/rails
【Python】SeleniumでVanJS Click Counterを攻略する

弊社[mori_goq](https://qiita.com/mori_goq)の作成した[VanJS Click Counter](https://vanjs-click-counter.vercel.app/)をやってみたところ、私では高橋名人を超えることができず、悔しくなったため技術力で攻略してやろうと思いました。

https://qiita.com/mori_goq/items/6294380a3c66599b195e

## 結果
結果からお伝えすると、大体730（73クリック/1秒）あたりに落ち着きました。
![meijin.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359978/d464e0e2-0ddd-6e0c-f908-53342c7ccf71.gif)

## コード
```python:main.py
from selenium import webdriver
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager

driver = webdriver.Chrome(ChromeDriverManager().install())

# VanJS Click Counterのページを開く
driver.get('https://vanjs-click-counter.vercel.app/')

# ゲームスタート！
xpath = '//button[contains(@class, "action-button")]'
start_button = driver.find_element(By.XPATH, xpath)

# 止まることなく連打
# for文で回してみても、大体730付近のスコアでした
while (True):
    start_button.click()
    start_button = driver.find_element(By.XPATH, xpath)
```

あまり大したコードは書いてませんが、つまづきポイントを。

```python
# ゲームスタート！
xpath = '//button[contains(@class, "action-button")]'
start_button = driver.find_element(By.XPATH, xpath)

# 止まることなく連打
while (True):
    start_button.click()
    start_button = driver.find_element(By.XPATH, xpath)
```
スタートの時に`start_button`へDOM要素を変数として定義しているのに、一番下の行でわざわざ`start_button`に変数に定義し直してる箇所ですが、これがないと下記エラーで処理が止まります。

```
selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: stale element not found
```
調べてみるとこちらの記事に辿り着き、再度DOMを取得しなおす必要があるみたいでした。

https://qiita.com/kenmaro/items/09549799285d76ce63fb

また、完成系のコードだとボタンが押せなくなる（10秒経過する）と、同上のエラーが発生してブラウザが落ちます。（原因不明だが、たまに永遠にクリックし続けてくれます。）
なので、下記のようなコードでボタンがクリック可能かでループを停止させようとしましたが、明らかにパフォーマンスが落ちた（大体600クリック/1秒）ので、今回は見送りました。
```python
start_button = driver.find_element(By.XPATH, xpath)

while (start_button.is_enabled()):
    start_button.click()
    start_button = driver.find_element(By.XPATH, xpath)
```
しかもループが早すぎるせいか、よく同様のエラーが発生してブラウザ落ちるので、あまり効果なし。

## 余談
以前アップした[同じような記事](https://qiita.com/goqsystem_nagaoka/items/1d1ca3f4d7dd60b12c42)の中で、`まだ試していないこと`と書いていましたが、今回はそれを試してみました。
やったこととしては座標を決めてクリックすることですが、結果としては手動でクリックするよりも遅い結果となったため、今回は不採用としました。
座標クリックするためのコードはこちらを参考に。

https://zenn.dev/shin1007/articles/9fb3c56c69c96b

## 最後に
### GoQSystemでは一緒に働いてくれる仲間を募集中です！
ご興味がある方は以下リンクよりご確認ください。

https://goqsystem.recruit.site/?qiita=c15b9e864c19b2df695d
個人的ラズパイ初期設定

## 経緯

もう何度ラズパイの初期設定手順を調べたかわからんので私的備忘録を残す。

## 手順

**1. OSのインストール**

下記から選択してインストールする。選定基準はネット上の記事の多さ。
困ったときに出てくる量が多いほうが解決しやすい。32bit・64bitはお好み。

- Raspberry Pi OS
- Raspberry Pi Lite
- Ubuntu

無難にRaspberry Pi ImagerでmicroSDに書き出す。

**2. 空のSSHファイルをSDの直下に配置**

これをやっておくと電源を入れてすぐにローカルネットワーク内の他のマシンからターミナルにアクセスできる。

**3. OSの更新**

下記コマンドを入力し、OSに更新をかける

```shell
sudo apt update
sudo apt upgrade
```

**4. IPアドレスを固定する**

`/etc/dhcpcd.conf`を編集し、IPアドレスを固定する。
保存後、ラズパイを再起動する。

```/etc/dhcpcd.conf
interface eth0
static ip_address=192.168.0.50/24
statc routers=192.168.0.1
static domain_name_servers=192.168.0.1 1.1.1.1 
```
[小ネタ] GitLab 16以降のCI/CDで他プロジェクトのContainer Registryからイメージを何故かpullできないと思ったら…

## まずは結論

GitLab 16[^1] 以降で別プロジェクトのContainer Registryから **下記の認証エラーによりイメージを何故かpullできない** と思ったら…

[^1]: この記事は GitLab 16.2.7 にて検証しています

```
Authenticating with credentials from job payload (GitLab Registry)
Pulling docker image foobar.example.net/your/project/image:latest ...
WARNING: Failed to pull image with policy "always": Error response from daemon: pull access denied for foobar.example.net/your/project/image, repository does not exist or may require 'docker login': denied: requested access to the resource is denied (manager.go:237:0s)
ERROR: Job failed: failed to pull image "foobar.example.net/your/project/image:latest" with specified policies [always]: Error response from daemon: pull access denied for foobar.example.net/your/project/image, repository does not exist or may require 'docker login': denied: requested access to the resource is denied (manager.go:237:0s)
```

**Dockerイメージがpullされる側の別プロジェクトの `Settings` → `CI/CD` → `Token Access` → `Allow access to this project with a CI_JOB_TOKEN` がオフもしくは適切な値になっているか見直しましょう！！**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1577592/1a1562be-9181-b29a-6659-35ef715d9553.png)

**↑ これがオンになってませんか？今まで通り、別のリポジトリのCIから pull させたい場合は、オフにしましょう。**



## どういうことか？

GitLab CI/CD では、あらかじめ自分たちでビルドしたDockerイメージを同じ GitLab インスタンスの Container Registry に格納しておけば、特にレジストリの認証(`docker login`)は明示的に行わないままいきなり利用することができます。

よくCI/CDで使うDockerイメージはあらかじめGitLab内に登録しておくと、別プロジェクトからいきなり参照したりして便利に使うことができます。（その際の裏で使われる認証パスワードが `CI_JOB_TOKEN` にあたります。）

```yaml:client_project/.gitlab-ci.yml
test:
  stage: test
  image:
    # 自作Dockerイメージ
    name: mygitlab.example.com/mygitlab_group/builder_image_project:latest
```

ただし、この動作がGitLab 16から変更されたらしく、**新規作成したプロジェクトのデフォルト設定として別プロジェクトからのイメージpullを拒否するようになってしまいました。**

https://docs.gitlab.com/ee/ci/jobs/ci_job_token.html#allow-access-to-your-project-with-a-job-token

https://stackoverflow.com/questions/76195256/does-allow-access-to-this-project-with-a-ci-job-token-in-gitlab-work-between-p

16になる前に作成したプロジェクトであれば設定はデフォルトはオフになっていますが、16以降に作成したプロジェクトはオン（自プロジェクト以外からのpullは禁止）になっています。

> By default, the allowlist of any project only includes itself.

これを解消するには

- 上記の設定自体をオフにするか
- 許可するプロジェクトをきちんと指定してあげる （こちらのほうが良い）

必要があります。当然後者のほうが推奨されています。

> **It is a security risk to disable this feature**, so project maintainers or owners should keep this setting enabled at all times. Add projects to the allowlist only when cross-project access is needed.
>
> https://docs.gitlab.com/ee/ci/jobs/ci_job_token.html#allow-access-to-your-project-with-a-job-token

明示的に許可するプロジェクトのホワイトリストを指定すればいいわけですが、内部的なGitLabだったらそこまでリスクが顕在化することもないので、いっそ今まで通りのレベル（オフ）でもいいと思います。

これで地味に1時間ぐらいハマりました。みなさんは同じことにならないように気をつけましょう。
Excel VBAって何？


# はじめに

こんにちは！
株式会社トラントの井野口です！

突然ですが、Excel VBAって何かご存知ですか？
「なんとなくわかるけど詳しくは分からない」、「言葉は聞いたことあるけどどんなものか知らない、、」という方もいらっしゃるかと思います。
今回はExcel VBAとは何かについて紹介していこうと思います！


# Excel VBA とは

Excel VBA（Visual Basic for Applications）とは、Microsoft Excelのマクロプログラミング言語です。

VBAを使用して書いたプログラミングを実行することで、Excelの操作を自動化しする独自のマクロを作成することができます。

マクロとは、Excel上の動作を決まった手順通りに実行することができる機能です。

VBAを理解しマクロを作成できるようになると、繰り返し実行するタスクの効率化や、特定の条件に合わせてマクロの作成、編集が可能になります。

Excel VBAの基本要素は以下の5つが存在します。


# 基本要素

 __1. VBAプロジェクト__ 
Excelファイル内には、VBAコードを格納するための「VBAプロジェクト」と呼ばれるマクロ群があります。1つのワークブックにつき1つのプロジェクトが含まれ、それぞれのプロジェクト内にはモジュールやステートメントなどに細分化されています。


 __2. プロシージャ__ 
VBAコードは3つの主要なタイプのプロシージャで構成されます。
サブプロシージャ：VBAで作成した複数のプロシージャを1つにまとめたもの
ファンクションプロシージャ：処理内容を定義し、関数を使用したプロシージャのこと
イベントプロシージャ：特定の操作がされた時に自動で実行されるプロシージャのこと


 __3. 変数__ 
変数はデータを一時的に格納するための箱です。変数はDimを使って宣言してから使用します。変数には __データ型__ （整数、文字列、日付など）があり、変数に入れる値の種類を表します。必要に応じて規定の変数にデータを格納し、使用します。


 __4. 条件分岐__ 
条件分岐文（If文）を使用して、特定の条件が満たされた場合にプログラムの動作を制御します。
主に、If 条件 Thenの形式で使用します。


 __5. ループ__ 
ループ構造を使用して、同じコードを繰り返し実行します。ForループやWhileループなどがあり、これによりデータの反復処理やタスクの自動化が可能になります。


# 最後に

これらの基本要素を、Excel VBAを学ぶ前にしっかりと理解することで、スムーズに習得することができます。
実際にExcel VBAを使用してマクロを作成してみてくださいね！

最後までご覧いただきありがとうございました。
Amazon Cognito＋AWS Amplifyを使ったログイン機能でサインインだけエラーハンドリングできない問題の解決方法

Amazon Cognito＋AWS Amplifyを使用してログイン機能を導入していた際、
サインインの画面でだけエラーハンドリングができない問題が発生しました。

解決できたので共有いたします。

# コード
```swift
    func signIn(_ request: SignInRequestModel, onSuccess: @escaping() -> Void, onFailure: @escaping(SignInErrorType) -> Void) {
        auth.signIn(username: request.email, password: request.password) { result in
            switch result {
            case .success:
                print("Success signin.")
                onSuccess()
            case .failure(let error):
                print("Fail signIn:", error)
                guard let error = error.underlyingError as? AWSCognitoAuthError else {
                    onFailure(.other) // ★なぜかここが呼ばれる（AWSCognitoAuthErrorでキャストできない）
                    return
                }
                switch error {
                case .userNotFound:
                    onFailure(.userNotFound)
                case .invalidParameter:
                    onFailure(.invalidParameter)
                case .invalidPassword:
                    onFailure(.invalidPassword)
                case .userNotConfirmed:
                    onFailure(.userNotConfirmed)
                default:
                    onFailure(.other)
                }
            }
        }
    }
```

:::note warn
他の画面（アカウント作成やパスワード再発行等）ではキャストしてエラーハンドリングが出来たのになぜかできない。
:::

# 調査内容
### なぜ、サインイン画面だけキャストできないのか
AuthErrorのunderlyingError
キャストが出来ている画面では、case .serviceに入ってくる。
![スクリーンショット 2023-09-29 17.25.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2370083/931734a5-8dbe-d8b5-d2ce-8dda67d79196.png)
キャストできない画面では、case .notAuthorizedに入ってきていた。
![スクリーンショット 2023-09-29 17.25.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2370083/572de916-1a61-885b-e379-4b89442920d1.png)

### なぜ、notAuthorizedになるのか
cognitoの管理画面で<a href="https://repost.aws/ja/knowledge-center/cognito-prevent-user-existence-errors">ユーザー存在エラーを防ぐ設定</a>を有効にしてるかどうかで返ってくるエラーが違うらしい。

有効 ⇒ notAuthorized
無効 ⇒ service

■参考URL
https://github.com/aws-amplify/amplify-swift/issues/1600#issuecomment-1018962055

# 解決方法
Cognitoの管理画面でユーザー存在エラーを防ぐ設定を無効にする。

■確認手順
cognito⇒ユーザープール⇒対象のユーザープール⇒アプリケーションの統合⇒アプリクライアントと分析
![スクリーンショット 2023-09-22 12.45.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2370083/a4e99523-f9d3-5632-ff17-79cd4369e782.png)
高度な認証設定でユーザー存在エラーの防止を有効化になっていたら、編集でチェックを外して無効にする。
楽天ひかりを使って自宅マシンにリモート接続するまで

## 経緯

iPad用のMagicKeyboardを購入したため、外出先から自宅の母艦マシンに接続したくなった。
試行錯誤が多かったため、次回の構築をスムーズにするために備忘録を残す。

## 環境

回線：楽天ひかり  
ルータ：tp-link Archer AX55  
VPN：PiVPN(WireGuard)  
VPNサーバ：ラズパイ4(Raspberry Pi OS 64-bit)  
リモートホスト：Windows11  
リモートクライアント：iPad Air 第5世代  

## 準備

### sysctlでパケットフォワードを許可しておく

`/etc/sysctl.conf`に下記を追記する。

``` /etc/sysctl.conf
net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1
```

### ラズパイをDDNSに登録

下記コマンドでラズパイのIPv6アドレスを調べる。

``` shell
ip addr
```

`/etc/dhcpcd.conf`に下記を追記してラズパイのIPv6アドレスを固定しておく。  
※下記は1例

``` /etc/dhcpcd.conf
static ip6_address=1234:a56:7b8:9c00:xxxx:xxxx:xxxx:xxxx/64
```

下記サイトにアクセスし、ラズパイのIPv6アドレスを任意のホスト名で登録する。  
[OPEN IPv6 ダイナミック DNS for フレッツ・光ネクスト](https://i.open.ad.jp/)

## PiVPN・WireGuardのインストール

基本的には[こちら](https://raspida.com/pivpn)の手順を踏んで行った。

## 疎通確認
ラズパイ側で下記コマンドを実行する。
下記のような状態なら成功。

``` shell
sudo wg
interface: wg0
  public key: # 省略
  private key: (hidden)
  listening port: 51820

peer: # 省略
  preshared key: (hidden)
  endpoint: [1234:a56:7b8:9c00:xxxx:xxxx:xxxx:xxxx]:51367
  allowed ips: # 省略
  latest handshake: 1 minute, 58 seconds ago
  transfer: 1.78 MiB received, 9.66 MiB sent
```

iPad側はWireGuardアプリの設定からログを確認する。
![S__4587524_new.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514766/a94b21f8-f4c4-672c-d5d8-b0e9c7cb5e18.jpeg)
下記メッセージを確認できればOK。
![S__4587526.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514766/ab988832-b93c-4401-d902-9f193232a961.jpeg)

ここまで出来たらiPadからラズパイと同ネットワークのPCにリモート接続できる。
大学数学やりなおし記録のマインドマップを作成してみた件

# 大学数学やりなおし記録のマインドマップ

- [大学数学 用語マインドマップ](https://stonee-k.github.io/my_archives/mindmap_study/math_study.km)
- [大学数学 用語マインドマップ（.png で出力）](https://stonee-k.github.io/my_archives/mindmap_study/math_study.png)

大学でやる数学の知識がほとんどいたるところ（a.e.）ショボショボだったので、これはいかんということで独学独習を試みた記録です。
「いぷしろんでるた何それ？」な段階から半年弱経過したらこんな感じになりました、という経過報告としてご覧ください。
数学の各分野について、分野そのものの紹介はネットでちらほら見かけていたのですが、用語とか定理とかまでブレイクダウンした入口側総合マップがほしいなーということで作ってみました。
学習中次々に出てくる用語をマインドマップに書き起こしています。

- Visual Studio Code + vscode-mindmap で作図していますので、vscode-mindmap が導入されている環境でご覧ください。
- 参考用に .png 画像で全体を出力したもののリンクも置いておきます。この記事に貼ってある画像は部分的に切り取ったやつです。
- 用語や定理は別名が付いていることが多いので、調べられる限りは併記していますが、完全とは限りません。
- 鎖マークのある項目は、鎖をクリックすると説明ページに飛びます。基本的に定理の主張だけでなく証明・導出の記載されている（「行間が狭い」）ページにリンクしています。リンク先の記事を執筆されている皆様に多大な感謝を。
- ノートマークのある項目は、マーク上にマウスカーソルを持っていくと覚書が表示されます。

![math_study1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513949/b0d5c1e0-0aff-febf-9796-8d1697809fb0.png)

![math_study2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513949/532d7291-4418-2cc0-0a82-bf7b8eb97649.png)

# 項目名の英語表記について

- 各項目に対応する英語訳は、主に英語版 Wikipedia から拾っています。
- 「整数の合同（congruence of integers）」について、いくつかの日本語のサイトで「合同式（congruent expression）」として紹介されていますが、英語のサイトで該当する表現が見当たらないので、見出しは（congruence of integers）にしています。
- 英語名称が複数あってそれぞれに対応する日本語訳があって……な状態だと、どれが同じものでどれが名称の紛らわしい別物なのか、調べるのが結構面倒だったり……

# ジャンル分けについて

- いわゆる三大分野「代数」「幾何」「解析」のかたまりは意識していますが、できるだけ上から下・左から右に向かって話題が展開していくように項目を配列することを優先したため、ジャンル分けはざっくりしています。
- 離散数学はうまくひとかたまりにならなかったので、ジャンル見出しの下にない項目はあちこちに分散配置されています。
- 形式論理学のあたりは、ひとまず「ロジカルシンキング」でまとめています。
- ツリーが散らかってきたので、統計学はここに入れていません。
- 記述が欠落している項目があったら、それは仕様です。（筆者の理解が追いついていないだけです…… orz）
- フーリエ級数がねぇ！とかラドン=ニコディムの定理はどこいった！とか米田の補題 以下略

# これから始める場合の学習の順番

- まずは集合論からスタート。最初のチェックポイントは無限集合の濃度を把握するところまで。
- 写像の基本も押さえておく。
- 位相空間論の近傍・開集合の概念を把握する。
- ε-N論法、ε-δ論法 を把握する。
- 各論に進んでみて、分からなければ分かるところまで戻る。

# 社会人になってそれなりに年数を経た皆様（筆者含む）へ

令和の中学生や高校生の学ぶ範囲が、昭和・平成初期のカリキュラムとはあちこち異なっていることと思います。
大学数学を学習する前に、思わぬところに知識の穴がないか念のため点検する用のリンクを載せておきます。

- [中学校数学・学習サイト](https://math.005net.com/youten.php)
- [中学生の数学の公式一覧！図形の定理から解の公式まで学年別に分かりやすく解説](https://tsushin.manabitimes.jp/191/)
- [受験辞典 高校数学のまとめ](https://univ-juken.com/)

# その他

人名のついた定理や理論は人物が活躍した順に成立しているため、人物の生没年を念頭に置くと前後関係が把握しやすいかもしれません。
【Unity】VContainer + UniRxを使ったMVPパターンで入力はどこで受けるの？

# 自己紹介
インターンに向けて（合格すらしてないけど）プログラミング能力を高めたい大学２年。

# MVPアーキテクチャの勉強
グラフィクス（VFX Graph、ShaderLabなど）を触りたい気持ちもあるのですが、我慢してインターンに向けて自分の強いところをさらに伸ばそうと思ってアーキテクチャの勉強をしています。

そんな中やっぱり避けて通れないDIやReactiveプログラミングなどの勉強をしているとMVPアーキテクチャに出会い色々コードを書いてみることに。
そこで感じた疑問を自分なりに解決したので記事にします。

# 疑問とは
DIを使うときにViewではPresenterを参照しないで、MonoBehaviourを継承するという書き方をしている方がちらほら。
というか、DIを使おうとすると自然にそうなりますよね。
入力を受けるためにはMonoBehaviourを継承する必要はあるけれど、、PresenterがMonoBahaviourを継承するのは普通に気持ち悪い！

そこで、なんとかしてPresenterが入力を受けられつつもMonoBehaviourを継承せずにする方法はないのか！！

という疑問です。

# 解決方法
**Presenterで入力を受け取る**ですっ
※この行はなにも言ってません。
## Presenterで入力を受け取ろう！
どうやって受け取るのかというとUniRxの`Observable.EveryUpdate`を使います。
```C#
Observable.EveryUpdate()
	.Where(_ => Input.GetKeyDown(KeyCode.Space))
	.Subscribe(_ => /*処理*/).AddTo(view);
```
こんな感じ。
Observable.EveryUpdateはピュアなC#でも使うことができるため、入力を見ることができます。

# まとめ
個人的には十分に満足した実装になりました。
UniRxが便利ですね。
まぁ正解かどうかはおいておいて…

# さいごに
アーキテクチャを勉強し始めてそろそろ1週間が経つのですが、非常にいい感じですね。
Unityのアーキテクチャは結構おすすめとかまとまってる記事が少なくてターゲットを絞るのが一番難しいです。

ただ、次のステップとして勉強するのはありかなぁと思って勉強しています。
そろそろなにを勉強するのが正解なのか分からないお年頃です。
phenixのphenix phaserを利用して複数のドメインを当てはめたい場合

Phenixのphenix phaserを利用した分子置換において、複数のドメインを順番に当てはめてモデルを作成する場合の方法の備忘録です。


# モデルを準備する。

複数あるドメインの構造をそれぞれpdbファイルで用意します。

# Phaser-MR (full featured) の利用
以下の手順で操作します。

## Input and general optionsタブ
Data fileに対象となるmtzファイルを指定する。

## Ensemblesタブ

1. まず、Ensemble 1タブが選択されていることを確認する。
1. Model IDに適切なIDを記入する。
1. Add fileをクリックし、対象となるpdbファイルを選択する。
1. 記入された行のChange varianceをクリックし、identityを選択identityを入力。最近はAlphaFold2のモデルを用いる場合が多いため、identity は100%で良い。

ドメインの数に応じて以下の操作を実行する。

1. 一番下に存在する。Add PDB ensembleをクリックする
1. 新しく出たタブを選択する。
1. Model IDに適切なIDを記入する。
1. Add fileをクリックし、対象となるpdbファイルを選択する。
1. 記入された行のChange varianceをクリックし、identityを選択identityを入力。

## Serach procedureタブ

1. 探索ドメインの数と同じに数にcomponentがなるようAdd searchをクリックする。
1. Component x の隣の箱をクリックし、Ensembleを指定する。Model IDの中から選択する。
1. 全てのComponentに関して選択する。
1. それぞれのモデルの予想される数をCopies to search forに入力する。

上から順番に探索するので、構造が大きい順に指定した方が良いと思われる。
domainが2つの時の記入例

![スクリーンショット 2023-09-29 18.03.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1825372/aa7800e7-f9b3-534c-429e-bd336847a1ee.png)

Runを実行し、結果を確認する。
iRICでgoogle mapの衛星写真を背景に表示する方法

# はじめに
iRICで計算結果を表示する際の背景画像は何を使っていますか？

私は、安心と信頼の国土地理院の航空写真を使うことが多いです。
ですが地理院の航空写真は、全国で整備されているわけではないので
中山間地の航空写真は無かったりします...

例：長野市の笹平ダムより上流が見えない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1147458/320e482e-4400-c201-9595-6261e6778761.png)

一般の人は中山間地の航空写真を見ることは少ないかもしれませんが
河道検討や土石流の計算を行うiRICユーザーにとっては結構深刻な問題だったりします。

そういった人に向けて、みんながお世話になっているであろうgoogleさんの衛星写真を
iRICの背景画像に使ってみよう！　という記事です。

# 実行環境
- iRIC v4 4.0.0.6909

# そもそも使えるのでは？という話
ここは余談なので、お急ぎの方はすっとばしてください。

iRICのオブジェクトブラウザーには標準でGoogle Mapが用意されているじゃん？
と思う方もいらっしゃるかもしれません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1147458/ccf7c689-a366-b0d7-f881-1762f5b3c3dd.png)

表示させるためにはAPIキーが必要なのに
わざわざ設定していた貴方は立派なiRICコアユーザーです。

ですが、実はこの機能、**いつの間にやら機能しなくなっています。**
（google側の仕様変更？なのかは私にはよく分かりませんが）

いやー、参りますね。少なくとも私は超困りました。
ということで、今この記事を書いています。

# 手順
## iRICの起動
iRIC Softwareを起動します。
ソルバーは何でも良いですが、ここではNays2DHを選んでいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1147458/f711822c-a921-0dff-aa98-c5e24e473fe7.png)

## 背景画像の設定
「オプション > 設定」を選択し、設定ウィンドウを表示させます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1147458/1b8aa7a6-d20e-0ea4-e8af-4dfd991ce143.png)

「背景画像（インターネット）」タブを開いて、「追加」ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1147458/97c2b67d-f012-3826-fff4-9f2a0be00227.png)

表示されたウィンドウに以下の情報を入れて「OK」ボタンを押します。
名前：Google Map (satellite)
URL：https://mt1.google.com/vt/lyrs=s&x={x}&y={y}&z={z}
最大ズームレベル：22
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1147458/ea25d4d6-5b76-0274-336b-eb816e033e67.png)

Google Map (satellite)が追加されているはずなので、「OK」ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1147458/3b4dda82-4738-61dc-37bd-49af76ad6246.png)

オブジェクトブラウザーにGoogle Map (satellite)が表示されるので
後はいつも通り使ってください。
（迂闊にgoogleさんの画像を載せるの怖いので、ここでは載せませんが）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1147458/104cab4a-8021-93f7-4569-515a9ce20b96.png)

# 注意事項
調べてみましたが正直、利用許諾がどれなのかよく分かりませんでした。
この辺かなと思いますが、いまいち自信がない...
- https://www.google.com/intl/ja_ALL/permissions/geoguidelines/
- http://desktop.google.co.uk/permissions/geoguidelines/attr-guide/

まあ、少なくともクレジット表記はいると思いますので
ご使用する際はご注意ください。

# おわりに
ひとまず、上記の手順に従えば全国の衛星写真はそれなりの解像度で見られそうです。
ただし、元々表示できていたgoogle maps apiで取得した画像に比べると
解像度が粗いように感じます。（今確認できないので気のせいかもですが）

ということで、個人的な意見ですが
上記はあくまでも暫定処置的なやり方かなと思います。

いつの日かgoogle maps apiのタイル画像が
iRICで読み込めるようになることを祈っています。