OmniAICreator/Qiita-1.07M huggingface dataset:
githubへのリポジトリ作成をコマンドでやって、いい感じに管理したい

本記事は [ディップ with 全部俺 Advent Calendar 2022](https://qiita.com/advent-calendar/2022/dip-with-all-me) 2日目の記事になります。

昨日に引き続きまたzshrc系の記事になります。

## 何をしたいか
検証などで新しいgitリポジトリを作りつつgithubにもあげてーというのが面倒だったので一回でリポジトリ作成と管理まで出来るコマンドを作ってみたというものです。

私は基本的にローカルのソース管理？をghqに任せてしまっているので、git リポジトリの作成などもこれに習った感じにしたい。
だけどいちいちghqの管理用のディレクトリでmkdirしたりしてというは面倒。
どこでコマンドを打ってもちゃんと管理された状態になって欲しい。
という気持ちで作成しました。

## 前提条件
- gitコマンドがインストールされている
- ghqコマンドがインストールされている
- hubコマンドがインストールされている

　
## ソースコード

``` sh
npj() {
  local help_msg=$(cat <<-EOL
NAME:
  npj - Create Git repository and Manage remote repository with ghq

USAGE:
  npj RepositoryName [options]

RepositoryName:
  Specify the repository name to be created.
  This args is required.

OPTIONS:
  -u    Change the owner of the repository to be created. (default: git global user name )
EOL
)

  local -A opthash
  local user=`git config --global --get user.name`
  zparseopts -D -A opthash -- -help -h u:


  if [[ -n "${opthash[(i)--help]}" ]]; then
    # --helpが指定された場合
    echo $help_msg
    return
  fi

  if [[ -n "${opthash[(i)-h]}" ]]; then
    # -hが指定された場合
    echo $help_msg
    return
  fi

  if [[ -n "${opthash[(i)-u]}" ]]; then
    # -uが指定された場合
    user=${opthash[-u]}
  fi

  if [ -z "$user" ]; then
    echo "you need to set user.name or options -u."
    echo "git config --global user.name YOUR_GITHUB_USER_NAME"
    return 1
  fi

  local root=`ghq root`
  local name=$1

  if [ -z "$name" ]; then
    echo "The project name is required."
    return 1
  fi

  local user_name="$user/$name"
  local repo="$root/github.com/$user_name"
  if [ -e "$repo" ]; then
    echo "This project existed, so I moved it to a directory."
    cd $repo
    return 1
  fi

  local TMPDIR=/tmp/ghq_new
  local TMPREPODIR="$TMPDIR/$name"

  mkdir -p $TMPREPODIR
  cd $TMPREPODIR

  hub init
  hub create
  echo "# $name" >> readme.md
  git add readme.md
  git commit -m "First Commit"
  git push origin main

  local ghqrepo="git@github.com:$user_name.git"

  ghq get $ghqrepo

  cd $repo
  rm -rf $TMPREPODIR
}
```

## 何をやっているか？

`npj` という名前でzshrcに関数登録を行います。
引数としてProject Nameを取ります(これがRepository名になります)

オプションとして `-u` オプションを付けており、これはorganizationに自分のアカウント以外にRepositoryを作りたい場合（organizationなどを想定)に利用する感じにしています。

やっていることはそれほど難しくなく、`/tmp/ghq_new/[Project Name]` というディレクトリを作成し、そこで `hub init` 及び `hub create` を行いgithubにRepositoryを作成します。
次にreadmeを作成し、first commitとします。

このあと、ghq getで作成したRepositoryをghq管理のディレクトリにcloneし、そのディレクトリに移動します。
最後に初期作成したディレクトリを削除する。
という流れです。

## 最後に
どこでnpjを行ってもいい感じに管理ディレクトリにRepositoryが作られる＆すでにgithubにRepositoryがあり、git管理されている状態となるので、サクッと検証したいなぁ。。。みたいなときに重宝しています。
1分でReactアプリを世界に公開する

# 何をするか
[Vite](https://ja.vitejs.dev/)を使ったReact×TypeScript環境を[Vercel](https://vercel.com/docs)を用いて公開する方法を紹介します。Node環境があることを想定しています。

# Vite環境の用意
vite環境はワンラインで作成することができます。
```sh
npm create vite@latest
```
コマンドを入力したら、コマンドラインと会話して環境のセットアップを進めます。`project name`には適当な名前を、`Select a framework`はReactを`Select a variant`はTypeScriptを選択してください。
ここではvite-projectと名付けたとします。
```sh
cd vite-project
npm install
npm run dev
```
これらのコマンドを順番に入力して、ローカルで動くことを確認してください。これでviteを使ったReact×TypeScript環境の準備は完了です。

# GitHubにリポジトリを作る
GitHubのアカウントがあるとして話を進めます。なければ作成して下さい。
githubを開いて右上の+からNew repositoryを選択して作成します。
![スクリーンショット 2022-11-25 17.29.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591069/8663d12b-9128-a082-f78b-c01d9f8947f5.png)
リポジトリ名だけ決めてCreate repositoryします(もちろん他の項目を設定しても良いです)。
![スクリーンショット 2022-11-25 17.30.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591069/6be50901-8d3f-013c-74d0-76d06931aea4.png)
これによってリポジトリが作成されるので先ほど作成したvite-projectに戻って、下のコマンドを入力します。
```sh
git init
git add .
git commit -m "first commit"
git branch -M main
git remote add origin https://github.com/XXX/vite-project.git
git push -u origin main
```
5行目の`git remote add origin https://github.com/XXX/vite-project.git`のURL部分はリポジトリによって異なります。GitHubのリポジトリページに表示されている下の画像の部分から取得して下さい。
![スクリーンショット 2022-11-25 17.36.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591069/f2a455c9-c271-7bd4-9ecf-55fcf9cbb704.png)
githubにコードが表示されたら完了です。
![スクリーンショット 2022-11-25 17.38.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591069/5585410d-3f35-1282-82fb-614e4bd53677.png)

# Vercelでアプリを公開する
Vercelのアカウントがあるとして話を進めます。なければ作成して下さい。
Add Newをクリックして、Projectを選択します。
![スクリーンショット 2022-11-25 17.39.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591069/90fafc5b-47b3-3921-543c-dabd0f821ded.png)
選択後以下の画面になるので、Continue With Githubを選択します。
![スクリーンショット 2022-11-25 17.40.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591069/d795152e-0ce5-c3f7-4848-e7869cdf1268.png)
初めての場合はGithubの認証などが間に挟まりますが、連携が完了している場合はGitHubの設定にあるIntegrationsのApplicationsにVercelがあるはずです。そこで、Repository accessでOnly select Repositoriesを選択して先ほど作成したリポジトリを選択します(多分all Repositoriesでも問題ないです)。選択したらSaveを押してVercelに戻ります。
![スクリーンショット 2022-11-25 17.54.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591069/b185e8e8-036a-6e25-106c-798d873705c9.png)

戻るとImportを押せるようになっているはずなので押します。
![スクリーンショット 2022-11-25 17.45.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591069/26b80eaa-075e-a721-dcc9-1140e64b426e.png)
次の画面でProjetの設定をします。Deployを押すとVercelで先ほどのアプリケーションが世界に公開されます。
![スクリーンショット 2022-11-25 17.46.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591069/16e2a860-eb27-1d15-1825-9461d152a9df.png)

今後先ほど作成したリポジトリに変化があると自動的にデプロイしてくれます。
M5Stack Core2: getLocalTime の使い方

NTP サーバーから時刻を取得する getLocalTime の使い方です。

## プログラム

```text:localtime.ino
// ---------------------------------------------------------------
/*
	localtime.ino

					Nov/25/2022

*/
// ---------------------------------------------------------------
#include <M5Core2.h>
#include <WiFi.h>

const char* SSID = "*****";
const char* PASSWORD = "*****";

// ---------------------------------------------------------------
void printLocalTime()
{
	struct tm timeinfo;

	const char* ntpServer = "ntp.jst.mfeed.ad.jp";
	const long gmtOffset_sec = 9 * 3600;
	const int daylightOffset_sec = 0;

	configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);

	if(getLocalTime(&timeinfo))
		{
		Serial.println("*** success ***");
		Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");
		}
	else
		{
		Serial.println("No time available (yet)");
		}
}
 
// ---------------------------------------------------------------
void setup()
{
	M5.begin();
	Serial.println("*** setup start ***");

	delay(1000);

	connectWiFi(SSID, PASSWORD);

	delay(1000);

	Serial.println("*** setup end ***");
}

// ---------------------------------------------------------------
void loop()
{
	printLocalTime();
	delay(1000);
}

// ---------------------------------------------------------------
void connectWiFi(const char* ssid, const char* password)
{
	Serial.printf("Connecting to %s ", ssid);
	WiFi.begin(ssid, password);
	while (WiFi.status() != WL_CONNECTED)
		{
		delay(500);
		Serial.print(".");
		}

	Serial.println(" CONNECTED");
}

// ---------------------------------------------------------------
void disconnectWiFi(void)
{
	WiFi.disconnect(true);
	WiFi.mode(WIFI_OFF);
}

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

## 実行結果

```text
$ cu -l /dev/ttyUSB0 -s 115200

（省略）

*** success ***
Friday, November 25 2022 17:44:42
*** success ***
Friday, November 25 2022 17:44:43
*** success ***
Friday, November 25 2022 17:44:44
```
GithubActionsでterratestを実行すると「invalid character 'c' looking for beginning of value」とテスト失敗する


## 状況
ローカル実行するとうまくいく。
githubactionsでも、同様にgo testで実行している

```
go test -v -timeout 30m
```

## メッセージ

```
| TestTerraformAwsCloudFrontCustomDomain 2022-11-25T08:12:43Z logger.go:66: ::set-output name=exitcode::0
|     output.go:19:
|               Error Trace:    /home/yuta/terraform/aws/infra/test/output.go:19
|                                                       /home/yuta/terraform/aws/infra/test/custom_header_test.go:49
|                                                       /home/yuta/terraform/aws/infra/test/custom_header_test.go:38
|               Error:          Received unexpected error:
|                               invalid character 'c' looking for beginning of value
|               Test:           TestTerraformAwsCloudFrontCustomDomain
| --- FAIL: TestTerraformAwsCloudFrontCustomDomain (499.91s)
| FAIL
| exit status 1
| FAIL  test    499.914s
```

## 対処方法

`terraform_wrapper: false`をつける

```
steps:
- uses: hashicorp/setup-terraform@v2
  with:
    terraform_wrapper: false
```

## 参考
https://github.com/gruntwork-io/terratest/issues/706
https://github.com/gruntwork-io/terratest/issues/779
Pythonあまり使っていない人がDjangoの動作環境を調べてみた話


この記事は ハンズラボ AdventCalendar2022 2日目の記事です。
業務中に気になったDjangoの動作環境について書いてみました。

# 背景

先日、社内のシステム(Nginx+Django環境)への問い合わせがありシステムのエラーログに以下のものがでていました。

```
upstream timed out (110: Connection timed out) while reading response header from upstream, 
```

このエラーでインターネット検索をしてみると `fastcgi_read_timeout` であったり、`proxy_read_timeout`を設定したほうが良いという Q&A が多く出てきました。

ハンズラボに入社するまで Python に触っていない私からすると、fastcgi? え？ nginx じゃないの？ そういえば WSGI というキーワードも見たけど、これらの関係が何がなんだかわかってないな。。ということで、関係性を調べてみました。

# 要約(調査経緯は知りたくない人向け）

Djangoアプリケーションは、以下のように動作している。(今回のシステム構成の場合）
したがって、今回の場合は、`uwsgi_read_timeout`, `uwsgi_send_timeout`を設定すれば良い。

```
ブラウザ <-- HTTP/HTTPS --> Nginx <-- socket(uwsgi protocol) --> uWSGI <----> Python(Django)
```

# Python Webアプリケーションの歴史的背景

どのようにPythonのアプリケーションをWebサーバ上で動作させるようにしたのか？という歴史的背景については
古いですが、https://docs.python.org/2/howto/webservers.html を読みました。

読んだ内容を内容をまとめると、WSGI が定義されるまでの流れが理解できました。

* Webサーバは直接Pythonプラグラムは実行できないよ
* mod_python があるけど、プログラム修正しても再起動が必要だよ
* FastCGI, SCGI がでてきたよ。インタプリタをサーバに埋め込むのではなく、バックグラウンドプロセスを作り、Pythonプログラムの実行はバックグラウンドに委ねるよ。近年（記事が書かれた頃）はFastCGIは、直接使用されることはないよ。WSGIアプリケーションのデプロイのためだけに使われるよ
* mod_wsgi がでてきたよ。ただし、Apacheでしか動かないよ。
    * mod_wsgiは、組み込みモードと、デーモンモードのいずれかで動作するよ
* WSGIは、Web Server Gateway Interfaceの略でPEP333([^1])で定義されているよ
    * WSGIサポートをしているフレームワークを選ぶことでWSGIに対応しているサーバで動作するよ
    * ミドルウェアが使えるし、作れるよ。セッション管理、通信データの圧縮ミドルウェアもあるよ

[^1]:PEP333は、WSGI v1, PEP3333がWSGI v1.0.1

# エラー対応を・・・

ある程度、背景が理解できた段階でNginxの設定ファイルをみてみると・・・

```
location /xxx {
          uwsgi_read_timeout 600;
          uwsgi_send_timeout 600;
          include uwsgi_params;
          uwsgi_pass unix:/app/mdapi.sock;
        }
```
uwsgi・・・、これまでにでてきてないキーワードがでてきました。

# uWSGIとは

uwsgiがわかっていないので、公式サイトを読みました。
https://uwsgi-docs.readthedocs.io/en/latest/index.html

uWSGIについて以下のように理解しました。

* uWSGIはアプリケーション
* uwsgiはネイティブバイナリプロトコル

uWSGIがアプリケーションとして動作している理由としては、歴史的背景から察すると、FastCGIのところで書かれていたとおりにインタプリタを埋め込まない方式が使われており、WSGIを使うことで統一的なインターフェースを提供しているということかなと考えました。

したがって以下のように動作していると理解しました。
```
ブラウザ <-- HTTP/HTTPS --> Nginx <-- socket(uwsgi protocol) --> uWSGI <----> Python(Django)
```

こうなると、uWSGIのプロセスは1つではないだろうから、プロセス数の定義とかあるのではないか？という推測ができます。
https://uwsgi-docs.readthedocs.io/en/latest/WSGIquickstart.html#deploying-django
```
[uwsgi]
socket = 127.0.0.1:3031
chdir = /home/foobar/myproject/
wsgi-file = myproject/wsgi.py
processes = 4
threads = 2
stats = 127.0.0.1:9191
```
推測したとおりに、設定ができるようです。

## 対応方法

かなり遠回りしてしまった気がしましたが、対応方法が判断できるようになったと思います。
エラーメッセージにあった(Nginxからみたときの）upstreamは、uWSGI。
今回のタイムアウトは、Nginx-uWSGI間のsocket通信間のタイムアウト。

したがって、Nginxで以下のパラメータを設定しました。


```
location /xxx {
          uwsgi_read_timeout 3600;
          uwsgi_send_timeout 3600;
          include uwsgi_params;
          uwsgi_pass unix:/app/mdapi.sock;
    
```

# 最後に

対応後は、同じ問い合わせがなくなったため、対応に問題はなかったと判断しています。
なぜそうなっているのか、どう対応すべきなのかを納得した上で対応できたので良かったと感じています。
fly.ioへのRailsアプリデプロイ備忘録

### 概要
herokuの無料版が11月28日に終了するため、
Railsアプリを**fly.io**にデプロイし直しました。
備忘録として実施手順を残します。

---
### 環境
Ruby on Rails : 6.1.7
ruby : 3.0.1
postgresql : 14.6
macOS : 13.0.1

---
### デプロイ手順
#### fly.io利用準備
インストール〜アカウント登録〜サインイン
```shell:ターミナルにて
brew install flyctl # flyctlのインストール

flyctl auth signup
# アカウント登録 
# Webサイトが開くので画面にしたがって登録
# GitHubアカウントでも登録可能

flyctl auth signin
# サインイン
# Webサイトが開くので、「Try Fly.io for free」でサインイン
```
#### デプロイ準備
必要ファイル生成〜一部ファイル修正
```shell:アプリのルートディレクトリのターミナルにて
fly launch # デプロイに必要なファイルを生成
# 初回実行時に、クレジットカードの登録が求められるので登録

# 参考：生成ファイル一覧
# .gitignore
# Dokerfile
# fly.toml
# lib/tasks/fly.rake

# 途中の質問への回答
# Choose an app name (leave blank to generate one): 自分のアプリ名
# Choose a region for deployment: Tokyo, Japan (nrt)
# Would you like to set up a Postgresql database now? Yes
# Select configuration: Development - Single node, 1x shared CPU, 256MB RAM, 1GB disk
# Would you like to set up an Upstash Redis database now? No
```
```diff_docker:Dockerfile
- ARG RUBY_VERSION=3.0.1
- ARG VARIANT=jemalloc-bullseye-slim

+ ARG RUBY_VERSION=3.0
+ ARG VARIANT=jemalloc
```
※下記ページにて利用できるバージョンを選定して修正
https://quay.io/repository/evl.ms/fullstaq-ruby?tab=tags&tag=latest
※Rubyのバージョンによっては修正不要
<br>
```diff_toml:fly.toml
[build]
  [build.args]
    BUILD_COMMAND = "bin/rails fly:build"
    SERVER_COMMAND = "bin/rails fly:server"
+   RUBY_VERSION = "3.0.1"
    # .ruby-versionファイルと同じバージョンを指定するための記載
```

#### デプロイ実行＆seedデータ投入
```shell:ターミナルにて
fly deploy # 5分ほど待ちぼうけ
fly ssh issues --agent # ssh接続
fly ssh console -C "app/bin/rails db:seed" # seedデータ投入
```

#### デプロイ確認
```shell:ターミナルにて
fly open # 無事閲覧できればOK！
```

---
### 参考にさせていただいた記事
https://qiita.com/yuuki-h/items/ec23de152368d36672ea
LeetCode 問題番号6

### Zigzag Conversion
https://leetcode.com/problems/zigzag-conversion

numRowsマイナス1ごとに下に降りていくのと上がっていくのが切り替わるはずなのにで割り算して場合分け
numRowsが1の時は入力そのままになるのでその場合わけも必要ですね
もうちょっと綺麗に解けるかなって思ったけど場合分けが爆発してしまったキレイなコード力が足りない。
```C++
class Solution
{
public:
    string convert(string s, int numRows)
    {
        if (numRows == 1)
            return s;
        vector<string> memo(numRows);
        bool matrix = false;
        string ans = "";
        for (int i = 0; i < numRows; ++i)
        {
            if (i == s.size())
            {
                break;
            }
            memo[i] += s[i];
        }
        for (int i = numRows; i < s.size(); ++i)
        {
            if (i % (numRows - 1) == 0)
            {
                if (matrix)
                {
                    memo[numRows - 1] += s[i];
                }
                else
                {
                    memo[0] += s[i];
                }
                matrix = matrix ? false : true;
            }
            else if (matrix)
            {
                memo[i % (numRows - 1)] += s[i];
            }
            else
            {
                memo[numRows - i % (numRows - 1) - 1] += s[i];
            }
        }

        for (auto i : memo)
        {
            ans += i;
        }
        return ans;
    }
};
```
初心者🔰がDeepLabCutを入れてみた。

# はじめに
「え？そこから説明いる？」と思われるほどの本気の初心者です。
MacOS 12.2.1を使ってます。


# DeepLabCutをインストール...しようと思ったら
[前回Anacondaをインストール](https://qiita.com/htkong/items/42e2e913c105b24c4612)したので、目的のDeepLabCutをインストールしてみようと、ターミナルでLet's git clone!と思ったら、エラー。

```xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun```

MacOSをアップデートすると出てくるエラーのようで、Appleの公式開発ツールxcodeが入ってないことによるもののよう。（確かに以前MacOSをアップデートした...）ということで、xcodeをインストール。

```% xcode-select --install```

数分で無事、"command line developer tools"がインストールされました。


# 気を取り直して、DeepLabCutをインストール

参考というか[本家のinstallation guide](https://github.com/DeepLabCut/DeepLabCut/blob/master/docs/installation.md)に従って、ターミナルでLet's git clone!

```% git clone https://github.com/DeepLabCut/DeepLabCut.git```

ちなみに、どこにインストールするのが正解かよく分からず、ディレクトリ指定をせずデフォルトの場所（/Users/username(個人の固有user名)/）にインストールしました。こちらも数分でインストール完了。

現在地（pwd）が/Users/username/なので、その直下にある以下のディレクトリにもぐる。
```% cd DeepLabCut/conda-environments```

```%conda activate```でAnacondaを起こしてから、
DeepLabCut用の仮想環境を構築。
```%conda env create -f DEEPLABCUT.yaml```

次回から、DeepLabCutを使いたい場合は、ターミナルで、
```% conda activate DEEPLABCUT```
蛇を眠らせたい場合には、
```% conda deactivate```
と唱えればok。


# 環境確認のためのtips

ベースの環境とこれまで作成したcondaの環境の一覧を知りたい時は、
```% conda info -e```
と入力すると、
```
# conda environments:
#
base                     /Users/username/opt/anaconda3
DEEPLABCUT            *  /Users/username/opt/anaconda3/envs/DEEPLABCUT
```
ということで、ベース環境（上側）と今回構築したDeepLabCut環境（下側）が出来ていることが確認できる。現在いる環境にはアスタリスク（*)がついている。
また、base環境にいる場合は、ターミナルの左端に（base）、DeepLabCut環境にいる場合は(DEEPLABCUT)という表記が出ています。

そんなわけで、仮想環境を使うと、yamlをシェアして同僚などと同じ環境を構築したり、いろんなversionのpythonやライブラリを入れた仮想環境を複数作って、どの環境で目的のブツが上手く動くのかを試したりできるらしい。便利。

また、pythonや各種ライブラリのversionを知りたい場合は、
pythonの場合  ```% python --version```
Anacondaの場合  ```% Anaconda --version```
DeepLabCutの場合は、謎...。などでひとまず```% pip list ```とか```% conda list```のlistの中から拾ってみる。version指定せずに、git clone!したら最新version(2.2.3)が入っていた。（そらそうか）

DeepLabCutの2.2以降は、multi-animal対応とのことだけれど、当面はsingle animalのtraceを試すつもりなので、本当はもう少し古いversionでもokではある。けれど、backwards compatibilityがある＆ほぼmonthlyのペースで改良しているらしいので、最新versionを入れてみた。

（続く）
C#.NETでWindowsのタスクスケジューラー情報を取得したい

# やり方

## プロジェクト作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/d919a0e5-5a48-2b70-aa3d-f5cb010d07df.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/3ed6181e-8947-c45b-936e-627abcdf2e56.png)

.NET Frameworkは4.8。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/4094a065-f500-0313-4f7f-7aaf3cd2a94e.png)

プロジェクト名は『TaskSchedulerExceptionCheck』にしてみた。

## 参照

```TaskScheduler 1.1 Type Library``` にチェック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/6209f52f-e6c6-fe58-44e5-1da12cd73a21.png)

## サンプルコード

```c#
using System;
using TaskScheduler;

namespace TaskSchedulerExceptionCheck
{
    internal class Program
    {

        static void Main(string[] args)
        {

            ITaskService task_service_ = null;
            ITaskFolder root_folder_ = null;
            IRegisteredTaskCollection task_collection_ = null;

            try
            {
                task_service_ = new TaskScheduler.TaskScheduler();
                task_service_.Connect();

                //タスクスケジューラーはフォルダー階層構造を持っている。
                //今回はルートフォルダーのタスク一覧を対象にする。
                root_folder_ = task_service_.GetFolder("");

                task_collection_ = root_folder_.GetTasks(0);

                foreach (IRegisteredTask task_ in task_collection_)
                {
                    try
                    {
                        //サンプルコードなのでとりあえず「こんな情報がとれるんだね。ふーん」ができればよい。
                        Console.WriteLine(task_.Name);
                        Console.WriteLine(task_.LastRunTime);
                        Console.WriteLine(task_.LastTaskResult);
                    }
                    finally
                    {
                        if (task_ != null) System.Runtime.InteropServices.Marshal.ReleaseComObject(task_);
                    }
                }

            }
            //サンプルコードなのでcatchはやらん。
            finally
            {
                if (task_service_ != null) System.Runtime.InteropServices.Marshal.ReleaseComObject(task_service_);
                if (root_folder_ != null) System.Runtime.InteropServices.Marshal.ReleaseComObject(root_folder_);
                if (task_collection_ != null) System.Runtime.InteropServices.Marshal.ReleaseComObject(task_collection_);
            }

            //結果確認用にコンソール画面閉じずに残す。
            Console.ReadLine();

        }
    }
}
```

## exe実行結果

うん。情報取れますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/da293f7e-3fef-e5ae-202e-e338958f6203.png)

# 蛇足

サンプルを発展させていけば…
『何かの例外でずーっと実行中のままになっちゃってるタスクを検知してメール通知』
とかできるかなあって思ってる。

# 参考サイトさん

https://blog.goo.ne.jp/kochilemo/e/d092ba5c31ba2656c0662c29eb55899e

http://studio-jpn.com/c-console-command-close/

# バージョン

Windows 10 Pro 21H2 OSビルド 19045.2311
Microsoft Visual Studio Community 2022 (64 ビット) - Current Version 17.3.6
Microsoft .NET Framework Version 4.8.04084
【Microsoft】Power Pagesの各ロールやアクセス権限について

PowerPagesとは、2022年10月12日にローコード・ノーコードでビジネス向けWebサイトが作成できるツールとしてMicrosoftからリリースされたアプリです。今回は、このサービスを利用する際に設定できる各ロールのアクセス権限や設定方法についてまとめました。


# ロールとは
先にロールとはなにか簡単に説明しておきます。

ロール【role】とは英語で、「役、役割、役目、役柄、任務」などの意味があり、文字通りアプリ上でのユーザーの権限や出来ることを指しています。つまり、各ユーザーに割り振られたロール（権限）によってアクセス出来るページや操作できる内容が異なるということです。

そして、PowerPagesではログイン機能を実装した場合にログインユーザーにロールを設定することができます。

参考URL:[「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word11273.html)

# PowerPagesでのロール設定で何が制限出来るのか
PowerPagesでのロールの設定で制限出来ることの一例を紹介します。

## 1.　ページごとにアクセス権限が設定出来る。
    →例えばロールが「管理者」のユーザーのみ閲覧することが出来るページなどが作れる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984251/bb4b70cb-9bf1-f445-2ef0-2d22f68d3432.png)
画面上にはサイトで使用することができる**ロール**が表示されています。
ロールの種類は大きく分けて以下の3つになります。
(画面上のC1ASPはこのテンプレートにデフォルトで存在するロールですが機能自体は認証ユーザーと同じです。)

### 認証されたユーザー
認証ユーザーロールを有効にすると、そのロールが、すべてのユーザーに対する既定の Web ロールになります。 このロールは、一般的に他のロールに関連付けられていないユーザーにあらかじめ決められたアクセスを提供するために使用します。 ユーザーは複数の Web ロールを持つことができますが、"認証されたユーザー ロール" は、認証済みのユーザー（Microsoftアカウント）に対して 1 つしか設定できません。

### 認証されていないユーザー（匿名ユーザーロール）
匿名ユーザーロールはテーブルのアクセス権限で使用することを意図しています。匿名ユーザーロールを有効にすると、そのロールが、すべてのユーザーに対する既定のロールになります。認証されていないユーザーのための匿名ユーザーロールは1つだけです。

### 管理者
文字通り、サイトの管理者を意味します。こちらも認証されたユーザーと同様に他のロールに関連付けられていないユーザーにあらかじめ決められたアクセスを提供するために使用します。

詳細はこちら
[PowerPagesのロールに関する公式ドキュメント](https://learn.microsoft.com/ja-jp/power-pages/security/create-web-roles)

## 2.　データベース編集の権限を与えることが出来る
PowerPagesでは下の画像のようにサイト内の画面にデータベース上にあるテーブルを表示させることができます。

そこで、ロールを用いた設定を行えば、ロールによって画面上からテーブルにあるデータを「閲覧のみ」、「追加」、「削除」、「編集」などを細かく設定することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984251/eba9592e-0c9d-df1c-8c41-973c6a3bd182.png)


# まとめ
今回は、PowerPagesを利用する際に設定できる各ロールのアクセス権限や設定方法についてまとめました。この記事ではアクセス権限によって制限出来る一例を紹介しましたが、工夫次第でロールを用いて様々な使い方ができるのではないでしょうか。今後もアップデートなどで出来ることは増えていくのではないでしょうか。
新人エンジニア向け：最大スレッド数を増やす努力をしよう

開発業務など何かに没頭して考える必要がある業務については集中力が非常に重要です。
集中力というのは、素晴らしい結果をもたらします。
・速度向上　→　頭の回転速度があがって結論を速く導ける
・パフォーマンス向上　→　通常では出来なかったパフォーマンスが発揮出来る
他にもあると思いますが、集中によって周りの音もかき消すことも容易にできる。

# 仕事の生産性は集中できる環境つくりから
集中力をあげれば仕事の生産性を高める事ができるのは、誰でも容易に想像できると思いますが、意外に集中できる環境配慮に関して配慮している企業は少ない。
以前CTOで入った会社では、僕が入る前から集中タイムが設定されていて、その時間帯は、話しかけるのNG。電話も出ない、とくかく自分の業務に集中せよというのがあった。確か2時間くらいだったと思うがとても効率的な時間だったと思う。あれは良い制度だったと思います。

# 集中するのにも時間がかかる
集中するまでにかかる時間は、約20分くらいらしいです。そして、集中が継続する時間も20分程度らしい。その後、少し集中が切れながらも、再度、集中タイムに入ったりして、限界は、2時間くらいらしい。こんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/a499896a-84c3-6d4c-c6eb-e344eb9645c1.png)
これは、実験で証明されていて、つまりは20分以内に割り込みが入ると全く集中して仕事ができないという事になる。15分を使って集中力を高めたものが、一本の電話や、相談等で開放されてしまい。又、次の20分を使って集中力を高めないとダメです。

# そんな理想な環境つくりは難しい 
業務中に割り込みが入ると、集中力が細切れになってしまうため割り込みが入らない形での業務調整が重要となってくる。しかし、マネージメント業務を行う立場になると、20分集中して仕事という事さえもがとても難しくなります。他部署との調整、外部の会社との調整、メンバーの業務支援・相談、etc.マネージメント業務でなくても、仕事ができる人というのは、仕事が集まってくる。そのため同じ状況になってしまう。
このギャップを埋めるためには、集中力が必要な業務については、朝や夜、土日を使って一気にやり抜くという方法もある。
但し、これだと、時間の量で調整しているだけなので、全体の作業時間が増えてしまうだけで生産性は上がってない。
このギャップを埋めるのは、集中力を上げる時間を短くするしかない。

# マルチスレッドにして最大スレッド数を増やす
マルチタスクが得意な人間になりましょう。Windowsの様に立ち上げすぎると、固まる様なOSではダメです。
これのポイントは、
１．集中までのアイドルタイムを減らす
２．集中できた時の処理能力を増やす
３．集中できた時にタスクを複数こなす
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/0b8dc770-dfcc-6016-84cd-52996fd03d8d.png)

１から順番にチャレンジしてみて欲しいです。アイドルタイムは、意外に簡単に短くする事が出来ると思います。２の処理能力は、繰り返し慣れていく事です。
最後のマルチタスクが難しい。難しいけど、なれると賢者になったかの様に色んな物事が片付いて行きます。
TVを見ながら、スマホで動画をみたりするとマルチタスクに慣れてくる。最近の若者は**ながら文化**にも慣れてるので意外マルチタスクは得意な気もする。
仕事が出来る人は、この１，２，３の能力に長けている人が多いです。
この集中力を高めるトレーニングを日頃から積む事が重要です。
DazStudioの人型モデルの服装をUnity上で操作する

# 概要
DazStudioの人型モデルGenesis8が着ている服をUnity上で操作します。

# 環境
Unity:2021.3.9
DazStudio:4.21
IDE:Rider
UniTask:2.3.3

# DazStudioでの操作-Unityにエクスポートするまで

## DazToUnityのインストール

https://www.daz3d.com/daz-to-unity-bridge
無料
要ユーザー登録

## Unityへエクスポートする
適当に服を着せたGenesis8をエクスポートします。
上部ツールバーのFile→Send To→ Daz to Unityを選択します。
ウィンドウが表示されるので、下の画像になるように設定します。
UnityAssets Folderは対応するUnityプロジェクトのパスにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/89e242b9-0dd2-5b86-e1d7-bda523d306ef.png)

AcceptButtonを押すとエクスポートが始まります。
下のGIFアニメはエクスポートが成功したときの様子です。
![DazExportSuccess.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/c97c0a60-ecb1-a8b9-cf1c-5cc1b18c3588.gif)


# Unity上での操作
## フォルダのPrefabをシーンに持っていく
エクスポート後ピンク色のオブジェクトが生成されますが、削除します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/debfe3d9-1e19-9e04-7751-a21b5a80a3fb.png)

Asset/Daz3D/ExportName/**_baseファイルをシーンに持っていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/e85c9299-56c6-4bfa-869c-5c425286b408.png)




## スクリプト作成
服の切り替えをするGUIを作成します。
Unitaskを使ってボタンの制御をします。
### コード
```OutfitChangePresenter.cs
using UnityEngine;
using UnityEngine.UI;
using System.Threading;
using Cysharp.Threading.Tasks;

public class OutfitChangePresenter : MonoBehaviour
{
    [Header("TankTops")] 
    [SerializeField] private Button _tankTopButton;
    [SerializeField] private GameObject _blackShirt;
    [SerializeField] private GameObject _blackPants;
    
    [Header("skirt and dress")]
    [SerializeField] private Button _skirtButton;
    [SerializeField] private GameObject _skirt;
    [SerializeField] private GameObject _dress;

    void Start()
    {
        var token = this.GetCancellationTokenOnDestroy();

        WaitForTankTopButton(token).Forget();
        WaitForSkirtButton(token).Forget();
    }


    private async UniTaskVoid WaitForTankTopButton(CancellationToken token)
    {
        while (true)
        {
            using var handler = _tankTopButton.onClick.GetAsyncEventHandler(CancellationToken.None);
            await _tankTopButton.OnClickAsync();
            allOff();
            _blackPants.SetActive(true);
            _blackShirt.SetActive(true);    
        }
    }

    private async UniTaskVoid WaitForSkirtButton(CancellationToken token)
    {
        while (true)
        {
            using var handler = _skirtButton.onClick.GetAsyncEventHandler(CancellationToken.None);
            await _skirtButton.OnClickAsync();
            allOff();
            _dress.SetActive(true);
            _skirt.SetActive(true);
        }
    }
    private void allOff()
    {
        _blackShirt.SetActive(false);
        _blackPants.SetActive(false);
        _dress.SetActive(false);
        _skirt.SetActive(false);
    }
}

```
### インスペクター上の変数
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/fc119f92-0dec-d2ba-36d8-8d9e595688c5.png)
# 完成
![DazUnityOutput.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/e1e08eca-ff12-4378-2fe2-031b82d6db97.gif)
MFC から SVG クラスの基本図形呼び出しコードサンプル(２/2)

## MFC(GDI+) と SvgImage の四角形出力
MFC(GDI+) の場合以下のようになります。
```cpp
	Gdiplus::RectF rect;
	rect.X = 100;
	rect.Y = 100;
	rect.Width = 200;
	rect.Height = 100;
    Gdiplus::Pen pen(Color(255, 0, 0, 0));
	pGraphics->DrawRectangle(pen, rect);
```
SvgImage に書き出すと以下のようになります。
```cpp
    pImage->AddRect(100, 100, 200, 100, 0, 0);
    pImage->AddAttrStroke(RGB(0, 0, 0), 1, PS_SOLID);
```
角は丸くする必要がないため Rx, Ry の値はいずれも "0" に設定しています。

## MFC(GDI+) と SvgImage の円、楕円出力
MFC(GDI+) の場合以下のようになります。
```cpp
	Gdiplus::RectF rect;
	rect.X = 100;
	rect.Y = 100;
	rect.Width = 200;
	rect.Height = 100;
    Gdiplus::Pen pen(Color(255, 0, 0, 0));
	pGraphics->DrawEllipse(pen, rect);
```
SvgImage に書き出すと以下のようになります。
```cpp
    pImage->AddEllipse(200, 150, 100, 50);
    pImage->AddAttrStroke(RGB(0, 0, 0), 1, PS_SOLID);
```
MFC(GDI+) に合わせて SvgImage に書き出したい場合は AddEllipse 関数をオーバーロードします。

## 円、楕円出力を MFC(GDI+) に合わせてオーバーロード
MFC(GDI+) に合わせて SvgImage に書き出すためのオーバーロード関数です。

```diff_cpp:SvgImage.h
class SvgImage
{
public:
    void AddEllipse(double dCx, double dCy, double dRx, double dRy, int nDepth = 0);
+   void AddEllipse(Gdiplus::RectF rect, int nDepth = 0);
}
```

```cpp:SvgImage.cpp
void SvgImage::AddEllipse(Gdiplus::RectF rect, int nDepth)
{
    double dRx = rect.Widht / 2;
    double dRy = rect.Height / 2;
	double dCx = rect.X + dRx;
    double dCy = rect.Y + dRy;
	
    AddEllipse(dCx, dCy, dRx, dRy);
}
```
座標変換だけを行い、基本関数を呼ぶ形です。
実際に MFC から書き出しを行うと以下のようになります。

```cpp
	Gdiplus::RectF rect;
	rect.X = 100;
	rect.Y = 100;
	rect.Width = 200;
	rect.Height = 100;
    pImage->AddEllipse(rect);
    pImage->AddAttrStroke(RGB(0, 0, 0), 1, PS_SOLID);
```
Google Cloud Visual Inspection AIを触ってみた 〜Cosmetic Inspection編〜

# Google Cloud Visual Inspection AIを触ってみた 〜Cosmetic Inspection編〜
## はじめに
こんにちは、京セラコミュニケーションシステム 森田 (@kccs_kai-morita）です。
GoogleCloudにおけるAIサービスといえばVertexAIが有名ですが、実は製造品の外観検査に特化したサービスとしてVisual Inspection AI（以下VIAIと表記）が存在します[^1]。
今回VIAIを検証する機会がありましたので、その内容について記載します。

:::note info

本記事は2022年11月ごろに作成しております。
:::

## この記事の対象者
* 製造品の外観検査を検討している方
* VertexAI AutoMLを試してみたがうまくいかず、より精度が良い外観検査ソリューションをお探しの方

## Visual Inspectionとは
VIAIは、AutoMLと同様に画像があれば内部で自動的に機械学習モデルを構築してくれるサービスです。AutoMLは汎用的にどのような種類の画像に対してもモデルを構築してくれますが細かいキズや汚れの検知は精度が悪く、その上かなり多くの画像枚数が必要であり製造業においては不良品の画像がそもそも多く排出されないため、AutoMLはほとんどのケースで使用できませんでした。対してVIAI外観検査向けの細かい不良まで検知できてなおかつ少ない枚数で高精度な機械学習モデルを構築できるという特徴があります。
VIAIにはCosmetic Inspection、Assembly Inspection、Anomaly Inspectionの３つのメニューがあります。
Cosmetic Inspectionは製品の表面上の欠陥を検出する機械学習モデルを自動で作成します。AutoMLではバウンディングボックスによる検知をする物体検出モデルまでしか生成できませんが、こちらはピクセル単位の検出を可能にするいわゆるセグメンテーションモデルとなります。そのため、従来では検出できていなかった微細な欠陥まで検出することが可能となっています。
Assembly Inspectionは基板などの組立品上で欠陥がある部品を検知するモデルを構築し、Anomaly Inspectionは画像を正常異常に分類するモデルを構築するようです。今回はCosmetic Inspectionについて検証した結果を記載しています。

![viaitype](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780555/3656c83f-0f41-e1ae-f587-7e4787fc155b.png)


## 検証に用いたデータセット
今回下図のような市販のワッシャーを用いました。画像の枚数としてはトレーニング用に欠陥品の画像のみ10枚用いています。

![dataset](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780555/b4d7ed28-01da-6844-9fa5-2accf2ac51de.png)


この図のように欠陥場所をそれぞれ印をつける作業（アノテーション）を実施し、トレーニングを開始ボタンを押します。

## 評価結果
半日ほどでトレーニングが終了し、検証結果画面は以下のとおりでした。

![training_result](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780555/d257e73b-7a3c-3ac3-c9fc-475691f77691.png)<font color="DarkGray">_評価結果_</font>

Example Imagesがテストデータを作成されたモデルで予測した結果となりますが、すべて欠陥場所が正確に検知できました！また、混同行列をみると％の数値は低くみえますが、画像内のピクセル単位の判定結果のためこのような出力結果となっております。
以上の結果により10枚ほどの少ない枚数で微細な欠陥も検知できるかなり良い機械学習モデルが作れるということがわかりました。

![recomend.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780555/915912e8-efc8-9670-f66e-2c09fd80eae1.png)<font color="DarkGray">_不良画面_</font>


さらに、データセット画面に戻るとこちらのようにまだアノテーションされていない画像に対してこの画像をアノテーションするとより良い結果になるということを推奨してくれる機能もあるようでした。

## 推論速度検証
実際にこちらのモデルをもちいて外観検査導入するという話になると、推論速度が重要になります。そこで、今回製品を撮影してからCPUおよびGPU環境上にデプロイしたモデルにて推論し、その結果を返すまでの速度を測定しました。

|          画像サイズ(pix)            |        CPU(秒)         | GPU(秒) |
  | :------------------------- | :-------------------------- | :------------------------- |
  | 2448 * 2048(オリジナル)  | 3.251 | 1.019                   |
  | 2000 * 2000(縮小)             | 1.683                  | 0.712                       |
  | 1000 * 1000(縮小) | 0.557              | 0.315                       |

CPU環境では3秒以上と製造ラインに導入するには遅い数値となりましたが、GPUを用いることにより1秒弱となりました。さらに画像を小さくするともちろん速度も早くなりましたが、その分精度も少し落ちる結果となりました。今回GPUとしてNVIDIAのGeForceRTX2080Tiを用いましたが、より高性能なものを用いることでより速度は向上すると思われます。
また同様の製品でAnomaly Inspectionのモデルで検証したところ、より速い結果となりました。また、Cosmetic Inspectionまで高精度を求めなくていいものについてはそちらを検討するといいかもしれません。

## 終わりに
なお、料金については、検索して出てくる公式ドキュメント上で「Google営業担当へお問い合わせください」となっております。今回の記事ではCosmetic Inspectionにて検証した内容について記事にしましたが、次回はAssembly Inspectionで検証した内容について書く予定です。

## 参考
[^1]: <https://cloud.google.com/solutions/visual-inspection-ai?hl=ja>
猫語翻訳コマンドを作ってみた

# はじめに
OS: Mac

みなさん、"sl"というコマンドはご存知でしょうか？ターミナル上で機関車を走らせられる素晴らしいコマンドです。気になる方は、"brew install sl"で入れられるのでぜひ。
さて、私はこの特に益のない、むしろ邪魔になるコマンドを知って1つの思いが湧き上がってきました。

__僕も自分のコマンド作ってみたい！！__

別に益のあるコマンドじゃなくていいんです。使えるコマンドなんて世の中に調べれば出てきますし。だから、作るのは自分が楽しんで作れるもの。猫にしました。

# 作りたいもの
入力テキストを猫語に翻訳する（猫の語尾にする）コマンドを作ります。要件は以下の通りです。

1. 「。」の前に「にゃ」をつける
ただし、直前が「な」か「ナ」の場合はつけない。
1. 「な」を「にゃ」に書き換える
1. 「ナ」を「ニャ」に書き換える

例はこんな感じです。
↓
例はこんにゃ感じですにゃ。

可愛い。すごく作りたくなってきました。

# コーディング
```bash:~/command/nekogo
#!/bin/sh

#パイプラインからも渡せるように
if [ -p /dev/stdin ] || [ -f /dev/stdin ]; then
    src=`cat -`
else
    src=$1
fi

src=${src// /_}
flag=true
for s in ${src}; do
    out=""
    for ((i=0; i<${#s}; i++)); do
        x=${s:$i:1}
        if [ ${x} = "_" ]; then
            out+="　"
        elif [ ${x} = "な" ]; then
            out+="にゃ"
            flag=false
        elif [ ${x} = "ナ" ]; then
            out+="ニャ"
            flag=false
        elif [ ${x} = "。" ]; then
            if "${flag}"; then
                out+="にゃ。"
            else
                out+="。"
                flag=true
            fi
        else
            out+=${x}
            flag=true
        fi
    done
    echo "${out}"
done
```

こんな感じで書けました。

ホームディレクトリにcommandというディレクトリを作ってそのなかに作成しました。
ファイル名は、作りたいコマンド名（今回は"nekogo"）で、拡張子は付けません。ただし、最初の行に`#!/bin/sh`と書く必要があります。
最初のifのところは、標準入力だけじゃなくて、パイプラインによる引き渡しとファイル入力に対応するためのものです。

あんまりShell Script書いたことないので、変なところあったら指摘お願いします。

# テスト
とりあえずちゃんと動くかテスト。この時点ではまだコマンドになっていないので、普通のbashファイルと同様に実行して試します。
```
$ bash nekogo 例はこんな感じです。
例はこんにゃ感じですにゃ。
```
ちゃんと動いてくれました。
それではこれをコマンドにしていきましょう。

# コマンド化
まず、このファイルに権限を与えます。
chmodを実行しましょう。
```
$chmod 777 nekogo
```
これで、`$nekogo 入力テキスト`で実行できるようになりました。

次に、パスを通して、どこからでも実行できるようにします。
~/.bashrcに以下を追記しましょう。
```bash:~/.bashrc
export PATH=$HOME/command:$PATH
```
これで、どこからでもこのコマンドを使えるようになりました。

# 実行
コマンドが作れたので、早速使ってみましょう。せっかくなので、ファイルを受け取って翻訳することにします。
使うファイルはこれです。「吾輩は猫である」の最初のところです。
```text:test.txt
吾輩は猫である。名前はまだない。
どこで生れたかとんと見当がつかぬ。何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。
```

実行します。
```
$nekogo < test.txt
吾輩は猫であるにゃ。名前はまだにゃいにゃ。
どこで生れたかとんと見当がつかぬにゃ。何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶しているにゃ。
```
上手くいきましたにゃ。

# nekogo < まとめ
猫語翻訳コマンドを作ってみましたにゃ。
翻訳といっても簡素にゃものですが、すごく楽しかったですにゃ。やっぱりやりたいことをやるのが一番にゃ。

# 参考文献
https://ywatanabevltmathscilogic.hatenablog.com/entry/2021/05/29/032844

https://qiita.com/mochidamochiko/items/cd4dd6ca5859328b8daa
javascriptでtableタグのtd内の数値の合計を自動で計算

javascriptを使ってtableタグ内のtdに入っている値段の合計を計算する方法。
もっと効率よく綺麗に書く方法あったら教えてくださいm(_ _)m

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165847/72a61053-297d-510b-904e-fade0341b47c.png)

```html
<html>
<script type="text/javascript">
    window.onload = function () {
        var tableElem = document.getElementById('table_01');
        var rowElems = tableElem.rows;
        var price = 0;
        for (i = 0, len = rowElems.length - 1; i < len; i++) {
            price += parseInt(rowElems[i].cells[1].innerText);
        }
        document.getElementById('goukei').innerText = price;
    }
</script>
<body>
    <TABLE id="table_01">
        <TR>
            <td>りんご</td>
            <td>300</td>
        </TR>
        <TR>
            <td>バナナ</td>
            <td>400</td>
        </TR>
        <TR>
            <td>いちご</td>
            <td>500</td>
        </TR>
        <TR>
            <td>合計</td>
            <td id="goukei"></td>
        </TR>
    </TABLE>
</body>
</html>
```
e-ビジネス

# eマーケットプレイスを説明したものはどれか？
### eマーケットプレイスとは？
```インターネット上に開設されている企業どうしの市場取引の場```のことを指す。
さまざまな業種向けのe-マーケットプレイスがインターネット上に開設されている。

* インターネットを介して売り手と買い手を結びつける取引所や市場のこと。多くはWebサイトの形で開設され、登録した売り手の販売する商品を、買い手がオンラインで発注して購入する。
#### 出典 
https://e-words.jp/w/e%E3%83%9E%E3%83%BC%E3%82%B1%E3%83%83%E3%83%88%E3%83%97%E3%83%AC%E3%82%A4%E3%82%B9.html

# クラウドファンディングを説明せよ。
### クラウドファンディングとは？
「群衆（クラウド）」と「資金調達（ファンディング）」を組み合わせた造語で、「インターネットを介して不特定多数の人々から少額ずつ資金を調達する」ことを指しています。
#### 出典
https://camp-fire.jp/academy/articles/article-1#:~:text=%E3%80%8C%E7%BE%A4%E8%A1%86%EF%BC%88%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%EF%BC%89%E3%80%8D%E3%81%A8%E3%80%8C%E8%B3%87%E9%87%91%E8%AA%BF%E9%81%94%EF%BC%88%E3%83%95%E3%82%A1%E3%83%B3%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%EF%BC%89%E3%80%8D%E3%82%92%E7%B5%84%E3%81%BF%E5%90%88%E3%82%8F%E3%81%9B%E3%81%9F%E9%80%A0%E8%AA%9E%E3%81%A7%E3%80%81%E3%80%8C%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%8D%E3%83%83%E3%83%88%E3%82%92%E4%BB%8B%E3%81%97%E3%81%A6%E4%B8%8D%E7%89%B9%E5%AE%9A%E5%A4%9A%E6%95%B0%E3%81%AE%E4%BA%BA%E3%80%85%E3%81%8B%E3%82%89%E5%B0%91%E9%A1%8D%E3%81%9A%E3%81%A4%E8%B3%87%E9%87%91%E3%82%92%E8%AA%BF%E9%81%94%E3%81%99%E3%82%8B%E3%80%8D%E3%81%93%E3%81%A8%E3%82%92%E6%8C%87%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82

# OtoOの説明
### OtoOとは？
ネット上（オンライン）での情報が実店舗（オフライン）の購買行動などに影響を及ぼすこと。また、この影響を積極的に活用した電子商取引上のマーケティング手法。O2O。
#### 出典
https://www.weblio.jp/content/O+to+O

# CGMの実例はどれか？
### CGMとは？
```Consumer Generated Media: 消費者生成メディア```の略。
商品やサービスの内容、```価格に強い影響を与える```ようになっている。

# シェアリングエコノミーの説明はどれか？
### シェアリングエコノミーとは？
ソーシャルメディアの情報交換機能や専門サービスを利用して、```個人保有の有休資産（スキルのような無形資産も含む）の貸し借り```をすること。

# 出典
https://gihyo.jp/book/2022/978-4-297-12375-8
nodeJS でURLからパラメータを渡す方法

# 環境 
```json
{
  "dependencies": {
    "ejs": "^3.1.8",
    "express": "^4.18.2",
  },
}

```

# Code

```javascript:server.js
const express = require('express');
const app = express();

app.get('/qiita', (req, res) => {
    res.send('Hola!')
})

// ここにパラメータを受けるコード

app.listen(8080, function () {
    console.log('listening on 8080')
});

```

## Path Variable（経路変数）
```javascript:server.js
app.get('/qiita/:name', (req, res) => {
    console.log(req.params.name)
    // Ari 

    res.send(`Hello! ${req.params.id}`)
})
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821152/58699924-53e7-af7a-efe0-872fc5798d3b.png)


`req.params`はオブジェクトでわたされ、`{ name: 'Ari' }`のような形を渡す
ここでは`Ari`を経路変数としたが、もし`Ari`の学生番号のような個人の番号があり、それがDBに保存されているのであれば、その番号を用いてDBから情報を読み込むことによってより多くの情報を扱うことができる。
 
## Parameter


```javascript:server.js
app.get('/qiita/:name', (req, res) => {
    console.log(req.params.name)
    // Ari
    console.log(req.query.country)
    // Japan


    if (req.query.country) {
        res.send(`Hello! ${req.params.name} from ${req.query.country}!`) 
    } else {
        res.send(`Hello! ${req.params.name}!`)
    }
})

```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821152/abb9dc10-4516-ba30-99d8-caecb0031af0.png)

名前が`Ari`であることに加えて、より付加的な情報を渡したい

変数経路が`Ari`であることに加えてその国が`Japan`であることを渡した。

## 複数のParameter

```javascript:server.js
app.get('/qiita/:name', (req, res) => {
    console.log(req.params.name)
    // Ari
    console.log(req.query)
    // { country: 'Japan', age: '25' }

    if (req.query.country && req.query.age ) {
        res.send(`Hello! ${req.params.name}(${req.query.age }) from ${req.query.country}!`)
    } else {
        res.send(`Hello! ${req.params.name}!`)
    }
})
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821152/4dc94865-02cd-d40d-2b58-4fedfbf20b37.png)

このような複数の情報を渡すことができる

## 実例 ①
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821152/59750cd9-3ce2-a3b2-605b-f01b92133270.png)

`junzai`というユーザーの`item`に`c0e625ad8b189237c0b0`という経路

`/:user_name/items/:items_id`のように設定されていることが読み取れる。

## 実例 ②
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821152/d523e9ae-6beb-3ba9-1783-0655ccc3e982.png)

パラメータが`q=こんにちくわ`であることが読み取れる

## 実例 ③ 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821152/f3e2c60d-9cf5-e256-c1e4-5a6478acf516.png)
新着順で並べ替えた結果、`q=こんにちくわ`、`sort=created`であることが読み取れた。


# まとめ
Path Variable → DBのid, ユーザー名など、ユニークな情報
Parameter → 検索内容、条件など、付加的な情報
管理者でメモ帳を開いてhostsを編集 【ターミナル】


## 概要

Windowsでhosts修正するときに管理者権限で開きたい時、結構めんどくさいです。
そこでコマンドプロンプトから一発でhostsを開いて編集するコマンドを紹介します。


## コマンド

``` bash
powershell -NoProfile -ExecutionPolicy unrestricted -Command "start notepad C:\Windows\System32\drivers\etc\hosts -verb runas"
```

上記をコマンドプロンプトから実行することでメモ帳が開かれます。
かなり便利なので使ってみてください。
PL-900 : Microsoft Power Platformとは

この投稿はMicrosoft PL-900の受験に向けた勉強資料をMS Learnページを参考にして作っています。
一発合格に向けて頑張りましょう！

[公式ページ: Microsoft Power Platform とは][MS-Learn]

[MS-Learn]: https://learn.microsoft.com/ja-jp/training/modules/introduction-power-platform/2-what-is-power-platform

# Microsoft Power Platform とは
４つの製品で構成されている
1\.  Power Apps
2\.  Power Automate
3\.  Power BI
4\.  Power Virtual Agents



## 1. Power Apps
<img width="256" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885338/d29d2af7-efd2-4638-e442-4fea57769f0c.png" />

* ビジネス ニーズに合ったカスタム アプリを構築するために、迅速なローコードの開発環境を提供するアプリケーション
* どのデバイスでも実行できるWebおよびモバイルアプリケーションを作成
* シンプルなUIで初級者はもちろん、開発者も簡単にアプリの開発可能

## 2. Power Automate
<img width="256" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885338/d6d61a15-cc62-ebeb-167a-e9183b50af89.png" />

* アプリケーションとサービス間のワークフローを作成するツール
* 繰り返しの業務プロセスを自動化できる
* シンプルなUIで初級者はもちろん、開発者も簡単にアプリの開発可能

## 3. Power BI
<img width="256" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885338/9c7795ed-e823-6316-f749-dd3d791a11ea.png" />

* ビジネスデータ分析サービスを提供するアプリケーション
* 分析したデータを視覚化し、ユーザーがわかりやすくレポートやダッシュボードの形で表示できる

## 4. Power Virtual Agents
<img width="256" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885338/5dd16efa-deba-3937-9dae-5f25db2b7a2d.png" />

* ノーコードでGUIを用いてチャットボットの開発ができるアプリケーション
* Power Automateとの連携可能　→　フローでチャットボットの作業を実行することができる
* Power Apps環境もしくはPower Virtual Agentsのノーコードキャンバスで作成されたフローを活用することができる

## 上記プログラムでフル活用できる機能
### AI Builder
* ターンキーソリューション
    * 直ちに稼働できる状態にある情報システムのことを指す
* コードを書かず、ワークフローおよびアプリにインテリジェンスを追加し、結果を予測してビジネスのパフォーマンスを向上させる役割
* Power Appsに追加可能

### Microsoft Dataverse
* データ格納および管理する機能を提供
* 一貫性を保証する共通のデータモデルを使用してビジネスアプリケーションにデータを統合できる
* Power Platformのコンポーネントと連携して機能できる
* データの統合・表示・操作するための基礎になる

### コネクタ
* アプリ、データ、デバイスに接続するための機能
* Power Platform用で600以上のコネクタが存在
    * Salesforce, Office 365, Twitter, Dropbox, Googleサービスなど
初心者のCコンパイラ作成ログ

## はじめに

初心者が[低レイヤを知りたい人のためのcコンパイラ作成入門](https://www.sigbus.info/compilerbook)をやってる途中で躓いたところの備忘録です。適宜更新します。

## 目次
- [githubにpushできない](##-githubにpushできない)

## githubにpushできない 
(2022/11/25編集)
pushコマンドを実行すると以下のエラーが出た。
```
~9cc$ git push
Please make sure you have the correct access rights and the repository exists.
```
.sshフォルダに「config」ファイルを作成し、以下をコピペする。
```
Host github
  HostName github.com
  IdentityFile ~/.ssh/id_rsa
  User git
```
これでもう一度pushコマンドを試すと、
```
$ git push -u origin main
Enter passphrase for key '/home/user/.ssh/id_rsa':
Enumerating objects: 6, done.
Counting objects: 100% (6/6), done.
Delta compression using up to 8 threads
Compressing objects: 100% (5/5), done.
Writing objects: 100% (6/6), 928 bytes | 928.00 KiB/s, done.
Total 6 (delta 0), reused 0 (delta 0), pack-reused 0
To github.com:name/9cc.git
 * [new branch]      main -> main
Branch 'main' set up to track remote branch 'main' from 'origin'.
```
無事成功した。どうやら秘密鍵を「config」ファイルに設定していないからgithubに接続できなかったよう。

参考: https://qiita.com/GakuNaitou/items/81dbbd3ea6211af71648
組織の理想：高コンテキスト組織で低コンテキストなメッセージ

# コンテキストとは
```
コンテクストあるいはコンテキストとは、文脈や背景となる分野によってさまざまな用例がある言葉であるが、一般的に文脈と訳されることが多い。
文脈により「脈絡」、「状況」、「前後関係」、「背景」などとも訳される。
from ウィキペディア
```
# 高コンテキストと低コンテキスト
コンテキストは、脈絡、状況という意味合いをあらわして、
**高コンテキスト**という言葉は、日本文化にある、「あ・うんの呼吸」等の状況から、言葉以外の意味合いを汲み取ったりする事をさします。
**低コンテキスト**という言葉は、言葉中心に情報を伝える文化の事を指します。一般的に、欧米等は、**低コンテキスト**文化が中心となってます。多分ですが、欧米等は、沢山の人種や文化が入り乱れた社会のため、言葉ではっきりと伝える必要があったのだと思います。
反面、日本の場合、島国でもある事や、鎖国等をおこなってきた国でもあり、日本固有の文化のみであったため、言葉に頼らなくても、**高コンテキスト**でコミュニケーションが成り立ってしまう文化に成って行ったのだと思います。

# 高コンテキストな組織が良い
会社においてもこのコンテキストが共有できている会社と共有できてない会社とでは、業績にも大きい影響があります。**高コンテキスト**な組織であれば、情報共有にかかるコストが少なく共有が図れます。新卒から定年まで同じ会社という終身雇用の文化により日本の会社は、**高コンテキスト**な組織が多かったと思います。
自分のキャラクターを理解した上で話しを理解してくれるので、ちょっと高圧的な言い方でも大丈夫だったり、フザけた言い方でも大丈夫だったりするし、前提情報があるので言葉足らずでもなんとかなる。
とっても便利な文化だし、スピード感もある組織です。

# そうも行かなくなってきた日本の会社
昨今のIT普及や終身雇用の崩壊により、従来型の**高コンテキスト**型の組織だけでは成り立たない時代になってきていると思います。特に最近の若者は、若い頃から、携帯電話を所有して、連絡はメールを使用し、PCを使ってSNSやメッセンジャーを利用という形で、**低コンテキスト**型コミュニケーション社会で成長してきてます。
更にリモートワークの普及でお互いの顔を見ないで会話したり、近くのデスクで働いた事がないので相手の性格等の前提情報もありません。

# 高コンテキストから低コンテキストへ
**低コンテキスト**型で生きてきた世代の人間もある程度の**低コンテキスト**型のコミュケーションへシフトしていく必要があります。リモートワークを嫌ってるオジサン達ってココを嫌ってるんですよね。
特にエンジニア系の職種は、**低コンテキスト**型のコミュニケーションに慣れている面もあるためか、僕の周りでもこの傾向を感じます。
一方で、**低コンテキスト**型の組織は理解しあえてないので脆く、速度も出ない。**高コンテキスト**型の組織は、理解し合えているので速度も早い。
マネージメントにおいてもメンバー全員とお互いの価値観や性格を共有し、｢アイ・コンタクト｣や｢あ・うんの呼吸｣で理解しあえる**高コンテキスト**型の組織を形成する事は、非常に大事な事ではあるし、あえて細かい指示や丁寧な説明、見て、読んで、直ぐに理解できる形でのメッセージ発信を行うという**低コンテキスト**型のコミュニケーションも非常に大事です。
コミュニケーションで高コンテキストなのか、低コンテキストなのかを意識してみてください。
Linux のターミナル上からコマンドで"ファイルの最後に行を挿入"

# Linux のターミナル上からコマンドで"ファイルの最後に行を挿入"する方法

## 結論

sedのaコマンドを利用して行を挿入する

```bash 
$ sed -e '$a 1行目の文字列\n2行目の文字列\n3行目の文字列' 入力ファイル
```


## 例えば

以下のfile.txtの最終行に「4.black」を入れたい場合 ↓
```bash
$ cat file.txt 

1.red
2.brue
3.pink
```

このコマンドを実行することで

```bash 
$ sed -e '$a 4.black' file.txt 
```

このように最終行に挿入が可能となる。

```bash
$ cat file.txt 

1.red
2.brue
3.pink
4.black
```

## 複数行の場合

以下のfile.txtの最終行に「4.black」の次に「5.white」を入れたい場合 ↓
```bash
$ cat file.txt 

1.red
2.brue
3.pink
```

このコマンドを実行することで

```bash 
$ sed -e '$a 4.black\n5.white' file.txt 
```

このように最終行に挿入が可能となる。

```bash
$ cat file.txt 

1.red
2.brue
3.pink
4.black
5.white
```
【CentOS7】yumのupdateでエラー



# アバン
Centos　チョット　ワカルカモしてたら詰まりました。

```
yum update
```
で、下記のエラー

```

Repository packages-microsoft-com-prod is listed more than once in the configuration
https://apt-mo.trafficmanager.net/yumr/repodata/repomd.xml: [Errno 14] HTTPS Error 404 - Not Found
他のミラーを試します。
To address this issue please refer to the below wiki article

https://wiki.centos.org/yum-errors

If above article doesn't help to resolve this issue please use https://bugs.centos.org/.



 One of the configured repositories failed (added from: https://apt-mo.trafficmanager.net/yumr),
 and yum doesn't have enough cached data to continue. At this point the only
 safe thing yum can do is fail. There are a few ways to work "fix" this:

     1. Contact the upstream for the repository and get them to fix the problem.

     2. Reconfigure the baseurl/etc. for the repository, to point to a working
        upstream. This is most often useful if you are using a newer
        distribution release than is supported by the repository (and the
        packages for the previous distribution release still work).

     3. Run the command with the repository temporarily disabled
            yum --disablerepo=apt-mo.trafficmanager.net_yumr ...

     4. Disable the repository permanently, so yum won't use it by default. Yum
        will then just ignore the repository until you permanently enable it
        again or use --enablerepo for temporary usage:

            yum-config-manager --disable apt-mo.trafficmanager.net_yumr
        or
            subscription-manager repos --disable=apt-mo.trafficmanager.net_yumr

     5. Configure the failing repository to be skipped, if it is unavailable.
        Note that yum will try to contact the repo. when it runs most commands,
        so will have to try and fail each time (and thus. yum will be be much
        slower). If it is a very temporary problem though, this is often a nice
        compromise:

            yum-config-manager --save --setopt=apt-mo.trafficmanager.net_yumr.skip_if_unavailable=true

failure: repodata/repomd.xml from apt-mo.trafficmanager.net_yumr: [Errno 256] No more mirrors to try.
https://apt-mo.trafficmanager.net/yumr/repodata/repomd.xml: [Errno 14] HTTPS Error 404 - Not Found

```

# 先に結論

ここをちゃんと読みます。

```
failure: repodata/repomd.xml from apt-mo.trafficmanager.net_yumr: [Errno 256] No more mirrors to try.
https://apt-mo.trafficmanager.net/yumr/repodata/repomd.xml: [Errno 14] HTTPS Error 404 - Not Found
```

etc/yum.repos.dの中にあるapt-mo.trafficmanager.net_yumrから試行するミラーサイトはもうないですよ～
ここのURL見たけど404ですよ～……ということらしい。
ので、etc/yum.repos.dにあるapt-mo.trafficmanager.net_yumrを削除！！！

```
rm apt-mo.trafficmanager.net_yumr
```

これで再度updateかけたら動きました。
何時間悩んでたのさ……。


# 余談
https://apt-mo.trafficmanager.net/yumr/repodata/repomd.xml 、というものを見ているらしいけどどこから参照しているのかわからない……。
（てか404だしなんだこれ）
repodata/repomd.xml ってどこのファイルのこと……？

と路頭に迷って色々試しました。
試した結果、該当のリポジトリ削除したらそのお試し部分がエラー吐いたので元に戻しました。

↓こういう、ミラーサイト見ないように設定した奴なんですけども。
https://studyinfra.net/linux/centos6-yum-error/
2024年まではcentos7は大丈夫なので、その後からが本番ですね。
げろげろげろ。

リポジトリの意味とかぜんぜんわかってないと苦労しますね。
たまにしか触らないのもあるのでしょうけど、似たような人が現れたときのために記録を残します。