OmniAICreator/Qiita-1.07M huggingface dataset:
ARC166回答メモ

0.はじめに
　最近レートが徐々に上がってきたので調子に乗って参戦したところ
　1問も解けずレートも32ダウン・・・。
　1か月積み上げたレートが戻りました・・。

　解説を見ながら解くと、A、Bともなんとか解けたので
　めげずにチャレンジしていきたいと思いました。


1.A - Replace C or Swap AB
　初見で、以下の場合分けで行ける！と実装するも
　サンプルすら通らず・・・。
　　xの値　yの値　結果(同じ場合はOKとして)
　　AorB　　C　　 ”No”
　　A　　　　B　　xの後ろの値がBorCで、yの後ろの値がAならok
　　B　　　　A　　xの前の値がAorCで、yの前の値がBならok

　一回操作した箇所を繰り返し操作すればいろいろ何とかなるんだな
　と気づき仕切りなおし。

　Cで区切ったエリアごとの判断でよいと気づき
　エリア内のXとYのAB個数が同じで、
　X側とY側の値が異なる部分の先頭がAならOKと
　雑に実装したところ、サンプルは通りましたが
　WA13RE6と今一でした。

　試験後解説と正解した人の解答を見たりして考慮しなおしたところ
　以下の考え方でACとなりました。
　　・Cで区切られたブロック内のXとYのABの数をそれぞれカウント
　　・X内のA<Y内のAかつX内のB<Y内のBでなければ”No”を出力して終了
　　・X文字列内のCは先頭からチェックしていきY内のAと同じ数になるまでは
　　　Aに変換し、それ以降はBに変換
　　・再度エリアを先頭から見ていき、それぞれのAの数を数える
　　　Y側のAの数が上回るアドレスがある＝AB→BA変換でどうにもならなくなる
　　　と判断し、”No”を出力して終了
　　・すべてのエリアでNoにならなかったら”Yes”を出力して終了

　条件をロジックに落とし込む部分が1時間悩んでも出てこなかったところが
　今後経験でひらめくようになるかは疑問ですが数をこなしていくしかないかなと
　思いました。

　https://atcoder.jp/contests/arc166/submissions/46396027



2.B - Make Multiples
　A問題に行き詰ったときにふと見て、行けるかなーと思いましたが
　まだAの方が行けそうな気がした気がしたのでスルーしました。

　解説を読んで、なるほど感が強かったです。
　3つ選ぶという条件を考えればあとは力技で行けるというのが
　全く出てきませんでした。

　実装は以下のようにしました。
　【下準備】
　　aとb、bとｃ、aとc、aとbとcそれぞれの最小公倍数を求める
　　（コンテスト用Pythonのバージョン上がってlcm使えて楽でした。）
　【リスト内数字毎の約数計算】
　　リストを頭から見ていき
　　a,b,c,ab約数,ac約数,bc約数,abc約数それぞれの倍数にするために必要な
　　操作回数をリストに格納。
　　リストは、a約数,b約数,c約数,ab約数,ac約数,bc約数ごとに作り
　　値はタプルで、左に約数に必要な操作数、右にインデックスを格納
　　abcについては、回答に使う場合には最小値の1つしか必要ないので
　　リストではなく、最小値を保持
　【解答計算部】
　　[N＝1]の時
　　　abcの倍数最小値を出力して終了
　　[N＝2]の時
　　　N=2の時は、回答とするための組み合わせが限られるので
　　　以下のそれぞれを算出し
　　　　abのリストの1つ目とcのリストの2つ目を足した数
　　　　abのリストの2つ目とcのリストの1つ目を足した数
　　　　acのリストの1つ目とbのリストの2つ目を足した数
　　　　acのリストの2つ目とbのリストの1つ目を足した数
　　　　bcのリストの1つ目とaのリストの2つ目を足した数
　　　　bcのリストの2つ目とaのリストの1つ目を足した数
　　　　abcの倍数最小値
　　　その中で最小値を出力して終了
　　[N＝3]の時
　　　それぞれのリストを昇順にソートし
　　　先頭３つにカット(よく考えたら別にカットしなくてもよかった)
　　　[3つの数を操作するケース]
　　　　aのリスト、bのリスト、cのリストから１つずつ選んで
　　　　インデックスがかぶっていなかったら合計値を保存
　　　　→その中の最小値を保持
　　　[2つの数を操作するケース]
　　　　N=2の時の組み合わせで、リストからそれぞれ選んで　
　　　　インデックスがかぶっていなかったら合計値を保存
　　　　→その中の最小値を保持
　　　[1つの数を操作するケース]
　　　　abcの倍数最小値

　　　上記3ケース内で、一番小さい数字を出力して終了

　最初は、全組み合わせと考えたらどう考えても時間足りん！と思いましたが
　ひと工夫で何とかなり目からうろこでした。

　https://atcoder.jp/contests/arc166/submissions/46397079



以上
<備忘録>Viteで作ったReact app内の全てのconsole.logを一瞬でdeactivateする方法

## React内のconsole.logをbuild時に一括deactivate
サーバーにアプリを上げる前に、console.logを一括してディアクティヴェート出来る超便利な方法があるんだけど、いつもやり方を忘れるので、備忘録としてログ。

1,rollup-plugin-strip をインストール

```bash
npm install @rollup/plugin-strip --save-dev
```
２、vite.configのdefineConfig()を編集
```javascript
import strip from '@rollup/plugin-strip';

export default defineConfig({
  plugins: [
    react(),
    strip({
      // remove all console.log calls
      include: ['**/*.js', '**/*.jsx', '**/*.ts', '**/*.tsx'],
      functions: ['console.log'],
    }),
  ],
})
```
たったこれだけで、Reactをbuild時にReact内の全てのconsole.logをワイプアウト。
超便利。＊ビルド時にconsole.logは省かれるだけでファイルにはそのまま残ります。
wslでelixir その80

# 概要
wsl(wsl2じゃない)で、elixirやってみた。
livebookでExplorerやってみた。

# 参考にしたページ

https://qiita.com/RyoWakabayashi/items/167d6b8c9215ade42346

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/68eb8717-2612-9d76-edee-bad0a2c87aca.png)

# サンプルコード

```
defmodule Qiita do
  @auth_header {"Authorization", "Bearer ***"}
  def get_articles(page) do
    "https://qiita.com/api/v2/authenticated_user/items?page=#{page}&per_page=100"
    |> Req.get!(headers: [@auth_header])
    |> Map.get(:body)
  end

  def get_articles_cyclic(page) do
    IO.inspect("get page #{page}")
    :timer.sleep(1000)
    articles = get_articles(page)

    case articles do
      [] ->
        IO.inspect("stop")
        articles

      _ ->
        articles ++ get_articles_cyclic(page + 1)
    end
  end

  def get_all_articles() do
    get_articles_cyclic(1)
  end
end

all_articles = Qiita.get_articles(1)
Enum.count(all_articles)

qiita_df =
  all_articles
  |> Enum.map(fn item ->
    %{
      "title" => item["title"],
      "private" => item["private"],
      "created_at" => NaiveDateTime.from_iso8601!(item["created_at"]),
      "page_views_count" => item["page_views_count"],
      "likes_count" => item["likes_count"],
      "likes_rate" => item["likes_count"] / item["page_views_count"],
      "stocks_count" => item["stocks_count"],
      "stocks_rate" => item["stocks_count"] / item["page_views_count"],
      "tags" => item["tags"] |> Enum.map(& &1["name"]) |> Enum.join(","),
      "length" => item["body"] |> String.length()
    }
  end)
  |> Explorer.DataFrame.new()
  |> Explorer.DataFrame.select([
    "title",
    "private",
    "created_at",
    "page_views_count",
    "likes_count",
    "likes_rate",
    "stocks_count",
    "stocks_rate",
    "tags"
    "length"
  ])

Kino.DataTable.new(qiita_df)

get_values = fn df, col ->
  df
  |> Explorer.DataFrame.pull(col)
  |> Explorer.Series.to_list()
end

x = get_values.(qiita_df, "title")
y = get_values.(qiita_df, "page_views_count")

VegaLite.new(width: 800, height: 400)
|> VegaLite.data_from_values(x: x, y: y)
|> VegaLite.mark(:bar)
|> VegaLite.encode_field(
  :x,
  "x",
  type: :nominal,
  title: "title",
  sort: %{"field" => "y", "order" => "descending"}
)
|> VegaLite.encode_field(
  :y,
  "y",
  type: :quantitative,
  title: "page_views_count"
)



```

以上。
【Ruby on Rails】bundle installをもう少し速くしたい時の設定

# はじめに
`bundle install`実行時に`gem`が膨大になってくると、その分実行時間が長くなるのが地味にストレスでした。調べたところ、速くする方法があったのでまとめます。

# 前提条件
- `bundler`がバージョン**1.5**以上である事
```ruby
bundler -v
Bundler version 2.4.17
```
# コマンド
```ruby
bundle install --jobs=4

#or

bundle install -j4
```
このコマンドで**並列処理**で実行してくれるようになり、処理が速くなるケースが多くなります。

https://qiita.com/4_mio_11/items/7f418ca661d9f5a2a39d

`time`コマンドをつけると、実行時間を測ることができます。

```ruby
time bundle install -j4
Bundle complete! 16 Gemfile dependencies, 75 gems now installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.

real	0m0.534s
user	0m0.373s
sys	    0m0.149s
```

オプションを設定で省略することもできるそうです。

```ruby
bundle config --global --jobs 4
bundle install
```

# 参考
https://qiita.com/volanja/items/2acea95a2c8b5fc0d6ab
React 基本的な事項を記録

# npm, yarn
javascript パッケージ管理ツール

npm : node package manager
　ーnode.js
　ーreact.js
　で使用する大半のパッケージをインストールできる。

yarn :
　Facebookで作ったパッケージ管理ツール
　npmよりもキャッシング、保安、信頼性が改善された。
　npm install -g yarn : yarn install できる。

＊node.js download install
https://nodejs.org/en/download/releases

# 駆動方法
node -v : node.js version 確認
npm -v : npm version 確認
yarn -v : yarn version 確認

＊プロジェクトフォルダの中で
npm i -g create-react-app

＊プロジェクトフォルダ abc を作って
npx create-react-app abc

yarn start : react サーバーを実行
ブラウザ localhost:3000 で画面確認
src/index.js : <React.StrictMode></React.StrictMode> タグを削除し、生命周期関数を何回も実行する原因を除去する。

react の場合
　npm i
　npm start

react, node プロジェクトの場合、両方の経路にてそれぞれ
　npm i　（or yarn i） : package.json ファイルにあるパッケージリストがinstallされる。
　yarn dev : react, node サーバーを同時に駆動する。

jsx
　ジェイエスエックス。
　HTMLと似たような記述をすることができる「Javascriptの拡張構文」。

# 生命周期
以下だと
1 : 1回だけ
2 : constructor の後
3 : -
4 : 最後に実行される
5 : state 変更時、実行される

順
1 => 2 => 3 => 4 => 2 => 5 => 3
```
class Lifecycle extends Component {
    // 1
	constructor(props) {
        ...
	}

    // 2
    static getDerivedStateFromProps(props, state) {
        ...
	}

    // 3
	render() {
        ...
	}

    // 4
	componentDidMount() {
		// setStateで stateを設定
		this.setState({
            ...
		});
		// これで shouldComponentUpdate が実行される
	}

    // 5
	shouldComponentUpdate(props, state) {
        ...
		return true;
		// return がtrueであるため、 render がもう一度実行される
	}
}
```

# jquery 使用
npm i jquery

```
...
import $ from 'jquery';
...
```
wslでelixir その79

# 概要
wsl(wsl2じゃない)で、elixirやってみた。
livebookでExplorerが使いたいので、wslをubuntu20.04にした。

# 手順

livebookインストールまで

```
$ wget https://packages.erlang-solutions.com/erlang-solutions_2.0_all.deb

$ sudo dpkg -i erlang-solutions_2.0_all.deb

$ sudo apt update 

$ sudo apt install erlang 

$ erl +V
Erlang (SMP,ASYNC_THREADS) (BEAM) emulator version 13.0.4

$ wget https://github.com/elixir-lang/elixir/releases/download/v1.14.5/elixir-otp-25.zip
 
$ unzip elixir-otp-25.zip

$ cd bin
$ sudo cp elixir elixirc iex mix /usr/local/bin/

$ cd ..
$ cd lib
$ sudo cp -R * /usr/local/lib

$ cd ..
$ cd man
$ sudo cp * /usr/local/man

$ elixir --version
Erlang/OTP 25 [erts-13.0.4] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [jit:ns]

Elixir 1.14.5 (compiled with Erlang/OTP 25)

$ iex --version
Erlang/OTP 25 [erts-13.0.4] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [jit:ns]

IEx 1.14.5 (compiled with Erlang/OTP 25)

$ mix --version
Erlang/OTP 25 [erts-13.0.4] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [jit:ns]

Mix 1.14.5 (compiled with Erlang/OTP 25)

$ mix do local.rebar --force, local.hex --force

$ mix escript.install hex livebook


```


以上。
OpenGLとDirectXの違い

# OpenGLとDirectXの違い #

OpenGLとDirectXは、両方とも3Dグラフィックスおよびコンピュータゲーム開発に使用されるAPIですが、異なる特性と設計を持っています

1. プラットフォーム依存性:
   - OpenGLはクロスプラットフォームのAPIであり、Windows、Linux、macOSなどさまざまなオペレーティングシステムで使用できます。
   - DirectXはMicrosoftが開発したAPIで、主にWindowsプラットフォームで使用されます。したがって、DirectXを使用する場合、Windows向けのゲームやアプリケーションを開発することが一般的です。

2. バージョンと機能セット:
   - OpenGLはさまざまなバージョンが存在し、それぞれ異なる機能セットを提供します。バージョンによっては一部の機能が制限されていることもあります。
   - DirectXはシェーダーモデル（SM）と呼ばれるバージョンを持ち、各バージョンで新しい機能が追加されています。SM5.0はDirectX 11で、SM6.0はDirectX 12で導入されました。

3. シェーディング言語:
   - OpenGLではGLSL（OpenGLシェーディング言語）が使用されます。
   - DirectXではHLSL（High-Level Shader Language）が使用されます。

4. シェーダーモデルとパフォーマンス:
   - DirectX 12は、より低レベルでのハードウェアアクセスを提供し、複数のCPUコアを活用して高いパフォーマンスを得ることができます。
   - OpenGLは一般により高レベルのAPIであり、DirectX 12よりも効率的なマルチスレッド処理を実現しにくい場合があります。ただし、OpenGLでもOpenGL 4.5以降でより低レベルのアクセスが可能になりました。

5. サポートされているプラットフォーム:
   - DirectXは、Windows PC、Xbox、および一部のWindows Phoneデバイスなど、Microsoftのプラットフォームに特化しています。
   - OpenGLは多くのプラットフォームで動作し、モバイルデバイス（Android、iOS）、ゲームコンソール（PlayStation、Nintendo Switch）、およびデスクトップPCなど、さまざまなデバイスで使用されています。
GLSLとHLSLの違い

# GLSLとHLSLの違い #

GLSL（OpenGLシェーディング言語）とHLSL（High-Level Shader Language）は、それぞれ異なる3DグラフィックスAPIで使用されるシェーダー言語です。これらの言語の主な違いを以下に記します。

1. 使用するAPI:
   - GLSL: OpenGLとその派生プラットフォームで使用されます。
   - HLSL: DirectXおよびその関連プラットフォーム（例：Xbox、Windows）で使用されます。

2. データ型の違い:
   - GLSLは`float`、`vec2`、`vec3`、`vec4`などのベクトル型を提供します。
   - HLSLは`float`、`float2`、`float3`、`float4`などのベクトル型を提供します。また、HLSLにはデータ型として`half`もサポートされています。

3. テクスチャサンプリング:
   - GLSLでは、テクスチャサンプリングに`texture2D`などの関数が使用されます。
   - HLSLでは、テクスチャサンプリングに`Texture.Sample`などのメソッドが使用されます。

4. シェーダーモデル:
   - GLSLはバージョンによって機能が異なり、OpenGLのバージョンに依存します。
   - HLSLはシェーダーモデル（例：SM5.0）を指定して、シェーダーの動作を明示的に制御できます。

5. シェーダープログラムのエントリポイント:
   - GLSLでは、シェーダープログラムのエントリポイントは`main`関数です。
   - HLSLでは、シェーダープログラムのエントリポイントは`VertexShader`（頂点シェーダー）や`PixelShader`（ピクセルシェーダー）など、シェーダータイプに応じて異なります。

6. プリプロセッサディレクティブ:
   - GLSLでは、`#version`ディレクティブを使用してGLSLのバージョンを指定します。
   - HLSLでは、`#pragma`ディレクティブを使用してコンパイラの設定を指定することが一般的です。

7. バッファとリソースバインディング:
   - GLSLでは、バッファやリソースのバインディングに対する表記方法がプラットフォーム依存です。
   - HLSLでは、`register`キーワードを使用して明示的にバッファやリソースをバインドします。

8. サポートされているプラットフォーム:
   - GLSLは主にOpenGLおよびその派生プラットフォーム（例：WebGL）で使用されます。
   - HLSLは主にDirectXおよびその関連プラットフォーム（例：Xbox、Windows）で使用されます。

9. ツールとエコシステム:
   - GLSLはオープンソースのエコシステムとツールが豊富で、LinuxやmacOSなどの多くのプラットフォームでサポートされています。
   - HLSLはMicrosoftのエコシステムと密接に統合されており、Windowsプラットフォームでの開発に適しています。

10. シェーダーコンパイラ:
    - GLSLのコンパイラは、OpenGLのバージョンによって異なり、バージョンの互換性に注意が必要です。
    - HLSLのコンパイラは、DirectX SDKに含まれており、バージョン間の互換性が比較的高いです。

どちらを選択するかは、プロジェクトの要件とターゲットプラットフォームに依存し、以下三つが決め手になると思います。

- ターゲットプラットフォーム: 開発者はどのプラットフォームでアプリケーションを実行するかを考慮する必要があります。OpenGLを使用する場合はGLSLを、DirectXを使用する場合はHLSLを選びます。

- ツールとエコシステム: 開発者の経験や好み、使用するツールに応じて言語を選びます。Microsoftエコシステムとの統合が必要な場合はHLSLが適しています。

- シェーダーモデルと機能要件: プロジェクトの要求仕様に合わせてシェーダーモデルと機能を選択します。特定の機能が必要であれば、それに対応する言語を選択します。
勉強メモ

①スクラッチOrg VS Developer​

開発時にはDeveloperを奨励。​

スクラッチはコマンドベースで環境構築もできるが、30日で消える環境で、構築当初まっさらな環境。

主に新しい技術などのテストや検証目的が適しており、長期の開発​にはDeveloperのほうが向いていると考える。

​

②オムニチャネルとは？​ServiceCloudVoiceとは？

​ServiceCloudVoiceは、設定ベースで開発ができ、機能としてはオムニチャネルやCTI（=AmazonConnect、IVRなども対応）、音声テキスト化による作業時間短縮、Einsteinの奨励回答による応答時間短縮、オムニチャネルスーパーバイザーなど機能を内包している。

ServiceCloudVoiceを適応する場合、設定ベースでCTI（=AmazonConnect）と連携可能。以前はAppExchangeなどからOpenCTIを落としてSalesforceのコールセンターに読み込むなどの対応が必要だった。（ちなみにServiceCloudVoiceは、AmazonConnect以外のCTIを使うことも勿論可能。）

▽ServiceCloudVoiceの設定​

​https://base.terrasky.co.jp/articles/KRS2u

​

▽ServiceCloudVoiceの主要概要

https://help.salesforce.com/s/articleView?id=sf.voice_key_concepts.htm&type=5​

​

オムニチャネル自体は、​複数のチャネル（メールやチャットなど）からの問い合わせを一元管理し、各担当者のプレゼンスやスキル、業務量に応じたルーティングを行う機能。

▽ServiceCloudVoice​

​https://www.salesforce.com/jp/products/service-cloud/solutions/call-center-management/

​

▽オムニチャネルの設定

→スキルベースがコーディングになっているので少し古い。今は設定ベースでオブジェクトと項目値に応じたスキルの優先度策定が可能。

https://savepo.com/how_to_omni_channel​

​

※リードやケースの割り当てルールは使ってないようです。（念ため問い合わせ中）​

​

③マルチオルグの際に、資源が二重になるが、同資源管理やリリースを実施するか？​

要件次第だが、Org間で多少は資源が異なるので、基本的にGitのプロジェクトは分ける。SandboxもOrgが違うから当然分かれる。（GitやJenkins自体は1つかもしれないが、実施のタイミングなどは分ける）

共通機能への影響・修正などがあった際にも、基本的には片方でまずは開発テストなど行い、もう片方に資源を渡し、同様にテスト・影響有無・動作検証など実施。​

​

④代理管理の機能、具体的に？→ユーザの作成・有効化、編集、無効化、PWリセットなど

​

⑤プラットフォームイベントの技術

→昨今はPubSubAPIでSubscribe/Publish可能（以前はCometDを使ってストリーミングAPIでSubscribe、PublishはRESTAPIなどで実施）

▽20:35あたり​

https://www.youtube.com/watch?v=B-p4OUOgj1U

​

​⑥要件トレーサビリティのメリット

→要件トレーサビリティとは、要件と設計書や資源、テストなどをマッピングしたもので、品質向上（抜け漏れ確認）や変更があった際の影響確認​などに寄与する

​

⑦CoEとは？

→技術に限らずベストプラクティスや標準化を行い、組織のパフォーマンスや効率向上を目的としたチーム。

​
計算プロパティ名を理解する

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Object_initializer#%E8%A8%88%E7%AE%97%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3%E5%90%8D

括弧 [] の中に式を記述することができ、それが計算されてプロパティ名として使用されます

```js
// Computed property names (ES2015)
let i = 0;
let a = {
  ["foo" + ++i]: i,
  ["foo" + ++i]: i,
  ["foo" + ++i]: i,
};

console.log(a.foo1); // 1
console.log(a.foo2); // 2
console.log(a.foo3); // 3

const items = ["A", "B", "C"];
const obj = {
  [items]: "Hello",
};
console.log(obj); // A,B,C: "Hello"
console.log(obj["A,B,C"]); // "Hello"

let param = "size";
let config = {
  [param]: 12,
  ["mobile" + param.charAt(0).toUpperCase() + param.slice(1)]: 4,
};

console.log(config); // {size: 12, mobileSize: 4}

```
Rのloadingsパッケージの紹介

# はじめに

Rの[loadingsパッケージ](https://cran.r-project.org/web/packages/loadings/)をCRANで公開しています (<https://cran.r-project.org/web/packages/loadings/>)。先日、バージョン0.4.1をリリースしましたので、その内容を少しご紹介できればと思います。

# 目的

loadingsは、主成分分析やPartial least squares(PLS)のローディング(主成分負荷量、PLS負荷量)を計算するためのRパッケージです。Rで主成分分析を計算する際には、prcomp関数などが用いられていますが、例えばprcomp関数では、主成分係数(固有ベクトル、重み)はrotationで出力されますが、主成分負荷量は出力されません。loadingsパッケージを用いることで、主成分負荷量を出力することが出来ます。

# なぜ主成分負荷量が必要か？
主成分負荷量は、主成分スコアと元のデータの各変数との相関係数で定義されています。データを各変数に対してautoscaling(平均0、分散1)した場合には、主成分係数と主成分負荷量は比例しますので、主成分係数の値が大きな上位10変数を選ぶのと、主成分負荷量の値が大きな上位10変数を選ぶのとは、全く同じ変数が選ばれます。


しかし、上位10変数で良いのか、上位30変数まで確認すべきなのかを判断するには、その値の大きさに閾値を設定して判断する必要がありますが、主成分係数ではそれができません。主成分負荷量は相関係数そのものなので、その値の大きさ(例えば相関係数0.7以上など)で上位何個の変数まで選べばよいのか統計的な基準で判断することが出来るようになります。

# Rのloadingsパッケージで出来ること

[主成分分析](doi:10.1186/1471-2105-15-51)、PLS、群に順序がある時のPLSである[PLS-ROG(rank order of groups)](doi:10.1002/cem.2883)、[OS-PCA(orthogonal smoothed PCA)](doi:10.3390/metabo11030149)、マルチセットPLS、[マルチセットPLS-ROG](doi:10.1101/2022.08.30.505949)、[片側カーネル主成分分析](doi:10.51094/jxiv.262)と、それらのローディングを計算することが出来ます。またローディングの仮説検定を行い、p値を計算することも出来ます。

また、最近バージョンアップを行って、PLS-DA(discriminant analysis)と[RCCA-DA (regularized canonical correlation analysis) ](doi:10.1016/j.bej.2007.12.009)とローディングも計算できるようになりました。

# PLS-DAのローディング
今回loadingsパッケージに追加したPLS-DAのローディングについて簡単に紹介します。PLS-DAはplsやchemometricsパッケージなどで計算出来ますが、これらで計算されるローディングは、データをautoscalingした時には、PLSスコアと元のデータの各変数との相関係数に比例しますが、相関係数そのものではありません(主成分係数と主成分負荷量の関係に似ています)。

そこで、PLS-DAのローディングを相関係数に変換するためのplsda_loading関数を追加しました。これにより、PLS-DAスコアと元のデータの各変数との相関係数であるPLS-DA負荷量を計算するようになり、変数の選ぶ際の基準を設定しやすくなります。

# おわりに
Rのloadingsパッケージについて紹介しました。今回はその一部だけご紹介しましたが、他にも例えばRCCA-DAでは、PLS-DAでは群間差が分かれにくい場合でも、群間差が明確に表れる結果が得られる事があります。loadingsパッケージは、サンプルの数よりも変数の数が多いオミックスデータの解析に有用です。パッケージの詳細や使用例については、[CRANのloadingsページ](https://cran.r-project.org/web/packages/loadings/)をご覧ください。

また、利用時のフィードバックや提案もお待ちしています。何かお困りの点や質問がありましたら、遠慮なくお寄せください。loadingsが皆さまの研究やデータ解析にお役に立てれば幸いです。
git 復習 備忘録

# Git の基本

https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E5%9F%BA%E6%9C%AC-Git-%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AE%E5%8F%96%E5%BE%97

https://backlog.com/ja/git-tutorial/intro/02/

# ワーキングツリー、インデックス

https://kray.jp/blog/expound-git-add/

# untrackedとは
https://git-scm.com/book/en/v2/Git-Basics-Recording-Changes-to-the-Repository#:~:text=Untracked%20basically%20means%20that%20Git%20sees%20a%20file%20you%20didn%E2%80%99t%20have%20in%20the%20previous%20snapshot%20(commit)%2C%20and%20which%20hasn%E2%80%99t%20yet%20been%20staged%3B%20Git%20won%E2%80%99t%20start%20including%20it%20in%20your%20commit%20snapshots%20until%20you%20explicitly%20tell%20it%20to%20do%20so

過去のコミットに含まれなかった、まだステージされていないファイルを見ることを意味します。

# git cleanの使い方

https://prograshi.com/general/git/git-clean/

# git fetch、git merge、git pullの違い

https://qiita.com/wann/items/688bc17460a457104d7d
git pull でエラーがあって元に戻したい、コンフリクトを無くしたいという時は、
まずpull = fetch + mergeなので、mergeを取り消す。
```
$ git merge --abort
```

```
$ git reset --hard HEAD
```
直前のcommitまで戻して、無かった事にする。


# git merge
fast-forward
no-fast-forward
https://www.sejuku.net/blog/71003#index_id12

# originとは

https://stackoverflow.com/questions/9529497/what-is-origin-in-git

```terminal
git push origin branchname
```
- 特定のリモートリポジトリのシステム上の別名。

# remoteとは
- リポジトリの URL を格納するエイリアス。
- 各リモートの URL を確認するには、次のようにする。
    ```terminal
    $ git remote -v
    origin  https://github.com/yamatai12/git-training.git (fetch)
    origin  https://github.com/yamatai12/git-training.git (push)
    ```
    - push コマンドでは、remoteを使うこともできるし、URLを直接使うこともできる。
    - URLを使う例
    ```
    git push https://github.com/yamatai12/git-training.git main
    ```

# git pull 時の warning

https://qiita.com/tearoom6/items/0237080aaf2ad46b1963

# git rebase

https://www.sejuku.net/blog/71919

# git force push したけど戻したい時

https://zenn.dev/kagerou_ts/books/kts-github-use-tips/viewer/force-push
dnSpyを使って気づいた問題点

# dnSpyとは?
C#で作った実行可能ファイルやDLL(詳しく言うと違うが)をC#のコードとして覗いたり､改変したりすることができるツール｡
最近のゲーム業界なんかはC#がなぜか標準になっているので､主にゲームのチートを作るのに使われている｡
# dnSpyでできること
デコンパイルしたコードを眺めるだけでなく､変数なんかがどこで使われていたりとかを調べたり､設定次第でデバッガーとして利用することもできる｡まあ一番の機能はデコンパイルして改変する機能で､一部がコンパイルエラーを吐いたりしても無視して部分コンパイルできるのはすごく便利である｡普通にビルドに時間がかかるものを少しだけ改変したいときはこいつを使うのも正規の開発でも十分ありえる｡
# dnSpyでコンパイルできないことがある
本題｡
dnSpyは特定のC#の機能に対してはうまくデコンパイルが働かないようで､例えばLINQのWhere()だったり､async/awaitだったりは元のC#ではなくて､コンパイラーが自動生成した中間コードに寄ったコードになってしまい､元のコードを再現してくれない｡
そういうときは元のコードを推測して脳内デコンパイルをしないといけないのだが､これがまた難しい｡
見分け方としてはenumerator2など数字がついたそのまんまな変数があって､コンパイルエラーを吐く部分だ｡
元のLINQなどのコードがわかっていればなんとなく脳内デコンパイルできるようになる｡
UI・UXについて


学習の備忘録。今回はUI、UXについて。

参考記事・サイト：[UI、UXって何？](https://www.ntt.com/business/services/application/crm-dm/bconnection/lp/article-uiux-invoice.html)

# UIとUXについて
- UIとは？
User Interfaceの略。
ユーザーとサービスを繋ぐものであり、ユーザーが目に触れるものは全てUIという（ユーザーが操作する画面だけでなくマウス、タッチ画面などもUIに含まれる）

- UXとは？
User Experienceの略。
ユーザーが商品やサービスを通じて得られる体験の事。

→商品やサービスを利用するユーザーの満足度に関わる。
ユーザーの目的に合った使いやすいUIの商品・サービス作成はUXへ向上へつながる。利用率アップへ。

# 優れたUIとUXを設計するために

大切な事は下記の3点。
- ユーザー目線である事
- 目にする情報が多すぎない事
- デバイスごとの使いやすさがある事


# 学習した書籍
人の心を動かすUXについて学習したかったので、更に下記書籍にて学習。

書籍：[「ついやってしまう」体験のつくりかた　人を動かす「直観・驚き・物語」のしくみ](https://amzn.asia/d/g3noMfa)

「つい」やりたくなる気持ちにさせる事が大事なんだと学びました。
マリオやドラクエなど実際のゲームを基に解説しているので分かりやすかったです。
うっとおしかったクリボーが、UXを考える上でまさかあんな役割をしてるなんて…とびっくり。
開発者目線で商品やサービスを使うのも面白いかもしれない！と思いました。

#### 大切な事
①直観のデザイン
一連の体験を通じてプレイヤーに情報を伝える。

「仮説→試行→歓喜」

ユーザーが立てた仮説をユーザー自ら試行し、仮説があっていたと分かると喜びが生まれる。
体験そのものをシンプルで簡単にする事が大事。

②驚きのデザイン
予想外の結末を起こし、飽きさせないようにする。
上記に記載した直観のデザインだけだと予想通りすぎて飽きてしまう。

「誤解→試行→驚愕」
Javaで「キーボードから入力された値を取得する」の動作を確認してみた

# 概要

Javaで「キーボードから入力された値を取得する」の動作を確認してみました。以下のページを参考にしました。

https://www.javadrive.jp/start/scanner/index1.html

# 実装

以下のファイルを作成しました。
```JSample1_4.java
import java.util.Scanner;

class JSample1_4{
  public static void main(String[] args){
    Scanner scanner = new Scanner(System.in);

    System.out.println("趣味を入力してください。");

    String hobby = scanner.nextLine();
    String[] tokens = hobby.split("\\s+");
    for (int i = 0 ; i < tokens.length; i++){
      System.out.println("[" + i + "]" + tokens[i]);
    }
  }
}
```

以下のコマンドを実行しました。
```
$ javac JSample1_4.java 
$ java JSample1_4 
趣味を入力してください。
読書 映画 スポーツ
[0]読書
[1]映画
[2]スポーツ
```

# まとめ

何かの役に立てばと。
mrubyのi2c

mrubyのデバイスアクセスメソッドの標準化ができたようです。

i2cを見てみます。

https://github.com/mruby/microcontroller-peripheral-interface-guide/blob/main/mruby_io_I2C_ja.md

2023/10/9現在の私の作ったものの仕様です。

# mruby on FreeBSD(ZRouter.org)

```ruby
    struct RClass *bsdiic;
    bsdiic = mrb_define_class(mrb, "BsdIic", mrb->object_class);
    mrb_define_method(mrb, bsdiic, "initialize", mrb_bsdiic_init, MRB_ARGS_REQ(1));
    mrb_define_method(mrb, bsdiic, "read", mrb_bsdiic_read, MRB_ARGS_REQ(2));
    mrb_define_method(mrb, bsdiic, "write", mrb_bsdiic_write, MRB_ARGS_REQ(3));
    mrb_define_method(mrb, bsdiic, "writes", mrb_bsdiic_writes, MRB_ARGS_REQ(2));
```

https://github.com/yamori813/mruby-bsdiic

# mruby on YABM

```ruby
  mrb_define_method(mrb, yabm, "i2cinit", mrb_yabm_i2cinit, MRB_ARGS_REQ(3));
  mrb_define_method(mrb, yabm, "i2cchk", mrb_yabm_i2cchk, MRB_ARGS_REQ(1));
  mrb_define_method(mrb, yabm, "i2cread", mrb_yabm_i2cread, MRB_ARGS_REQ(2));
  mrb_define_method(mrb, yabm, "i2cwrite", mrb_yabm_i2cwrite, MRB_ARGS_REQ(3));
  mrb_define_method(mrb, yabm, "i2cwrites", mrb_yabm_i2cwrites, MRB_ARGS_REQ(3));
  mrb_define_method(mrb, yabm, "i2creads", mrb_yabm_i2creads, MRB_ARGS_REQ(2));
```

https://github.com/yamori813/mruby-yabm

これらはYABMクラスに他のデバイスメソッドといっしょに入っています。

完全に合わせることは出来ませんが、ちょっと寄せる方法を考えてみます。

I2Cモジュールのような低速のデバイスをFreeBSDで処理するのはCPUの無駄になるので、センサーからデータを拾うような処理はYABMの方が向いています。

おうちの気温などはbcmbm-mruby(YABM)で拾って、FreeBSDなモジュールにHTTPで渡しています。

I2Cはいろいろな仕様がありますが、センサーなど多くは1バイトのアドレスと1バイトのデータの読み書きする仕様です。

一回の処理で行われるのか以下のケースがあります

* 書き込みのみ
* 読み込みのみ
* 書き込みした後に読み込み(逆は無い)

BsdIicのwritesの機能をwriteに入れてwritesを消しました。(2023/10/10)

BsdIicのreadの仕様を変更しました。read,writeでエラーを返すようにしました。(2023/10/22)

BsdIicのreadのもともとあったバイトオペレーションを戻しました。(2023/10/24)

BsdIicのreadの返り値を読み込みサイズが1の時はintが返り、それ以外の場合はArrayが返るようにしました。(2023/10/28)

YABMの仕様をBsdIicに合わせました。(2023/11/20)
ローカライゼーションの力

<h1>PyMuPDFドキュメントの日本語化が不可欠な理由</h1>

![jp-blog.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3573216/ca7b3659-1043-adcc-ddcb-cdde1ceb2a83.png)

今日のグローバル化した世界では、企業は常に視野を広げ、新しい市場に手を伸ばし、多様なオーディエンスとつながっています。このような拡大に伴い、特に技術領域では効果的なコミュニケーションが必要となります。より多くの読者にリーチし、ユーザーエクスペリエンスを向上させるための価値ある戦略の1つが、技術文書のローカライズです。このブログでは、<b>PyMuPDF</b>で日本語版の技術文書が利用できるようになるまでの7つのポイントをご説明します。

その前に、私たちが日本語化の必要性を感じた主な理由ですが、以下のような<b>PyMuPDF</b>のブログ記事が日本のサイトに掲載されることが増えていることに気づいたからです：

https://kojichu.photoruction.com/entry/2023/04/28/090000

https://katoo-post.hatenablog.com/entry/2022/01/09/230653

https://python-work.com/?s=pymupdf

このような状況を踏まえ、私たちは日本のユーザーのために日本語のドキュメントを提供する必要があると考えました。

<h2>1. 日本語で開発する</h2>
日本人が欧米の出版物を翻訳する豊かな伝統を持っていることは、歴史が証明しています。現在では、最新の技術に関する英語の書籍が、出版されてから半年以内に翻訳され日本の書店で購入できるなど、多くの技術文書が積極的に翻訳され、出版されています。このような文化と日本語ドキュメントの豊富さを考慮し、<b>PyMuPDF</b>の日本のユーザーにも同じ開発者エクスペリエンス（<b>DX: Developer Experience</b>）を提供したいと考えました。

<h2>2. 日本市場へのコミットメント</h2>
私たちは、日本のお客様特有のニーズに応えることを約束し、日本語と日本の文化に合わせた質の高いユーザー・エクスペリエンスに投資したいと考えています。私たちは、このコミットメントが信頼を築くだけでなく、顧客満足度を高めることを願っています。

<h2>3. 法令遵守</h2>
業界によっては、規制や法的要件を満たすために、翻訳された技術文書を提供することが不可欠な場合があります。たとえば日本では、日本の法律や基準に準拠するために、特定の製品やサービスには日本語の文書を含める必要があります。日本語版を用意することで、潜在的な法的問題を回避し、<b>PyMuPDF</b>の市場性を確保したいと考えています。.

<h2>4. 開発者エクスペリエンスの向上</h2>
開発者エクスペリエンスは製品の採用と顧客満足において非常に重要な要素です。私たちは全体的なエクスペリエンスを大幅に向上させ、日本のユーザーが<b>PyMuPDF</b>を理解しやすくなり、問題のトラブルシューティングが容易になり、機能を最大限に活用できるようになることを願っています。

<h2>5. サポートコストの削減</h2>
効果的な技術文書は、チームの負担を大幅に軽減します。開発者が疑問に対する答えをドキュメントで見つけることができれば、カスタマーサポート・チャンネルを通じて支援を求める可能性が低くなります。これは時間とリソースの節約になるだけでなく、チームの効率向上にもつながります。

<h2>6. 日本文化への感受性</h2>
グローバルな市場では、文化的なニュアンスを理解し、尊重することが不可欠です。日本市場向けにドキュメントをローカライズすることで、文化的規範や価値観に沿った内容にすることができます。これにより、誤解や意図しない不快感を避けることができ、日本のユーザーに好意的に受け入れていただけると考えています。

<h2>7. 国際市場への成長</h2>
私たちは<b>PyMuPDF</b>を新しい市場に拡大したいと考えています。 <b>Python</b>は日本では非常に重要なプログラミング言語であり、私たちは日本市場全体で新しい製品やサービスのための新しくエキサイティングな機会を見つけたいと考えています。
私たちの願いは、<b>PyMuPDF</b>を<b>PDF</b>に関するニーズに最適なソリューションとして日本の開発者たちに認知していただくことです。

詳細はこちらをご覧ください：

https://pymupdf.readthedocs.io/ja/latest?utm_source=qiita&utm_medium=website&utm_content=inline-link
エンジニアとして業務を経てService・Repositoryパターンを学び直す

## 何故学び直すのか
学生時代に大まかなService・Repositoryの役割について学んできました。
ですが、学んできた役割と実際に業務で使用されているService・Repositoryの役割の違いについて学ぶことが出来ました。
業務内にて学んだことをまとめながら記事を書ければと思っています

## 3階層システム
今回の記事に対して前提として「3階層システム」という概念を理解していくことにします。
システムの構成方法の一つになります。分けられ方としては下記のようになります。

- プレゼンテーション層(ユーザーインターフェイス層)
    - UI・UXなどのユーザーが見る部分
- アプリケーション層(ビジネスロジック層)
    - システムの処理がある部分
- データアクセス層(データベース層)
    - データに読み書きする部分

今回は`アプリケーション層(ビジネスロジック層) = Service`と`データアクセス層(データベース層) = Repository`がメインの話になってきます。

## Serviceの役割
Serviceはビジネスロジックを担当していきます。
ビジネスロジックは「アプリケーションビジネスルール」と「エンタープライズビジネスルール」の2つに分けることが出来ます。

- エンタープライズビジネスルール
    - システムに関係ない業務内のビジネスルールのこと
- アプリケーションビジネスルール
    - システムがあってこそ成り立つビジネスルールのこと
    - 例：DBに保存できるように

## Repositoryの役割
データベースとのやり取り、外部APIとのやり取りを担当します。

## 業務を経て学んだこと
上記に記載したServiceの役割・Repositoryの役割については学生時代んに学んだことと業務上では違いがありませんでした。
ですが、大きく違い・学んだことは「Serviceに役割を持たせ過ぎてはならない」ということです。
今まではRepositoryはデータベースからデータの取得、Serviceでは取得してきたデータを整形をしてControllerに渡すと考えてきましたが、商品ごとの売上・作品ごとの売上などのような情報を出力する際に売上の計算を全てServiceで行ってしまうとメモリを食い尽くして正常に機能が完了しないという事案が発生することがありました。
そのため機能を正常に完了させるにはServiceに処理を集約させるのではなく、Repositoryで出来ることを(売上の計算など)を行うことでメモリを食い尽くすことなく正常に処理を完了することが出来ると学びました。
また、Repositoryではデータベースからデータの取得・売上の計算を担当・ServiceではRepositoryから受け取ったデータを整形するという役割分担をすることでよりコードが読み安くなることを学びました。

## 最後に
学生時代に学んだことは業務で活かせる場面が多くありました。
ですが、業務で使用方法は実際に業務に携わることでしか学ぶことが出来ないものだと学ぶことができました。
今後も今まで学んできたことを業務ベースに書き換えて今後のエンジニア業務に活かしていきたいです。

## 参考
* [「ビジネスロジック」とは何か、どう実装するのか](https://qiita.com/os1ma/items/25725edfe3c2af93d735#%E3%83%93%E3%82%B8%E3%83%8D%E3%82%B9%E3%83%AD%E3%82%B8%E3%83%83%E3%82%AF)
* [Repositoryパターンにおける、MVC + Service + Repositoryの役割をもう一回整理してみる
](https://zenn.dev/naoki_oshiumi/articles/0467a0ecf4d56a)
(レジ直出力)ESP32の18番、高速Lチカで遊ぶ。1



目的
カラー液晶駆動の為にWR(18)を
目にも止まらない速度でLチカする。


![o_cop654.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/342436ce-0d8b-35fc-e7ad-bc2b49b60ad6.jpeg)


プログラム(1)

```c++:main.cpp


//GPIO_ESP32_HS_IO_1
//ESP32用の高速I/O

//インクルド
#include <Arduino.h>

//定義
#define GPIO_0to31SET_REG   *((volatile unsigned long *)GPIO_OUT_W1TS_REG)
#define GPIO_0to31CLR_REG   *((volatile unsigned long *)GPIO_OUT_W1TC_REG)



//WR信号を出力
void HS_GPIO_WR(int o_a) {


   //ゼロの場合は、クリア　それ以外は、セット
   if( o_a == 0 ) {

     //クリア
     GPIO_0to31CLR_REG = GPIO_0to31CLR_REG | (1<<18);

   } else {

     //セット
     GPIO_0to31SET_REG = GPIO_0to31CLR_REG | (1<<18);

   } //end if

} // end GPIO_WR



//初期化
void setup() {


    //ポートの初期化
    pinMode(18, OUTPUT);

    //無限ループ
    while(1){

        //高速I/O
        HS_GPIO_WR(0);//WRB=0; 10
        HS_GPIO_WR(1);//WRB=1; 10


    } //end while


}//setup


//メインループ
void loop() {}


```


-------------------------------------------------------


レポート1

コメントがあったので追試をしました。

プログラム(1)の高速化Lチカは、約3.5Mhzだと測定されました。


![o_cop655.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/8005a883-3a6f-f61a-4ffc-881912e521da.jpeg)


--------------------------------------------------

レポート2

本当にLチカしているかのテスト
おもちゃの最大300khzのPCオシロを使い100msのウエートを入れてテスト


プログラム(2)

```c++


//GPIO_ESP32_HS_IO_1
//ESP32用の高速I/O

//インクルド
#include <Arduino.h>

//定義
#define GPIO_0to31SET_REG   *((volatile unsigned long *)GPIO_OUT_W1TS_REG)
#define GPIO_0to31CLR_REG   *((volatile unsigned long *)GPIO_OUT_W1TC_REG)



//WR信号を出力
void HS_GPIO_WR(int o_a) {


   //ゼロの場合は、クリア　それ以外は、セット
   if( o_a == 0 ) {

     //クリア
     GPIO_0to31CLR_REG = GPIO_0to31CLR_REG | (1<<18);

   } else {

     //セット
     GPIO_0to31SET_REG = GPIO_0to31CLR_REG | (1<<18);

   } //end if

} // end GPIO_WR



//初期化
void setup() {


    //ポートの初期化
    pinMode(18, OUTPUT);

    //無限ループ
    while(1){

        //高速I/O
        HS_GPIO_WR(0);//WRB=0; 10

        delay(100);

        HS_GPIO_WR(1);//WRB=1; 10

        delay(100);


    } //end while


}//setup


//メインループ
void loop() {}



```

![o_cop656.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/5972426f-00cd-d3e8-9c6b-dc56a796a292.jpeg)
Apple Vision OS Simulatorで遊んでみる

Apple Vision ProのOSである、Vision OSのSimulatorを試してみます。

## 環境
- Macbook Air(2020)
- OS: Sonoma 14.0
- Xcode 15.1 beta
- visionOS 1.0 Simulator

## 進め方
### 1. 環境構築
- Xcode 15.1 betaを[公式のURL](https://developer.apple.com/download/all/)よりダウンロード

![スクリーンショット 2023-10-09 4.37.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415967/3fd4ae73-0a7d-5496-dca7-08957836cea3.png)

- 初回起動時には開発プラットフォームを選択する画面が表示されるので、最下部の「Vision OS 1.0」を選択して「Download&Install」をクリックします。

### 2. 新規プロジェクトを作成する
- 「Create New Project」をクリックし、新規プロジェクトを作成します。

![スクリーンショット 2023-10-09 4.46.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415967/0cfe6603-3906-aac0-03f9-3eab2518e858.png)

- TemplateでVisionOSを選択すると、VisionOSのSimulatorのダウンロードが始まります。
（ファイルサイズは7GBほどです）

![スクリーンショット 2023-10-09 5.05.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415967/68c92fa8-4101-552d-50bd-47d5e7cd564e.png)

### 3. Simlatorを起動する
- SimulatorのDLが済むとプレビュー画面が起動します。

![スクリーンショット 2023-10-09 5.21.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415967/3cfe8753-0c37-c78e-d248-cbb7142278c4.png)

### 4. Sampleアプリで遊んでみる
- sampleコードが[公式ページ](https://developer.apple.com/documentation/visionos/world)からDLできるので、sampleアプリを起動してみます。
- デフォルトのアプリケーションを操作することができます。

![スクリーンショット 2023-10-09 5.59.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415967/576afe95-ce1d-662f-61d6-c8133e1a4c39.png)
![スクリーンショット 2023-10-09 5.59.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415967/1cdf931b-fe66-71f7-34a0-10361cba6517.png)


- 地球儀を空間上に配置し、視点を移動・回転させることもできます。

![ezgif.com-optimize.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415967/ad20f429-6021-852e-d7d3-bef104a1ac57.gif)
【FPS向上】Pythonでメインディスプレイ↔拡張モードに切り替えるスクリプト

# コードを書いたきっかけ
マルチディスプレイを使っているとValorantやApexのFPSが下がったためワンクリックでシングルモニター↔マルチモニターを切り替えれるようにしたかった。

## 準備するもの
・Python(Path通し済)
・Screeninfoライブラリ

### Screeninfoライブラリをインストール
```
pip install screeninfo
```
ディスプレイ情報を取得するためのライブラリです。

### ソースコード

```Python:DisPlaySwitch.py
import subprocess
from screeninfo import get_monitors

# ディスプレイモードを判定する関数
def get_display_mode():
    try:
        monitors = get_monitors()

        # モニターが1つしかない場合は "PC screen only" と判定
        if len(monitors) == 1:
            return "PC screen only"
        else:
            return "Extend"
    except Exception as e:
        print("Error:", str(e))
        return "Error"

def execute_display_mode_script(mode):
    try:
        if mode == "Extend":
            subprocess.run(['DisplaySwitch.exe', '/internal'], shell=True)
        elif mode == "PC screen only":
            subprocess.run(['DisplaySwitch.exe', '/extend'], shell=True)
        else:
            print("Unknown display mode:", mode)
    except Exception as e:
        print("Error:", str(e))

display_mode = get_display_mode()

execute_display_mode_script(display_mode)
```

## 仕組み
Screeninfoライブラリからディスプレイ情報を取得して、DisplaySwitchで切り替えてます。

※筆者のPythonバージョンは3.10.2です。
【Golang】base64でエンコードされたデータをデコードして、AWS S3にアップロードする

## 概要
Goを使って、Base64でエンコードされた文字列をJSONで受け取り、S3にアップロードしてみます。APIアクセス周りはEchoを使いました。
ファイルをS3にアップロードする際に、クライアントサイド／サーバーサイドのどちらから行うのか、またデータをどのようにやりとりするのか、などの観点で色々方法はあると思いますが、今回はBase64文字列をJSONで受け取り、デコードしてS3にアップロードする方法を試してみました。

参考：[ファイルをS3にアップロードするときはサーバー?クライアント?](https://kenny27.hatenablog.com/entry/2019/06/07/233541)

### バージョン
- Echo：4.5.0
- Go：1.17.1

## ファイル構成
```
main.go
aws/
  ├ config.go
  └ s3.go
```

## aws-sdk-goのインストール

```go
go get -u github.com/aws/aws-sdk-go
```

## config.go
以下のように、awsのアクセスのための環境変数を読み込めるよう設定しておきます。

```go:config.go
package aws

type AwsConfig struct {
	AwsRegion          string
	AwsAccessKeyID     string
	AwsSecretAccessKey string
}

func NewConfig() *AwsConfig {
	return &AwsConfig{
		AwsRegion:          os.Getenv("AWS_REGION"),
		AwsAccessKeyID:     os.Getenv("AWS_ACCESS_KEY_ID"),
		AwsSecretAccessKey: os.Getenv("AWS_SECRET_ACCESS_KEY"),
	}
}
```


## s3.go
データのアップロードの処理を書いていきます。

```go
type S3 struct {
	AwsConfig *AwsConfig
	Uploader  *s3manager.Uploader
}

func NewS3(c *AwsConfig) *S3 {
	sess := session.Must(session.NewSession(&aws.Config{
		Credentials:      credentials.NewStaticCredentials(c.AwsAccessKeyID, c.AwsSecretAccessKey, ""),
		Region:           aws.String(c.AwsRegion),
		S3ForcePathStyle: aws.Bool(true),
	}))
	return &S3{
		AwsConfig: c,
		Uploader:  s3manager.NewUploader(sess),
	}
}

func (u *S3) UploadPhotostockImage(image string) (string, error) {
	data, _ := base64.StdEncoding.DecodeString(image)
	wb := new(bytes.Buffer)
	wb.Write(data)

	filename := "test.png"
	result, err := u.Uploader.Upload(&s3manager.UploadInput{
		ACL:         aws.String("public-read"),
		Bucket:      aws.String("*****"),
		Key:         aws.String("*****/" + filename),
		ContentType: aws.String("png"),
		Body:        wb,
	})
	if err != nil {
		return "", err
	}

	return aws.StringValue(&result.Location), nil
}
```
2023/10/9最新版 MacTerminalからGitHubにSSHでログインする方法

文字通り、MacのTerminalからGitHubにSSHでログインする備忘録です。
お役に立てれば幸いです。

※Terminalに入力する際、基本的に""は取り除いてください。
例：cd "ここに～～～"　→ cd ここに～～～

# 1.Terminalでユーザ名、メールアドレスを登録する。

次のコマンドをMacのTerminalで実行してください。

```
git config --global user.name "あなたのGithubユーザ名"
```

あなたのGithubユーザ名がわからない場合、まずGithubにログインして、プロフィール画像をクリックすると確認できます。（下図参照）
![0f4c0496dfd743e17119f941b24ab600.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3573172/7b58e18a-840e-3c1f-9bc0-54c212af335c.png)

```
git config --global user.email "Githubに登録したメールアドレス"
```
Githubに登録したメールアドレスを確認する方法は
プロフィール画像をクリック→Setting　で設定画面へ移動し
Access→Emails　に進むことで確認できます。

# 2.新しいSSHキーを作成する。
次のコマンドをMacのTerminalに入力してください。
```
ssh-keygen -t ed25519 -C "Githubに登録したメールアドレス"
```

これを実行すると、
1.作成したSSHキーをどこに保存するか聞かれるので、デフォルトで良ければEnter、場所を指定する際はそのパスを入力してください。

2.SSHキーを利用するためのパスワードを聞かれるため、適当なパスワードを決めてください。何も入力せずにEnterを押すことで無しにも可能です。

このパスワードはCloneやPushする際など、結構な頻度で入力を求められますので、しっかりメモしておきましょう。

# 3.SSHキーをssh-agentに追加
Terminalに次を入力
これはそのまますべてをコピペしてください。
```
eval "$(ssh-agent -s)"
```
※もしかしたらSudoする必要があります。その際は、suを頭に足してください。

# 4.コンフィグファイルを確認
次のコマンドを実行
```
open ~/.ssh/config
```

次のコマンドを実行
```
touch ~/.ssh/id_ed15529
```
```
open ~/.ssh/id_ed15529
```
すると、何やら入力できそうな画面が出てきますので、次をコピペしてください。
```
Host github.com
  AddKeysToAgent yes
  UseKeychain yes
  IdentityFile ~/.ssh/id_ed25519
```
次のコマンドを実行
```
ssh-add --apple-use-keychain ~/.ssh/id_ed25519
```
次のコマンドを実行
これを実行すると、クリップボードにTokenがコピーされますので、取り扱いには気をつけてください。
```
pbcopy < ~/.ssh/id_ed25519.pub
```
では、コピーしたTokenをGithubに登録しましょう。

# 5.Github.comで設定
プロフィール画像（右上）→Setting→ssh adn gph keys→New SSH Key（もしくはAdd ssh key）へ移動
名前をつける（識別しやすく）
AuthでOK
Tokenをペースト（もしかしたら改行などをいい感じに整理しないとかもしれません。）

# 6.完了
以上でTerminal上でGithubにログインできたはずです。
実際にプライベートリポジトリをTerminal上でクローンしてみてください。

```
git clone "下の画像を参照してコピペ"
```
![c1785c784b2a88c4968dedb85fa2d109.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3573172/46d92898-93eb-2dbd-6d55-9647adb2a474.png)

これはあくまで公開時点（2023/10/09）の最新情報ですので、もしかしたら仕様が変わったり、そもそもSSHが利用できなくなっているかもしれません。
その際は、公式のヘルプを参考にしてみてください。

https://support.github.com/
phpタグ<?php ?>を瞬時に書きたい。。

phpを学び始めて<code>&lt;?php  ?&gt;</code> のタグだけ何故かショートカットとして存在しないという、なんとも地味に煩わしい問題にぶち当たり調べたところ、「html.json」という場所に設定することで簡単にphpタグを入力することが可能になる記事を発見したのでご紹介。

https://zenn.dev/miz_dev/articles/157a7aaad0bdcf

非常に分かりやすく解説されていたので、記事が無くなっても良いようにメモがわりに投稿します。

# 設定方法
左下の歯車（設定）から「ユーザースペニット」を選択
![スクリーンショット 2023-10-09 3.42.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569237/74fa3f58-d1a2-f887-324b-4460e55079a2.png)
画面上部から「html.json」を検索し選択
![スクリーンショット 2023-10-09 3.42.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569237/980d28f0-568c-ef7a-1c99-0915929cbe8e.png)
すると、こんな画面が出てきます。
![スクリーンショット 2023-10-09 3.46.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569237/83b66501-8930-d16e-e5f9-3f937b32e789.png)

英語表記で設定方法について記載してありますが、これは消しても大丈夫です。

ここに以下のコードを貼り付ければOK！
```py:html.json
{
  "php": {                         //スペニット名
	"prefix": "php",               //ショートカットの読み
	"body": ["<?php $1?>"],        //展開されるコード($1は展開後のカーソル位置)
	"description": "php tag"       //スペニットの説明欄（任意）
	}
},
```
これで「"php"+"tabキー"」で<code>&lt;?php  ?&gt;</code>を瞬時に出すことが可能になります。

※ちなみに上記の設定のまま「"pp"+"Enterキー"」と打てばより爆速に<code>&lt;?php  ?&gt;</code>の展開が可能です。


もう少し詳しく！という方は上記「Miz_dev」さんの記事を参照してみて下さい。
2023/10/9主にITとかセキュリティの記事

サイバー犯罪対策「一人一人がセキュリティー意識を」　警視庁・田中俊恵副総監インタビュー(10/7)
https://news.yahoo.co.jp/articles/55296c814230e50da036ade6fa43c3a2e91b62b0?source=rss

Web3キャンペーンサービス「Galxe」にDNS攻撃　約2,400万円流出か(10/7)
https://coinpost.jp/?p=485210

多数の「Linux」ディストリビューションに影響する脆弱性--パッチ適用を(10/6)
https://japan.zdnet.com/article/35209946/

「人を審査するAI」のリスクとは？　現金給付アルゴリズムが“暴走”した世界銀行の事例(10/7)
https://www.sankei.com/article/20231007-AJNBD3FHEFLAJBK7TKRUKBDQGI/

韓国選管の内部ネットワーク、外部からアクセス可能な構造だった【独自】(10/7)
https://www.chosunonline.com/site/data/html_dir/2023/10/06/2023100680095.html

AliExpressを運営する中国企業Alibabaが「スパイ活動容疑」でベルギーの諜報機関から監視されていることが判明(10/6)
https://gigazine.net/news/20231006-alibaba-espionage-belgiums-intelligence-service-monitors/

JPモルガン「イーサリアムはステーキング増加で中央集権化進行」(10/7)
https://coinpost.jp/?p=485179

未払い・ランサムウェア被害…詐欺電話次々と　さらに口座開設を指示し悪用も　70代女性が560万円の被害【新潟】(10/6)
https://news.yahoo.co.jp/articles/56f029aeeb9c1d269a2fc44a0e04504e62480002

SQL Serverからクラウドへ横移動するサイバー攻撃を発見、設定の確認を(10/7)
https://news.mynavi.jp/techplus/article/20231007-2786006/

独自の製造技術情報を中国企業へ提供したとみられる事案についてまとめてみた(10/7)
https://piyolog.hatenadiary.jp/entry/2023/10/07/002351

クラーケン（Kraken）はMiCA法にもかかわらず欧州で拡大=オランダのブローカーを買収へ(10/6)
https://nextmoney.jp/?p=61448

日出町社協にサイバー攻撃「まさかうちが」メールアドレス約５００件流出　ＨＰも利用できない状態に　大分(10/6)
https://news.yahoo.co.jp/articles/e3b66e22775d5480d2885cd21c7d734a3ab1d647
リンク切れのレコードを判別して削除する[Python, Access]

## 背景
アホが書いた記事なのに下記の記事のviewが10000超えてて驚愕しました。
非常に励みになります。

https://qiita.com/walfiesfan/items/85a95605a0fb9792f6a6

もう少しちゃんとしたいと思い、ファイル名やパスが変わってリンク切れになった場合の対処も書いときます。

## おさらい
Accessで、こんなテーブルのPath列にPowerpointファイルのファイルパスが入っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3471244/463aa801-5011-3dfd-ef2c-836562674de7.png)



## 方針
・リンク先のファイルがあるか確認
・なかったら消す
の処理を行うpyodbcを使ったコード

## コード
```python
import os
import pyodbc

#データベース接続
conn_str= (
    r'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};'
    r'DBQ=C:\Database.accdb;'#Accessファイルのパス
    )
conn=pyodbc.connect(conn_str)
cursor=conn.cursor()

#全レコードの取得
sql_select="SELECT [Path] FROM [テーブル1]"
cursor.execute(sql_select)
path_list=[item[0] for item in cursor.fetchall()]
path_list=list(set(path_list)) 

#リンク切れのファイルのレコードを削除
for fpath in path_list:
    path_for_sql=fpath.replace(r"'",r"''") #シングルクォートのエスケープ
    if not os.path.exists(fpath):
        cursor.execute(r"DELETE FROM [テーブル1] WHERE [Path] = '" + path_for_sql + "'")
        print (fpath + "はリンク切れのため削除")

cursor.commit()

cursor.close()
conn.close()
```
cursor.executeからのfetchallを使った全レコードリスト取得は汎用性ありそうですね。(自分用メモ)



## 動作確認

実行前　リンク切れのレコードをわざと追加してあります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3471244/ff906647-167f-0d24-dda1-cdf2ec260b65.png)

実行画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3471244/6c5892c4-3807-506e-1a01-2853c59ef69f.png)

実行後　レコードが消されてますね。OK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3471244/e1fc2913-3d17-c423-1f83-b455e8242eb9.png)


## 注意
ネットワーク上のPowerpointファイルのパスについては、LANの問題とかでファイルサーバーへのアクセスができない場合もリンク切れと判定されてレコードが消されるかもしれない。
そこで実行前にファイルへのアクセスが可能か確かめ、念のためバックアップ(Accessファイルのコピー)もとっておく。
MPU6050 使用方法 まとめ

# 単体テスト

https://mechadiy.com/mpu6050%E3%82%92arduino%E3%81%A7%E4%BD%BF%E3%81%86%E2%91%A0%E5%85%A5%E9%96%80%E7%B7%A8/

# 複数使用

4個使う例

https://www.chisatofu.com/archives/26862572.html

A0をHIGHにするとi2cのアドレスが変わることを利用．
各IMUに対して，対象以外のアドレスをデフォルト以外のアドレスに変換して設定 & データ取得を行っている．

# LPF

- 記事

https://zenn.dev/from_f/books/c88ddde6c21f66/viewer/b839ad

- 仕様書(https://invensense.tdk.com/wp-content/uploads/2015/02/MPU-6000-Register-Map1.pdf)より

記事では0x05なのでBandWidth 10Hz, Delay: 13.8

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/bd63cac4-a201-d338-ded7-45f4dfac31a3.png)

一番フィルタをかけるアドレスは0x06.BandWidth: 10, Delay 19.0になる.

- ChatGPTのパラメータ説明

https://chat.openai.com/share/d032ed45-f108-4e7c-a333-6a1266933126
Gaussの法則の証明

:::note warn
警告
間違いがあるかもしれません．その都度指摘していただければ幸いです．
:::

　Gaussの法則を立体角を用いて証明する．立体角についての説明は天下り的で，あまり正確なことは書けないが，感覚的にわかっていることをまとめた．


# 立体角
　まず，立体角について述べておく．立体角とは，二次元における角度の考えを三次元へ拡張したものである．はじめに，二次元における角度として単位円の円周を例に挙げよう．単位円における微小な円周の長さを$d\theta$とすると，円周は次式で求められる．
```math
\int_{0}^{2\pi}d\theta=2\pi
```
当たり前ではあるが，こうなっている．また，これが立体角では次のような関係になっている．$S$は基準としている点を囲む球，$\Omega$は立体角である．
```math
\int_{S}d\Omega=4\pi
```
ここでなんとなくわかるのが，二次元では微小角$d\theta$の積分により，単位円の円周が$2\pi$が求められたように，どうやら三次元では微小立体角$d\Omega$の積分によって単位球の表面積が求められた，ということである．

　立体角の公式として
```math
d\Omega=\frac{dS}{r^2}
```
がある．この式を見ると，微小面積$dS$を点から微小面積までの距離$r$の二乗で割っているので，その値はどんな形の閉曲面でも単位球として考えたときと等しいことが分かる．
<img width="250" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3573115/fe049663-879e-bb68-d293-c726b3b519d0.jpeg">
上図からも分かる通り，閉曲面内にある点から閉曲面を立体角の視点から見たとき，あらゆる方向で閉曲面は単位球としてとらえられるので，閉曲面$S$で積分してやれば$4\pi$となるわけだ．

　立体角を身近なもので例を挙げるとしたらプラネタリウムだろうか．宇宙の大きさや形は詳しくは分かっていないが，宇宙を，湾曲している箇所があったりする閉曲面内の空間だとする．しかし，プラネタリウムでは実際にその空間の形を再現しているわけではなく，(半)球に見える範囲の宇宙を投影しているわけである．

　つまり，立体角とは，囲んでいる閉曲面の形を問わず，ある点を指定したときに，そのある点が見えている範囲を，単位球に落とし込んで考えられる三次元の角度，なのである(と思っている)．

# Gaussの法則の証明
　さて，Gaussの法則を証明しよう．
<img width="250" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3573115/25758fc4-c6b4-fa04-e22e-e3598f23338a.jpeg">
上図のように，点電荷$q$が閉曲面で囲まれている場合を考える．このとき点電荷が$\boldsymbol{r}$に作る電場は
```math
\boldsymbol{E}(\boldsymbol{r})=\frac{q}{4\pi\varepsilon_0}\frac{\boldsymbol{r}-\boldsymbol{r}'}{|\boldsymbol{r}-\boldsymbol{r}'|^3}
```
である．両辺に$d\boldsymbol{S}$の内積をとると，
```math
\boldsymbol{E}\cdot d\boldsymbol{S}=\frac{q}{4\pi\varepsilon_0}\frac{(\boldsymbol{r}-\boldsymbol{r}')\cdot d\boldsymbol{S}}{|\boldsymbol{r}-\boldsymbol{r}'|^3}
```
となるが，ここで微小面積$d\boldsymbol{S}$の法線ベクトルを$\boldsymbol{n}$，そのベクトルと電場$\boldsymbol{E}$のなす角を$\theta$とすると，
```math
\boldsymbol{E}\cdot d\boldsymbol{S}=\frac{q}{4\pi\varepsilon_0}\frac{\boldsymbol{n}\cdot d\boldsymbol{S}}{|\boldsymbol{r}-\boldsymbol{r}'|^2}
=\frac{q}{4\pi\varepsilon_0}\frac{dS\cos\theta}{|\boldsymbol{r}-\boldsymbol{r}'|^2}
```
ここで$dS\cos\theta$を$dS'$と置くと，
```math
\boldsymbol{E}\cdot d\boldsymbol{S}=\frac{q}{4\pi\varepsilon_0}\frac{S'}{|\boldsymbol{r}-\boldsymbol{r}'|^2}
```
となる．ここで立体角を用いる．$d\Omega=\frac{dS}{|\boldsymbol{r}-\boldsymbol{r}'|^2}$と置くと，
```math
\boldsymbol{E}\cdot d\boldsymbol{S}=\frac{q}{4\pi\varepsilon_0}d\Omega
```
と変形できた．これより，
```math
\int_S \boldsymbol{E}\cdot d\boldsymbol{S}=\int_{単位球の表面全体}\frac{q}{4\pi\varepsilon_0}d\Omega
=\frac{q}{4\pi\varepsilon_0}\cdot 4\pi=\frac{q}{\varepsilon_0}
```
となり，示された．

また，点電荷が閉曲面内に存在しない場合，点電荷から出ている電場は閉曲面を貫かないか，閉曲面を二度貫いているかのどちらかである．(閉曲面に接していることは考えない．)閉曲面を面文化ない場合は自明的に
```math
\int_S \boldsymbol{E}\cdot d\boldsymbol{S}=0
```
である．閉曲面を二度$\boldsymbol{r_1}$と$\boldsymbol{r_2}$で貫いている場合，それぞれの法線ベクトルの向きからわかるように，$\cos{\theta}_1$，$\cos{\theta}_2$の正負が異なる．$\cos{\theta}_1>0$であったとすると，立体角は$d\Omega$と置けるが，そうすると$\cos{\theta_2}<0$となるので，こちらの立体角は$-d\Omega$となる．このことから，
```math
\int_S \boldsymbol{E}\cdot d\boldsymbol{S}=\int_{単位球の表面全体}\frac{q}{4\pi\varepsilon_0}d\Omega+\int_{単位球の表面全体}\frac{q}{4\pi\varepsilon_0}(-d\Omega)
=0
```
となり，閉曲面内に電荷が存在しない場合についても示された．
大学院生が応用情報技術者試験を受けた＋就活について

# 1. プロフィール
* 地方国立大学院生
* DeepLearning系の研究してますがあまり研究は向いてないかもと悩み中
* Atcoder茶 (早く緑になりたい)
* 基本情報技術者試験は7月に合格
* そろそろ就活
* Web系の会社に行きたい

# 2. 応用情報について
午前はマークシート式，午後は記述式で11問の中から5問を選択します．
しかし，セキュリティは必須選択なので結果的に4問を選択しなければなりません．

詳しくは[IPA](https://www.ipa.go.jp/shiken/kubun/ap.html)に書いてあります．

# 3. 基本情報との比較
* 基本情報はいつでもCBTで受けることができますが，応用情報は年に2回
* 午後問題は記述式
* 午後問題の分野数が2から11に


簡単にまとめるとこんな感じです．


個人的な感想として，応用情報の午後問題は分野数が増えるため難しかったです．

基本情報の午後はセキュリティをすこし勉強しただけで，Atcoderで茶色の自分でさえプログラミングは何も勉強する必要がありませんでした．


応用情報の午後問題は，分野数が増えるかつ，記述式のためプログラミング以外の分野は結構勉強しました．


# 4. 使用した教材について
* 午前問題
キタミ式イラストIT塾 応用情報技術者 令和05年を購入しましたが一度も開くことがありませんでした．ごめんなさい．
![](https://m.media-amazon.com/images/I/51enI2JSVsL._SY445_SX342_.jpg)

午前問題は，過去問を解きました．

みんな大好き[応用情報技術者試験ドットコム](https://www.ap-siken.com/apkakomon.php)です．

2611問中1729問正解(66.2%)で試験に行きました．


* 午後問題
午後問題は2冊使いました．

1冊目は情報処理教科書 出るとこだけ！応用情報技術者［午後]　です．
![](https://m.media-amazon.com/images/I/51xw7iBebFL._SY445_SX342_.jpg)

2冊目は2022 応用情報技術者 午後問題の重点対策 (重点対策シリーズ)　です．
![](https://m.media-amazon.com/images/I/51NSK5mNtiL._SY445_SX342_.jpg)

緑本を解いた後に青本を解きました．

個人的な感想としては．先に青本を解けばよかったと思います．
青本の方には多少の解き方が載っています．私は，これに助けられました．


緑本を解いて気になった部分がほとんど青本には書かれていたのです．

# 5. 選択した分野
まず，選択しようとした(勉強した)分野は以下の9つです．
* セキュリティ(必須)
* プログラミング 
* 情報システム開発
* データベース
* システム監査
* 組込みシステム開発
* ネットワーク
* サービスマネジメント
* システムアーキテクチャ

上から順に自信のあった科目です．本番では上の6つのうちから選択しようと準備していました．

実際に選択した科目
* セキュリティ(必須)
* プログラミング　
* 情報システム開発
* データベース
* 組込みシステム開発

解答用紙をみてシステム監査の記述が多かったので問題も見ずに組込みシステム開発に切り替えました．

# 6. 受験を終えて

公式の解答を確認した結果午前問題は54/80(67.5%)でした．

午前問題は知らない単語が多かったと思います．

あまりできた感じがしなかったですが60%を超えていたので良かったです．

マークミスがないことを祈ります．


___

午後問題は，意外と解けました．

特にデータベースは易化したと思います．

まだ，結果が分からないので不安は不安です．

# 7. 結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620679/afce32d2-f50a-e1ce-3295-d5d9d895735d.png)

合格していました！！
午前問題は自己採点通りでした．
午後問題もしっかりできていたので良かったです．

# 8. 次に受験予定の資格について

応用情報に合格したら，ネットワークスペシャリストかデータベーススペシャリストを受験したいです．

また．E資格も受験しようと考えています．

# 9. 最後に

初めてQiitaで長い記事を書きました．
Markdownに慣れ親しんでないので読みにくかったかもしれません．許してください．

# 10. 就活について
就活は苦戦しています．正直，資格などはあまり役に立っている実感がありません．
資格よりも開発経験を重視していると思いました(自分が開発できないため)．何かしらの制作物を作っておいた方がいいです．Githubなどに公開できるようなものを作りましょう！

(追記)
12月から4月までエンジニアとして長期インターンをしました．
応用情報技術者試験に出たこと(BCP，データベース，開発手法など)をいろいろ体験できました．
今となって思うのはやらなくて後悔するよりやって後悔したほうがよかった．技術力が不安で夏のインターンには参加していませんでしたが，長期インターンを通して何とかなる(質問する．家でインプット，インターン先でアウトプットする)ことが分かりました．

技術力に不安があってもインターンは参加してみたほうが良いです．
Ansibleを使ってサーバを操作する。

## はじめに
Ansibleとは構成管理ツールです。
簡単に言うと手順書を書いておけば自動でサーバにsshで接続して色々構築してくれるツールです。
一度に複数サーバに対して同時に命令を実行させることもできるそうです。
今回は、PC（mac）からサーバ（cent os）にshellを実行させるまでをゴールにしようと思います。

## 準備するもの
ひとまず、必要なファイルだけ用意しておきましょう。


```hosts:hosts
xx.xxx.xxx.xxx
```
hostsファイルにはipアドレスを記載してください。
sshで上記のアドレスに接続します。

```yml:packages.yml
- hosts: xx.xxx.xxx.xxx
  connection: ssh

  tasks:
   - name: test
     shell: cd /var/hoge && mkdir test
```
```shell```に実行したいコマンドを記載します。
こちらのymlファイルに色々と命令を書くことができるらしいです。
hostsとpackages.ymlは適当なディレクトリに格納しておいてください。

## 構築手順
* Homebrewをインストールする　
 　※既にインストール済みであればスキップしてください。
* ```brew install ansible```でansibleをインストールする
以下のようなエラーが出る場合

```
Error: Your Command Line Tools are too outdated.
Update them from Software Update in System Preferences.

If that doesn't show you any updates, run:
  sudo rm -rf /Library/Developer/CommandLineTools
  sudo xcode-select --install

Alternatively, manually download them from:
  https://developer.apple.com/download/all/.
You should download the Command Line Tools for Xcode 14.2.
```
以下のコマンドを順に実行してください。
```sudo rm -rf /Library/Developer/CommandLineTools```
```sudo xcode-select --install```

* 以下のコマンドでansibleからサーバに接続できるかテストする。 
```ansible-console --inventory xx.xxx.xxx.xxx, --user xxxxx```
```ls```コマンドを実行する。
```
xx.xxx.xxx.xxx | UNREACHABLE! => {
    "changed": false,
    "msg": "Failed to connect to the host via ssh: xxx@xx.xxx.xxx.xxx: Permission denied (publickey,password).",
    "unreachable": true
}
```
⇨上記のようなエラーが発生した場合は、以下のコマンドを試す。
```ansible-console --inventory xx.xxx.xxx.xxx, --user xxx --ask-pass```
そしてサーバのパスワードを入力し、```ls```コマンドを実行する。
※userはサーバのuseridのことです。

```
xx.xxx.xxx.xxx | FAILED | rc=-1 >>
to use the 'ssh' connection type with passwords or pkcs11_provider, you must install the sshpass program
```
それでも上記のようなエラーが発生したら、、
```brew install hudochenkov/sshpass/sshpass```を実行してください。
インストールが完了したら、もう一度以下のコマンドを実行します。
```ansible-console --inventory xx.xxx.xxx.xxx, --user xxx --ask-pass```
そしてサーバのパスワードを入力し、```ls```コマンドを実行する。

```
xx.xxx.xxx.xxx | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
```
上記のように「SUCCESS」となっていればOKです。

* hosts、packages.ymlがあるディレクトリに移動して、以下のコマンドを実行します。
```ansible-playbook -i hosts packages.yml --user xxx --ask-pass```
パスワードを聞かれると思うので、サーバのパスワードを入力します。
あとは、実際にサーバに接続してみて「test」というフォルダが作成されていることを確認してください。
作成されていれば正常にpackages.yml（playbook）が正常に実行されています。
【pyautogui】リモートデスクトップを切断すると動かなくなる

# pyautoguiをリモートのPCで動かしたい
Windowsにはリモートデスクトップが標準でついているが、リモートデスクトップで接続し、プログラムを実行してから、切断するとpyautoguiはエラーを吐いてとまってしまう。切断しても動かしたいのでその方法を探した。

# githubのissuesで議論されていた
pyautoguiのgithubの[issues](https://github.com/asweigart/pyautogui/issues/133)でリモートデスクトップで切断した後、操作ができなくなることについて触れられていた。しかし、現状ではpyautoguiは対応していないようである。しかし、代替の方法があったのでそれについて説明する。

# 解決する方法
issuesを参考にしてリンクが張られていたこの[ブログ](https://autumnator.wordpress.com/2011/11/18/how-to-run-remote-headless-gui-automation/)が非常に参考になった。このサイトの内容をまとめると、Windows標準のリモートデスクトップ(RDPプロトコル)を使用している場合は実現が難しいようである。しかし、VNCプロトコルを使用すれば、すべて解決できるらしい。

# 結果
試しにUltraVNCをダウンロードして、リモートデスクトップを行ってみた。すると、切断後もpyautoguiが動いたままになることが確認できた。

# まとめ
VNCを使えば、解決できます。