OmniAICreator/Qiita-1.07M huggingface dataset:
【Unity】シーン遷移すると OVRCameraRig が Missing になるんだけど？

<table><tr><td>この事件は 2021年9月7日に発生し、<del>2021年9月8日に解決しました。</del><del>現在も未解決です。</del><br><em>（2022-10-23追記：シーン遷移がなくとも、プレイモードの再生・停止により生じることを確認しました。ほぼ毎回症状が出ていますが、<del>解決方法が不明です。</del>また、シーン読み込みを行うと一時的に解決しますが、次の再生時には再発します。）</em></td></tr></table>

:::note info
この事件は 2023-03-18 現在、解決策が見つかっています。
[追記 2023-03-18](#追記-2023-03-18) を参照してください。
:::

# 状況説明
```
MissingReferenceException: The object of type 'OVRCameraRig' has been destroyed but you are still trying to access it.
```

以下の状況で、コンソールに上記エラーが大量に発生する。送出元は不明。

- プレイモード中にスクリプトからシーン遷移を行った場合
- 特に何もせず、起動直後にエディタ上で別のシーンファイル（同じ設定の XR Rig を含む）を選択・展開し、再生した場合

なお、起動直後の状態では再生してもエラーが出ないほか、エラーが出ていても、OVRCameraRig および XR Controller 等、関連オブジェクト・コンポーネントは不足なくシーン上に存在している。また関連性は不明だが、事象発生後、Ray Interactor のレイが実機上で不可視になる。

筆者は XR Interaction Toolkit をオーバーライドして使用していたため、当初はそれが原因かと思われた。しかし、Oculus Integration 付属の OVRCameraRig.prefab を空シーンに置いた場合にも同様の操作で問題が発生することが事件発生の翌日に確認され、別の問題が主要因であると断定された。

また Oculus Integaration も直近３つのバージョンを確認したが、いずれも同様の問題が起きた。

# 検証時に確認したパッケージ等

当初のパッケージ等：

- Unity 2019.4.22f1, 2020.3.0f1, 2020.3.16f1
- Oculus Integration v29, v31, v32
- XR Interaction Toolkit 1.0.0-pre.5
- XR Legacy Input Helpers 2.1.7, 2.1.8
- XR Plugin Management 4.0.7, 4.1.0

解決法を見つけた際のパッケージ等：
- Unity 2021.3.19f1
- Oculus Integration v49
- XR Interaction Toolkit 2.2.0
- XR Legacy Input Helpers 2.1.10
- XR Plugin Management 4.2.1

# 検証内容

複数のバージョンの Unity エディタで、設定項目やパッケージのバージョンの違いによる影響を確認。

# 解決方法

~~Verified ではないが、XR Plugin Management **4.1.0** を使用する。~~

<del>不明。一時的な対処法として、XR Plugin Management をその時点で使用しているものとは異なるバージョンにすることが挙げられる。（再起動後、問題が再発することが判明。）</del>

# 所感
<del>いままで何故この問題が起きなかったのか、本当の問題はどこにあったのかは、未だ謎に包まれている。</del>

# 追記 2023-03-18


作業効率は落ちますが、`Project Settings > Editor > Enter Play Mode Options` をオフにしたり、下記のようなショートカットキーを設定し、再生直前に強制的にリロードさせることで回避できるようです。（標準の `Assets > Refresh`: 既定ショートカットキー `Ctrl + R` だと、スクリプトに変更がない場合はコンパイルが走らない：シリアライズされた変数の初期化が走らないので、前回実行時の参照が残ってしまうようです。再生前に毎回リロードしたい場合は、Enter Play Mode Options で Reload Domain をオンにするのが手っ取り早いですが、自分の場合は必要に応じてリロードしたいので、ショートカットキーを作りました。）

こうするか、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253921/4c922c26-3331-c343-904e-7d87bcd8b2aa.png)

こうする。

```sample.cs
#if UNITY_EDITOR
using UnityEditor;
using UnityEditor.Compilation;
#endif

// クラス名は任意
public static class X
{
#if UNITY_EDITOR
    [MenuItem(nameof(X) + "/" + nameof(ForceCompile) + " %R")]
    static void ForceCompile()
    {
        CompilationPipeline.RequestScriptCompilation();
    }
#endif
}

//　このスクリプトを Editor フォルダに入れる場合、if ディレクティブは不要
petite-vueを使ってみる

# petite-vueとは？
- [petite-vue](https://github.com/vuejs/petite-vue)
- Vueと同じテンプレート構文が使用できる
- サーバーフレームワークによってレンダリングされた既存のHTMLページに少量のインタラクションを「振りかける」ために最適化されているらしい

-----

## とりえあず動かしてみる
[githubのサンプル](https://github.com/vuejs/petite-vue#usage)

- petite-vueで操作するには、操作したいタグに`v-scope`を付与する
- `v-scope`には操作する変数や関数をオブジェクトで指定する

-----

## スクリプトを分離してみる

```html
  <div v-scope>
    {{count}}
    <button @click="increment">inc</button>
  </div>
  <script type="module">
    import { createApp } from 'https://unpkg.com/petite-vue?module'

    createApp({
      count: 0,
      increment() {
        this.count++;
      }
    }).mount()
  </script>
```

- `createApp`にpetite-vueから操作する変数や関数をオブジェクトで渡す
- mount()した値はルートスコープに指定され、v-scopeで指定しなくても関数や変数を使用できる

-----

## ファイルを分割してみる

今回はwebpackからpetite-vueを使ってみる。
webpackの設定については省略。

```sh
$ npm i petite-vue
```

```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>hoge</title>
</head>
<body>
  <div v-scope>
    {{count}}
    <button @click="increment">inc</button>
  </div>
  <script src="main.js"></script>
</body>
</html>
```

```javascript:main.js
import { createApp } from 'petite-vue'

createApp({
  count: 0,
  increment() {
    this.count++;
  }
}).mount()
```

-----

# railsで使ってみる
今回はwebpackerを使用するものとする。

petite-vueを追加する

```sh
$ npm i petite-vue
```

```javascript:app/javascript/packs/count.js
import {createApp} from 'petite-vue';

createApp({
  count: 0,
  increment() {
    this.count++;
  }
}).mount();
```

```eruby:app/views/counts/index.html.erb
<div v-scope>
  {{count}}
  <button @click="increment">inc</button>

  <%= javascript_pack_tag 'count' %>
</div>

```
【Python】pipとpip3で少しハマったので紹介します

#はじめに
今回はpipとpip3でインストールされるライブラリの場所が異なるというお話です。

#環境
macOS(Catalina10.15.7)
Python3.9
Python3.7
Python2.7
（混在環境）

昨日ccxtという複数の仮想通貨取引所のAPI操作が集約されたライブラリのインストール方法をご紹介しました。

https://qiita.com/hirockio2206/items/a3d9fe32fed8d1c9b83e

昨日は以下のコマンドを紹介しました。

```
$  sudo pip install ccxt
```

しかしpython3.X系では以下が正しいコマンドです。（すでに修正済み）

```
$  sudo pip3 install ccxt
```

これがどう違うのかというと、インストール先が異なります。
python3.X系でpip installコマンドを打っても参照先にccxtライブラリがないので、以下のエラーが発生します。

```
ModuleNotFoundError: No module named 'ccxt'
```

●pipの場合のインストール先は以下です。

```
/Library/Python/2.7
```

●pip3の場合のインストール先は以下です。

```
/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages
```

なので、Python3.X系をご利用の方は、必ずpip3でインストールする必要があるかと存じます。
なお、Python3.7とPython3.9が混在している場合、Python3.9側のsite-packagesにインストールされますのでご注意ください。

今回は凡ミス的な内容でしたが、ご参考になれば幸いです。
streamlitのボタンのカスタマイズはmarkdown()メソッドでdiv.stButtonのスタイルシートを強制設定する

## はじめに

　PythonのノンHTML+CSSフレームワークである`streamlit`。フロントエンドを全てPythonコードで実装出来てお手軽にWebアプリが作れます。その反面、細かな見た目の変更ができません。

　そこで、ここでは細かな見た目の変更の一例として、ボタンのスタイルシートを設定する方法をご紹介します。

## 結論

* `streamlit`の`markdown()`メソッドを利用します
* `markdown()`メソッドの
    * 第１引数にスタイルシートを
    * 第２引数として`unsafe_allow_html`に`True`を設定します
        * これでスタイルシートを強制設定することができます
* スタイルシートの設定は
    * `div.stButton`の子要素の`button`タグに対して行います

## 実装例

```python:streamlitでボタンの見た目を変更します
import streamlit as st

button_css = f"""
<style>
  div.stButton > button:first-child  {{
    font-weight  : bold                ;/* 文字：太字                   */
    border       :  5px solid #f36     ;/* 枠線：ピンク色で5ピクセルの実線 */
    border-radius: 10px 10px 10px 10px ;/* 枠線：半径10ピクセルの角丸     */
    background   : #ddd                ;/* 背景色：薄いグレー            */
  }}
</style>
"""
st.markdown(button_css, unsafe_allow_html=True)
action = st.button('このボタンを押してください')
```

## 書式

```python:streamlitでボタンに任意のスタイルシートを適用する書式
スタイルシートHTML = f"""
  <style>
    div.stButton > button:first-child  {{
      任意のスタイルシート設定
    }}
  </style>
"""
st.markdown(スタイルシートHTML, unsafe_allow_html=True)
ボタンの戻り値 = st.button('ボタンラベル名')
```
Python3 FlaskでMOCK的なAPIサーバを作る（5分で記載）


テストで受けられるサーバを作りたかった。
Mock立てればいいじゃん…て話なんですが、
npmのprismというものを使おうとして、`core.js@1.27`　がというエラーが出続けまして…。
解決方法がわからなかったので、Pythonで立てました。

エンドポイントは以下の3つだけです。
Python3とFlaskを準備すれば簡単に動きます。

```
localhost:5000/hoge
localhost:5000/healthcheck
localhost:5000/
```
`/hoge`はPOSTされたデータをそのまま返すだけです。


```serv.py
from flask import Flask
from flask import request
app = Flask(__name__)


@app.route("/hoge", methods=['POST'])
def postHoge():
    #ヘッダの形にかかわらず返す。
    return  request.get_data()

@app.route("/healthcheck", methods=['GET'])
def healthcheck():
  return "", 200


@app.route("/")
def hello_world():
  return "Hello, World!", 200


app.run(host="127.0.0.1", port=5000)

```

`python3 serv.py`　でサーバ起動。


```
$ curl localhost:5000/healthcheck

$ curl localhost:5000/
Hello, World!

$ curl  -X POST -H "Content-Type: application/x-www-form-urlencoded" -d '"request"={"huga":"1111","hoge":"piyo"}' localhost:5000/hoge

"request"={"huga":"1111","hoge":"piyo"}

$ curl  -X POST -H "Content-Type: application/json" -d '{"huga":"1111","hoge":"piyo"}' localhost:5000/hoge
{"huga":"1111","hoge":"piyo"}

```
iOS13 / iOS14 /iOS15 で、AppDelegateのライフサイクルは違うよ 14がおかしいんだけど

以前書いた記事

https://qiita.com/bird_tomita/items/62cb49e0835826775c8a

で、OSによってコロコロ変わるライフサイクルに苦しめられてることをぼやかずに分析だけしたのですが、iOS15でもまたまたライフサイクルが変わっています。**いい加減にしてほしい！**

結論から言うと、iOS14だけおかしかったのです。iOS13もか。
iOS15では、iOS12以前のライフサイクルに戻っているようです。

### iOS15
-[AppDelegate application:didFinishLaunchingWithOptions:]
-[ViewController viewDidLoad]
-[ViewController viewWillAppear:]
-[ViewController viewDidAppear:]
-[AppDelegate applicationDidBecomeActive:]
-[ViewController applicationDidBecomeActiveNotification:]

### iOS14（iOS14.5）

-[AppDelegate application:didFinishLaunchingWithOptions:]
-[AppDelegate applicationDidBecomeActive:]
-[ViewController viewDidLoad]
-[ViewController viewWillAppear:]
-[ViewController viewDidAppear:]

**viewDidLoadとかで applicationDidBecomeActiveNotification　へのObserverを貼ったところで、既にapplicationDidBecomeActiveは呼ばれているので、初回はapplicationDidBecomeActiveNotificationを受け取れない！**

### iOS13

-[AppDelegate application:didFinishLaunchingWithOptions:]
-[ViewController viewDidLoad]
-[ViewController viewWillAppear:]
-[AppDelegate applicationDidBecomeActive:]
-[ViewController applicationDidBecomeActiveNotification:]
-[ViewController viewDidAppear:]

### iOS11 / iOS12

-[AppDelegate application:didFinishLaunchingWithOptions:]
-[ViewController viewDidLoad]
-[ViewController viewWillAppear:]
-[ViewController viewDidAppear:]
-[AppDelegate applicationDidBecomeActive:]
-[ViewController applicationDidBecomeActiveNotification:]
React RouterのuseParamsがcssの設定を初期化しやがって10時間苦しんだ話

###ReactRouterのドキュメントにあるuseParams[^1]をそのまま試しても自分のプロジェクトではうまく動作しませんでした。
試したコードは以下になります。

```tsx:index.tsx
import React from "react";
import ReactDOM from "react-dom";
import {
  BrowserRouter as Router,
  Switch,
  Route,
  useParams
} from "react-router-dom";

function BlogPost() {
  let { slug } = useParams();
  return <div>Now showing post {slug}</div>;
}

function HomePage() {
  return <div>HomePage</div>;
}

ReactDOM.render(
  <Router>
    <Switch>
      <Route exact path="/">
        <HomePage />
      </Route>
      <Route path="/blog/:slug">
        <BlogPost />
      </Route>
    </Switch>
  </Router>,
  document.getElementById("root")
);

```

HomePage（/）だとreset.cssが効いて、自分で定義していた全体に反映されるindex.cssも効いていました。
ところが、BlogPost（/blog/hello-world）に遷移した時にどちらのcssも効かなくなってしまっていました。

自分で定義したcss（reset.cssとindex.css）はpublicフォルダ内に保存されていて、index.html内で適用されていました。

###暫定的な解決方法
index.cssとreset.cssをindex.tsx内で呼び出すようにしてうまくcssが適用されるようになりました。

```tsx:index.tsx
import React from "react";
import ReactDOM from "react-dom";
import {
  BrowserRouter as Router,
  Switch,
  Route,
  useParams
} from "react-router-dom";
import "./index.css";
import "./reset.css";

function BlogPost() {
  let { slug } = useParams();
  return <div>Now showing post {slug}</div>;
}

function HomePage() {
  return <div>HomePage</div>;
}

ReactDOM.render(
  <Router>
    <Switch>
      <Route exact path="/">
        <HomePage />
      </Route>
      <Route path="/blog/:slug">
        <BlogPost />
      </Route>
    </Switch>
  </Router>,
  document.getElementById("root")
);

```


[^1]: https://reactrouter.com/web/api/Hooks/useparams
【React】関数コンポーネントで親のstateを子にpropsとして渡す方法

## はじめに
Reactで関数コンポーネントを使い、親のstateを子にpropsとして渡す方法（stateのリフトアップ）についてまとめました。

この記事では、１回クリックするとテキストがbananaからappleに変更されるボタンを作成します。
説明用に極力シンプルなコードにしています。
ご自身のコードに置き換えて頂いて、ご参考になればと思います。
また、この記事の内容に不備が御座いましたらご指摘頂けますと幸いです。

## 何の為に親のstateを子にpropsとして渡すのか
複数の子コンポーネントからデータを集めたり、コンポーネント同士を互いにやりとりさせる為には、
親コンポーネント内で共有のstateを宣言する必要があります。

## 環境
React：17.0.2
node.jsとnpmがインストールされていることが前提です。

## 準備

```shell
npx create-react-app my-app
cd my-app
npm start
```

ターミナルの新しいウィンドウを開き、以下のコマンドを実行して必要なディレクトリとファイルを作成します。

```shell
mkdir src/components
touch src/components/{Fruits.jsx,FruitsButton.jsx}
```


## 実装

まずは、stateのリフトアップをしないで書いてみます。

```react
{/* Fruits.jsx */}

import React, { useState } from "react";

const Fruits = () => {
  const [fruit, setFruit] = useState("banana");
  return <button onClick={() => setFruit("apple")}>{fruit}</button>;
};

export default Fruits;
```
```react
{/* App.js */}


import "./App.css";
import Fruits from "./components/Fruits";　{/* 追加 */}

function App() {
  return (
    <div className="App">
      <header className="App-header">
        <Fruits /> {/* 追加 */}
      </header>
    </div>
  );
}

export default App;
```

stateのリフトアップをするとこうなります。

```react
{/* Fruits.jsx(親コンポーネント) */}

import React, { useState } from "react";
import FruitsButton from "./FruitsButton";

const Fruits = () => {
  const [fruit, setFruit] = useState("banana");
{/* 状態を"apple"に変える関数を定義*/}
  const ReplaceFruit = () => {
    setFruit("apple");
  };
  {/* propsとして子に渡すのは{fruit} は(現在の状態"banana")とReplaceFruit関数 */}
  return <FruitsButton fruit={fruit} onClick={ReplaceFruit} />;
};

export default Fruits;

```

```react
{/* FruitsButton.jsx(子コンポーネント) */}

const FruitsButton = (props) => {
  return <button onClick={() => props.onClick()}>{props.fruit}</button>;
};

export default FruitsButton;


```
既に"apple"になっている方は一度ブラウザをリロードして下さい。

## 参考にしたサイト

ステートフックの利用法 – React
https://ja.reactjs.org/docs/hooks-state.html
06 新・日本一わかりやすいReact入門【基礎編】コンポーネントの状態管理
https://youtu.be/dTghhYtvPek
Workato：レシピのJobsの日時が日本時間（JST）にならない場合の対応方法

アカウントの設定によっては、Jobsの日時が日本時間（JST）で表示されない場合があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/57711814-0d05-c5fd-4e4b-0c886569e9ef.png)


この日時を日本時間で表示させたい場合は、次の通り設定を行います。

# 手順
## １．チームを自分自身に切り替えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/b7694794-894b-c022-91a2-b135b7210dd9.png)

## ２．「Settings」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/c20e95f6-40f1-ca28-e1ef-6f015ecb8e80.png)

## ３．Time zoneを「(GMT +09:00) Tokyo」に変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/f2e93efa-a382-bd8d-064f-c42403dad8c2.png)
AngularでAzure App Configurationにあるキーを参照してみる


前回⇒[AngularでAzure App Configurationの機能フラグを使ってみた](https://qiita.com/yuuton8823/items/28120564fa7688fad60f)
機能フラグは取得することができたが、格納したアプリケーション設定を参照できるか試してみた。

## 環境

Angular v12

### 必要なパッケージ

```JSON
"@azure/app-configuration": "^1.3.0"
"@azure/identity": "^1.5.0"
```

## 準備

### App Configurationで参照するキーを用意

「構成エクスプローラー」→「作成」でキーを作成する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/467168/a145a0e0-35cc-7b8b-a01f-fa518ae29169.png)

## コード

### App Configurationに接続するclientを作成

```TypeScript
  const conn = '接続文字列'; 
  const client = new AppConfigurationClient(conn);
```

### キーの参照

```TypeScript
  applicationSettingConfig = ''; // 参照したキー値を格納する変数
```

```TypeScript
  const val = await client.getConfigurationSetting({ key: '参照したいキー' });
  console.log(val); // ←どんな値がとれてるか確認してみよう
  this.applicationSettingConfig = val.value === undefined ? '' : val.value;
```

## 結果

applicationSettingConfigを表示して👇のようにキーの値が表示できた。
（前回の機能フラグのコーディングも残してるのでそこは無視してください）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/467168/8d14c1e4-c99c-1be8-f505-2ced7d177704.png)

## ソース

https://github.com/yuuton414/angularv12-test-yoshida-sandbox/tree/master/src
AtCoder参加記録No.5ーABC217

#ABC217
今回参加したABC217についての参加記録

2021年9月4日（土）のAtCoder Beginner Contest 217でした。

https://atcoder.jp/contests/abc217



##結果

A,B,C問題を正解
レート：49→72 (+23) Highest!
順位:5793/ 8543
時間: A問題 7:31  B問題 16:10  C問題 27:55
パフォーマンス:281

##詳細

###A問題
[問題](https://atcoder.jp/contests/abc217/tasks/abc217_a)

提出コード(AC)

```python:A問題_1.py
S,T =list(map(str,input().split()))
le=min(len(S),len(T))
A=[]
A.append(S)
A.append(T)
AN=sorted(A)

if AN[0]==S:
  print('Yes')
else:
  print('No')
```

[詳細](https://atcoder.jp/contests/abc217/submissions/25567978)



###B問題

[問題](https://atcoder.jp/contests/abc217/tasks/abc217_b)

提出コード(AC)

```python:B問題_1.py
l=[]

for i in range(3):
  row=input()
  l.append(row)
  
A=[['ABC',False],['ARC',False],['AGC',False],['AHC',False]]
for i in range(3):
  if l[i]=='ABC':
    A[0][1]=True
  elif l[i]=='ARC':
    A[1][1]=True
  elif l[i]=='AGC':
    A[2][1]=True
  elif l[i]=='AHC':
    A[3][1]=True
ans=0
for i in range(4):
  if A[i][1]:
    ans=ans
  else:
    ans=A[i][0]
    
print(ans)
```

[詳細](https://atcoder.jp/contests/abc217/submissions/25575801)




###C問題

[問題](https://atcoder.jp/contests/abc217/tasks/abc217_c)
提出コード(AC)

```python:C問題_1.py
N=int(input())
P=list(map(int,input().split()))
Q=[0]*N

for i in range(N):
  x=P[i]
  Q[x-1]=i+1
  
print(*Q)  
```

[詳細](https://atcoder.jp/contests/abc217/submissions/25582188)



###D問題

[問題](https://atcoder.jp/contests/abc217/tasks/abc217_d)

提出コード1(TLE)

```python:D問題_1.py
L,C=list(map(int,input().split()))

c=0
Q=[]
for i in range(C):  
  l=list(map(int,input().split()))
  if l[0]==1:
    c+=1
  Q.append(l)
V=[0,L]
ans=[]

for i in range(C):
  if Q[i][0]==1:
    V.append(Q[i][1])
    V.sort()
  else:
    for x in range(len(V)):
      if Q[i][1]>V[x]:
        an=V[x+1]-V[x]
    ans.append(an)

for i  in range(len(ans)):
  print(ans[i])
```

[詳細](https://atcoder.jp/contests/abc217/submissions/25591832)

提出コード2(TLE)

```python:D問題_2.py
L,C=list(map(int,input().split()))

c=0
Q=[]
for i in range(C):  
  l=list(map(int,input().split()))
  if l[0]==1:
    c+=1
  Q.append(l)
V=[0,L]
ans=[]

for i in range(C):
  if Q[i][0]==1:
    V.append(Q[i][1])
    V.sort()
  else:
    for x in range(len(V)):
      if Q[i][1]>V[x]:
        an=V[x+1]-V[x]
    ans.append(an)

for i  in range(len(ans)):
  print(ans[i])
```

[詳細](https://atcoder.jp/contests/abc217/submissions/25592071)


##振り返り、反省
前回の反省を生かしてA,B,C問題は丁寧に回答し一発ACを得ることができた

D問題は制限時間をオーバーしてしまい、正解できなかった
１回目と２回目の違いはPython3とPypy3で提出したらもしかしたら変わるかもしれないと思いあがいた結果である
計算量がかなり多くなっていることがわかる(V=len(V)  Ｏ(C*VlogV*V) )


##感想

A~Cまでとけたため自分の中ではそこそこの満足度がある

ただこれで満足しているようではいけないのでさらに解ける問題を増やしていきたい
ExcelVBAで、IE(あるいはIEモードのEdge)を捕まえて、(html)documentの中身をさらう

#ExcelVBAで、IE(あるいはIEモードのEdge)を捕まえて、(html)documentの中身をさらう

###エクセルファイル
santarou6/excelvba_ie_edge
https://github.com/santarou6/excelvba_ie_edge/blob/main/sample.xlsm



##従来方式

```visualbasic:sample.vb

'/----------
Sub a1()
    Set objShell = CreateObject("Shell.Application")
    For Each ie_target In objShell.Windows
        Debug.Print ie_target.LocationName
    Next
End Sub

'/----------
Sub a2()
    Dim ie_target
    Set objShell = CreateObject("Shell.Application")
    
    For Each ie_target In objShell.Windows
       'Debug.Print ie_target.LocationName
    
        pp = "Google" '"捕まえたいIEのウィンドウのタイトル名"
    
        If Left(ie_target.LocationName, Len(pp)) = pp Then

        Set ie_object = ie_target

        For Each i In ie_object.document.all
            If i.tagName = "DIV" Then
                Debug.Print i.innerHTML
            End If
        Next i
        
        End If
    
    Next
End Sub

```


##「IE11」終了後、EdgeのIEモードの場合

下記で、Internet Explorer_Serverから、
HtmlDocumentを取得するソースをgithubに上げてらっしゃいました。
素晴らしい。。。

----

>Benshi/HtmlDocumentHelper.bas
>https://gist.github.com/Benshi/8442005d21e8e74bd4d3735a3e77c417

>https://twitter.com/Benshi_Orator/status/1395608086807650304
>https://twitter.com/Benshi_Orator/status/1396767727314903040
>https://twitter.com/Benshi_Orator/status/1396770128012791818

----

##呼び出し例（エクセル）

HtmlDocumentHelper.bas　の　呼び出し例（エクセル）

```visualbasic:sample.vb

Sub test1()

    Dim hd As MSHTML.IHTMLDocument
    Set hd = GetHtmlDocument(&H95065C) '← 95065C が hwnd
    Debug.Print hd.body.outerHTML
    Sheets("Sheet1").Cells(1, 1).Value = hd.body.outerHTML

End Sub
```


##IEのhwndを得る方法

Internet Explorer_Serverのhwndを得る方法は、以下が一例

ExcelVBAで、Windowsの全画面のhwndとClassNameを列挙（一部クラス名で絞込）
https://qiita.com/santarou6/items/6a2c2e186cd0d555d2bd



###エクセルファイル
santarou6/excelvba_ie_edge
https://github.com/santarou6/excelvba_ie_edge/blob/main/sample.xlsm

以上
【UiPath Orchestrator】https通信用の証明書を更新する

UiPath Orchestratorでは、HTTPS通信のための証明書を必要とします。
テスト中などは自己署名証明書（いわゆるオレオレ証明書）とし、本番運用までに公的認証局から認証された証明書に差し替える、というようなことをするかと思います。

証明書の差し替え手順というのがマニュアルからうまく見つけらずハマってしまい、さらにはOrchestrator停止という事態を発生させてしまったので、証明書の更新方法をまとめておこうと思います。

**2022/09/28 追記**
UiPath公式のナレッジベースに、以下の記事が公開されていました。
[Orchestrator サーバー証明書入れ替え手順](https://www.uipath.com/ja/resources/knowledge-base/uipath-orchestrator-change-certificate)


# やらかした手順

## IISの証明書を更新する

証明書の発行手順は省略します。

IISのサーバー証明書に、差し替えたい証明書がある状態にして・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517338/4fcac217-7fd6-578c-e4a9-fbf6ae3dbaf0.png)

サイトの「バインドの編集」で、差し替えたい証明書に変えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517338/1dec8bb6-6116-b78f-5575-476090dde1e7.png)

## 動作確認してみる

IISを再起動したあと、Orchestratorのサイトにアクセスし、証明書が変わったかを確認します。

拇印を見ると「f3～」となっているので、ここでの「本番用UiPath証明書」に変わっていることが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517338/8cb651d6-3518-45a4-a6be-fbdfccf0488d.png)

## 後始末する

古いオレオレ証明書は必要なくなったので、削除しようと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517338/0fa01534-742f-a4ec-577c-5ee6ecaa9450.png)

## 障害発生

では、IISを再起動して、Orchestratorログイン画面を表示して、、、

:scream::scream::scream:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517338/36a600a3-ef70-0ed6-1593-7363ce027842.png)

# 障害の原因

イベントログ（アプリケーションログ）を見ると、以下のようなログが出力されていました。
`certificate: '9dxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' not found in certificate store`

この`9d～`の証明書は、差し替え前の証明書の拇印です。
UiPath Orchestratorのどこかに、証明書の設定が残っているようです。
古い証明書を削除してしまったため、「そんな証明書ないよ！」ということで起動できなくなってしまったようです。

# 回復手順

UiPath Orchestratorは、認証まわりがIdentityServerで行われているらしく、その設定に証明書の拇印が記載されていました。

``` json:appsettings.Production.json（一部抜粋）
  "AppSettings": {
    "IdentityServerAddress": "https://~~~~~~~~~~/identity",
    "SigningCredentialSettings": {
      "StoreLocation": {
        "Name": "9Dxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
        "Location": "LocalMachine",
        "NameType": "Thumbprint"
      }
    },
```

上記のファイルは、デフォルトだと以下のフォルダにあります。
`C:\Program Files (x86)\UiPath\Orchestrator\Identity`

## 設定ファイルの書き換え

上記ファイルの拇印を、差し替え後の証明書の拇印に書き換えます。
**※注意：ProgramFiles配下のファイルを書き換える場合は、OSの管理者権限が必要です。**

## 証明書権限の変更

設定ファイルを書き換えたあとにIISを再起動すると、今度は以下のようなメッセージがイベントログに出力されました。
`WindowsCryptographicException*キーセットがありません。*`

証明書に権限を追加してあげる必要があるようで、以下の公式マニュアルを参考にPowerShellから権限を追加します。

https://docs.uipath.com/installation-and-upgrade/lang-ja/docs/using-a-certificate-for-the-https-protocol#internal-server-error

## 再起動して動作確認

この状態でIISを再起動すればOKでした！

# おわりに

手探りで見つけた回復方法のため、公式な手順ではないかもしれません。
全ての環境で上記の手順で実施可能かどうかはわからないので、自己責任でお願いします。
なお、正しい手順としては、IISを再起動する前に上記の回復手順を実施すれば大丈夫かと思います。

マニュアル上には「HTTPS証明書の更新手順」としては存在しないのでしょうか・・・
もしご存じの方がいらっしゃいましたら、ご教示いただければと思います。

ちなみに、フォーラムでは同様の事象が発生した方もいて、回復方法が載っていましたが、私とはちょっと違いますね。
こちらで紹介されているのは、`Platform Configuration Tool`というものをダウンロードして実行するようです。

https://forum.uipath.com/t/how-to-change-the-identity-server-signing-certificate/307608
Text Fieldのなんやかんやをカスタムした



### こんなTextFieldを実装したのでメモしとく

 - 入力カーソル：無効
 - 範囲選択：無効
 - コピー・ペースト・選択：無効（吹き出しが出ないようにする）

```CustomTextField.swift
import UIKit

class CustomTextField: UITextField {
    
    // 入力カーソル：無効
    override func caretRect(for position: UITextPosition) -> CGRect {
        return CGRect.zero
    }

    // 範囲選択：無効
    func selectionRects(for range: UITextRange) -> [Any] {
        return []
    }

    // コピー・ペースト・選択：無効
    override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
        return false
    }
}

```

ちなみに、、、

```CustomTextField.swift

    open var caretFlag: Bool = false

    // 入力カーソル：無効、有効の切り替え
    override func caretRect(for position: UITextPosition) -> CGRect {
        if caretFlag {
            return super.caretRect(for: position)
        } else {
            return CGRect.zero
        }
    }
```

こうすることで`caretFlag`がtrueならカーソル非表示、falseならカーソル表示に切り替えが可能です。

Storyboardの場合はCustomTextFieldをクラスとして指定してやれば実装完了です。
読み物としてのロケールの設定

ロケール関連のファイルは、`/var/lib/locales/supported.d`に保存されています。`ls -l /var/lib/locales/supported.dコマンド`で、現在の状況を確認してみよう。

デフォルトでは、`enファイル`が１個あるだけ。enはEnglishのこと。日本語のロケールファイルが存在していないため、ロケールの日本語パッケージを別途インストールする必要がある。

日本語パッケージはこのコマンドでインストールする。`apt-get update && sudo apt install language-pack-ja-base language-pack-ja`。インストールした後、再度、`/var/lib/locales/supported.d`の中身をみると、`jaファイル`が作成されていることが確認できる。

catで`/var/lib/locales/supported.d/jaファイル`の中身をみてみると、`ja_JP.UTF-8 UTF-8`が記載されている。

設定可能なロケールの一覧を表示するコマンドが`locale -a`。設定可能なとは、インストール済になっているロケール関連のパッケージ一覧のこと。一覧の中には、大きく、`C`、`en`、`ja`の３種類が表示される。enの中にはたくさんの種類がある。en_USがアメリカ英語で、en_INがイングランド英語で、en_CAがカナダ英語という具合なのだろう。日本語を話す国は日本１国しかないので、ja_JP１種類しか存在しないということになる。

`lacale -a`でja_JPが表示されるのは、先ほど、日本語パッケージをインストールしたから表示されるようになったということだろう。

そして、現在有効になっているロケールを表示するコマンドが`localeコマンド`。環境変数で設定されている内容がそのまま表示されるのだが、デフォルトでは殆どが、en_US.UTF-8になっている。これを日本語に設定し直す。

Ubuntuを管理しているカノニカル社はイギリスの会社なので、en_INがデフォルトとなっていても不思議ではないのだが、アメリカ英語が世界の標準ということなのだろう。

ロケートを変更するには、LANGの環境変数を日本語にすればいいだけ。`export LANG=ja_JP.UTF-8コマンド`をうつ。その後、`localeコマンド`をうつと、すべての変数が、`ja_JP.UTF-8`に変換されている。LANGと似た環境変数に、`LANGUAGE`というのがあるが、これだけはen_USのままになっている。日本語では利用されるケースはないらしく、無視しておいていいでしょう。

これで日本語表示ができるようになりました。試しに、`dateコマンド`をうつと、日本語表示の確認ができます。`localeコマンド`はロケートの変数一覧を表示するだけのコマンドのようです。ロケールの確認をするには、`locateコマンド`を使わずに、`echo $LANG`とやっても同じことではある。

そして最後に、`export LANG=ja_JP.UTF-8`を`~/.profile`に追加しておこう。

`localeコマンド`とよく似たコマンドに`localectlコマンド`がある。`localeコマンド`が画面表示だけの設定なのに対し、`localectlコマンド`は、システムロケールやキーボードのロケールを設定するためのコマンドになる。設定する箇所が別のようです。
ExcelVBAで、Windowsの全画面のhwndとClassNameを列挙（一部クラス名で絞込）


ExcelVBAで、Windowsの全画面のhwndとClassNameを列挙（一部クラス名で絞込）

:::note info
２つの例あり
'/例１　全画面列挙
'/例２　クラス名で抽出
:::



```vb:sample.bas
Option Explicit

Declare Function IsWindowVisible Lib "user32" (ByVal hwnd As Long) As Long
Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, _
ByVal cch As Long) As Long
Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, _
ByVal nMaxCount As Long) As Long
Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
Declare Function EnumChildWindows Lib "user32" (ByVal hWndParent As Long, ByVal lpEnumFunc As Long, _
ByVal lParam As Long) As Long

'/■--------------------
Sub MAIN()

    '参照設定：Microsoft Scripting Runtime

    Application.ScreenUpdating = False
    
    Dim dic As Dictionary
    Set dic = New Dictionary
    
    Call dic.Add("_", "_")
    
    Dim ret As Long
    
    ret = EnumWindows(AddressOf EnumWindowsProc, ObjPtr(dic))
    
    Dim i
    For Each i In dic.Keys
        '/---------------------------
        '/例１　全画面列挙
        'Debug.Print i & " -> " & dic.Item(i)
        '/---------------------------
        '/例２　クラス名で抽出（ここでは「Internet Explorer_Server」のみ）
        If Trim(dic.Item(i)) = "Internet Explorer_Server" Then
            Debug.Print i & " -> " & dic.Item(i)
        End If
        '/---------------------------
    Next
    
    Application.ScreenUpdating = True

End Sub

'/■--------------------
Public Function EnumWindowsProc(ByVal hwnd As Long, ByVal lParam As Object) As Long

    EnumWindowsProc = True
    
    If IsWindowVisible(hwnd) = 0 Then
        Exit Function
    End If
    
    Dim strClassName As String
    Dim strCaption As String
    strClassName = String(255, vbNullChar)
    strCaption = String(255, vbNullChar)
    
    GetWindowText hwnd, strCaption, Len(strCaption)
    GetClassName hwnd, strClassName, Len(strClassName)
    strCaption = RTrim(Left(strCaption, InStr(1, strCaption, vbNullChar) - 1))
    strClassName = RTrim(Left(strClassName, InStr(1, strClassName, vbNullChar) - 1))
    
    Dim dic As Dictionary
    Set dic = lParam
    
    If dic.Exists(Hex(hwnd)) Then
    Else
        dic.Add Hex(hwnd), strClassName '& " " & strCaption
    End If
    
    Call EnumChildWindows(hwnd, AddressOf EnumChildWindowsProc, ObjPtr(dic))

End Function

'/■--------------------
Public Function EnumChildWindowsProc(ByVal hwnd As Long, ByVal lParam As Object) As Long
    EnumChildWindowsProc = EnumWindowsProc(hwnd, lParam)
End Function

```




###参考

以下、参考にさせていただきました

2009-06-18 ウィンドウの列挙＠VBA
https://cartooh.hatenadiary.org/entries/2009/06/18
【JavaScript】【jQuery】ドロップダウン選択時その項目のvalue値をhidden項目のvalue値に渡す。

例）
下記ドロップダウンで
「東京」(value: "tokyo")を選択するとき、
hidden項目のvalueに　"tokyo"　を渡す。

```html:index.html
    <head>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
    </head>

<input id="result" type="hidden" value="">

<select name="都道府県" id="pref">
    <option value="osaka">大阪</option>
    <option value="tokyo">東京</option>
</select>

<script>
    pref = jQuery("#pref")
    pref.on("change", function(){
        var result = $(this).val()

        $("#result").val(result)
        pref_result = document.getElementById("result")
        console.log(pref_result.value) //tokyo
    })
</script>
```
reflection サンプル


static class を使う場合

```C#
var static_flg = BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
```

得たメソッドの返り値が Taskか

```C#
        bool isAwaitable(MethodInfo m)
        {
            var rtype = m.ReturnType;
            var ch = typeof(Task).ToString();
            if (rtype.ToString().IndexOf(ch) == -1) return false;
            return true;
        }
```

```C#
using System;
using System.Reflection;
using System.Threading.Tasks;

using System.Collections.Generic;
using System.Linq;

public class X
{
    public void hoge() { Console.WriteLine("X hoge"); }
    public void hogeArg(int i){ Console.WriteLine($"X hogeArg {i}"); }
}
public static class sX
{
    public static void hoge() { Console.WriteLine("sX hoge"); }
    public static async Task hogeTask() { Console.WriteLine("sX hogeTask"); }
    public static async Task<bool> hogeTaskBool()
    {
        Console.WriteLine("sX hogeTaskBool");
        return true;
    }
    public static async Task<string> hogeTaskDelay(int ms){
        await Task.Delay(ms);
        var mes = $"xX hogeTaskDelay {ms}";
        Console.WriteLine(mes);
        return mes;
    }

}
public static class Program
{


    static async Task Main(string[] args)
    {
        /*
        using System.Reflection;
        using System.Threading.Tasks;
        */

        //instance class
        var cls = new X();
        var type = cls.GetType();
        var fn = type.GetMethod("hoge");
        if(fn==null) return; /*notfound method*/
        fn.Invoke(cls, new object[] { });

        var fn1 = type.GetMethod("hogeArg");
        fn1.Invoke(cls, new object[] { 9999 });

        //static class
        var static_flg = BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
        var type2 = typeof(sX);//
        var fn2 = type2.GetMethod("hoge", static_flg);
        fn2.Invoke(null, new object[] { });

        //task check
        var fn3 = type2.GetMethod("hogeTask", static_flg);
        var fn4 = type2.GetMethod("hogeTaskBool", static_flg);
        Console.WriteLine(isAwaitable(fn3)); //true
        Console.WriteLine(isAwaitable(fn4)); //true
        Console.WriteLine("--------------");
        Console.WriteLine(isAwaitable(fn));  //false
        Console.WriteLine(isAwaitable(fn2)); //false

        bool isAwaitable(MethodInfo m)
        {
            var rtype = m.ReturnType;
            var ch = typeof(Task).ToString();
            if (rtype.ToString().IndexOf(ch) == -1) return false;
            return true;
        }

        //apply
        var call =typeof(sX).GetMethod("hogeTaskDelay",static_flg);
        if(isAwaitable(call)){
         var ret = await (dynamic)call.Invoke(null,new object[]{ 5*1000 });
        }
        else{
         var ret = (dynamic)call.Invoke(null, new object[] { 5 * 1000 });
        }

    }

}//class Program

```
個人ができるセキュリティまとめ

#はじめに
なぜこの記事を書こうとおもったきっかけはエンジニアの先輩が担当している案件でセキュリティ事故がおこりそうになったという事を聞き改めてエンジニアにとってのセキュリティとは？を考えた。本記事はその備忘録という意味も込めて共有する事とします。

#セキュリティとは
>セキュリティ（英: security）は、人、住居、地域社会、国家、組織、資産などを対象とした、害からの保護。
一般には保安のことであり、犯罪や事故などを防止するための警備全般を指す。
[Wikipediaより引用](https://ja.wikipedia.org/wiki/%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3)

と広義の意味においてはその対象が広くなんのこっちゃ？？となります。
ですがセキュリティとは仕事においてのみ考えなくてはならない事ではなく、個人においても自分を守る観点から必要なことであるという事が言えるでしょう。

#情報セキュリティとは
と、いう事で本題。まず情報セキュリティとは以下の3点を確保する事を指します。  

**<dl>
<dt>1.機密性 </dt>
<dd>ある情報へのアクセスを認められた人だけが、その情報にアクセスできる状態を確保すること</dd>
<dt>2.完全性</dt>
<dd>情報が破壊、改ざん又は消去されていない状態を確保すること</dd>
<dt>3.可用性</dt>
<dd>情報へのアクセスを認められた人が、必要時に中断することなく、情報にアクセスできる状態を確保すること</dd></dl>**

上記を確保する事は企業や団体、個人においてもインターネット時代に生きる私たちであれば万人に当てはまるでしょう。
そして企業や国家は個人情報を取り扱います。自分の身だけでなく他人の身の一部も預かっているのでより一層セキュリティを強固にする必要があるのです。

##今日から見直せるセキュリティチェックリスト
仕事でも私事においても必ずしも外敵からの攻撃だけではなく自ら情報漏洩している場合もある。以下は個人が気にかけたほうが良い事をまとめた。
####デバイス管理
時はモバイル時代。デスクトップPCよりもスマートフォンやラップトップPCなど持ち運べる端末を使用している人も多いだろうが以下ではデバイスを所有リスク、使用リスクをあげてその対抗策を考えてみた。

- 複数のデバイスを所有する場合は目の届く範囲で管理（第三者による不正使用防止）
- 利用しないデバイスは初期化、または手放してなるべく利用デバイス数を少なくする
- モバイル端末であればPINコードの他に生体認証を使用して外出時には生体認証をのみ使用（PIN盗み見防止）
- 使用する度に手動でスリープにする（自動スリープを使用しない事で第三者不正使用を防止）

###Wi-Fi設定
リモートワークが多くなり自宅で仕事をするケースも増えた。家電はインターネットにつながる事で機能を拡張できるようになってきた。インターネット使用機器が増えるという事はそれだけの数が接続、通信をしているという事だ。そして多くの人はインターネットに接続するために有線LANではなく無線LANを使用していると思う。しかし安易なパスワードや暗号化方式が古いと簡単に盗み取られ「不正アクセス」や「情報漏洩」につ繋がるためWi-Fiセキュリティは毎年見直す必要がある。
####暗号化方式
WEP→WPA→WPA2の順で強固になる
　WPA2の使用を推奨

:::note warn
注意
WEPは暗号が解析されやすいので使用しないようにすること
:::
####公衆無線LAN利用時
出先で公衆無線LANを利用する時に絶対にパスワード不要のWi-Fiアクセスポイントは使用。それだけで通信内容を傍受する事ができる。最近では[公衆無線LANのパスワードなしでも傍受されない仕組み](https://internet.watch.impress.co.jp/docs/column/nettech/1151607.html)もある。そしてパスワードがかけられている公衆無線LANでも上記の暗号化方式が古ければ安全ではないので利用時には極力有料のVPNを接続して利用するようにしよう

####PCの「ファイル共有」機能はオフにしておく
ローカルのファイルが盗み取られる危険性を回避



###IDとパスワードの管理

- パスワードの使い回しはせずに個々に一意のパスワードを使用。独自のパスワード生成アルゴリズムを作っておくと簡単に一意のパスワードが作れるが面倒な人はパスワードマネージャを使用する事をお勧めする。
- 不用意にアカウントを作らない事。作ってもそのwebサイトを利用しないのであればアカウント削除する
- パスワードは一定期間使用したら変更する
- 強固なパスワードとは文字数が長く、かつ、文字種類（英字｟大文字、小文字｠数字、記号）を不規則に並べる


###SNSなどインターネット上の投稿
ネットに投稿する際に匿名で投稿する事はものすごく難しい。逆に自分の情報を開示する場合もあるがいずれも「どこの誰が」アクセスしたかを判別するには多少の時間があれば難しくない事を知っておこう。インターネットに投稿する事で受けられる恩恵とそのリスクについて以下にまとめ
####画像投稿
exif情報の削除　SNSサイトでは自動削除される事が多いが削除されない場合は位置情報がネットに出回ってしまうので注意。



##おわりに
上記はほんの一例にすぎない。セキュリティとは時代によって良し悪しが変わるのでその都度自分にとってなにが最善かを考えなければいけない。そして「便利」と「リスク」は紙一重である事を認識して現代のコンピュータ時代を過ごしていかなければならない。
kintoneでテーブルをルックアップする

今回は、ルックアップでテーブルを持ってくるというカスタマイズをしてみましょう。

# アプリの準備
まずはルックアップされる側のアプリを作り、
それを再利用してルックアップする側のアプリを作ります。


## ルックアップされる側

| フィールド種類 | フィールドコード | 備考 |
|:-:|:-:|:-:|
| 文字列(1行)  | テンプレート名  | 重複禁止  |
|  文字列(1行) | 品名  | テーブル内フィールド  |
| 数値  |  個数 |テーブル内フィールド   |
| 数値  |  単価 |テーブル内フィールド   |
| 計算  | 金額  | 個数*単価（テーブル内フィールド）  |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/11ec1ec0-dcbe-bd3a-ea49-cb5320448fc8.png)

## ルックアップされるデータの準備

以下の2件レコードを登録しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/b9a043a4-ca15-182c-cfa4-183a81fc1205.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/c86d84eb-374f-5b7d-9c7b-0781df2c9a83.png)


## ルックアップする側

| フィールド種類 | フィールドコード | 備考 |
|:-:|:-:|:-:|
| ルックアップ | ルックアップ  | ルックアップ設定は後述|
| 文字列(1行)  | テンプレート名  |ルックアップでコピーする |
|  文字列(1行) | 品名  | テーブル内フィールド  |
| 数値  |  個数 |テーブル内フィールド   |
| 数値  |  単価 |テーブル内フィールド   |
| 計算  | 金額  | 個数*単価（テーブル内フィールド）  |
|計算|合計|SUM(金額)|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/c0a3af26-b5c3-3713-5215-ee8821e48c65.png)

# JavaScript
kintone REST API Client を入れておきます。
`https://unpkg.com/@kintone/rest-api-client@latest/umd/KintoneRestAPIClient.min.js`

フィールド値変更時イベントではルックアップフィールドの変更を検知することができないので、
ルックアップで文字列(1行)（テンプレート名）を取得してきたのをトリガーにします。

```js
kintone.events.on(
    [
      "app.record.create.change.テンプレート名",
      "app.record.edit.change.テンプレート名",
    ],
    (event) => {
      // レコード番号
      const rId = event.record.ルックアップ.value;
      if (!rId) { // クリアのとき消す用
        event.record.テーブル.value = [];
      } else { // ルックアップしてきた時用
        getTable(kintone.app.getLookupTargetAppId("ルックアップ"), rId);
      }
      return event;
    }
  );

  // async await は changeイベントでは使えないので外に出す。
  const getTable = async (appId, rId) => {
    const client = new KintoneRestAPIClient();
    const res = await client.record.getRecord({
      app: appId,
      id: rId,
    });
    // とってきた値をテーブルにセット
    const obj = kintone.app.record.get();
    obj.record.テーブル.value = res.record.テーブル.value;
    kintone.app.record.set(obj);
  };
```

# こんな動きをします

あたかもテーブルがルックアップされているかのような動き！

<iframe width="480" height="360" src="https://www.youtube.com/embed/8iJqo4B21k0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
【Win32】windows.hとwinsock2.hのインクルード時のコンパイルエラー

#トラブル内容
windows.hとwinsock2.hを利用するためどちらもインクルードした際に、二重定義と思われるコンパイルエラーが発生した。

```
#include <windows.h>
#include <winsock2.h>

>>warning C4005: 'AF_IPX' : マクロが再定義されました。
```

#原因
windows.hはwinsock2.hが先にインクルードされていないと、winsock.hを自動的にインクルードしてしまう。

#対策内容
(1)windows.hをインクルードする前にwinsock2.hを先にインクルードする。

```
#include <winsock2.h>  // こちらが先
#include <windows.h>
```

(2)\_WINSOCKAPI_を定義する。

```
#define _WINSOCKAPI_  // windows.hを定義した際に、winsock.hを自動的にインクルードしない
#include <windows.h>
#include <winsock2.h>
```

コンパイルエラーを避けるため、winsock2.hを利用する場合は、可能な限りwindows.hはインクルードしない。
UEFI shell から BIOS, Intel ME update するメモ

## 背景

BIOS や Intel ME firmware をアップデートしたいが...

* BIOS 自体にアップデート機能などがついていない(OEM マザーボードなど)
* Windows 持っていない or (BIOS などアップデートしないと) Windows 起動しなくなったっぽい
* Linux という手もあるがめんどい(live USB という手もあるが)
* UEFI shell は動く

## 注意点

Secure boot を off にしないと, 以下のコマンドを実行すると `access denied` と出たりします.
マザーボードによっては CSM モードにしているが secure boot 設定は有効のままになっていたりするので注意です.
(いったん UEFI などで secure boot メニューを出したのち, disableする必要がある)
 

## 参考情報

https://www.cfd.co.jp/uploads/biosupdate_asrock_20170302.pdf

ありがとうございます.

EFI shell = 昔の MS-DOS みたいなものだがより機能ある + 64bit 対応なものっぽい.

## 方法

### EFI 環境

built-in の EFI が起動できるならそれでよいでしょう.
USB メモリから起動させる場合は,

https://support.lenovo.com/gt/ja/solutions/ht118103

あたりを参考にしてブータブルディスクつくります.
shell バイナリ(Shell_Full.efi)は github で見つかります.

### BIOS

どのマザーボードメーカーも? American megatrends のツールを使っているっぽい?

AFUEFIx64.efi を使います.

https://advantech-ncg.zendesk.com/hc/en-us/articles/360018702312-FWA-1012VC-BIOS-UEFI-flash-method-by-AMI-flashing-utility-AfuEfix64-efi-

このあたりから辿ればよさそう.

引数は適宜追加して. `/P /B /N` あたり付けておけばよいっぽい?

### Intel ME firmware(Intel マザーボード用)

firmware アップデートする fwupdlcl64.efi は通常配布されていません.

https://www.win-raid.com/t596f39-Intel-Converged-Security-Management-Engine-Drivers-Firmware-and-Tools.html

から得られるっぽいがごちゃごちゃしていてまったくわからないですね...

CSME System Tools vN

のパッケージを落とします(N = version number)

頑張って自分のマザーボードにあったバージョンを探して使う必要があります.
(バージョンが古すぎても新しすぎてもダメっぽい)

自身の ME バージョンがいくつかは, BIOS で確認, or 上記 system tools に含まれる `MEInfo.efi` で確認できます.

ぺろっと使える感じのでは MSI のサポートフォーラムにもありますが

https://forum-en.msi.com/index.php?threads/need-fwupdlcl-exe-for-dos.364790/

こちらは ME v8 用でした.
[React]Module not found: Can't resolve '../images/**'  画像が読み込めないエラー対処

<h2>問題</h2>
Reactで画像を表示させるために、localに画像ファイルを保存し、importすると以下のエラーがでた。

>
Module not found: Can't resolve '../images/**' in 'C:\Users\....'

正しいパスでインポートしているはずなのになぜ、、、


<h2>解決策</h2>

下記に書き直すだけでなおった。

```ruby:qiita.rb
import Image from '../images/**.png' //pngをつける

export const Result = () => {
	return (
		//....
			<img src={Image}  />
	);
};
```

予測ででたパスを指定したので、絶対間違ってすこし詰まった😱

<h3>ちなみに</h3>
Reactで画像を表示するには


1.上記のようにimportする
2.srcにパス名を指定する
の２つがあるようだがどちらが良いのか。。。

1は、importしているため画像に問題がった際にエラーになりすぐに気づける。特に問題がなければ1の方がよさそう！
【Swift】QRコードの分割情報を取得する

iOSアプリでQRコードを読み込もうとしたら、QRコードが分割されている場合があることを知りました。

お薬手帳や車検証などにも使われているみたいです。

iOSアプリでその分割情報を取得する「これだ！」って方法が見つからなかったのでまとめておきます。

「いやいや、もっといい方法があるよ」という方はコメントいただけると助かります。。。

## 分割QRコードについて

![スクリーンショット 2021-09-08 1.11.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426420/97f612c9-3c69-1932-0943-44dbedd401e7.png)
QRコードがなんぞやっていうのは割愛します。
ググってくださいませ。

今回伝えたいのは、QRコードは分割されることがあるということです。
上記のような2つのお薬手帳用のQRコードは2つ揃って必要な情報を取得できます。

1つのQRコードが保持できる情報量は決まっているため、
上限を超える情報量を出力するためにQRコードは分割できるって話です。

## 分割情報はどこにある？
QRコードをバイナリにすると分かります。

| バイナリ情報 | 説明 |
|:-----------|:------------|
| 1バイト目の最初4ビット| 3だと分割QRコード |
| 1バイト目の後ろ4ビット     | 分割されているQRコードの位置（0開始）|
| 2バイト目の最初4ビット       |分割されているQRコードの最大位置        |
| 2バイト目の後ろ4ビット       |パリティ1        |
| 3バイト目の最初4ビット       |パリティ2       |


はい、シンプルですね。
見ての通りですが、分割情報が4ビットしかないので最大16分割までしかできません。

### 例
ここに「00110000 00011001 00110010~」で始まるQRコードがあるとします。
16進数にすると「30 19 32~」となります。

先程の表に照らし合わせると、
1バイト目の最初4ビットが3なので、このQRコードは分割されていると分かります。
1バイト目の後ろ4ビットが0なので、分割QRの1番目だと分かります。（0スタートなので1番目です）
2バイト目の最初4ビットが1なので、QRコードの総数は2つだと分かります。
2バイト目の後ろ4ビットと3バイト目の最初4ビットは、パリティです。2つ目のQRコードと同じになるのでIDっぽく使えます。


ちなみに、上記のQRコードの2つ目のバイナリ（16進表記）は以下の通りとなります。
「31 19 34~」

## Swiftでどう取得するのか？

AVFoundationでQRコードを読み取るときのデリゲートメソッド内に取得方法を記載します。


```swift
    func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {
        if let metadataObject = metadataObjects.first {
            guard let readableObject = metadataObject as? AVMetadataMachineReadableCodeObject else { return }
            guard let readableObjectForQRCode = readableObject.descriptor as? CIQRCodeDescriptor else { return }
            // 16進数のQRコード情報を取得
            let hexQRCodeData = readableObjectForQRCode.errorCorrectedPayload.map { String(format: "%02X", $0)}

            // 分割コードかチェック（trueなら分割コード）      
            let isSeparatedQRCode = hexQRCodeData.first!.hasPrefix("3")

            // 分割コードの総数を取得
            ​​​​​​​​let secondByteFirstHex = hexQRCodeData[1].prefix(1) + 1
            ​​​​​​​​let total = Int(secondByteFirstHex, radix: 16)!

            // 分割コードの位置を取得
            let ​​​​firstByteSecondHex = hexQRCodeData[0].suffix(1)
            let position = Int(firstByteSecondHex, radix: 16)!


        }
    }
```


:::note info
AVFoundationでQRコードを読み取る方法は以下記事を参考
:::
https://qiita.com/ikaasamay/items/58d1a401e98673a96fd2
https://dev.classmethod.jp/articles/ios-avfoundation/
https://dev.classmethod.jp/articles/ios-avfoundation-avcapturemetadataoutput-qrcode/

## まとめ
そのうちAppleがいい感じのメソッドを提供しそうな気もする。
でも、とりあえずQRコードの仕様が分かればそんな難しくないので別に不要な気もする。
いずれにせよ困っている人の参考になれば幸い！


## 参考記事
https://developer.apple.com/documentation/coreimage/ciqrcodedescriptor

https://programresource.net/2013/05/04/2188.html

https://speakerdeck.com/monoqlo/iosdc-2018

https://qiita.com/monoqlo/items/c8d6159d1c19d56d1c8a
Go で、デバッガの attach まで実行を待機させる

Node.js や Java (JVM) 等はランタイムが大きいこともあり、本体側にデバッギ支援の機能を持っている。

`node --inspect` か、 `NODE_OPTIONS="--inspect" ～` で、Node.js 側がポートを開いてデバッガの接続を待ち、 `--inspect` であれば、接続後にすぐ実行を開始する。 `--inspect-brk` であれば、接続後に即 break する。

一方で、Golang などのネイティブバイナリへコンパイル＆リンクをする言語では、実行バイナリ本体にデバッギ支援の機能を持たせるような富豪なことはできない。dlv(1) がデバッガである。よって、以下のいずれかでデバッガを動かしてやる必要がある。

* dlv 下でコマンドを実行する
* 既存プロセスへ dlv が attach する

デバッガが動いた後で、dlv が開くポートへインターフェイス（IDE 等）で接続する。前者の方が簡単だ。だが、後者のように起動したいケースも多い。思いついたオプションや引数を指定してコマンドラインから実行したいとか、他のツールの配下で動いている、などのケースで。

その場合は、何とかして dlv が接続してくるまで、プロセスを待たせる必要がある。 `main` へ入るやいなや、下記のようなルーチンを呼んでおけば良い。インターバルを置きつつプロセスのリストを眺めて、自身の PID に対して dlv が接続しているプロセスが見つかったらループを抜ける。

```go:
// WaitForDebugger waits for a debugger to connect if the environment variable $DEBUG is set
//
// noinspection GoUnusedExportedFunction, GoUnnecessarilyExportedIdentifiers
func WaitForDebugger() {
	if os.Getenv("DEBUG") == "" && os.Getenv("WAIT") == "" && os.Getenv("WAIT_FOR_DEBUGGER") == "" {
		return
	}
	pid := os.Getpid()
	_, _ = fmt.Fprintf(os.Stderr, "Process %d is waiting\n", pid)
	for {
		time.Sleep(1 * time.Second)
		if (func() bool {
			cmd := exec.Command("ps", "w")
			stdout, err := cmd.StdoutPipe()
			if err != nil {
				log.Panicf("panic f74bdca (%v)", err)
			}
			defer func() { _ = stdout.Close() }()
			reader := bufio.NewReader(stdout)
			err = cmd.Start()
			if err != nil {
				log.Panicf("panic e137dd7 (%v)", err)
			}
			defer func() { _ = cmd.Wait() }()
			for {
				line, err := reader.ReadString('\n')
				if err == io.EOF && len(line) == 0 {
					break
				}
				if strings.Contains(line, "dlv") &&
					strings.Contains(line, fmt.Sprintf("attach %d", pid)) {
					return true
				}
			}
			return false
		})() {
			_, _ = fmt.Fprintf(os.Stderr, "Debugger connected")
			break
		}
	}
}
```

後は、dlv で breakpoint を指定してから、PID で attach してやれば良い。

```shell-session:
$ go build -gcflags=all="-N -l" -o ~/go/bin/foo ～ // 最適化は切っておいた方が良い
$ foo hoge fuga

... ← 何か変だと気づいてデバッグしたくなった

$ DEBUG=1 foo hoge fuga # 環境変数 DEBUG を設定して実行すると、デバッガを待つ
2021/09/08 14:25:34 Process 98245 is waiting
2021/09/08 14:26:41 Debugger connected ← デバッガが接続すると再開する

...

```


上記で、sleep の位置をエラーチェックの後にしてしまうと、dlv がまだデバッグの準備が済んでいない間にプログラムが再開してしまい、breakpoint を先に抜けてしまうことがある。

引数まで含んだプロセス一覧を取得できる golang ライブラリってありませんかね？ そうすれば上記、もうすこしきれいに、なおかつ OS 非依存に書けると思うんですが。

デバッギが USR1 あたりのシグナルを受信したら再始動という案もあったが、毎度シグナルを手投げするのがめんどくさかったので、タイマーにした。 // [go - How can I see if the GoLand debugger is running in the program? - Stack Overflow](https://stackoverflow.com/questions/47879070/how-can-i-see-if-the-goland-debugger-is-running-in-the-program)
M5Stack Core2: UIFlow の使い方

UIFlow のインストール方法はこちら
[M5Stack Core 2でUIFlowを使ってみよう](https://news.mynavi.jp/article/makeprogram-43/)

https://flow.m5stack.com/
にアクセスして、API KEY を入れることで、使うことが出来ます。

サンプルのスケッチ
>Blockly でなく python のコードを打ち込みました。
![uiflow_aa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/3eea45b4-8297-d8f6-5f98-e845330aef78.png)

```py

from m5stack import *
from m5stack_ui import *
from uiflow import *

screen = M5Screen()
screen.clean_screen()
screen.set_screen_bg_color(0x00f0f0)

label0 = M5Label('0', x=12, y=10, color=0x000, font=FONT_MONT_48, parent=None)
label1 = M5Label('0', x=12, y=60, color=0x000, font=FONT_MONT_48, parent=None)
label2 = M5Label('0', x=12, y=110, color=0x000, font=FONT_MONT_48, parent=None)

from numbers import Number

@timerSch.event('timer1')
def ttimer1():
  global counter
  label0.set_text(str(counter))
  jt = counter + 1
  label1.set_text(str(jt))
  kt = counter + 2
  label2.set_text(str(kt))
  counter += 1

counter = 0
timerSch.run('timer1', 2000, 0x00)
```

プログラムを実行した時の様子
![IMG_20210908_143157.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/a89862cc-3527-3c29-fe68-8a7cf458a092.jpeg)

UIFlow では python のプログラムは保存できません。
コピーして、自分で保存しておく必要があります。

上記のプログラムを改造したサンプル

```py:ex01.py
from m5stack import *
from m5stack_ui import *
from uiflow import *

screen = M5Screen()
screen.clean_screen()
screen.set_screen_bg_color(0x00f0f0)

xpos = 120
label0 = M5Label('0', x=xpos, y=10, color=0x000, font=FONT_MONT_48, parent=None)
label1 = M5Label('0', x=xpos, y=60, color=0x000, font=FONT_MONT_48, parent=None)
label2 = M5Label('0', x=xpos, y=110, color=0x000, font=FONT_MONT_48, parent=None)
label3 = M5Label('0', x=xpos, y=160, color=0x000, font=FONT_MONT_48, parent=None)

from numbers import Number

@timerSch.event('timer1')
def ttimer1():
  global counter
  label0.set_text(str(counter))
  jt = counter + 100
  label1.set_text(str(jt))
  kt = counter + 200
  label2.set_text(str(kt))
  lt = counter + 300
  label3.set_text(str(lt))
  counter += 1

counter = 0
timerSch.run('timer1', 2000, 0x00)
```

![IMG_20211001_115016.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/fe326803-661f-4412-77ec-102ff14e81c2.jpeg)
1分で、macのシェル種類を切り替え

> 会社では定期的に欲しいノートパソコンに交換してくれますが、私はMac Proに交換してもらいました。シェルスクリプトを触る機会が時々ありますが、その時にmacはzshがデフォルトになっていて不便でした。切り替えシリーズとして皆さんと共有したいと思います。


#環境
- シェルはzshで設定・確認します。
- macOS Big Sur 11.3.1

#実施
##利用可能なシェルのリストを確認
現在のOSXで利用できるシェルを出力してくれます。

```zsh
echo $SHELL #　現在のシェルを確認
cat /etc/shells 
``` 

##シェルを切り替えてみましょう

### 1. 現在のシェルを確認
```zsh
echo $SHELL
``` 

### 2. bashに変更
chshはchange shellの略語です。
リストで表示されているシェルにて、変えたいシェルにパスを変更して実装しましょう。

```zsh
chsh -s /bin/bash
```

### 3. 変更を適用
command + n　で新しいターミナルを開きます。

### 4. 結果確認
ターミナルのヘッダーにも表示されるはずですが、より明確に確認するには下記を打ててみます。

```zsh
echo $SHELL
``` 

#結論
シェルプログラミングはは強力ながらデリケートなものです。
シェルの種類を合わせることから確認することからですね。
Active Storageでsvgを表示する【Rails】

svg画像をActive Storageでattachしてから表示する際に少々手こずったのでメモ

## svgがimgタグで表示されない
Model

```hoge.rb
class Hoge < ApplicationRecord
  has_one_attached :image
  ...
end
```

View

```rb
= tag.img src: url_for(@hoge.image)
```

これだと画像として表示されない。

これを解決するには、まずRailsがデフォルトでHTTPヘッダーのContent-Dispositionをattachmentとしているリストから"image/svg+xml"を消して、inlineを許可する。

```config/initializer/storage.rb
Rails.application.config.active_storage.content_types_to_serve_as_binary.delete("image/svg+xml")
Rails.application.config.active_storage.content_types_allowed_inline << "image/svg+xml"
```

## N+1
単にrails_storage_proxy_pathとするだけだとその都度

```sql
SELECT `active_storage_blobs`.* FROM `active_storage_blobs` WHERE `active_storage_blobs`.`id` = <hoge.id> LIMIT 1
```

とされてしまいN+1問題が起きる。

これを解決するには、\<attachment_name\>_url属性をモデルに追加して

```hoge.rb
attribute :image_url

def image_url
    return self.image.attached? ? url_for(self.image) : "#"
end
```

with_attached_\<attachment_name\>する。

```rb
Hoge.<queries>.with_attached_image
```

するとSQLのWHERE以下がイコールからIN \<list\>に変わる。

## 参考

https://edgeguides.rubyonrails.org/active_storage_overview.html

https://edgeguides.rubyonrails.org/configuring.html#configuring-active-storage

https://qiita.com/Wacci6/items/294f572ea068be318e4d