OmniAICreator/Qiita-1.07M huggingface dataset:
【VSCode】アクティビティバーの表示位置を変更する

サイドバーで右クリックし、「アクティビティバーの位置」から表示位置を変更できます。

![スクリーンショット 2024-06-05 23.57.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/88a60403-0496-37ae-9be5-9543fcf5b142.png)

![activity_bar_position.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/4bfee97f-0dee-7ac8-3456-b6979f0e09ff.gif)
ビルドエラー解決方法 ‘DT_TOOLCHAIN_DIR cannot be used to evaluate LIBRARY_SEARCH_PATHS, use TOOLCHAIN_DIR instead’

環境
Xcode15.2.0


```
‘DT_TOOLCHAIN_DIR cannot be used to evaluate LIBRARY_SEARCH_PATHS, use TOOLCHAIN_DIR instead’
```

Xcodeのバージョンを上げてアプリをビルドする際に上記ビルドエラーが発生しましたのでメモ｡


## 解決方法
ターミナルで対象アプリのディレクトリに移動します｡
以下コマンドを実行します｡

CocoaPodsのバージョンを確認して､Homebrewでアップデートします｡

```
pod --version
brew upgrade cocoapods
pod --version
```

Podsディレクトリを削除して､再度pod installします｡
```
rm -rf Pods
pod install
```

## 参考
https://blog.landhighest.com/article/179
なんでも黒くしたい君へ

# はじめに
昨今、各アプリではダークモードの導入が進み、なんでも黒くしたい君はさぞ満足していることだろう。

しかし、まだ物足りないと思っているんじゃないか？

そう、各ウェブサイトだ。
ウェブサイトはダークモードの導入が圧倒的に遅れている。

もし君がChrome、もしくはChromiumベースのブラウザ（今話題のArc等）を使っているなら、ダークモード未対応のサイトもすべて黒に染め上げてしまおう。

# 手順
![スクリーンショット 2024-06-05 23.40.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240483/314b0d1c-fd26-637a-7320-32c7c5733e14.png)

1. アドレスバーに [chrome://flags](chrome://flags) と入力
1. Search flagsに `dark` と入力
1. Auto Dark Mode for Web Contentsの項目をいずれかの `Enabled` に変更
`Enabled ~` から始まる項目全てが黒への入口だが、挙動が異なる。
私のおすすめは `Enabled with selective inversion of non-image elements`
1. 画面下に現れるRelaunchボタンを押下
1. Enjoy

# 注意点
大前提として、chrome://flagsにある設定は画面に書かれている通り、あくまで実験的な機能、自己責任で。

また、サイトによっては文字が見えなくなったりするので要注意。
背景に白っぽい画像が設定されていると起こりやすい。
今どき背景を画像で埋めてるようなサイトは少ないと思うが、阿部寛さんのホームページは…

# 参考文献（？）
- [chrome://flags](chrome://flags)
PlasmoでMUIとTailwindCSSを共存させる

ブラウザ拡張機能を作れるReactフレームワークPlasmoにて、MUIとTailwindCSSを共存させる方法が調べてもどこにもなかったのでここに残しておく。

[plasmo公式のTailwindCSSスタートガイド](https://docs.plasmo.com/quickstarts/with-tailwindcss)を参照すると、以下のようなstyle要素を返すメソッドを定義する記述がある。
TailwindCSS単体であればこれで十分だが、MUIを併用させるためにはこれだけでは不十分。
```tsx
export const getStyle = () => {
  const style = document.createElement("style")
  style.textContent = cssText
  return style
}
```
MUIを使用するためには、以下のような記述が必要になる。

```tsx
const styleElement = document.createElement("style")

const styleCache = createCache({
  key: "plasmo-mui-cache",
  prepend: true,
  container: styleElement
});

export const getStyle = () => styleElement;

const MuiThemedContent = () => (
  <CacheProvider value={styleCache}>
    {...children}
  </CacheProvider>
);
```
Plasmoでこれら両方を使うためには、getStyleで返すstyle要素にMUIのものとTailwindCSSのもの2つをマージしたものを返す必要がある。そのため、以下のように記述する。
```tsx
import cssText from "data-text:~style.css";
const styleElement = document.createElement("style")

const styleCache = createCache({
  key: "plasmo-mui-cache",
  prepend: true,
  container: styleElement
});

export const getStyle = () => {
  const tailwindCSSStyle = document.createElement("style");
  tailwindCSSStyle.textContent = cssText;
  styleElement.appendChild(tailwindCSSStyle);
  return styleElement;
};

const MuiThemedContent = () => (
  <CacheProvider value={styleCache}>
    {...children}
  </CacheProvider>
);
```

これでTailwindCSSとMUIが同時に使えるようになる。
内部としては、ShadowDOM内のStyle要素にCSSの記述を固めているため、その部分をマージした形になっている。
未経験でIoT系研究開発職に転職した人の学習記録 #1

<h2>所感</h2>

昨日初投稿しましたが、稚拙な内容ながら300pv近くいただきました。
Qiitaというプラットフォームの巨大さを実感するとともに、こんな個人的な記事でサイトの一部を構成してしまっていることを申し訳なく思います。
本当に申し訳なく思い個人ブログに移行することも考えましたが、おそらく継続が困難になるだけですし、コミュニティガイドラインで禁止されているわけでもなさそうでしたので、しばらくはこの形態のまま続けます。
もしかするとある程度進んだところで振り返りがてら記事を圧縮して一つにまとめたり、下書き保存で書き溜めて、週一で投稿なんて形にするかもです。

あ、あとタグをたくさんつけると迷惑になりそうなので、基本は"未経験エンジニア"と"初心者"だけにします。
同じような境遇の方と切磋琢磨していければほんの少し意義が生まれるかなと。
他には、書籍の学習内容だけでなく、業務中に学んだ内容（当然守秘義務ではなく誰でもアクセスできる一般的な内容）もシェアしていこうかなと思います。

ところで、本日Qiitaで面白い記事を読ませていただきました。
https://qiita.com/ryoheiiwamoto/items/9e46742ef2456d1640b8
私の目標1日1項なんてのが恥ずかしくなる内容でしたが、本当にこちらの記事に書かれている通りだと思います。
ただ私がこのような取り組み方をすると早々に離脱してしまうこと必至ですので自分のペースで習慣化していきます。


<h2>本日の学習記録</h2>
1-2:C言語のプログラム構成<br>
1-3:プログラムの作成と実行<br>
　VisualStudioのインストールとHelloWorld。

<h2>課題図書以外で得た知識</h2>
めちゃくちゃビビりながら初めてGitLabにPushしたので手順をメモ
<br>

<h3>手順要約</h3>
前提：オリジナルのリポジトリをローカルディレクトリにクローンし、クローンデータを改修してオリジナルから変化点がある状態。VSCodeのターミナルで下記操作を実施。

・「git status」で変更を加えたファイルがどのエリアにいるかを確認

・「git add .」でディレクトリ配下の変更があるファイルを作業ツリーからステージングエリアにステージング<br>
（「git add ファイル名orフォルダ名」でも可）

・「git status」でステージングできたことを確認

・「git commit -m "分かりやすいメッセージ"」でステージングエリアに追加したファイルをローカルリポジトリにコミットする。<br>このとき”わかりやすいメッセージ”に記入した内容がPushしたときのタイトル？になる。

・「git status」でコミットできたことを確認

・「git push origin ブランチ名」でローカルリポジトリのファイルをリモートリポジトリに反映する。<br>
　※ブランチ名にID？は含めなくてOK。例えば「hogehoge_hoge 123456789」ではなく「hogehoge_hoge」で良い。
 
 
 
 
 
 
<h3>■Gitを理解する上で必ず押さえておくべき内容</h3>
下記サイトの図がめっちゃ分かりやすい。

<https://itcweb.cc.affrc.go.jp/affrit/documents/guide/gitlab/start> 

4つのエリアの関係性を覚えなければいけない。

【GitLabサーバ】
　・リモートリポジトリ

【ワーキンディレクトリ】
　・ローカルリポジトリ
　・ステージングエリア
　・作業ツリー
JRE (Java ランタイム環境) とは

# はじめに
今までjavaプログラムはJVMを用いてどんなOS環境下でも実行可能になっている程度の理解しかありませんでした。JREというワードが現場で出て、何ぞやと思い、改めてjavaプログラムの実行について学習し直してみました。


# 目次
- JRE(Javaランタイム環境)とは何か
    - JDKとは
    - JVMとは
- 結局、JRE、JDK、JVMの違いって何？ 
- JREの仕組み
- まとめ

# JRE(Javaランタイム環境)とは何か
Java Runtime Environment (JRE) は、Java プログラムを正しく実行するために必要なソフトウェアで、JavaプログラムとOSの間で通信する基盤となるソフトウェアです。
ソフトウェアプログラムには、メモリへのアクセスやプログラムファイル、依存関係など他のシステムリソースへのアクセスを提供するランタイム環境が必要です。以前は、ほとんどのソフトウェアがOSを直接実行環境として使用していました。しかし、これでは、開発者はアプリケーションを実行させたいOSごとに異なるソースコードを書かなければならないことになります。この問題を解決するために生まれたのが、Java ランタイム環境 (JRE) 技術です。

Javaコードと、ライブラリを結合し、最終的にJavaプログラムを実行するJVMインスタンス、またはローカルコピーを作成します。
作成したJVMは複数のOSで利用可能で、もしくはすべての種類のJVMで動作するJavaコードのコピーを1つ生成します。このように、JRE は、Javaアプリケーションを一度記述すれば、どこでも実行できるようにしているようです。

Javaプログラムを開発し実行するためには、Javaランタイム環境（JRE）の他にJava開発キット (JDK) と Java仮想マシン (JVM) を含めた3つのコンポーネントが必要です。

## JDKとは
JDK は、Java アプリケーションの開発に使用できるソフトウェアツールの集合体です。JDK をダウンロードし、インストールすることで、開発環境に JDK をセットアップすることができます。使用する Java のバージョンに合った JDK ソフトウェアのバージョンを選択することができます。例えば、Java Standard Edition、または Java SE を使用する場合は、Java SE JDK が必要です。

## JVMとは
JVM は、Java プログラムを 1 行ずつ実行するソフトウェアです。開発者は、Java アプリケーションの実行時に、プログラムリソースを管理するために JVMの設定を行います。例えば、JVMのメモリ設定を変更し、Java アプリケーションが実行時に使用する内部メモリの量を確認することなどもできるようです。

# 結局、JRE、JDK、JVMの違いって何？
JDKは、JRE の上位に位置するソフトウェア層で、コンパイラやデバッガなど、ソフトウェア開発環境によくあるツールを含んでいます。JDKでは、英語のような構文でコードを記述し、それをコンパイルしてバイトコードをJRE に渡しているそうです。一方、JREには、クラスライブラリ、サポートファイル、JVMが含まれています。これらのソフトウェアコンポーネントを使用して、あらゆるデバイスでバイトコードを実行しているそうです。

# JREの仕組み
ランタイム環境は以下3つのコンポーネントを使用して動作しているようです。
- ClassLoader
- バイトコードベリファイア
- インタプリタ
ここでは詳しくは記載しませんが、気になる方は以下の記事をご覧ください。
[JRE の仕組みは?](https://aws.amazon.com/jp/what-is/java-runtime-environment/#:~:text=%E5%AE%9F%E8%A1%8C%E3%81%97%E3%81%BE%E3%81%99%E3%80%82-,JRE%20%E3%81%AE%E4%BB%95%E7%B5%84%E3%81%BF%E3%81%AF%3F,Java%20%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%20JVM%20%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E3%82%92%E4%BD%9C%E6%88%90%E3%81%97%E3%81%BE%E3%81%99%E3%80%82,-JRE%20%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88)

＃ まとめ
今回javaプログラムを作成している中で成果物としてアーキテクチャを整理する中で、改めてjavaプログラムの実行がどんな仕組みで行われているのかをまとめてみました。
まだ理解が浅いところもあると思おうので、コメントなどでご指摘いただけると助かります。
長くなりましたが、ここまで読んでいただきありがとうございました！
[今回参考にしたサイト](https://aws.amazon.com/jp/what-is/java-runtime-environment/#:~:text=Java%2520Runtime%2520Environment%2520(JRE)%2520%E3%81%AF,%E5%BC%B7%E5%8C%96%E3%81%99%E3%82%8B%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E8%A8%80%E8%AA%9E%E3%81%A7%E3%81%99%25E3%2580%2582)
Django REST frameworkのAPI画面からcount, next, previousを消去したい

# 問題背景
Django REST Framework（DRF）を使用してWebアプリを開発する際に，DRFのAPIからデータを取得して画面に表示したかったが，以下のようにAPI画面内に`count`, `next`, `previous`が表示されていて，`results`内のデータを思うように取得できないことがありました．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803443/9b19f1e2-0249-9e43-6411-4cb88703a7af.png)

DRFについて書かれている他のWebページでは，この３つは基本的に表示されていなかったので，データ取得の方法を真似しても上手くいかないものばかりでした．そこで，`count`, `next`, `previous`を消去する方法を調べて実践してみると，３つとも表示されなくなり，データも取得できたので，今回はそのメモ代わりとして記事を書きます．同じような状況にいる方々の助けになれば幸いです．

# 開発環境
- python: 3.10.14
- Django: 4.2

以下はディレクトリ構造
```
smart_django
├── app/
│   ├── ...
│   ├── template/
│   │   └── index.html
│   ├── admin.py
│   ├── models.py
│   ├── serializers.py
│   ├── urls.py
│   └── views.py
├── smart_django/
│   ├── ...
│   ├── asgi.py
│   ├── setting.py
│   ├── urls.py
│   └── wsgi.py
└── manage.py
```

# 解決方法
端的に言うと，DRFで元々定義されている`get_paginated_response`メソッドをオーバーライドする必要があります．このメソッドはPaginationクラス内で以下のように定義されています．
```py
class Pagination(pagination.PageNumberPagination):
    def get_paginated_response(self, data):
        return Response({
            'links': {
                'next': self.get_next_link(),
                'previous': self.get_previous_link()
            },
            'count': self.page.paginator.count,
            'results': data
        })
```
このメソッドを`data`だけ返すようにオーバーライドしてあげると，`results`以外の項目が表示されなくなります．
具体的な方法としては，Django内の任意のファイル内（`setting.py`と同じディレクトリ下だと後が楽かも)に`get_paginated_response`を定義します．今回私は`ulrs.py`内で以下のように定義しました．
```py:ulrs.py
from rest_framework.response import Response
from rest_framework.pagination import PageNumberPagination

class PageNumberPaginationDataOnly(PageNumberPagination):
    def get_paginated_response(self, data):
        return Response(data)
```
そのあとは以下のように`setting.py`内の`DEFAULT_PAGINATION_CLASS`にオーバーライドを行なったファイルのパスを与えます．
```py:setting.py
REST_FRAMEWORK = {
    'PAGE_SIZE' : 20,
    'DEFAULT_PAGINATION_CLASS': 'smart_django.urls.PageNumberPaginationDataOnly'
}
```


これで作業は完了です！API画面を確認してみると，`results`以外は表示されていない状態になっています．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803443/28477d82-246a-0272-3db8-ca4239d2f2b1.png)

# 参考資料

https://stackoverflow.com/questions/32170442/remove-count-next-previous-from-response-in-django-rest-framework

https://www.django-rest-framework.org/api-guide/pagination/
xcodeで開発したアプリの.appファイルの作成方法

**xcodeで開発したアプリの.appファイルの作成方法**

xcodeで開発したアプリの.appファイルの作成方法がわかりづらかったため手順をまとめる。


・目次
1.appファイルの作成
2.ファイルの拡張子の表示
3.zip化

<br>

**1.appファイルの作成**
xcodeを選択し、画面上部のメニューバーからProduct-Buildを選択し実行。
![スクリーンショット 2024-06-05 22.56.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476538/aa23612e-0fe2-725b-5b96-bd8bc42b0265.png)


<br>

**2.ファイルの拡張子の表示**
Finderを選択し、画面上部のメニューバーからFinder-設定を開く。
「すべてのファイル拡張子を表示」にチェックをつける。
![スクリーンショット 2024-06-05 22.59.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476538/bef01b8b-76c4-f390-1492-476efba93c71.png)

<br>

**3.zip化**
xcodeを選択し、画面上部のメニューバーからproduct-Show Build Folder in Finderを選択。
![スクリーンショット 2024-06-05 23.00.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476538/0b04f5b0-c2ee-a483-1de2-50a4c7f3dd54.png)

表示されたフォルダーからProducts-Debug-iphoneosを開き、格納されている.appファイルを任意の場所にコピー
（デスクトップなど）
![スクリーンショット 2024-06-05 23.03.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476538/d17dd13c-388d-5753-d5c8-8613d27e3998.png)

![スクリーンショット 2024-06-05 23.02.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476538/8f52401c-66fa-1ebf-9134-c048f3da9117.png)


ファイル名を２回クリックし、ファイル名変更可能状態にする。
拡張子を以下のように変更する。
変更前：XXX.app
変更前：XXX.<font color="Deepskyblue">zip</font>


<br>
<br>

以上
頻繁に使うディレクトリに簡単に移動できるようにする

# はじめに
大学生の私は毎日のように大学の作業ディレクトリまでcdコマンドで移動している。(例cd ~/desktop/university/junior)
今回、コマンド一つで作業用のディレクトリに移動できる方法を調べた。需要があると感じたので備忘録も兼ねて記事にした。

# 環境
macでzshを利用している。
(bashを利用している場合は~/.zshrcを~/.bashrcに読み替えて欲しい。)

# 前提知識
linux系のコマンドを触ったことがあれば、理解できると思う。
最低でもcdコマンドを理解できていれば設定はできるはず。

# 解決策（結論）
使ったのはalias(エイリアス)という、実行コマンドに別名をつける機能だ。wdというコマンドで作業ディレクトリ(~/desktop/university/junior)に移動したい場合はcd ~/desktop/university/juniorにwdという別名をつけてやれば良い。以下具体的な方法を見ていく。
## 1.ファイルを開く
普段利用しているエディターを使ってzshrcファイルを開く。
emacsの場合は、以下のようになる
```
emacs ~/zshrc
```
## 2. aliasを記述
.zshrcファイルに次のように書くことでaliasが設定できる。
閉じる時は忘れずに保存して閉じるように！
```
alias <設定するコマンド名>='<コマンド>'
```
今回の場合は下のようになる。
```
alias wd='cd ~/desktop/university/junior'
```
## 3.変更を反映する
.zshrcファイルを変更したらターミナルを開き直すか以下のコマンドを実行する必要がある。
```
source ~/.zshrc
```
これで完了！実際にwdと打てば作業用のディレクトリに移動することが確認できるはずだ。

## 注：.zshrcファイルを書き換えたらcdコマンドなど基本的なコマンドが利用できなくなった場合
文法ミスがあると、使えていたコマンドが使用できなくなる。解決方法は以下の通り。
1.Fiderでホームディレクトリまで移動する
2.隠しファイルを表示
⌘ + Shift + .で隠しファイルの表示/非表示が切り替えられる
3.ファイルを開いて修正

# .zshrcファイルとは何か
ここまでで、今回の目標であったよく使うコマンドを省略することはできるようになった。
付録として.zshrcファイルとは何なのかを少し調べてみた。
.zhrcファイルの話をする前に.bashrcファイルと.bash_profileファイルについても簡単にまとめる。
## .bashrcファイルと.bash_profileファイル
両者はbash環境でパスなどの環境変数の定義をするファイルである。
両者の違いは読み込まれるタイミングが異なる。.bashrcファイルは新しいターミナルセッションの開始時や新しい（インタラクティブな）サブシェルを開始するタイミングで読み込まれる。一方で.bash_profileはユーザーがシステムにログインするタイミングで読み込まれる。つまり、.bash_profileはユーザーがbashを利用し始めたタイミングのみで読み込まれる一方で、.bashrcファイルは子プロセスの開始など新しいbashの利用が始まったタイミングで読み込まれるというイメージで良いと思う。そのため、bash環境では.bashrcファイルに書いておけば特に問題はないだろう。
（正確にはインタラクティブなシェルなのかサブシェルなのかで読み込まれるファイルが決まるそう。）
# .zhrcについて
bashには.bashrcファイルと.bash_profileファイルの二つが用意されているということがわかった。さて、.zshrcファイルについてだが、このファイルも役割は.bashrcや.bashprofileと大枠同じである。つまり、zshが何か作業をする上で必要な情報を保存しているのだ。bashでは二つのファイルが存在したが、zshでもzprofileというファイルが存在するようだ。

### .zshrcファイルを書き換えた時にsourceコマンドが必要な理由
ここまで読んでくださった方はわかったと思うが、.zhrcを変更した後にsourceコマンドが必要な理由は.zshrcを再度読み込ませるためである。その証拠に、ターミナルを再起動することによっても変更内容を反映させることができる。

# 最後に
今回は、よく使うディレクトリへの移動を簡単にできるエイリアスについて説明した。
.zshrcなどを調べていく中でzshの強みであるタブ補完機能などにも興味を抱いたので、時間がある時に記事にしたい。

# 参照文献
https://qiita.com/ydah/items/18d242b632e5486fe912

https://envader.plus/article/249

https://qiita.com/ikkyu193/items/5c9a87b22fdf7697422e

# 更新履歴
2024年6月zprofileの記述を追加
BurmillaOS (OSインストール)

# 環境

* BurmillaOSはProxmox VE 8.2上のVMとしてインストール

# 設定内容

以降の手順を実施することでインストール後に設定される内容

* 固定IP
* タイムゾーン
* SSH用の公開鍵
* VMのホスト名
* qemu-guest-agentサービスの自動起動

# 手順

## Proxmox VE に BurmillaOS用の VM を作る

1. お好みのハードウェア設定でBurmillaOSをインストールするVMを作成する (以降、単にVM)
    * Burmilla OSのISOファイルを VMのCD/DVDドライブにセットしておく
1. VMを起動する

## ISOから起動したVMをConsoleで下ごしらえする

(公開鍵やら設定値ymlの手入力に自信ニキはここを飛ばしてOKです)

1. パスワードを設定する
    * `$ sudo passwd rancher`
    * ここで設定したパスワードは インストールした BurmillaOS のログインには使えません (rancherユーザはパスワードでログインできないほうがいいと思っています)
1. IPアドレス見ておく
    * `$ ip a`

## cloud-config.ymlファイルを作成する (インストール内容のレシピ的なファイルを作る)

ここでは 手元のマシンで cloud-config.yml ファイルを作ったのち ISOから起動したVMにSCPで転送する流れですが、公開鍵手入力を選んだ場合はConsoleからviで全部打ちます。

1. 以下を作成する
    ```yaml:cloud-config.yml
    hostname: burmilla01 #<<sample>>
    
    ssh_authorized_keys:
      - ssh-rsa hogehogefugafuga hogefuga@example.com #<<sample>>
    
    rancher:
      network:
        dns:
          nameservers:
            - 1.1.1.1 #<<sample>>
            - 1.0.0.1 #<<sample>>
          override: true # Override DHCP assigned nameservers
        interfaces:
          eth0:
            dhcp: false
            address: 172.68.1.100/24 #<<sample>>
            gateway: 172.68.1.1 #<<sample>>
            mtu: 1500 #<<sample>>
    
      services:
        console:
          environment:
            TZ: 'JST-9'
        syslog:
          environment:
            TZ: 'JST-9'
    ```
    * ここで qemu-guest-agent も登録できそうな気がしているが、未検証
1. cloud-config.ymlを手元のマシンで作成した場合は scp で転送する
    * `$ scp cloud-config.yml rancher@<IP_ADDR>:`
    * パスワードは前の手順で作成したもの

## BurmillaOSをVMにインストールする

1. VMで以下を実行し、BurmillaOSをインストールする
    * `$ sudo ros install -c cloud-config.yml -d /dev/sda`
    * 色々聞かれたらyyyyyyy...
    * 実行場所は Console でも SSHでもよさそう。SSHはすぐ切断されてしまったけど問題なさそう。
1. VMの再起動がかかり、インストールしたBurmillaOSで立ち上がったら ISO をCD/DVDドライブから取り外す

## qemu-guest-agentの開始を設定する

1. sshでVMにSSHでログインする
    * 鍵はVMに登録したもの
1. 以下を実行してqemu-guest-agentを登録する
    ```bash
    $ sudo ros service enable qemu-guest-agent
    $ sudo ros service start qemu-guest-agent
    $ sudo reboot
    ```

# 参考

* https://gist.github.com/janeczku/2baa0db0b89913999eb05ddb6f343f9a
* https://pdwslmr.netlify.app/posts/on-premise/rancheros-install/

# メモ

## system-dockerサービス

`ros service start hogehoge` は `ros service enable hogehoge` を実行せずに叩いても **そのサービスは存在しないよ** って言われてしまう
`ros service list | grep hogehoge` でインストール可能なサービスを探せる
八百屋システムを考える（DX内製化の手順２）

# 前回の記事
前回の記事は、八百屋さんの管理システムを表計算で作ること考えました。

[八百屋システムを考える（DX内製化の手順１）](https://qiita.com/kawamo55/items/b801875ca9494eb89d7a)

# まずは表計算で考えてみる
前回やったように、表計算（スプレッドシート）で最小単位の管理票を考えることで、どのようなデータを使うと良いかがよく見えてきます。

・見えてくるデータ構造
商品のデータ：商品名、廃棄日数
１日辺りの記録データ：仕入数、仕入値、販売数、販売値

・計算でわかること
仕入数、販売数、廃棄数、在庫数、粗利

・表計算のデメリット
しかし、表計算で八百屋システムを作ろうとすると、
１０品目の取り扱いをするだけで１品目あたり、日毎に仕入数、仕入値、販売数、販売値の５データ×平均営業日(22日）= 110個
10品目なので1100個のデータが必要になるため数ヶ月使うだけで処理が重くなってくる事が予測されます。

# プログラム化するための検討事項
ここまでで、システムで管理するためのデータ構造と計算方法が見えてきましたのでプログラム化することを考えてみます。

対象言語は、VBAとPythonで考えてみます。

・VBAで実現しようとする場合
１．考えられる選択肢は、シート内にデータ構造で示したデータを蓄える
この場合、Excelの欠点として同じブックを同時に開けない（データをシートに貯めると不具合が起きるため）

２．データベースにデータを記録してデータを蓄える
この場合、同時に開くと警告は出るもののデータの記録先がデータベースであるため
使える、データベースとしてはAccessデータベース・ODBC接続で使うデータベース（SQLServerやPostgreSQL等）
画面要素は、スプレットシートなのでシート上に作る方法とユーザーフォームと呼ばれるダイアログ画面を使う

・Pythonで実現しようとする場合
１．データはSQLiteやSQLServer、PostgreSQLの直操作できるドライバライブラリがあるのでデータベースを使用する

２．画面要素は、tkinterやpysimpleGUIなどのGUIライブラリを使ったり
DjangoやFlaskでWebサーバー化することが可能で、Fletのようにマルチプラットフォームにも対応できる。

この記事に関するお問い合わせは、こちらまで m_kawase@embed-ai.com まで！
ローカル環境でLlama2を動かす

# 必要なもの
16GB以上のメモリーを積んだGPU
Livebookをインストールした環境

# 実際動作させた環境
- GPU RTX4090(24GB)
  - GPU Driver Version: 555.42.02
  - CUDA Version: 12.5
  - cudnn　8.9.0.131
- Elixir
  -  Erlang/OTP 25 [erts-13.0.4]
  -  Elixir (1.16.3)
  -  Livebook v0.13.0-dev
- その他構成(参考までに)
  - OS Ubuntu 22.04.1 LTS
  - CPU  13th Gen Intel® Core™ i9-13900KF 
  - メモリ 128GB
  - SSD 2TB

# OSのインストール
https://qiita.com/t-yamanashi/items/9cb46beed0506edf26c6#os%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB

# Elixirのインストール
https://qiita.com/t-yamanashi/items/9cb46beed0506edf26c6#elixir%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB

# Livebookのインストール
https://github.com/livebook-dev/livebook

上記のページから引用
```
git clone https://github.com/livebook-dev/livebook.git
cd livebook
mix deps.get --only prod

# Run the Livebook server
MIX_ENV=prod mix phx.server
```

# GPU環境構築
https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64&Distribution=Ubuntu&target_version=22.04&target_type=deb_local

のBase InstallerとDriver Installerを参考にする
ここまででGPU DriverとCUDAはインストールできる

cudnn

https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/
から
libcudnn8_8.9.0.131-1+cuda12.1_amd64.deb
libcudnn8-dev_8.9.0.131-1+cuda12.1_amd64.deb
をダウンロード

ダウンロード後インストール
```
sudo dpkg -i libcudnn8_8.9.0.131-1+cuda12.1_amd64.deb 
sudo dpkg -i libcudnn8-dev_8.9.0.131-1+cuda12.1_amd64.deb
```

ここまでできればほぼクリア…

# Llama2環境
Hugging Faceの部分を参考

https://qiita.com/RyoWakabayashi/items/e2ec30426f554158ef9c#hugging-face

Livebookのソースはこちらを使う

https://github.com/elixir-nx/bumblebee/blob/main/notebooks/llms.livemd

下記の「依存モジュールのインストール」参考に
Setupの部分を置き換える

https://qiita.com/RyoWakabayashi/items/e2ec30426f554158ef9c#%E4%BE%9D%E5%AD%98%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB

~~（僕はLlama 2の部分は成功してMistralはまだ成功してない）~~
後日動きました
　└GPUのメモリー不足でした
 　　└Llama 2のセッションを消してMistralのみにすれば良い
　

# 動作動画

<iframe width="560" height="315" src="https://www.youtube.com/embed/VR1sacsEuMQ?si=5U4cELssQmhOTEIL" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
【UE5】ゼロから極めるゲーム開発　その3(モデリング編)

# モデリングモード

オブジェクトを作成して配置できる機能らしい。[アクタを配置]と何が違うんだ。
形を変えたりできる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3779049/52a0c493-03cf-85f4-c047-e3ee87b488c0.png)

大きさを設定してビューポートに配置。
配置場所を決めたら[承諾]を押して決定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3779049/38d1d506-f2cb-8c8b-8940-b631f555835d.png)

# スロープを作る

画像の場所にスロープを作成する
手順としては
1. 面を押し出す
1. 辺を下げてスロープみたいにする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3779049/eb6090d7-71bb-6b3c-a494-2cd902dff323.png)

まずは面の押し出しから。
編集するオブジェクトを選択した状態で[PolyModel]の[PolyEd]を選択。
押し出す面を選択して[Face Edits]の[Extrude]を選択すると面を押し出しできる。
わかりにくいけどこんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3779049/7a8bf8c6-6a91-d836-6a8e-5b5e372ae36e.png)

ただしこの方法ではすべての面が押し出されてしまう。一部の面のみを押し出したい場合は、エッジループを挿入する。
同じくオブジェクトを選択した状態で[PolyModel]の[PolyEd]を選択。
今度は[Edge Edits]の[Insert Edge Loop]を選択。辺に沿ってマウスを動かすとエッジループを入れる箇所を選択できる。
細かい調整は後で行うので、今は大体の場所でエッジループを挿入する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3779049/4a6b0a62-96dd-7385-4a47-aa717decec57.png)

エッジループを調整するためにエスケープキーで[Insert Edge Loop]を抜ける。
エッジループを選択するために[選択フィルタ]でエッジを選択する。
ここ、項目の場所がわからず困りました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3779049/19305f9e-058f-a2cf-0d0e-7a4f84ca5dbd.png)

エッジループをいい感じに移動させたら面を押し出す。

スロープにするために辺を下げる。辺を選択して下げるだけ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3779049/3869f0e2-aafa-bea9-0048-71bddda23907.png)

# トンネル作成

ブーリアンという機能を使用してオブジェクトに穴をあけていく。
イメージとしてはオブジェクトからオブジェクトを削る感じ。ということで削るためのオブジェクトを作成する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3779049/42a8b736-757d-87b1-9a02-1f850687ab22.png)

作ったオブジェクトを削りたい位置に配置する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3779049/397e5f17-7135-b410-d5ea-54b847b63f51.png)

ここからが重要
モデリングモードに移行して、<b>削られる方(A)</b>と<b>削るほう(B)</b>をctlを押しながらクリックする。
A-Bみたいな感じで削られるため、順番に注意すること。
オブジェクトを選択したら、[PolyModel]の[MshBool]を選択する
想定通りに削除されていればOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3779049/5daaad90-08ec-458e-45b5-f34cb9ac6d4c.png)

# ピボットの調整

ピボットとは。
オブジェクトの中心点のことらしい。ここを起点に移動したり回転したりする。そのピボットの位置を変えることができる機能がある。

[Transform]の[Pivot]から移動させたい場所を選ぶだけ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3779049/6c407021-f63f-5879-4a8d-44c7c8304544.png)

[Center]を選ぶと
これが
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3779049/185ed3ba-2f74-cddc-c8d8-c049bce457a0.png)

こうなる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3779049/8cd7a264-3281-770a-b7b4-fc7a477755e4.png)

# 終わり

UE5のモデリング機能をいろいろ使いました。ここら辺も詳しく調べたいですね。
今回はここまで！
Splunk - インデックスの一覧を取得したい

## 検証環境
Splunk Enterprise 9.2.1

## はじめに
Splunkで今使ってるインデックス一覧をSPLで取得してみた話。

## SPL
### (1) rest
``` SPL:SPL
| rest /services/data/indexes 
| table title
```
![スクリーンショット 2024-06-04 13.11.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3310888/9e0d9a5b-5831-ea85-2269-054e74880ebc.png)

_internal など _から始まるインデックスは、Splunk内部で使用されるシステムのインデックスです。

### (2) eventcount
``` SPL:SPL
| eventcount summarize=false index=* 
| dedup index 
| table index
```
![スクリーンショット 2024-06-04 13.13.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3310888/49d78a60-dae7-bccf-1512-cc773f56af72.png)

こちらは内部インデックスは含まれません。

### 終わりに
restで取得する情報はインデックスだけでは無く、他のリストも表示する事が可能です。
C# で 参照型から参照値を表示したい

というわけでタイトルの通り、参照型から参照値にあたる値を取得したいと思います。

具体的には [`Unsafe.As<T,nint>(ref T)`](https://learn.microsoft.com/ja-jp/dotnet/api/system.runtime.compilerservices.unsafe.as) で取得することができます。

※ `nint` は [`IntPtr`](https://learn.microsoft.com/ja-jp/dotnet/api/system.intptr) の 数値表現名 (内部的には`IntPtr`)

```cs
using System;
using System.Runtime.CompilerServices;

var text1 = "test";
Console.WriteLine($"{nameof(text1),-10}: {ToRefValue(ref text1):X16}");
// 同じリテラルは 同じインスタンスが使われる
var text2 = "test";
Console.WriteLine($"{nameof(text2),-10}: {ToRefValue(ref text2):X16}");
// 明示的に new すると別のインスタンスが使われる
string text3 = new(text1);
Console.WriteLine($"{nameof(text3),-10}: {ToRefValue(ref text3):X16}");
// object
object obje4 = new();
Console.WriteLine($"{nameof(obje4),-10}: {ToRefValue(ref obje4):X16}");
// 代入では参照値は変わらない
var obje5 = obje4;
Console.WriteLine($"{nameof(obje5),-10}: {ToRefValue(ref obje5):X16}");

nint ToRefValue<T>(ref T t) where T:class => Unsafe.As<T,nint>(ref t);
```

[playground](https://sharplab.io/#v2:C4LgTgrgdgNAJiA1AHwAICYCMBYAUKgBgAJVMA6AJWmAEsBbAUzIGEB7OgBxoBsGwBlPgDcaAYwYBnANx48QgIZgiwBgA9gmIgF4iAIhUTgumfkwBOABQASXQG8o8xqwBmFleswBKGAFpMBAF8QIlsAFVYKBmcANXluCAYLMCjlNQ1PEAANTAA2AN1PEwB6IqJAGBVADQZAK4ZAMYZAS4ZAa4ZAewZyisAShkBnhkBOhkB+hm7AGQZAf3lAeIZAGIZAaIY5RVT1dG09AyMTUksbe0cGFzc09G8/QOCwiKjY+MTk5xngXazc/MK8EqJAODNALk9AELdAawYiKAYAdyIgE0GcaACwZAKRKgDsGTq9AYjCZ4UjEdzAADM81+f22HgeplWdgcTlcyJRe38QRC4UiMTiCSSKWJGWyeQKxVKrAARgArBiiYB4Dnc3lEAUMAAs6P+FhxK2s+I2WxFotJBwpx2pZzpl0VjLuLMepUAx3KAU0VAOYMTUAQ8qAc0dACQKTUAkJrDQCRDIArBkAIgxTJQigCs80Vy3MsvWhIs3uV5KOVNOtIuwq5DC9OuZONkuCgNCgwCIlJONIYAB5QgA+TVZ5SeIh/AAWfAYWZAGG0haIAFUoBJ5M4mABBCQFmBpjPFmPAQpAA===)

```output
text1     : 000001DB5AC6FDA8
text2     : 000001DB5AC6FDA8
text3     : 000001DB5ACB7540
obje4     : 000001DB5ACB75C8
obje5     : 000001DB5ACB75C8
```

まぁ、参照値が取れたからといって 実務には特に関係ないというかうれしいこと少ないのですが、レクチャーする際とかに必要があればこうやって取得する方法はないわけではないということで。

以上。
メモリのSWAP

# SWAPとは？？？
### 簡単な説明
ストレージの一部をメモリとして扱う事
### 補足説明（前提知識）
- ストレージ（補助記憶装置）  
  - データを永続的に保存する場所  
  - SSD、HDD等
- メモリ（主記憶装置）  
  - データを一時的に貯めておく場所
  - DRAM

### 本題
- メモリが足りない時に一部のデータをストレージへ移す事
- ストレージをメモリとして使う事で実際のメモリサイズより大きく見せる
【AtCoder】ビット演算

## ポイント

### ビット全探索

```C++
for (int i = 0; i < (1 << N); i++) {
  for (int j = 0; j < N; j++) {
    if ((i >> j) & 1) { ~ }
  }
}
```

### その他のビット演算

下記は、配列の各要素の数値をXとした時に、ビット列のX桁目の値を1に変換した時の対応する整数値を出力する実装例です。

```C++
vector<int> v = { 1, 4, 5 };
int ans = 0; // 対応するビット列
for (int x : v) ans |= (1 << (x - 1));
cout << ans << endl;
```


## 例題
[ABC289C - Coverage](https://atcoder.jp/contests/abc289/tasks/abc289_c)

```C++
#include <bits/stdc++.h>
using namespace std;
#define rep(i, n) for (int i = 0; i < (n); i++)

int main() {
  int N, M; cin >> N >> M;
  vector<int> L(M, 0);
  rep(i, M) {
    int cnt; cin >> cnt;
    rep(j, cnt) {
      int a; cin >> a;
      L[i] |= (1 << (a - 1));
    }
  }
  
  int ans = 0;
  rep(i, (1 << M)) {
    int total = 0;
    rep(j, M) {
      if ((i >> j) & 1) total |= L[j];
    }
    if (total == (1 << N) - 1) ans++;
  }
  cout << ans << endl;
}
```
LaTeXでBudouXを使った自然な日本語改行

[BudouX](https://github.com/google/budoux) という日本語の改行位置を自然にしてくれるツールの存在を知ったので、LaTeXでもこれができないか試してみました。

[BudouX-LaTeX](https://github.com/s417-lama/budoux-latex) という形で公開したので、もしよければ使ってみてください。

https://github.com/s417-lama/budoux-latex

## BudouX-LaTeX とは

BudouX-LaTeX を使うと、以下のように LaTeX でも簡単に自然な日本語改行を実現できます。

|通常の LaTeX|BudouX-LaTeX を使った場合|
|---|---|
|![example-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215516/6a4b55ca-89ed-447b-e927-9d1782575a65.png)|![example-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215516/65352329-cee3-428a-1368-d963fac932f3.png)|

LaTeXのコードでは、`\usepackage{budoux}` して `\budoux{...}` で文章を囲むだけです。

```latex
\usepackage{budoux}

\begin{document}

\budoux{
  私はその人を常に先生と呼んでいた。
  だからここでもただ先生と書くだけで本名は打ち明けない。
  これは世間を憚かる遠慮というよりも、その方が私にとって自然だからである。
  私はその人の記憶を呼び起すごとに、すぐ「先生」といいたくなる。
  筆を執っても心持は同じ事である。
  よそよそしい頭文字などはとても使う気にならない。
}

\end{document}
```

1行あたりの文字数の多い一般的なLaTeX文書であればあまり嬉しさはないかもしれません。
紙面に対して文字がそこそこ大きくなる場合、特にbeamerを使ってスライドを作る場合などに便利ではないかと思っています。

## 使い方

まずは本家のBudouXをインストールします。

https://github.com/google/budoux

インストール方法は上の公式GitHubに書いてありますが、簡単にpipでインストールできます:

```sh
pip install budoux
```

`budoux`コマンドをシェルで叩けるようになったら、BudouX-LaTeXのGitHubから `budoux.sty` を取ってきてLaTeXのワーキングディレクトリに配置します。

`budoux.sty` はここからダウンロードすることもできます: https://raw.githubusercontent.com/s417-lama/budoux-latex/main/budoux.sty

あとは上の例のように `\usepackage{budoux}` して `\budoux{...}` で文章を囲むだけです。

なお、.texファイルのコンパイル時には `--shell-escape` オプションを付ける必要があります。
これはbudoux-latexパッケージ内で外部コマンドの `budoux` を呼び出し、その結果を用いているためです。
この辺はmintedパッケージを使うときと同じ制約です。

## 雑感

実装としては、一度全て`budoux`に丸投げし、改行が好ましくない文字列の塊に分解した後、改行が好ましくない文字の間にそれぞれ`\nolinebreak`を挿入する、ということをやっています。
マクロを書くのにexpl3というものを使ったけどまだあまりよく分かってない。

まだまだ試作段階で`\budoux{...}`の中身が複雑になってきたらどうするの？とか様々な問題があると思いますが（一応`\textbf`くらいには対応しているはず）遊んでみてもらえると嬉しいです。
パッケージマネージャーHomebrewの基礎（自分用メモ）

# Homebrewとは
パッケージを管理してくれるソフト。パッケージのインストールや、必要な他パッケージのインストールなども実行してくれる。
パッケージには依存関係があり、手動で管理するのがめっちゃ大変なので、すべてのエンジニアはこのようなソフトを使用する。

# Homebrewを最新に保つ
## 1, Homebrewの更新
```bash
brew update
```
## 2, インストール済みパッケージの更新
```bash
brew upgrade
```
## 3, 古いパッケージのクリーンアップ
```bash
brew cleanup
```
## 全部同時にやりたいあなたへ
```bash
brew update && brew upgrade && brew cleanup
```
## ついでに自動化したいあなたへ
下記スクリプトファイルを作成。
```bash:update_homebrew.sh
#!/bin/bash
brew update
brew upgrade
brew cleanup
```
実行権限を付与。
```bash
chmod +x update_homebrew.sh
```
crontabファイルに実行周期と実行対象ファイルを設定する。
```bash
# crontabを開く
crontab -e
# 実行周期と実行対象ファイルのフルパスを追記。
# 例えば、下記は１２月３１日の23:59にこのスクリプトを定期実行するよう指定している。
# もちろん一年に一回しか使わないようなファイルではないので、周期の設定は調整してね。
59 23 31 12 * [update_homebrew.shのフルパス]
```
O_2_2_functionノードを使ってみる_flipper's circuit Project -電子工作人口を増やすためのプロジェクト-

では前記事で作ったフローに、「functionノード」を追加してデータを加工します。

# 1 「functionコード」を入れてデータ加工する

「機能」の下にある「functionノード」をドラック＆ドロップします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2308477/767487d2-4b4a-b16e-72f2-f827d1d9fd71.png)

すでにつないであるラインの上に持っていくと、間に追加できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2308477/79a6114c-c717-9d2d-acf3-e37f742944a5.png)

前後のノードと端子がつながりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2308477/0ee09bd5-cd53-0cea-1403-c8481e0feab9.png)

「functionノード」をダブルクリックし、プロパティを表示します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2308477/4ee39c24-8a3b-33b0-c3df-d66ff9efc7d2.png)

デフォルトで入力されているコードは

```
return msg;
```

次のノードにメッセージを流す、とだけあります。
これを、データ加工用のコードに変更します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2308477/0fdda5a6-08bd-e1f0-1e35-062d773946cd.png)

コードはjavascriptで記述します。

```
// データ加工する
msg.payload = msg.payload + " We can Do it! " 

return msg;
```

# 2 「ノードの名前」をつける

後で動作がわかるように、ノードに名前を付けてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2308477/0c9420f8-c197-d76f-6eeb-f04cc8d138c6.png)

記述がおわったら右上の「完了」ボタン押下してください。

最後に「デプロイ」ボタンを押下します。

「injectノード」のボタンを押してください。

「injectノード」に設定された値へ、「functionノード」のコードで追加した内容が加えられました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2308477/7ca8eb0c-eb25-2a8b-0ba6-abd9735d6d73.png)

functionで使用するコードの書き方について、詳しくは公式サイトを参照ください。
→
https://nodered.jp/docs/user-guide/writing-functions

つぎの記事で「HTTPリクエスト」を行うフローをまとめます

[トップへ戻る](https://qiita.com/comchiki66/items/615c0c8cb87cd0c5c575)
[備忘録]Pythonista3で環境変数の管理

今までPythonista3でのスクリプトではマジックナンバーを使用していたので、それはよくないということで環境変数の管理を試みた。

## JSONファイルで管理
JSONでコンフィグファイルを作成し、環境変数を使用するスクリプト実行時に、os.environで環境変数の値を設定するようにしてみた。問題はPythonista3内では.py以外のファイルがUIから作成できないこと（自動で.pyにされてしまう）。そのため、スクリプトでファイルを作成、編集し、JSONファイルを用意することにする。

```python:JSONファイル編集用スクリプト

import json

# JSON設定ファイルのパス
config_file_path = './ini/config.json'

# 現在のJSONファイルの内容を読み込む
try:
    with open(config_file_path, 'r') as file:
        config = json.load(file)
except FileNotFoundError:
    # ファイルが存在しない場合は空の辞書を使用
    config = {}

print("現在の設定:", config)

try:
  while True:

  # 標準入力から新しいデータを受け付ける
    key = input("追加するキーを入力してください: ")
    value = input("追加する値を入力してください: ")

    # 新しいデータを辞書形式で作成
    new_data = {key: value}

    # 新しいデータを既存の設定に追加
    config.update(new_data)

    # 変更された内容をJSONファイルに書き込む
    with open(config_file_path, 'w') as file:
        json.dump(config, file, indent=4)

    print(f"新しいデータが {config_file_path} に追加されました。")

except KeyboardInterrupt:
  print(f"環境変数の登録を終了しました。")
```

```python:環境変数の読込み設定モジュール

import os
import json

def setenv(filename):
  # JSON設定ファイルのパス
  config_file_path = './ini/' + filename

  # JSON設定ファイルを読み込む
  with open(config_file_path, 'r') as file:
  config = json.load(file)
  
  # 環境変数として設定する
  for key, value in config.item():
  os.environ[key] = value
```

## まとめ
これでとりあえずマジックナンバー使わずにコードが書けるようになったけど、今は環境変数で管理しているのが３，４つくらいしかないので、手間感すごい。まぁこれから使うスクリプトが増えれば、管理しやすくなる、はず。
お産合宿2024で発表した「マルチモーダル入力とOptical Flowによるリアルタイムスポーツ実況システム SportsVision」の開発レポート

2024年5月30日から2日間、GMOペパボ恒例のお産合宿に参加しました。今年のテーマは「動画配信カルチャーにフィットしたアプローチをアウトプットする」でした。私はこのテーマに基づき、スポーツ実況を効率化し、魅力的な動画コンテンツを提供するツール「SportsVision」を開発しました。

![](https://cdn-images-1.medium.com/max/1600/1*eFPrEd0aD8tCvI1bFK6QmQ.png)

### お産合宿 2024とは

GMOペパボのお産合宿は、社員が新しい技術やアイデアを試す場として毎年開催されています。2024年のテーマは「動画配信カルチャーにフィットしたアプローチをアウトプットする」でした。このイベントには、多くの社員が参加し、各チームがテーマに基づいたアウトプットを行いました。

![](https://cdn-images-1.medium.com/max/1600/0*mSoDok5QFo6i0POm)

### 作ったもの

私は「マルチモーダル入力とOptical Flowによるリアルタイムスポーツ実況システム SportsVision」を作りました。これは、AIを活用してスポーツ実況を自動化し、視覚的な効果を追加するツールです。このツールは、スポーツ動画をキャプチャし、AIによる実況とOptical Flowによる移動検知を組み合わせることで、リアルタイムの実況を提供します。

https://www.youtube.com/shorts/jXdW6Uo_ZXU

### 技術解説

「SportsVision」は、AIによる実況生成と移動検知技術を組み合わせたツールです。まず、カメラで取得した映像を基に、事前に設定されたプロンプトやAIを用いて実況を作成します。この際、GPT-4oのマルチモーダル入力を利用し、画像とテキストを組み合わせて高品質な実況を生成しました。

次に、Optical Flow技術を用いて撮影対象の移動量を検出しました。移動が急増する瞬間を捉え、そのタイミングで実況頻度を高めることで、よりダイナミックでリアルタイムな実況を可能にしました。

![](https://cdn-images-1.medium.com/max/1600/1*E9CDFF6ZWT9761VMfSCxKA.png)

SportsVisionの処理の流れ

技術スタックとしては、GPT-4oのマルチモーダル入力を利用して画像とテキストを組み合わせた実況生成を行い、Optical Flowを用いて物体の移動を検知し、実況タイミングを調整しました。さらに、AVSpeechSynthesizerを利用して、生成されたテキストを音声で読み上げることで、リアルタイムの音声実況を提供しました。

開発の流れとしては、まずスポーツ動画を撮影するビデオカメラアプリを実装し、動画を一定間隔でキャプチャして画像データとして処理しました。次に、Optical Flow技術を用いて物体の移動量を計測し、急増する瞬間を検知して、一定間隔以外でもキャプチャを行うようにしました。その後、GPT-4oのマルチモーダル入力を用いて取得した画像とプロンプトを送信し、実況テキストを生成しました。最後に、AVSpeechSynthesizerを利用して実況テキストを音声で読み上げました。

### 作ってどうだったか

今回の開発では、GPT-4oのマルチモーダル入力が非常に有効であることを確認することができました。特に、画像をリサイズ・圧縮することで、テキスト入力と比較してもレスポンスが良好である点が印象的でした。また、Optical Flowを用いた移動検知は、スポーツのリアルタイム実況において非常に効果的でした。

一方で、現状は通信環境に依存するので、ネットワークが不安定な環境でも使用できるよう、ローカルのLLMの活用も検討する必要があると感じました。

### まとめ

「SportsVision」は、スポーツ実況の効率化と魅力の向上を目指したツールであり、今回の合宿でその可能性を大いに感じることができました。

![](https://cdn-images-1.medium.com/max/1600/1*_RQ0ZiA5MNdqDkfiix7TKg.png)

### 今後の展開

今後の展開としては、MLを用いたスポーツ実況体験の強化が挙げられます。CoreMLを活用してシーンの判断やプレイヤーの動きを分析し、より高度なプロンプト生成を実現することが可能です。また、効果的なディレイ機能の追加により、動画配信をワンテンポ遅らせてシチュエーションに同期した実況を実現することも考えられます。さらに、スポーツ以外の分野への応用も視野に入れており、オフラインイベントや商品説明など、他の分野でも「SportsVision」の技術を活用できると考えています。

### 参考文献

-   [オプティカルフロー(Optical Flow) — OpenCV-Python Tutorials 1 documentation](https://medium.com/r/?url=http%3A%2F%2Flabs.eecs.tottori-u.ac.jp%2Fsd%2FMember%2Foyamada%2FOpenCV%2Fhtml%2Fpy_tutorials%2Fpy_video%2Fpy_lucas_kanade%2Fpy_lucas_kanade.html)
-   [Hello GPT-4o | OpenAI](https://medium.com/r/?url=https%3A%2F%2Fopenai.com%2Findex%2Fhello-gpt-4o%2F)
-   [AVSpeechSynthesizer | Apple Developer Documentation](https://medium.com/r/?url=https%3A%2F%2Fdeveloper.apple.com%2Fdocumentation%2Favfaudio%2Favspeechsynthesizer%2F)
-   [Explore Computer Vision APIs — WWDC20 — Videos — Apple Developer](https://medium.com/r/?url=https%3A%2F%2Fdeveloper.apple.com%2Fvideos%2Fplay%2Fwwdc2020%2F10673%2F)
TOEIC 875点・TOEFL ITP 580点を取った英語勉強法

## この記事を書いた人
TOEIC L&R の受験履歴は以下のとおりです。
- 2022年6月26日：775点 (L410/R365)
- 2022年9月11日：875点 (L465/R410)

受験当時、海外生活や留学の経験はありませんでした。
大学受験で基礎はある程度身についていたと思いますが、昔からずっと「英語ができる人」に憧れを抱いていました。

しかし、「継続」は大の苦手でした;;
そんな私でも、約2.5ヶ月で775点→875点 を達成できた勉強法を紹介します！

他の語学試験や資格試験にも応用できると思うので、参考になれば嬉しいです。

## 単語
使用したのは『出る単特急 金のフレーズ』です。

https://publications.asahi.com/product/18732.html

やり方は「鬼の英語塾」さんの方法を参考にさせていただきました。
この方を紹介したくて筆を執りました(^^)

https://youtu.be/pSKOQHRajC8

ストイックな勉強法が紹介されていますが、私が実際に続けられていたのは、このあたりまででした。
- 金フレを3分割する
- 毎日高速で2,3周ほどする（印のない単語だけ）
- 覚えた単語には印をつける
- 音声も聞く

詳しいやり方は動画をご覧ください。

また、ついついスマホをいじってしまう怠惰な性分なので、そういう時はなるべく「mikan」で学習するようにしていました。

https://mikan.link/beret

スキマ時間にサッと単語帳を開ける自制心があればよかったのですが、残念ながら私にはありませんでした……。

## 公式問題集
「公式TOEIC® Listening & Reading 問題集」の最新2冊のみ使用しました。
それ以前のものは**買う必要がない**と思います。
この2冊を極めることが大切です。

https://www.iibc-global.org/toeic/support/prep.html

勉強法はシンプルです。
1. まず、時間を測って本番通りに問題を解く
2. 次に、制限時間やリスニングの回数を気にせず問題を解く
3. 答え合わせ
4. しっかり復習

これを2冊分繰り返し行いました。
間違えた問題や**正解したけどきちんと理解できていない問題**は必ず解説を読んで確認していました。

答えを暗記してしまうくらいまで持っている2冊を極めたら、3冊目に手を出そうと思っていましたが、そこまで到達するにはなかなか時間がかかります。
そうこうしているうちに新しい公式問題集が発売されたりもしますので、やはり最初に買うのは1~2冊だけで十分だと思います。

### リスニング
リスニングも「鬼の英語塾」様を参考にしました。

https://www.youtube.com/watch?v=a-tCPVlkRgo

- 何も見ないでシャドーイング
- スクリプトを見ながらシャドーイング

これを何度も繰り返しました。
スクリプトを見ずに完璧にシャドーイングできるまでやることが理想ですが、時間がかかるのでそこまで到達できたものは少なかったです。

スキマ時間には1.2倍速で音声を流し、耳を慣らしました。
Part 3・4は問題文の先読みがカギです！

### リーディング
Part 5は、空欄の前後だけで答えが決まり、文全体を読まなくても解ける問題があります。

Part 7では、まず設問を先に読む→関係ありそうな部分だけ読む、という戦略で解いていました。

## 直前の技術

https://book.alc.co.jp/book/b10029713.html

図書館で見つけたので1周だけやってみました。
「技術」は大学受験の経験や公式問題集をやっていればわかりそうなもので、そういった試験に慣れている方であれば必要ありません。
ただ、TOEICの傾向を知るということで少し余裕は生まれるかもしれません。

## TOEFL ITP
- 2022年1月: 503点
- 2023年1月: 530点
- 2023年2月: 580点

2023年1月から2月の伸びがすごいです。
毎日4時間×2週間ほどTOEFL iBTやIELTSの過去問を解き、リーディングのスピードやスピーキング・ライティングの瞬発力を鍛えました。
TOEFLの公式問題集はデジタルコンテンツがダウンロード可能なので、パソコンで本番同様の演習ができます。

https://www.officialtestprep.jp/fs/officialprep/official-tests-vol2-3rd

単語帳はこちらを購入したのですが、分厚すぎてやる気が出ず、ほとんど手をつけませんでした……（笑）

https://bookstore.obunsha.co.jp/products/9784010944318

## 余裕をもって会場に到着しましょう！
2024年5月、約1年8ヶ月ぶりにTOEICを再受験しました。
まさかの遅刻寸前で、タクシー+ダッシュで会場に駆け込むはめになりました（汗）
受験料とタクシー代が無駄にならなくて本当によかったです。
前回の受験から留学や英語インターンシップを経験し、900点台（リスニング満点）を達成することができました🎉
みなさんは余裕をmって会場に到着することを心掛けてくださいね！
O_2_1_Node-REDでフローをつくってみる_flipper's circuit Project -電子工作人口を増やすためのプロジェクト-

では実際にフローを。

まずはボタンを押すとデータを右のノードに送る「injectノード」と、流れてきた値をデバッグ・ウィンドウに表示する「debugノード」を使って「デバッグ・ウィンドウ」に値を表示する仕組みを作ります。

# 1 「injectノード」の配置

パレットから「injectノード」をドラッグし、ワークスペースの好きな場所に配置します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2308477/48bb559d-7219-5c01-db7c-d364b1af3e34.png)

# 2 「debugノード」の配置

次は「debugノード」をパレットから配置します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2308477/f8639e28-efcb-fef1-75b7-03beceec9bdd.png)


# 3 端子をつなぐ

配置したら、「injectノード」の右の端子と、「debugノード」の端子をつなぎます。

端子をドラッグアンドドロップで...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2308477/736fa5a0-baca-04c9-dca7-9e7a85300b16.png)

右のノードの端子につなぎます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2308477/d60fbaae-f56e-0b3a-6cdf-464e4ca742fa.png)

# 4 デプロイする

端子をつないだら、「デプロイ」（動作可能な状態にする）します。
画面右上の「デプロイ」ボタン押下。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2308477/f9d2271e-8d41-a341-cd19-c10a474c15f0.png)

ノードについていた水色のポチが消えて、「デプロイが成功しました」と表示されます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2308477/259100e4-7a99-9808-51fb-0d3942f67d5c.png)

# 5 動かしてみよう

ここまでの作業がおわったら、「injectノード」の左側のボタンをクリックします。すると「タイム・スタンプ」のデータが送られ、「debugノード」が受け取ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2308477/738bb037-64ce-94d1-f4fc-40106e68fe99.png)

右の「デバッグ・ウィンドウ」にタイムスタンプが出力されます。
デバッグの処理を行って、フローが終了します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2308477/4ffc1be6-ad6c-98a6-353a-cad9c967a3ae.png)

# 6 「ノード・プロパティ」の編集

実際にフローを組むときに、ノードをより細かく設定する必要が出てきます。そこで使用するのが「ノード・プロパティ」です。「injectノード」のプロパティを編集して、「debugノード」に送るデータを変更します。

まずは「injectノード」をダブルクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2308477/5d1f0208-991e-839d-a394-b41d30b4341f.png)

「injectノード」のプロパティが表示されたら、「ペイロード」部分をクリックします。ここでいったん「文字列」に変更します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2308477/1a08996b-15be-d47e-4c5c-200fcc1e3fdb.png)

文字列をなにかいれます。せっかくなのでお決まりの「Hello world!」を...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2308477/ef9969f7-f6fb-95bd-8553-d4063f311def.png)

文字を入力したら、右上の「完了」ボタン押下。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2308477/35357ebd-21d7-0cf0-e344-bed85c0d5db2.png)

もう一度「デプロイ」ボタンクリックし、「injectノード」のボタンをクリック。
出力されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2308477/f38a837d-9be5-991d-5dd1-1fd187114c19.png)

まずは簡単なフローで動かすをやってみました。
次の記事では、「functionノード」を使って説明します。

[トップへ戻る](https://qiita.com/drafts/615c0c8cb87cd0c5c575/edit)
YAMAHAのRTXでのDNS設定(IPoE等の環境)

BiglobenoIPoE環境でRTX1300を使用していたのですが
Configを弄った際に、何故かネットに繋がらなくなることが起きたので
サポートに問合せを実施。
結果，以下のことがわかりましたので、書き記しておきます。


dns server select 500000 dhcp lan2 any .
こちらのエントリが、初期設定では投入されています。
結論から言うと、このエントリが"最優先"でDNSの項目に入っていないと
インターネット接続がコケます。
優先順位は1がいいかもしれませんね。。。。
【Python リストの基礎】[ ]とlist() の違いが気になったから調べてみた

## 記事の内容
記事のタイトルの通り、[]とlist()の違いが気になったので調べてみました。その結果をまとめます。

## 1. 基本的な概念

リストは、Pythonで複数の値を一つの変数にまとめて管理するための方法です。例えば、買い物リストのように複数のアイテムを一つのリストにまとめることができます。

## 2. リテラル []
### 説明
リテラル [] を使うと、新しい空のリストを簡単に作成できます。これは最も基本的でシンプルな方法です。

### 例
```python
my_list = []
print(my_list)  # 出力: []
```
このコードは、新しい空のリストを作成し、そのリストを my_list という変数に保存しています。

## 3. list() コンストラクタ
### 説明
list() コンストラクタは、リストを作成するためのもう一つの方法です。これは空のリストを作成するだけでなく、他のデータ型（例えば文字列やタプル）をリストに変換するためにも使えます。

### 例
```python
my_list = list()
print(my_list)  # 出力: []

my_list_from_string = list("hello")
print(my_list_from_string)  # 出力: ['h', 'e', 'l', 'l', 'o']
```
このコードは、空のリストを作成する例と、文字列をリストに変換する例を示しています。


## 4. なぜ二つの方法が存在するのか？
### 簡単さと効率
* リテラル []:
    * 簡単で速いです。
    * 空のリストを作成するための最も直接的な方法です。
    * 初心者にも覚えやすく、直感的です。

### 汎用性と柔軟性
* list() コンストラクタ:
    * より柔軟で、他のデータ型からリストを作成するのに便利です。
    * 他のデータ型（例えば、文字列やタプル）をリストに変換できます。

### 背景と歴史
Pythonは初心者にも分かりやすく、また、経験豊富なプログラマーにも強力なツールを提供することを目指しています。`[]` はシンプルで速いため、初心者が使いやすいです。一方、`list()` は柔軟で強力な機能を提供するため、さまざまな場面で使いやすくなっています。

## 5. 具体的な使い分けの例
### リテラル [] を使う場合
```python
# 空のリストを作成する場合
shopping_list = []
```

### list() コンストラクタを使う場合
```python
# 文字列からリストを作成する場合
char_list = list("apple")
print(char_list)  # 出力: ['a', 'p', 'p', 'l', 'e']

# タプルからリストを作成する場合
tuple_list = list((1, 2, 3))
print(tuple_list)  # 出力: [1, 2, 3]
```


## 6. 参考URL
[Python Documentation - Lists](https://docs.python.org/3/tutorial/datastructures.html#more-on-lists)
[Python Documentation - Built-in Functions](https://docs.python.org/3/library/functions.html#func-list)

## まとめ
* リテラル []: 空のリストを作成するのに簡単で速い方法です。
* list() コンストラクタ: 他のデータ型からリストを作成するのに便利な柔軟な方法です。

これら二つの方法は、それぞれの用途に応じて使い分けることで、Pythonのリストを効果的に活用することができます。


## 関連記事
* [弱者・凡人のための競技プログラミング入門『競技プログラミングの鉄則』本を使いこなしたい ①二分探索](https://qiita.com/kyogoku_meta/items/91b32773f045d0ef560b)
* [線形代数の「背景と概念」をもっとよく分かりたい【数学弱者・凡人のための線形代数入門】](https://qiita.com/kyogoku_meta/items/077e9972dcd7b08d6473)
* [論理学って何を扱うの？論理学入門](https://qiita.com/kyogoku_meta/items/7dc1c17f78bc36d11346)
[TypeScript] Barrelパターンを使用して、エクスポートを集約する

### Barrelパターンとは？

Barrel パターンは、複数のモジュールからエクスポートを一つのモジュールに集約するデザインパターンです。

---

### Barrel パターンの利点
1. **可読性の向上**: 複数のモジュールを一つのファイルにまとめてエクスポートすることで、他のファイルからのインポートがシンプルになる
2. **インポートの一元管理**: インポート文が統一され、シンプルになる

---

### 例

#### ディレクトリ

```
src/
├── moduleA.ts
├── moduleB.ts
└── index.ts
```

#### 各ファイル

`moduleA.ts`:
```typescript
export const CONSTANT_A = 'A';
```

`moduleB.ts`:
```typescript
export interface InterfaceB {
  id: number;
  name: string;
}
```

`index.ts`:
```typescript
export * from './moduleA';
export * from './moduleB';
```

#### インポート例

```typescript
import { CONSTANT_A, InterfaceB } from './src';
```

---

### Barrel パターンを使用しない場合

Barrel パターンを使用しない場合、それぞれのモジュールを個別にインポートする必要があります。

```typescript
import { CONSTANT_A } from './src/moduleA';
import { InterfaceB } from './src/moduleB';
```

---

### まとめ

Barrel パターンを使用することで、可読性/保守性が向上するので積極的に活用していきたい

#### 参考

https://typescript-jp.gitbook.io/deep-dive/main-1/barrel
VelociDrone を Fedora40 にインストール


#### インストールに失敗します・・・
```bash
$ ./Launcher 
./Launcher: error while loading shared libraries: libssl.so.10: cannot open shared object file: No such file or directory
```

#### 実行に必要なライブラリがあるか確認します
```bash
$ ldd ./Launcher
	libssl.so.10 => not found
	libcrypto.so.10 => not found
```

#### ライブラリがインストールされているか確認します

```bash
$ ls -la /usr/lib/libssl.so.10 /usr/lib/libcrypto.so.10
lrwxrwxrwx. 1 root root 23  4月 16 15:17 /usr/lib/libcrypto.so.10 -> /usr/lib64/libcrypto.so
lrwxrwxrwx. 1 root root 20  4月 16 14:51 /usr/lib/libssl.so.10 -> /usr/lib64/libssl.so

$ ls -la /usr/lib64/libcrypto.so /usr/lib64/libcrypto.so
lrwxrwxrwx. 1 root root 18  2月  9 09:00 /usr/lib64/libcrypto.so -> libcrypto.so.3.2.1
lrwxrwxrwx. 1 root root 18  2月  9 09:00 /usr/lib64/libcrypto.so -> libcrypto.so.3.2.1
```

#### 無理やり/usr/lib64/にlibcrypto.so.10とlibssl.so.10のリンクを作っても失敗します・・・
```bash
$ ./Launcher 
./Launcher: /lib64/libssl.so.10: version `libssl.so.10' not found (required by ./Launcher)
./Launcher: /lib64/libcrypto.so.10: version `OPENSSL_1.0.2' not found (required by ./Launcher)
./Launcher: /lib64/libcrypto.so.10: version `OPENSSL_1.0.1_EC' not found (required by ./Launcher)
./Launcher: /lib64/libcrypto.so.10: version `libcrypto.so.10' not found (required by ./Launcher)
```

#### OpenSSLはVer1.0.2を必要としますが、Fedora40はVer3.X.Xのようです・・・
```bash
$ strings /usr/lib64/libssl.so.10 | grep OPENSSL
OPENSSL_3.0.0
OPENSSL_3.2.0
OPENSSL_3.0.3
OPENSSL_3.0.1
```
# 結論
### 諦めて1.0.2を入れます
```bash
wget https://www.openssl.org/source/openssl-1.0.2u.tar.gz

tar -xzvf openssl-1.0.2u.tar.gz
cd openssl-1.0.2u

./config --prefix=/opt/openssl-1.0.2 --openssldir=/opt/openssl-1.0.2 shared zlib
make
sudo make install

sudo ln -s /opt/openssl-1.0.2/lib/libssl.so.1.0.0 /usr/lib64/libssl.so.10
sudo ln -s /opt/openssl-1.0.2/lib/libcrypto.so.1.0.0 /usr/lib64/libcrypto.so.10

sudo ldconfig
```

## 無事インストーラが起動しました！
```bash
$ ./Launcher 
./Launcher: /lib64/libssl.so.10: no version information available (required by ./Launcher)
./Launcher: /lib64/libcrypto.so.10: no version information available (required by ./Launcher)
./Launcher: /lib64/libcrypto.so.10: no version information available (required by ./Launcher)
./Launcher: /lib64/libcrypto.so.10: no version information available (required by ./Launcher)
...
```
![Screenshot from 2024-06-05 19-54-27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117164/2663118d-a38d-797f-1066-7eb93798611d.png)
備忘-直列化 & static

## 直列化
インスタンスをバイト列に変換したり、その反対をしたりすることができる仕組みのことです。直列化することにより、ファイルを保存したり、ネットワークで送ったりすることができる様になります。直列化対象のクラスは、java.io.Serializableを実装することが必要になります。

```java
public class Product implements Seralizable {
    private String name;
    private Deals id;
    private int price;
    }
```

ProductsクラスとDealsクラスが直列化を実装していた場合、Productsインスタンスを直列化したときにDealsインスタンスも直列化されます。一方でDealsクラスが直列化を実装していなかった場合はバイト列に変換されたとき、Dealsインスタンスの情報は含まれません。また、復元した場合、idフィールドがnullの状態で復元されます。

加えて、直列化した後に資産が更新された場合、直前で直列化してしまったファイルは矛盾が生じた状態で復元します。この矛盾を未然に防ぐため、シリアルバージョンUIDをクラスに宣言しておきます。シリアルバージョンUIDがあることで、上記のようなことが発生した場合は例外処理が走るようになります。

## static 
new せずに気軽に呼び出すことができるようにする仕組みです。ex)Integer.parseInt() インスタンスのフィールドにstaticが加えられた場合(static変数)、クラスの上にみんなが利用できます。

```java
public class Product implements Seralizable {
    static String name;
    private Deals id;
    private int price;
    }
```

利用する場合は、クラス名.変数名で可能です。上記の場合では、Product.nameで利用できます。また、クラスの上で作られる箱と説明しましたが、product1やproduct2のようなインスタンスを生成した場合は各インスタンスがstatic変数nameを共有して利用していきます。

また。staticはメソッドにも加えることができます。
```java
public static class Product implements Seralizable {
    static String name;
    private Deals id;
    private int price;
    }
```    
クラスにstaticを加えることにより、インスタンスを生成することなくメソッドを呼び出すことができるようになります。

一方で、staticメソッド内では、同一クラス内のstaticがついていない変数を使用することができません、また、メソッドを使用せずにインスタンスを渡す必要がある場合は、通常通りにインスタンスを生成しないといけません。
Patchに関しての力技?

基本的に力技でPowerAppsアプリを作成しているまさキチです。

今日は社内でGallery内にボタンを設置してそのボタンを押すと
ある列の選択肢にある値を入れるという内容だったのですが
うまい具合に更新できなかったので
Screen上にComboBoxを設置Defaultにその値を設定（テーブル型）
Patchからその値を入力という力業で何とか解決しました。

具体的にはOnSelectのプロパティに
Patch(ソース,レコード,{列名:First(ComboBox.SelectedItems)})　（記憶曖昧）
みたいな形で解決できました。

結論としてはKIAIで解決する。

あまり時間がなかったのでこの方法でしか解決できなかったのですが
ほかの方法も多分あると思うので今後別の方法があれば更新します。
【SQL】外部結合のつもりが、内部結合に！  ？

# はじめに
業務でSQLを書いていると
外部結合をしたい場面に出くわすことがよくあります。

正規化されたテーブルは、
だいたいトランザクションにコードだけが入っていて、
その名称を取得しようとする場合、マスタと外部結合しますよね。

# 例えばコンビニのレシート
コンビニレシートの明細がトランザクションとしたとき、商品コードが明細に登録され、
商品マスタが別に存在するという状況をイメージして下さい。

そして、商品にグループがあって、
あるグループの商品だけ名称を取得したいときは、、条件を付けますね。
（**いい例が思いつかず、変な例ですいません。m(_ _)m**）

# 本題
ここで本題です。
条件の位置によって、外部結合のつもりが内部結合になるという事象にぶつかります。

**いや、知ってますよ～。**
という方はここで読むのをやめてもらってOKです。

**え！？　ホントに？**
という方だけ続きを読んでください。

それでは、具体的な例を見ていきましょう。


# 前提
先にコンビニレシートを例にしたのを引継ぎ、そのイメージで進めます。
コンビニレシート：３商品買った。そのうち、１つは「飲み物」とします。
※あえて、飲み物だけ商品名を表示しないとします。
（**また、変な例ですw**）

# SELECT文
ざっくりですが、下記のようなイメージのSQLで取得できます。
**明細は、３行取得されます。**

```sql
select
明細.商品コード
商品マスタ.商品名
商品マスタ.商品価格
from
明細
left outer join 商品マスタ
on (
明細.商品コード = 商品マスタ.商品コード
and 商品マスタ.グループ <> ’飲み物’ 
)
where
明細.お会計シーケンス = ’いまのお会計のユニークNo’
order by
明細.バーコードを読み取った順
```


# SELECT文（条件の位置を変えてみる）
上記のSQLの「飲み物」以外という条件をwhereの方に持って行きます。
**明細は２行取得され、なんと「飲み物」の行が消えます。**

```diff_sql
select
明細.商品コード
商品マスタ.商品名
商品マスタ.商品価格
from
明細
left outer join 商品マスタ
on (
明細.商品コード = 商品マスタ.商品コード
- and 商品マスタ.グループ <> ’飲み物’  --★条件を移動（削除する）
)
where
明細.お会計シーケンス = ’いまのお会計のユニークNo’
+ and 商品マスタ.グループ <> ’飲み物’  --★ここに移動（追加する）
order by
明細.バーコードを読み取った順
```

# なぜ「飲み物」の行が消えたのか？
これは、どの段階で条件が適用されるのかが理解できれば、
簡単にわかるはずです。

## from句
from句に条件があるときを見てみます。
「明細」に「left outer join 商品マスタ」を外部結合する。
その時の条件として、on句に「商品マスタ.グループ <> ’飲み物’」の条件があるとき、
商品マスタを「飲み物以外」に絞った結果と「明細」を外部結合します。
**（商品マスタから「飲み物」がなくなった状態で、外部結合しているイメージ）**

## Where句
Where句に「商品マスタ.グループ <> ’飲み物’」の条件があるときを見てみます。
明細と商品マスタを外部結合した「結果」のデータに対して、条件を付けている事になります。
**（明細と商品マスタを外部結合した時点では、「飲み物」の行がある。）**

よって、外部結合したのに、
内部結合したかのような結果が取れてしまいます。

勘のいい方は、もうわかった！と思っていることでしょう。
厳密には記述通りに動作していていますから、
「本題」で書いた「~~内部結合になる~~」の記述は間違いですね。ごめんなさい。

# まとめ
今回は、いつ適用されるのか？が焦点でした。
`group by`や、`order by`などの句がいつ適用されるのかを意識すると、思わぬ不具合を回避できます。
十分に分かっている方も一度見直してみたら、新たな発見があるかも知れません。