OmniAICreator/Qiita-1.07M huggingface dataset:
オブジェクト指向とは？なんとなくわかったじゃなくする。

面接対策でおそらく聞かれるであろうオブジェクト指向について説明できるようになりたい。
chatGPTを使いながら勉強を進めていきます。

## オブジェクト指向とは？

オブジェクト指向（Object-Oriented）は、プログラミングの設計思想や方法論の1つで、現実世界の物事や概念を「オブジェクト」として捉え、それらのオブジェクト間の関係や相互作用をプログラムに落とし込むことを目指します。

分かりやすく例を挙げると、考えてみてください。現実の世界で「車」というものを考えた時、車には「色」や「速度」、「ブランド」といった属性があり、また「走る」や「止まる」といった動作ができますよね。

この「車」というものをオブジェクト指向の考え方でプログラムに表現すると、
- **属性（プロパティ、フィールド）**：色、速度、ブランドなど
- **動作（メソッド、関数）**：走る、止まるなど

といった形で「車」というオブジェクトを設計します。

このようにオブジェクト指向は、現実の事象や概念をプログラムに落とし込むことができるため、大規模なプログラムや複雑なシステムを効率よく開発する際に役立ちます。

また、オブジェクト指向には以下のような主要な概念があります：

1. **カプセル化**：オブジェクトの内部情報や詳細を隠蔽し、必要な部分だけを外部に公開すること。
2. **継承**：あるオブジェクトの特性や機能を受け継ぎ、新しいオブジェクトを作成すること。
3. **多態性**：同じ名前の動作でも、オブジェクトの種類によって異なる動きをすること。

このような特性を利用することで、再利用性や拡張性、保守性の高いプログラムを開発することが可能となります。

## 簡潔的に人に説明する際にどのようにオブジェクト指向を説明する？


簡潔にオブジェクト指向を説明する場合、以下のように表現できます：

「オブジェクト指向は、現実の物や概念を"オブジェクト"としてプログラムに表現する考え方。オブジェクトは属性（例：車の色）と動作（例：車が走る）を持ち、これを使って効率的にプログラムを組み立てることができます。」

## オブジェクト思考の主要概念をコードで解説

Rubyのコードを使って、オブジェクト指向の主要な概念（カプセル化、継承、多態性）を説明します。

1. **カプセル化**：
```ruby
class Car
  # インスタンス変数は外部から直接アクセスできない（カプセル化）
  def initialize(color)
    @color = color
  end

  # colorを取得するためのメソッド（ゲッター）
  def color
    @color
  end

  # colorを設定するためのメソッド（セッター）
  def color=(new_color)
    @color = new_color
  end
end

car = Car.new("red")
puts car.color         # "red"を出力
car.color = "blue"
puts car.color         # "blue"を出力
```

2. **継承**：
```ruby
class Vehicle
  def move
    puts "Vehicle is moving"
  end
end

# CarクラスがVehicleクラスを継承
class Car < Vehicle
  def honk
    puts "Beep beep!"
  end
end

car = Car.new
car.move  # "Vehicle is moving"を出力
car.honk  # "Beep beep!"を出力
```

3. **多態性**：
```ruby
class Bird
  def speak
    puts "Some sound"
  end
end

class Sparrow < Bird
  def speak
    puts "Chirp chirp"
  end
end

class Parrot < Bird
  def speak
    puts "Hello! I'm a parrot!"
  end
end

def bird_sound(bird)
  bird.speak
end

sparrow = Sparrow.new
parrot = Parrot.new

bird_sound(sparrow)  # "Chirp chirp"を出力
bird_sound(parrot)   # "Hello! I'm a parrot!"を出力
```

上記の例では、`bird_sound`メソッドは異なる種類の鳥のオブジェクトを受け取ることができ、それぞれの鳥の`speak`メソッドを呼び出すことで、異なる音を出力します。これが多態性の一例です。
CheerpJ 3.0 AMAを見る

![Screenshot-2023-09-05-at-13.14.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3486144/b0103326-3e2e-3301-ec61-d8f69cddd0ce.png)
<iframe width="560" height="315" src="https://www.youtube.com/embed/Z-mHW6ldgco?si=NaM6m0eXLAvvJKRS" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
2023年9月18日（月）午後3時（BST）に、CTO兼リード開発者のアレッサンドロによるライブAsk-Me-Anything (AMA) を開催しました。

主なトピックは**CheerpJ 3.0**でしたが、WebAssemblyやコンパイラ、会社全般など、私たちの製品全般に関する質問を歓迎しました。CheerpJ 3.0の開発、リリーススケジュール、3.0のアーキテクチャが2.0とどう違うかなどの技術的な詳細について話しました。

今後のイベント開始のお知らせを受け取るには、私たちの[Discordサーバー](https://discord.gg/qBMHpK9Kqv)に参加してください！

# CheerpJの新機能は？
過去1年間、私たちはCheerpJの新しいアーキテクチャに取り組んできました。HTML5/WebAssemblyにおけるJVMの実装で、ブラウザ上でJavaアプリケーションを実行するように設計されています。CheerpJ 3.0は、2023年の夏の終わりにリリースされ、これまで以上に使いやすく、速く、互換性のあるものになる予定です。私たちのライブJavaFiddleデモは、すでに現在の開発バージョンに移行されています。

アナウンス全文は[こちら](https://leaningtech.com/announcing-cheerpj-3-0-a-jvm-replacement-in-html5-and-webassembly-to-run-java-applications-and-applets-on-modern-browsers/)。

https://leaningtech.com/legacy-modernisation-jp/

引用元：https://leaningtech.com/join-the-cheerpj-3-0-ama/
react-genieをアップデートするとanimationを渡さないといけなくなった

# はじめに

ライブラリのバージョンアップ活動で困ったことをのせます

# 問題

`react-genie`をバージョンアップしたところエラーがでるようになりました

```
    "react-genie": "^0.1.6"
    ↓
    "react-genie": "^0.2.2"
```

animationが必要に鳴ったようです

```index.tsx
  return (
    <>
      <SampleHead />
      <RevealGlobalStyles />
        <ReactGenieAnimations />
        <div>
          <Reveal>
```

# 解決方法

animationを追加するために必要なライブラリをインストールします

```tsx:index.tsx
$ npm i react-genie-styled-components react-animations
```

`RevealGlobalStyles`が`ReactGenieAnimations`に変わりました
またAnimationもインポートして使います

```tsx:index.tsx
      <ReactGenieAnimations />
        <div>
          <Reveal>
          <Reveal animation={Animation.FadeInUp}>
```

# おわりに

このライブラリをみつけた人がすごいなと思いました


# 参考

https://github.com/kitze/react-genie/issues/25

https://github.com/kitze/react-genie-styled-components
若手エンジニア奮闘記③音大卒の私がIT企業に就職して半年がたった今

# 音大卒からIT業界に？

大学3年生時、将来音楽家として生活していくことが難しいと感じ就職することを決意しました。
初めは音楽業界だけで就職活動をしていましたがなかなかうまくいかず諦め、違う分野で探したところIT業界に出会いました。
なぜIT業界なのかというとコツコツと何かを作り上げる達成感や楽しさ、日々成長していく充実感が「自分に向いている」と直感的に思ったからです。

# 4月〜6月の研修

未経験でIT業界に挑戦することは不安でしたが同期もほとんど未経験でお互い助け合いながら研修を終えました。
WordやExcel、C＃、Azure、Java、SQL、Linuxと様々な分野の研修を行いました。その時は何がなんだかよく分からなかったのですが新しい学びが多く楽しかったです。

# 7月〜9月

研修後は配属され実際に業務を行いました。
現場で実際に行って気づいたのはExcelの便利さです。
研修でもある程度の機能を教えていただきましたが実際に使い感動しました。特にVBAというExcelでプログラミングのような事ができる機能には驚きました。
また業務内容的に投資関係の勉強をしました。
初めは知らない用語だらけで戸惑いましたが今は自分もやってみようかなと興味を持ち始めました。

# この半年で合格した資格

・基本情報技術者試験
研修と同時に基本情報技術者試験に向けて勉強（過去問道場）をしていました。
同期みんなで問題を出し合ったり、教えあったりしながら6月中旬にA免除試験、7月頭にB試験を受け合格しました。
B試験は「かんたん合格基本情報技術者予想問題集」を理解すれば解けます！

・Java silver
8月下旬から勉強を始め、9月の中旬に試験を受けました。
勉強方法として黒本→紫本→黒本の順で黒本を重点的に勉強しました。研修でJavaをやっていたおかげで理解はできましたが難しかったです。

# 現在

色々覚えることで大変ですが毎日新しい発見があるので充実していて楽しいです。
今後は業務の勉強や次に取る予定の資格がAWS SAAなのでそれに向けて頑張ります！
【Django】with transaction.atomic()でトランザクションを利用する場合

# 概要
Djangoでは、デフォルトではトランザクションは利用されません（オートコミットモード）。
そこで、Django ORMが提供しているデータベーストランザクションを使いましたので紹介します。

# `with transaction.atomic():`とは
`transaction.atomic()`ブロック内のコードは、トランザクション内で実行されます。つまり、一連のデータベース操作がすべて成功した場合にのみコミットされ、途中でエラーが発生した場合にはロールバックされる、と言うことです。
よく例として挙げられる送金のプログラムで言えば、送金はしたのに途中でエラーが起きて先方まで届かなかった、なんてことがあったら大変です。そこで、トランザクションを利用してデータベースの一貫性を保つのです。

こちらの方法（`context manager`形式というらしい）で実装する場合は基本的な使い方の通り。

```py
from django.db import transaction

# トランザクションの開始
with transaction.atomic():
    # データベースへの操作を実行。このブロックはすべての操作が成功した場合にのみコミットされる！
```

自分は適用範囲を自由に設定したかったので上記の方法で実装しましたが、`settings.py`の`DATABASES`に`ATOMIC_REQUESTS`を追加し、`True`を指定してあげるとことで、一括設定することも可能です。正確にいうと、Djangoのミドルウェアとして動作し、HTTPリクエストごとにトランザクションを制御する、ということでしょう。
これでView関数の処理全体を1つのトランザクションとして管理することもできますが、この方法だと自分で作ったコマンドなどがあると反映されない点と、トラフィック量によっては性能面で非効率になることがある点の考慮が必要です。
[データベースのトランザクション | Django ドキュメント | Django](https://docs.djangoproject.com/ja/3.1/topics/db/transactions/#tying-transactions-to-http-requests)

ちなみに、`atomic`とは不可分という意味。
データベース操作をアトミック（不可分）にしたい場合に使うのでそのような名前なのですね。

# 参考
[【Django】トランザクションの設定方法](https://djangobrothers.com/blogs/django_transaction_settings/)
Reactコンポーネント 関数orクラス

## はじめに
関数コンポーネントにすべきか、クラスコンポーネントにすべきか
以前記事に書いていたら。。。
@honey32 さんがコメントで参考リンクをくださり😊　← <font color=red>ありがとうございます！<font/>

早速確認しながら理解を進めることにしました！
## 関数コンポーネントが推奨
Reactの新しいドキュメントによると...

![スクリーンショット 2023-10-26 17.21.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574859/54962651-ba4b-7f3a-441d-ccd5e73b8b08.png)

関数コンポーネントが推奨らしい！！

## 昔はクラスコンポーネントが推奨だった！？
昔はクラスコンポーネントのみが持っていた機能があり
その結果、クラスコンポーネント推奨時代があったようです。


``State``
コンポーネントがレンダリングされる際に __その時のデータを保持__　し、
__データの変化__ に応じてコンポーネントを __再レンダリング__ するもの。

<font color=gray>Stateが変わるかどうかが監視されていて
変わった瞬間、 __"ハイ！変更入ったから再表示！"__ みたいなイメージでいます<font/>


``Lifecycle Hooks``
    下記の一連の流れのこと。
        ・Mounting(マウント):コンポーネントをレンダーする
        ・Updating(更新):コンポーネントのStateを更新する
        ・Unmounting(アンマウント):コンポーネントのレンダーが切れる


:::note info
__<font color=red>Hooks　(React 16.8 で追加された新機能)<font/>__ の登場で
関数コンポーネントでも可能に！
:::


コードが長くなりがちなクラスコンポーネントは、お役御免に。。。。

<font color=gray>（なんかちょっとクラスコンポーネントがかわいそう🥺😂)<font/>

__▪️コードの長さ比較__
```javascript:関数コンポーネントの場合
function Greeting(props) {
  return <h1>Hi, {props.name}</h1>;
}
```
```javascript:クラスコンポーネントの場合
class Greeting extends React.Component {
  render() {
    return <h1>Hi, {this.props.name}</h1>;
  }
}
```

:::note info
関数コンポーネントでかけば、スッキリ！
:::


## おわりに
今後コードを書くときはぜひ関数コンポーネントで書いて行こうと思います。

次回、ぼやっと理解のままコードで使っているhooksについて・・・頑張ります！
Visual Studio CodeでJupyter Notebookを開き、CSVデータを取り込むまで

# Visual Studio Codeの準備 

 - Visual Studio Codeを開く
 - Python 拡張機能をインストール
 - Jupyter 拡張機能をインストール

 # venv仮想環境の準備
 
 - venvで仮想環境を構築
 ```powershell.ps1
 mkdir C:\test\
 cd C:\test\
 python -m venv data-analytics
 ```
 - 仮想環境に入ってpandasをpip install
 ```powershell.ps1
 cd data-analytics\
 .\Scripts\Activate.ps1
 python -m venv data-analytics
 ```
 - srcとdataフォルダをvenv環境は以下に作成
```powershell.ps1
mkdir .\src
mkdir .\data
```
 # Jupyter Notebookの準備
Visual Studio Code上で、srcフォルダにtest.ipynbを作成して開くと、勝手にJupyterNotebook形式のUIになる。

試しにprint("hello")を記述して、コードブロック右側にある再生ボタンとクリック。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3517776/c895e75d-a23a-f9f5-d709-97cbd67c5125.png)

接続先Pythonを選択するよう言われるので、候補から先ほど作成した仮想環境名のPythonを選択
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3517776/35bff7d4-70a2-0e9d-cc00-3dea08fa6b76.png)

ipykernelをインストールするか聞かれるのでインストール
ちょっと時間がかかる

# データの準備
今回はe-GOVデータポータルから、日本の人口推移を男女別にまとめたデータを取得してみる。

https://data.e-gov.go.jp/data/ja/dataset/mhlw_20201124_0048
ここから「1_年次・性別人口」のCSVデータをダウンロード

CSVの中には冒頭とデータの最後に説明や注釈があったりするので、削除
列名も、合計→total、男→male、女→femaleに変更。
あとなぜか年数が十の位になってしまってるので、1899年からオートフィルで4桁年数にする。
こんな感じ↓

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3517776/485cf23f-3eaf-e127-aef0-d5a1085d9f13.png)

Jupyterで以下のようにデータ取り込み準備

```test.py
import pandas as pd
#CSVファイル読み込み

df= pd.read_csv('../data/test.csv')
print(df)
```
以下のように表示されるはず。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3517776/980414da-3dc4-a90d-40c4-0c63f8f17d1c.png)

これで読み込みまでは完了。
SonarCloudで私のチームが検出の除外としたルール

## はじめに

過去にSonarCloudを利用して、検出をされた改善点・問題に対する対応の記事をまとめてみましたが、私のプロジェクトでの運用から検出ルールから除外しても良いルールやIssueの対応について再度まとめてみようと思います。

## 私のチームで除外しても良いと判断したルールとその理由

### Boolean literals should not be redundant 

>読みやすさを向上させるために、冗長なブール リテラルを式から削除する必要があります。

というルールですが、bool値をそのまま利用した判定でなく、追加で比較処理などしている箇所で検出されます。例えば`if(boolMethod() == true)`のような利用箇所などです。

私のチームでは、意図的に可読性を高めるためにbool型を`== false `で判定した記述をする場合があります。この場合は、今度のメンテナンス性や振る舞いの可読性がこの記述のほうが高いという判断の元、行っており、その箇所で毎度Issueを検出されて欲しくないため検出除外としました。
（前提として、冗長な判定を基本的に記述しないチームのため、本来このルールで検出したい箇所がないという場合に限るかもしれません）

### "Find" method should be used instead of the "FirstOrDefault" extension

FirstOrDefaultメソッドではなくてFindメソッドを利用したほうが高速になる可能性があると警告されています。

私達のチームではわずかなパフォーマンスの高速化よりもNullアクセスといったエラーが発生することのほうがユーザーに対する不利益が大きいと捉え、なるべくフェールセーフな実装を行う過程でデフォルト値を返すFirstOrDefaultメソッドを利用することが多々あります。そのため、意図的にFindよりもFirstOrDefaultを利用しており検出ルールから除外するとしました。

### Methods should not have too many parameters

長いパラメータリストを持つメソッドは、各パラメータの役割を理解し、その位置を追跡しなければならないため、使用するのが困難であり、デフォルト設定では8個以上の引数を指定するようなメソッドに対して検出されます（コンストラクタには検出されません）

私のチームでも基本的にはそのような複雑なメソッドは作成しないため検出されませんが、これが検出されたのがアプリケーションの拡張ポイント（リボンに新しいメニューを追加する場合に名前やアイコン、説明、押下したときのアクション・・・）をまとめて登録できる箇所で検出されていました。これは登録口が分かれると利用しにくいため、意図的に多くの引数を要求している箇所ですし、このような設計パターンをよく利用するので、毎度Issueを検出されて欲しくないため検出除外としました。

## まとめ

基本的には検出された指摘というのはなんらかコードをより良くしてくれる参考であるため、取り入れていくのが良いですが、チームの成熟度や方針を踏まえた上で合わないルールというのはいくつか出てくるはずです。

ルールとして除外するのではなくて、検出された箇所に対して次から検出されないように設定することも可能です。十分熟慮した上でチームとして除外するルールを定め、本当に指摘してほしかったものが埋もれないようにメンテナンスしていきましょう。
［Vue3］vue3の省略記法

# 概要
vueの各ディレクティブで省略記法があるためメモ。
不足分は随時追記する。

# 一覧
<table>
	<tr>
		<td>ディレクティブ</td>
		<td>省略記法</td>
	</tr>
	<tr>
		<td>v-bind</td>
		<td>:</td>
	</tr>
	<tr>
		<td>v-on</td>
		<td>@</td>
	</tr>
	<tr>
		<td>v-slot</td>
		<td>#</td>
	</tr>
</table>
【小ネタ】Django+sympy+MathJaxでシグマ記号の横ではなく、上下に数字を表示する【備忘録】

# 前書き
例のごとく作成中の計算練習用のサイトで、少し詰まったところがあったので備忘録代わりに記録しておきます。

# Σ記号の右側ではなく、上下に
sympyでは数列の和はsy.Sumを用いて以下のように表現できます。

```python: series1.py
import sympy as sy

k = sy.Symbol("k")
n = sy.Symbol("n")
start = 1
end = n
function = -k ** 3 + 3 * k ** 2 + 3
series = sy.Sum(function, (k, start, end))
latex_series = sy.latex(series)
```

ですが、このままですと、以下の画像のように右側に文字と値が表示されてしまいます。

![side.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278439/a652a8d8-1ef7-505b-e57d-bb75725ee791.png)

これを防止するには、以下のように\\displaystyleを手前において、表示形式を指定すればよいです。

```python: series2.py
latex_series = f"\\displaystyle {sy.latex(series)}"
```

![up_and_bottom.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278439/6c19c0ea-8f11-d0b3-6bfa-02edc0f8b541.png)

# 後書き
地味なところですし、別に意味は同じですが、高校生を対象としているため、教科書と同じ形にそろえることを重視しました。実現できてよかったです。

# 参考サイト様
[Texで総和(summation)を表すシグマの上付き下付き文字がちゃんと上と下にいかない時は](https://myenigma.hatenablog.com/entry/20110204/1296829026)
CodeSpace上でcore dump機能を使用するため

# はじめに
　C言語の開発をする際、便利であるためにCodeSpaceを使用してしまいます。
　CodeSpaceとは、古くは　Visual Studio Codespaces　が　GitHub Codespaces　と名前を変更させたのが遍歴のようで、名前の通りGitHub提供のクラウド版VisualStudioです。
　クラウドであり複数のパソコンから接続することができ、作業中の環境をほとんど固定することができることから、普段から使わせていただいています。
　さて、そんなCodeSpaceは、クラウドであるというのにほとんど癖を感じない点に強い魅力を覚えているのですが、それでもC言語の開発を行ってみるとすると、どうもシャープであったようで、困ることも多々あります。
　今回はそんな事例。gdbでsegmentation faultについてのデバッグをしたいというのに、どうにもこうにも上手くいかなかったがために書き留めておきたい記事でございます。
　ここまでなんとなく助長に文章を進めておいてなんですが、飽きたので文章量が減ります。

 # コアファイルサイズ

　初期設定は0となっています。

 ```
ulimit -c
0
 ```

 # コアファイル出力先

　初期設定では|/usr/share/apport/apportという場所を指しているようです。
　そもそもapportが何かという話です。プログラムのエラーが発生したときに情報を収集し、自動でUbuntuの障害解析チームにレポートを送信するもののようです。デバッグ用にコアファイルが生成されるものではないようですので、これを変更したいです。

 ```
 cat /proc/sys/kernel/core_pattern
 |/usr/share/apport/apport -p%p -s%s -c%c -d%d -P%P -u%u -g%g -- %E
 ```

 # コマンド
 
 　コアファイルサイズが初期は0になっているのでunlimitedとします。
　CodeSpace上でのコアファイルをリカレントディレクトリに出力させます。

```
sudo sysctl -w kernel.core_pattern="core"
ulimit -S -c unlimited
```

　このターミナルコマンドを実行すると、core.-----というファイルが出力できるようになります。
 　gccもしくはg++でコンパイルの際に-gオプションを付け加え、実行ファイルを実行時にsegmentation faultが発生すると、コアファイルが生成されます。
 　
# デバッグ
　コアファイルが生成されてから、gdbを使用してデバッグします。
 　core.-----の棒線部分は数字が入っているはずなので入力してください。

 ```
gdb ./a.out core.-----
 ```

　gdbが起動されるとなんかいろいろと出てきますがわかんないのでスルーします。
 　バックトレースを行うとsegmentation faultが発生するまでの道筋が表示されます。
  　例えばこんな風。

 ```
 (gdb) backtrace
#0  0x000055a23a4a1693 in function1 (n=0x55a23b827378) at main.c:331
#1  0x000055a23a4a1557 in function2 (w=1, n=0x55a23b827378) at main.c:309
#2  0x000055a23a4a1e8a in function3 () at main.c:461
#3  0x000055a23a4a0892 in main () at main.c:119
 ```

　一番下の番号を指定して、より詳細にどこの地点でエラーが発生しているのかを判明させることができます。今回の場合は#3がそうです。
 　backtraceの長さによっては何十行という行数が出力されようという事もあり、その場合はenterやらcやら押して続きの文章を読んでください、というような英文が表示されると思うので、その指示に従って一番下のフレームまでたどり着いてください。

 ```
 frame 3
 #3  0x000055a23a4a0892 in main () at main.c:119
119           function3();
 ```

　解釈するとソースコード上は119行目にあるfunction3という関数が原因である。ということのようです。それから必要に応じてローカル変数を参照することなどができます。さらに詳しいgdbの使い方は別の記事を参考にしてください。
 　私がよく参考にする分かりやすい記事を以下に貼らせていただきます。

 https://qiita.com/arene-calix/items/a08363db88f21c81d351
C#のアプリから、JavaScriptを実行して、結果を受け取る

C#のローカルのアプリで使いたい`TypeScript`のモジュールがあるのですが、TypeScript/JavaScriptの文法はほぼ知らないし、一から学んでいる時間も無いしで、C#に移植するのが難しい状況。
では、TypeScript/JavaScriptのコードをそのまま利用できるなら、解決できるんじゃないか？　と考えたので調査しました。

## Jering.Javascript.NodeJS

[Jering.Javascript.NodeJS](https://github.com/JeringTech/Javascript.NodeJS)
を利用します。
ここの解説にある、`Static API example`を、C#のコンソールアプリで実行するのが分かりやすいです。

この例では、

```csharp
string javascriptModule = @"
module.exports = (callback, x, y) => {  // Module must export a function that takes a callback as its first parameter
    var result = x + y; // Your javascript logic
    callback(null /* If an error occurred, provide an error object or message */, result); // Call the callback when you're done.
}";
```

と、文字列としてJavaScriptを配置しています。

JavaScriptのファイルを読み込んで実行するのなら、`Invoking Javascript From a File`の解説にある、

```csharp
Result? result = await nodeJSService.InvokeFromFileAsync<Result>("exampleModule.js", args: new[] { "success" });
```

のように、ファイルを指定します。

JavaScriptのファイルに、`import`や`export`があるなら、ファイルの拡張子を、`mjs`にします。→ 解決策がヘルプには見当たらず、`Issues`を検索して読み込まないと分からないので、解決するまで時間がかかりました。

## TypeScriptからJavaScriptへ変換
`Jering.Javascript.NodeJS`は、TypeScriptを扱えないようです（できないか調べましたが、解決方法を見つけられず・・・）。ですので、JavaScriptに変換しないといけません。ネット上で変換サービスがいくつかあるのですが、変換結果に違いがあります。
あるサイトで変換したコードでは、実行するとエラーになりました。TypeScriptはJavaScriptの上位互換と聞いていたので、変換されたコードに問題はないだろうと思っていましたが違いました。

エラーになったファイルを、
[Typescript to Javascript compiler](https://jerosoler.github.io/ts2js/)
で、変換したところ、問題は解消しました。
（このサイトの、`Target`や`Module`についてまでは、調べていないので、何が適切なのか分かりませんが）

### VisualStudioで変換する
（2023-12-5追記）
TypeScriptのコードを、VisualStudioのプロジェクトに配置して、**ビルドできる**ようにすれば、JavaScriptのファイルが作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132059/aa4e083a-4883-dc09-1b04-eb62ecccc3fc.png)


### メモ
私の当初の目的(C#のアプリで、あるTypeScriptのモジュールを利用する)は達成できませんでした。
JavaScriptのコードを変更しないといけない部分が多く、結局JavaScriptが分からないと対応しきれなかったのです。

### 確認環境
- Jering.Javascript.NodeJS 7.0.0
- .NET 7
Node18でLambdaからDynamoDBにデータを登録する関数を作ろうとしたら思ったより深い罠にかかった話。


## 前置き
業務で、「LambdaでJsonのデータをもとにDynamoDBにデータを投入する関数を作る」というタスクをいただきました。過去のQiita記事やインターネットの記事を参考にしましたが、どれもうまくいかず…
詳しく調べてみるとNode18ではインターネットに転がっている従来のソースではうまく動作しないことが多いようです。
そこで、本記事では私と同じ問題で躓いている方をお助けできるよう、また、自分の備忘録として、記事として残そうと思います。

## 結論
結論だけ見たい方、時間がない方向け。
シンプルなサンプルソースとサンプルJSONが以下となります。

#### サンプルソース
```mjs:index.mjs

import { DynamoDBClient } from "@aws-sdk/client-dynamodb"
import { DynamoDBDocumentClient, PutCommand } from "@aws-sdk/client-dynamodb";

export const handler = async (event) => {
  const dynamoDBClient = new DynamoDBClient({ region: "YOUR_REGION" });
  const ddbDocClient = DynamoDBDocumentClient.from(dynamoDBClient);
  try {
    // 受け取ったJSONデータをパース
    const jsonData = JSON.parse(event.body);

    // DynamoDBにデータを格納
    const params = {
      TableName: "YOUR_TABLE_NAME",
      Item: data,
    };
    await ddbDocClient.send(new PutCommand(params));

    return {
      statusCode: 200,
      body: JSON.stringify({ message: "データを格納しました" }),
    };
  } catch (error) {
    console.error("エラー:", error);
    return {
      statusCode: 500,
      body: JSON.stringify({ message: "エラーが発生しました" }),
    };
  }
}

```

#### Json
`{"jsonData":{"table":"YOUR_TABLE_NAME","data":{"YOUR_KEY":"YOUR_PRAM"}}}`



## 1. LambdaのランタイムがNode16からNode18へバージョンアップされた話

本来、Node16はLTSで2024/4までサポート期間があったのですが、OpenSSL 1.1.1のサポート終了に合わせて終了しました。つまりLambda側からNode18を使えと、お達しが出ました。
これにより、Node18を使うしかなくなったのですが、Node18へバージョンアップされたことで一つ大きな変更が起こりました。それが「AWS SDK」のバージョンがV2からV3へバージョンアップしてしまった、ということです。今まで使っていた require関数 などがいきなり使えなくなってしまったため、一部では大騒ぎだったそうですが…
ここの章では、
**LambdaのランタイムがNode16からNode18へバージョンアップ**されたことで、いままでの関数が**使えなくなった**ということをご理解いただければと思います。
本記事では詳細部分の記載は省きますが、気になった方は調べてみてください。


## 2. 簡単にソース解説

```mjs:index.mjs
  const dynamoDBClient = new DynamoDBClient({ region: "YOUR_REGION" });
  const ddbDocClient = DynamoDBDocumentClient.from(dynamoDBClient);
```
上記の2文で実際にデータを登録するDynamoDBを指定します。
"YOUR_REGION"は皆様が実際に使っている地域を設定してください。
東京リージョンなら"ap-northeast-1"です。

```
const params = {
  TableName: "YOUR_TABLE_NAME",
  Item: jsonData
};
await ddbDocClient.send(new PutCommand(params));
```

上記の５行では実際にDynamoDBに投入するデータを指定して、データを投入するソースです。
"YOUR_TABLE_NAME"は皆様が実際にデータを投入したいDBを指定してください。
ItemはJSONで指定した"data"のオブジェクト部分が入ります。

ここで解説していない部分に関しては普通のJSなので、説明は省かせていただきます。

ほかにもデータを取得したりする際にも元々使えていた関数などが使えなくなっておりますので、ぜひ、調べてみていただければと思います。

本記事は以上です、ありがとうございました。
氏名/⽒名 入会/⼊会　文字の違い

# 原稿には気を付けよう！

WEBページの作成をしていたところ、何やらCSSでのフォントの指定が効かない文字を発見。

なんじゃこりゃ？
とか考えながらよく見てみると、

氏名⽒名
入会⼊会

・・・違うのか？この文字は？
Qiitaの入力欄で見るとわかりやすいです。

![スクリーンショット 2023-10-26 162726.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399121/14f59545-8627-e7ca-97a4-f8fc4c000cc0.png)


自分のVSCODE環境で見ても顕著ですね。
フォントファミリーは
"Iosevka,'Migu 1M'"

![スクリーンショット 2023-10-26 163020.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399121/4a838578-3e10-44fd-84a9-347db1175452.png)


おそらく画像で送られてきた元原稿を、
AIの自動読み取りをした際に、日本語以外（中国文字？）で漢字認識されたんじゃないでしょうか。

漢字辞典オンライン様で右側の文字をコピペしても出てこなかった始末
https://kanji.jitenon.jp/

確認してみましたがわかりませんでした！
いかがでしたか？（）

追加で確認したヤバ文字

〜～~
､、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399121/172dca9c-f566-775c-fa18-1cd3bf891eb0.png)

～の2個目わかりにくいよ
Salesforce: 共有設定・ロール階層・共有ルール

## はじめに
こんにちは！今日はSalesforceの基本用語、特に「共有設定」「ロール階層」「共有ルール」に焦点を当てて、初心者の方でも理解できるように解説していきたいと思います。

## 1. 共有設定とは？

共有設定は、Salesforce内のデータへのアクセスを制御するための設定です。例えば、営業チームとサポートチームが同じオブジェクトにアクセスする場合でも、それぞれのチームが見ることができる情報や編集できる範囲を制限することができます。

**例**：A社の営業チームは、取引先の情報を全て見ることができますが、サポートチームは連絡先情報のみアクセス可能とする場合、共有設定を使用してこれを実現できます。

## 2. ロール階層とは？

ロール階層は、組織内のユーザー間のデータアクセスの階層を定義するものです。これにより、上位のロールには下位のロールのデータへのアクセス権が自動的に付与されます。

**例**：A社の営業部長は、自分の部下である営業担当者の取引先情報にアクセスできるが、逆に営業担当者が部長の情報にアクセスすることはできない、という設定をロール階層で実現できます。

## 3. 共有ルールとは？

共有ルールは、特定の条件を満たすレコードを特定のユーザーやグループと共有するためのルールを設定するものです。共有設定でアクセスが制限されているレコードでも、共有ルールを使用することで特定のユーザーにはアクセスを許可することができます。

**例**：A社の営業担当者Aは、自分が担当する取引先情報のみアクセスできる設定になっています。しかし、特定の大口取引先に関しては、営業担当者Bもアクセスできるようにしたい場合、共有ルールを使用してこれを実現できます。

## 終わりに
以上、Salesforceの基本用語「共有設定」「ロール階層」「共有ルール」についての解説でした。Salesforceは非常に強力なツールですが、その機能を最大限に活用するためには、これらの基本用語の理解が不可欠ので頑張って覚えていきましょう🔥

## 参考文献
https://youtu.be/yL6OWYYbY6w?si=K-cwMgadmYVc1apO
ブロック要素を上下左右中央揃えするやり方

# 上下左右中央揃えにする3つのやり方
備忘録
私が間違っている可能性もあるので他の方々の解説も見ることをお勧めします。
参考にしたサイト（https://style.potepan.com/articles/22733.html）
## *1.margin: auto;を使う*
```css:中央揃え①
.親要素 {
  position: relative;
}
.子要素 {
    position: absolute;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
  
    margin: auto;
}
```
left, right, widthプロパティが、auto以外（何かしらの数値が入っている状態）で、margin:autoを指定した場合、左右の余白が均等になるというHTMLの仕様があり（上下も同じ）、これを利用して上下左右で中央揃えにしているらしい。
#### 出力例（白色の部分）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584440/f2f1f5d0-cc04-2175-c418-c95ce0dc358b.png)



左右中央揃えのみをしたい場合...

```css:中央揃え①'
.親要素 {
    position: relative;
}
.子要素 {
    position: absolute;
    right: 0;
    left: 0;
  
    margin: auto;
}
```
といった具合にtopとbottomの記述を除けば左右中央揃えができる。
他にも左右中央のやり方はあるので手段の一つとして覚えておくといいかも。

※ 上下中央揃えがしたい場合はrightとleftを除く。

#### 出力例（白色の部分）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584440/972c3148-8239-ac93-3262-b7010d4fa936.png)



## *2.transformを使う*
```css:中央揃え②
.親要素 {
    position: relative;
}
.子要素 {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translateY(-50%) translateX(-50%);
    -webkit-transform: translateY(-50%) translateX(-50%);
    /* -webkitはtransformに対応していないブラウザでも動作させるため */
    /* -webkitはベンダープレフィックスというものらしい */
}
```
topやleftは子要素の左角を基準に動くので下に50%(top50%),右に50%移動すると...

![スクリーンショット 2023-10-26 160456.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584440/149f845f-9e70-c963-1d29-2b7d8eeff0d9.png)

このように中央にそろわないのでそこにtransformをかけて中央にする

**transformX(-50%)のみ**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584440/76c3c43e-695f-9acc-928b-3f5bc1b74462.png)
transformXは横に移動する

**transformX(-50%)とtransformY(-50%)**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584440/a77bb75a-84e8-7743-2a5c-a5c6b976b859.png)
transformYは縦に移動する

## *3.flexを使う*
```css:中央揃え②
.親要素 {
    display: flex;
    justify-content: center;
    align-items: center;
}
.子要素 {
    /* 中央揃えするためにする記述は特になし */
}
```
flexの場合は子要素に記述するものは特になく、親要素をflexに指定して上記2つの記述をすれば中央揃えすることができる

以上！！
家庭用防犯カメラをつくる(1.準備編)

# きっかけ

## 車庫のクルマが当て逃げされた
- 警察に被害届を出しましたが、ほぼ特定は不可能とのこと
- 現場検証では残留物・証拠映像がなかったため

:::note info
ご近所さんの協力で助けられました。
:::

# 普通にカメラを付ける？

| 項目・機材  |   市販カメラ |           PC | ラズパイなど |
|:-----------|------------:|:------------:|:------------:|
| 価格       | 安い～高い    | 高め         |　やや高め　　 |
| 電源     | やや長め      | 要コンセント   | 　短め       |
| 防水性       | 高いものあり | 無         |  カバーで対応？ |
| 使いやすさ | カンタン         | 作り手次第  | 作り手次第  |
| 自動化   | 物理的トリガー       | AI      |   AI、センサー    |
|

## 個人的な環境問題
- 電源難しい：車庫からコンセントの位置が遠い
- 面白さが欲しい
- 衝撃で撮影だと証拠が取れない可能性がある

# まずはPCで家族以外をフレーム内に入ったら撮影してみる
- 検出系よりも軽くできそう(PCで作ってラズパイで実装など）
- ラズパイなら何とか電気工事できそう(資格有）
- YOLOほどしっかりしていると取漏れが出そうなので、そこそこテキトーなレベル




# 試作第一弾

https://github.com/mi-kaneyon/attendance

- OK画像とNG画像をミックス学習して、学習済みモデルを読み込んで撮影

:::note info
- 肝心のscriptが実行ファイルだけでした。トレーニング、ファイルサイズ調整スクリプト追加
- added script files in the script directory!
:::

**OK例**
![registered_okmenmber.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2155177/1efbbf69-56e5-fb60-de5b-51e909d715bd.png)

- NGの場合は自動で対象を撮影する（オート基本）


# 今後の課題

:::note info
- まだ100％ではない。90％以上はでるが100％にしたい
- 物体検知を取り入れた方がいいか？これをバージョンアップするか
:::

# ちょっと更新（画期的な進展がなくすいません・・・）
:::note info
- Resnet18ベースをResnet50ベースで学習するバージョンを追加しました。
- 上のリンクよりv3とついたファイルをscriptディレクトリに保存するだけです。
- insp.pyというpthファイルのモデルを見るチェッカーを追加しました。
:::
Rails：database.ymlの設定項目

初期学習用のメモ書きです。
database.ymlの各項目について、簡単にまとめました。

## 環境ごとの役割
| 項目名 | 概要 |
|:-:|:--|
| default | 全部に共通 |
| development | 開発環境 |
| test | テスト環境 |
| production | リリース環境 |

## DBアクセスに関する項目
| 項目名 | 概要 |
|:-:|:--|
| adapter | DBごとのアダプター<br>SQLite3→sqlite3、MySQL→mysql2、PostgreSQL→postgresql|
| pool | 同時にDBにアクセスできる数 |
| timeout | 結果を受け取るまでのタイムアウト<br>デフォルトは5000（ms） |
| <<: *default | 固定値<br>defaultに用意した設定をそのまま読み込む |
| database | DBの保存場所とファイル名を指定 |
| host | ホスト名<br>（サーバ型DBの場合） |
| username | アクセスユーザ名<br>（サーバ型DBの場合） |
| password | アクセスユーザのパスワード<br>（サーバ型DBの場合） |
| encoding | テキストのエンコーディング名<br>（サーバ型DBの場合） |
oracle PL/SQL で Atcoderの問題を解いてみました。B - Maximum Difference

## ■Atcoder 問題文 B - Maximum Difference

・URL
https://atcoder.jp/contests/abc102/tasks/abc102_b

## ■ PL/SQL　コード
```plsql t_p.sql

CREATE OR REPLACE PROCEDURE TOSSY_TEST_005 (
    EL_NUM IN NUMBER,
    GET_NUM_01 IN NUMBER,
    GET_NUM_02 IN NUMBER,
    GET_NUM_03 IN NUMBER,
    GET_NUM_04 IN NUMBER
) IS
 /*
Atcoder 問題文 URL
HTTPS://ATCODER.JP/CONTESTS/ABC102/TASKS/ABC102_B
*/
 --- 配列の定義（char型）

 /* コメントアウト
    TYPE TAB IS
        TABLE OF VARCHAR2(20) INDEX BY PLS_INTEGER;
*/
 --- 配列の定義（number型）
    TYPE TAB_N IS
        TABLE OF NUMBER INDEX BY PLS_INTEGER;
 /*  コメントアウト
    TYPE TAB_NN IS
        TABLE OF NUMBER INDEX BY PLS_INTEGER;
*/
 ---    COL_TABLE TAB; --- char型配列
    NUM_TABLE TAB_N; --- number 配列
 ---    KKK_TABLE TAB_NN; --- number 配列
 --- 変数宣言
    ANS_NUM   NUMBER;
    TMP_NUM   NUMBER;
BEGIN
    NUM_TABLE (1) := GET_NUM_01;
    NUM_TABLE (2) := GET_NUM_02;
    NUM_TABLE (3) := GET_NUM_03;
    NUM_TABLE (4) := GET_NUM_04;
 /*  コメントアウト
	kkk_table(1) := GET_NUM_01;
    kkk_table(2) := GET_NUM_02;
    kkk_table(3) := GET_NUM_03;
    kkk_table(4) := GET_NUM_04;
*/
 --- 初期値セット
    ANS_NUM := ABS(NUM_TABLE(1)) - (NUM_TABLE(2));
    FOR I IN 1..EL_NUM - 1 LOOP
 --		DBMS_OUTPUT.PUT_LINE(TO_CHAR(I));
        FOR J IN 1..EL_NUM - 1 LOOP
 --- 同じ値はスキップする
            IF NUM_TABLE(I) = NUM_TABLE(J) THEN
                CONTINUE;
            ELSE
 --- 要素1 と 要素2 を引いて絶対値を ans_num に入れる
                TMP_NUM := ABS(NUM_TABLE(I) - NUM_TABLE(J));
            END IF;
            IF ANS_NUM < TMP_NUM THEN
                ANS_NUM := TMP_NUM;
            END IF;
        END LOOP;
        DBMS_OUTPUT.PUT_LINE(TO_CHAR(ANS_NUM)
                             || 'ans');
    END LOOP;
    DBMS_OUTPUT.PUT_LINE(TO_CHAR(ANS_NUM)
                         || ':::ansans');
END;
/

--- プロシージャ実行
EXEC TOSSY_TEST_005(4, 1, 4, 6, 3);

--- 出力結果
--- 5

```
ssh 公開鍵作る時のコメントに「何の?」鍵か自分で解るようにする😱

忘備録でお勧めせんが参考程度にw

想定環境変数はこれ等

USER=je3kmz
HOSTNAME=HOGEHOGE.example.nft
- - -
```shell:makekey
ssh-keygen -t ed25519 -C "`env TZ=JST-09 date '+%Y%m%d'`_`users`@`hostname`"
```

```text:結果
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGNKzCslkyqd07+V+/czxII2qLBmTYC/WbxQp9xJ4rxS 20231026_je3kmz@HOGEHOGE.example.nft
```
- - -
ssh-keygen のオプション説明
-t 鍵の種類 -> そこそこ新しめのん
-C コメント


当然じゃが、この鍵はどのホストにも使っちょらん✌
Dockerコンテナ上で動いているアプリのログローテーションを logrotate で実施する

# 目的

コンテナ上で動いているアプリが出力するログのローテーションを logrotate で実施する。

# 構成

※ アプリの実行バイナリは /app、出力されるログは /log/app.log とする

### ディレクトリ構造
```sh
.
├── Dockerfile
├── app
├── entrypoint.sh
└── logrotate.conf
```

### 各ファイル内容

```conf:logrotate.conf
/log/app.log # ログローテーション対象のファイル
{
    compress
    copytruncate
    daily
    dateext
    dateyesterday
    ifempty
    missingok
    noolddir
    dateformat .%Y%m%d
    rotate 90
}
```

ローテーションの設定なので内容は任意。
各設定値の意味は [こちらのページ](https://hackers-high.com/linux/man-jp-logrotate/) が man を日本語訳してくれています。

```sh:entrypoint.sh
#!/bin/sh
crond && /app
```

```Dockerfile:Dockerfile
FROM alpine:latest
COPY ./logrotate.conf /etc
COPY ./entrypoint.sh /
# tzdata は日本時間にするためなので任意
RUN apk --update-cache --no-cache add tzdata logrotate \
    && cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime \
    && apk del tzdata \
    && chmod 644 /etc/logrotate.conf \
    && chmod +x /entrypoint.sh /app
ENTRYPOINT ["/entrypoint.sh"]
```

### 備考

- Docker コンテナの apline では cron は初期状態では動いていないので明示的に起動する必要がある。
- Dockerfile の RUN はイメージ作成時に実行されるので RUN crond としても立ち上げたコンテナ上では cron は動いておらず、ENTRYPONIT (または CMD) で起動する必要がある。
- アプリと cron 両方を実行するため、entrypoint.sh を作成してその中で立ち上げを行っている。

# アプリを実行するコンテナとログローテーションを行うコンテナに分けるべきか？

1 コンテナ 1 プロセスと考えるとアプリを実行するコンテナと logrotate を実行するコンテナは分けたほうが良いのかも知れない。
ログをためておく用の volume を 1 つ定義し、各アプリが吐くログを全てその volume に集約して、その volume に対して logrotate を実行するコンテナを別途立てておくと良いかもしれない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/801825/236b2ec2-4308-c602-1db9-5f7387af305a.png)

- 別のアプリ実行コンテナ起動時はログ用 volume にログを吐くようにマウントする
- ログを確認するときはログ用 volume を見ればよい
- ログローテーションは logrotate 実行用コンテナに任せる
= アプリ内でログローテーションの設定を考える必要が無くなる

logrotate 実行用コンテナの例

```Dockerfile:Dockerfile
FROM alpine:latest
COPY ./logrotate.conf /etc
RUN apk --update-cache --no-cache add tzdata logrotate && \
    cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime && \
    apk del tzdata && \
    chmod 644 /etc/logrotate.conf
ENTRYPOINT ["crond", "-f"]
```

logrotate.conf を Dockerfile で COPY しているのでローテーションの設定を変更したいときはイメージの作り直しから必要（もしくはコンテナ内に直接入って修正する）。
docker-compose.yaml でバインドマウントすればコンテナを作り直すだけで済むかもしれないが、logrotate.conf のファイル権限周りが面倒なので素直に `docker compose down && docker compose up --build` した方が楽かも。
mvn azure-webapp:deploy で login with (AUTO): device code consumer is not configured の対応

# エラー内容

```log
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  19.430 s
[INFO] Finished at: 2023-10-26T15:12:13+09:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal com.microsoft.azure:azure-webapp-maven-plugin:2.12.0:deploy (default-cli) on project quarkus-hello-azure: login with (AUTO): device code consumer is not configured. -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
```

# 対応

普段 az cli を使ってる環境なら以下を `azure-maven-plugins` の configuration に追加する。 
```xml:pom.xml
<auth>
    <type>azure_cli</type>
</auth>
```

https://github.com/microsoft/azure-maven-plugins/wiki/Authentication#type
Pythonからc言語を通ってPnuplotに出力

自分自身が大苦戦したので、覚書。
vscodeを使用
gnuplotのimport機能を使用。
このサイトを参考にした。

https://sk.kuee.kyoto-u.ac.jp/person/yonezawa/contents/program/gnuplot/import.html

ビット数があっているのに、上のページに書いていエラーが出た。
対処、cdで\plugin　まで移動したら成功した。

pythonで定義した関数をcで出力
```python
y=str(y(x))
filename = f"ファイル.c"
with open(filename, mode="w") as f:
      f.write("y(x)=")
      f.write(y)
```

これで出力したｃ言語の数式を下のプログラムに入れ込む。
ただし、変数一つの場合。
```C
#include "gnuplot_plugin.h"
#include <math.h>
DLLEXPORT struct value dcdcy(int nargs, struct value *arg, void *p)
{
  double x = RVAL(arg[0]);
  struct value r;
  r.type = CMPLX;

  /* Enforce a match between the number of parameters declared
   * by the gnuplot import command and the number implemented here.
   */
  RETURN_ERROR_IF_WRONG_NARGS(r, nargs, 1);

  /* Sanity check on argument type */
  RETURN_ERROR_IF_NONNUMERIC(r, arg[0]);

  r.v.cmplx_val.real = "使用する数式";
  r.v.cmplx_val.imag = 0.0;

  return r;
}
```
dllにするために、ターミナルで実行
```
gcc -shared -o ”ファイル名”.dll ファイル名.c 
```
これで、importできるdllファイルが作成できた。
AWS rootのパスワード設定時の注意点

yumでインストールしたMariaDBには、デフォルトで「root」というユーザーでアクセスできるようになっていますが、パスワードは設定されていません。なので、パスワードを設定する必要があります。



## 「0」、または「!」から始まるpasswordは読み込んでくれないケースが多いので避けましょう！（例：「0001password」、「!password」など）
MediatekのI2C

以前レビューを出したのですが、いろいろ言われてあきらめたコードを復活させて見ました。

https://reviews.freebsd.org/D12736

以前はRT2880なターゲットで試していたのですが、調子が悪くRT3050でちょうど使っていないターゲットがあったので、それにしました。

このモジュールには未実装のI2CのEPROMのパターンがあります。

![写真（2023-10-26 13.50） #3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/8e17c790-a3e8-25eb-2993-c8669616f944.jpeg)

Flashと同じSOP 8ピンですが5,6ピンしか信号線が来ていないので、I2C EPROMなことが分かります。

ZRouterにmk,dtsファイルを用意してビルドしてみます。

ターゲットにFTDIモジュールで接続してu-bootに入ります。

RT3050の初期の頃の製品なので、u-bootが出来が悪いです。

またターゲットはEthernet Switchが壊れているみたいで、1ポートしかリンクアップしません。Hardoffで324円で買ったものなので、しかたありません。RT3050なモジュールは故障が多いのですが、この壊れ方は初めてです。

生きているポートを使いu-bootでイメージを焼いて起動しました。

https://dmesgd.nycbug.org/index.cgi?do=view&id=7362

LPC810のPSGチップをつないでi2cコマンドを実行してみます。

```
# i2c -s
Scanning I2C devices on /dev/iic0: 50 51 
```

~~このターゲットはflashが4Mなのでmrubyが入れられません。どうしよう。。。~~ ぎりぎり入りました。

実はこのターゲットの前に蟹さんのRTL8366RBにI2C接続してモジュールで試したのですが、もともとgpioiicで動かしていたのですが、このドライバーに変えるとプローブがうまくいかなくなるのであきらめました。

こんな風になりました。

![IMG_20231028_080952.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/8ec02b41-61ae-c0a1-3df0-152b12f58a42.jpeg)

Aitendoの基板にNXPのブリッジを乗せたのですが、基板が変な蛇の目ではまりました。

このモジュールはほどなく起動しなくなり、同じモデルのストックがあったので、代えました。
SqlAlchemy  のAsync でデータのカウントをする時

##　概要 
Sqlalchemy を使っている時に、データのカウントをしたい時、
さらにデータをフィルター(where句）をつけてカウントしたい時はこう書く、というのを忘れないように書いておきます。


## where句を使わずに全件カウントする時

```python
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.engine import Result
from sqlalchemy import select
from sqlalchemy.orm import joinedload
from sqlalchemy.sql.expression import func

result: Result = await db.execute(func.count(log_model.Log.id))
logs = result.scalar()
```


## where句を使う時

```python
user_counts_client = await db.scalar(
    select(func.count())
    .select_from(user_model.User)
    .filter(user_model.User.role == "client")
)
```


以上です。
rails   accepts_nested_attributes_forメソッドを使用して、子情報を追加していく際、追加の度に情報番号を足していく方法

まず、私の使用したバージョンは以下です
```
ruby 3.2.2
rails 6.1.7.6
```


スクールの課題で、編集を一度クリックすると
![スクリーンショット 2023-10-26 11.55.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3566175/ea066efd-8c16-acb2-d7b9-78c5d21266fb.png)
![スクリーンショット 2023-10-26 11.54.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3566175/a34bf54a-c051-5019-f197-30a6e1709fa5.png)
というように、「最寄駅１」部分「最寄駅２」部分と出て、一度一覧画面に戻り、再度編集をクリックすると、
![スクリーンショット 2023-10-26 11.57.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3566175/ad497f5e-565b-544d-515c-1b53551067fd.png)
「最寄駅３」部分が増える、という実装をaccepts_nested_attributes_forメソッドを使用して実装したけど、この「最寄駅+数字」の部分の実装の案が思い浮かばず、メンターさんに教えてもらったことがとても面白かったので、備忘録として書き残しておきます。

尚、実際に実装したコードは以下で、

```
<%= form_with(model: @appartment, local: true  ) do |form| %>

  <div class="appartment_content">
    <div>
    <%= form.label :物件名 %>
    <%= form.text_field :name %>
    </div>
    <p>
    <%= form.label :賃料 %>
    <%= form.text_field :price %>
    </p>
    <p>
    <%= form.label :住所 %>
    <%= form.text_field :address %>
    </p>
    <p>
    <%= form.label :築年数 %>
    <%= form.text_field :age %>
    </p>
    <p>
    <%= form.label :備考 %>
    <%= form.text_field :remarks %>
    </p>
  </div>
<p>------------------------------------------------------------------------</p>
  
    <%= form.fields_for :stations do |stations_form| %>
        <p>
        <%= "最寄駅#{stations_form.index + 1}" %>
        </p>
        <p>
        <%= stations_form.label :路線 %>
        <%= stations_form.text_field :route %>
        </p>
        <p>
        <%= stations_form.label :駅名 %>
        <%= stations_form.text_field :station_name %>
        </p>
        <p>
        <%= stations_form.label :徒歩分数 %>
        <%= stations_form.text_field :time %>
        </p>
    <% end %>
  <%= form.submit %>
<% end %>

<%= link_to "一覧画面にもどる", appartments_path %>

```
```
<%= "最寄駅#{stations_form.index + 1}" %>
```
の部分が、「最寄駅+数字」部分にあたります。

では、なぜこれで数字を示せるのか？
index、って何も定義したりしてないのに、どこから引っ張ってきたのか？
```
<%= form.fields_for :stations do |stations_form| %>
```
と
```
<%= "最寄駅#{stations_form.index + 1}" %>
```
の間に、binding.irbを入れて試してみる！
![スクリーンショット 2023-10-26 13.31.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3566175/13696b0f-211d-e779-27b3-c061ec0dba93.png)

そして、「stations_form」の中に何が入っているかを試してみる！
![スクリーンショット 2023-10-26 13.30.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3566175/d803337d-c6fa-93d4-2d66-8ed831bc8ac6.png)

すると、「@index = 0」というように、こちらが何もしないでも、自動的に番号をつけてくれている！！

そのため、「stations_form.index + 1」とすることで表現することができる！

初学者の私にとっては、とても新鮮な方法だったので、面白かったので記事にしました！
soracom napterでscpコマンドを使い、ファイルを送受信する時のメモ

# 概要

作業時の備忘録です。普通に考えれば当たり前の内容ですが、やった時10分くらい詰まったのでメモ。

やりたかったこと
* SORACOM Napterで接続したデバイスで, GithubとSSHでリポジトリにアクセスしたかった
* デバイス上でssh-keygenしたが、Githubに公開鍵を設定する方法をブラウザ上で記載する以外に知らなかった
* sshが使えるのだからscpも使えるはずなので、公開鍵をローカルマシンに送信し、自分のアカウントに公開鍵を設定したい。

詰まったこと
* scpコマンドをSORACOM Napterの情報に対して、どのように実行するのか。

## メモ

以下のコマンドでデータ移動。今回は接続先のファイルをローカルマシンに送信することを想定。

A,B,C, D, Eは以下に記載されている内容を入れる。
`scp -P A(※1) B@C:D E`

sshは小文字のpでポート指定するが、scpでは大文字のPで指定する。

A: リモートオンデマンドに記載されてるポート番号(下の画像の青枠矩形に記載されている)
B: 接続先ユーザー名(任意)
C: 接続先ホスト(SORACOMのリモートオンデマンドに記載されている情報, 下の画像の赤枠矩形に記載されている。)
D: コピー元のファイルパス(ローカルに送信したいファイルが存在するパス)
E: コピー先のファイルパス(ファイルをコピーしたいパス)

![指定情報記載画像.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442116/1c4477da-1d78-631c-c9bf-98b91391a9e9.png)


## 例(something_file.txtをローカルのDocumentsフォルダで受け取る)

`scp -P 12345 user@xx-xxx-xxx-xxx.napter.soracom.io:/home/user/something_file.txt ~/Documents/`
材料力学_(1)_1軸引張「傾斜断面の応力」をsympyでやってみたい。

・**記事タイトル変更予定です。**
・間違いをご指摘いただけると幸いです。勉強中です。

# ネット
・[「材料力学演習(20221021)一括(ver.3.3).pdf」第5章　組み合わせ応力(129頁〜154頁,P134〜159)](http://zairikiweb.starfree.jp/zai_enshuh/zai_enshuh_ver.3.3.pdf#page=134)
？？？タブレットだと、開く事ができないかもしれません。

「材料力学演習(20221021)一括(ver.3.3)」を勉強したい。＞sympy
https://qiita.com/mrrclb48z/items/c3274daf5f7a99cfe027#%E4%BD%9C%E6%A5%AD%E4%B8%AD%E7%A7%81%E3%81%AE%E8%A7%A3%E7%AD%94sympy

# 文献
・[材料力学 (JSMEテキストシリーズ) 大型本 – 2007/8/30
](https://www.amazon.co.jp/%E6%9D%90%E6%96%99%E5%8A%9B%E5%AD%A6-JSME%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E6%97%A5%E6%9C%AC%E6%A9%9F%E6%A2%B0%E5%AD%A6%E4%BC%9A/dp/4888981582/ref=cm_cr_arp_d_product_top?ie=UTF8)
・[JSMEテキストシリーズ　材料力学
](http://shop.jsme.or.jp/shopdetail/000000000037/jsmetext/page1/recommend/)
発行日：2007年8月
体裁：A4判/並製/2色刷り/208頁
[目次(p2)](https://gigaplus.makeshop.jp/jsmebooks/contents/5554_contents.pdf#page=2)

・[演習材料力学 (JSMEテキストシリーズ) 大型本 – 2010/11/1](https://www.amazon.co.jp/%E6%BC%94%E7%BF%92%E6%9D%90%E6%96%99%E5%8A%9B%E5%AD%A6-JSME%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E6%97%A5%E6%9C%AC%E6%A9%9F%E6%A2%B0%E5%AD%A6%E4%BC%9A/dp/4888981981/ref=pd_rhf_d_dp_s_pd_sbs_rvi_sccl_1_2/358-0144100-5604454?pd_rd_w=KczBx&content-id=amzn1.sym.b363659c-eda3-40b5-acc5-87d7776d0029&pf_rd_p=b363659c-eda3-40b5-acc5-87d7776d0029&pf_rd_r=ZRM42Q4RSH9T54XFE54R&pd_rd_wg=223mv&pd_rd_r=2fd3812a-13bf-43d3-8780-57b00ed00d11&pd_rd_i=4888981981&psc=1)


# Mathematicaで
勉強中

# sympyで
```python
# 8.2(1) ＜ 材料力学 (JSMEテキストシリーズ) 大型本 – 2007/8/30
# ver0.1
from sympy import *
var('A,A0,σ,σx,θ,τ',real=True)
from sympy.simplify.fu import TR7
from sympy.simplify.fu import TR11
eq82a=Eq(A*σ*cos(θ)-A*τ*sin(θ)-A0*σx,0)
eq82b=Eq(A*σ*sin(θ)+A*τ*cos(θ),0)
eq83 =Eq(A  *cos(θ),A0)
sol  =solve([eq82a,eq82b,eq83],[σ,τ,A0])
σ=sol[σ].simplify()
τ=sol[τ].simplify()
myInterval=Interval.Lopen(0,pi/2)
τ_max=maximum(τ/(-σx)            ,θ,myInterval)
θ_max=solveset(Eq(τ/(-σx),τ_max),θ,myInterval).args[0]*180/pi
print("#(8.4)<8.15> σ= ",factor(TR7(σ)),     "= ",    σ )    
print("#(8.4)<8.15> τ= " ,           τ ,4*" ","=",TR11(τ))    
print("#            θ= ",θ_max )   
#(8.4)<8.15> σ=  σx*(cos(2*θ) + 1)/2 =  σx*cos(θ)**2
#(8.4)<8.15> τ=  -σx*sin(2*θ)/2      = -σx*sin(θ)*cos(θ)
#            θ=  45
```
モール円
作図の勉強中

# 参考

https://www.google.com/search?q=%E4%B8%80%E8%BB%B8%E5%BC%95%E5%BC%B5&rlz=1CAUHAM_enJP1038JP1038&oq=%E4%B8%80%E8%BB%B8%E5%BC%95%E5%BC%B5%E3%82%8A&gs_lcrp=EgZjaHJvbWUqCwgCEAAYBBglGIAEMgYIABBFGDkyCwgBEAAYBBglGIAEMgsIAhAAGAQYJRiABDILCAMQABgEGCUYgAQyCwgEEAAYBBglGIAE0gEJMTYyOTdqMGo3qAIAsAIA&sourceid=chrome&ie=UTF-8

https://qiita.com/mrrclb48z/items/f1a3cbb772930adb16e6
【xarray】形状を引き継いだ新しい配列を作る③ (full_like)

この記事では、以下のライブラリを用いる。
```Python
import xarray as xr
```

# xr.full_like()
`xarray`の関数`full_like()`を使うと、任意の`DataArray`の形状を引き継いだ新しい`DataArray`を作ることができる。`zeros_like()`や`ones_like()`とは異なり、埋める値を指定することができる。

次の`DataArray`を例として説明する。
```Python
array = xr.DataArray([[0,1,2],[3,4,5]], dims=['x','y'], coords={'x': [0,1], 'y': [0,1,2]})
array
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552468/49705f9f-0af2-23e2-317f-63ea8790c1ff.png)


## 基本の使い方
`full_like()`の第1引数に`DataArray`を、第2引数に埋める値を指定する。
```Python
xr.full_like(array, 100)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552468/468d8bc3-6758-b793-adcb-5a8bcf83bb78.png)


## dtypeを指定する
値の型によっては、思い通りの値で埋まらない場合がある。
```Python
xr.full_like(array, 100.5) # 100.5で埋めたいのに100で埋まってしまう
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552468/468d8bc3-6758-b793-adcb-5a8bcf83bb78.png)

その場合は、`dtype`を指定して値の型を変えればよい。

```Python
xr.full_like(array, 100.5, dtype='double')
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552468/38bfb57c-9532-815e-d104-522bcdc0cb34.png)


# 似た機能を持つ関数
`zeros_like()`は`0`で埋める。

https://qiita.com/nonin/items/244ef54f9fa17f256894

`ones_like()`は`1`で埋める。

https://qiita.com/nonin/items/571bde1f31a61d9d2d56



# 公式ドキュメント

https://docs.xarray.dev/en/stable/generated/xarray.full_like.html
【xarray】形状を引き継いだ新しい配列を作る② (ones_like)

この記事では、以下のライブラリを用いる。
```Python
import xarray as xr
```

# xr.ones_like()
`xarray`の関数`ones_like()`を使うと、任意の`DataArray`の形状を引き継いだ新しい`DataArray`を作ることができる。値は`1`で埋められる。

次の`DataArray`を例として説明する。
```Python
array = xr.DataArray([[0,1,2],[3,4,5]], dims=['x','y'], coords={'x': [0,1], 'y': [0,1,2]})
array
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552468/49705f9f-0af2-23e2-317f-63ea8790c1ff.png)


## 使い方
```Python
xr.ones_like(array)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552468/932ee68d-968e-7ffc-4468-c4e7b8f931dd.png)


# 似た機能を持つ関数
`zeros_like()`は`0`で埋める。

https://qiita.com/nonin/items/244ef54f9fa17f256894

`full_like()`は指定した値で埋める。

https://qiita.com/nonin/items/ba7a7606f62816ecc8b6


# 公式ドキュメント

https://docs.xarray.dev/en/stable/generated/xarray.ones_like.html
【xarray】形状を引き継いだ新しい配列を作る① (zeros_like)

この記事では、以下のライブラリを用いる。
```Python
import xarray as xr
```

# xr.zeros_like()
`xarray`の関数`zeros_like()`を使うと、任意の`DataArray`の形状を引き継いだ新しい`DataArray`を作ることができる。値は`0`で埋められる。

次の`DataArray`を例として説明する。
```Python
array = xr.DataArray([[0,1,2],[3,4,5]], dims=['x','y'], coords={'x': [0,1], 'y': [0,1,2]})
array
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552468/49705f9f-0af2-23e2-317f-63ea8790c1ff.png)


## 使い方
```Python
xr.zeros_like(array)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552468/716c58d4-5e44-bd2a-83b0-8bb19ee09ebe.png)


# 似た機能を持つ関数
`ones_like()`は`1`で埋める。

https://qiita.com/nonin/items/571bde1f31a61d9d2d56

`full_like()`は指定した値で埋める。

https://qiita.com/nonin/items/ba7a7606f62816ecc8b6

# 公式ドキュメント

https://docs.xarray.dev/en/stable/generated/xarray.zeros_like.html
エラー「jakarta.servlet.ServletException: java.lang.NoClassDefFoundError: javax/servlet/jsp/tagext/TagLibraryValidator」

# はじめに
Tomcat10.1で画面を表示しようとしたときに↓のエラーが出たときの解決策をメモしておく。
`jakarta.servlet.ServletException: java.lang.NoClassDefFoundError: javax/servlet/jsp/tagext/TagLibraryValidator`
![タイトルなし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526202/a0340e79-8b79-9de3-62a1-6ea7b816c0f4.png)


## 前提
- JSTLを使ったシステムにアクセスしてエラーが出た方

## NG
古いネットの記事とかだとJSTLのJARは↓から取得するように書いてあるけど、Java 11以降に対応していない。

- [JSTL API](https://mvnrepository.com/artifact/javax.servlet.jsp.jstl/jstl-api/1.2)
- [JSTL 実装](https://mvnrepository.com/artifact/org.glassfish.web/jstl-impl/1.2)

# 解決策
こっちから取得する。

- [JSTL API](https://mvnrepository.com/artifact/jakarta.servlet.jsp.jstl/jakarta.servlet.jsp.jstl-api/2.0.0)

- [JSTL 実装](https://mvnrepository.com/artifact/org.glassfish.web/jakarta.servlet.jsp.jstl/2.0.0)

## 補足
Java 8から「JavaEE」から「JakartaEE」に名称が変更となりましたが、Tomacat10.1はJava 11以降に対応しているため、Tomcat10.1を使う方は必要に応じて読み替えてあげる必要があるようです。
【Flutter】overflowではみ出した文字を隠す

こんにちは！
過ごしやすい季節になりましたね:relaxed:

今回は、引数「overflow」を使って、Textのはみ出した文字を隠します。
flutter初心者の方に読んでいただきたい記事です:ok_hand_tone1:

「overflow」には３つの種類があります。
- TextOverflow.clip : はみ出した文字は隠す
- TextOverflow.ellipse : はみ出した文字を「・・・」で隠す
- TextOverflow.fade : はみ出した文字をフェードで隠す

# 使用例
```dart:dart
import 'package:flutter/material.dart';

void main() {
  runApp(const MaterialApp(home: MainApp()));
}

class MainApp extends StatefulWidget {
  const MainApp({super.key});

  @override
  State<MainApp> createState() => _MainAppState();
}

class _MainAppState extends State<MainApp> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(title: const Text("Textのはみ出した文字を隠す")),
        body: Center(
          child: Column(
            children: [
              Container(
                color: Colors.pink,
                width: 100,
                height: 30,
                child: const Text(
                  'Hello,Flutter',
                  overflow: TextOverflow.clip,
                  style: TextStyle(fontSize: 24),
                ),
              ),
              Container(
                color: Colors.yellow,
                width: 100,
                height: 30,
                child: const Text(
                  'Hello,Flutter',
                  overflow: TextOverflow.ellipsis,
                  style: TextStyle(fontSize: 24),
                ),
              ),
              Container(
                color: Colors.purple,
                width: 100,
                height: 30,
                child: const Text(
                  'ハロー、フラッター',
                  overflow: TextOverflow.fade,
                  style: TextStyle(fontSize: 24),
                ),
              ),
            ],
          ),
        ));
  }
}

```
# 実行例
![スクリーンショット 2023-10-26 12.53.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524120/5eeb3c14-4067-79be-8476-7746f651c298.png)

紫のContainer部分が見づらくてすみません:cry:


# 最後に
ここまで読んでいただき、ありがとうございました！
いいねをくれると、スキップしながら喜びます:tomato:
Xcode15でRxRealmのビルドが通らない問題に対しての暫定的な対応

概要
==
RxRealmを導入しているプロジェクトをXcode15でビルドするための暫定的な対応を行なった。
注意としてはあくまでただ単にビルドを通したいという暫定的な対応のためバグの発生など起こる可能性があるということである。

何が起きたか
==
Xcode14でビルドされている約１年前のプロジェクトをXcode15でビルドしようとしたときにエラーが発生する。

```
/Pods/RxRealm/Sources/RxRealm/RxRealm.swift:269:52 Cannot convert return expression of type 'Observable<Element>' to return type 'Observable<(Realm, Realm.Notification)>'
/Pods/RxRealm/Sources/RxRealm/RxRealm.swift:554:29 Cannot convert value of type 'PropertyChange' to expected argument type 'Element'
```
こういったようなエラーが複数出てしまいビルドすることができない。

しかも
https://github.com/RxSwiftCommunity/RxRealm
RxRealmは2023年10月現在では、version5.0.5で2022年9月に更新を最後に更新が止まってしまっている。

対応方法
==

さまざまgithubのissueなどを辿ってみるとどうやらこのプロジェクトをフォークして対応してくれているリボジトリを発見したのでそちらを利用するようにしてみる

https://github.com/wilico/RxRealm/tree/bugfix/xcode15

Podfileの内容を書き換える

```
  pod 'RxRealm', :git => 'https://github.com/wilico/RxRealm.git', :branch => 'bugfix/xcode15'
```

これでpod updateでビルドが通るようになる

どういった変更内容になっているかコミットログを見てみるとさまざま変更はあるものの、ほぼ
`
Observable -> RxSwift.Observable
`
の変更のみであった
Observableという名前がコンフリクトをしてしまっていたという問題のようであった

https://github.com/wilico/RxRealm/pull/1
こちらのプルリクエストメッセージにある通り、いずれ本家で対応が完了した時点でこのリポジトリは削除されてしまうので、本家の対応が終わったらすぐに戻さないといけない。
position:stickyが効かなかった話

webサイトを制作していたときstickyがうまく機能しなくて少し困ったので備忘録用に共有します。

# 失敗した原因
stickyに設定したclassもしくはタグに、topの記述をしていない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584440/57e83271-990a-6cf7-06d2-0a7c1988d9ae.png)

表示（失敗ver）

![スクリーンショット 2023-10-26 122817.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584440/99fcf62a-4b1a-9df3-b6ee-e7a7a859d46a.png)


# 正しい記述
先ほどのプログラムにtopとleftを追加してあげる（leftはなくても動くが念のために記述）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584440/bef202ac-3f06-95f3-fc88-42106b75f157.png)

表示（成功ver）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584440/c8daf169-3d25-2062-bee1-0c80165ba329.png)

今回から学ぶ教訓
positionを指定したらtopとleftの記述をする！！

以上！！