OmniAICreator/Qiita-1.07M huggingface dataset:
Azure AD 条件付きアクセスにおけるアクセス制御について

## アクセスのブロック
ポリシーをもとにリソースやアプリケーションへのアクセスをブロックする

## アクセス権の付与
アクセス権を付与する時に下記の条件をもとにアクセス許可をする制御ができる

- 多要素認証を必須にする
- デバイスが準拠としてマーク済みであること
- ハイブリッドAzure AD参加済みのデバイスであること
- 承認済みのクライアントアプリを必須にする
- アプリの保護ポリシーを必須にする
- パスワードの変更を必須にする

### 承認済みのクライアントアプリを必須にする
この項目を有効にすることで組織のリソースにアクセスする際に、特定のクライアントアプリからのアクセスからしか許可しない設定ができるようになる。

アプリ例は以下のリンクから
https://learn.microsoft.com/ja-jp/azure/active-directory/conditional-access/concept-conditional-access-grant#require-approved-client-app

注意点

- edgeのInPrivateモードは承認済みのクライアントアプリと見なされない
- Intuneのアプリ保護ポリシーと連携している
    - つまりiOSとAndroidのみこのポリシーは適用される
- PowerBIを承認済みクライアントアプリとして設定するためにはAzure ADアプリケーションプロキシを使ってPower BIモバイルアプリをオンプレミスのPower BIレポートサーバーに接続することはできない

### パスワードの変更を必須にする
制限事項

- すべてのクラウドアプリに割り当てる必要がある
- 準拠デバイスの要求など、他の制御と共存することはできない
- ユーザー、グループ条件もすべてに割り当てる必要がある
- ユーザーリスクが検知された条件下のみで使用できる

## セッションコントロール
サインインの頻度や永続的なセッションコントロールの設定ができる

### アプリケーションによって適用される制限
選択したクラウドアプリにデバイス情報を渡すことができる
デバイス情報を渡すことができると準拠済みのデバイスかどうか判断したりすることができる

### アプリケーションの条件付きアクセス制御
ユーザーのアプリへのアクセスとセッションをリアルタイムで監視・制御できるようになる
MCASと同時に動かすことができる

## サインインの頻度
サインインのし直しを求めるまでの期間
【Git】GitHub CLIの補完を有効にする方法

## Homebrewでインストールしている場合
GitHub CLIをHomebrewでインストールしている場合には以下のページの手順に沿って設定を行います。

https://docs.brew.sh/Shell-Completion

zshの場合には以下を`~/.zshrc`に記述します。

```~/.zshrc
if type brew &>/dev/null
then
  FPATH="$(brew --prefix)/share/zsh/site-functions:${FPATH}"

  autoload -Uz compinit
  compinit
fi
```

これでコマンドの補完ができるようになります。

`gh `を入力してタブを入力すると以下のように表示されます。

```zsh:zsh
$ gh
alias       -- Create command shortcuts
api         -- Make an authenticated GitHub API request
auth        -- Authenticate gh and git with GitHub
browse      -- Open the repository in the browser
co          -- Alias for pr checkout
codespace   -- Connect to and manage codespaces
completion  -- Generate shell completion scripts
config      -- Manage configuration for gh
extension   -- Manage gh extensions
gist        -- Manage gists
gpg-key     -- Manage GPG keys
help        -- Help about any command
issue       -- Manage issues
label       -- Manage labels
pr          -- Manage pull requests
release     -- Manage releases
repo        -- Manage repositories
run         -- View details about workflow runs
search      -- Search for repositories, issues, and pull requests
secret      -- Manage GitHub secrets
ssh-key     -- Manage SSH keys
status      -- Print information about relevant issues, pull requests, and notifications across
workflow    -- View details about GitHub Actions workflows
```

## Bashの場合
bashの場合にはbash-completionをイントールする必要があります。

https://github.com/scop/bash-completion

bash-completionのインストール後に以下を`~/.bash_profile`または`~/.bashrc`に記述します。

```~/.bashrc
eval "$(gh completion -s bash)"
```

`gh `を入力してタブを入力すると以下のように表示されます。

```bash:bash
$ gh 
alias       (Create command shortcuts)
api         (Make an authenticated GitHub API request)
auth        (Authenticate gh and git with GitHub)
browse      (Open the repository in the browser)
co          (Alias for pr checkout)
codespace   (Connect to and manage codespaces)
completion  (Generate shell completion scripts)
config      (Manage configuration for gh)
extension   (Manage gh extensions)
gist        (Manage gists)
gpg-key     (Manage GPG keys)
help        (Help about any command)
issue       (Manage issues)
label       (Manage labels)
pr          (Manage pull requests)
release     (Manage releases)
repo        (Manage repositories)
run         (View details about workflow runs)
search      (Search for repositories, issues, and pull requests)
secret      (Manage GitHub secrets)
ssh-key     (Manage SSH keys)
status      (Print information about relevant issues, pull requests, and notifications across repositories)
workflow    (View details about GitHub Actions workflows)
```
Salesforceでフローを作成しよう～親の親のレコードを更新しよう

こんにちは

今回はSalesfroceのフローを作成し
・子レコードを起点に親レコード所有者を更新
そして親レコードの所有者を更新

というフローを作成します


![フロー１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/a2dfff6e-d884-32d0-0f9d-d6e48243e864.png)


フロー作成内容はこのようになります

![フロー２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/c0ce4b7f-192c-6120-afc3-6bdaa2e61b13.png)

レコード開始条件はAオブジェクトの更新になります

![更新０１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/15abdb2d-6b19-443a-096b-8f65e5b812f4.png)


親オブジェクトBの更新は以下となります

![B1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/365f0da4-c7f3-390a-ee4f-9aafd1968a0b.png)


そのあと、親の親のレコードの更新をします。
その前に親レコードを元にその親レコードの取得をします



![フロー３.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/c110408b-bb00-c4f5-0341-9b103cda90f0.png)


最後に先ほど取得したレコードを元に親レコードの更新を行います

![フロー４.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/e800c4a2-ac01-36a3-099b-f6360547acac.png)
【TypeScript】正規表現 RegExp　メモ


* いままで書いてきた正規表現リテラルの書き方(括弧の中身が出力される)
```typescript
const text = 'abc(def)ghi';
const matchText = text.match(/\((.+)\)/);
console.log(matchText![1]);
//def
```

### 何が問題なのか？？
正規表現リテラルを使うと変数で指定できない（もしかしたらできるかも）

* 試してみた例↓
```typescript
const front = '(';
const end = ')';
const matchText = text.match('/\' + front + '(.+)\' + end '/');//できない
```
frontを前の括弧、endを後ろの括弧として指定してみたができなかった

### RegExpを使ってみる
正規表現リテラルを使う以外にもRegExpというコンストラクタを使用する方法があるようだ
参照:https://www.wareko.jp/blog/typescript-which-is-better-regexp-or-regular-expression-literal

* 実際に書いてみる
```typescript
const text = 'abc(def)ghi';
const left = '(';
const right = ')';
const regexp = new RegExp('\\' + left + '(.+)\\' + right);
const matchText = text.match(regexp)![1];
console.log(matchText);
//def
```
先ほど同様、frontを前の括弧、endを後ろの括弧として指定
regexpを変数としてRegExpコンストラクタを生成して、正規表現パターンを指定してあげるとうまく出力された！

### 注意点
注意点は主に2つ
1\. 正規表現リテラルをそのままコンストラクタに入れない
```typescript
const text = 'abc(def)ghi';
const left = '(';
const right = ')';
// const regexp = new RegExp('\\' + left + '(.+)\\' + right);
const regexp = new RegExp('/\' + left '(.+)\' + right '/');//エラー
```
5行目の正規表現リテラルで使用していた'/'はRegExpでは不要

2\. \は2重にする必要あり
```typescript
const regexp = new RegExp('\' + left + '(.+)\' + right);//これだと動かない
const regexp = new RegExp('\\' + left + '(.+)\\' + right);//これだと動く 
```
Azure Resource Graph Explorer

自分/自分達が管理/活用しているAzure Subscription(s)で、特定のリソースタイプが使われているかを知る必要があることがあります。その際に便利なツールとしてAzure Resource Graph Explorerがあります。使い方は簡単で以下の通りです。

1. Azure Portalにログインし、サーチボックス等を活用して、Azure Resource Graph Explorer画面に遷移

2. スコープを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1008844/f919160a-0b2c-4e48-e8bf-20b2c671bb26.png)

3. Categoriesから調べたいリソースタイプを選択すると、クエリ分が生成される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1008844/0a401385-ee49-c0a0-4150-6716587b627c.png)

4. "Run query"をクリックすると、クエリ結果が出力され、それをCSV形式で出力したりできる
Googlemap投稿ページに反映させる方法

今回はGoogleMapを投稿ページに反映させる方法を紹介します！

**注意**
↓の記事を閲覧・実行したあとの話になります！！
https://qiita.com/MandoNarin/items/aa91ffae373a8cfc85d2

以下のコードを入力
```ruby:new.html.erb
<h2>Google map</h2>
<input id="address" type="textbox" value="">
<input type="button" value="地図を検索" onclick="codeAddress()">
<div id="display">緯度経度が表示されるよ！</div>
<div id='map'></div>
<style>
    #map {
        height: 400px;
        width: 400px;
    }
</style>
<script>
    let map
    const display = document.getElementById('display')
    // mapの表示関数
    function initMap() {
        geocoder = new google.maps.Geocoder()
        // mapの初期位置, 縮尺を定義
        map = new google.maps.Map(document.getElementById('map'), {
            center: {
                lat: 35.6458437,
                lng: 139.7046171
            },
            zoom: 12,
        });
        // mapsテーブルにあるそれぞれのレコードをmap上に表示
        <% @map.each do |m| %>
            (function(){
            var contentString = "住所：<%= m.address %>";
            // マーカーを立てる
            var marker = new google.maps.Marker({
                position:{lat: <%= m.latitude %>, lng: <%= m.longitude %>},
                map: map,
                title: contentString
            });
            // 情報ウィンドウ(吹き出し)の定義
            // 投稿の詳細ページへのリンクも
            var infowindow = new google.maps.InfoWindow({
            position: {lat: <%= m.latitude %>, lng: <%= m.longitude %>},
            content: "<a href='<%= map_url(m.id) %>' target='_blank'><%= m.address %></a>"
            });
            // クリックしたときに情報ウィンドウを表示
            marker.addListener('click', function() {
            infowindow.open(map, marker);
            });
            })();
        <% end %>
    }
    let geocoder
    // 地図検索関数
    function codeAddress() {
        let inputAddress = document.getElementById('address').value;
        geocoder.geocode({
            'address': inputAddress
        }, function (results, status) {
            if (status == 'OK') {
                map.setCenter(results[0].geometry.location);
                var marker = new google.maps.Marker({
                    map: map,
                    position: results[0].geometry.location
                });
            display.textContent = "検索結果：" + results[ 0 ].geometry.location
            } else {
                alert('該当する結果がありませんでした：' + status);
            }
        });
    }
</script>
<script
    src="https://maps.googleapis.com/maps/api/js?key=<%= ENV['GOOGLE_MAP_API_KEY'] %>&callback=initMap"
    async defer>
</script>
```

以上になります！！
定数やカラムなどは自分の作成したモノと照らし合わせながら作成してください！！
CADSレポジトリに保存する際にコメントを保存する

SPSS Collaboration & Deployment Servies(以下CADS)レポジトリに保存する際に、他のメンバーと情報を共有するためにストリームなどのオブジェクトにコメントを保存したいことがあります。３つの方法が考えられます。


# 1. ストリーム内にコメントとして保存する。

まずは、ストリーム自体にコメントをつけておき、それをCADSに保存する方法があります。

SPSS Modelerでコメントをつけるなどをしてストリームを読みやすくする - Qiita 

https://qiita.com/kawada2017/items/01daa98cb5ec3fd61dd8

# 2. レポジトリに保存する際にコメントを付ける

レポジトリに保存する際にコメントを付けることもできます。

ModelerからストリームをCADSレポジトリに「ストリームとして格納」します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/685e148b-d4f3-154c-5d8c-65934fa20c86.png)

この際に「情報」タブを選ぶと「説明」や「キーワード」を付けて保存することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/5328108b-c585-7374-360f-12c79f83bc0d.png)


逆にCADSレポジトリから取得します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/9e43a1f5-3e5c-1a44-8197-020598597f4a.png)

検索タブで検索することができます。この例では「キーワード」に「温度」が入っているストリームを探しています。そして、「故障予測.str」のバージョン２と３にこのキーワードが見つかっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/f46cfe07-6b26-0a80-b160-b2473b3e0c41.png)

これらのコメントはCADSの管理クライアントのDeployment Managerでも確認ができます。
ストリームを右クリックして「プロパティ」を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/94555f3c-6d18-886a-d555-e6923b7ca7e9.png)

バージョンタブを開くと各バージョンの「説明」や「キーワード」を確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/87f28a03-24f6-1990-9ed0-236b99a22440.png)


# 3. 情報をまとめたPower PointやExcelファイルをレポジトリに保存

コメントだけではなく、図やグラフなどの情報も保存したい場合にはPower PointやExcelのファイルをそのままCADSのレポジトリに保存することができます。Windowsのエクスプローラーからドラッグアンドドロップで任意のファイルをCADSレポジトリに保存することが可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/7d5e744d-81fc-ea2d-90e3-88facf8dce65.png)

CADSに保存することができました。ダブルクリックすれば、Power Pointが起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/8d090229-1b2e-00ce-ad96-532a54c0f5d9.png)

Deployment Portalでもダウンロードが可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/b2586dc3-cacb-7778-05ad-117569ba8427.png)

* テスト環境
    * SPSS Modeler 18.4
    * SPSS CADS 8.4
    * Windows Server 2019
Rabbitのスライドを16:9にする

Rabbitはデフォルトでは4:3のスライドが表示される。
しかし、実は3.0.0から16:9にも対応している。

コマンドラインオプション `--size 800,450` をつけてrabbitを実行すればよい。
詳細は下記リンク参照。

https://github.com/rabbit-shocker/rabbit/blob/a748964af24b3a13fad0712865f252e4b52e5cfe/doc/ja/news.rd

この記事は以上です。
AWSのプライベートサブネットでElixirを使おうとしたら…挫折した件

# Amazon Linux2のプライベートサブネットでElixirを使おうとしたら挫折した件

経緯
1. S3のリポジトリepel等を追加してElixirをインストールしたらv0.12だった
1. v0.12だと動かないので、新しいelixirを入れようとする
1. AmazonLinux2のリポジトリにあるErlangもバージョンが古い
1. 諦め

## 手動でインストールすればいけるかも
でもそれだったらpythonとかでいいや…

インターネットにつながっていないインスタンスでElixir使ったことがあったら教えて下さい
gradleのTIPS

## Gradle buildが実行できないとき

以下コマンドを対象のプロジェクトのディレクトリ内で実行してビルドする。
適当なgradleのバージョンを引っ張って実行してくれる
```bash
./gradlew build
```

成功したら、プロジェクトディレクトリ内のlibs配下 にjarファイルが作成されるので、
libs配下に移動して実行できる
```bash
pwd hogeProject
cd libs
ls hoge.jar
java -jar hoge.jar
```


## build.gradleの記述

以下のように書き換えることでJREのバージョンに対応した形でビルドできる
```groovy
sourceCompatibility = '11'
targetCompatibility = '11'

sourceCompatibility = '8'
targetCompatibility = '8'
```

jarにビルドするときは以下のようにマニフェストの記述が必要
```groovy
jar {
    manifest {
        attributes(
        		   'Main-Class': 'com.hoge.SamplelApplication'
        )
    }
}
```

## 依存関係

EclipseでGradleを使うときは、Eclipseの設定からビルドパスや、クラスパスの設定はしない。
build.gradleのdependenciesに記述して、

```groovy
dependencies {
    implementation 'org.springframework.boot:spring-boot-stater'
    implementation '同様に追加する' 
}
```

プロジェクト名を右クリック
→Gradle
→Gradleプロジェクトのリフレッシュ
の動作でEclipseに反映させる。
[VHDL]VSCodeでVHDLを書く時に登録しておくと便利なスニペット

ファイル→ユーザー設定→ユーザースニペットの構成　から以下の新規スニペットを作成

```json:vhdl.json
{
	"process": {
		"prefix": "process (my snippet)",
		"body": [
			"process(CLK)",
			"begin",
			"\tif (RST='1') then",
			"\t\t",
			"\telsif (rising_edge(CLK)) then",
			"\t\t",
			"\tend if;",
			"end process;"
		]
	},
	"component": {
		"prefix": "component (my snippet)",
		"body": [
			"component $1 is port (",
			"\t",
			"); end component $1;"
		]
	},
	"entity": {
		"prefix": "entity (my snippet)",
		"body": [
			"entity $TM_FILENAME_BASE is",
			"\tport (",
			"\t\tCLK : in std_logic;",
			"\t\tRST : in std_logic;",
			"\t\t",
			"\t);",
			"end entity $TM_FILENAME_BASE;"
		]
	},
	"instance": {
		"prefix": "instance (my snippet)",
		"body": [
			"$1_Inst : $1 port map(",
			"\t",
			");"
		]
	},
	"architecture": {
		"prefix": "architecture (my snippet)",
		"body": [
			"architecture rtl of $TM_FILENAME_BASE is",
			"\t$1",
			"begin",
			"\t",
			"end architecture rtl;"
		]
	}
}
```
git pullでのエラー error: Your local changes to the following files would be overwritten

# git pull したときに、error: Your local changes to the following files would be overwritten by merge: routes/web.phpと出る時。

Laravel9のプロジェクトを進めてローカル環境での開発にきりが付いたので、git pushしてリモートリポジトリを更新し、本番環境のローカルリポジトリにgit pullしたときにエラーが出た。

サイトで検索すると、いろいろな方法が出てくる。
まず出てきたのがstashを使ってエラーの出ているファイルを一旦対比させておく方法。
```
git stash
```
git stash を使ってみたが、特に一次退避するファイルもないよと表示された。

次に試したのが、
```
git add .
git commit -m "some coments"
git push origin master
```
これですべてのファイルをもう一度pushしてみるということだ。
しかし先ほどpushしたので、もちろん「your branch is clear」と出て、きれいさっぱりpushできている。

### 次にgit treeを確認してみた。
しかし、特にブランチも切っていなかったし、マージする内容もなかった。HEADもリモートリポジトリを指しており、正常にpushできている。

悩みに悩んだ結果、以下のサイトを見つけた。
**git pull を強制し、リモートでローカルを上書きする方法**
https://www-creators.com/archives/1097

この記事では
```
// 1) リモートの最新を取ってきておいて・・
$ git fetch origin master

// 2) ローカルのmasterを、リモート追跡のmasterに強制的に合わせる！
$ git reset --hard origin/master
```
という方法が書かれていた。
これを本番環境で実行すると無事pullすることができ、正常にホームページも動作した。

めでたしめでたし。
Proxy管理下でaxiosを使う場合のメモ

毎度ググるのでメモ
proxyをfalseにして、agentにhttps-proxy-agent経由で渡した値を持たせる。

## サンプル

```js
import "dotenv/config";
import axios from "axios";
import { HttpsProxyAgent } from "https-proxy-agent";

export const axiosSample = async () => {
  const url = "https://example.com";
  const proxyServer = process.env.PROXY_URL;
  const agent = new HttpsProxyAgent(proxyServer);
  const res = await axios({
    method: "GET",
    url,
    httpsAgent: agent,
    proxy: false,
  }).catch((e) => {
    console.error(e.message);
    throw e
  });
  console.log(res.data);
}
バイナリーサーチを使って配列の中の値を検索するコード

今日も学んだことを忘れない為にメモします。

## バイナリーサーチとは
ソート（データを順に並べ替える）済みのリストや配列に入ったデータ（同一の値はないものとする）に対する検索を行うときに用いられる手法。まず、中央の値を確認し、検索したい値との大小関係を用いて、検索したい値が中央の値の右にあるか、左にあるかを判断する。
それを繰り返し、片側には存在しないことを確かめながら検索していく方法。

二分探索、二分割検索とも呼び、1回の処理で選択肢が半分になるので、処理速度の向上が期待できる。


## プログラム内容
配列 array=[1, 3, 5, 6, 9, 10, 13, 20, 26, 34]があり、任意の値が存在するかどうか、そして何番目に存在するのか、検索する。
任意の値が配列内に存在しない場合は、「値は配列内に存在しません」と表示し、
存在する場合は、配列の何番目にあるかを表示する。
配列における「1」は「配列の0番目に存在する」と表現と表現する。


"" 記述内容
```
def binary_search(array, right, target)
  left = 0
  while left <= right
    center = (left + right) / 2
    if array[center] == target
      return center
    elsif array[center] < target
      left = center + 1
    else
      right = center - 1
    end
  end
  return -1 
end

array=[1,3,5,6,9,10,13,20,26,31]

puts "検索したい数字を入力してください"
target = gets.to_i
number_of_elements = array.length

result = binary_search(array, number_of_elements, target)

if result == -1
  puts "#{target}は配列内に存在しません"
else
  puts "#{target}は配列の#{result }番目に存在します "
end
```

検索したい値はtarget
一番左側の添え字はleft（left = 0）
一番右側の添え字はright（lengthメソッドを使用して配列の要素数を取得して一番右側の添え字とする）
真ん中の添え字はcenter（center = (left + right) / 2で真ん中の添え字を求める）（Rubyでは小数点以下は切り捨てになる）
に代入する。

以下がバイナリーサーチを使った処理の部分
```
def binary_search(array, right, target)
  left = 0
  while left <= right
    center = (left + right) / 2
    if array[center] == target
      return center
    elsif array[center] < target
      left = center + 1
    else
      right = center - 1
    end
  end
  return -1 
end
```


while文を使用して、当てはまるまで計算を繰り返していく。
※return -1は何も当てはまるときがないときに、最終的な返り値になる。
targetとして31を入力した場合、
```
[1,3,5,6,9,10,13,20,26,31]
```

1回目の検索では、
left = 0
right = 10
となり、中央の値がある添え字はcenter = (left + right) / 2で
center=5
となり中央の値がある添え字が分かったので検索したい値と比較する。


array[center] =10 
target　= 31
となるので
array[center] < target となる
これで次に検索すべき範囲は以下になる
```
[13,20,26,31]
```
centerの一つ右側へ変更になるので、left = center ＋ 1となる
（真ん中の添え字が一番左側の添え字になる場合はleft = center ＋ 1
真ん中の添え字が一番右側の添え字になる場合はright = center - 1
となる）

2回目の検索では
left= 6
right=　10
となり、中央の値がある添え字はcenter = (left + right) / 2で
center=8
となり中央の値がある添え字が分かったので検索したい値と比較する。

array[center]=26
target　= 31
となるので
array[center] < target となる
これで次に検索すべき範囲は以下になる
```
[26,31]
```
centerの一つ右側へ変更になるので、left = center ＋ 1となり、結果array[center]=３１となる。
target　= 31なので array[center] == targetとなりreturn centerによってメソッド内の処理から抜け出し返り値が9となる。


```
if result == -1
  puts "#{target}は配列内に存在しません"
else
  puts "#{target}は配列の#{result }番目に存在します "
end
```
の処理で"31は配列の9番目に存在します"と出力される。


以上になります。
Linux(ubuntu) 各種設定

# 前提
・ubuntu20.04 (lsb_release -a でubuntuのバージョンを確認可能)
・社内で、有線のLANをデスクトップPCにつなげている(Proxy環境下)


[こちら](https://karaage.biz/ubuntu-iso-file/#:~:text=Ubuntu%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%AE%E6%B5%81%E3%82%8C,-%E5%85%AC%E5%BC%8F%E3%82%B5%E3%82%A4%E3%83%88%E3%81%8B%E3%82%89&text=ISO%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92DVD,%E8%B5%B7%E5%8B%95%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%E3%80%82&text=BIOS%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%82%92%E5%A4%89%E6%9B%B4,%E3%81%8B%E3%82%89%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%82%80%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B%E3%80%82&text=DVD%E8%B5%B7%E5%8B%95%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF%E3%81%A7Ubuntu%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E3%80%82&text=%E5%90%84%E7%A8%AE%E8%A8%AD%E5%AE%9A%E3%80%81%E5%BF%85%E8%A6%81%E3%81%AA%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A8%E3%82%A2%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E3%80%82)を参考にubuntuインストール


# proxy設定
## Proxyの全体設定
sudo nano ~/.bashrc　で設定ファイル開き、下記二行追加

export http_proxy="http://proxy_server:port"
export https_proxy="http://proxy_server:port"

Crtl o からの Enter で編集完了
Ctrl x で閉じる

source ~/.bashrc　で有効化

## wget
sudo nano /etc/wgetrc で設定ファイル開き、下記二行追加

http_proxy=http://proxy_server:port
https_proxy=http://proxy_server:port

Crtl o からの Enter で編集完了
Ctrl x で閉じる


## pip proxy

pip install --proxy="http.proxy http://proxy_server:port" numpy
※pipがない場合、sudo apt install python3-pip


## Apt Proxy
sudo nano /etc/apt/apt.conf　で設定ファイル開き、下記二行追加
 
Acquire::http::Proxy "http://proxy_server:port";
Acquire::https::Proxy "http://proxy_server:port";

Crtl o からの Enter で編集完了
Ctrl x で閉じる


## curl
### ・方法1
※全体 Proxy設定のところで追加済みであれば、変更不要。
 
sudo nano ~/.bashrc　で設定ファイル開き、下記二行追加
 
export http_proxy=http://proxy_server:port
export https_proxy=http://proxy_server:port

source ~/.bashrc 

### ・方法２

sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg -x http://proxy_server:port/

# pipのインストール
sudo apt install python3-pip
※sudo apt install python-pipはエラーが生じた

# ブラウザで検索できるようにする
・デスクトップ右上の赤丸の箇所 -> Wired connected -> Wires setting
![wired_connected.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1077648/60a1de8d-299f-4c04-9b3a-704663ad7284.png)

・Manualをクリック
・HTTP PROXY, HTTPS PROXYに、http://proxy_serverを入力
・HTTP PROXY, HTTPS PROXYの右の欄にportを入力
![Network_proxy.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1077648/0f448e10-7c16-0751-8e66-b9e477ecef9d.png)


# Windowsからのリモートデスクトップ接続
ubuntu20.04の場合、ubuntu側の設定は、以下のコマンドを実行するだけ
sudo apt-get install -y xrdp

ubuntu PC IPアドレスの確認したい場合は以下のコマンド
ip -4 a

ubunt 18.04のリモートデスクトップ接続方法, windows PCからのログイン方法は[こちら](https://orenda.co.jp/blog/1874/)
PythonからExcelを操作できるOpenPyXLを使って月報作成を自動化しよう

# 0. はじめに
シフト勤務の方や、月報のExcelファイルがマクロ対応していないMacを使用している方にとって
月報の勤務表や交通費精算の入力は手間が掛かる作業です。

シフトが日勤と夜勤で時間が決まっているなら、5日は日勤、6日は夜勤、というような入力で
自動でExcel書き込みしてくれると負担が減りそうです。

そこで今回はpythonからExcelを操作できるOpenPyXLで月報作成を自動化していきます。
pythonやOpenPyXLは執筆日現在(2022年9月13日)の最新版を使用しています。

- [openpyxl - A Python library to read/write Excel 2010 xlsx/xlsm files](https://openpyxl.readthedocs.io)

ソースコードはこちらを参照ください。
- [otiba30/monthly_report](https://github.com/otiba30/monthly_report)

# 1. ライブラリ導入
まずはOpenPyXLを導入します。

```sh
$ pip3 install openpyxl
```

# 2. 事前準備

以下のディレクトリ構成を想定します。

```
monthly_report
├── origin.xlsx(自身で配置)
├── script.py
└── shift.txt
```

ソースを準備します。

```sh
git clone https://github.com/otiba30/monthly_report.git
cd monthly_report
```

## 2.1. Excel元本の準備(original.xlsx)
月報Excelファイルの元本はMacVer3で動作を確認しています。</br>
ファイルを用意し、origin.xlsxにリネームしてmonthly_reportフォルダ内に配置してください。

## 2.2. シフト表の入力(shift.txt)
2022年9月のシフト表で、2日が日勤で出社、3日が夜勤で出社、8日が日勤で在宅の場合は下記のように記述します。

``` shift.txt
2022 9

2 1
3 2
8 3
```

## 2.3. 勤務時間などの入力(script.py)
参画しているプロジェクト名やシフトの勤務時間など編集をします。</br>
時刻は[days, seconds]で入力になります。<br>
日勤が8:30-17:00、夜勤が16:30-33:30の場合は下記のように記述します。

- 17:00 -> 0日 61200秒 -> [0,61200]
- 33:30 -> 1日 34200秒 -> [1,34200]


```python script.py
pjt_name = 'プロジェクト名'
company = '株式会社オブジェクティブコード'
work_style = '≪シフト（夜勤有）≫'
name = 'ブレイクザダークネス・オブスキュア'

# 所定開始, 所定終了, 休憩開始_1, 休憩終了_1, 休憩開始_2, 休憩終了_2,
# 開始時間, 終了時間,
# 出社or在宅,
# 備考

# 日勤(day shift)
list_ds = [[0, 30600], [0, 61200], [0, 43200], [0, 46800], None, None]\
         + [[0, 30600], [0, 61200]]\
         + ['出社']\
         + ['日勤:お仕事内容']

# 宿直(night shift)
list_ns = [[0, 59400], [1, 34200], [0, 75600], [0, 79200], [1, 10800], [1, 14400]]\
         + [[0, 59400], [1, 34200]]\
         + ['出社']\
         + ['宿直:お仕事内容']

# 日勤在宅(work remotely)
list_wr = [[0, 30600], [0, 61200], [0, 43200], [0, 46800], None, None]\
         + [[0, 30600], [0, 61200]]\
         + ['在宅']\
         + ['日勤:お仕事内容']

# 行き先, 用件, 金額, 使用機関, 移動経路_1, 移動経路_2, 往復or片道
list_te = ['OBG本社', '業務', 336, '電車', '東京', '赤坂見附', '往復']
```

# 3. 実行
実行すると【<font color="red"><b>name</b></font>】<font color="red"><b>month</b></font>月作業分_月末書類_MacVer3.xlsx が作成されます。</br>
条件付きフォーマット(Conditional Formatting)についてWarningが出ますが問題ありません。</br>
備考欄などの修正は作成されたファイルを編集してください。

```sh
$ python3 script.py shift.txt
```



# 4. おわりに
何度もコピペや修正していた作業が一発でほぼ終わり快適です。
ぜひ使ってみてください。
Node.js: シリアルポートの出力

こちらのページのテスト用プログラムを Node.js で書きました。
[M5Stack Core2: シリアルで LED を制御](https://qiita.com/ekzemplaro/items/e4ddb0ba0b03a9004204)

```js:led_control.js
#! /usr/local/bin/node
// ---------------------------------------------------------------
//	led_control.js
//
//						Oct/4/2022
// ---------------------------------------------------------------
'use strict';
require('date-utils')
// ---------------------------------------------------------------
function send_proc(color)
{
	port.write(color, function(err)
		{
		if(err){
		// エラーハンドル
			return console.error('*** error ***', err.message)
		}
	// 成功
		console.error("*** sent *** " + color)
		})
}

// ---------------------------------------------------------------
function counter () {
	const colors = ["red","yellow","green","blue"]
	var dt = new Date()
	var formatted = dt.toFormat("HH24:MI:SS")
	console.log(count++, "只今の時刻：",formatted)
	const timeoutId = setTimeout(counter, 2000)

	const jt = count % 4

	send_proc(colors[jt])

	if (count == 5)
		{
		clearTimeout(timeoutId)
		console.error ("*** 終了 ***")
		}

	console.error('*** count = ' + count + ' ***')
}

// ---------------------------------------------------------------
console.error ("*** 開始 ***")
var {SerialPort} = require("serialport")
var port = new SerialPort({path: "/dev/ttyUSB0", baudRate: 115200 })
var count = 0

port.on('open', function() {
	console.error('*** port *** opend ***')
})

counter()

// ---------------------------------------------------------------
```

実行スクリプト

```bash:start.sh
export NODE_PATH=/usr/local/lib/node_modules
./led_control.js
```

次のバージョンで確認しました。

```text
$ node --version
v18.10.0
```
ARC149回答メモ

0.はじめに
　レギュラーコンテストは1問解くことを目標に参加してます。

1.A - Repdigit Number
　考え方１）
　　大きい方からぞろ目数を作っていき、割り切れたところで終わらせれば早い！勝てる！
　　と、以下のような大きい方からぞろ目作るロジックを作り提出
　
```
X=10**N                    #10のN乗作成             ex.N=6、1000000
while(N>0):                #
    X-=1                   #↑から1を引き9のぞろ目    ex.999999
    Y=X//9                 #ぞろ目数の推移用値を用意  ex.111111
    for i in range(9):     #
        if(X%M==0):        #あまり0判定
            print(X)       #割り切れたらプリントし
            exit()         #終了
        elif(X>Y):         #割り切れない、かつXが1のぞろ目じゃない時
            X-=Y           #ぞろ目数の推移用値を減算  ex.999999→888888
    N-=1                   #9～１が終わったらNを減らす(countにしか使用しない)
    X-=(Y//10)             #Xを1桁減らす             ex.111111→100000
```
　　我ながら、いい感じのぞろ目作成器！と思いましたが、TLE続出。
　　9万回くらいしか計算しないでしょ！と思ったけど
　　10000桁以上の数値となると、さすがに無理みたいでした。

　考え方２）（というか、試験終了後解説見ました）
　　j桁の数字iのぞろ目というペアをメモ的に用意して
　　割り切れたペアのうち最大のペア（大小比較は桁を表すjが先）
　　を元に回答の値を作る。という感じで回答しました。
　　
　　前提となる、
　　　(1)　1をMで割った余りに10かけて1を足した数字をMで割った余り
　　　(2)　11をMで割った余り
　　が、同じになるという部分を理解するのに半日かかりました。

　　自分的理解メモ
　　　(3,1)＝111の次は(4,1)＝1111ですが、これは、111*10+1と言える。

　　　Mが4の場合、
　　　111÷４のあまりは３
　　　1110(111を10倍したもの)を割った余りは
　　　111を4であった余り10個(40)を4で割った数(0)
　　　さらに、1桁目に加える1を４で割れば余りが求まる（１）

　　　そのようにして、ｊとｉを設問上限まで増加していき
　　　解を求める。
　　　これで時間足りなければもう一工夫できそうでしたが
　　　時間は足りたのでＯＫでした。

　　　回答は、答えのペアをもとに、ｊをｉ回繰り返したものを表示します。

```
ans=(0,0)
for i in range(1,10):
    X=0
    for j in range(1,N+1):
        X=(10*X+i)%M
        if(X==0):
            ans=max(ans,(j,i))
if(ans[0]==0):
    ans_X=-1
else:
    ans_X=str(ans[1])*ans[0]
print(ans_X)
```
　https://atcoder.jp/contests/arc149/submissions/35388274

B問題以降はそのうち・・・。
Excelのセルのスタイルをすべてクリアする。


Excelで他のブックからコピーアンドペーストすると、そのセルの独自スタイルが追加されることがあります。
すると、セルのスタイル欄がどんどん増えます。
そして、セルのスタイルが無駄に多いと動きがにぶくなることがあります。

そこで、以下のマクロで既定以外のセルのスタイルを強制消去します。
```
Sub clearAllStyles()
  On Error Resume Next
  
  Dim objStyle As Style
  
  For Each objStyle In ActiveWorkbook.Styles
    'ビルトインスタイル（削除不可）以外を削除
    If objStyle.BuiltIn = False Then
      objStyle.Delete
      If Err.Number <> 0 Then
        MsgBox (Err.Description & "Locked? " & objStyle.Locked)
        Err.Clear
      End If
    End If
  Next
End Sub
```

ポイントは「On Error Resume Next」
これがないと削除エラーが発生したところでマクロが中断し、
それ以降のスタイルは消すことができません。
画面フローの項目の値の初期化

元の質問 : [画面フローの項目の値の初期化](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000K0eraSAB)

発行日: 2020年12月3日のヘルプでは
前の画面に移動するとフロー変数の値が失われる　とあるんだけど、質問から考えると今は違うみたい。
[Flow variables lose value when navigating to previous screen](https://help.salesforce.com/s/articleView?id=000350820&type=1)

ヘルプの中に追記されている以下を読むと２つのモードがあるようなことが書かれていますね。
知らんけど。
[Optimizing Lightning Component Inputs and Outputs in Flow Screens](https://unofficialsf.com/optimizing-lightning-component-inputs-and-outputs-in-flow-screens/)


しかし、探してみると同じようにリフレッシュしないとの質問
[Refresh the page after the flow completes](https://salesforce.stackexchange.com/questions/301086/refresh-the-page-after-the-flow-completes)

So what can you do to workaround the behavior of Flow?

Considering the behavior above, you're really left only with the option to leverage a LWC component for this specific use-case. You'd create a LWC for these types of inputs where you want to provide a default value that should respond to user-provided changes if they re-visit. You'd just select that option to refresh inputs.

前のページに戻った時に変数をクリアーにして画面もリフレッシュするようなコンポーネントを作ればいいと書かれています。しかし私ならそこまでするなら、全てカスタムコンポーネントで作った方が後々の保守もしやすいように思いました。個人的には色んな自動化処理を混ぜるのは好きになれません。

------------------------------
回避策は表示テキストコンポーネントを使う方法が回答されていました。

リッチテキスト内で表示したい項目変数を指定することで、【前へ】を使ってレコード再指定した場合の値更新表示がされます。（2-②で取得したレコード変数から項目指定する。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/3f5216db-21e8-47d8-4efc-b8267a155557.png)
#2 プログラミング初心者の理系大学生がAtcoderに挑戦してみた[ABC-267]

では前回に引き続きAtcoderのBeginerコンテストの267の解説をやる。
※このシリーズはわたしのプログラミング技術向上のためのアウトプットに過ぎないため知識不足、説明下手に関しては悪しからず。

## 1\.ABC267
わざわざ解説するまでもない条件分岐の問題である。注意点は英語のスペルのタイプミスによってWAとならないようにすることくらいだ。

```C++
#include <bits/stdc++.h>
using namespace std;
int main(void)
{
	string S;
	cin >> S;

	if (S == "Monday") cout << 5 << endl;
	if (S == "Tuesday") cout << 4 << endl;
	if (S == "Wednesday") cout << 3 << endl;
	if (S == "Thursday") cout << 2 << endl;
	if (S == "Friday") cout << 1 << endl;


	return 0;
}

```
ただこれだけの話である。

## 2\.ABC267-B
次はボウリングのスプリットに関する問題だ。
設定がややややこしいがまずは１ピンが倒れていることが絶対条件。それを満たしたうえで、少なくとも一本のピンが立っている２列の間にすべてのピンが倒れた列が少なくとも一つ存在すればスプリットになる。のピンが倒れているか否かの情報を列ごとに配列に格納し、ピックアップした２列の間にすべてのピンが倒れた列を見つける方針でプログラムを作成する。

```C++
#include <bits/stdc++.h>
using namespace std;

int main(){
  
  string s;
  
  for(int i=1; i<=10; i++) {
    cin >> s[i];
    
  }
 
    if (s[1] == '1') {
        cout << "No" << endl;
        return 0;
    }
    else {

    vector<int> a(7);
    
      for(int i=1; i<=7; i++) {
        a[i] = 0;}
      
        if(s[7] == '1') a[1]=1;
        if(s[4] == '1') a[2]=1;
        if((s[2] == '1') or (s[8] == '1')) a[3]=1;
        if((s[5] == '1') or (s[1] == '1')) a[4]=1;
        if((s[9] == '1') or (s[3] == '1')) a[5]=1;
        if((s[6] == '1')) a[6]=1;
        if(s[10] == '1') a[7]=1;


        for (int i = 1; i <= 7; i++) {
            for (int j = 1; j < i; j++) {
                if (a[i] == 1 and a[j] == 1) {
                    for (int k = j + 1; k < i; k++) {
                        if (a[k] == 0) {
                            cout << "Yes" << endl;
                            return 0;
                        }
                    }
                }
            }
        }
    }

    cout << "No" << endl;
  
  
    
    
  return 0;
}

```
まずピンが倒れているか否かの情報を配列に入力し、ピン１が倒れていない時点でスプリットではないため除外。
そして各縦列に関して一つでも立っているピンが存在するのであれば配列の値を１とする（ただし配列の初期値は０）。その後は立つピンが存在するに列の間にすべてのピンが倒れている列が存在すれば、スプリットとなる。
PostgreSQLのインデックスについて

# インデックスとは
- データベースの性能を向上させるための一般的な方法。
- テーブルにインデックスを作成することで、データ検索時にインデックスの位置を直接アクセスすることができるため、検索速度を上げることができる。
- インデックスが設定されていない場合の検索では、テーブルの最初から順番に1件ずつ探すため、時間がかかり、パフォーマンスが下がる。
- インデックスには検索に特化した様々なデータ構造がある。


※`データ構造`：コンピュータでデータを扱う際に、データを格納する一定の形式のこと
具体例）配列やリストなどもデータ構造の一種
プログラムを書く際にはどのような処理を行うのかを事前に考え、その処理にとって最適なデータ構造を選択する必要がある。そのためにも、様々なデータ構造の特徴を知っておくことが重要。

|メリット|デメリット|
|--|-- |
|インデックスを作成しておけば、データ抽出の際にカラムに設定されたインデックスを検索するので、データベースの負担も軽減し、なおかつ検索効率がアップする。|インデックスを作成しても必ずパフォーマンスが向上するとは限らない。インデックス設定により検索対象のテーブルの更新速度が下がる等のデメリットがある。また、インデックスを設定しても性能が上らないケースもある。|

# インデックスの特徴
- 検索処理を効率化し、性能を上げるために使用される
- ただし、作成することで必ず性能が向上するという保証はないため、作成時には注意が必要である
- インデックスは未使用であっても整合性が取れるように管理されるため、更新処理が遅くなる可能性がある
- 複数カラムを組み合わせて作成することもできる
- 主キー制約やユニーク制約を定義すると自動で作成される
- インデックスに使用できるインデックスの種類はB-Tree、GiST、GIN、ハッシュである
- インデックスを作成しても、WHERE句などの条件でインデックスの作成されているカラムが使用されていない場合、インデックスは使用されない

# 様々なインデックス
- PostgreSQLでは、B-tree、R-tree、Hash、GiSTといった複数の種類のインデックスを使用することができる。
- 扱うデータによって使い分ける。
- 一般的に、**PostgreSQLではデフォルトのB-tree**が使用される。


# インデックスの作成
-  **デフォルトで、B-treeインデックスを作成する。**
-  インデックスの作成方法は以下の3通り
-  書式：
    - ①`CREATE INDEX インデックス名 ON テーブル名(カラム名);`
    - ②`CREATE TABLE テーブル名(カラム名 型,カラム名 型, ... INDEX(カラム名);`
    - ③`ALTER TABLE テーブル名 ADD INDEX インデックス名(カラム名);`


## ①インデックスを作成
書式：`CREATE INDEX インデックス名 ON テーブル名(カラム名);`
```:tbl_Addressテーブルのzipカラムにidx_zipインデックスを作成
postgres=# CREATE INDEX idx_zip ON tbl_Address(zip); 
```

## ②テーブル作成と同時にインデックスも作成
書式：`CREATE TABLE テーブル名(カラム名 型,カラム名 型, ... INDEX(カラム名);`
```:tbl_Addressテーブルのzipカラムにidx_zipインデックスを作成
postgres=# CREATE TABLE tbl_Address(
postgres-# UserID INT NOT NULL PRIMARY KEY,
postgres-# Zip CHAR(8) DEFAULT NULL,
postgres-# Ken CHAR(5) DEFAULT NULL,
postgres-# Addr VARCHAR(200) DEFAULT NULL,
postgres-# INDEX idx_zip(zip)
postgres-# );
```

## ③後からテーブルにインデックスを追加
書式：`ALTER TABLE テーブル名 ADD INDEX インデックス名(カラム名);`

```:tbl_Addressテーブルのzipカラムにidx_zipインデックスを作成
postgres=# ALTER TABLE tbl_Address ADD INDEX idx_zip(zIP);
```

# インデックスの削除
書式：`DROP INDEX インデックス名;`
```
postgres=# CREATE INDEX idx_zip; 
```

# インデックスの変更
## インデックスの名前を変更
書式：`ALTER INDEX インデックス名 RENAME TO 新たなインデックス名;`

```
postgres=# ALTER INDEX idx_zip RENAME TO new_idx_zip; 
```

# インデックスの確認
- テーブルのカラムの情報を取得した時（/d）に、どのカラムに対してインデックスが作成されているのかの情報も表示される。
- インデックス名 インデックスの種類(対象のカラム)
    - 例）`"idx_zip" btree (zip) `
```
postgres=# \d tbl_Address
```

# インデックスの一覧を確認
- テーブルに限らず、存在しているインデックスの一覧を確認する。
```
postgres=# \di
```
formタグ

```html
<form action="" method="get" class="form-example">
  <div class="form-example">
    <label for="name">Enter your name: </label>
    <input type="text" name="name" id="name" required>
  </div>
  <div class="form-example">
    <label for="email">Enter your email: </label>
    <input type="email" name="email" id="email" required>
  </div>
  <div class="form-example">
    <input type="submit" value="Subscribe!">
  </div>
</form>
```
出典
https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form


# ```<form>```要素
入力・送信フォームを作成する際に使用する要素です。

## ```<form>```要素の属性
### action 
実行（サブミット）された時の動作を指定します。HTML4.01では必須属性です。
#### 属性の値	
URI
##### URIとは？
* URLとURNの総称
出典 https://wa3.i-3-i.info/word1815.html

* 情報やデータといったリソースを識別するための記述方法
出典 https://www.sbcr.jp/product/4797388817/

###### URNとは？
* インターネット上に存在する情報などの資源（リソース）を一意に識別するための識別名の表記法の一つ。対象の所在を一意に表記するURL（Uniform Resource Locator）と共に、URI（Uniform Resource Identifier）の一部として定義されている。
出典 https://e-words.jp/w/URN.html
* URIのうち場所は問わずにリソースの名前を示すもの。
   刊行された書籍を一意に特定し識別するためのISBNコードなどを使ってURNを記述する
    出典 https://www.sbcr.jp/product/4797388817/dd
### method
サーバーにデータを送る形式（HTTPメソッド）を GET または POST で指定します。
#### 属性の値	
get、post

### class
これはわからなかった。
classを一応合わせるだけなのかな。

# 出典
https://html-coding.co.jp/annex/dictionary/html/form/
就活か転職ためのLeetCodeみたいなコーディング面接/テストサイトまとめ

## まずは結論

シーン別おすすめ（個人的な見解）：
- 人気、安心なサイトで練習したい：**LeetCode**
- 実際面接の環境を試したい：**Codility** **Hackerrank**
- 転職、就活サービス使いたい：**Paiza**  **AtCoder**



## LeetCode

[公式サイト](https://leetcode.com/problemset/all/)

王道のコーディング面接の対策サイト、英語



## Paiza

[公式サイト](https://paiza.jp/)

日本のコーディング転職、就活サービス  
いきなり難しい問題からスタートではなく、Dランクはとても簡単でコーディングテストの入門から言うと最適かもしれない


## Codewars

[公式サイト](https://www.codewars.com/dashboard)

実際業務と似ている問題が多いイメージ、一部問題の背景も面白い、英語



## Hackerrank

[公式サイト](https://www.hackerrank.com/dashboard)

受験URLでオンラインコーディングテストが実施できる、**LeetCode**よりやや難しい、英語



## Codility

[公式サイト](https://app.codility.com/programmers/)

受験URLでオンラインコーディングテストが実施できる、日本国内で導入企業はあり、英語



## Project Euler

[公式サイト](https://projecteuler.net/)

数学関連の問題が多いイメージ、英語



## LintCode

[公式サイト](https://www.lintcode.com/)

中国版のLeetCode、英語と中国語



## BEF

[公式サイト](https://bigfrontend.dev/)

Webフロント特化したコーディングテストサイト、英語  
`CSS`、`React.js`の問題もあり（現時点`Vue.js`の問題はありません）  



## AtCoder

[公式サイト](https://atcoder.jp/?lang=ja)

日本の競技プログラミングサイト、AtCoderJobsという転職、就活サービスあり

## AOJ

[公式サイト](https://judge.u-aizu.ac.jp/onlinejudge/)

競技プログラミングサイト、英語



## Timus Online Judge（ACM）

[公式サイト](https://acm.timus.ru/)

ACM国際大学対抗プログラミングコンテストの練習用サイト、英語
ログインフローを作成しよう～ユーザログイン回数を集計するフロー

Salesforceでログインフローがあります

今回は
・特定のプロファイルのユーザがログインしたらそのログイン回数を集計する

というフローを作成します

・事前準備
ユーザオブジェクトに数値項目を作成します
（今回はＡＰＩ名　test004__c　項目作成）


作成のフローは以下となります


![フロー０１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/9af4623b-584b-e3f6-7f1b-b1934b97a5fd.png)


![フロー０２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/509a1d60-a895-c601-72fa-3321b951989a.png)

![フロー03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/ba16acdf-8c84-b6fa-8bf2-5051fd6dea8f.png)


そのあとログインフローを作成すれば対応可能です
![ログインフロー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/4efa0b05-a9a2-ff90-c818-ecfc88db4610.png)
getServerSideProps で複数のurlを取得する方法

getServerSideProps で複数のurlを取得する方法です。
こんな感じにプログラム書きます。


    //SSR用
    export async function getServerSideProps(ctx) {
    	//contextが、サーバ側に表示されます。
    	console.log(ctx);
    
    	const profileDataReq = axios({
    		method: 'GET',
    		url: 'https://xxx.jp/api/tdnet1/',
    	});
    	const bookmarksReq = axios({
    		method: 'GET',
    		url: 'https://xxx.jp/api/tdnet2/',
    	});
    	const [profile, bookmarks] = await Promise.all([
    		profileDataReq,
    		bookmarksReq
    	]);
    	return {
    		props: { 
    			profile: profile.data,
    			bookmarks: bookmarks.data
    		}
    	};
    };
    
    
    //本体
    export default function Index(props) {
    	console.log(props);
    	return (
    <div className="container pt-5 my-5 "></div>
    	)
    }

とまぁ、こんな風にプログラムを書くと、Next.jsでSSRで運用が可能になります。
SSL証明書

# SSL証明書とは

## SSLとは
- Secure Sockets Layerの略。
- 通信プロトコルのひとつ。
- Webサイトとそのサイトを閲覧しているユーザとの通信を暗号化するための仕組み。
- Webサイトがによって保護されているかは、ブラウウザのアドレスバーに鍵マークがあるかどうかで判別できる。
- 公開鍵暗号方式で共通鍵の受け渡しを行い、共通鍵暗号方式（秘密鍵暗号方式）でやり取りをする。

> ※SSLとは古い規格の名称であり、2014年に脆弱性が発見されたため翌年には使用が禁止されている。現在では、より安全なTLS（Transport Layer Security）という暗号化通信の規格が使われている。しかしSSLという名称が一般名称として定着しているため今でもそう呼ばれているそう。

## SSL証明書とは
- 認証局が、SSL通信の公開鍵が正しいものであるという認証を行なった証
- サーバの身元を保証するもの
- 自己署名証明書の場合はブラウザのアドレスバーに「セキュリティ保護なし」が表示される


# SSL証明書の導入方法

- 証明書を作成したいサーバー
    - 公開鍵・秘密鍵を作成する
    - CSR（Certificate Signing Request）を作成する
    - 秘密鍵・CSRを認証局に送る
- 認証局
    - CSR・認証局の秘密鍵でサーバー証明書を作成する
    - サーバー証明書を送り返す
Cybersecurity Mesh – How does it impact your business?

As digital transformation is rapidly accelerating, more businesses are adapting to this current trend. Now the hybrid work environment is also catching up, organizations are faced with new challenges as we are steering away from the traditional network infrastructure. While the hybrid work model comes with its own set of comfort, flexibility, and productivity it also brings in certain risks and complexity. A majority of the staff is working remotely, and control over data and its security has become less rigid leaving the vulnerabilities exposed. Now how to keep the security intact and not let the vulnerabilities prone to hackers? Cybersecurity Mesh, which acts as a cyber-defense strategy with a more holistic approach. While regular security practices use a single perimeter to secure an entire IT environment, Cybersecurity Mesh on the other hand secures each device with its perimeter independently. 

![Blog_Cyber-Security-Mesh.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277629/0c8de29e-fea1-638d-1ed0-a2ba5ed846c9.jpeg)

The traditional network perimeter has now become a diverse network that manages infrastructure, remote machines, and their uses, cloud technologies along with IoT devices. Organizations that are adapting to this approach with their remote work model gain access to data and more control over policies implementing new technologies. Industries such as banking, manufacturing, or government are still very much following the traditional practice. Businesses of larger sizes have complex IT architecture hence they need a more distributed model. To run the business smoothly in today’s competitive market organizations are inching more towards a data processing edge and relying on multiple cloud implementations.

For more details visit>> https://www.esds.co.in/blog/cybersecurity-mesh-how-does-it-impact-your-business/
JPAでの楽観ロック

JPA(Java Persistence API)を利用した楽観ロックを実装します。

## ■検証環境
・openjdk version "11.0.7" 2020-04-14 LTS
・Spring Boot 2.7.3
・Spring Data Jpa 2.7.0
・lombok 1.18.24
・mysql-connector-java 8.0.30
・MySQL 8.0.30

## ■MySQLのテーブルデータ
PRODUCT_TBL
|ID|Product|Price|
|:--:|:--:|:--:|
|001|Orenge|200|
|002|Apple|150|
|0033|Pineappl|200|

## １．テーブルにVesionカラムを追加
    mysql> ALTER TABLE PRODUCT_TBL ADD Version long;
    mysql> select * from PRODUCT_TBL;
    +--------+----------------+---------+---------+
    | ID     | Product        | Price   | version |
    +--------+----------------+---------+---------+
    | 001    | Orenge         |     200 |       0 |
    | 002    | Apple          |     150 |       0 |
    | 003    | Pineappl       |     200 |       0 |
    +--------+----------------+---------+---------+

## ２．エンティティクラスを作成
バージョンを管理するカラムに@Versionアノテーションを付与する。
```ProductEntity.java
@Entity
@Table(name="PRODUCT_TBL")
@Getter
@AllArgsConstructor
@NoArgsConstructor
public class Product {
    @Id
    private String id;
    private String product;
    private int price;
    @Version
    private long version;
}
```

## ３．リポジトリインターフェースを作成
```ProductRepository.java
@Repository
public interface ProductRepository extends JpaRepository<Product, String> {
}
```

## ５．検証
###### ５．１．コントローラークラスを用意し更新処理を行う。
テーブルのバージョンカラムが更新する毎にカウントアップされる事を確認。
注意事項として項目に変更がない場合、カウントアップはされない。
    
###### ５．２．楽観ロックに失敗した場合、次の例外が発生する。
    exception is org.springframework.orm.ObjectOptimisticLockingFailureException
Cakephp4でfetchAll(PDO::FETCH_ASSOC)を使いたい

## 何故必要か
ORMや、デフォルトでのConnectionManagerではfetchAll('assoc')やnumなど簡単なものしか使えず、取得した結果を更にHash()やforeachなどで整形しなければならないため。

## やりたいこと
普通にassocで取ると
```
[0] => [
    ['id'] => 5,
    ['name'] => 'hoge',
],
[1] => [
    ['id'] => 14,
    ['name'] => 'fuga',
],
```
のように取れてしまうので、0、1・・・連番は必要ない。

fetchAll(PDO::FETCH_UNIQUE|PDO::FETCH_ASSOC)

```
[5] => [
    ['name'] => 'hoge'
],
[14] => [
    ['name'] => 'fuga',
],
```

## どうやるか
```
use PDO;
use Cake\Datasource\ConnectionManager;
...

$connection = ConnectionManager::get('default');
$sql = "SELECT * FROM Hoge WHERE id <> ?";
$other_member = $connection->execute($sql, [$auth['id']])->fetchAll(PDO::FETCH_UNIQUE|PDO::FETCH_ASSOC);
pr($other_member);
```

PDOを使うのに、特にyumやcomposerなどでインストールは必要ない認識ですが環境によっては必要になるのかも知れません。
【Jetpack Compose】LazyVerticalGridを扱う

`LazyVerticalGrid`を使う際に以下の動画のようなレイアウトを実装するときに苦戦し、注意点がいくつかあったので書いておきます。
- 検索バーは1列で表示
- 画像は３列で表示
- 下にスクロールすると検索バーもスクロールされる

![Videotogif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484337/ae507fb8-58ea-933e-e161-54a4be8a10c3.gif)

### LazyVerticalGridとは
[LazyVerticalGrid](https://developer.android.com/jetpack/compose/lists?hl=ja#lazy-grids)を使うことでアイテムをグリッド表示することができます。

`GridCells`にグリッド表示したい列数を渡すことでレイアウトを制御することができます

```kotlin
LazyVerticalGrid(cells = GridCells.Fixed(3)) {
```

`LazyVerticalGrid`のスコープ内でコンポーザブルを使用する場合は`item`もしくは`items`を使用して配置していきます

```kotlin
LazyVerticalGrid(cells = GridCells.Fixed(3)) {
    item {
        Text()
    }
}
```

### 特定のアイテムのみ1行にする実装
最初に紹介した動画では検索バーもスクロールに含まれるため、LazyVerticalGridのスコープ内に入れる必要がありました。列数を固定しないときは、そのアイテムに`GridItemSpan(maxCurrentLineSpan)`を設定することで実装できました。

```kotlin
LazyVerticalGrid(cells = GridCells.Fixed(3)) {
        item(span = { GridItemSpan(maxCurrentLineSpan) }) {
            SearchBar(query = "")
        }
        itemsIndexed(items = (1..50).map { ImageData(index = it) }) { index, item ->
            Image(painter = painterResource(id = item.image), contentDescription = null)
        }
    }
```

### 1つのアイテムに複数の要素を入れない
以下のコードのように、1つの`item`の中に`Column`で複数のコンポーザブルを配置するのは個別にコンポーズすることができなくなり、パフォーマンス的に良くないそうです。また`scrollToItem()`と `animateScrollToItem()`にも影響が及ぶみたいです。[（ドキュメント）](https://developer.android.com/jetpack/compose/lists?hl=ja#multiple-elements-one-item)

```kotlin
LazyVerticalGrid(cells = GridCells.Fixed(3)) {
        item(span = { GridItemSpan(maxCurrentLineSpan) }) {
           Column {
                SearchBar(query = "")
                TrendKeyword()
            }
        }
        itemsIndexed(items = (1..50).map { ImageData(index = it) }) { index, item ->
            Image(painter = painterResource(id = item.image), contentDescription = null)
        }
    }
```
Google Apps Scriptでもテストを書きたい

Gmailのコンテンツを元にちょっとした自動化が出来ると助かりシーンは多いかと思います
私がGoogle Apps Scriptでコードを書く場合は、ローカルでコードを書いて、claspでuploadしています
ローカルではGmailやSpreadSheetといったGoogle関係のLibraryが使えず、upload先のGoogleの環境では
nodo_modulesをパッケージに含めないといけません
何でしょう、このやるせなさ...

何はともあれ自動テストぐらい書きたいと思い、assertがあれば何とかなるのでシンプルにassert関数を書きました

```testUtil.ts
export function assert(actual: any, expected: any, label?: string) {
    if (actual === expected) {
        Logger.log("pass");
    } else {
        if (label) {
            Logger.log(label);
        }
        throw new Error(`Actual: ${actual}, Expected: ${expected}`);
    }
}
```

テストはこんな感じになります
```testXXX.ts
import { Sheet } from "./sheet";
import { assert } from "./testUtil";
const sheet = new Sheet();

export function testGetData() {
    const data = sheet.getData();
    assert(data.length, 10);
    assert(data[0].isValid("Test is Available"), true);
}
```

個々のテストファイルを呼び出す親ファイルも作って、テストの実施はこのファイルから行なっています
```testMain.ts
import { testGetData } from "./testXXX";

export function testMain(){
    testGetData();
}
```

同じ悩みを持った何方かのお役に立てれば嬉しく思います
【Android】プログラム上でadb shellコマンドを実行する方法

# プログラム上でadb shellコマンドを実行する方法

## パッケージ名を指定して、別プロセスのアプリを終了させる場合

:::note info
exec()の引数を変更することで様々なコマンドを実行できます
:::

:::note warn
「adb」は省略してexec()に渡します
:::

```main.kt
class AdbService() {

    fun killProcess(packageName: String) {

        //adbから実行する場合は、「adb shell am force-stop com.google.android.apps.maps」となる
        val process = Runtime.getRuntime().exec("am force-stop $packageName")
        process.waitFor()

    }

    init {

        //GoogleMapを終了させる場合
        val googleMapPackageName = "com.google.android.apps.maps"
        killProcess(googleMapPackageName)

    }

}
```
ドメインの管理

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめA～M](https://qiita.com/Keiji_otsubo/items/f3ddedee6793bf1576f8)

# 私のドメインの追加方法が変わったようです。

* [Build Your Personal Portfolio on Salesforce | Unable to add the Domain name](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000HEP2U)

:::note
The ability to set a seperate force.com name has been removed with Enhanced Domains which is enabled by default in New Playgrounds going forward.

This step is therefore not required and I've just alerted the Trailhead Help team this content needs to be updated.
:::



[ドメインの管理](https://help.salesforce.com/s/articleView?id=sf.domain_mgmt_overview.htm&type=5)

ドメインおよびサイトの関連付けを設定し、組織固有のニーズを満たすことができます。たとえば、Experience Cloud、Lightning プラットフォーム、および Site.com サイトをホストする単一のドメインを設定できます。複数のドメインに単一のサイトを設定することもあります。

サイトとドメインは、多対多リレーションを持つことができます。各ドメインには最大で 200 個のサイトを設定でき、各サイトは最大で 500 個のドメインと関連付けられます。各 Experience Cloud サイトには 2 つのサイトがあります。Experience Cloud、Lightning プラットフォーム、Site.com の各サイトを 1 つのドメインでホストすると、ドメイン要件を簡略化できます。Site.com サイトの場合、Visualforce ページにアクセスでき、Apex コードへのアクセスも簡単なことから、Salesforce サイトと同じドメインでホストすることを検討してください。

また、1 つのサイトを複数のドメインに置く必要がある場合も考えられます。たとえば、2 つの異なるブランドを持つ親会社があるとします。各ブランドには、専用の登録ドメインがありますが、両方から親会社の Web サイトにリンクさせる必要があります。複数のドメインに 1 つのサイトを存在させることができるため、両方のブランドドメインを単一の親会社の Web サイトにリンクさせることができます。

ドメインに 1 つ以上のサイトをホストするには、それぞれのサイトにカスタム URL を設定する必要があります。カスタム URL では、そのドメイン内のサイトが一意に区別されます。たとえば、www.ourdomain.com というドメインがあり、siteone と sitetwo という 2 つのサイトをホストするとします。その場合、カスタムパスを使用して、各サイトに ourdomain.com を関連付けることによって、カスタム URL を作成する必要があります。その結果、http://www.ourdomain.com/siteone と http://www.ourdomain.com/sitetwo という 2 つのカスタム URL が作成されることになります。Web ユーザが URL のいずれかを使用してこのドメインにアクセスしたとき、ドメイン内のどのサイトが表示されるかはカスタムパスにより決定されます。

# 独自の Web サイトの構築

[Site.com でのドメインの管理](https://help.salesforce.com/s/articleView?id=sf.siteforce_domains_map.htm&type=5)

Site.com サイトと Salesforce サイトは、Salesforce を使用してサイトを作成するための従来のシステムです。
Experience Cloud を使用すれば、Salesforce の最新の Web 技術を利用して拡張可能なサイトを作成できます。

[HTTPS 証明書を使用して、Salesforce のサーバーで HTTPS 経由でカスタム ドメインを提供する](https://help.salesforce.com/s/articleView?id=sf.build_your_site.htm&type=5)
拡張ドメインは、Experience Cloud サイトを提供するために使用されるカスタム ドメインのこと。
ive.siteforce.com CNAME には影響しません。

[**Site.com**](https://help.salesforce.com/s/articleView?id=sf.siteforce_overview.htm&type=5)
Site.com は Web コンテンツ管理システム (CMS) です。この製品では、データ主導の動的な Web ページを迅速に構築し、実行時にコンテンツを編集したり、Web サイトを管理したりできるようになります。

[**Salesforceサイト**](https://help.salesforce.com/s/articleView?id=sf.sites_overview.htm&type=5)
Salesforce サイトでは、公開 Web サイトとアプリケーションを作成できます。それらは Salesforce 組織と直接統合されるため、ユーザがログインする場合にユーザ名やパスワードは必要ありません。選択したブランド URL を使用して組織に保存された情報を公開することができます。また、サイトのページが、会社のブランドの外観と一致するようにできます