OmniAICreator/Qiita-1.07M huggingface dataset:
初心者の初心者による初心者のための(Django)Pythonのsqlite3説明

*自分の為のメモになります。

###sqlite3の導入方法
pythonの場合は、標準でsqlite3が導入されているのかな？自分の場合は、pythonに最初から導入されていました。されていない場合は、導入してください。

##外部ファイルを実行する方法
###sqlite3のコードの書き方

```commands.sql
-- sqlite3をインポートしています
import sqlite3

-- データベースに接続します。データベースがない場合は、新しく作成して、接続します。
-- 作成した場合、同じ階層にdatabase_name.dbのファイルを作成されます。
conn = sqlite3.connect('database_name.db')

-- sqliteを操作するカーソルオブジェクトを作成します。
cur = conn.cursor()

-- テーブルを作成しています。
cur.execute('CREATE TABLE sample_table(id integer, name text, birthday)')

-- ＃２　テーブルを作成しています。
create table if not exists posts (
 id,
 title,
 body
)

-- table一覧
.tables

-- tableの構造を確認
.shema posts or .shema

-- 動作を閉じています。（必ずこの２つを記述する）
conn.commit()
conn.close()
```

###sqlite3のプログラム実行方法
ターミナルで、上記のコードを動かす場合（外部ファイルを実行する）

１つ目
sqliteを起動してから、実行する方法

```terminal
$> sqlite3 database_name.db

sqlite> .read commands.sql
```
２つ目はそのまま実行する方法

```terminal
$> sqlite3 database_name.db < commands.sql
```

##ターミナルでsqlite3を実行する方法
###sqlite3のコマンド集
起動

```
$> sqlite3 データベース名.db
```
テーブルを作成する

```
sqlite> create table posts (title, body)
```
データベースを削除する場合は

```
sqlite> rm myapp.db
```
参照記事
https://qiita.com/saira/items/e08c8849cea6c3b5eb0c
【メモ】application.properties

# この投稿について
公式サイト・Qiita・ブログなどをみて
自分なりに理解したことを備忘録として記載しています

下記の記事からの補足になる
【IntelliJ + Docker (APP+DB) + SpringBoot (Maven) 環境構築】
https://qiita.com/SSM3G/items/bd61970648d94ccb691a

```properties:application.properties
spring.datasource.url=${DATASOURCE:jdbc:mysql://localhost:3306/sample}
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.database-platform = org.hibernate.dialect.MySQL5Dialect
spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto = update
```

# DB接続設定

```properties:application.properties

spring.datasource.url=${DATASOURCE:jdbc:mysql://localhost:3306/sample}
# JDBCの接続先URLを設定する

spring.datasource.username=root
spring.datasource.password=password
# SpringBoot側からデータベースにアクセスする際に名前とパスワードを設定しておく
# もちろん間違えていればデータベース側からはじかれる

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# データベースドライバのクラス名を設定
# com.mysql.jdbc.Driverという名は非推奨らしい公式より
# MySQL 8.x以降は基本的にcom.mysql.cj.jdbc.Driver設定

spring.jpa.database-platform = org.hibernate.dialect.MySQL5Dialect
# どのSQL言語を基準にするか定める
# https://future-architect.github.io/uroborosql-doc/configuration/dialect.html#%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0dialect%E3%81%AE%E7%99%BB%E9%8C%B2
# https://docs.jboss.org/hibernate/orm/3.5/javadocs/org/hibernate/dialect/package-summary.html
# https://spring.pleiades.io/spring-boot/docs/2.1.11.RELEASE/reference/html/howto-data-access.html

# JPAを使用してデータベースを初期化する
spring.jpa.generate-ddl=true
# 機能のオンとオフを切り替え
spring.jpa.hibernate.ddl-auto = update
# DBにテーブルが定義されていなければテーブルを自動作成
# 詳しくは公式サイトへ
# https://spring.pleiades.io/spring-boot/docs/2.0.x-SNAPSHOT/reference/html/howto-database-initialization.html

```
僕が一ヶ月でiOSアプリをリリースするまでにしたこと

##はじめに
この記事ではタイトル通り僕が一ヶ月でiOSアプリをリリースするまでにしたことを書いています。
IDEはXcode、言語はSwift、フレームワークはSwiftUIです。外部ライブラリは使っていません。
参考にしたもの、勉強を継続できたマインド、困ったことなどについて書ければと思います。
文才は皆無、お手柔らかに。

##SwiftUIのチュートリアルを見た
SwiftUIというのはiOSアプリ開発のための新しいフレームワークのことです。去年発表されたばかりで、どうやら実務ではまだ導入されていないところも多いらしいです。
何かを調べたり学んだりする時に最も良いのはやはり公式の情報です。[SwiftUIのチュートリアル](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&cad=rja&uact=8&ved=2ahUKEwiy2d6f4ufpAhVGBKYKHY2KASYQFjAAegQIBhAC&url=https%3A%2F%2Fdeveloper.apple.com%2Ftutorials%2Fswiftui%2Ftutorials&usg=AOvVaw0641_6RiAStrj-bxQzCi-6)何度も読み込み、同じものを作りました。
この時参考にさせていただいたのが[超初心者のためのSwiftUIチュートリアル](https://note.com/nyakko/n/n7096926a5c95)。
Apple公式のチュートリアルは英語でしか書かれていないので、読むのにとても苦労します。noteで丁寧に日本語で訳してくださっているので大変参上になりました。

##SwiftUIのチュートリアル応用してなんかできないかなーって考えた
とにかくSwiftUI使ってみたい！せっかくならAppStoreで出したい！と思った僕は完成度が高くオープンソースである公式チュートリアル応用して何かできないかな？と考えました。模倣して自分のアイディアを混ぜていくうちにSwiftUIの良さを活かしたアプリができました。

##SwiftUIの参考書を買った
エンジニアに限らず初学者特有のとりあえずモノを揃えたくなるアレです。[詳細!SwiftUI iPhoneアプリ開発入門ノート](https://www.google.com/aclk?sa=L&ai=DChcSEwiMkvuI5OfpAhVCVGAKHaAlBnIYABAFGgJ0bQ&sig=AOD64_0jLtFmyicfyHtD2HiwE68FNyzJKQ&ctype=5&q=&ved=2ahUKEwioj_KI5OfpAhVjyosBHXOoCfgQ9aACegQIExBC&adurl=)と[SwiftUI徹底入門](https://www.google.com/aclk?sa=L&ai=DChcSEwiMkvuI5OfpAhVCVGAKHaAlBnIYABAGGgJ0bQ&sig=AOD64_1x7MFcSNTsp8AL9_KucKyaLLEOpw&ctype=5&q=&ved=2ahUKEwioj_KI5OfpAhVjyosBHXOoCfgQ9aACegQIExA7&adurl=)を買いました。どちらも大変参考になり、助けられました。詳細!の方は文法などもカバーされていて、かなり初心者向け。しかし、@Stateや@Bindingなどのオプショナルラッパーについてもきちんと書かれている。徹底入門は少し難しめ。僕は辞書がわりに使っていました。

参考書を購入するメリットとしては体系的な知識とともに、機能するソースコードが手に入るです。SwiftUIは新しい技術なので、検索しても期待した結果が得られることは少ないです。「〇〇　SwiftUI」で検索しても**もしかして Swift**なんて出ることもザラです。

##Qiitaに記事を書いてアウトプットした
[僕の過去の記事](https://qiita.com/Hyperbolic_____)には自己満備忘録がたくさんあります。プログラミングに勉強に限らず人に見られることを意識したアウトプットがめちゃくちゃ大事だと思ったので、とにかく記事を書きました。繰り返しになりますがSwiftUIの技術記事はめちゃ少ないので、僕が記事を残しとこう！みたいな謎の使命感も多少はありました。(たまにLGTMがもらえて嬉しい。)

##Teratailで質問した
アプリ開発をきっかけにTeratailデビューもしました。初めての質問は[ForEachで...使ったらコンパイルエラー出る](https://teratail.com/questions/260082)みたいな質問でした。[Jsonファイルの作り方](https://teratail.com/questions/261986)みたいな超初歩的な質問もしました。(今振り返ってみると、結構同じ方が回答やクリップをして下さっている。ありがたい🙏)アプリを作る中でで8つ質問をして7つ解決内4つ自己解決。質問文を書いているうちに「これ試してないぞ..」みたいなパターンもよくありました。

##Youtubeで再現した。
文字での学習も大事ですが、動画での学習は再現性がめちゃくちゃ高いです。何より「動かねーじゃねーか！」みたいなストレスが少ない。ほとんどの動画が英語ですが、そこまで気になりませんでした。

##できたもの
宣伝っぽくなってしまい恐縮ではありますが、App StoreのURLと写真を載せます。アプリの機能としてはマンセル色表からRGBが得られます。また色を保存したりカラーコードをコピーできます。(インストールして下さい🙏)
https://apps.apple.com/jp/app/色検索/id1516435071
Chart.jsで横スクロール可能なグラフを作る

## 概要
Chart.jsでは普通にグラフを作ると画面の幅に合わせて１つのデータ当たりのサイズをレスポンシブに調整して表示してくれます．

とても便利ですが，データの量が多いとかなり見づらくなってしまいます．

そこでデータ１つ当たりの横幅を固定して画面に収まりきらない分は横スクロールで見えるようにしようと思いましたが，かなり苦労したのでメモを残します．参考になれば幸いです．

### 完成図
今回は棒グラフが必要だったので，棒グラフを作成しました．
他の種類のグラフは試していませんが，データ構造が同じようなグラフなら上手くいくと思います．
![スクリーンショット 2020-05-26 12.09.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401124/9cd5d830-44b1-e8b1-3d2c-6561eca1551e.png)
図の下にスクロールバーが描画され，スクロールバーを動かすとスクロールすることができます．
(右の方はラベルしか描画されていませんが，値を入れなかっただけなので気にしないでください．）

# 実行環境
ブラウザ: Google Chrome
Chart.js バージョン: 2.9.3
CDNを読み込んで使っています

```html
<head>
  <script src="https://cdn.jsdelivr.net/npm/chart.js@2.9.3/dist/Chart.min.js"></script>
</head>
```

## HTML
まずhtmlがこちらです．

```html
<div class="chartWrapper" style="position: relative; overflow-x: scroll;">
  <div class="chartContainer" style="height:200px;"> //高さは好きに設定
    <canvas id="chart" style="position: absolute; left: 0; top: 0;"></canvas>
  </div>
</div>
```
canvasを２つのdivで囲っています．

## Javascript
続いてJavasciptがこちらです．

```javascript
var xAxisLabelMinWidth = 15; // データ当たりの幅を設定
var data = [12, 19, 3, 5, 2];
var width = data.length*xAxisLabelMinWidth; // グラフ全体の幅を計算
document.getElementById('chart').style.width = width+"px"; //　グラフの幅を設定
document.getElementById('chart').style.height = "200px"; //htmlと同じ高さを設定

var myChart = new Chart(document.getElementById('chart').getContext('2d'), {
    type: 'bar',
    data: {
      labels: ['a', 'b', 'c', 'd', 'e'],
        datasets: [{
            label: 'sample data',
            data: data,
        }]
    },
    options: {
        responsive: false, //trueにすると画面の幅に合わせて作図してしまう
    }
});
```
データ当たりの幅をまず設定して，そこからグラフ全体の幅を計算しています．
これによりデータごとの描画サイズを固定することができます．

## 完成
以上のコードで横スクロール可能な図を作成できると思います．


## 参考
https://stackoverflow.com/questions/39473991/how-to-make-a-chart-js-bar-chart-scrollable
https://stackoverrun.com/ja/q/10874652

これらを参考にしましたが，自分の環境ではうまくいかなかったので修正しています．
色んな言語で標準入力の値を取得する

thx @sdkei @htsign 

# なぜやるのか

こういう系の記事はさぞQiitaに溢れているんだろうなと思ったら全然なかったので、備忘録としても役に立つので書いておきます。

GitHubのリポジトリは[こちら](https://github.com/kota-yata/stdin-in-various-languages)

# 基準となるInput
予測不能な複数行の入力を取得し、一行ずつ配列に格納するコードのテンプレートを様々な言語で書いています。

例えば

```
Hello
World
```

かもしれないし、

```
How
are
you?
```

かもしれないというような、何行入力があるかわからないけど全行とりあえず配列に格納したい！という時に便利です。
ちなみに各コードの出力は基本的には

```
["Hello","World"]
```

の形で出力されるように書いていますがいくつかの言語はそうならない場合があります。ただどの言語でも```array[0]```もしくは```array(0)```を指定すれば```"Hello"```が返ってくるようにはなっているのでご安心ください。

# 本題
## JavaScript
```javascript
function Main(input) {
  let lines = input.split("\n");
  lines.pop();
  console.log(lines);
}
Main(require("fs").readFileSync("/dev/stdin", "utf8"));
//=>[ 'Hello', 'World' ]
```
## Python3
```python
import sys

lines = [line.rstrip() for line in sys.stdin]
print(lines)
#=> ['Hello', 'World']
```
## Ruby
```ruby
lines = ARGF.map &:chomp
p lines
#=> ["Hello", "World"]
```
## PHP
```php
<?php
while ($line = fgets(STDIN)) {
  $lines[] = trim($line);
}
foreach($lines as $array){
  echo "$array\n";
}
?>
#=> Hello
#=> World
```
## Swift
```swift
let lines = Array(AnyIterator { readLine() })
print(lines)
#=> ["Hello", "World"]
```
## Java
```java
import java.util.List;
import java.util.Scanner;
import java.util.stream.Collectors;
import java.util.stream.Stream;

class StdIn {
    public static void main(String[] args) {
        try (var scanner = new Scanner(System.in)) {
            List<String> lines = Stream.generate(() -> scanner)
                .takeWhile(Scanner::hasNextLine)
                .map(Scanner::nextLine)
                .collect(Collectors.toList());
            System.out.println(lines);
        }
    }
}ello, World]
```
## C＃
```c#
using System;
using System.Collections.Generic;
public class Hello
{
  public static void Main()
  {
    string line;
    var array = new List<string>();
    while ((line = Console.ReadLine()) != null)
    {
      array.Add(line);
    }
    Console.WriteLine(array);
  }
}
//=> System.Collections.Generic.List`1[System.String]
```
## Kotlin
```kotlin
fun main() {
    val lines = generateSequence { readLine() }.toList()
    println(lines)
}
//=> [Hello, World]
```

## Scala
```scala
object Main extends App {
  val lines = io.Source.stdin.getLines().toSeq
  println(lines)
}
//=> ListBuffer(Hello, World)
```
## Perl
```perl
my @lines = map { chomp $_; $_ } <>;
print join ',', @lines;
#=> Hello,World
```
## Go
```go
package main
import (
  "fmt"
	"os"
	"bufio"
	"strings"
)
func main() {
	array := []string{}
	s := bufio.NewScanner(os.Stdin)
    for s.Scan() {
				array = append(array, s.Text())
    }
    fmt.Printf("%s\n",strings.Join(array,","))
}
//=> Hello,World
```
## C++
```c++
#include <iostream>
#include <vector>
using namespace std;
int main(void)
{
  string str;
  vector<string> array;
  while (std::cin)
  {
    getline(cin, str);
    array.push_back(str);
  }
  for (auto lines : array)
  {
    cout << lines << endl;
  }
  return 0;
}
#=> Hello
#=> World
#=> (空白)
```

# おわりに
後からコメントをいただいてmap系のイテレートは有能だということがわかりました。筆者はJavaScript以外ほとんど触ったことがないので冗長なコードがあればどしどしコメントを送ってください。
SQL Serverでfloat型がreal型に変換される仕様について

## 概要

同僚に相談された、下記のMicrosoft SQL製品にて、float型がreal型に変換されてしまうという仕様を共有します。

-   Microsoft SQL Server 
-   Azure SQL Database
-   Azure Synapse Analytics(SQL Pool)（旧名：SQL Data Warehouse）



相談内容としては、float型がreal型に変換されてしまって困っているといものでした。ドキュメントにて下記の記載があり、実際にテーブルを作成して確認しました。

>   **real** の ISO シノニムは、 **float (24)** です。

引用元：[float 型と real 型](https://docs.microsoft.com/ja-jp/sql/t-sql/data-types/float-and-real-transact-sql?view=sql-server-ver15)



実行結果としては、float型のnが1～24の場合はreal型に変換されていることが確認できました。



## 確認手順

Azure Synapse Analytics(SQL Pool)にて、確認した手順を共有します。

1.  float型のCreate文を実行。

```sql
CREATE TABLE dbo.test_float_to_real
(
    float  float NULL
   ,float_1  float(1) NULL
   ,float_2  float(2) NULL
   ,float_3  float(3) NULL
   ,float_4  float(4) NULL
   ,float_5  float(5) NULL
   ,float_6  float(6) NULL
   ,float_7  float(7) NULL
   ,float_8  float(8) NULL
   ,float_9  float(9) NULL
   ,float_10 float(10) NULL
   ,float_11 float(11) NULL
   ,float_12 float(12) NULL
   ,float_13 float(13) NULL
   ,float_14 float(14) NULL
   ,float_15 float(15) NULL
   ,float_16 float(16) NULL
   ,float_17 float(17) NULL
   ,float_18 float(18) NULL
   ,float_19 float(19) NULL
   ,float_20 float(20) NULL
   ,float_21 float(21) NULL
   ,float_22 float(22) NULL
   ,float_23 float(23) NULL
   ,float_24 float(24) NULL
   ,float_25 float(25) NULL
   ,float_26 float(26) NULL
   ,float_27 float(27) NULL
);
```



2 .  作成したテーブルのDDLを確認。SSMSから、テーブルをスクリプト化しました。

```sql
/****** Object:  Table [dbo].[test_float_to_real]    Script Date: 2020/06/04 16:34:43 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[test_float_to_real]
(
	[float] [float] NULL,
	[float_1] [real] NULL,
	[float_2] [real] NULL,
	[float_3] [real] NULL,
	[float_4] [real] NULL,
	[float_5] [real] NULL,
	[float_6] [real] NULL,
	[float_7] [real] NULL,
	[float_8] [real] NULL,
	[float_9] [real] NULL,
	[float_10] [real] NULL,
	[float_11] [real] NULL,
	[float_12] [real] NULL,
	[float_13] [real] NULL,
	[float_14] [real] NULL,
	[float_15] [real] NULL,
	[float_16] [real] NULL,
	[float_17] [real] NULL,
	[float_18] [real] NULL,
	[float_19] [real] NULL,
	[float_20] [real] NULL,
	[float_21] [real] NULL,
	[float_22] [real] NULL,
	[float_23] [real] NULL,
	[float_24] [real] NULL,
	[float_25] [float] NULL,
	[float_26] [float] NULL,
	[float_27] [float] NULL
)
WITH
(
	DISTRIBUTION = ROUND_ROBIN,
	CLUSTERED COLUMNSTORE INDEX
)
GO
```
AWS Glue コンソールを使用してワークフローのジョブを変更する

# はじめに
以下のようなワークフローがあります
![Screenshot_2020-06-04 AWS Glue Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22736/d9dfc57b-2fcd-d277-801e-7951e4f976b1.png)
このうち、`job02`を`job22`に変更してみます。

# ジョブの変更
１）変更対象となる旧ジョブ（`job02`）のトリガー元（`trigger01`）を選択、表示された点線の矩形をクリック
![Screenshot_2020-06-04 AWS Glue Console(1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22736/f1e074e6-f564-d219-7284-948998bbe6f1.png)
２）ダイアログが起動されるので、変更後の新ジョブ（`job22`）を選択して「追加」ボタンを押下
![Screenshot_2020-06-04 AWS Glue Console(2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22736/164896f4-36ad-ae7f-014a-e4c608a4d348.png)
これで`trigger01`から`job22`への処理フローが新たに追加されました
![Screenshot_2020-06-04 AWS Glue Console(3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22736/daa98589-a43f-c5bf-d5d2-1767bfc06231.png)
３）続いて旧ジョブ（`job02`）の呼び出し先となるトリガー（`trigger02`）を選択し、「アクション」>「監視するジョブ/クローラを追加」をクリック
![Screenshot_2020-06-04 AWS Glue Console(5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22736/cc200ade-e9b0-ed56-b6b9-16b371c39dd4.png)
４）ダイアログが起動されるので、新ジョブ（`job22`）を選択して「追加」ボタンを押下
![Screenshot_2020-06-04 AWS Glue Console(6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22736/3a109dc7-ac6f-330c-c51e-c707f21cf9a9.png)
これで`job22`から`trigger02`への処理フローが新たに追加されました
![Screenshot_2020-06-04 AWS Glue Console(7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22736/c363b8f7-ddfc-cff2-cbd6-430686d02fe4.png)
５）あとは不要となる`job02`から`trigger02`への処理（矢印）を選択して「削除」ボタンを押下
![Screenshot_2020-06-04 AWS Glue Console(8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22736/3e93ff09-713b-e5de-b765-c75d2d1f4a78.png)
６）同様に`trigger01`から`job02`への処理（矢印）を選択して「削除」ボタンを押下
![Screenshot_2020-06-04 AWS Glue Console(9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22736/9fb1e55e-5cf9-426d-49b8-31c795f60a9f.png)
これで無事`job02`を`job22`に変更したワークフローが完成しました
![Screenshot_2020-06-04 AWS Glue Console(10).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22736/20e85e5e-6939-9b63-96dd-06563741bf38.png)
エラーメッセージに対するテスト: Railsチュートリアル備忘録 - 7章

Railsチュートリアル 6.0の7章
7.3.4　失敗時のテスト
最後の演習で躓いた記録

##演習内容
"リスト 7.20で実装したエラーメッセージに対するテストを書いてみてください。どのくらい細かくテストするかはお任せします。リスト 7.25にテンプレートを用意しておいたので、参考にしてください。"

##解答
assert_selectを使用して、
HTML構造に不適切なログイン時固有の要素が存在するかどうかを調べるとよい。

直前に作成したパーシャルの内容
（この内容がnew.html.erbに挿入されている）

```ruby:/sample_app/app/views/shared/_error_messages.html.erb
<% if @user.errors.any? %>
  <div id="error_explanation">
    <div class="alert alert-danger">
      The form contains <%= pluralize(@user.errors.count, "error") %>.
    </div>
    <ul>
    <% @user.errors.full_messages.each do |msg| %>
      <li><%= msg %></li>
    <% end %>
    </ul>
  </div>
<% end %>
```

@user.errorsが存在する場合に、
特定のclass("alert" & "alert-danger"), id("error_explanation")を含むdivタグが展開される

ブラウザに渡される最終的なHTMLにこれが含まれていれば良いわけなので、
assert_select 'セレクタ（class: div.class, id: div#id）'
でそれを確認する

完成形は以下

```ruby:/sample_app/test/integration/users_signup_test.rb
require 'test_helper'

class UsersSignupTest < ActionDispatch::IntegrationTest

  test "invalid signup information" do
    assert_no_difference 'User.count' do
      post users_path, params: { user: { name: "",
                                         email: "user@invalid",
                                         password: "foo",
                                         password_confirmation: "bar"} }
    end
    assert_template 'users/new'
    assert_select 'div.alert'
    assert_select 'div.alert-danger'
    assert_select 'div#error_explanation'
  end

end
```

assert_selectで検証している構造を、
Google Chromeのデベロッパーツールで可視的に示すと
<img width="1440" alt="スクリーンショット 2020-06-04 17.50.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649386/e630bf48-bf08-f811-18d0-1edb9037911c.png">

以上です

##わかってないこと（自己学習用）
" "と' 'の使い分け
文字列であることを明示的に示す場合に""が好まれるような気がするが、
セレクタの指定は' '
サクラエディタのマクロで同一画面内で複数回連続Grepする方法

###必要な要件
サクラエディタ 2.2.0.0 以上

##自画面にGrep結果を連続表示
サクラエディタの標準マクロでGrepを記録して再生すると「新規ウィンドウが開いて」そしてその新しいウィンドウでGrepが実行されます。
しかし、往々にして、マクロを実行した自分自身の画面内で複数回のGrepを実行したいときがあります。

サクラエディタには、標準出力にGrep結果を吐き出すオプション(-GOPT=U)が ver 2.2.0.0 で追加されました。
ちなみに2019年9月3日時点でのインストーラー版の最新バージョンは2015年の2.2.0.1です。
これを応用することで、同一画面内で複数回Grepのマクロが実現できます。
なお、何回もサクラエディタを立ち上げる関係で画面がバタバタします。

```JavaScript:sample_grep_macro.js
var sakura = 'C:\\Program Files (x86)\\sakura\\sakura.exe';

var keys = ['検索キー1', '二つ目のキー', '3つ目のキー'];
var file = '*.txt';
var folder = 'C:\\Users\\Username\\Documents\\sample';
var option = 'P2'; // P:行を表示、2:ファイル毎
for(var i = 0; i < keys.length; ++i){
    ExecCommand('"' + sakura + '" -CODE=3 -GREPMODE -GCODE=99 -GOPT=U' +
        option + ' -GKEY="'+ keys[i] +'" -GFILE="' + file +
        '" -GFOLDER="'+ folder +'"', 11);	// 外部コマンド実行
}
```
`-CODE=3`を指定することで、出力をUTF-16(サクラでいうUnicode)にしているところがポイントです。
`ExecCommand`のオプションで0x8を加算して、UTF-16に合わせてあります。
11 = 0x01 + 0x02 + 0x08です。
Grepのオプションについては、ヘルプのコマンドラインオプションを読んでください。
`Grep`マクロとオプションの形式が異なり、いちいち読み替えが面倒ですが、これは我慢するほかありません。
https://sakura-editor.github.io/help/HLP000109.html

SJISではSJISにない文字が文字化けします。
UTF-8は2.3.1.0で修正されるまでExecCommandでの取り込みで文字化けすることが稀にあります。
そのためここではUTF-16を指定しています。
https://sourceforge.net/p/sakura-editor/patchunicode/1077/

##Grep結果をアウトプットにまとめて表示
場合によっては「自分のウィンドウではなく、Grepみたいに新規ウィンドウを立ち上げてそちらでまとめてほしい」という場合もあります。
しかしサクラエディタではマクロから通常他のウィンドウを操作することができません。
その代わりですが`ExecCommand`のオプションを 0x01 + 0x08 = 9 を使うと、アウトプットウィンドウにGrep結果をまとめて貼り付けられます。
今度はアウトプットのヘッダーとフッダーが余分なのでマクロ用オプション 0x40(ヘッダー・フッダー情報を出力しない)を追加しまして、9 + 0x40 = `73`を指定するといいです。
`ActivateWinOutput`がないと2つのサクラエディタを同時に起動しようとして応答なしになる場合があるようなので、追加してあります。

```JavaScript:sample_grep_macro_output.js
var sakura = 'C:\\Program Files (x86)\\sakura\\sakura.exe';

var keys = ['検索キー1', '二つ目のキー', '3つ目のキー'];
var file = '*.txt';
var folder = 'C:\\Users\\Username\\Documents\\sample';
var option = 'P2'; // P:行を表示、2:ファイル毎
ActivateWinOutput();
for(var i = 0; i < keys.length; ++i){
    ExecCommand('"' + sakura + '" -CODE=3 -GREPMODE -GCODE=99 -GOPT=U' +
        option + ' -GKEY="'+ keys[i] +'" -GFILE="' + file +
        '" -GFOLDER="'+ folder +'"', 73);	// 外部コマンド実行
}
ActivateWinOutput();
```

もしオプションや対象フォルダを個別に指定して検索したいなら、必要な分だけ`ExecCommand`を並べてそれぞれ必要な文字列を修正しましょう。

##注意点
`ExecCommand`の引数は、`ExpandParameter`の展開を行うので、検索文字列に`$f`などがあると、置換されてしまいうまくいきません。
`$`は`$$`とエスケープして指定します。

##そもそもの話
もし単純に、複数の単語で、その結果が混ざっていてもいいなら、正規表現で検索したほうが速いです。
`|` を使って`key1|key2|key3`とキーワードを連結して検索すればOKです。
そうすれば、一度に検索できます。
もしくは最近のバージョンであれば、正規表現以外に「単語単位検索」を使うと単語単位でかつ複数の単語を一度にOR検索できます。

Grep対象のファイルの拡張子が複数ある場合は、`*.txt;*.html`のように半角スペースか `,` または `;` で区切れば複数種類指定できます。
除外ファイルは `!` を先頭につけて`!*.log`のようにします。
除外サブフォルダは同様に「ファイル」のところに先頭に`#`をつけて`#.git`のようにします。
それらを並べて合わせて、ファイルで`*.txt *.html #.git #.svn`や`*.* !*.log #.svn`のように指定します。
このように指定を細かくすれば、複数回だったものを1回にまとめることもそれなりにできます。

Grep対象のフォルダが複数に分かれている場合は、`;`で区切って複数指定できます。わざわざ複数回Grepする必要はなくなりました。
Git リモートブランチの一覧を表示する

# 目的

- 毎回若干忘れるのでこの機会にまとめる

# 実施環境

- ハードウェア環境

| 項目 | 情報 |
| --- | --- |
| OS | macOS Catalina(10.15.5) |
| ハードウェア | MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports) |
| プロセッサ | 2 GHz クアッドコアIntel Core i5 |
| メモリ | 32 GB 3733 MHz LPDDR4 |
| グラフィックス | Intel Iris Plus Graphics 1536 MB |

- ソフトウェア環境

| 項目 | 情報 | 備考 |
| --- | --- | --- |
| Git バージョン | 2.26.2 | Homebrewにて導入実施方法はこちら→[Mac ネイティブのGitからHomebrewでインストールしたGitに切り替えた話](https://qiita.com/miriwo/items/68a372ef7bc69d120444) |

# コマンド例

- リモートブランチのブランチ名を出力するコマンドを下記に記載する。

    ```terminal
    $ git branch -r
    ```
- リモート、ローカル問わず全てのブランチ名を出力するコマンドを下記に記載する。

    ```terminal
    $ git branch -a
    ```
【WordPress】ショートコードでurlを動的に生成

WordPressの投稿画面でAdd Quick Tagを使って画像挿入をする際に
リンク先URLを動的に変えたかったので作ってみました。

## 今回の概要
- 会員限定コンテンツがあり、ログイン者にのみリンク先のコンテンツを見せるようにしたい</li>
- ログインしていなければ会員登録画面へ
- 投稿記事/固定ページ中にはphp記述が書けない<br>
(⇒プラグイン使えば出来るけど使いたくない)
- 登録する画像が多いのでいちいちaﾀｸﾞでﾌﾙﾊﾟｽurlなんて書きたくない<br>
そんな理由で作ったのがこちら。

```php:functions.php

function get_url_shortcode($atts) :string {
    // set default value
    $baseUrl = "https://hogehoge.com/";
    $pairs = ['url' => ""];
    $atts  = shortcode_atts($pairs, $atts);

    // trim string
    $url = preg_replace("/( |　)/", "", $atts['url']);

    if( is_user_logged_in() ){
        if(!($url === "")) {
            return $baseUrl.$url;
        }
        return $baseUrl;
    }else{
        return $baseUrl.'regist/';
    }
    return $baseUrl;
}
add_shortcode('getUrl', 'get_url_shortcode');
```

```shortcode:shortcode
[getUrl]
// もしくは
[getUrl url='hoge']
```

## 【解説とか】

・**\$baseUrl**でサイトのURLを設定してます

・**short_codeatts関数**でショートコードの初期値を設定

**shortcode_atts(\$pairs , \$atts)**
**\$pairs** : ショートコードで使用する<strong>全ての属性名とデフォルト値</strong>
**\$atts** : ショートコードの属性

これで、ショートコードが引数を持ってなかったとしても大丈夫


もしユーザーがログインしていれば、ショートコードの引数(url='hoge')で設定したUrlが返ります
(https://hogehoge.com/hoge/)
ログインしていなければ、会員登録画面のurlが返ります(ここでは例としてhttps://hogehoge.com/regist/)

ショートコードに引数を持たせてなかった場合は、
ログインしていなければ変わらず会員登録画面のurl、していれば\$baseUrlで設定したurlが返ります


こういうurl生成のショートコードは色々応用効きそうだし、いろんなところで使えそう。

あ、トレイリングスラッシュとかは環境に応じて変えないとですね。
入ってたら表示されない、入ってないと表示されるとか環境の違いであるので。。。
wordpress URL判定で分岐→出力するためのちょっとしたお話

初歩的内容ですがおさらいとしてメモ。
別に、wordpressに関して話ではなくPHP全般のお話です。
今回は、マルチサイトのサブディレクトリ型を例に取り上げます。

# こんな時
例えば、マルチサイトで多言語サイトを構築する際に、言語ごとのテーマは同じだが、サイトごとに出力を分岐したいことがあると思います。

ヘッダーH1タグのロゴにサイトホームをリンク設定する際には、`echo home_url();`としたら、自動で各サイトのホームリンクを取得してくれるのですが、
仮に、h1ロゴの横にテキストがあったとして、各言語ごとに出力を変えなければいけないとします。

# 解決策1
各言語サイトにカスタムフィールドを設けて、それぞれ出力させる。
複雑な出力だったらこれでいいのでしょうが、短いテキストのみ出力の場合、フィールドをつくったり複製したり（修正したり）と管理上面倒なところがあります。

# 解決策2
本題ははこちらです。
結論から言いますと`explode('', '')`を使用します。
文字列を分割して、分割したものを配列にします。
なので、配列から判定に欲しい値を取ってきます。

以下、`domain.jp/jp/` `domain.jp/en/`の2サイトで分岐したいとします。

```php:test.php
// 現在のURLを取得して、「/」ごとに分割します。
$urls = explode('/', $_SERVER['REQUEST_URI']);

// [0]には、ドメインが入ります。
if ($urls[1] === 'jp') {
echo '日本語サイト';
} else {
echo '外国語サイト';
}
```

あとは、関数化しておくと便利かも〜

```php:test2.php
function is_site_page($lang)
{
  $urls = explode('/', $_SERVER['REQUEST_URI']);
  if ($urls[1] === $lang) {
    return true;
  } else {
    return false;
  }
}
```

どんない切れ味のいいハサミを持っていても、ハサミの使い道をしらなければ意味がありませんね。
プログラミングってそういうことなのかも〜
【Rails】bundle install と bundle update の違いとは？

#bundle install と bundle update の違い
この2つについて理解する前に必要な事前知識、Gemfile、Gemfile.lock、そしてBundlerとは何か？について書いていこうと思います。

##Bundlerとは？
gemを管理するgem。
Bundlerのおかげで<code>bundle install</code>と<code>bundle update</code>を使うことができる。

##Gemfileとは？
gemをインストールするための「設計図」のようなイメージ。

##Gemfile.lockとは？
実際にgemをインストールした後の「結果図」のようなイメージ。
gem同士が関連しあっていることが多いため、Gemfileに書いてあるgemの他にも必要なgemが生じる。
その場合、Bundlerが自動で必要なgemをインストールし、Gemfile.lockに記述してくれる。

##なぜGemfile.lockが必要なのか？
Gemfileは設計図。インストールするgemしか記述されていない。
また、gemに関するgemも記述されてなく、本番環境と開発環境でインストールされるgemのバージョンも統一することができない。
しかし、Gemfile.lockを使うことで、どの環境でも同じgem、gemのバージョンを使用できるようになる。

##bundle install と bundle update について
では、事前知識を得ることができたので、本題に移る。

###bundle install
Gemfile.lockをもとにgemをインストールする。
この時、Gemfile.lockに記述されていない且つ、Gemfileに記述されているgemがある場合、そのgemとそのgemに関連するgemをインストール後、Gemfile.lockをインストールする。

###bundle update
Gemfileをもとにgemをインストールする。
その後、Gemfile.lockを更新する。

##2つのコマンドの使い分けについて
<code>bundle install</code> →　新しい環境や、Gemfileに新しくgemを記述した時に使用。
<code>bundle update</code> →　gemのバージョンを更新する時に使用。(bundle install ではGemfile.lockにあるgemについては更新しないため)

##まとめ
・<code>bundle install</code>はGemfile.lockを参照してgemをインストールする。また、
　Gemfile.lockが存在しない場合、Gemfileをもとにgemをインストールした後、Gemfile.lockを作成する。
・<code>bundle update</code>はGemfile.lockを無視し、Gemfileをもとにgemをインストール後、Gemfile.lockを更新する。
・Gemfile.lockを無視するため、<code>bundle install</code>とは異なり、gem同士の依存関係(バージョン等)が刷新される。

なるほど。基本的に実開発中はbundle installを使うことが多そうだな。
bundle updateを使う時は慎重に使おう。
php incファイル設置方（備忘）

# 必要な箇所を切り出す

- < header >～< /header >を切り出して別ファイルに保存
- ⇒ /common/include/header.php

# ①パスの読込み
- 読み出し箇所に、以下を記述。

```php
<?php include('ファイルのパス'); ?>
```
例えば、2階層上のcommon配下に設置。

```php
<?php include('../../common/include/header.php'); ?>
```

- **・・・が、このままだと、同じ階層のhtmlにしか設置できない。**
 （違う階層から読み出した際に、パス（../../）が変わってしまう）。。。

# ②ファイルパスの関数化
### 設置側のhtmlに、rootからの階層を認識させてやる。


- htmlファイル冒頭に、以下を記述。

```php
<?php
    $path = "../../";
?>
```
　または、

```php

<?php
    $path = "../";
?>
```
　等々、そのhtmlの、ルートからのパスを設定。

※これをしておくと、ほかのrelで読み込むcss/js等のパスの記述についても、`<?=$path?>` で簡素化することもできる。　

### 関数化したインクルードファイルを読み込み。
```php
<?php include($path . 'common/include/header.php'); ?>
```

以上。
①と②はセットで運用必至。

これで、いろんな階層のhtmlファイルに、共通パーツを設置することが可能に！
MariaDB　パスワードを忘れてしまいログインできなくなった　（EC2を用いた本番環境編）

# 今回の流れ
本番環境でMariaDBを使いパスワードを忘れてしまった際に、再設定するために流れです。

	1.	Mysqlを停止します。
	2.	ディストリビューションに応じて、sudo vim /etc/my.cnfまたは/etc/mysql/my.cnf
	3.	[mysqld]のしたにskip-grant-tablesを追加
	4.	Mysqlを再起動します。
	5.	これで、以下のコマンドを使用してmysqlにログインできるはずです。 mysql -u root -p
	6.	新しいパスワードを設定 ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPassword';
	7.	mysql> flush privileges;
	8.	/etc/my.cnfに戻って、skip-grant-tables を削除します。
	9.	Mysqlを再起動します。
	10.	これで、新しいパスワードでログインできるようになります mysql -u root -p
### Mysqlを停止します。
```
[ec2-user@ip-○○○-○○-○○-○ ~]$ sudo systemctl stop mariadb
```
### 本番環境(ec2)の場所で、vim 　/etc/my.cnfまたは/etc/mysql/my.cnfを入力する。
 ```
[ec2-user@ip-○○○-○○-○○-○ ~]$ sudo vim 　/etc/my.cnf
```
ログインをする際にパスワードを聞かれない様にするために、
以下の画像の様に[mysqld]と書かれている下にskip-grant-tablesを入力する。
<img width="554" alt="スクリーンショット 2020-06-04 17.44.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596221/f5298d79-51e6-d056-95bf-3a3511ab86e5.png">
### Mysqlを再起動します。
 ```
[ec2-user@ip-○○○-○○-○○-○ ~]$ sudo systemctl restart mariadb
```
### ログインする
```
[ec2-user@ip-○○○-○○-○○-○ ~]$ mysql -u root -p
Entrを押すとログインできます。
```
### 新しいパスワードを設定する
```
MariaDB > update user set password=PASSWORD("設定したいパスワード") where User='root';
```
### 権限設定の反映
```
MariaDB > flush privileges;

→exitで一旦出る
MariaDB >　exit
```
### /etc/my.cnfに戻って、skip-grant-tables を削除します。
このままだとMariaDBにログインした際に誰でもログインできてしまうので削除しておきましょう。

```
[ec2-user@ip-○○○-○○-○○-○ ~]$ vim 　/etc/my.cnf

[mysqld]
skip-grant-tables　←削除
```
### MariaDBを再起動しましょう！
 ```
[ec2-user@ip-○○○-○○-○○-○ ~]$ sudo systemctl restart mariadb
```
### これで、新しいパスワードでログインできるようになります
設定できたパスワードでログインしてみましょう！

```
[ec2-user@ip-○○○-○○-○○-○ ~]$ mysql -u root -p
Enter password: 
```

## まとめ
自分もやってみて改めて思ったけどデータベースの設定など難しいなぁ、、、
パスワードの設定ミスにはくれぐれも気をつけましょう。
mackerelでRaspberryPiを監視してみた

##RaspberryPiをmackerelで監視できるようにしてみた。
自宅でサーバーとして使用していた、RaspberryPiを今まで監視できていなかったので、
mackerelエージェントをインストールし、監視できるようになりました。

#設定方法
まずは、githubのリポジトリからmackerelエージェントをダウンロードする

```
wget https://github.com/mackerelio/mackerel-agent/releases/download/v0.68.0/mackerel-agent_0.68.0-1.systemd_armhf.deb
```

次に、エージェントをエンストールする

```
sudo apt install ./mackerel-agent_0.68.0-1.systemd_armhf.deb
```

APIキーを登録し監視できるようにする。

```
wget -q -O - https://mackerel.io/file/script/setup-all-apt-v2.sh | MACKEREL_APIKEY='＊＊＊' sh
```
＊＊＊の部分にAPIキーを入れる。

##APIキーの取得方法
オーガニジェーション詳細ページでAPIキータブに入る。
![mackerel-api-1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641254/66770f02-edd0-5f11-8479-7ae18434f5cf.jpeg)
新しいAPIキーを追加をクリック
![mackerel-api-2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641254/4b1e45a6-22a8-b27c-c59e-45a66d297190.jpeg)
名前とわかりやすいメモを入力→作成
![mackerel-api-3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641254/23107b72-7b8a-d611-51c4-4ef94fa7d7be.jpeg)

以上の操作をすれば、mackerelでRaspberryPiを監視できる
【Laravel】ミューテタを一時的に無効にする。

メモとして残します。

以前[ミューテタについて](https://qiita.com/yucatio/items/e980550814f66b3450dd)の記事を投稿しました。
非常に便利なミューテタですが時には、一時的に無効にして生の値をセットしてほしいということもあります。
いろいろ調べてはみましたが、どうやらEloquentORMで一時的にミューテタを無効にするメソッドは用意されていないようです。

そのため、疑似的にミューテタを無効にする方法を記述します。

#■やり方
[ミューテタについて](https://qiita.com/yucatio/items/e980550814f66b3450dd)の例に付け加えます。

```php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Hoge extends Model
{
    public $isIgnoreMutator = false;
    public function setカラム名Attribute($value)
    {
        //isIgnoreMutatorをTrueにすれば値をそのままセット
        if( $this->isIgnoreMutator ){
            $this->attributes['カラム名'] = $value;
        }else{
            $this->attributes['カラム名'] = $value ?? 'hogehoge';
        }
    }
}
```
コントローラ等で生成したこのモデルのオブジェクトの
`メンバ変数$isIgnoreMutator`にtrueをセットすることで、以降の処理でfillだろうが、なんだろうが、値が、そのままセットされるようになります。

#■おわりに
見ての通り、ミューテタそのものは無効になっておりません(;^ω^)
あくまで疑似的に無効化しているだけのため、少し不格好です。。。
ZABBIX + Fluentd + mongo ZABBIXのイベントログをMongoDBに入れる

# やりたいこと

他システムにZABBIXの警報ログを参照させたい。
でも、いちいちZABBIX APIを叩くのは嫌。
じゃあ、警報のログをMongoDBなり、ElasticSearchなりに格納して、他システムはそれを参照したらWin-Winじゃん、というアプローチ。

# 前提条件

- ZABBIX 4.0+ (realtime exportが使えないから)


# 試した環境

- CentOS 8.1.1911
- ZABBIX 5.0
- Fluentd 1.10.2
- MongoDB 4.2.7

# ZABBIXの設定

```conf:/etc/zabbix/zabbix_server.conf

### Option: ExportDir
#       Directory for real time export of events, history and trends in newline delimited JSON format.
#       If set, enables real time export.
#
# Mandatory: no
# Default:
ExportDir=/path/to/dir/ #<--なんか適当なディレクトリ
```

設定を読み込むため再起動

```shell
systemctl restart zabbix-server
```

`ExportDir`で指定したディレクトリの配下に色々Jsonファイルが出来ているはず。

# Fluentd

ruby全然分からないのでツッコミ歓迎。。

## プラグインを入れる

その前に必要なものがまるで無かったので。。

```
yum install -y ruby ruby-devel gcc rpm-build
```

```
td-agent-gem install fluent-plugin-mongo
```

**余談**
↓これだとプラグインを認識してくれなかった。なんで？？

```
gem install fluent-plugin-mongo
```

## コンフィグ修正

```conf:/etc/td-agent/td-agent.conf
<source>
  @type tail
  path /path/to/dir/*
  # 無視するファイル
  exclude_path ["/path/to/dir/history-*", "/path/to/dir/trends-*"]
  # ファイルを読込ポジションを保持するファイル
  pos_file /var/lib/td-agent/ps/zabbix-problems-history-syncer.ndjson.pos
  <parse>
    @type json
  </parse>
  tag mongo.zabbix.problems
</source>

<match mongo.zabbix.**>
  # plugin type
  @type mongo
  # mongodb db + collection
  database zabbix
  collection problems

  # mongodb host + port
  host localhost
  port 27017
  # interval
  <buffer>
    #// MongoDBに入れるまで2秒保持する↓
    # flush_interval 2s
    #// それだとちょっと遅いので、即書き込みするようにする
    flush_mode immediate
  </buffer>
</match>
```

できたら、再起動

```
systemctl restart td-agent
```

# 確認

```
mongo zabbix
> db["problems"].find();
{ "_id" : ObjectId("5ed89f75c9d8c969150e8a09"), "clock" : 1591254836, "ns" : 969998197, "value" : 1, "eventid" : 155, "name" : "Zabbix agent is not available (for 3m)", "hosts" : [ { "host" : "hoge host", "name" : "hoge host" } ], "groups" : [ "Linux servers" ], "tags" : [ ], "time" : ISODate("2020-06-04T07:13:57.542Z") }
{ "_id" : ObjectId("5ed8a0dac9d8c96e9ba1e773"), "clock" : 1591255256, "ns" : 198390872, "value" : 0, "eventid" : 159, "p_eventid" : 155, "time" : ISODate("2020-06-04T07:20:56.963Z") }
```

でけた。


# さいごに

今回はイベントを詰め込んだけど、ヒストリデータもJSONとして吐き出しているので、そっちの方が需要があるかもしれない。
ZABBIX 5.0からElasticSearchにヒストリデータを送れるし、そっちの方が設定は簡単そうだけど。
【Maven】dependencyのバージョンをSpring系の内部バージョンに合わせる【SpringBoot】

# TL;DR
- `${ユーザー}/.m2/repository/org/springframework/boot/spring-boot-dependencies/${Springのバージョン}.RELEASE/spring-boot-dependencies-${Springのバージョン}.RELEASE.pom`に定義されている`properties`はプロジェクトの`pom`からも参照できる
  - （正確には、このような`pom`に書かれている`properties`にアクセスできる）
- この`properties`を元にバージョンを設定することで、`dependency`のバージョンを`SpringBoot`のバージョンに合わせることができる
  - アップデートが楽になる
  - ライブラリの相性問題が発生しにくくなる

# やること
`spring-boot-starter`系の依存にモジュールを加える場合などで、手動で`spring-boot-starter`内の依存に合わせてバージョンを管理するのは手間になったりします。
どうせなら色々なライブラリのバージョンが`Spring`のバージョンに合わせて管理されている方が諸々楽なので、そのやり方を書きます。

# やり方
`${ユーザー}/.m2/repository/org/springframework/boot/spring-boot-dependencies/${Springのバージョン}.RELEASE/spring-boot-dependencies-${Springのバージョン}.RELEASE.pom`内の`properties`の情報を用いることでできます。

```xml:spring-boot-dependencies-2.2.6.RELEASE.pomから抜粋
  ...
  <properties>
    <activemq.version>5.15.12</activemq.version>
    <antlr2.version>2.7.7</antlr2.version>
    <appengine-sdk.version>1.9.79</appengine-sdk.version>
    <artemis.version>2.10.1</artemis.version>
    <aspectj.version>1.9.5</aspectj.version>
    <assertj.version>3.13.2</assertj.version>
    ...
```

## Jacksonの例

`Jackson`を例にやってみます。
`spring-boot-dependencies-2.2.6.RELEASE.pom`では`jackson.version`として以下のように定義されています。

```xml:spring-boot-dependencies-2.2.6.RELEASE.pomから抜粋
    <jackson.version>2.10.3</jackson.version>
    <jackson-bom.version>${jackson.version}</jackson-bom.version>
```

これをプロジェクトの`pom`で導入すると以下のように書けます。
`${jackson.version}`として変数を参照しています。

```xml:pom.xml
        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-json -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-json</artifactId>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.module/jackson-module-kotlin -->
        <dependency>
            <groupId>com.fasterxml.jackson.module</groupId>
            <artifactId>jackson-module-kotlin</artifactId>
            <version>${jackson.version}</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.dataformat/jackson-dataformat-csv -->
        <dependency>
            <groupId>com.fasterxml.jackson.dataformat</groupId>
            <artifactId>jackson-dataformat-csv</artifactId>
            <version>${jackson.version}</version>
        </dependency>
```

## ideaの場合
`Intellij idea`の場合、変数に対する補完が効き、定義に飛ぶこともできます。
これによって効率的に目的の変数を探すことができるでしょう。

![スクリーンショット 2020-06-04 17.25.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280230/a2060064-0730-7137-c485-0bae6450f53d.png)
Unity 上のロボットをマイコンシミュレータと同期してデバッグする！

#概要
[「TOPPERS/箱庭デモ ETロボコンシミュレータ」](https://qiita.com/kanetugu2018/items/0e521f4779cd680dab18)で，ETロボコン競技者向けのシミュレータを開発してきました．

ですが，現状のシミュレータ，乗り越えるべきチャレンジングな課題が２つあります．

1. PCスペックが低いとシミュレーションが成り立たない．
2. マイコンシミュレータ(athrill)のデバッグと同期してUnity側が停止してくれない．

この問題，箱庭WGで仕組み検討している時間同期機構を拡充することで一挙に解決できないかと模索していましたが，意外に簡単に解決できましたので，情報共有します．

なお，箱庭WGで検討中の時間同期の仕組みについては，6/12(金)に開催さ入れる[TOPPERSカンファレンス2020](https://www.toppers.jp/conference2020.html)の箱庭WGセッションでオンライン説明しますので，興味のある方はぜひご参加ください！

#この問題をどう見るか(what)
箱庭WGで開発してきた ETロボコン向けシミュレータ，Unityとマイコンシミュレータ時間同期機構，実は前提とする条件があります．

* 前提条件
 * マイコンシミュレータ(athrill)のシミュレーション時間速度はUnityのシミュレーション時間に比べて十分早いこと．

* 時間同期方法
 * この条件を前提として，athrillは，Unity側のシミュレーション時間を見て，自分のシミュレーション時間がUnityよりも進んでいることを検出した場合，athrillのシミュレーション時間の進む速度を遅くすることで，Unity側と時間同期をはかります．

こうやっておけば，athrill側で勝手に時間同期が行われるのですが，PCスペックが低い場合やathrill上で動作するアプリケーションの処理負荷が高い場合は，前提条件が崩れてしまい，時間同期できなくなってしまいます．

自分は，マイコンシミュレータ開発者だったので，athrill側の同期機構ばかりに注力していたのが問題の根源でした．前提をとっぱらって，Unity側にも時間同期の仕組みを入れれば，いろんな問題が一挙に解決するだろうと思い至ったわけです．

#どうやって解決に導くべきか(how)
やりたいこと(what)は以下です．

1. PCスペックが低いとシミュレーションが成り立たない問題を解決したい．
2. マイコンシミュレータ(athrill)のデバッグと同期してUnity側が停止しさせる．

その解決方法は，先述の通り，Unity側にも時間同期機構を入れることで一挙に上記内容の対応ができるようになるはずです．

1 については，athrillのシミュレーション時間をUnity側が見て，自分のシミュレーション時間が進んでいる場合は，そのシミュレーション時間を止めちゃうことで解決できそうです．

2 についても，1の対応が出来てしまえば，athrill側がデバッグ状態に入れば，athrillのシミュレーション時間の進み幅は一気に遅くなる(人が操作する速度)になりますので，こちらも解決できそうです．

というわけで，Unity側のシミュレーション時間を制御する方法を調べてみることにしました．

#Unityのシミュレーション時間
Unityのシミュレーション時間に関しては，Unity公式サイトや先駆者の方の記事が参考になるかともいますので，リンク集のみを以下にまとめます．

* [イベント関数の実行順序](https://docs.unity3d.com/ja/2018.4/Manual/ExecutionOrder.html?fbclid=IwAR3wyDwgJRW4CL8AHNCnvwDoomQLOiXneTEVr8vMNXnzYotMnSzpsRMmVaY)
* [物理シミュレーション時間をマニュアルで進める方法](https://docs.unity3d.com/ScriptReference/Physics.Simulate.html?fbclid=IwAR1F9VFdYYKECZR3jHasKNgM4oXtSPnkhU1GzRLJBV9uvzgI-zK6S2poCU4)
* [先駆者の方](http://tsubakit1.hateblo.jp/entry/2018/05/04/202040)

#対応方法
そういうわけで，Unity側の物理シミュレーション時間は，以下をおさえておけば自分(プログラマ)が制御できることが分かったわけです．

1. Physics.autoSimulation を false にする
2. 物理シミュレーション時間は，Physics.Simulate(Time.fixedDeltaTime)で進める

上記を抑えた上での，Unity側のプログラムの変更ポイントは以下でした．

① Unityのシミュレーション時間とathrillのシミュレーション時間との差分時間の許容最大時間を定義する

```
    public long maxDiffTime = 10000; /* usec */
```

②差分時間が，許容時間内である場合のみ，物理シミュレーション時間を進める

```
            if (this.diff_time > -this.maxDiffTime)
            {
                this.unity_simtime += this.delta_time;
　　　　　　　　　　：
　　　　　　　　　　(ロボット制御処理)
　　　　　　　　　　：
                Physics.Simulate(Time.fixedDeltaTime);
            }
```

上記対応した Unityパッケージを以下で公開しました．

https://github.com/tmori/athrill-sample/blob/master/ev3rt/ev3rt-beta7-release/unity/ev3rt-demo1.1.unitypackage

#デモ
とりあえず，TOPPERS箱庭版ETロボコンシミュレータをデバッグする風景をデモしてみます．

操作内容としては，以下になります．

1. デバッグ状態で，Unityとathrillを停止状態にする．
2. athrillのシミュレーション時間を 10000クロック進めて止める
3. しばらく進めて，強制デバッグモードに遷移させる(qコマンド押下)
4. cpu コマンド，CPUレジスタ状態を確認する．
5. シミュレーションを継続する．

![robocon_debug2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/8ba85800-313b-508d-003f-1c04b2911a77.gif)

これで，やりたかったこと(what)は一通りできたと思えたので，今日はこれまで．
【sublimeText】パッケージインストール/アンインストール方法

#インストール方法
#####1. `Command+Shift+P`を入力
#####2. `Pacage Control:Install Pacages`と入力
入力箇所に`install`と入力して`Pacage Control:Install Pacages`を選択する事もできます。

#####3. 目的のパッケージ名を入力して`Enter`

#アンインストール方法
#####1. `Command+Shift+P`を入力
#####2. `Pacage Control:Remove Pacages`と入力
入力箇所に`remove`と入力して`Pacage Control:Install Pacages`を選択する事もできます。

#####3. 目的のパッケージ名を入力して`Enter`
Box2DをVisual Studio 2019でビルドする方法

ただの個人用メモです。

## 対象のBox2Dバージョン

- Box2D Githubコード masterブランチ
  - [1025f9a10949b963d6311995910bdd04f72dae6c](https://github.com/erincatto/box2d/commit/1025f9a10949b963d6311995910bdd04f72dae6c)

## 必要なもの

- Windows 10
- Visual Studio 2019
    - Community Editionでも良い
    - C++関連のツールをインストール済み
- [CMake](https://cmake.org/)
    - 3.14以上

## Visual Studio用のコンソールを開く

スタートメニューから`x64 Native Tools Command Prompt for VS 2019`を選択する。32bit版のバイナリが欲しい場合は`x86 Native Tools Command Prompt for VS 2019`を選択しても良い。以降このコンソール上で作業を行う。

適当な作業ディレクトリに移動しておく。

## ダウンロード

[GitHub](https://github.com/erincatto/box2d)からソースコードをダウンロードする。

```sh
git clone https://github.com/erincatto/box2d.git
```

## Visual Studio用ソリューションファイル生成

ソースコードには`build.bat`が付いてくるが、これは使用しない。やることは大体同じだが、cmakeにオプションを渡したいので。

```shell
cd box2d
mkdir build
cd build
cmake .. -G "Visual Studio 16 2019"-A x64
```

ここでは64bit版を生成するよう設定した。32bit版が欲しい場合は`x64`を`Win32`に変えるとよい(試していないが)。

## ビルド

ここまでの作業で、`build`ディレクトリ内にソリューションファイル`box2d.sln`が生成されている。これを開いて、IDE上でビルドすればよい。

ただ、それも面倒なので、以下にコマンドライン上でビルドする方法を記す。

```shell
cmake --build . --config release
cmake --build . --config debug
```

上がリリースビルド、下がデバッグビルド。

## 生成されたファイルの回収

残念なことにBox2Dではインストール用のコマンドが用意されていないので、自分で成果物をまとめる必要がある。

スクリプトを作ったので、次回以降はこれを使う。

```bat:build\install.bat
set INSTALLDIR=c:\box2d
mkdir %INSTALLDIR%
mkdir %INSTALLDIR%\bin
mkdir %INSTALLDIR%\include\box2d
mkdir %INSTALLDIR%\lib\Debug
mkdir %INSTALLDIR%\lib\Release
cp testbed\Release\testbed.exe %INSTALLDIR%\bin
cp Release\unit_test.exe %INSTALLDIR%\bin
cp ..\include\box2d\* %INSTALLDIR%\include\box2d
cp src\Debug\* %INSTALLDIR%\lib\Debug
cp src\Release\* %INSTALLDIR%\lib\Release
```
アンケート調査データを分析してみる【第1回：因子分析】

マーケティングにおいて、コンバージョン数などの定量的な数値を分析しただけでは、顧客の本音までは分からないことも多いのではないでしょうか。定量分析だけでは分からない顧客満足度などを調べるため、アンケート調査は多くの企業で行われています。多変量解析などの手法を活用することで、集計したデータからはより多くの示唆を得ることができるでしょう。

本シリーズでは、アンケート調査の分析手法を数回に分けてご紹介したいと思います。1回目は、因子分析の手法を用いて、アンケート質問項目のグループ分けに取り組んでみました。

#因子分析とは？
複数の変数で記述された量的データを分析する方法で、各説明変数に影響している共通因子を抽出します。アンケート調査の場合、質問項目に共通している因子を探し、項目同士をグルーピングすることで、アンケートの構造を把握しやすくなります。

多くの変数を少数の項目に置き換えるという点で、主成分分析との類似性がよく指摘されますが、主成分分析では変数間の相関関係から無相関の合成変数を求めて変数を縮約するのに対し、因子分析は変数間の相関関係から共通因子を抽出し、変数を少数の共通因子にまとめるという違いがあります。

#分析開始
それでは、Rでサンプルデータを実際に分析してみましょう。今回は、以下のサイトより、自動車を購入する際に重視する項目に関するアンケートデータ（n=90）を使用しました。

https://htsuda.net/stats/factor-analysis.html

①まずサンプルデータを読み込みます。自動車を購入する際に考慮する点については、以下の選択肢が与えられており、回答者は1~5のいずれかを選びます。

・Price
・Safety
・Exterior_Looks
・Space_comfort
・Technology
・After_Sales_Service
・Resale_Value
・Fuel_Type
・Fuel_Efficiency
・Color
・Maintenance
・Test_drive
・Product_reviews
・Testimonials

```
data <- read.csv("car.csv")
head(data)
```

![Capture1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265091/1ed45661-cf7a-26fa-06f3-359a6d7972ee.png)

各項目の相関係数を見てみましょう。安全性と快適さには弱い正の相関があるなどの特徴が見て取れます。

```
cor <- cor(data)
```

![Capture2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265091/e1f1d7de-a1e4-67fa-85a4-0132bcf8282e.png)

②因子分析を行うには、質問項目を何分割するかを決める必要があります。決め方にはいくつか種類があり、今回は代表的な手法であるスクリープロットを使います。

手順は以下の通りです。
1. データの相関行列を計算
2. 相関行列の固有値を計算
3. スクリーテストを行い因子数を決める

相関行列はすでに計算しているので、固有値の計算とスクリーテストを行います。

```
eigen <- eigen(cor)$values
plot(eigen, type="b")
```

![Capture3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265091/2ca1c297-773b-9c60-e87b-7ded6cbec81d.png)

グラフの固有値減衰をみると、3で大きく下回っていることが分かります。今回は3つに分類することとします。

③因子数を3として、因子分析を行います。「rotation」は、デフォルトでNoneになっており、因子を解釈しやすくなる方法として、バリマックス回転(varimax)かプロマックス回転(promax)を指定できます。今回は代表的な手法であるバリマックス回転を使用します。

```
factanal <- factanal(x=data,factors=3,rotation="varimax")
print(factanal,　cutoff=0)
```

![Capture5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265091/f1cf29f9-e842-9767-e286-f52f621d22fb.png)


Loadings:に出力された数値を「因子負荷量」といい、各グループと質問項目の関係の強さを示しています。この値が0.4以上なら関係が強いとされることが多いようです。

今回の出力結果からは、質問項目を以下の3グループに分けることができそうです。
グループ1：スペースの快適さ、アフターサービス、燃料のタイプ
グループ2：価格、売却時の価格、燃費、メンテナンス
グループ3：色

グループ2は価格やコストパフォーマンスに関する質問がまとめられていることが分かります。一方で、外観などはどのグループも低めの数値となっており、あまり考慮しないという人が多いのかもしれません。
【tips】Slackでオリジナルスタンプを作る

# 概要
Slackでオリジナルスタンプをつくって使えるようにする。

## オリジナルスタンプを作ってみる。
Slackにはカスタム絵文字という機能があります。
追加方法は簡単で、絵文字をつけるところの左下に絵文字を追加するという箇所があるので、
そこを押し、あとは画像をアップロードしてスタンプ名をつけるだけです。
<img width="383" alt="スクリーンショット 2020-05-22 3.37.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320677/96e0e495-118d-f8fd-7e88-46006da310dd.png">
(引用：[Slackヘルプセンター](https://slack.com/intl/ja-jp/help/articles/206870177-%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E7%B5%B5%E6%96%87%E5%AD%97%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B"Slackヘルプセンター"))

下記サイトの絵文字ジェネレーターとかで無料で絵文字を作れるので、
会社(ドメイン)固有で通じるワードやテキストをまとめてスタンプにできます。
[絵文字ジェネレーター](https://emoji-gen.ninja/ "絵文字ジェネレーター")

例
![あり_がと.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320677/16e7273f-efb3-ad8f-bcc3-578b4432dfe9.png)
FlutterでNNBDを有効化する方法

プロジェクトルートに以下の内容のanalysis_options.yamlを置きます。

```yaml:analysis_options.yaml
analyzer:
  enable-experiment:
    - non-nullable
```

Flutter 1.17.2 / Dart 2.8.3 (stable) で動作を確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21577/6ec33716-21a0-236f-55c6-1adfd20f7689.png)


うまくいかない場合は、以下を試してみてください(主にVSCodeの場合)。

- analysis_options.yamlのファイル名や内容が間違ってないか確認
- flutter channel stable
    - betaではうまくいったりいかなかったり安定しません。
- flutter upgrade
- コマンドパレット > Pub: Get Packages
- コマンドパレット > Flutter: Clean Project
- コマンドパレット > Flutter: Select Device
    - Flutter Daemonが終了してしまっている場合、再起動するかどうかを聞かれるので再起動してください。
- .vscode/settings.json があるなら削除
- ~/Library/Application Support/Code/User/settings.json に以下のパラメータがあるなら削除
    - dart.analyzerAdditionalArgs
    - dart.buildRunnerAdditionalArgs
AWSで割とモダンな技術使う大学生日記(アーカイブにしたい、、そんな機能ないか。。)

## 環境構築を雑に設計
 現在(2020/06/04)で公開しているサイトではAWS EC2のみを使用した設計となっているため、
 それをよりトレンド風に修正していく記事です。
 ちなみに作成したサイトは(スマホ用のUIのため見るときは検証モードでご覧ください)
 http://ec2-18-180-131-224.ap-northeast-1.compute.amazonaws.com/
 です。なるべくお金を掛けたくなかったのでドメインも取得せず、ロードバランサーも通信の暗号化もしておりません。
 Dockerすらも使用していないので、そのあたりからやっていくつもりです。
 あと、日記ですのであまり期待しないでください、よわよわなエンジニアの卵ですので。笑

## サービス内容
 GitHubのレポジトリはhttps://github.com/maaaaakoto35/UniFood
 ですのでよければスターつけてください笑
 
 ReadMeも雑に作成したのでサービス内容を記述していきます。
 当初、京都産業大学の口コミサイト等は調べても出てこなかったので
 当サイトの目的は、学食に対してレビューができる、ということです。
 また、UI設計がスマートフォン向けになっております。

 この記事が完成する頃には拡張機能も追加していくつもりです。
 中身のロジックはものすごく簡単なんですが、ご要望があれば
 当サイトを作成した際のつまづいた点なども投稿しようかなと思っております。

## 参考にしているサイト
 当記事は下記のサイトを参考にしております。
 https://dev.classmethod.jp/articles/aws-eaws-ecs-fetch-run-shell/
 これから記事の追加していくつもりです。(2020/06/04)

 `terraform`を学習する上で参考にしたサイトを記載しておきます。
 https://qiita.com/fukubaka0825/items/68506b1e6644404d6cc0

 また、学習する上であまりにも知識が少なかったので
 「コンテナ時代のWebアプリケーションの作り方」という出典も参考にしました。
 pdfのダウンロード/1000円ですのでぜひ購入してみてください
 

## 設計
 ある方からご教授いただきまして、Infrastrucre as CodeでAWSを設計していきたいと思います。
 なので、今までこの記事をご覧いただいていた方、すみません。
 ~~まぁほぼいないからいいか~~
 別記事でTerraformの入門備忘録を掲載していきますのでお暇があればご覧ください。

 まだ僕は自分でAWSのシステム構成図がスラスラ書けるほどではないので他サイトから拝借した構成図に
 基づいて構築していきます。
 この投稿を通してAWSへの理解が深まればシステム構成図を作成するつもりです。

<img width="694" alt="スクリーンショット 2020-06-17 23.36.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632406/6ff1f0a8-946b-397e-728d-b05f70aae453.png">
<img width="633" alt="スクリーンショット 2020-06-17 23.43.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632406/bf5bf6aa-43ef-3c26-16de-a47ba709c6a1.png">

 下の図がCI/CD用の構成図です。
 大体こんな感じで構築していくつもりですが、
 運用しているサービスにあまり必要ないと感じたらバッサリいくつもりです。
 次の更新から実際に構築していきます。(2020/06/17)

## AWSS3 バケットの作成
 AWSのストレージサービスであるS3を利用します。
 バケットという概念があり、オブジェクトみたいなものです。とりあえず作成し、bucket名をつけてください
 
~~~terraform:ec2.tf
terraform {
    backend "s3" {
        bucket = "バケット名"
        key = "tfstateがあるソースファイル"
        region = "地域"
    }
}
~~~
 このような記述をすることがあると思うのですが、ここで`backend`というものにつまづきました。
 `backend`とはtfstateの参照先であり、これを記述することで
 他ディレクトリを参照した`terraform apply`が可能となります。

## Error: Unsupported block type
~~~terraform:ec2.tf
data "terraform_remote_state" "vpc" {
    backend = "s3"

    config {
        bucket = "バケット名"
        key = "tfstateがあるソースファイル"
        region = "地域"
    }
}
~~~

 terraformアプデ前のソースコードを参照している場合はここで
 `Error: Unsupported block type config`のようなエラーが出てきます。

```terraform
config = {
```
 のように実装すればエラーは回避できます。

 他にもバージョンアップでエラーが出た際は良いQiitaの記事があったので貼っておきます。
 https://qiita.com/KsntsTt/items/d06651df8dcdfe463381
 (2020/06/18追記)

## トラブルシューティング IAMユーザーの参照
 こちらのQiita記事を参考にしました。
 https://qiita.com/akashixi/items/889f43562d16fd2f9367
 (2020/06/27追記)
7 月 17 日より前に LINE WORKS のトーク Bot API のバージョンを 最新にしましょう

LINE WORKS のトーク Bot API にはバージョンがあります。例えばテキスト メッセージ送信の API は v1 が、7 月 17 日にリタイア予定です。

もし、v1 の メッセージ送信 API で稼働している Bot があったら、早めに v2 の API で動作させるよう変更しましょう。

そのままにしてしまうと、Bot が止まります。

##廃止予定の API
こちらを参照しましょう。
https://developers.worksmobile.com/jp/document/10016001?lang=ja

メッセージ送信以外に、Bot 登録や修正などの API においても旧バージョンがリタイア予定です。

##旧バージョンと現行バージョンの違い
Request URL の相違
旧バージョン
https://apis.worksmobile.com/{API ID}/message/sendMessage/v2

現行バージョン
https://apis.worksmobile.com/r/{API ID}/message/v1/bot/{botNo}/message/push

注意: ややこしいのですが、URL に /v1/ が含まれる方が新しいものです

Developer サイトの文書の右上のプルダウンから、各 Version の記事にアクセスできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/cd939443-a295-65ea-4e2a-abb2008f530e.png)

##テナント内での API の利用状況の確認
Developer Console の API Statistics メニューで API 利用状況を確認できます。
https://developers.worksmobile.com/jp/console/api/stats/view
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/7ff8aaaf-0195-0d5e-0d99-b85335600976.png)

こちらで、旧バージョンの API が利用されているか確認してみてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/6e2fdcec-eae6-459f-3340-6fddb06c45c4.png)
プルダウンから API の種類とバージョンを指定できます。
どうしてもbacktraceが必要なあなたへ

任意のその場でインスタンス化したExceptionにbacktrace情報やcauseを付与したい時がある。そんなときはこう。

```ruby
begin
  1/0
rescue => e
  err = raise RuntimeError.new, '任意のエラーを発生させよう！' rescue $!
  p err
  p err.cause
end
# => #<RuntimeError: 任意のエラーを発生させよう！>
# => #<ZeroDivisionError: divided by 0>
```

これが一番早いと思います
Wordのブックマークと相互参照でページ丸ごと別ページへコピー

# Wordの文書の指定個所を別の場所に複写する
１ページ目と２ページ目に同じ内容を書かなければならない。しかし、チェックが抜けたり、数字の入力ミスなどで、同じにならない。
１ページ目を２ページ目に複写する方法を探した。備忘録です。

##相互参照
相互参照定義をすると、相互参照先へ同じ内容を転記される事が分かったので、参照元をブックマークにする事にした。

##ボタンクリックでも複写したい。（任意のタイミングで複写したい）
ボタンを配置して、マクロを登録する

```vba:CommandButton1_Click
Private Sub CommandButton1_Click()
    Dim objStory As Variant
    For Each objStory In ActiveDocument.StoryRanges
         objStory.Fields.Update
    Next
End Sub
```
##印刷時ボタンを非表示にする
調べると、隠し文字設定で出来た。しかし、行内の設定でないと出来なかった。

##Word文書サンプル
サンプルに全部記入したので、忘れないだろう
![wordCopy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646883/dc303b27-1946-2a28-b2bd-8ee30d30cd41.png)

[物忘れ防止 wordCopy.docm ](https://github.com/sugita0301/douzo/blob/master/wordCopy.zip)
https://github.com/sugita0301/douzo