OmniAICreator/Qiita-1.07M huggingface dataset:
SharePoint Online のドキュメントライブラリでプレビュー(読み取り専用)のリンクを作成してみた


###概要説明
SharePoint Online に保存されたドキュメントファイルを読み取り専用（プレビュー）で開くリンクを作成する方法です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1467348/4a295c79-aac9-d540-e7c6-9946c63cdf42.png)

上記のリンクをクリックすると読み取り専用（プレビュー）で開くことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1467348/1436ff08-fcb5-0260-b885-91fb29b44c6f.png)

複数のメンバーで共有しているドキュメントライブラリの場合、普通に開くと編集モードで開くので、他の人が、見るだけのつもりでも、意図せず編集してしまう場合があります。それを防ぐために、プレビュー（読み取り専用）で開くリンクです。
下図のように、メニューで「プレビュー」を選択すればいいのですが、うっかり普通に編集モードで開いてしまう人も多いので、リンクを作成してみました。（編集したい場合は、通常通りに開けば編集もできます）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1467348/ad5fac88-d6a2-eda0-5e97-092abfb28ead.png)

###プレビュー(読み取り専用)リンクの作成方法
では、作成方法です。
まず、「列の追加」で、1行テキストを選択し、適当なフィールド名の列を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1467348/d30eb30a-6fef-33ef-cd0b-da1659913501.png)

この例では、「PreviewLink」というフィールド名としました（フィールド名はなんでもOKです）
次に、「この列の書式設定」を開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1467348/fa704faf-5b97-c73d-9fab-4bb16fd8dca6.png)

左下の「詳細モード」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1467348/cfa43833-e768-69b6-fa21-52e2de4c4dea.png)

以下の JSON の書式設定を貼り付けて保存します。

```
{
  "$schema": "https://developer.microsoft.com/json-schemas/sp/v2/column-formatting.schema.json",
  "elmType": "a",
  "txtContent": "[$FileLeafRef]",
  "style": {
    "font-size": "120%",
    "text-decoration": "none"
  },
  "attributes": {
    "target": "=if([$FSObjType]=='1','_self','_blank')",
    "href": "=if([$FSObjType]=='1',[$FileRef],'AllItems.aspx?id='+[$FileRef]+'&parent='+substring([$FileRef],0,indexOf([$FileRef],[$FileLeafRef])-1))"
  }
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1467348/fb7ea159-e6b2-0e07-c95b-be481345d766.png)

すると、以下のように、プレビューのリンクが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1467348/4a295c79-aac9-d540-e7c6-9946c63cdf42.png)

あとは、列の位置を適当に変更してください。

###解説

以下のようなリンクでドキュメントを開くとプレビューモードで開くことができます。
この例では
　テナント: `XXXXXXXXXX.sharepoint.com`
　サイト名: `TeamsTest`
　ドキュメントライブラリ名: `TestPreviewDoc`
　ファイル名: `プレゼンテンション.pptx`
の場合のリンクです。

```
https://XXXXXXXXXX.sharepoint.com/sites/TeamsTest/TestPreviewDoc/Forms/AllItems.aspx?id=/sites/TeamsTest/TestPreviewDoc/プレゼンテーション.pptx&parent=/sites/TeamsTest/TestPreviewDoc/
```
※2021/09/29 時点で動作確認したものです。今後、仕様変更により動作しなくなる場合がありますのでご了承ください。

~~このリンクを JSONの書式設定で強引に作成しています。
$FileDirRef の値が取得できればもっとスッキリ書けるのですが、取得できなかったので、かなり無理やりのコードです😅
一応、フォルダ下のファイルにも対応しています。
もっとスマートなコードが書ける方は教えてください。~~
[idea.toString();](https://idea.tostring.jp/?p=5410) さんがすでに同様のことを、もっとスマートに実現されていました orz
ありがたく参考にして修正しました。idea.toString(); さんありがとうございます。
ただし、そのままでは、フォルダへの移動には対応していないので、対応するように改善を加えています。

JSON書式設定およびプレビュー表示については以下を参考ください。
　https://docs.microsoft.com/ja-jp/sharepoint/dev/declarative-customization/column-formatting
　https://qiita.com/Momomo_ai/items/58bf768fb83bddfbdca1
　https://idea.tostring.jp/?p=5410

変更履歴
2021/10/02 idea.toString() さんのコードを参考にしてシンプルにしました
2021/09/30 フォルダをクリックした際にフォルダに移動するよう JSON書式設定 を修正しました
C++開発環境構築(MSYS2) - 001

- **[001 - g++でコンパイルできる環境作成](https://qiita.com/arta-crypt/items/7717faf51ad581a8af98)<--- 今回の内容**
- [002 - Windows上で実行可能にする](https://qiita.com/arta-crypt/items/5fdd492161392060e1ad)


## C++開発環境構築(MSYS2) - 001

windows上でc++の勉強をするために、開発環境を色々調べました。

参考書や参考サイトなんかも調べました。

その中で[江添亮のC++入門](https://ezoeryou.github.io/cpp-intro/)で勉強してみることに決めました。

https://ezoeryou.github.io/cpp-intro/

ちなみにamazonで紙媒体の[江添亮のC++入門](https://www.amazon.co.jp/%E6%B1%9F%E6%B7%BB%E4%BA%AE%E3%81%AEC-%E5%85%A5%E9%96%80-%E6%B1%9F%E6%B7%BB-%E4%BA%AE/dp/4048930710)も購入できます。

なぜこの本で勉強してみようと思ったのか、それは少し読んでみて文体が気に入ったからである。つまりなんとなくです。



さて、先生を決めたので次は環境を整えようと考えました。

Visual Studio 2022をインストールしてあったのでそれでも良かったのですが、なんとこの江添亮先生はコンパイラやMakeについても教えてくださるのです。

それなら有り難く教えを請おうということで、Windowsで使えるシェル環境を探してみた。
下記が参考になった。

https://qiita.com/ueno-t/items/6556eabedde5508a58fa

https://qiita.com/Ted-HM/items/9a60f6fcf74bbd79a904


悩んだ結果MSYS2に決めた。理由はこれまたなんとなくです。

しいて理由を挙げるなら、Cygwinは使った事があるので、除外。残った中でなんとなく人気っぽい（解説記事が多そう）のがMSYS2だったのが理由です。



## MSYS2をDL＆インストール


https://www.msys2.org/

[MSYS2](https://www.msys2.org/)からDLする。

親切なことに上記ページにインストール後にやるべきことから、gccでビルドできる環境の構築まで解説してくれている。

Cドライブ直下がいいよ、とか書いてくれてますね。

インストーラーも日本語に対応している、なんと優しい。



MSYS2のサイトでも十分詳しいのですが、下記サイトもすごく参考になります。

https://qiita.com/spiegel-im-spiegel/items/ba4e8d2418bdfe0c8049

https://text.baldanders.info/remark/2016/03/gcc-msys2-1/


## vimのインストール

本体のインストールが終わり、コンパイラもインストール完了しました。

次はvim（エディタ）を入れます。

```
pacman -S --needed vim
```

vimを入れたら適当なプログラムを書きます。



## コンパイルの実行

**MSYS2 MinGW 64-bit**  から起動します。

適当なプログラムをコンパイルします。

```
g++ -o hello ./hello.cpp
$ ls
hello.cpp  hello.exe
```

実行ファイルが作成されました。

とりあえず開発環境が整いました～。

なんだかんだ1時間くらいかかった。調べてる時間が長かったな～。



## まとめ

新しいことを調べるのは時間がかかる。

しかし新しいことをするのは楽しい、新しい環境はワクワクする。

これでカチャカチャ勉強しよう。
BulletinBoard 使ってみた

#今回の内容

<img width="150" alt="BAADD4E6-4486-4440-B3FC-EE5067B95111_1_201_a.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1466343/75ba9662-3005-dffc-7b90-a59e21fb402b.jpeg"> 

#コード

* `pod BulletinBoard`を`Podfile`に記述して、`pod install`しましょう。

```:Podfile
pod 'BulletinBoard'
```

```Swift:
import UIKit
import BLTNBoard

class ViewController: UIViewController{
    
    var itemManager:BLTNItemManager = {
        
        let pageItem = BLTNPageItem(title: "練習")
        pageItem.actionButtonTitle = "上のボタン"  //上のButtonのタイトルを設定
        pageItem.alternativeButtonTitle = "下のボタン"  //下のButtonのタイトルを設定
        pageItem.appearance.titleTextColor = .black  //タイトルの色を設定
        pageItem.appearance.actionButtonColor = .systemTeal  //上のButtonの背景色を設定
        pageItem.appearance.actionButtonTitleColor = .white  //上のButtonのタイトルの色を設定
        pageItem.appearance.alternativeButtonTitleColor = .black  //下のButtonのタイトルの色を設定

        pageItem.actionHandler = { _ in
            
            //actionButtonが押された時の処理
            print("上のボタンが押された")          
        }
      
        pageItem.alternativeHandler = { _ in
            
            //alternativeButtonが押された時の処理
            print("下のボタンが押された")          
        }
        
        return BLTNItemManager(rootItem: pageItem)      
    }()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        
    }
    
    @IBAction func showBulletinBoard(_ sender: UIButton) {
        
        itemManager.showBulletin(above: self)  //作成したBulletinBoardを表示
    }

}
```

# 終わり
ご指摘、ご質問などありましたら、コメントまでお願い致します。
シェルスクリプトで二次元の九九一覧表を作ってみた（pasteでn個ごとに折り返す）

## はじめに

いろいろと思いつくままに書いてみました。実は `paste` コマンドのちょっとめずらしい（？）使い方の紹介です。

※ [`paste`](https://pubs.opengroup.org/onlinepubs/9699919799/utilities/paste.html) コマンドは他のコマンドに比べてあまり有名ではありませんが POSIX で規定されたコマンドです。

出力結果

```console
1*1=1	1*2=2	1*3=3	1*4=4	1*5=5	1*6=6	1*7=7	1*8=8	1*9=9
2*1=2	2*2=4	2*3=6	2*4=8	2*5=10	2*6=12	2*7=14	2*8=16	2*9=18
3*1=3	3*2=6	3*3=9	3*4=12	3*5=15	3*6=18	3*7=21	3*8=24	3*9=27
4*1=4	4*2=8	4*3=12	4*4=16	4*5=20	4*6=24	4*7=28	4*8=32	4*9=36
5*1=5	5*2=10	5*3=15	5*4=20	5*5=25	5*6=30	5*7=35	5*8=40	5*9=45
6*1=6	6*2=12	6*3=18	6*4=24	6*5=30	6*6=36	6*7=42	6*8=48	6*9=54
7*1=7	7*2=14	7*3=21	7*4=28	7*5=35	7*6=42	7*7=49	7*8=56	7*9=63
8*1=8	8*2=16	8*3=24	8*4=32	8*5=40	8*6=48	8*7=56	8*8=64	8*9=72
9*1=9	9*2=18	9*3=27	9*4=36	9*5=45	9*6=54	9*7=63	9*8=72	9*9=81
```

## seq

```sh
seq 9 | while read i; do
  seq -f "$i*%0g" 9
done | while read a; do
  eval 'echo $a=$(($a))'
done | paste - - - - - - - - -
```

備考 `seq` が POSIX 準拠ではない

## ブレース展開

```sh
printf '%s\n' {1..9}"*"{1..9} | while read a; do
  eval 'echo $a=$(($a))'
done | paste - - - - - - - - -
```

備考 ブレース展開が POSIX シェル準拠ではない

## for

```sh
for i in 1 2 3 4 5 6 7 8 9; do
  for j in 1 2 3 4 5 6 7 8 9; do
    echo "$i*$j=$((i*j))"
  done
done | paste - - - - - - - - -
```

備考 POSIX 準拠。9 個ぐらいならそのまま値を書いていいよね？

## while

```sh
i=0
while [ "$i" -lt 9 ] && i=$((i+1)) j=0; do
  while [ "$j" -lt 9 ] && j=$((j+1)); do
    echo "$i*$j=$((i*j))"
  done
done | paste - - - - - - - - -
```

備考 POSIX 準拠。無理やり詰め込んで行数を少なくしてみた

## 計算マニア

```sh
i=0
while [ "$i" -lt 81 ]; do
  echo "$(( i/9+1 ))*$(( i%9+1 ))=$(( (i/9+1) * (i%9+1) ))"
  i=$((i+1))
done | paste - - - - - - - - -
```

備考 POSIX 準拠。ここまでして二重ループを削除する必要はあるか？（ない）

## bc

```sh
for i in 1 2 3 4 5 6 7 8 9; do
  for j in 1 2 3 4 5 6 7 8 9; do
    echo "\"$i*$j=\"; $i*$j"
  done
done | bc | paste - - - - - - - - -
```

備考 Bourne シェルでも動く

`expr` を使ってもできますがループで毎回外部コマンドを呼び出すと遅くなるので、計算式を `bc` コマンドに与えることで高速化しています。（参考 [シェルスクリプトのための良いデザイン ～ expr と bc から知る設計の違い ～](https://qiita.com/ko1nksm/items/65cae7e4c66805d7c2b6)）

## paste 使わない

```sh
for i in 1 2 3 4 5 6 7 8 9; do
  for j in 1 2 3 4 5 6 7 8 9; do
    printf "%d*%d=%-2d " "$i" "$j" $((i*j))
  done
  echo
done
```

## さいごに

ということで九九一覧表の作り方のふりをした「`paste` コマンドは、一般的には引数の複数のファイルを一行ずつ読み取って組み合わせて出力するコマンドですが、標準入力からの入力（`-`）を使うと n 個ごとに折り返すことができます」という記事でした。

一般的な使い方

```sh
$ cat foo.txt
foo1
foo2
foo3
# bar.txt と baz.txt も同様

$ paste foo.txt bar.txt baz.txt
foo1 bar1 baz1
foo2 bar2 baz2
foo3 bar3 baz3
```

この記事で紹介した使い方

```sh
$ seq 10 | paste - - -
1	2	3
4	5	6
7	8	9
10
```

このような使い方は [POSIX でも紹介](https://pubs.opengroup.org/onlinepubs/9699919799/utilities/paste.html#tag_20_89_17)されています。（`ls` の出力結果を 4 つのカラムで出力する例）

> 1. Write out a directory in four columns:<br><br>ls | paste - - - -
> 



さて、他にもなにか面白い九九一覧表の作り方ないかな？
携帯の通信方式を全力で整理してみた

# ※2021/9/29 更新中 今後追記していきます。
3GPPやW-CDMAなど携帯電話のの通信方式が多く、関係性もよくわからなかったので整理してみました。
自分用なので間違っていたらごめんなさい。
世代別（1G、２G、３G、４G、５G）に見ていきます。

#1G 第一世代　ゴリゴリのアナログ
##[FDMA方式](https://www.weblio.jp/content/frequency+division+multiple+access) Frequency Division Multiple Access
無線ながらアナログの通信方式だったようです。周波数効率に難がありました。。

#2G 第二世代 デジタルの走り
##[TDMA方式](https://www.weblio.jp/content/TDMA) Time Division Multiple Access
音声データのデジタル化と通信速度の向上が図られています。

### [GSM方式](https://www.weblio.jp/content/GSM%E6%96%B9%E5%BC%8F) Global System for Mobile Communications
FDD-TDMA方式という、TDMAの時分割に加えて周波数分割（FDD)の要素も盛り込んだ通信方式をベースに作られています。欧州などで採用されていました。

###[PDC方式](https://www.weblio.jp/content/personal+digital+cellular) Personal Digital Cellular
TDMA方式の一種で、日本の第二世代携帯電話で使われていた方式です。日本だけ違う規格が使われていたところにガラパゴスみを感じますね


## [cdmaOne](https://ja.wikipedia.org/wiki/CdmaOne)
クアルコムという会社が開発した通信規格です。この後出てくるCDMA方式を利用した通信方式で、2Gとは区別され2.5Gと呼ばれており、3Gへの橋渡し的な技術でした。2Gに比べ高い通話品質と高い通信速度を実現していました。

###[cdmaOne（サービス）](https://ja.wikipedia.org/wiki/CdmaOne_(%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9))
au(KDDI)がかつて展開していた2Gの通信サービスです。通信規格と同じ名称なので注意が必要です。

#3G 第3世代 写真を送れるようにするぜ
２Gよりもより高速に、かつマルチメディア（写真、データ、動画）の送受信をサポートするべく超高速な通信回線を目指しました。
#3GPP


#ITU-T

#W-CDMA

#FOMA

#Softbank 3G

#CDMA 1X

#CDMA 1X WIN

#4G

#LTE

#LTE-M

#NB-IoT

#TD-SCDMA

#UMTS

#CDMA

#HDR

#5G
Slackをtwitter化したい　1回目

続くかどうかもわからないが、とりあえず始める。

## Summary
 - Slackで全部の会話をtwitterみたいに垂れ流したい
 - お金にするのは非常に難しそう（app ディレクトリの登録や、全メッセージをサーバーに送るのは抵抗がありそう
 - でもあったら便利だと思うので作る

## Motivation
 - microsoftでリモートワークしたら「非公式のコミュニティの相互接続性が低下」とみて自分もそうだと思った
 - 現実だと聞こうとしていなくてもいろんな人の声が聞こえてくるから、絡むトリガーがあった
 - 家のPCでも似たような状況を作れないかなと思い立った
 - マネタイズは無理そうなので、せめて記事にして自分にリーチする人を増やそうかなと

## 企画

### 問題提起
リモートワークで人が増えて、だれがどんな性格で、昨日より元気なのか？それとも元気じゃないのか？
正しくキャッチアップできていますか？
チーム間の連携がおろそかになっていませんか？
もしそうなっていたら極めて大きな問題です。
**個人の状況が把握できていなかったり、チーム間の関係性が希薄だと、必ずプロジェクトは失敗します。**
人はお互いに、他愛のないことでも注意を払って誰かを意識しないといけません。
対面では、ノンバーバルなコミュニケーションで成立していましたが、リモートワークではそうはいきません。
**しかし、実際にはすべてのチャットを見て互いを気遣う必要があるのです。**

### 障害
 - しかし、すべてのチャンネルに参加するのは骨が折れる
 - 新しくできたチャンネルを常に検知するのは現実的には不可能
 - また参加したとしても、発言があるたびにチャンネルを切り替えてみるのか？無理でしょう。

### 解決
 いっそのこと、すべてのpublicチャンネルの発言を集約させてなんとなくtwitterみたいに垂れ流しましょう。
 現実でもグループには参加していなくても、ついつい聞こえてきたら反応してしまうものです。
 そんなような状態をリモートワークにも用意し、コミュケーションのトリガーを増やします。

## 構成
画面：twiteerみたいな感じで
公開：s3 - cloudfront の静的ホスティング、サブドメインで適当に公開
対象：自分でslack appを作ってトークンをとってこれる人（その組織にエンジニアが一人いれば使ってもらえるはず・・・
技術：vue3 + typescript のみ


## 終わりに
難しいことは一切ないのでライトに作る。
※書いてることが今実現できるのかは調べてないから頓挫するかも
ちなみに、SlackStreamというツールが検索して見つかったが レガシートークンのみ対応ということで使用をあきらめた。

次回に続く・・・・
AWS CLIのインストールからLambda作成までの流れ

# はじめに
GCP好きですが、わけあってAWSを使う必要がでてきました。
そんなAWS初心者のメモです。

# AWS CLIインストール
macOSの手順は以下にまとめられています。
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2-mac.html

色々書いていますがユーザーインターフェースを使用したインストールが楽そうだったので、最新バージョンのAWS CLIをダウンロードしてインストールしました。

## インストールの検証
以下のコマンドで確かめます。

```shell
$ which aws
/usr/local/bin/aws 
$ aws --version
aws-cli/2.1.29 Python/3.7.4 Darwin/18.7.0 botocore/2.0.0
```

# AWS CLIのセットアップ
手順は以下にまとめられています。
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-quickstart.html

まずアクセスキーIDとシークレットアクセスキーが必要になるため作成します。
IAM→ユーザー→適当なユーザーを選択→認証情報タブ→アクセスキーの作成
をクリックすると作成できます。

次に以下のコマンドでアクセスキーIDとシークレットアクセスキーを設定します。

```shell
$ aws configure
AWS Access Key ID [None]: AKIAIOSFODNN7EXAxxxx
AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLxxxx
Default region name [None]: ap-northeast-1
Default output format [None]: json
```

# Lambda作成
手順は以下にまとめられています。
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/gettingstarted-awscli.html

## 実行ロール作成

```shell
aws iam create-role --role-name lambda-ex --assume-role-policy-document '{"Version": "2012-10-17","Statement": [{ "Effect": "Allow", "Principal": {"Service": "lambda.amazonaws.com"}, "Action": "sts:AssumeRole"}]}'
```

## ロールにポリシーをアタッチ
`AWSLambdaBasicExecutionRole`というCloudWatchにログを書き込むポリシーをアタッチします。

```shell
aws iam attach-role-policy --role-name lambda-ex --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
```

## 関数を作成

```python:test.py
import json

def lambda_handler(event, context):
    # TODO implement
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }
```

## デプロイパッケージを作成

```shell
zip test.zip test.py
```

## Lambda関数を作成
`--function-name`で関数名を指定し、
`--zip-file`でzipファイル名を指定し、
`--handler`でファイル名＋ピリオド＋実行する関数名を指定し、
`--runtime`でランタイムを指定し、
`--role`で先ほど作成したロールを指定します。
`123456789012`の部分はアカウントIDを指定してください。

```shell
aws lambda create-function --function-name test4 \
--zip-file fileb://test.zip --handler test.lambda_handler --runtime python3.9 \
--role arn:aws:iam::123456789012:role/lambda-ex
```

## Lambdaの確認
以下のように作成されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402872/3c5b34ed-5539-434d-fcf7-278ecf35ef38.png)
AtCoderログ：0128 - ABC 220 B

# 問題

https://atcoder.jp/contests/abc220/tasks/abc220_b

# 回答
## 回答1 (AC)
自然数 $X$ の $K$ 進法表記が $A=a_d a_{d-1} \ldots a_1 a_0$ であるとき、$X=a_d \times K^d + a_{d-1} \times K^{d-1} + \cdots + a_1 \times K + a_0$ という関係式が成立します。例えば $K=2$, $A=1011$ (入力例1) ならば $X=1 \times 2^3 + 0 \times 2^2 + 1 \times 2 + 1=11$ となります。

設問は $K$ 進法表記の2種類の自然数 $A,B$ が入力となるので、それぞれの値を求め、最後に積を計算することになります。最後の答えは int 型ではおさまらない可能性があるので、注意が必要です。コードは以下のようになりました。

```C++:abc220b-1.cpp
#include <bits/stdc++.h>
using namespace std;
 
int main() {
  int64_t k, ka, kb;
  cin >> k;
  cin >> ka >> kb;

  int64_t km = 1;
  int64_t da = 0;
  while ( ka>0 ) {
    da += (ka%10)*km;
    km *= k;
    ka /= 10;
  }

  km = 1;
  int64_t db = 0;
  while ( kb>0 ) {
    db += (kb%10)*km;
    km *= k;
    kb /= 10;
  }

  cout << da*db << endl;
}
```

# 調べたこと
## [AtCoder の解説](https://atcoder.jp/contests/abc220/tasks/abc220_b/editorial) → [公式解説](https://atcoder.jp/contests/abc220/editorial/2681)
回答1と同じ方針です。二つの自然数 $A,B$ の $K$ 進法表記を $10$ 進法に変換するため、変換操作は関数にまとめられています。

# リンク
## 前後の記事
- 前の記事 → [AtCoderログ：0127 - ABC A](https://qiita.com/RoadLynton/items/a155f02cb28850861a1a)
【Swift】MVPアーキテクチャについて


#はじめに

MVPは

``Model``
``View（View,ViewController）``
``Presenter``

の3つで構成されています。``MVC``では``View``と``ViewController``は分けて考えられていましたが、``MVP``においては``View``として扱われます。

#なぜMVPなのか

``MVC``では``ViewController``の責務が大きくなってしまうため、テストの容易性や作業分担のしやすさといった問題があります。それを解決するためのアプローチが``MVP``です。以下では、``MVP``における役割分担を``MVC``と交えながら確認していきます。（なお今回は``MVP``の中でも``PassiveView``パターンを取り扱います。）

##MVC
![2E0B0170-7948-47E7-BFFB-96A59F001A52.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1170864/961f67fe-ada2-b473-af7c-f07fe1320f9d.jpeg)

###Model
・ビジネスロジックを担当
###View
・画面の描画処理
###Controller
・``View``の入力に対し処理を行う( ``Controller`` は``View``に依存 ）
・``Model``に処理を依頼する（ ``Controller`` は ``Model``に依存 ）　　　　　　　　　　　　　　　　　　　　　
・``Model``の情報を取得するためにAPI等に問い合わせる（ ``Controller``は`` Utility ``に依存）

以上のように``MVC``において``Controller``は多くのロジックが詰め込まれているおり、抱える責務が多くなってしまいます。または``Controller``は、``View``、``Model``、``Utility``に依存している為、作業分担やテストの容易性といった点で問題があります。

##MVP
![EFF61662-B8C7-4249-B903-A51547366ACC.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1170864/0795af54-e829-ac3e-733d-1adb991094f6.jpeg)


###Model
・``MVC``と同じくビジネスロジックを担当
###View（ View, ViewController ）
・``Presenter``に処理を依頼（``protocol``を介して依頼する為、任せる相手は知らない→疎結合)
###Presenter
・``Model``に処理を依頼（``Presenter`` は ``Model``に依存）
・``Model``の情報を取得するためにAPI等へ問い合わせる(``Controller`` は`` Utility``に依存）
・``output``に処理を依頼（``protocol``を介して依頼する為、任せる相手は知らない→疎結合）


一方で``MVP``における``Controller（View）``の役割は、外部からのアクション（CellやButtonのタップなど）を``Presenter``に伝えるだけです。一見、``Controller``と``Presenter``間に依存関係があるように見えますが、``Protocol``で関係を持たせているため疎結合の状態です。つまり、依頼を受けた``Preseter``も処理を伝える相手が誰であるかは分かりません。このようにプレゼンテーションロジックが切り離されている為、デザイナーさんの作業が押してしまっていても作業を進めることが可能です。


##終わりに
以上です。次はMVVMについてまとめようと思います！
Unity で良い感じにアニメーションをキャンセルする（ VRChat でのギミック作成のために）

# はじめに
どうも。「バーチャルためにならない改変お姉さん」の水無月せきなです。
[前回](https://qiita.com/MinadukiSekina/items/c380fc4fde0663d7ef31 "UdonSharp で自動ドアを作った件について（引き戸タイプ編）")は VRChat で自動ドアを作った話を書きました。その投稿後、ふと「 Unity 自動ドア」で調べたら先人が何人もいらっしゃいました。
__調べる時は「 VRChat 」に限定するべきではない__とがっくりしながら学んだ次第です。

さて今回は、そんな中でもなかなか例が見当たらなかった、良い感じにアニメーションをキャンセルする方法についてです。

# 何が問題だったか
すべてスクリプトによる制御で作った自動ドアですが、他の方の反応や前述の通りネットに既にあった記事の内容を元に、Animation を利用した方法に改めました。
その時困ったのが、「扉が開いている最中にプレイヤーが範囲内から全員いなくなった場合、開く動作をキャンセルして閉じる動作へ__自然に__切り替える」ことです。

どういうことかと言うと、アニメーションのキャンセル自体はトランジションの `Has Exit Time` のチェックを外して条件を設定すれば、その条件を満たした時にすぐに遷移することでキャンセルできます。

![HasExitTime.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1843472/d67aedf4-8e2a-aed0-f7b5-37896b47282a.png)

ですが、キャンセルしたことで「閉じようとしているアニメーション」のステートから「開こうとしているアニメーション」のステートに遷移するような場合、瞬時に全開になってから閉じる動作に入るという全然自然じゃない動きになったりします。
理想としては現実の自動ドアのように、閉じかけたその位置から開こうとしてほしいわけです。

# 解決法
あくまで今回の自動ドアでの一例ですが、

* 開閉のアニメーションはトランジションで表現する
* トランジションの `Interruption Source` を `Next State` にする

で解決しました。

## 開閉をトランジションで表現
突破口になったのは、こちらの記事です。

https://qiita.com/tesla_0123/items/a2de2d5a764358008c6b

「サンプルのギミック」の説明で、この一文を見つけました。

>各animationには状態のみが保持され、動くanimationは遷移時間で表現しています。

今回の問題点は、各ステートのアニメーションの再生位置をどうやって調整するかみたいな所がありました。つまり、開閉の動きをステートのアニメーションで表現している限り生じる問題です。じゃあ、アニメーションで開閉させなければ？
これが１点目です。

## 次のトランジションを割り込ませる
「閉じている状態」<==>「開いている状態」でステートを結んでいる時、動作のキャンセルは「次の」ステートから自分のステートに戻るトランジションへの移行です。
`Interruption Source` で `Next State` を指定すると遷移先のステートからのトランジションが割り込み可能になります。

![interruption.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1843472/673f1513-2838-fe41-720d-1e4efc060d3b.png)

割り込みは他にもあるので、詳しくは公式のマニュアルをご参照ください。

https://docs.unity3d.com/ja/2018.4/Manual/class-Transition.html

## おわりに
以上で自然に動作をキャンセルできるようになりましたが、運良く上手く行った感じもしています。
他に自然なキャンセル方法をご存知の方は教えてくださると嬉しいです。
Excelでちょっとした正規表現を使いたい

（2022/04/29 更新）
関連記事として「[Script LabでExcelのユーザー定義関数を書く](https://qiita.com/Mt_SQ/items/6ad193a3a1cba9434407)」を投稿しました。

## はじめに
以前，Excelで名簿整理業務をした際，元になる複数の名簿間で電話番号の表記ゆれがあった。
よくある事案だが，まさかの全角表記，さらには「ー(長音)」まで混在...
(もしかすると，ハイフンが半角長音の可能性も...)

`(0XXX)YY-ZZZZ`, `0XXX(YY)ZZZZ`, `0XXX-YY-ZZZZ`, `（０ＸＸＸ）ＹＹ－ＺＺＺＺ` など

当時，上記の表記ゆれを `0XXX-YY-ZZZZ` に統一するため，次の手順で対応した。

**（１）ASC関数で半角変換し，値としてコピペし直す。**
**（２）データのセル範囲に対して４ステップの置換作業**
　　　`(0`　　→　　`0`
　　　`(`　　→　　`-`
　　　`)`　　→　　`-`
　　　`ｰ`(半角長音)　　→　　`-`

別に大した作業ではないが，「Excelで正規表現を利用できたら」とモヤモヤ...

## そうだ！　PowerShellだ！
「Excel 正規表現」で検索すると，VBA ＋ VBScript.RegExpオブジェクトの使用例が多い。
たかが電話番号の処理には大げさすぎる。

「正規表現なら**PowerShell**があるじゃないか！」　早速試す。

**（１）元データのセル範囲をコピー！（Ctrl + C）**
　　　（まさかの全角表記があれば，事前にASC関数で半角変換。）
![Excel1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209885/e21ad78d-b55a-6ed2-f756-8d03b461749b.png)

**（２）PowerShellで次の１行を実行**

```PowerShell:PowerShell
(gcb) -replace '\(?(\d+)\D(\d+)\D(\d+)', '$1-$2-$3' | scb
```

**（３）貼り付け先のセルでペースト！（Ctrl + V）**
![Excel2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209885/80997f21-d6ab-10d9-bbee-02308e64c4c6.png)

Excelや正規表現に限らず，クリップボードを介したPowerShellの活用は便利だ...

## ご注意
旧PowerShell（少なくとも5.1）では，Excelのクリップボードと相性が悪いようで，当方の環境ではペーストできませんでした。

Excelでセル範囲をコピーすると「CutCopyMode」（コピーされたセルの周囲で破線が回る状態）に入ります。
通常，他のアプリケーションでコピーが行われると，「CutCopyMode」は解除され，クリップボードは置き換わります。PowerShell 7.1 でも，Set-Clipboard（scb）で同様の動作をします。

旧PowerShellでもSet-Clipboardでクリップボードが置き換わり，Excel以外のアプリケーションへのペーストは，正常に機能します。
ところが，肝心のExcelで「CutCopyMode」が解除されず，「Excel上のクリップボード」は処理前の元データのまま置き換わっていません。
かといって，Excelでペーストする前にESCキーで「CutCopyMode」を手動解除すると，クリップボードがクリアされ，結局Excelにはペーストできません。

手数を要しますが，旧PowerShellで回避する一例です。
**（１）元データのセル範囲をコピー**

**（２）PowerShellでクリップボードの一時保存**

```PowerShell:PowerShell
$temp = gcb
```

**（３）Excelに戻り「CutCopyMode」を手動解除**

**（４）PowerShellでスクリプトを実行**

```PowerShell:PowerShell
$temp -replace '\(?(\d+)\D(\d+)\D(\d+)', '\$1-\$2-\$3' | scb
```

**（５）再度Excelに戻り，貼り付け先のセルでペースト**

Excelの動作に注意すれば，旧PowerShellでもそれなりのことはできます。




## 作業環境
OS : Windows 10 Pro（Ver. 21H1）
Excel : Excel for Microsoft 365 MSO 32bit
PowerShell : Ver. 7.1.4 および Ver. 5.1
プリミティブ値をオブジェクトで置き換える

オブジェクト指向を使っていて、ひとついいなと思ったことです。

[リファクタリング 既存のコードを安全に改善する（第2版）](https://tatsu-zine.com/books/refactoring-2ed)という書籍では、「オブジェクトによるプリミティブの置き換え」と命名されていました。

todo アプリを例に説明します。

# `int` での引き渡し

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124948/988b1a50-a6fa-218d-768f-09c93c4742fa.png)


`int` で引き渡していると、各コンポーネントは「`$task_id` <= 0 のときに次に渡すとバグるかもしれないな...」ということを考える必要が生じます。

<img width="679" alt="image.png (124.8 kB)" src="https://img.esa.io/uploads/production/attachments/17284/2021/09/29/48680/56740de0-19ce-4440-b0e3-c9031242b104.png">

# `TaskId` オブジェクトでの引き渡し

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124948/e46b16d3-6197-5a5b-05e8-c74ea3a3fb21.png)

`TaskId` オブジェクトを作成して受け渡すことで、0以下だった場合の心配をする必要がなくなります。

<img width="652" alt="image.png (114.1 kB)" src="https://img.esa.io/uploads/production/attachments/17284/2021/09/29/48680/f776ad0e-fa9f-46c2-a7b8-fd8014fac1c3.png">

# コード

## `int` で受け渡したとき

```php
class TaskDeleteController
{
    public function respond($task_id): void
    {
        if ($task_id <= 0) {
            throw new RuntimeException();
        }
        $this->service->delete($task_id);
    ...
}
```

```php
class TaskDeleteService
{
    public function delete(int $task_id): void
    {
        if ($task_id <= 0) {
            throw new RuntimeException();
        }
        $this->repository->delete($task_id);
    ...
}
```

```php
class TaskRepository
{
    public function delete(int $task_id): void
    {
        if ($task_id <= 0) {
            throw new RuntimeException();
        }
        $query = <<<'SQL'
delete from tasks

        ...
}
```

## `TaskId` オブジェクトで受け渡したとき

```php
class TaskId
{
    public function __construct(int $task_id)
    {
        if ($task_id <= 0) {
            throw new TaskIdValidateException();
        }
    ...
}
```

```php
class TaskDeleteController
{
    public function respond(int $task_id): void
    {
        try {
            $task_id = new TaskId($task_id);
        } catch (TaskIdValidateException) {
            throw new RuntimeException();
        }
        $this->service->delete($task_id);
    ...
}
```

```php
class TaskDeleteService
{
    public function delete(TaskId $task_id): void
    {
        $this->repository->delete($task_id);
    ...
}
```

```php
class TaskRepository
{
    public function delete(TaskId $task_id): void
    {
        $query = <<<'SQL'
delete from tasks

        ...
}
```
アニメーションライブラリ「Comets」を使ってみた

# はじめに
Swiftのライブラリで「[Comets](https://github.com/cruisediary/Comets)」というアニメーションライブラリがちょっと気になったので触ってみました。

流れ星のような表現を簡単にできるライブラリで非常に簡単にアニメーションを実現できるので、その方法を記載します。

# 今回作ったアニメーション
早速ですが、今回作ったアニメーションは以下のようなもので、サンプルに沿ってコードを記載するとサクッと以下のようなアニメーションを実現できました。
![comets01.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122007/0b16a6f0-d03a-d54c-0c13-2683e4288b59.gif)

# 作り方
## ライブラリのインストール
ライブラリのインストールにはCocoaPodsかCarthageが使えます。

```:CocoaPods
pod "Comets"
```

```:Carthage
github "cruisediary/Comets" ~> 0.3.1
```
## ライブラリの導入
上記いずれかの方法でライブラリをインストールし、ライブラリをimportします。

```
import Comets
```

## コードの記述
各アニメーションさせる線の始点、終点、色情報を記載し、viewのレイヤに追加、アニメーションを開始します。

```Swift
// アニメーションさせる線情報の記述
let width = view.bounds.width
let height = view.bounds.height
let comets = [Comet(startPoint: CGPoint(x: 100, y: 0),
                    endPoint: CGPoint(x: 0, y: 100),
                    lineColor: UIColor.white.withAlphaComponent(0.2),
                    cometColor: UIColor.white),
              Comet(startPoint: CGPoint(x: 0.4 * width, y: 0),
                    endPoint: CGPoint(x: width, y: 0.8 * width),
                    lineColor: UIColor.white.withAlphaComponent(0.2),
                    cometColor: UIColor.white),
              Comet(startPoint: CGPoint(x: 0.8 * width, y: 0),
                    endPoint: CGPoint(x: width, y: 0.2 * width),
                    lineColor: UIColor.white.withAlphaComponent(0.2),
                    cometColor: UIColor.white),
              Comet(startPoint: CGPoint(x: width, y: 0.2 * height),
                    endPoint: CGPoint(x: 0, y: 0.25 * height),
                    lineColor: UIColor.white.withAlphaComponent(0.2),
                    cometColor: UIColor.white),
              Comet(startPoint: CGPoint(x: 0, y: height - 0.8 * width),
                    endPoint: CGPoint(x: 0.6 * width, y: height),
                    lineColor: UIColor.white.withAlphaComponent(0.2),
                    cometColor: UIColor.white),
              Comet(startPoint: CGPoint(x: width - 100, y: height),
                    endPoint: CGPoint(x: width, y: height - 100),
                    lineColor: UIColor.white.withAlphaComponent(0.2),
                    cometColor: UIColor.white),
              Comet(startPoint: CGPoint(x: 0, y: 0.8 * height),
                    endPoint: CGPoint(x: width, y: 0.75 * height),
                    lineColor: UIColor.white.withAlphaComponent(0.2),
                    cometColor: UIColor.white)]

// 描画とアニメーション開始
for comet in comets {
    view.layer.addSublayer(comet.drawLine())
    view.layer.addSublayer(comet.animate())
}
```

# さいごに
上記コードだけでとても簡単に画像のようなアニメーションが実現できました。
始点、終点、色情報を調整すれば表現も変えれるので、好みの見た目を簡単に作れそうです。
見ていて綺麗なので、アプリの背景アニメーションに活用する、ローディングのアニメーションとして使う、など使い道がありそうです。
マルウェア、ランサムウェア とは

## 勉強前イメージ

攻撃の手法・・？

## 調査

### マルウェアとは

malicious(悪意のある) と software を組み合わせた造語で
ウイルスやワーム、トロイの木馬などデバイスに不利益をもたらすプログラムやソフトウェアの総称です。

マルウェアにはいくつかの種類があり、以下になります。

- ウイルス

プログラムの一部を書き換えて自己増殖するマルウェア。
単体では存在できず、プログラムに入り込み分身を作って増殖します。

- ワーム

自己複製して増殖して感染させるもので、ウィルスと同様です。
しかしウイルスとは違い、単体で存在することが出来ます。

- トロイの木馬

一見問題なさそうなファイルやアプリケーションなどに偽装してデバイスの内部に侵入し、
外部からの司令でデバイスを操るマルウェアです。

- スパイウェア

持ち主も気づかないうちにデバイスにインストールされ、個人情報など収集するマルウェアで
データ流出の原因となります。

- キーロガー

キーボードの操作をそのまま外部に送信する、スパイウェアの一種になります。

- バックドア

侵入者が侵入するためのネットワークの裏口を開けるマルウェアです。

- ボット

外部からの司令で他のコンピュータへの攻撃やファイルなどのデータを盗むようなプログラムになります。

### ランサムウェアとは

Ransom(身代金) と software を組み合わせた造語で、身代金要求型不正プログラムとも呼ばれます。
ランサムウェアとはマルウェアの一種で、
使用しているコンピュータをロックし中身のファイルを暗号化して見えない状態にした上で
元に戻すことを対価として金銭を要求するプログラムになります。

## 勉強後イメージ

マルウェアの一種としてランサムウェアがあるのね。
よく聞く言葉だったけど全然わからなかった

## 参考

- [マルウェアとは？ウイルスとの違いは？](https://www.ntt.com/business/services/network/internet-connect/ocn-business/bocn/knowledge/archive_19.html)
- [マルウェア／ランサムウェアとは？ | 特徴や感染の確認・対応方法について](https://businessonline.trendmicro.co.jp/sb/vbbss/content/cyber_attack/articles_002.asp)
AtCoderログ：0127 - ABC 220 A

# 問題

https://atcoder.jp/contests/abc220/tasks/abc220_a

# 回答
## 回答1 (AC)
$A$ 以上 $B$ 以下の自然数を順番に生成し、$C$ で割り切れたらば出力すれば良いでしょう。コードは以下のようになりました。計算量は $O(B-A)$ となります。

```C++:abc220a-1.cpp
#include <bits/stdc++.h>
using namespace std;
 
int main() {
  int a, b, c;
  cin >> a >> b >> c;

  int answer = -1;
  for ( int i=a; i<=b; i++ ) {
    if ( i%c==0 ) {
      answer = i;
      break;
    }
  }

  cout << answer << endl;
}
```

## 回答2 (AC)
$X$ 以下の最大の $C$ の倍数は $C \times \lfloor X/C \rfloor$ と表せます ($\lfloor z \rfloor$ は小数 $z$ の小数点切り捨て)。従って、$A$ 以上の最小の $C$ の倍数は $C \times \lfloor (A-1)/C \rfloor + C=C \times (\lfloor (A-1)/C \rfloor+1)$ となるので、これが $B$ 以下になっていれば出力すれば良いです。コードは以下のようになりました。計算量は $O(1)$ になっています。

```C++:abc220a-2.cpp
#include <bits/stdc++.h>
using namespace std;
 
int main() {
  int a, b, c;
  cin >> a >> b >> c;
 
  int answer = c*((a-1)/c+1);
  if ( b<answer ) {
    answer = -1;
  }

  cout << answer << endl;
}

```

# 調べたこと
## [AtCoder の解説](https://atcoder.jp/contests/abc220/tasks/abc220_a/editorial) → [公式解説](https://atcoder.jp/contests/abc220/editorial/2680)
回答2と似た方針です。$B$ 以下の最大の $C$ の倍数を調べているため、$(A-1)/C$ という調整が不要となっています。

# リンク
## 前後の記事
- 前の記事 → [AtCoderログ：0127 - ABC 220 に参加しました](https://qiita.com/RoadLynton/items/41d9b28f1ffdea3cd7d0)
個人開発ツール　スクラッチ〜設計

# ワイヤーフレーム　Adobe Comp (iPad)
https://www.adobe.com/jp/products/comp.html

ペンでサッサッと書いたラフな線をいい感じに変換してくれたり、ぐちゃぐちゃっと書けば要素を削除できたりして便利。
まずはワイヤーフレームを書いて全体像のイメージを膨らませる。

# API設計　Apicurio Studio (Web)
https://www.apicur.io/

GUIベースで操作できるAPI設計ツール。
Swaggerほどの機能はないらしいけど、とりあえずは使えてる。
[セルフホストした](https://qiita.com/F_clef/items/a90761bf38584124c60a)。
ワイヤーフレームを見て、必要なAPIを考える。

# ER図 iDatMod (iPad)
https://idatmod.gaesw.com/

ある程度ペンでも快適に操作できる、ER図作成ツール。
APIを確認し、ドメインを意識しながら設計する。

# あとは実装

ER図に従ってDB作って、
API設計に従ってAPI作って、
ワイヤーフレームに従ってフロント作れば完成。
ReactプロジェクトにTailwindCSSを導入する

# ReactにTailwindCSSを導入
近年CSSのフレームワークの```TailwindCSS```を使う機会が増えてきたので、Reactのプロジェクトに導入する方法をまとめていきます。

https://tailwindcss.com/


## Reactのプロジェクトを作成

まずはじめに、```create-react-app```でReactのプロジェクトを作成します。

```sh
$ npx create-react-app react-basic
```

## TailwindCSSを導入

TailwindCSSをインストールします。

```sh
$ yarn add -D tailwindcss@npm:@tailwindcss/postcss7-compat postcss@^7 autoprefixer@^9
```

##　CRACOを導入

Create React APPの場合、TailwindCSSの動作に必要なPostCSSのサポートをしていないため、CRACO(Create React Configuration Override)をインストールします。

https://github.com/gsoft-inc/craco

```sh
$ yarn add @craco/craco
```

CRACOを使って起動するようにするため、package.jsonの```scripts```の箇所を変更します。

```json:package.json
  "scripts": {
    "start": "craco start",
    "build": "craco build",
    "test": "craco test",
    "eject": "react-scripts eject"
  }
```

プロジェクトのルートにcraco.config.jsを作成します。

```js:craco.config.js
module.exports = {
  style: {
    postcss: {
      plugins: [require("tailwindcss"), require("autoprefixer")],
    },
  },
};
````

TailwindCSSの構成ファイルを作成します。

```sh
$ npx tailwindcss-cli@latest init
```

tailwind.config.jsファイルができたあと、purgeオプションを変更します。
指定したファイルの中で使用していないスタイルがあると、ビルド時に削除してくれます。

```js:tailwind.config.js

module.exports = {
  purge: ["./src/**/*.{js,jsx,ts,tsx}", "./public/index.html"],
  darkMode: false, // or 'media' or 'class'
  theme: {
    extend: {},
  },
  variants: {
    extend: {},
  },
  plugins: [],
};
```

## 動作確認

TailwindCSSが使えるようにCSSファイルを作成します。

```css:/react-basic/src/index.css
@tailwind base;
@tailwind components;
@tailwind utilities;

```

一度srcフォルダの中にあるファイルをすべて削除し、下記のindex.jsを作成します。

```js:/react-basic/src/index.js
import ReactDom from "react-dom";
import { App } from "./App";
import "./index.css";

ReactDom.render(<App />, document.getElementById("root"));

```

classNameにTailwindCSSが用意した属性を追加します。

```jsx:/react-basic/src/App.jsx
export const App = () => {
  return <div className="text-red-400">こんにちは</div>;
};

```

実行します。

```sh
$ yarn start
```

TailwindCSSが反映されていることが確認できました。おつかれさまでした！

![FireShot Capture 084 - React App - localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95954/9ddf035e-e53b-9267-a455-ad9e98ed3572.png)
【Rails】link_toでhtmlタグを使う

<h1>はじめに</h1>
ポートフォリオ作成中にhtmlタグをlink_toに入れる方法がわからなかった為、備忘録として記録。

<h1>使い方</h1>
link_toの記載は変更前の記述で書いてましたが、このままだとクラス追加しか出来なかったので変更後のブロック構造に変更。

**変更前**

```
<%= link_to "文字列", パス %>
```

**変更後**

```
<%= link_to パス do %>
 htmlタグ、文字列
<% end %>
```

以下、記述例

```
<%= link_to new_portfolio_path do %>
  <i class="fa fa-pencil-square-o" aria-hidden="true"></i>
  Add
<% end %>
```
初めて依存性逆転の原則を学んだ際に分からなかった"逆転"の意味

# はじめに

本記事は、私が初めてSOLID原則を学んだ際に、理解しきれなかった依存性逆転の原則の"逆転"の意味を自分なりの理解でまとめています。

# 依存性逆転の原則とは

メンテナンスしやすいソフトウェア開発をするための原則であるSOLID原則の中の1つです。
SOLID原則については[こちらの記事](https://note.com/erukiti/n/n959277a74dd0)で分かりやすくまとめられています。
依存性逆転の原則は、上位モジュールは下位モジュールに依存すべきでなく、どちらも抽象に依存すべきという原則です。加えて、抽象は詳細に依存せずに詳細が抽象に依存すべきという原則も含まれています。
簡単に表現すると、上位モジュールは下位モジュールを利用するけど、下位モジュールとはインターフェース(抽象)を介してやり取りしなさいということです。

# 初めて依存性逆転の原則を学んだときに私が思ったこと

原則の意味はある程度分かりましたが、"逆転"の意味がいまいちわかりませんでした。
何がどう逆転しているんだ?という状態でした。その後、実際に原則を使ってみたり、いくつか書籍を読む中で何となく"逆転"の意味が見えてきました。

# 私が思う"逆転"の意味

処理の流れと依存の向きが逆転していることを表していると私は思いました。
例えば、コンピュータとコンピュータが利用する四則演算機を考えてみます。
四則演算機には加減乗除の4つの計算をするためのメソッドがあり、コンピュータがそれを直接呼びだしている場合、処理の流れと依存の向きは同じになります。

![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452292/88e7b199-e208-946d-1b7c-53daeee70993.png)

ですが、コンピュータと同じ上位レベルで四則演算機用のインターフェースがあり、それを四則演算機が実現し、コンピュータはインターフェース経由で四則演算機を利用している場合には、処理は前と変わず上位から下位に流れますが、依存の向きは下位から上位の向きになります。つまり処理が上位から下位に流れているのに対して、依存は下位から上位に向かっており、処理の流れと依存の向きが逆転しているのです。

![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452292/a3e5f36f-e539-45f3-3df8-0f6bda86cf01.png)

# まとめ

この記事では、依存性逆転の原則の"逆転"の意味を自分なりにまとめました。
あくまで自分の考えなので、参考程度にご覧いただければ嬉しいです。
【MySQL】Geometry型を利用して、スポット間の距離をメートル単位で取得する

## はじめに
空間データを扱うGeometryを利用して、地点間の距離を求めます。
具体的には、複数の駅の位置情報のはいったレコードから、現在地までの距離をメートル単位で取得する方法を記します。

Geometryに関するリファレンスはこちら
https://dev.mysql.com/doc/refman/8.0/ja/gis-class-geometry.html

## テーブルの作成
駅の緯度経度情報を扱う簡単なテーブルを作成します。

```SQL
CREATE TABLE `test` (
  `name` VARCHAR(30) NOT NULL, 
  `longitude` double NOT NULL,
  `latitude` double NOT NULL,
  `location` GEOMETRY NOT NULL
) ENGINE=InnoDB;
```

## 緯度経度の挿入
テストデータとして、東京駅・渋谷駅・新宿駅の位置情報データを挿入します。

```SQL
INSERT INTO `test` (`name`, `longitude`, `latitude`, `location`) 
VALUES ('東京駅', 139.766851323989, 35.680877404701704, ST_GeomFromText('POINT(139.766851323989 35.680877404701704)')),
 ('渋谷駅', 139.70140081816402, 35.658751305090604, ST_GeomFromText('POINT(139.70140081816402 35.658751305090604)')),
 ('新宿駅', 139.700891636702, 35.689808778606704, ST_GeomFromText('POINT(139.700891636702 35.689808778606704)'));
```
ちなみに、longitude, latitudeのカラムがなくても、以下のようにlocationから緯度経度を取り出すことも可能です。

```SQL
mysql> SELECT X(location), Y(location) FROM `test` WHERE `id` = 1;
+---------------------+---------------------+
| X(location)         | Y(location)         |
+---------------------+---------------------+
|  139.766851323989   |  35.680877404701704 |
+---------------------+---------------------+
1 row in set, 2 warnings (0.01 sec)
```

また、既に緯度経度のデータが揃っている場合は、locationカラムを追加して以下のクエリを投げることで、Geometry型にアップデートすることができます。

```SQL
UPDATE `test` SET `location` = ST_GeomFromText(CONCAT('POINT(',longitude,' ',latitude,')'));
```

## 現在地からの距離をメートル単位で取得する
現在地を恵比寿駅（緯度：35.6470578070246, 経度139.709803588426）と設定して、現在地からの距離を取得してみます。

```SQL
SELECT
    name,
    ST_Distance_Sphere(
        `location`,
        ST_GeomFromText('POINT (139.709803588426 35.6470578070246)')
) AS distance
FROM `test`
ORDER BY distance;
```

距離をメートル単位で取得するための関数である、ST_Distance_Sphereを利用しています。
https://dev.mysql.com/doc/refman/8.0/ja/spatial-convenience-functions.html

### 結果
以下のように距離を取得することができました。

```SQL
+-----------+--------------------+
| name      | distance           |
+-----------+--------------------+
| 渋谷駅     | 1505.6781085531732 |
| 新宿駅     |  4821.369631613222 |
| 東京駅     |  6379.846634040899 |
+-----------+--------------------+
3 rows in set (0.02 sec)
```

（参考までに、Google Mapで渋谷駅〜恵比寿駅の距離を測定してみました。）
![スクリーンショット 2021-09-29 21.26.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415967/e25778c0-270f-6387-1cef-a45a0e090bb8.png)



## 参考
https://qiita.com/nkojima/items/bb21c72858606dedd817
https://qiita.com/tarokamikaze/items/c40f1cfe07ee3d5282ba
javascriptでプログレスバーを生成する関数を作る

discordで音楽botを作成する際に今流している曲がどこまで再生されているかを出したかったので作りました。
いろいろな場所に応用が効くと思います。

追記:hn9024さんよりコメントで「進捗が0の時にバーの長さが変わる」「コードはもっと簡略化できる」とご指摘をいただきました。
コードを修正させていただきます。ありがとうございました

```javascript:javascript
const getProgress = (currentPosition, endPosition, size, c0, c1, c2) => {
  const per = currentPosition / endPosition;
  const pos = Math.round((size - 1) * per);
  return `[${c1.repeat(pos)}${c0}${c2.repeat(size - pos - 1)}]`;
};

// example
const max = 20;
const size = 11;
for(let i = 0; i <= max; i++) {
  console.log(getProgress(i, max, size, "☆", "■", "□"), i);
}
/*
[☆□□□□□□□□□□] 0
[■☆□□□□□□□□□] 1
[■☆□□□□□□□□□] 2
[■■☆□□□□□□□□] 3
[■■☆□□□□□□□□] 4
[■■■☆□□□□□□□] 5
[■■■☆□□□□□□□] 6
[■■■■☆□□□□□□] 7
[■■■■☆□□□□□□] 8
[■■■■■☆□□□□□] 9
[■■■■■☆□□□□□] 10
[■■■■■■☆□□□□] 11
[■■■■■■☆□□□□] 12
[■■■■■■■☆□□□] 13
[■■■■■■■☆□□□] 14
[■■■■■■■■☆□□] 15
[■■■■■■■■☆□□] 16
[■■■■■■■■■☆□] 17
[■■■■■■■■■☆□] 18
[■■■■■■■■■■☆] 19
[■■■■■■■■■■☆] 20
*/
```
iOS で物体の向きをリアルタイムに計算②【方向成分抽出、表示】

前回の記事[『iOS で物体の向きをリアルタイムに計算①【2D FFTでパワースペクトル画像生成】』](https://qiita.com/pic18f14k50/items/6ebba549ff411c11dd2a)の続きです。
パワースペクトルから方向を抽出して表示します。

＜完成イメージ＞
![demo2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71605/4c02cb64-213e-b775-b7dd-ddc1578b9ca6.gif)　![demo3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71605/169b0696-28dc-10ed-f54b-f4249c3a02eb.gif)


左上の赤い線が抽出した方向を表しています。
前回の記事のでは上半分の画像はFFTに入力する画像(周囲を暗くした画像)を表示していましたが、今回は暗くする前の画像を表示しています。

コードはGithubに置いています。

https://github.com/tamai999/DirectionDetection

次の方法でパワースペクトルが格納された配列を処理することで、エッジがはっきりしている、且つ、他の物体と混在していないという限定的な場面あれば概ね向きの判別ができています。

1. 弱い振幅は捨てる
1. 方向別に振幅の値を合計する
1. 合計値が一番多い方向を物体の向きとする

### 1. 弱い振幅は捨てる

単純に角度別の振幅の合計値で向きを判別するので、なるべく物体としての特徴がない成分（＝ここでは振幅が弱い部分）をゼロにしておきます。今回作成したサンプルは100dB以下を削除しています。

![demo1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71605/b809318e-fb7b-fc8e-e57a-2410e11ba382.gif)


これは100dB以下の振幅値をゼロにしてそれをスペクトル画像にした場合の画像です。
方向成分が抽出できていると思います。

### 2. 方向別に振幅の値を合計する

一番強い方向を判別するため、ここでは扇状の各領域の振幅の大きさを足し込む方法をとります。
※[モーメント特徴で主軸方向を求める方法](https://ja.wikipedia.org/wiki/モーメント_(数学))等、他にも方法はあると思います。

次のイメージのように原点（直流部分）を中心として10度刻みの扇状の領域の振幅値を合計します。

![img1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71605/07cfb73a-8beb-700b-2935-fa2100f405e7.png)

　画像解像度が低いことにより、個々の扇状の領域に差異が生じるため、ここでは差異を補正する係数も計算しておきます。本サンプルプログラムでは一番大きな領域に合わせるように係数を算出しています(`Spectrum`構造体の配列`angleCorrectionValue`)。
　ちなみに、今回のサンプルでは扇の半径はFFTの出力の横幅と同じにしています。「1. 弱い振幅は捨てる」の動作画像のように低周波領域に特徴が表れているので半径を絞ることもできそうです。

### 3. 合計値が一番多い方向を物体の向きとする

2で計算した合計値と補正係数を使って、一番大きな値となる角度を物体の向きとします。
周波数成分はエッジに直交するので、取得した角度に90度足します。

以上です。
Swiftで音声再生アプリを作ってみた！！

##初めに
###音楽再生アプリとは・・・?
その名の通り、ボタンを押すことで音声を再生するアプリです。
こういったものはゲームのホーム画面でキャラクターをタップした時などのに使われる技術です。
今回は、簡易的に音声が再生できるアプリを開発しました。

※SwiftはXcode ver.12.51で行っています。

https://apps.apple.com/jp/app/xcode/id497799835?mt=12

##実際に作ってみる!
###Main.storyboardの設定

>1.ボタンを挿入する。
2.ボタンの位置を固定する。

まず、右上の+ボタンからButtonを選択肢し、下の図のように配置します。
そして、図のように下のalignボタンを押し、下の二つの欄にチェックを入れます。
こうすることによってボタンが中心へと配置されます。
![スクリーンショット 2021-09-29 13.01.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2066634/a7d8286c-265b-dd15-16ce-d39095ece7bb.png)

###音声を取り込む

**注意**
音声はどんなものでもいいです。しかし、__mp3ファイル__にしてください！
**拡張子だけ変えたものはNG！！**

>1.用意した音声を左のNavigatorにドラッグアンドドロップします。
2.Navigatorにファイル名が表示されれば取り込み完了です。

今回私は"sample().mp3"というファイルを使用しました。



###ViewController.swiftの設定

```swift:ViewController.swift
import UIKit
import AVFoundation

class ViewController: UIViewController {
    //ボタンの設定
    @IBOutlet weak var button0: UIButton!

    //mp3の設定
    let m0 = Bundle.main.bundleURL.appendingPathComponent("sample().mp3")
    var m00 = AVAudioPlayer()
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }
    
    //ボタンが押された時
   @IBAction func button0(_ sender: UIButton) {
     do{
         m00 = try AVAudioPlayer(contentsOf: m0)//オーディオをセット
         m00.play()//再生
     }catch{
         print("エラー")
   }
  }
```

ViewControllerは以上の通りです。この時、下の図にあるようにボタンを左クリックしながら、ViewControllerにはり、ボタンの変数名を記述すれば大丈夫です。


※ViewController上のボタンとstoryboardのボタンがつながっていないと__ボタンが作動しない__ために注意!。
![スクリーンショット 2021-09-29 13.36.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2066634/8b878f82-3300-8b02-7551-1ae806acd424.png)

##応用
ゲームでは一つのセリフしか喋らないわけではないですよね？
ということでランダムで複数の音声を再生するようにします。

>1.ランダム変数を作成する。
2.If文で条件分岐することによって行なっています。

こういったものにセリフがあるといいですよね？
なので余裕があればstoryboardのボタンの近くにlabelを貼り、そのラベルにセリフを書くようにするとうまく行きます。

```swift:ViewController.swift
      var label1 = UILabel()  //ラベルの設定
      let randomInt = Int.random(in: 1..<8)//ランダムの設定

  @IBAction func button0(_ sender: UIButton) {
      if(randomInt == 1){
        do{
           m00 = try AVAudioPlayer(contentsOf: m0)//オーディオをセット
           m00.play()//再生
         }catch{
           print("エラー")
         }
       label1.text = "こんにちは"
      }

      else if(randomInt == 2){
         do{
           m11 = try AVAudioPlayer(contentsOf: m0)//オーディオをセット
           m11.play()//再生
         }catch{
         print("エラー")
         }
       label1.text = "さようなら"
      }
    //以下に続く
   }
```



##最後に

いかがでしょうか？
思った通りに動きましたか？
これくらいのプログラムは慣れれば一時間程度あれば作れてしまいます。
ぜひ、暇な時に軽く作ってみてはいかがでしょうか？
TypeScriptで常にinterfaceの代わりにtypeを使用すべきという主張は公式ドキュメントの逆張り

## 結論

```typescript
type MyType = {
  readonly example1: string,
  readonly example2: number
}

interface MyInterface {
  readonly example1: string
  readonly example2: number
}
```

https://www.typescriptlang.org/play?#code/C4TwDgpgBAsiAq5oF4oG8BQUoCcIEMATAewDsAbEKCAD3wFsxyIBGALigGdgcBLUgOYAaLLgIkKVWgyYQATB1IBXegCMIODAF8MGfsA0AzfAGNocAJKkDOY2fSi8RMpWp1Gzdlx78Bj8S5S7rIKUMpqGtq6JmTcUPgccIiQUKhobjKeHABE2UIZHvIcLFA6MaRxqokgVjZ2KOgFsl65+dKFoSU6QA

無名型（`{ readonly example1: string, readonly example2: number }`）に無理矢理名前付ける（`type MyType =`）行為が、名前付きの型を直接定義する`interface MyInterface { readonly example1: string; readonly example2: number }`のより良くなる訳ないじゃないですか？

これ以上説明する必要ありますか🤣

最後にTypeScript公式ドキュメントを引用しておきます。

> For the most part, you can choose based on personal preference, and TypeScript will tell you if it needs something to be the other kind of declaration.

> まあ、typeかinterface使うかなんてどうでもいい問題なんだけど、それにTypeScriptはどちらかが使えない状況になったら教えてくれる機構を内蔵しているけど、

> If you would like a heuristic, use interface until you need to use features from type.

> 普通にやりたいなら必要になるまでtypeは使うな

https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#differences-between-type-aliases-and-interfaces

## 追記

`interface`の方が`type`よりコンパイラに優しいらしいです。あと型インターセクションはおかしな結果になることがあると書かれています。

https://github.com/microsoft/TypeScript/wiki/Performance#preferring-interfaces-over-intersections
【Laravel環境構築】MAMPを使って開発環境構築

#はじめに#
　環境構築は我々初心者に立ちはだかる最初にして最大の壁だと思いますが、MAMPを使うことで簡単に環境構築ができます。
　今回はLaravelの環境構築をやっていこうと思います。

#Laravelプロジェクト作成#
　まずは任意のフォルダにLaravelをインストールしていきましょう。
今回は、アプリケーション>MAMP>htdocsディレクトリの中にインストールしていきます。ターミナルを開いてこのように入力してください。

```
$ cd /Applications/MAMP/htdocs
$ composer create-project laravel/laravel example-app
```

　これでLaravelをインストールすることができます。必ずインストールしたいディレクトリに移動しておくことを忘れないようにしましょう！

次に、MAMPのドキュメントルートを設定します。
左上のPreferencesをクリックしてください。
![スクリーンショット 2021-09-29 20.42.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1558223/589c3f0b-10ee-dca9-d096-a991421b75c7.png)

次に、ServerのChoose...をクリックして、先ほどインストールしたLaravelのpublicディレクトリを選択してください。

![スクリーンショット 2021-09-29 20.43.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1558223/af1c4e65-a50e-3790-b2fb-c77d3527a91a.png)

　これで設定は完了です。http://localhost:8888/ をクリックするとLaravelのトップページが開きます。

#データベース設定#
　次にデータベースを作成します。phpmyadminでデータベースを作成しましょう。MAMPトップページの左上にあるToolsというドロップダウンメニューからphpmyadminが選択できます。データベース名はなんでもいいです。このとき、まだテーブルは作らないようにしましょう。

　データベースが作成できたらLaravelの設定を変更していきます。まずは.envファイルを変更します。このように変更してください。

```

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=8889
DB_DATABASE=先ほど作成したデータベース名
DB_USERNAME=root
DB_PASSWORD=root
DB_SOCKET=/Applications/MAMP/tmp/mysql/mysql.sock

```

ユーザーネーム・DB_SOCKETなどはMAMPのトップページから確認できます。
次にconfig/database.phpファイルを変更します。
46行目あたりにmysqlの設定が書かれていますのでここを変更します。

```config/database.php
 'mysql' => [
            'driver' => 'mysql',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '8889'),
            'database' => env('DB_DATABASE', '先ほど作成したデータベース名'),
            'username' => env('DB_USERNAME', 'root'),
            'password' => env('DB_PASSWORD', 'root'),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'prefix_indexes' => true,
            'strict' => true,
            'engine' => null,
            'options' => extension_loaded('pdo_mysql') ? array_filter([
                PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
            ]) : [],
        ],
```

このように変更してください。
これで設定は完了です。

#マイグレーション実行#
　あとはLaravelのマイグレーションを実行すればテーブルが作られます。
Laravelプロジェクトのディレクトリに移動してから、ターミナルで次のようにコマンド入力してください。

```
$ php artisan migrate
```

これで完了！ようやくLaravelでの開発が進められます！
WordVBA 少し触ってみた

Outlookのメール送信イベントからメール本文（画像付き）をWordに転記して
やりとりを管理したい

WordVBAがさっぱりわからないのでマクロの記録から欲しいものをピックアップ

ひとまず区切り線と日付くらい挿入したい


### コード 標準モジュール（Word）

``` vb
Sub 水平線と日付挿入()

  Dim myDate: myDate = Date
  Selection.InlineShapes.AddHorizontalLineStandard
  Selection.TypeText Text:=myDate
  Selection.TypeParagraph
  
  
End Sub
「3点を通る平面の式」をwolframalphaとSymPyとvbaでやってみた。

~~SymPyのdefの使い方を教えて下さい。~~

オリジナル

https://keisan.casio.jp/exec/system/1202458197

# wolframalphaで

https://www.wolframalpha.com/input/?i=%E5%B9%B3%E9%9D%A2%5B1%2C2%2C-2%5D%2C%5B3%2C-2%2C1%5D%2C%5B5%2C1%2C-4%5D&lang=ja

方程式
z = -(11 x)/14 - (8 y)/7 + 15/14


# SymPyで(2022-11-03追加)
これが、スッキリしていていいと思います。
```python
from sympy import *
A=Point3D(1, 2,-2)
B=Point3D(3,-2, 1)
C=Point3D(5, 1,-4)
print("#",Plane(A,B,C))
print("#",Plane(A,B,C).equation())
# Plane(Point3D(1, 2, -2), (11, 16, 14))
# 11*x + 16*y + 14*z - 15
```

subs使用
```python
from sympy import *
var('Ax Ay Az')
var('Bx By Bz')
var('Cx Cy Cz')
A=Point3D(Ax,Ay,Az)
B=Point3D(Bx,By,Bz)
C=Point3D(Cx,Cy,Cz)
print("#",Plane(A,B,C))
print("#",Plane(A,B,C).equation())
mySubs={Ax:1,Ay:2,Az:-2,Bx:3,By:-2,Bz:1,Cx:5,Cy:1,Cz:-4}
print("#",Plane(A,B,C).subs(mySubs))
print("#",Plane(A,B,C).equation().subs(mySubs))
# (省略)
# (省略)
# Plane(Point3D(1, 2, -2), (11, 16, 14))
# 11*x + 16*y + 14*z - 15
```


# SymPyで(行列で)

``` python
from sympy import *
var('a b c d')
var('Ax Ay Az')
var('Bx By Bz')
var('Cx Cy Cz')
a=(By-Ay)*(Cz-Az)-(Cy-Ay)*(Bz-Az)
b=(Bz-Az)*(Cx-Ax)-(Cz-Az)*(Bx-Ax)
c=(Bx-Ax)*(Cy-Ay)-(Cx-Ax)*(By-Ay)
d=-(a*Ax+b*Ay+c*Az)
mySubs={Ax:1,Ay:2,Az:-2,Bx:3,By:-2,Bz:1,Cx:5,Cy:1,Cz:-4}
print("#",a.subs(mySubs),b.subs(mySubs),c.subs(mySubs),d.subs(mySubs))
# 11 16 14 -15
```

????defを使ってみました。

``` python
from sympy import *
var('a b c d')
var('Ax Ay Az')
var('Bx By Bz')
var('Cx Cy Cz')
var('x y z')
def myMat2Eq(myMat):
    a=(By-Ay)*(Cz-Az)-(Cy-Ay)*(Bz-Az)
    b=(Bz-Az)*(Cx-Ax)-(Cz-Az)*(Bx-Ax)
    c=(Bx-Ax)*(Cy-Ay)-(Cx-Ax)*(By-Ay)
    d=-(a*Ax+b*Ay+c*Az)
    mySubs={Ax:myMat[0,0],Ay:myMat[0,1],Az:myMat[0,2],
            Bx:myMat[1,0],By:myMat[1,1],Bz:myMat[1,2],
            Cx:myMat[2,0],Cy:myMat[2,1],Cz:myMat[2,2]}
    return a.subs(mySubs)*x+b.subs(mySubs)*y+c.subs(mySubs)*z+d.subs(mySubs)
myMat=Matrix([[1,2,-2],[3,-2,1],[5,1,-4]])
print("#",myMat2Eq(myMat))
# 11*x + 16*y + 14*z - 15
```

# vbaで

```vb
Sub heimenNOsiki()
    ActiveSheet.Cells.Clear
MsgBox "3点を含む平面の式を計算します。"
    Range("A1") = 1
    Range("B1") = 2
    Range("C1") = -2
    Range("A2") = 3
    Range("B2") = -2
    Range("C2") = 1
    Range("A3") = 5
    Range("B3") = 1
    Range("C3") = -4
    Range("A5").Formula = "=(B2-B1)*(C3-C1)-(B3-B1)*(C2-C1)"
    Range("B5").Formula = "=(C2-C1)*(A3-A1)-(C3-C1)*(A2-A1)"
    Range("C5").Formula = "=(A2-A1)*(B3-B1)-(A3-A1)*(B2-B1)"
    Range("D5").Formula = "=-(A5*A1+B5*B1+C5*C1)"
End Sub

'結果
'11  16  14  -15
```

# 参考
equation(x=None, y=None, z=None)　
The equation of the Plane.

https://docs.sympy.org/latest/modules/geometry/plane.html#sympy.geometry.plane.Plane.equals
[メモ].onion バニティードメインを生成する。

## ステップ1

1.mkp224oをダウンロードする。
(https://github.com/cathugger/mkp224o/releases > mkp224o-\*-w64.zip をダウンロードする)

## ステップ2

1.mkp224o-\*-w64.zip を解凍する。
2.`./mkp224o-*-w64` フォルダーでコマンドプロンプトを起動する。
3.以下のコマンドを実行する。

```
.\mkp224o.exe <.onion ドメインにある欲しいキーワード>
```

例えば、

```
.\mkp224o.exe facebook
```

生成したドメイン：

```
facebookwqwehknemxj5asaniu7vnakmoxbjalrncoqsghop3kxvboaf.onion
```

## 備考

1.mkp224o: https://github.com/cathugger/mkp224o
2.horse25519: https://github.com/Yawning/horse25519
3.oniongen-go: https://github.com/rdkr/oniongen-go
4.oniongen-c: https://github.com/rdkr/oniongen-c
Kotlinでアプリがバックグラウンドからフォアグラウンドのタイミングで処理を実行するには

### Activityで行う場合
Androidのライフスタイルに従い `onResume`を呼び出して記述するだけです。

```
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }

    override fun onResume() {
        super.onResume()
        Toast.makeText(baseContext, "フォアグラウンドから戻ったよ", Toast.LENGTH_LONG).show()
    }
}
```