OmniAICreator/Qiita-1.07M huggingface dataset:
mayaがエラー・ワーニングを吐く時の対処 1　~存在しないUVset~


mayaがwarningを吐いて鬱陶しい時

メッシュデータをimportしただけでこんなワーニングを吐く時

    Warning: The mesh object|objectShape contains invalid or unused components.  These can be cleaned up using the Mesh Cleanup dialog. #

場合にもよるけれども、指示通りにcleanup実行してもwarnigが出続ける場合がある。
そのケースの1つとして、**不正なUVsetの存在**(勝手に命名)があげられる。

**不正なUVset**とは
UVsetNameは定義されていない(None)だが、UV座標情報がアトリビュートに残ってしまっているUVset

UVsetEditorからはもちろん見えないので、確認するにはnodeEditorかスクリプトで処理する必要がある。

まずUVsetNameを確認

    import maya.cmds as cmds
    uvSet_index = cmds.getAttr(node  + ".uvSet", mi =True)

    for index in uvSet_index :
        uvSetName  = cmds.getAttr(node  + ".uvSet["+str(index)+"].uvSetName")

uvSetName　が Noneでなければ、UVsetEditorに乗るので　Noneじゃない場合はスルー

    import maya.cmds as cmds
    uvSet_index = cmds.getAttr(node  + ".uvSet", mi =True)

    for index in uv_index:
        uvSetName  = cmds.getAttr(node  + ".uvSet["+str(index)+"].uvSetName")

        if uvSetName != None:
            continue

次にUVSetPoints(UV座標情報)がNoneか否かを判別
名前があって、UVセットが空の場合はそれはそれでワーニング出るので問題。

    import maya.cmds as cmds
    uvSet_index = cmds.getAttr(node  + ".uvSet", mi =True)

    for index in uvSet_index:
        uvSetName  = cmds.getAttr(node  + ".uvSet["+str(index)+"].uvSetName")
        uvsetPoint_index = cmds.getAttr(node  + ".uvSet["+str(index)+"].uvSetPoints",mi =True)

        if uvSetName != None and uvsetPoint_index != None:
            continue

        elif uvSetName != None and uvsetPoint_index == None:
            print(node + " "  + uvSetName + " is  empty uvset")
            continue

        elif uvSetName == None and uvsetPoint_index == None:
            print(node + " has invalid uvset")
            continue

これで検知はできたとして、不正UVsetの除去方法を考える。
手っ取り早いのは、一度名前を与えて正規のUVset化した上で削除する

    import maya.cmds as cmds
    uvSet_index = cmds.getAttr(node + ".uvSet", mi =True)

    for index in uvSet_index:
        name = cmds.getAttr(node  + ".uvSet["+str(index)+"].uvSetName")
        uvsetPoint_index = cmds.getAttr(node  + ".uvSet["+str(index)+"].uvSetPoints",mi =True)

        if name == None and uvsetPoint_index != None:
            cmds.setAttr(node + ".uvSet["+str(index)+"].uvSetName", "uvSet"+str(index) + "_reborn", type = "string")
            cmds.polyUVSet(node ,uvSet = "uvSet"+str(index) +"_reborn",delete=True)
RIPとは？

# RIP(Routing Infomation Protocol)とは？
ルーティングプロトコルの一種。ルート計算が簡単で処理にかかる負荷が軽いため、主に小規模なネットワークで使われる。
ここでは、RIPの特徴、バージョンの比較、動作について記載する。

## 特徴
RIPは他のルーティングプロトコルに比べ、処理負荷が小さく、実装しやすいことが特徴。
他にもRIP単体で見た時の特徴を下記に記載する。
（○ =重要）
#####　○ 処理負荷が小さい
#####　○ ディスタンスベクタ型
#####　○ メトリック：ルータのホップ数
#####　・ IGP
　　　　AS内で動作するルーティングプロトコル
#####　・ ２つのバージョンがある
　　　『RIPv1』の欠点を改善したバージョンが『RIPv2』

####【欠点】
#####　○ 収束時間が長い
　　　 30秒ごとにルート情報を更新するため、収束までに時間がかかる。
#####　・ ルーティングループが発生しやすい
　　　 ネットワークの構成を変更した場合、すぐにルート情報が更新されないため、未更新のルータには古いルート情報が残り、ルーティングループの起因となる。


## バージョン
####RIPv1から改善された点について（= RIPv2の特徴）

#####・ ルーティングプロトコルの変更
　　クラスフルアドレッシング(v1)　→ 　クラスレスアドレッシング(v2)

#####・ ルート情報の更新方法
　　ブロードキャスト(v1)　→　マルチキャスト(v2)

#####・ 認証機能
　　なし(v1)　→　あり(v2)
 

## 動作
Db2 on Cloud: Web管理コンソールの表示

`「Db2 on Cloudを使ってみる」シリーズ`

Db2 on Cloud, Web管理コンソールの表示方法を説明します。

# 前提
Db2 on Cloudのサービスは作成済みであることを前提としています。
Db2 on CloudはLiteプランで無料で使えますので、お試しになりたい方は以下の記事を参考に作成してみてください。

- [Db2 on CloudをLiteプラン(無料)で作成](https://qiita.com/nishikyon/items/0219a81673f0b84980da)

#1. IBM Cloudにログイン
https://cloud.ibm.com/　 からIBM Cloudにログインします。

#2. リソースリストの表示
左上の三本線、「ナビゲーション・メニュー」をクリックし、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/9832422f-7f72-1f4f-30e7-ddcd176c27af.png)

「リソースリスト」をクリックし表示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/f3018216-2e26-299c-d2d1-22117609f3c2.png)

# 3. サービスの詳細の表示し、Web管理コンソールを表示する
「データベース」の下にDb2のサービス名が表示されていますので、そのサービス名をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/4c8144ee-d044-f2ce-769e-3a7346a35afe.png)


「Go to UI」 または　「Open Console」のボタンをクリックするとWeb管理コンソールが表示できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/894231f9-2028-1595-69a2-b3ed93826bb8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/f543b234-68c7-a4c1-d81c-cf2a3dd8ce2d.png)

LiteプランのWebコンソール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/9330610d-9f0b-ee62-ec99-07757e8dd781.png)


StandardプランのWebコンソール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/f52e03e1-1b04-05a1-19f0-75c94cbabc98.png)


この、Web管理コンソールは一定時間操作がないと自動的にログイン権限が切れてしまいますので、操作ができなくなったり、画面がログインの画面に変わった場合は、再度サービスの詳細から「Go to UI」 または　「Open Console」のボタンをクリックして、Web管理コンソールを表示してください。

以上です。
【Java】ログインアプリの作成

<h1>【Java】ログインアプリ作成</h1>
jspのログイン画面からユーザーIDとパスワードを入力し、登録ボタンを押すことでログインが成功し
メニュー画面へ遷移するプログラムの作成。
<h2>jsp画面</h2>
リクエストパラメータを使って値をサーブレットから取得するため、inputタグのname属性の値が必須になる。

```:jsp
<form name="myform" action="" method="post">
　<p>ユーザーID</p>
　<p><input type="text" name=user_id value=""></p>
　<p>パスワード</p>
　<p><input type="text" name=pass value=""></p>

　<input type="button" value="ログイン" name="login" onclick="buttonclick()">
</form>
```


<h2>Javascript</h2>
jsp画面からボタンをクリックするとinputタグのonclick属性buttonclick()の処理が行われ、
LoginServletが呼び出される。

```:javascript
<script>
     function buttonclick() {
		document.myform.action = "<%=request.getContextPath()%>/LoginServlet";
		document.myform.submit();
     }
</script>
```

<h2>サーブレット</h2>
ユーザーIDとパスワードを読み込むことができたら、セッションスコープへ保存しメニュー画面を表示する。
データーベースの値と一致しなければエラー画面を表示する。

```:servlet
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		HttpSession session = request.getSession(false);

		//リクエストパラメータを取得しuser_idとpassを変数に格納する。
		String uid = request.getParameter("user_id");
		String pass = request.getParameter("pass");

        //beanクラスのUserをインスタンス
		User user = new User(uid, pass);

		//データーベース接続処理　コネクションプーリング
		Connection con = null;
		PreparedStatement ps = null;
		ResultSet rs = null;

		try {
			Context context = new InitialContext();
			DataSource ds = (DataSource)context.lookup("java:comp/env/jdbc/データーベース名");
			con = ds.getConnection();

            //データベースに登録してあるテーブルからユーザーIDとパスワードを取得
			String sql = "SELECT * FROM テーブル名 WHERE カラム名 = ? AND カラム名 = ?";

			ps = con.prepareStatement(sql);

			ps.setString(1, uid);
			ps.setString(2, pass);

			rs = ps.executeQuery();

            //一致する行があればメニュー画面へフォワード
			if (rs.next()) {
				session.setAttribute("LoginInfo", user);
				RequestDispatcher dispatch = request.getRequestDispatcher("/WEB-INF/Menu.jsp");
				dispatch.forward(request, response);

　　　　　　　//なければエラー画面へフォワード
			} else {
				// ログインエラー				
				RequestDispatcher dispatch = request.getRequestDispatcher("/WEB-INF/Error.jsp");
				dispatch.forward(request, response);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (rs != null) {
				try {
					rs.close();
				} catch (SQLException e) {
					//
				}

				rs = null;
			}

			if (ps != null) {
				try {
					ps.close();
				} catch (SQLException e) {
					//
				}

				ps = null;
			}

			if (con != null) {
				try {
					con.close();
				} catch (SQLException e) {
					//
				}

				con = null;
			}
		}
	}
}


```

<h2>まとめ</h2>
ログイン機能を持ったアプリケーションを作成をするにあたり、リクエストパラメータの取得、コネクションプーリングやSQL文など、様々な知識が必要だと改めて感じた。
これから一つ一つの機能について復習しつつ、まとめていけたらと思う。
Windows10 コマンドプロンプトから ASWのWindows Server にscpでファイルを送信

# 環境

## AWS
- インスタンス Microsoft Windows Server 2019 Base - ami-0a2c187ea12f133eb

## 作業環境（クライアント）
- Windows 10
- コマンドプロンプト
- WSL(Ubuntu 20.04)


# AWS Windows Server(ファイルの受信側)の準備

## AWS Windows Serverで、OpenSSHサーバーを有効にする

- 以下の素晴らしい記事を参考に作業した
    - ほんの少しはまっただけでゴールできたので本当に感謝！

https://dev.classmethod.jp/articles/configure-windows-server-2019-sshd/

## AWSのインスタンスのメタデータの取得方法を知らなかったのでメモ

- メタデータに公開鍵の情報がある
- http://169.254.169.254/latest/meta-data/ でメタデータにアクセスできる
- IP アドレス 169.254.169.254 は、リンクローカルアドレスで、インスタンスからのみ有効

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/instancedata-data-retrieval.html

# ファイルの送信元のWindows 10 の準備

## sshのテスト

- コマンドプロンプトでsshできることを確認

```
ssh -i %HOMEPATH%\.ssh\mykey.pem Administrator@xx.xx.xx.xx
```

## configファイルに設定

- 毎回、IPと鍵を指定するのが手間なので、configファイルに書く
- Windows 10 コマンドプロンプトの場合は、`%HOMEPATH%\.ssh\config` に書けばよさそう


```text:%HOMEPATH%\.ssh\config
Host ec2win
    HostName xx.xx.xx.xx
    User Administrator
    IdentityFile ~/.ssh/mykey.pem
```

- 以下でsshできることを確認

```
ssh ec2win
```

- コマンドプロンプトでscpを使いファイルを送信

![ss1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1083912/23cb6644-95f9-3f56-72f8-811839e2a573.png)

```
c:\>scp file.txt ec2win:
file.txt                                                                              100%  969    75.5KB/s   00:00
```

- AWS側のWindows Server (Remote Desktop)で確認

![ss2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1083912/e5379717-4f3b-0a56-6ac8-8dcca1477a84.png)


## WSL(Ubuntu 20.04)側

- WSL(Ubuntu 20.04)からも `scp` できることを確認
クリーンアーキテクチャについてわかったこと

# はじめに

本記事は、[こちらの書籍](https://www.amazon.co.jp/Clean-Architecture-%E9%81%94%E4%BA%BA%E3%81%AB%E5%AD%A6%E3%81%B6%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%81%AE%E6%A7%8B%E9%80%A0%E3%81%A8%E8%A8%AD%E8%A8%88-Robert-C-Martin/dp/4048930656/ref=tmm_hrd_swatch_0?_encoding=UTF8&qid=1629018032&sr=1-1)でクリーンアーキテクチャを学んだうえでわかったことをまとめます。
書籍を読んだうえで大事だと思った点を中心にまとめます。

# クリーンアーキテクチャの概要

アプリケーションにとって重要なルールとDBやフレームワークなどの詳細な重要でない構成要素を境界で明確に分類して、重要でない構成要素がアプリケーション全体に与える影響を最小限に抑えるためのアーキテクチャです。
一般的には以下のような図で表現されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452292/5451c013-1798-27ea-1000-ec1760a5ed52.png)

円の中心にあるものほど、変化する可能性が低く、外側に行くほど頻繁に変化する可能性があります。
円の外側から内側の方向にしか依存してはいけないというルールがあるため、頻繁に変化する外側の構成要素(永続化の仕組みなど)の変更があった場合にも、アプリケーション全体に与える影響を抑えることが可能となります。

# 大事な点

個人的に感じたクリーンアーキテクチャにおいて大事な点は以下だと思います。

- 変化する可能性が低いものを円の中心に、最も頻繁に変化するものを円の最も外側に配置する。
- 円の外側から内側の方向のみに依存をさせる。内側から外側の仕組みを利用しないといけない場合は、内側にインターフェースのみのを定義して、外側が内側のインターフェースを実装する。内側から外側の仕組みを使わないというわけでないので、注意が必要。

クリーンアーキテクチャ自体が、変更されやすい構成要素が変更された際の影響を抑えることを目的としているので、その目的を常に忘れずにどのようなアーキテクチャにすべきかを考えるのが重要だと思います。

# まとめ

クリーンアーキテクチャの目的を理解することで、誤った活用法はしなくなるのではと思います。
どんな設計技法でもそうですが、その技法の目的を把握したうえで設計技法を活用するのが大事なんだなと改めて思いました。
Slack BOT　リアクションリスト機能をつけてみた

こんにちは。PythonParrotです。

今回は、リアクションリストを作ったのでその議事録です。
# 作ったもの
メッセージから「リアクションリスト」を選ぶと

メッセージにリアクションを付けた人・付けてない人を表示する機能を作りました。

# 使った技術
- Typescript
- Bolt
  - https://slack.dev/bolt-js/ja-jp/tutorial/getting-started
- Socket Mode

# つくりかた
## アプリケーションを作る
既存の自分で作ったアプリケーションがあれば、この手順は飛ばしても可

https://api.slack.com/apps

ここのCreate Appから自分のアプリケーションを作る。

## Socket Modeをオンにする
Socket Modeを使うことで、Webサーバーを建てなくても、ショートカットやSlashコマンドを作成できます。

https://api.slack.com/apis/connections/socket

ただ、現時点ではオンにするとBOTの公開はできないらしいので
開発中のBOTやあるワークスペースで完結するBOT向け。


アプリケーションの画面から、Socket Modeを選んで
Enable Socket Modeをオンにする。
![2021-08-25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1712277/597503d9-84c9-c7f7-ddd7-a28c25fc3cbd.png)


## Shoutcutを作成する

アプリケーションの画面から、Interactivity & Shortcutsを選んで
Create New ShoutCutを選ぶ

今回はメッセージ向けのショートカットを作りたいので、on messagesを選ぶ。
![2021-08-25 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1712277/a3610d4b-0ae0-e72d-7a8c-9507d5f92c01.png)

その後でショートカットを作成する。
![2021-08-25 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1712277/ef232e2c-ecc9-459e-e977-ed3e997d6886.png)



## 必要なライブラリを入れる
### 実行に必要
```
npm i --save @slack/bolt @slack/web-api dotenv
```
実行環境では、package.jsonを置けば

```
npm i --production 
```
を用いることで実行に必要なライブラリだけを入れてくれるので良さそう
### 開発・ビルドに必要
```
npm i --save-dev typescript
```


## Typescriptを書く
(執筆予定)
ソースはこちら

https://github.com/rf-castle/slack_reaction_list


## コンパイルする
```
npx tsc
```

# 動かし方
`.env.sample`から`.env`ファイルへコピー
.envに環境変数を指定してから、

```
node  main.js
```
でOK。
# リポジトリ
https://github.com/rf-castle/slack_reaction_list

# 参考URL
https://api.slack.com/lang/ja-jp/actions

https://api.slack.com/interactivity/shortcuts/using#message_shortcuts
PHP MAMPエラー解除方法


:::note info
MAMPを開きたい。　
:::
![スクリーンショット 2021-08-25 16.16.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1861207/518efa0b-ccc0-8521-7eca-a31894f9d2fd.png)


1 . ホームディレクトリから以下コマンドを実行。

```ruby:コマンド
sudo lsof -i -P | grep "LISTEN"
```
2 . パスワードを求められるので入力。
　　( PCのロック解除するパスワード )

3 . ポートの状態が一覧で表示されるので、ここで8888が使われているものを以下のコマンドで削除。

```ruby:コマンド
kill -9 番号
```

4 . 全て消し終えたところで再びMAMP起動。
Macでsedで正規表現を使った文を最初の行に挿入する方法

#誰だ、こんな仕様にしやがった奴
そんなわけでタイトルのような事態が起きたのです。
本来は面倒なことをせずに、
`sed -i "1i data1\tdata2\tdata3\t" header_input_data.txt;`
とか書いていていたんですよ。
それが動かないんですよ、Macでは。
参考になりそうな情報はあるのですが、これが正規表現は受け付けないという。
https://qiita.com/zaburo/items/f3a86c80b33db513c847

そこで超姑息的解決方法を考えてみました。
一行目に入ればいいんだから、上からくっつけちゃえば良いんだと(笑)
ということで僕の解決策。
`echo -e "data1\tdata2\tdata3\t" | cat - header_input_data.txt;`
これは`cat`が`-`で標準出力を受けることを利用しています。
この方法は一行目に入れるときにしか役立ちませんが、`split`とか使えば任意の位置に情報を入れられるのでは？
VeturでProperty 'xxx' does not exist on type 'CombinedVueInstance<Record<never, any> & Vue, object, object, object, Record<never, any>>'.と怒られる

初学者です。nuxt.jsに認証機能を持たせるためにauthモジュールを導入しています。
[nuxt/auth](https://auth.nuxtjs.org/)

上記を導入することで使用できるようになる$authやmiddlewareでのログイン状態によるページ制御をコードに記載したところ、

```
Property 'xxx' does not exist on type 'CombinedVueInstance<Record<never, any> & Vue, object, object, object, Record<never, any>>'.
```
とVeturのエラーがたくさん出たので対処しました。

### 環境
* "nuxt": "^2.15.7"
* "vue": "^2.6.14"
* "@nuxtjs/auth": "^4.9.1"
* vetur 0.34.1(vscodeの拡張機能)

### 対処法
vscodeのveturの拡張機能設定で`"vetur.validation.interpolation": false`を設定する。
※コマンドパレットで上記パラメータを検索して設定する、もしくはsettings.jsonに記載する。

### エラーの内容
以下参考にさせていただき、Vue.jsにおいて型推論が効かなくなったときに起こるものと理解しました。

https://qiita.com/shunjikonishi/items/3774486d37af80d1ae47

### 対処法の詳細

https://github.com/vuejs/vetur/issues/2131

上記を参考にしました。(ざっと読んだ様子では Template Interpolation Service が関係しているようです。)

> The v0.26.1 version is only change for can use template interpolation service when vetur.validation.template: false.
> If you no need template interpolation service, please set vetur.experimental.templateInterpolationService: false

> v0.26.1バージョンは、vetur.validation.template：falseの場合にのみテンプレート補間サービスを使用できるように変更されています。
> テンプレート補間サービスが必要ない場合は、vetur.experimental.templateInterpolationService：falseを設定してください。

今回変更したパラメータ`"vetur.validation.interpolation"`はvscode内の説明によると

> validate interpolations in <template> region using Typescript language service
> Typescript言語サービスを使用して<template>領域の補間を検証します

とのこと。

私の環境ではTypeScriptを使用していない、かつTemplate Interpolation Service は何となく無効にしたくないということで、`vetur.validation.template: false`を設定しました。

※上記がvetur 0.34.1でも同様の話なのかは分かっていません。Githubのバージョン履歴を追えばわかるのでしょうか。
※エラー自体は出なくなったのですが、私の環境ではテンプレート内の変数にホバーしても変数情報が表示されないので、Template Interpolation Serviceはうまく働いていないように思えます。使いづらく感じるようであれば、別の対応を考えます。

### Template Interpolation Serviceとは？
テンプレート内に書かれている式の型チェック、ホバーによる変数情報の表示、補完、定義ジャンプ、参照の表示ができるらしいです。(詳細は以下記事をご参照ください。)

https://katashin.info/2019/04/28/261
matplotlibのxticksが見切れてしまう時の対処法


matplotlibでグラフをpdf形式で保存しようとした時に、xticksが縦に長いと見切れてしまうことがあります。
![test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700770/8d81c701-f195-fad1-c04b-d77891069ac7.png)
そういう時は、savefigにおいてbbox_inchesを指定してあげると良いです。
画像の左下が(0,0)となり、(20,20)が右上に対応します。なので、xticksのラベルを見切れないように表示するには左下を(0,-5)のようにしてあげるとラベルまで余裕を持って表示されます。

```
from matplotlib.transforms import Bbox as BB
plt.savefig(image_name+'.pdf',bbox_inches=BB([[0,-5],[20,15]]))
```
![test1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700770/cdfba039-810f-6e99-29fb-adb07455c9f6.png)





# 参考
https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.savefig.html
セキュリティ診断とpingコマンド

---
### 結論

**「ping -nc 2 127.0.0.1」**で、Windows/UNIXを相手にできる

---
### OS Command Injection の試行コマンドとしてのping

セキュリティ上の問題(脆弱性)の一つの**「OSコマンド実行」**というのがある。

ここで、UNIX系統、Windows系統の両方に存在して、実害がないコマンドとして「ping」が使われることが多いと思う。

- Windeows系統では、オプションなしで、4発で終わってくれる
- UNIX系統では**「-c」**オプションを与えないと、無限に実行されてしまう
- Windows系統では**「-n」**オプションが回数の指定
- Windows系統で**「-c」**オプションを付けるとエラーになってしまう。

ということで、WSL2で試してみた

![ping.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182822/35944b6e-ed25-d90a-4ae4-1c9c65620318.png)

「ping.exe」はWindowsで、「ping」はUbuntu/Linux

---
### 以上
Google スプレッドシートで全角空白 半角空白を禁止する

スクレイピングで必須の設定ファイル。
最近は店舗名やログインIDなどの設定情報をエクセルではなく、スプレッドシートで管理することが多いです。
全角空白の入力を禁止することになりました。

#スプレッドシートで難しい入力制限をするにはデータの入力規則→カスタム数式を使います。
「データ」→「データの入力規則」→「カスタム数式」を使います。
<font color="red">今回は全角空白のみを禁止したいので
REGEXMATCH関数とto_text関数を使います。(半角空白を禁止するときも同じ）
</font>

こちらのページが詳しいです。
https://qiita.com/Hiroyuki1993/items/07b71a161b68be447ea7

「データ」→「データの入力規則」→「カスタム数式」を使います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369082/d21cfa34-92e1-8a87-9171-72cb1b692545.png)

#カスタム数式
・以下はC列にカスタム数式で入力規則を設定する例です。
　<font color="red">コピペするときは列を変えてください。</font>
・セル範囲にC列を選択していればカスタム数式の引数セルはC1だけでよいです。
・REGEXMATCH関数の引数はテキストなので、to_text関数で数値をテキストに変換します。
これがないと数値だけのセルに入力規則が効きません。
・全角空白や半角空白に正規表現の　\s は使えません。キーボードで全角空白や半角空白を入力してください。




##全角空白のみ禁止
セル範囲でC列を選択後、以下の式をカスタム数式の右側に入力して下さい。
C列を全角空白禁止とします。



```:カスタム数式
=REGEXMATCH(to_text(C1),"^[^　]*$")
[^ のあとに全角空白が入力されています。

```

##半角空白のみ禁止
セル範囲でC列を選択後以下の式をカスタム数式の右側に入力して下さい。
C列を半角空白禁止とします。

```:カスタム数式
=REGEXMATCH(to_text(C1),"^[^ ]*$")
[^ のあとに半角空白が入力されています。

```

##半角空白・全角空白禁止
セル範囲でC列を選択後以下の式をカスタム数式の右側に入力して下さい。
C列を半角空白全角空白禁止とします。

```
=REGEXMATCH(to_text(C1),"^[^ 　]*$")
[^ のあとに半角空白と全角空白が入力されています。

```

自分は業務でスクレイピングをしているのですが、設定ファイルが
エクセルからスプレッドシートに切り替わってきています。
スプレッドシートの正規表現による入力規則の出番が増えそうです。
Docker Compose + libfaketimeでテスト用コンテナの日時を固定する

ユニットテストにおける時間の問題についてのTipsです。


ユニットテストを行う際に手間のかかる作業として、テスト用環境の構築があります。<br>
今はDockerがあるのでかなり手間が減りました。


ユニットテストは何度やっても同じテストができて、同じ結果になることが重要ですが、その際に問題となるのはシステム日時です。

「今日」とか「今月」などの日付・時刻によって返す結果が変わる処理があった場合にどうやって環境を設定しておけばよいか。

Docker Composeとlibfaketimeを使ってシステム日時を固定することができます。

https://github.com/wolfcw/libfaketime

以下、PythonのWebフレームワークであるDjangoをサンプルとして方法を紹介します。

他の言語、フレームワークでも基本は同じになります。


# 1. Dockerfileでlibfaketimeをインストール

```Dockerfile
FROM python:3
ENV PYTHONUNBUFFERED 1

# テスト時にシステム時刻を固定化するためのlibfaketimeをインストール
WORKDIR /
RUN git clone https://github.com/wolfcw/libfaketime.git
WORKDIR /libfaketime/src
RUN make install

RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install -r requirements.txt
ADD . /code/
```

# 2. docker-compose.ymlで環境変数FAKETIMEに固定したい日時を指定
起動すると、コンテナ上の日時が固定された状態になります。

```docker-compose.yml
version: '3'

services:
  db:
    image: postgres
    environment:
      POSTGRES_PASSWORD: postgres
  web:
    build: .
    command: python3 manage.py runserver 0.0.0.0:8000
    environment:
# この2行で日時を設定
      - LD_PRELOAD=/usr/local/lib/faketime/libfaketime.so.1
      - FAKETIME=2021-04-24 10:30:00
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db
```

# 3. アプリケーション上での確認

 [Djangoチュートリアル](https://docs.djangoproject.com/ja/3.2/intro/tutorial01/)より

```views.py
from django.http import HttpResponse
from datetime import datetime

def index(request):
    return HttpResponse(f"Hello, world. "
                        f"{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
```

のようにして、現在日時を表示してみると以下のようにdocker-compose.ymlで設定した日時が表示されます。（何度やっても同じ結果）


## 備考
後から環境変数FAKETIMEを変更することで、コンテナ的にはシステム日時を変更することができます。

```shell
$ date
Sat Apr 24 10:30:00 UTC 2021
$ export FAKETIME="2021-08-22 12:50:33"
$ date
Sun Aug 22 12:50:33 UTC 2021
```

ただ、Djangoとしては再起動まで反映されません。
kintoneにオリジナルアクションを作成するカスタマイズ

こんにちは！
今回は

https://qiita.com/juri_don/items/694006321d1f24fac210

を応用して、オリジナルアクションを作ってみたいと思います👀

↓こんなオリジナルアクションボタンを作ります。

<iframe width="480" height="360" src="https://www.youtube.com/embed/_bjxSSmgbM0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

# アプリの準備

| フィールド種類 | フィールドコード | 備考 |
|:-:|:-:|:-:|
|文字列(1行)   |オリジナルアクション   |   |

※通常アクションのフィールド不要です👀

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/7bc83c3d-194e-48f0-f428-86bafed0fe1c.png)



# カスタマイズの方針

以下のようなオリジナルパラメータを追加したURLを開くことで
新規レコード追加時にオリジナルのパラメータ`original_action`の値XXXXを文字列(1行)フィールドにコピーする・・・というようなカスタマイズをします。

`https://【サブドメイン】.cybozu.com/k/【アプリID】/edit?original_action=XXXX`

## 作成の手順

1. オリジナルパラメータを含むURLを開いたら、original_actionの値を文字列(1行)フィールドにコピーする
1. オリジナルアクションボタンをクリックしたら、original_actionパラメータを含むURLに飛ぶ

この2つの手順を合わせるとうまくいくはずです👀

# JavaScript

というわけで作っていきます。

今回、ボタンやテキストボックス作成に **kintone UI Component** を使いました。
`https://unpkg.com/kintone-ui-component/umd/kuc.min.js`

## レコード追加画面表示

レコード追加画面表示後に、original_actionパラメータを見て、
パラメータがあればオリジナルアクションの動き、
なければ通常のレコード追加ということになります。

```js
// オリジナルアクションのパラメータ定義
const original_action = "original_action";

// レコード追加画面表示後
kintone.events.on(["app.record.create.show"], (event) => {
  // パラメータ取得
  const params = new URLSearchParams(location.search);
  if (params.has(original_action)) { // original_actionパラメータがあれば
    // 文字列(1行)フィールド（フィールドコード：オリジナルアクション）にパラメータの値をコピーする
    event.record.オリジナルアクション.value = params.get(original_action);
  }
  return event;
});
```

## 詳細画面にオリジナルアクションボタンを設置

詳細画面表示後、テキストボックスやオリジナルのアクションボタンを設置します。
クリックしたらオリジナルアクションの含まれるURLを作成してそのURL飛びます。

```js
kintone.events.on(["app.record.detail.show"], (event) => {
  // 上の白い部分取得
  const sp = kintone.app.record.getHeaderMenuSpaceElement();
  // テキストボックス
  const txt = new Kuc.Text({
    label: "渡す文字列",
    visible: true,
    disabled: false,
  });
  sp?.appendChild(txt);

  // ボタン
  const btn = new Kuc.Button({
    text: "オリジナルアクション",
    type: "submit",
    visible: true,
    disabled: false,
  });
  sp?.appendChild(btn);

  // ボタンクリック
  btn.addEventListener("click", () => {
    const url = new URL(location);
    url.href = url.origin + "/k/【アプリID】/edit"; 
    // original_actionパラメータに、テキストボックスの値をセットする
    url.searchParams.set(original_action, txt.value);
    // 作成したURLに飛ぶ
    location.href = url.href;
  });
});
```

# まとめ
通常のアクションの細かいところに手が届かない！というときにどうぞ。
What's the Key to Success: Being Nice or Being Smart?

It's a question that often comes to people's minds. Should you be nice or act with purpose to succeed in life? Of course, being nice gives a good impression but does it serve in the long run? 
</br>
**Does Being Only 'Nice' Helps?**
Whenever you go in a job interview, the first thing they see apart from your skills is if you are collaborative and nice as a person or not. People who are naturally nice and accommodating may make a good first impression. But that's not all. Just being a good person may not help you succeed. You must have a strategic intention and be smart to assess situations correctly. Let's take an example. The famous British comedian <a href="https://www.ted.com/talks/james_veitch_the_agony_of_trying_to_unsubscribe">**James Veitch**</a> once shared his experience about receiving emails from a new store. At first, he unsubscribed to it, as any person would. But later, more such emails spammed him. The way he dealt with the situation shows how you can be nice and assess smartly at the same time to succeed. Watch his video "The agony of trying to unsubscribe" to know what he did with those emails. 
</br>
**You Need to Act with Intelligence.**
There is this age-long notion that nice people will be cooperative and agreeable, which comes in the way of one's success. On the other hand, intelligence ensures that you learn from your past mistake, see the bigger picture and act wisely. There is another video of <a href="https://comedianjamesveitch.blogspot.com/">**James Veitch**</a>, in which he tells about an experience where he replied to a spam email and how it turned out to be a hilarious week-long conversation with the spammer. He learned from his mistake and used his intelligence to trick the spammer hilariously. Watch his video "This is what happens when you reply to spam emails" to know about the whole conversation. 
</br>
**The Final Advice**
According to reports and surveys, you should teach children to be smart and act intelligently while being nice. It is the best way to proceed towards a better future. Focusing on intelligence in early childhood has the potential to improve not only an individual's economic success but also their level of cooperation in society later in life. Simply being nice or acting smart will not get you anywhere. The only way to achieve success is to use both strategically.
Laravel で auto increment 値を取得する

今まで以下の方法でテーブルのID最大値を取得してました

```
$maxId = Users::max('id') + 1;
```

もしくは

```
$maxId = DB::table('users')
          ->select('id')
          ->oredrby('id', 'desc')
          ->first()->id;
```

前者はテーブルのレコード数が大量になると遅くなるので、データが大量になる場合は後者を使ってました。

が、エラーなど起こってデータがロールバックされた場合抜け番が生じます。
その結果、子テーブルがある場合データの不整合が起きます。
どういう事かというと

![WS000001.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442344/e0190370-10d4-c73c-0e33-867c08f6ef66.jpeg)

![WS000002.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442344/e9ae76de-bbf0-1596-40aa-fea86c6a3edc.jpeg)

![WS000003.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442344/b48cec5e-0103-dd12-b488-7417cbee0b03.jpeg)



なので、以下のクエリでauto increment値を取得

```
SELECT
 AUTO_INCREMENT
FROM
 INFORMATION_SCHEMA.TABLES
WHERE
 TABLE_SCHEMA = 'DB名'
 AND TABLE_NAME = 'テーブル名'
;
```

Laravelであれば

```
$maxId = DB::table("INFORMATION_SCHEMA.TABLES")
            ->select("AUTO_INCREMENT")
            ->where("TABLE_SCHEMA", "DB名")
            ->where("TABLE_NAME", "テーブル名")
            ->first()->AUTO_INCREMENT;
```

これで子テーブルでもauto increment値が登録可能です
httpd で発生した Segmentation fault の調査備忘録

web サイトで何も表示されない現象が発生！
エラーログを確認すると `Segmentation fault` が発生していました。

```
[Tue Aug 24 15:41:48.681377 2021] [core:notice] [pid 2777] AH00052: child pid 2781 exit signal Segmentation fault (11)
```

しかし、これだけは何が原因なのか全くわからないので core dump ファイルから調査することになりました。
core dump ファイル出力設定、gdb 調査の備忘録です。

* 環境
    * amazonlinux2
    * Apache/2.4.48
    * PHP 7.2.34
    * t2.nano,t2.medium

## core dump ファイルの出力設定
現状の出力設定を確認してみます。
確認には、 `ulimit -a` コマンドを利用します。

```
core file size          (blocks, -c) 0 -> いまこれ
core file size          (blocks, -c) unlimited -> こうなりたい
```
core file の上限が `0` で出力できない状態なので設定を変更します

* `/etc/security/limits.conf` に設定を追加

```
* soft core unlimited
* hard core unlimited
```

* `/proc/sys/kernel/core_pattern` に出力先パスと書式を指定

```
echo "/var/local/dumps/core.%e.%p"> /proc/sys/kernel/core_pattern
%e: プロセス名
%p: PID
```

* 恒久的に出力先パスを指定する場合は、`/etc/sysctl.conf` に設定

```
kernel.core_pattern = /var/local/dumps/core.%e.%p
```

* `httpd.conf` に出力先パスを指定

```
CoreDumpDirectory /var/local/dumps
```
httpd を再起動します。 


## core dump ファイルの解析準備

必要なパッケージ、コマンドをインストールします

* gdb, gcc

```
yum install -y gdb
yum install -y gcc
```

* debuginfo パッケージ
gdb コマンド実行結果に `no debugging symbols found` が表示された場合、debuginfo パッケージをインストールします。

```
debuginfo-install httpd-2.4.48-2.amzn2.x86_64
```

## core dump ファイルの解析
gdb コマンドに core dump ファイルのプロセスが

```
gdb {core dump ファイルプロセスの実行ファイル} {coreファイル}
gdb /usr/sbin/httpd -c /var/local/dumps/{coreファイル名}
・・・
(gdb)
backtrace を入力

(gdb) backtrace
```

## 参考にさせていただきました

https://qiita.com/yagiaoskywalker/items/38bd5c0d08e35946645b

ありがとうございました。
PowerAutomateDesktopのexcelのVBAにて別ファイルのシートをコピーする方法


お世話になっております。

件名の通り
PowerAutomateDesktopのexcelのVBAにて別ファイルのシートをコピーする方法とを知りたいため
ググって調べたのですがそれっぽいのがHITせず
Qiitaの方々のご尽力を賜りたく書き込み失礼いたします。

excelA　シート[sheet1]にexcelB　シート[data]
を貼り付ける作業をexcelAのVBAで実装しようとしております。

ググって出てきた
[別ブックからシートをコピーする - Learning Note ](https://konifug.hatenablog.com/entry/2017/01/15/153007)
によると

```
Workbooks("別ブック.xlsx").Worksheets("コピー元").Copy
After:=Workbooks("このブック.xlsm").Worksheets("Sheet3")
```
で出来そうな雰囲気なので実装してみると……

```
Workbooks("padでエクセル\200904_榊原郁恵.xls").Worksheets("データシート").Copy After:=Workbooks("padまとめる作業vba実行ファイル.xlsm").Worksheets("Sheet3")

```
と出来そうなのですが上記
Workbooks("padでエクセル\200904_榊原郁恵.xls")は
PowerAutomateDesktopのExcelinstance2のなのでVBAで使い方が分からないのです……

PowerAutomateDesktopでexcelをCopyする方法を知りたいので
その調査内容をメモらせて頂きますm(_ _)m

どなたか良い方法のググり方をご教授頂けますと幸いです。
CloudLatexにおけるLaTeX Error: Cannot determine size of graphic in 写真名.xbb (no BoundingBox)エラーについて

CloudLatexで画像を読み込もうとすると、

```
LaTeX Error: Cannot determine size of graphic in 写真名.xbb (no BoundingBox)
```
というエラーが出ることがある。
原因としては、写真名の部分に日本語を含んでいることが原因なので、(alphabetのみで構成される名前).pngとかにしてあげれば良い。

※追記
日本語を含んでいなくても上のが出ることがある。
改善方法としては、一旦画像名を消して再び打ち込んだり、画像のインサートに関するセクションとそれより前の項目の間を1行開けてあげたりすると治った
M1 Mac（Apple silicon Mac）のVSCodeでC++のデバッグが出来なかった時のメモ

# 怒られた

```
Warning: Debuggee TargetArchitecture not detected, assuming x86_64.
ERROR: Unable to start debugging. Unexpected LLDB output from command "-exec-run". process exited with status -1 (attach failed ((os/kern) invalid argument))
```

![スクリーンショット 2021-08-25 15.04.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498814/8852bdb1-7ea6-0d85-bd08-3748d038020b.png)


怒られた時のtasks.jsonとlaunch.jsonを一応


![スクリーンショット 2021-08-25 15.40.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498814/8c607b05-75af-691a-e7b0-fb360939c6e8.png)

![スクリーンショット 2021-08-25 15.03.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498814/54740094-a4d3-69be-61c7-e2ef0d28515c.png)


https://stackoverflow.com/questions/67270447/vscode-lldb-on-macos-error-when-starting-debugging-session

cppdbgがArm系だとだめっぽい（？）

# 解決策
### CodeLLDBをインストール
![スクリーンショット 2021-08-25 15.04.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498814/6b1281ad-91d4-601f-0a81-306e6563502e.png)

### launch.jsonを修正
`"type": cppdbg`を`"type": lldb`に書き換え
![スクリーンショット 2021-08-25 15.05.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498814/22987658-5df6-8ef4-aaac-60056873e520.png)

```launch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "clang++ - アクティブ ファイルのビルドとデバッグ",
            // "type": "cppdbg",
            "type": "lldb",
            "request": "launch",
            "program": "${fileDirname}/${fileBasenameNoExtension}",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${fileDirname}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "lldb",
            "preLaunchTask": "C/C++: clang++ アクティブなファイルのビルド"
        }
    ]
}
```
一応tasks.jsonも載せておきます．

```tasks.json
{
    "tasks": [
        {
            "type": "cppbuild",
            "label": "C/C++: clang++ アクティブなファイルのビルド",
            "command": "/usr/bin/clang++",
            "args": [
                "-g",
                "${file}",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}"
            ],
            "options": {
                "cwd": "${fileDirname}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "detail": "デバッガーによって生成されたタスク。"
        }
    ],
    "version": "2.0.0"
}
```
バルクロード とは

## 勉強前イメージ

bulkの意味は一括ってことは
一括で読み込みするってこと？

## 調査

### バルクロード とは

バルクロードとは
bulkの意味の通り、一括で読み込むという意味になります。
汎用的な意味で、どこに読み込む等はその時によりますが
データをDBにアップロードしたり、
プログラムをメモリに読み込んだりと使用されます。

### 様々なバルクロード

- [oracle](https://docs.oracle.com/cd/E57425_01/121/SPATL/bulk-loading.htm)

大量データのインポート

- [Amazon Neptune](https://aws.amazon.com/jp/premiumsupport/knowledge-center/neptune-bulk-loader-load-time/)

データのロード

- [vertica](http://vertica-tech.ashisuto.co.jp/dataload_overview/)

大量のロード

基本的にはデータを入れるような処理にこの言葉が使用されてるみたいです

## 勉強後イメージ

思ったよりそのまんまの言葉でした。。。調べるまでもなかったかも
ただ、汎用的な言葉っていうのは知らなかった
mapを使用してListに要素を追加してもうまくいかなかった(QuerySnapshot)

# QuerySnapshot<Map<String, dynamic>>にmapを使用してもうまくいかなかった(flutter/dart)

###失敗例
```dart
import 'package:flutter_riverpod/flutter_riverpod.dart'
class FeedsModel extends ChangeNotifier{
  List<String> bookTitles = [];
  late QuerySnapshot<Map<String, dynamic>> querySnapshots;
  Future BookTitleToList() async {
    querySnapshots = await FirebaseFirestore.collection('books')
    .get
    querySnapshots.docs.map((doc){
      bookTitles.add(doc['bookTitle']);
    });
  }
}
```

mapとforEachとかどっちも一緒やろ！！と思っていたのが間違いでした...

##解決策
```dart
querySnapshots.docs.forEach((doc){
  bookTitles.add(doc['bookTitle']);
});
```

mapをforEachに変えるだけです。

###後書き
Java Word文書で数式を追加

<p><strong>Wordは数式を入力することができます。数式の用法を使いこなせば、とても便利なツールになるはずだと思いますので、今回は、Spire.Doc for Javaという使いやすいライブラリを活用して、WordでLatex 数式とMathMLCodeを挿入する方法を紹介します。</strong></p>
<h4><strong>下準備</strong></h4>
<p><strong>1.E-iceblueの公式サイトから<a href="https://www.e-iceblue.com/Download/doc-for-java-free.html">Free Spire.doc for Java</a>無料版をダウンロードしてください。</strong></p>
<p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/l/lendoris/20210825/20210825151531.png" alt="f:id:lendoris:20210825151531p:plain" width="437" height="221" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p>
<p><strong>2.IDEを起動して新規プロジェクトを作成してから、インストールされたファイルにあった相応しいSpire.doc.jarを参照に追加してください。</strong></p>
<p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/l/lendoris/20210825/20210825151541.png" alt="f:id:lendoris:20210825151541p:plain" width="239" height="101" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p>
```JAVA
import com.spire.doc.*;
import com.spire.doc.documents.*;
import com.spire.doc.fields.omath.*;

public class Test {
    public static void main(String[] args){
        //Word obejctを作成し，sectionを追加します。
        Document doc = new Document();
        Section section = doc.addSection();
        //段落を追加します。
        Paragraph paragraph = section.addParagraph();

        //Latex 数式を挿入します。
        OfficeMath officeMath = new OfficeMath(doc);
        paragraph.getItems().add(officeMath);
        officeMath.fromLatexMathCode("x^{2}+\\sqrt{{x^{2}+1}}+1");

        //段落2を追加します。
        Paragraph paragraph2 = section.addParagraph();

        //MathMLCodeを挿入します。
        OfficeMath officeMath2 = new OfficeMath(doc);
        paragraph2.getItems().add(officeMath2);
        officeMath2.fromMathMLCode("<mml:math xmlns:mml=\"http://www.w3.org/1998/Math/MathML\" xmlns:m=\"http://schemas.openxmlformats.org/officeDocument/2006/math\"><mml:msup><mml:mrow><mml:mi>x</mml:mi></mml:mrow><mml:mrow><mml:mn>2</mml:mn></mml:mrow></mml:msup><mml:mo>+</mml:mo><mml:msqrt><mml:msup><mml:mrow><mml:mi>x</mml:mi></mml:mrow><mml:mrow><mml:mn>2</mml:mn></mml:mrow></mml:msup><mml:mo>+</mml:mo><mml:mn>1</mml:mn></mml:msqrt><mml:mo>+</mml:mo><mml:mn>1</mml:mn></mml:math>");

        //保存します。
        String result = "output/addMathEquation.docx";
        doc.saveToFile(result, FileFormat.Docx_2013);
    }
}
```
<h4><strong>実行結果</strong></h4>
<p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/l/lendoris/20210825/20210825151622.png" alt="f:id:lendoris:20210825151622p:plain" width="554" height="323" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p>
<p> </p>
Ruby 入門　[配列を繰り返し処理する]

配列　[“カフェラテ”,”コーヒー”,”モカ”]  配列は複数のオブジェクトをまとめて使う道具

● .each do

```rb
配列.each do |変数|
　繰り返し実行する処理
end
```
● .map do

```rb
配列.map do |変数|
　変数処置
end
```
eachメソッドとmapメソッドの違い
mapメソッドはブロックを渡して各要素について処理を行う点が、eachメソッドと似ている。eachメソッドは各要素についてブロックで処理を行うことが目的となり、mapメソッドは各要素を変換した新しい配列を得ることが目的になることが多い。mapメソッドは使う機会が大変多いメソッド。
【Azure】サインインログのクエリメモ

①サインイン履歴（サインイン成功）
SigninLogs | where ResultType == 0 and (UserPrincipalName == “admin1@TENANTNAME.onmicrosoft.com” or UserPrincipalName == “admin2@TENANTNAME.onmicrosoft.com”)

②サインイン履歴（サインイン失敗）
SigninLogs | where ResultType != 0 and (UserPrincipalName == “admin1@TENANTNAME.onmicrosoft.com” or UserPrincipalName == “admin2@TENANTNAME.onmicrosoft.com”)

③更新履歴
AuditLogs | where OperationName == “Update user” and (TargetResources[0].userPrincipalName in (“admin1@ TENANTNAME.onmicrosoft.com”) or TargetResources[0].userPrincipalName in (“admin2@ TENANTNAME.onmicrosoft.com”)) | project TimeGenerated, InitiatedBy.user.userPrincipalName, TargetResources[0].userPrincipalName, TargetResources[0].modifiedProperties

https://danielchronlund.com/2020/01/22/monitor-your-azure-ad-break-glass-accounts-with-azure-monitor/
Ruby 入門　[比較メソッド]

比較メソッドはその左右にあるものを比較して条件を満たせばtrue、満たさなければfalseを返す。

●if文

```rb
If 条件
　条件を満たした時の処理
elsif 条件→※何個でも追加できる
　条件を満たした時の処理
els
    条件を満たさなかった時の処理
end
```
● || 『または』

```rb
if 条件 1 || 条件2
　条件を満たした時の処理
end
※ || は、「または」という意味
```
● && 『かつ』

```rb
If 条件1 && 条件2
　条件を満たした時の処理
end
```
● case

```rb
case 変数
when 候補1
　変数の値が１と等しい時の処置（複数行書くこともできる）
when 候補2
　変数の値が２と等しい時の処置（複数行書くこともできる）
（以下、候補をさらに追加できる）
end
```
● n.times do ● n.times{}

```rb
n(回数).times do
　繰り返し実行する処置
end
※複数行の時do end を使う

n(回数).times {
　繰り返し実行する処置
}
※一行の時は{}を使う
```
● while

```rb
while 条件
　条件を満たしている間、繰り返し実行する処理
end
```
TLS 1.2 を無効にする PowerShell スクリプト

    New-Item 'HKLM:\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319' -Force | Out-Null

    New-ItemProperty -path 'HKLM:\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319' -name 'SystemDefaultTlsVersions' -value '0' -PropertyType 'DWord' -Force | Out-Null

    New-ItemProperty -path 'HKLM:\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319' -name 'SchUseStrongCrypto' -value '0' -PropertyType 'DWord' -Force | Out-Null

    New-Item 'HKLM:\SOFTWARE\Microsoft\.NETFramework\v4.0.30319' -Force | Out-Null

    New-ItemProperty -path 'HKLM:\SOFTWARE\Microsoft\.NETFramework\v4.0.30319' -name 'SystemDefaultTlsVersions' -value '0' -PropertyType 'DWord' -Force | Out-Null

    New-ItemProperty -path 'HKLM:\SOFTWARE\Microsoft\.NETFramework\v4.0.30319' -name 'SchUseStrongCrypto' -value '0' -PropertyType 'DWord' -Force | Out-Null

    New-Item 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server' -Force | Out-Null
    
    New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server' -name 'Enabled' -value '0' -PropertyType 'DWord' -Force | Out-Null
    
    New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server' -name 'DisabledByDefault' -value 1 -PropertyType 'DWord' -Force | Out-Null
    
    New-Item 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client' -Force | Out-Null
    
    New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client' -name 'Enabled' -value '0' -PropertyType 'DWord' -Force | Out-Null
    
    New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client' -name 'DisabledByDefault' -value 1 -PropertyType 'DWord' -Force | Out-Null
    Write-Host 'TLS 1.2 has been disabled.'
Azure AD Connect に対する TLS 1.2 の強制

New-Item 'HKLM:\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319' -Force | Out-Null

    New-ItemProperty -path 'HKLM:\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319' -name 'SystemDefaultTlsVersions' -value '1' -PropertyType 'DWord' -Force | Out-Null

    New-ItemProperty -path 'HKLM:\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319' -name 'SchUseStrongCrypto' -value '1' -PropertyType 'DWord' -Force | Out-Null

    New-Item 'HKLM:\SOFTWARE\Microsoft\.NETFramework\v4.0.30319' -Force | Out-Null

    New-ItemProperty -path 'HKLM:\SOFTWARE\Microsoft\.NETFramework\v4.0.30319' -name 'SystemDefaultTlsVersions' -value '1' -PropertyType 'DWord' -Force | Out-Null

    New-ItemProperty -path 'HKLM:\SOFTWARE\Microsoft\.NETFramework\v4.0.30319' -name 'SchUseStrongCrypto' -value '1' -PropertyType 'DWord' -Force | Out-Null

    New-Item 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server' -Force | Out-Null
    
    New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server' -name 'Enabled' -value '1' -PropertyType 'DWord' -Force | Out-Null
    
    New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server' -name 'DisabledByDefault' -value 0 -PropertyType 'DWord' -Force | Out-Null
    
    New-Item 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client' -Force | Out-Null
    
    New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client' -name 'Enabled' -value '1' -PropertyType 'DWord' -Force | Out-Null
    
    New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client' -name 'DisabledByDefault' -value 0 -PropertyType 'DWord' -Force | Out-Null
    Write-Host 'TLS 1.2 has been enabled.'
Azure AD Connect の構成情報

Get-ADSyncAutoUpgrade > c:\ADSyncAutoUpgrade.txt
(Get-ADSyncGlobalSettings).Parameters | select Name,Value > c:\ADSyncGlobalSettings.txt
Get-ADSyncScheduler > c:\ADSyncScheduler.txt
Get-ADSyncSchedulerConnectorOverride > c:\ADSyncSchedulerConnectorOverride.txt
Get-ADSyncServerConfiguration -Path c:\aadconnect
グーグルアナリティクス4（GA4）を利用した分析方法まとめ

### 記事に関して
この記事は、グーグルアナリティクスに関する個人的調査内容をまとめたものです。
概要のみで、設定方法や詳細は特に書いていません。

# グーグルアナリティクスのバージョン
| サービス名 | 略称 | 開始時期 | 備考 |
|:-:|:-:|:-:|:-:|
| ユニバーサルアナリティクス  | UA  | 2017/9~  | グーグルアナリティクス関係の記事はこのバージョンが多い。 |
| グーグルアナリティクス4 |  GA4 | 2020/10~  |  画面UIが変わっていくので、最新の有用な記事を見つけるのに苦労する。 |
※上記二つの機能は全然別物なので別の機能として考えた方がいいが、両方とも同じグーグルアナリティクスの管理画面から操作するため、別のバージョンがあるということを知っておかないと操作時に混乱します。


# ユニバーサルアナリティクス(UA)に関して
ググれば記事がたくさん出てくるので割愛。

# グーグルアナリティクス4(GA4)に関して
UAの後継機能。今後も機能や操作画面のUIが変わっていく。
ググった記事と、実際の操作画面が違うとなったら、以下のリリースノートでリリース時期と記事の公開日時期がどうなっているか確認した方がいいと思います。
[リリースノート](https://support.google.com/analytics/answer/9164320?hl=ja#zippy=%2C%E5%B9%B4%E3%81%AE%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9)
※「分析ハブ」と呼ばれていた機能が、2021年6月17日から「データ探索」という名前に変わっているということを見つけるのに苦労しました。

# グーグルアナリティクス4(GA4)のデータ収集方法
アクセス数などを計測するだけなら既存の機能を利用するだけでいい。
リンクのクリック数や特定の要素が表示された数などの、独自のイベント数も収集したい場合は、自分で以下のサービスを利用して設定する必要があります。

| サービス名 | 設定方法 | 備考 |
|:-:|:-:|:-:|
| グーグルアナリティクス4(GA4) | グーグルアナリティクスの管理画面から設定する。  | 
| グーグルタグマネージャー (GTM) | GTMの管理画面から設定する。<br>GA4と連携させることで、GA4より簡単に設定ができる。 | 独自の値を収集する場合は、ページごとに「dataLayer 」という変数を読み込み、変数に値をpushすることでデータの収集ができます。 |


# グーグルアナリティクス4(GA4)のデータ分析方法
| 分析方法 | 表の描画機能 |　データの扱える範囲 | ユーザーデータ保持期間※１ |
|:-:|:-:|:-:|:-:|
| GA4の探索機能（旧分析ハブ）  | あり | 限定的 | 2ヶ月 or 14ヶ月
| グーグルデータポータル  |  あり | 限定的 | 不明
| BigQuery | あり | GA4から転送したデータのみ | 無料の範囲であれば無制限
| Analytics Data API（Beta版）  | なし | 収集したGA4に保存されているデータにアクセス可能 | 取得したデータを別途保存すれば永久
※１ 収集したデータのすべてが消えるわけではありません。詳細は以下のリンクの記事が参考になります。
[Googleアナリティクスのデータ保持期間と一般データ保護規則（GDPR）](https://www.multimedia.or.jp/news/1015)

# まとめ
上記に記載している内容は一通り試しはしましたが、全然うまく扱える気がしません。
GA4だけではなく、関係するサービスも理解するには、時間をかけて試していく必要があると思います。
GDPRなどのセキュリティ関係も厳しくなっていくため、収集したデータをどのように保管しておくかも工夫する必要があります。


###　参考サイト
[Google アナリティクス 4（GA4）とは？](https://www.seohacks.net/blog/9986/)
[UAとGA4の違い比較まとめ](https://www.data-be.at/magazine/ga4-ua/)
[イベント収集方法](https://developers.google.com/analytics/devguides/collection/ga4/events?hl=ja)
[Analytics Data API Overview ](https://developers.google.com/analytics/devguides/reporting/data/v1)
CSSのborderで三角形を作るSassのmixin

## 要約
- コーディングでよく使う三角形をCSSの`border`プロパティで作ります
- Sassのmixinなので、いろいろなサイトで流用できます
- 上下左右と右上・右下・左下・左上の8パターンが生成できます
- 正三角形と二等辺三角形に対応していて、（3つの辺の長さがすべて違う）不等辺三角形は対応していません
- 三角形のジェネレーターである[CSS三角形作成ツール](http://apps.eky.hk/css-triangle-generator/ja)や[CSS Triangle Generator](https://triangle.designyourcode.io/)と同じようなことができます

## コード

```scss
// @desc  ボーダーで三角形を作ります。
// @param {String} $width
// @param {String} $height
// @param {String} $direction [right]
// @param {String} $color [currentColor]
// @example scss - Usage
// .triangle {
//   &:before {
//     content: "";
//     display: block;
//     @include triangle(10px, 15px, top);
//   }
// }
// @example css - CSS output
// .triangle:before {
//   content: "";
//   display: block;
//   width: 0;
//   height: 0;
//   border-style: solid;
//   border-color: transparent transparent currentColor transparent;
//   border-width: 0 5px 15px 5px;
// }
@mixin triangle($width, $height, $direction: right, $color: currentColor) {
  @if not index(top right bottom left top-right bottom-right bottom-left top-left, $direction) {
    @warn "$direction must be one of `top`, `right`, `bottom`, `left`, `top-right`, `bottom-right`, `bottom-left`, `top-left`; currently `#{$direction}`.";
  }

  width: 0;
  height: 0;
  border-style: solid;

  @if $direction == top {
    border-color: transparent transparent $color transparent;
    border-width: 0 ($width / 2) $height ($width / 2);
  }

  @if $direction == right {
    border-color: transparent transparent transparent $color;
    border-width: ($height / 2) 0 ($height / 2) $width;
  }

  @if $direction == bottom {
    border-color: $color transparent transparent transparent;
    border-width: $height ($width / 2) 0 ($width / 2);
  }

  @if $direction == left {
    border-color: transparent $color transparent transparent;
    border-width: ($height / 2) $width ($height / 2) 0;
  }

  @if $direction == top-right {
    border-color: transparent $color transparent transparent;
    border-width: 0 $height $height 0;
  }

  @if $direction == bottom-right {
    border-color: transparent transparent $color transparent;
    border-width: 0 0 $height $height;
  }

  @if $direction == bottom-left {
    border-color: transparent transparent transparent $color;
    border-width: $height 0 0 $height;
  }

  @if $direction == top-left {
    border-color: $color transparent transparent transparent;
    border-width: $height $height 0 0;
  }
}
```

### 使い方
横幅・高さ・向き（ここでは上向き）・色を指定できます。
省略すると向きは右向きに、色は`currentColor`でその要素の`color`プロパティを継承します。

```scss
// Sassの指定例
.triangle {
  &:before {
    content: "";
    display: block;
    @include triangle(10px, 15px, top, #000);
  }
}
```

```css
// CSSの出力例
.triangle:before {
  content: "";
  display: block;
  width: 0;
  height: 0;
  border-style: solid;
  border-color: transparent transparent #000 transparent;
  border-width: 0 5px 15px 5px;
}
```
【Project Euler】Problem 220 Heighway Dragonの感想（その２）

### D=20で4秒なのでD=50は136年
前回でD=20のドラゴン曲線を描いてみましたが処理時間はPythonで4秒程度。元の問題は以下のようにD=50なのでまともにO(2<sup>n</sup>)で計算すると136年。ということで何らかの高速化が必要になります。

> **Project Euler; Proglem 220**
> **D50のHeighway Dragon曲線の10<sup>12</sup>番目の点の座標を求めろ**

問題要求されているのは上のように最後の座標で途中経過は必要とされないので、高速化の方法としては以下の２つがあるのかなと思います。
１．Cache等のプログラミング・テクニックを使う
２．問題の周期性に注目して座標を求めるアルゴリズムを探す

本来は２をするのが出題者の意図かなと思い色々考えましたが、なかなか上手く行かなかったので今回は前回のドラゴン曲線を描くプログラムをCacheを使って高速化を模索しました。

### Pythonの@lru_cacheは使えず

Pythonでお手軽Cacheと言えば@lru_cacheで過去にProject Eulerの問題で何度もお世話になったので、今回もどうかなと色々試してみました。

```python
from functools import lru_cache

@lru_cache(maxsize=100000)
```
ただ今回は再帰関数からの結果だけを得ればよいという訳ではなくて、ターゲットの10<sup>12</sup>番目の点に到達するのがどの深さで起こるのか分からないので、その時にはCahcheをオフにして実際に計算を行う必要があるということで使えませんでした。

<p>したがって自分でPythonのDICTを使ってCacheを実現しました。要は再帰関数を呼ぶ前に残りStep数、座標、向きを記録しておいて関数から帰ってきたらそれらの差分をDICTに記録するというものです。
<p>Cacheを使うかどうかは以下のロジックで残りStep数を見て判断しました。

```
if 残りステップ数　> CacheされたStep数:
  Cacheを使って残りStep数、座標、向きを更新
else:
  再帰関数を呼ぶ
```
この方法でなんとか答えを得ることできましたが、Project Eulerの素晴らしいところはどうな方法でも正解を得ることが出来れば、正解者たちが書き込んでいるThreadにアクセスができるようになることです。このThreadは世界中から集まった素晴らしいアイデアの宝庫で、よくもこんなアルゴリズムを思いつくなといつも感心させられてしまいます。
【Azure】ユーザーアカウントのパスワード有効期限を無期限に変更する

①Powershellを起動し、Azure ADにログイン

＞Connect-AzureAD



②以下コマンドで対象アカウントのパスワードを無期限化します。

Set-AzureADUser -ObjectId “hogehoge@hogehoge.onmicrosoft.com” -PasswordPolicies DisablePasswordExpiration
POwershellの実行ポリシーの変更コマンド

PowerShell で下記を実行する。
＞ Set-ExecutionPolicy RemoteSigned
実行ポリシーは、信頼されていないスクリプトからの保護に役立ちます。
　～中略～
実行ポリシーを変更しますか?
[Y] はい(Y) [A] すべて続行(A) [N] いいえ(N) [L] すべて無視(L) [S] 中断(S) [?] ヘルプ (既定値は ""N""): A
【Unity】列挙型（enum）は別のクラスから簡単に参照できる

タイトルそのままの内容です。
Unity初心者なのでこんなことも知りませんでした(;´･ω･)

``` c:BaseClass.cs
public enum COLOR
{
    RED,
    BLUE,
    MAX
}
```
``` c:AnoterClass.cs
private BaseClass.COLOR color = BaseClass.COLOR.RED;
private int colorNum = (int)BaseClass.COLOR.MAX;
```
便利！！！！（雑魚）
Ruby 入門 [表示と変数]

```rb:
put "hello world"
```
文字列の表示は『”"』で囲む。(数値は囲まない)


```rb:
order="カフェラテ""
puts "ご注文は#{order}ですね?" →#{}文字列に計算式や変数を代入できる
```
orderという変数に『カフェラテ』というオブジェクトを代入する。（左側が変数、右側がオブジェクト）