OmniAICreator/Qiita-1.07M huggingface dataset:
マークダウン記法早見表

最近ようやく覚えたのでまとめてみました。

## よく使う記述


### 見出し
1個から6個シャープで見出しを記述する。
```
#### 見出し4
```
#### 見出し4


```
###### 見出し6
```
###### 見出し6

---

### 箇条書き
```
* 1
* 2
* 3
```
* 1
* 2
* 3

```
- 1
  - 1_1
- 2
```
- 1
  - 1_1
- 2

```
1. 番号付き
1. 番号付き
```
1. 番号付き
1. 番号付き

---

### 引用
```
> こんにちは！
>
> Hello!
>> こんにちは！
>> Hello!
```
> こんにちは！
>
> Hello!
>> こんにちは！
>> Hello!

---

### code記法
```
これは `gem install hoge` です
```
これは `gem install hoge` です

---

### 強調
強調（斜体）
```
- normal *italic* normal
- normal _italic_ normal
```
- normal *italic* normal
- normal _italic_ normal


強調（太字）
```
- normal **bold** normal
- normal __bold__ normal
```
- normal **bold** normal
- normal __bold__ normal


強調（太字かつ斜体）
```
- normal ***bold*** normal
- normal ___bold___ normal
```
- normal ***bold*** normal
- normal ___bold___ normal


### 水平線
アンダースコア、アスタリスク、ハイフンなどを3つ以上連続して記述することで水平線を表示します。

```
***
```

***

```
___
```

___


```
---
```

---



---

### リンク先
```
[Google先生](https://www.google.co.jp/)
```
[Google先生](https://www.google.co.jp/)

___


## GitHub Flavored Markdown(GFM)
GitHub Flavored Markdown(GFM)はGitHubの独自仕様を加えたMarkdown記法。

### GFM:リンクテキスト簡易記法
URLは記述するだけで自動的にリンクになるらしいです。
```
https://www.google.co.jp/
```
https://www.google.co.jp/


### GFM:pre記法(バッククォート×3, シンタックスハイライト))

```bash
git checkout -b develop
git checkout -b feature-lesson_02
```

~~~ruby
class Hoge
  def hoge
    print 'hoge'
  end
end
~~~


### GFM:取り消し線
```
~~なんてこった~~
```
~~なんてこった~~


### GFM:表組み
```
|header1|header2|header3|
|:--|--:|:--:|
|align left|align right|align center|
|a|b|c|
```


|header1|header2|header3|
|:--|--:|:--:|
|align left|align right|align center|
|a|b|c|
MySQLでログインができない

##結論
ユーザー名のホストの記載方法が間違っていた
全ホストからのアクセスを許可する記載方法は「%」

【誤用】
test@*
【正解】
test@%

##修正
もとのログイン名を確認

```mysql:
>SELECT user, host FROM mysql.user;
+---------------+-----------+ 
| user          | host      | 
+---------------+-----------+ 
| test          | *         |
```


```mysql;
>drop user 'test'@'*';
>create user 'test'@'%' identified by 'password';
>grant all privileges on *.* to test@'%' identified by 'password';
```

##確認
ユーザーが追加されているか確認

```mysql:
>SELECT user, host FROM mysql.user;
+---------------+-----------+ 
| user          | host      | 
+---------------+-----------+ 
| test          | %         |
```

ログインを確認

```
>mysql -u test -ppassword -h 192.168.1.xxx
```
Unityを使い始めてからのメモ（随時更新）

## [SerializeField]って?
- privateメンバをInspectorに表示させたい時に変数の前につける

## Can't add script component~というエラー
- scriptファイル名をrenameした際にクラス名が変更されないために生じるので、scriptファイル名をrenameした際はクラス名の変更もしないといけない。

##  「bluetoothが繰り返し停止しています。」とOculusの画面にずっと表示され、再起動しても直らない。
- 結局Oculus Quest2を初期化すると直った。

## CommandInvokationFailure: Unable to forward network traffic to device. Please make sure the Android SDK is installed and is properly configured in the Editor.
- Buildはできるが、Build & Runができなかった。
- 1個上でQuest2を初期化するとこのエラーも直っていた。

## 座標系や回転
- Unityは左手系
- X軸の回転であればX軸の矢印の先から原点方向を見ている状態での時計回りが正の回転、Y軸Z軸も同様。

## OVR Grabbable
### SnapOffset
- 手の中心から掴むモノの座標をOffset分だけずらす
- Snap Offsetで指定したオブジェクトのPositionとRotationが適用
- 値はWorld座標系での原点との距離=offsetになる
- offsetを調整するときにSceneビュー上での各軸の方向は関係ない。
- 各軸のどれかに値を入れてみて、この値ではこの位置にオブジェクトが移動するから～といった流れで実験的に調整

## モノに近づくとある一定以上近づけない
- 自分とモノのcollider同士がぶつかっていない？モノのcollider小さくしてみたら？

## Make sure your device is plugged in~
- クイック設定 → 設定 → 開発者 → USB接続確認ダイアログを有効で解決
VBA=IE=NTbJS自分用ノートなので、目障りだったらごめんなさい

VBAでtitleを判定し、iframeのelementをstringに変換して探します。

Option Explicit
Private Declare PtrSafe Function setforegroundwindow Lib "user32" (ByVal hwnd As LongPtr) As Long

    Public flg As Boolean
    Public IE As InternetExplorer
Sub frameup()
    Dim gettitle As String
    Dim getcstitle As String
    Dim HTMLString As String
    
    getcstitle = "Firefox"
    Set IE = getcs(getcstitle)
    HTMLString = getString(IE)
'    Call numlockon
End Sub

Private Function getcs(gettitle As String) As InternetExplorer
    Dim shl As Object
    Dim nowtitle As String
    Dim win As Object
    
    Set shl = CreateObject("Shell.Application")
    For Each win In shl.Windows
        If TypeName(win.document) = "HTMLDocument" Then
            If InStr(win.LocationURL, "Firefox") > 0 Then
                Set IE = win
                flg = True
                Exit For
            End If
        End If
    Next
    End Function
End Function

Private Function getcim(gettitle As String) As InternetExplorer
    Dim shl As Object
    Dim nowtitle As String
    Dim win As Object
    
    Set shl = CreateObject("Shell.Application")
    For Each win In shl.Windows
        If TypeName(win.document) = "HTMLDocument" Then
            getcstitle = ""
            Do
                getcstitle = win.document.Title
                If getcstitle <> "" Then Exit Do
            Loop
            If InStr(win.LocationURL, "") <> 0 Then
                setforegroundwindow (win.hwnd)
                Set IE = win
                Do While IE.Busy Or IE.redystate < READYSTATE_COMPLETE
                    DoEvents
                Loop
            End If
        End If
    Next
    End Function
    
End Function

Private Function getElement(htmlDoc As HTMLDocument) As String
    Dim element As Object
    
    If InStr(htmlDoc.locaion, "Firefox") <> 0 Then
        For Each element In htmlDoc.all
            If UCase(element.tagName) = "INPUT" Then
                If element.Name = "" And element.Value = "Firefox" Then
                    Application.WindowState = xlMinimized
                    element.Click
                End If
            End If
        Next
    End If
                   
    If InStr(htmlDoc.Location, "Google") <> 0 Then
        For Each element In htmlDoc.all
            Select Case UCase(element.tagName)
               Case "INPUT"
            End Select
        Next
    End If
    End Function
    
End Function

Private Function getString(iecontents As Object, Optional depth As Long = 0) As String
    Dim htmlDoc As HTMLDocument
    Dim ret As String
    Dim ii As Integer
    
    On Error Resume Next
    
    Set htmlDoc = iecontents.document
    If Not htmlDoc Is Nothing Then
        ret = getElement(htmlDoc)
        For i = 0 To htmlDoc.frames.Length - 1
        
            ret = getString(htmlDoc.frames(i), depth + 1)
        Next
    End If
    Exit Function
    
End Function
【swift】文字列を一文字ずつに分割する時のArray("hoge")の型について

**文字列を1文字ずつに分割したい！**
競技プログラミングを解いているとよく出くわしますね。

解決方法としては

```swift

let str = "hoge"

let separatedStr = Array(str)
print(separatedStr)
 // ["h", "o", "g", "e"]
```
という感じで`Array()`の（）の中に文字列を入れれば、一文字ずつ分割してくれます。

でも、これで分割された文字列の配列は`String`型ではなく`Character`型なのです。


##`Character`型とは
developer.apple.comによると、
"A single extended grapheme cluster that approximates a user-perceived character."
（google翻訳： ユーザーが知覚する文字を近似する単一の拡張書記素クラスター。）

なんか難しく書いてますがとりあえず、
「人間が自然に認識できる最小の"1文字の型"」
と認識していただければ大丈夫です。

問題なのは、**`String`型とは明確に違う**ってことです。
__特にInt型に変換するときに問題になってきます。__

#Int型への変換（例： [ABC083B - Some Sums](https://atcoder.jp/contests/abs/tasks/abc083_b)）

2桁以上の数字に対して、各桁の和を算出したいです。
（例: "13"だったら1+3 = 4、"624"だったら6+2+4 = 12)

まず、与えられた数字列を1文字ずつに分解します。

```swift
let digits = "13" //String型

let separatedDigits = Array(digits) //Character型の配列
print(separatedDigits)  //["1","3"]
```
さて、当然Int型に直さないと計算できないので、
この後`["1","3"]`を`[1,3]`に直します。

ただ`String`型の感覚で

```swift
let intDigits = separatedDigits.map({Int($0)!})
```
ってやったら
`Cannot convert value of type 'String.Element' (aka 'Character') to expected argument type 'String'`
というエラーが出ます。
swift5のVersion 12.3では`Character`型から直接`Int`型には変換できないためです。

なので、

```swift
let intDigits = separatedDigits.map({Int(String($0))!})
```
として一旦`String`型を経由させてください。

その後はいつも通り`reduce`で配列内の足し算を行えばいいので、

```swift
let result = intDigits.reduce(0, +)

print(result) //4
```
で導出完了です。

###コード全文
```swift
let digits = "13"

let separatedDigits = Array(digits)
let intDigits = separatedDigits.map({Int(String($0))!}) //数字列の分割

let result = intDigits.reduce(0, +)
print(result) //4
```

####【1/31追記】
コメントにて@masakihori様からご教示いただきました！
`Array()`を挟まなくとも、そのままmapを掛ければ分解できます。

```swift
let digits = "13"
let intDigits = digits.map({Int(String($0))!}) 
print(intDigits) //[1,3]
```
map関数は「すべての要素に対して同じ処理を掛ける」関数なので、
「`String`のすべての要素 ＝ 当該`String`を構成している文字（`Character`）」へ同じ処理を施してくれるのですね。

###参考文献
 -  [Unicodeのgrapheme cluster (書記素クラスタ)｜hydroculのメモ](https://hydrocul.github.io/wiki/blog/2015/1025-unicode-grapheme-clusters.html)
 -  [swiftで文字列を1文字ずつの配列に変換する｜Qiita](https://qiita.com/Satochaaan/items/63812ce8ccb030ad9574)
 - [【Swift入門 文法編】String型をマスターしよう｜新卒エンジニアの開発日記](https://fukatsu.tech/swift-string)
AWSのDescribeAvailablePatchesを使ってみた

【執筆中】コードとかきれいにしてないけど現時点のメモ書きを載せておく
とりあえずセキュリティのパッチを取得してみる

``` C#
        public static async Task<string> SayHelloAsync([ActivityTrigger] string name, ILogger log)
        {
            //log.LogInformation($"Saying hello to {name}.");
            var ssmClient = AwsSsmService.GetClient();


            // Windows Server 2019
            var request = new DescribeAvailablePatchesRequest();
            var productFilter = new PatchOrchestratorFilter();
            productFilter.Key = "PRODUCT";
            productFilter.Values.Add("WindowsServer2019");
            request.Filters.Add(productFilter);

            var classificationFilter = new PatchOrchestratorFilter();
            classificationFilter.Key = "CLASSIFICATION";
            classificationFilter.Values.Add("SecurityUpdates");

            request.Filters.Add(classificationFilter);

            try
            {
                var response = await ssmClient.DescribeAvailablePatchesAsync(request);
                string nextToken = null;
                var patches = new List<Patch>();
                int productCount = 0;
                int repositoryCount = 0;
                int savedProductCount = 0;
                int savedRepositoryCount = 0;

                if (response.HttpStatusCode == HttpStatusCode.OK)
                {
                    do
                    {
                        Thread.Sleep(500);

                        nextToken = response.NextToken;
                        patches.AddRange(response.Patches);

                        var platformList = patches.Select(r => r.Product).Distinct();
                        productCount = platformList.Count();

                        var repositoryList = patches.Select(r => r.Repository).Distinct();
                        repositoryCount = repositoryList.Count();

                    } while (nextToken != null);
                }
                else
                {
                    // Error
                    var code = response.HttpStatusCode;
                }

                // 2021/01のパッチだけ取得
                var date = new DateTime(2021, 1, 1, 0, 0, 0, 0);

                var currentPatches = patches.Where(r => r.ReleaseDate > date).ToList();

                var temp = string.Empty;

                return $"Hello {name}!";
            }
            catch (Exception ex)
            {   
                var message = ex.Message;
                throw;
            }

        }
```
集合論の空集合の記号はΦ（ファイ、パイ）ではなく Ø らしい。ただ、この読みは？

つらつらとTwitterを眺めていると、空集合の記号をパイと断言するサイトが多いことについて嘆く大学教員のツイートに出会った。

[Hiroyasu Kamo @kamo_hiroyasu さんのツイート](https://twitter.com/kamo_hiroyasu/status/1353180138079358981?s=12 "Hiroyasu Kamo @kamo_hiroyasu さんのツイート")


恥ずかしながら、私もその一人だ。

確認の根拠として、WikiPediaは心許ないのだが、一応参照すると、上述のことが明示されていた。

[WikiPedia 空集合](https://ja.wikipedia.org/wiki/%E7%A9%BA%E9%9B%86%E5%90%88 "WikiPedia 空集合")

誤りならば訂正していきたい。そこで、正誤表の記載方法なのだが、読みについて困っている。

誤　空集合　Φ、φ　ファイ、パイ
正　空集合　Ø　（読み？ノルウェー語アルファベットのゼロ）

さあ、ここだ。では、この記号 Øはなんと読んだら良いのだろう？「ゼロ」？どこで調べようか。どう調べようか。
undefined method `upload' for nil:NilClassが出た時の解決法

# 今回のエラー

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1003934/768ba7ba-98be-4cd8-e0af-9416b4c572d2.png)

# きっかけ
S3を作成中のアプリに導入しようとしたところ、このエラーが出ました。

# 結論
開くべきシェルが間違っていた。

S3を導入する際には、環境変数を指定しなければならないのですが、その際にvimメソッドのインサードモードの中に記述したのですが、その時にターミナルに

```shell:ターミナル
vim ~/.zshrc
```

としなければならないところを

```shell:ターミナル
vim ~/.zshr    
```

と打ち込んで、その中に記述していました。
要するにスペルミスですね。
散々原因を探した後だったので、「今更スペルミスなんか見逃すかよ」、とスペルミスの可能性を削除していたが故のミスでした。これからはもっと謙虚な気持ちでエラーと向き合っていきます。
【自己学習】相手に伝わる文章の作り方

![スクリーンショット 2021-01-24 16.20.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594740/df35200a-1f7e-ea4a-077f-df0291c10948.png)

上記の本を読んで学んだことをまとめた。

# 伝え方にはシンプルな技術がある
良い文章は決して才能ではなく、技術を用いることで良い文章を作ることができる。
正直、良い文書を作れないと損をすることが多い！
エンジニアに関わらず、全ての仕事に繋がることなのでここに書き残して置きたい！
※交渉ごとやプレゼンや企画など、人間関係構築にすごく重要。
プログラマーにとってもコミュニケーションで失敗するのはとても損している！

伝え方の一例：

```
「デートしてください」 → 「驚くほど旨いパスタのお店に行きませんか？」
「残業お願いできる？」 → 「君の力が必要なんだ。お願いできない？」
「領収書をおとしてください」 → 「いつもありがとうございます。領収書お願いできますか？」
```
上記はあくまで一例だが、言い方を変えるだけでYesの割合がグッと上がると感じた。
自分が言われる立場としても「No」を「Yes」と言いたくなる言葉があった。

# 「No」を「Yes」に変える技術
## 「Yes」に変える7つの切り口
1. 相手の好きなこと  
2. 嫌いなこと回避
3. 選択の自由
4. 認められたい欲
5. あなた限定
6. チームワーク化
7. 感謝

## 「Yes」に変える3ステップ
- ステップ1: 自分の頭の中をそのままコトバにしない  
  「デートしてほしい」  
  「遅刻しないでほしい」
　　　
- ステップ2: 相手の頭の中を想像する  
  相手の特徴「イタリアンが好き」  
  相手の特徴「朝、起きるのが苦手。低血圧」

- ステップ3: 相手のメリットと一致するお願いをつくる
  「驚くほど旨いパスタに行かない？」  
  「明日、朝が早いからお互いに起きれてるか電話しませんか？」

## エンジニアで使えそうな言い回し
- 「残業お願いできる？」 → 「君の力が必要なんだ。お願いできない？」
- 「領収書を落としてください」 → 「いつもありがとうございます。領収書お願いできますか？」
- 「納期が遅れます」 → 「よりクオリティを上げたいので、粘れませんか？」
- 「その問題について考えてください」 → 「問題について一緒に考えましょう」
- 「コードをきれいにしてください」 → 「一緒にコードをきれいにしませんか？」

# 書籍情報
伝え方が9割
https://www.amazon.co.jp/%E4%BC%9D%E3%81%88%E6%96%B9%E3%81%8C9%E5%89%B2-%E4%BD%90%E3%80%85%E6%9C%A8-%E5%9C%AD%E4%B8%80/dp/4478017212

# 感想
すごく刺さることが多い本だった。
昨今の影響でテレワークが増えているため、メールやチャットツールでのやりとりの中で、
普通に文書を作ると、すごくつめたいイメージになっていたので参考になった。
この本を参考にして「No」を少しでも「Yes」に向かわせるようにしていきたい。
ちょっとしたことを調べたいときに見るページを公開しました。




タイトル通り、[ちょっとしたことを調べるときに使えそうなページ](https://kokuyokugetter.github.io/tools/)を作りました。


- BMI調べたいとか
- テレビ買う時とかにインチって何センチだっけとか
- 今年西暦／和暦何年で干支は何で自分は何歳なんだっけ

とかたま〜〜に気になるようなことを知ることができます。


<br>



webページとして公開したいけど、サーバー立てるのは面倒だったので、github pagesで公開しました。



というわけで慣れ親しんだPythonは使えないので、

JavaScript素人／jQuery初見、の状態でなんとか色々調べながら作成しました。





jQueryについてはいまだによく分かっていません。



もちろんcssもよく知らないのでカスみたいな見た目してます。　



こういうの追加してほしいとかあれば可能な限りで追加してみます。



あとcssもアドバイスあれば嬉しいです。




## 追記

内容なさすぎたし、コード書けって言われて確かにとなったので追記します。



コード全部載せるのはアレなんで、詳しく見たい方はgithubで見てください。

[kokuyokugetter/tools - github](https://github.com/kokuyokugetter/tools)





ここでは作成時に気にしてたことを一つだけ書きます。



今回こちらのサイトを作成する際には、レスポンシブデザインを気にして作成していました。



safariにはレスポンシブデザインモードがあり、そこで逐一タブレットやスマホでの表示をチェックしながら作成していました。



PCでは3列表示で、全コンテンツを一度に表示するように見れ、



スマホ表示ではそれだと小さすぎるので、一列に表示するようにしているのですが、





PCの場合の3列表示したいときに、普通に

```html
  <div id="leftside">
    左中身
  </div>

  <div id="center">
      中央中身
  </div>

  <div id="rightside">
      右中身
  </div>
  
```



として



```css
    #leftside {
        float:left;
        width:29%;
    }

    #center {
 
    }
    #rightside {
        float:right;
        width: 29%;
    }
```



とかってやるとrightsideの要素がcenterの要素の右下に来てしまいました。（確か）



centerが普通に表示した後に、`float:right`が効いてるからでしょうか。



htmlでcenterとrightsideの要素を逆にすればちゃんとなりましたが、今度はスマホにしたときにcenterがrightsideの後ろにきて気持ち悪いです。







ということで、自分は以下のようにしました。





```html
  <div id="leftside">
    左中身
  </div>

  <div id="center-right">
    <div id="centerside">
      中央中身
    </div>

    <div id="rightside">
      右中身
    </div>
  </div>

```



```css
    #leftside {
        float:left;
        width:29%;
    }

    #center-right {
        float: right;
        width: 70%;
    }
    #centerside {
        float:left;
        width: 49%;
       
    }
    #rightside {
        float:right;
        width: 49%;
    }

```



centerとrightsideをまとめた要素を作ってそれを右寄せして、その中でまた左右に分けることで、2列表示のやり方を入れ子にすることで、上の問題を解決できました。



自分で思いついたのは偉いと自画自賛していますが、

CSSのスペシャリスト的に、もっといい3列表示の方法があれば教えてください。
とりあえず仮想環境作成してpython動かしたい

##概要
M1チップ搭載Macを購入したが、
現状、色々とM1(ARMアーキテクチャ)対応しておらずだったので
とりあえず、x86向けでもいいのでpython動かしたい。
できるとこまで、M1用で構築したので、それを崩したくない。
そこで仮想環境を作ることにしました。

##環境
Macbook M1
python3.7(x86)で動く仮想環境作ります

windowsはコマンドが異なるので
随時補足。

#手順

既に入っていれば手順１は飛ばして下さい

#####1.pythonインストール
今回は公式サイトから、MacOsのPython3.7の最新のものを
インストールしました
↓公式サイトURL
https://www.python.org/downloads/mac-osx/
（お持ちのPCのOSに合うものをインストールください）

#####2.仮想環境をしまう、フォルダの作成
今回はプロンプトで作成していきます(testというフォルダ作成)
プロンプトを起動後、現在位置を確認するとわかりやすいかも。
↓↓linux↓↓

```
pwd
```
↓↓windows↓↓

```
chdir
```

で、確認します

```
mkdir test
```

をすると、上で確認したフォルダに、testというフォルダを作成します。

```
cd test
```

で、作成したフォルダに移動します

#####3.仮想環境の作成
作成した、testフォルダに移動した上で

```
python -m venv test_venv
```

これをすると、test_venvという仮想環境フォルダができます

#####4.仮想環境へ切り替える(アクティブする)
この記事と同じフォルダ名で作成した場合は下記コードから
ユーザー名を変えるだけで、切り替えれます
↓↓linux↓↓

```
source "/Users/ユーザー名/test/test_venv/bin/activate"
```
↓↓windows↓↓

```
\Users\ユーザー名\test\test_venv\Scripts\activate.bat
```
仮想環境から抜ける時は、activateをdeactivateに。

別名で作った場合は、ユーザー名、test(仮想環境をしまうフォルダ),test_venv(仮想環境フォルダ)
を合うように変えて下さい

切り替わっていれば、
プロンプト入力の先頭に
(test_venv)　が付与されます

あとは、欲しいモジュールをpip等でインストールして下さい
tailwindcss のデフォルトの単位を rem から px に変更する方法

tailwindcss はデフォルトの単位が rem になっています。

既存のプロジェクトに tailwindcss を導入する際、既に ```<html>``` に font-size が指定してされている場合（16px 以外）、プレイグラウンドや他のプロジェクトからエレメントをコピーした場合にサイズが変わってしまいます。

ですので、単位を px に変更したいと思います。

変更する場合は、tailwind.config.js を修正します。
（下記の例では spacing と borderRadius を変更しています）

ブラウザの ```<html>``` の font-size は 16px（大体） ですので、 ``` 1: '0.25rem', ``` を ``` 1: `${16 * 0.25}px`, ``` と変更します。
[default configuration](https://github.com/tailwindlabs/tailwindcss/blob/master/stubs/defaultConfig.stub.js)

``` js
module.exports = {
  purge: [],
  darkMode: false, // or 'media' or 'class'
  theme: {
    extend: {},
    spacing: {
      px: "1px",
      0: "0px",
      0.5: `${16 * 0.125}px`,
      1: `${16 * 0.25}px`,
      1.5: `${16 * 0.375}px`,
      2: `${16 * 0.5}px`,
      2.5: `${16 * 0.625}px`,
      3: `${16 * 0.75}px`,
      3.5: `${16 * 0.875}px`,
      4: `${16 * 1}px`,
      5: `${16 * 1.25}px`,
      6: `${16 * 1.5}px`,
      7: `${16 * 1.75}px`,
      8: `${16 * 2}px`,
      9: `${16 * 2.25}px`,
      10: `${16 * 2.5}px`,
      11: `${16 * 2.75}px`,
      12: `${16 * 3}px`,
      14: `${16 * 3.5}px`,
      16: `${16 * 4}px`,
      20: `${16 * 5}px`,
      24: `${16 * 6}px`,
      28: `${16 * 7}px`,
      32: `${16 * 8}px`,
      36: `${16 * 9}px`,
      40: `${16 * 10}px`,
      44: `${16 * 11}px`,
      48: `${16 * 12}px`,
      52: `${16 * 13}px`,
      56: `${16 * 14}px`,
      60: `${16 * 15}px`,
      64: `${16 * 16}px`,
      72: `${16 * 18}px`,
      80: `${16 * 20}px`,
      96: `${16 * 24}px`,
    },
    borderRadius: {
      none: "0px",
      sm: `${16 * 0.125}px`,
      DEFAULT: `${16 * 0.25}px`,
      md: `${16 * 0.375}px`,
      lg: `${16 * 0.5}px`,
      xl: `${16 * 0.75}px`,
      "2xl": `${16 * 1}px`,
      "3xl": `${16 * 1.5}px`,
      full: "9999px",
    },
  },
  variants: {
    extend: {},
  },
  plugins: [],
}

```
git add -Aが効かない... [超初心者]

#要約
```
git add -A
```
でうまくいかなかったことが

```
git add <リポジトリ名>
```
にするとうまくいったという話

#つまりかけた部分
rails tutorialをやっていて、gitはgit add -Aをすればcommitできるでしょ、と漠然と思っていた

```
git add -A
error: 'リポジトリ名/' does not have a commit checked out
fatal: adding files failed
```

？？
何故かaddできない


##git addの仕様

→https://note.nkmk.me/git-add-u-a-period/
git　addのオプションはこちらのリンクがわかりやすい
→https://qiita.com/stivan622/items/a5d0d651e5b59be00f0c

```
#ファイルをステージングに追加
git add <ファイル名>

#複数ファイルを追加
git add <ファイル名> <ファイル名> <ファイル名> <ファイル名>

#すべてのファイルを追加
git add .
```

#結果

```
git add <ファイル名>
```
ここのファイル名をリポジトリ名として実行するとうまく行った
依存関係の問題もあるかもしれないけど今はわからない
スクラッチ組織を作成しようとしてエラー

# トラブルの内容・症状
* Salesforceで、VS Codeからスクラッチ組織を作成しようと、以下を実行しました。

```
sfdx force:org:create -s -f config/project-scratch-def.json -a GeoAppScratch
```
すると、次のようなエラーが出ました。

```
WARNING: Warning: If you're using Contacts to Multiple Accounts, beginning with the Spring ’21 release, the feature isn't automatically enabled. You must manually enable the setting for new scratch orgs. Enable the setting in one of these ways: update the Account Settings page in Setup, add the enableRelateContactsToMultipleAccounts setting to your scratch org definition file, or enable it via Metadata API.
ERROR running force:org:create:  You do not have access to the [ScratchOrgInfo] object
```
* WARNINGの部分は省略しても良かったのですが、検索で引っかかるように表示しました。
* `ERROR running force:org:create:  You do not have access to the [ScratchOrgInfo] object`という表示がされていると、失敗しているということです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262477/c7a64411-b35d-ba17-afcd-65ad62f94c4c.png)

* なお、Salesforceの以下のハンズオンをやって、このエラーに引っかかりました。
  * https://trailhead.salesforce.com/ja/content/learn/modules/sfdx_app_dev/sfdx_app_dev_create_app?trail_id=sfdx_get_started 

# 動作環境
* MacOS
* VS Code
* Salesforce
* 開発者スキル・・・スクラッチ組織の利用については初心者。

# 原因
* Dev Hubを有効化していなかったとこが原因。

# 解決方法
* 設定　＞　クイック検索で Dev Hubを検索して開く　＞　Dev Hubを「有効化」する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262477/82b17caa-b052-a425-1414-ad1ba9d4ea28.png)

* 改めて以下のコマンドをVS Codeのターミナルから実行する。

```
$ sfdx force:org:create -s -f config/project-scratch-def.json -a GeoAppScratch
```
* 以下のようにWARNINGは出るが、Successfullyとなり、スクラッチ組織が作成される。成功。やったぜ！

``` 
WARNING: Warning: If you're using Contacts to Multiple Accounts, beginning with the Spring ’21 release, the feature isn't automatically enabled. You must manually enable the setting for new scratch orgs. Enable the setting in one of these ways: update the Account Settings page in Setup, add the enableRelateContactsToMultipleAccounts setting to your scratch org definition file, or enable it via Metadata API.
Successfully created scratch org: 00D0l0000001sdzEAA, username: test-nflqwk2cswrx@example.com
```

# 感想
* 以下のサイトが参考になりました。やはり、みんな困ってるんですね。
* https://developer.salesforce.com/forums/?id=9062I000000g8CYQAY
* なお、スクラッチ組織はパッケージ開発で利用します。組織開発を利用する場合はSandbox組織とVsCodeを利用します。
[memo]Railsのpresent?メソッドの使い方

##present?メソッドとは
オブジェクトであるレシーバーの値が存在すればtrue、存在しなければfalseを返すメソッドです。条件分岐（if文等）をプログラムで書くときによく使います。

例えばアプリの購入機能において「もし選択した商品に紐づく購入記録が存在していたら（空ではなかったら）、"sold out"と表示する」を実装したい場合は該当のビューファイルにおいて

```:index.html.erb

<% if item.purchase.present? %>
<div class='sold-out'>
<span>Sold Out!!</span>
</div>
<% end %>
```

という様に記述します。

``<% if item.purchase.present? %>``の部分ですが
itemモデルとpurchaseモデルにテーブル間のアソシエーションが組んであれば
``商品(item)に紐づく購入記録(purchase)が存在していたら（空ではなかったら）=true``
という解釈になります。

以下のサイトにはpresent?メソッドと逆のblank?メソッドも紹介されています。

参考：https://techacademy.jp/magazine/20214
ESXiホストに残っているvSANクラスタ情報をクリア

vSANクラスターから ESXi ホストを外すメモです。

１．対象ESXi ホストをメンテナンスモードに切り替え
２．対象ESXi の DiskGroup を削除
3. Drag&Drop にて、対象 ESXi ホストを vSANクラスター外に移動

基本はこれだけでよいはずですが、問題は次の事象です。

対象 ESXi 上での操作 (SSH接続)
①vSAN情報が残っていないかを確認。
　esxcli vsan storage list

②この結果で、vSAN Disk情報が表示された場合は、以下のコマンドにて Disk情報を削除。
esxcli vsan storage remove -u [DISKGROUPのUUID]

③vSAN Disk情報など何も表示されてはいないが、vSAN情報が残っていることで別のクラスター環境へ移動ができない場合は、”vdq -q” と “esxcli vsan cluster get” コマンドにて状況を確認。

③-1　
vdq -q

[root@esxi01:~] vdq -q
[
   {
      "Name"     : "t10.NVMe____VMware_Virtual_NVMe_Disk________________VMWare_NVME_0000____00000001",
      "VSANUUID" : "",
      "State"    : "Eligible for use by VSAN",
      "Reason"   : "None",
      "IsSSD"    : "1",
"IsCapacityFlash": "0",
      "IsPDL"    : "0",
      "Size(MB)" : "204800",
   "FormatType" : "512e",
   },

   {
      "Name"     : "mpx.vmhba0:C0:T1:L0",
      "VSANUUID" : "",
      "State"    : "Eligible for use by VSAN",
      "Reason"   : "None",
      "IsSSD"    : "0",
"IsCapacityFlash": "0",
      "IsPDL"    : "0",
      "Size(MB)" : "665600",
   "FormatType" : "512n",
   },

   {
      "Name"     : "mpx.vmhba0:C0:T0:L0",
      "VSANUUID" : "",
      "State"    : "Ineligible for use by VSAN",
      "Reason"   : "Has partitions",
      "IsSSD"    : "0",
"IsCapacityFlash": "0",
      "IsPDL"    : "0",
      "Size(MB)" : "40960",
   "FormatType" : "512n",
   },

]

③-2　クラスタ情報を確認
[root@esxi01:~] esxcli vsan cluster get
Cluster Information
   Enabled: true
   Current Local Time: 2021-01-24T14:09:31Z
   Local Node UUID: 6007c0cc-25de-4b53-e441-000c29337544
   Local Node Type: NORMAL
   Local Node State: MASTER
   Local Node Health State: HEALTHY
   Sub-Cluster Master UUID: 6007c0cc-25de-4b53-e441-000c29337544
   Sub-Cluster Backup UUID: 
   Sub-Cluster UUID: 52d8ae3c-bc4d-716c-7000-72ba2e6822a5
   Sub-Cluster Membership Entry Revision: 0
   Sub-Cluster Member Count: 1
   Sub-Cluster Member UUIDs: 6007c0cc-25de-4b53-e441-000c29337544
   Sub-Cluster Member HostNames: esxi01.vmlab.local
   Sub-Cluster Membership UUID: 9a2c0d60-5536-79f6-8e67-000c29337544
   Unicast Mode Enabled: false
   Maintenance Mode State: ON
   Config Generation: 446c194c-bd83-4766-bb08-f274591568ad 1 2021-01-21T00:50:04.356

④残っているvSAN情報を確認
　[root@esxi01:~] esxcli vsan cluster leave

⑤もう一度クラスタの情報を確認する
　[root@esxi01:~] esxcli vsan cluster get
　　vSAN Clustering is not enabled on this host

④残っているvSAN情報を削除
 [root@esxi01:~]esxcli vsan cluster leave
　これで削除が完了しました。

もう一度、vSANクラスター情報を確認してみると、以下の通りに削除されていることがわかります。
esxcli vsan cluster get
vSAN Clustering is not enabled on this host
上記コマンドは、vSphere 7.0 環境での動作確認済みのものとなります。

vSphere バージョンによっては、コマンドが変更されている可能性があります。
その際は、”-?” にて Help 情報を参照してください。
ちゃんと紐づけてるのにunrecognized selector sent to instanceエラーが出る時の対処方法

このエラーに数日悩まされたので備忘録として残します。

Bar Button Itemタップ時の処理を実装していたところ、
以前までは正常に実装できていたものが、「unrecognized selector sent to instance」のエラーで前に進めなくなった。

調べてみると、いくつか要因があるとのこと

1. identity inspectorのClassの設定が間違っている
2. Inherit Module From Targetにチェックが入っていない（自分はこれが原因だった）
3. タップ時のアクションを示す関数にて、引数（例：_ sender: UIBarButtonItem）が設定されていない

（2が原因の場合、Inherit Module From Targetにチェックを入れるか、もしくは、Moduleに手打ちすればよいとのこと）

参考になればいいな
【Java】Date型の日時を計算する方法

#プログラミング勉強日記
2021年1月24日
JavaでDate型の日時を計算する方法を示す。


#Date型とは
　Javaで日時の処理をするために定義されたデータ型で、日時情報は1970年1月1日0時からの経過時間をミリ秒で表したものである。

```java:Date型を使った日付の取得
// 2021年1月24日日曜日 22時56分12秒
Sun Jan 18 22:55:12 JST 2021
```


#Calendarクラスとは
　CalendarクラスはDate型と同様日時を扱うデータ型で、Date型よりも細かい日時演算ができる。Date型の演算を行う場合はCalendar型に変換して、演算処理を行う。

```java:Date型をCalendar型に変換する方法
Calendar Calendar型オブジェクト名 = Calendar.getInstance();

Calendar型オブジェクト名.setTime(Date);
```

```java:Calendar型からDate型を取得する方法
Date型オブジェクト名 = Calendar型オブジェクト名.getTime();
```


#Date型の日時を加減算する方法
　Date型ので日時を加減算するためにはCalendar型のaddメソッドを使う。加算する場合は、第二引数で正の整数を指定する。減算する場合は第2引数に負の整数を指定する。

```java:日付を加算する方法
Calendar型.add(年月日時間などを指定, 値);

// 第1引数で渡すもの
Calendar.YEAR            // 年
Calendar.MONTH           // 月
Calendar.DAY_OF_MONTH    // 日
Calendar.HOUR_OF_DAY     // 時間
Calendar.MINUTE          // 分
```

```java
// 1日先の日付を取得したいとき
Calendar型.add(Calendar.DAY_OF_MONTH, 1);

// 2ヵ月前の日付を取得したいとき
Calendar型.add(Calendar.MONTH, -2);
```

#サンプルプログラム

```java
import java.util.Date;
import java.util.Calendar;

class Sample{
        public static void main(String args[]){

                // Date型で現在時刻を取得する
                 Date date = new Date();
 
                 Calendar calendar = Calendar.getInstance();
                 calendar.setTime(date);

                //Date型の持つ日時を表示
                 System.out.println(date);
 
                 //Date型の持つ日時の4年後を表示(日時の加算)
                 calendar.add(Calendar.YEAR, 4);
                 date = calendar.getTime();
                 System.out.println(date);

                //Date型の持つ日時の3日前を表示(日時の減算)
                 calendar.add(Calendar.DAY_OF_MONTH, -3);
                 date = calendar.getTime();
                System.out.println(date);

        }
}
```

```:実行結果
Sun Jan 24 23:18:33 JST 2021
Fri Jan 24 23:18:33 JST 2025
Tue Jan 21 23:18:33 JST 2025
```

#参考文献
[日時を加算/減算する(add)](https://www.javadrive.jp/start/calendar/index4.html)
特定のディレクトリ内のファイルを一括でrequireした話

# 元々の状況・課題
Rubyで[チケット料金モデリング](https://github.com/j5ik2o/ticket-price-modeling)に挑戦中。
特定のディレクトリ内のファイルを一つずつrequireするのが面倒。
今後特定ディレクトリ内にファイルが増えた際に、追加するのも面倒。

# やったこと
下記コードを読み込みする側(User.rb)の一番上に書くことで、特定のディレクトリ内のコードを一括でrequireできました。

```Ruby
Dir[File.expand_path("../user_type", __FILE__) << "/*.rb"].each do |file|
require file
end
```

## ディレクトリ構成は、ざっくりですがこんな感じです。
```

├── sample
│   ├── user.rb　←読み込みする側（requireする側）
│   └── user_type
│        ├── user_a.rb　←requireしたいファイル
│        └── user_b.rb　←requireしたいファイル
```

## コードの説明
```Ruby:User.rb
Dir[File.expand_path("../user_type", __FILE__) << "/*.rb"].each do |file|
require file
end
```
### 1.[File.expand_path("../user_type", __FILE__) << "/*.rb"]について
- `File.expand_path`は、相対パスを絶対パスに変換した文字列を返す。
- `__FILE__`は実行ファイル名を返す。
- `<< "/*.rb"`は、"/*.rb"の文字列を追加する。

（参考）実行結果

```
# __FILE__なし
[File.expand_path("../user_type") << "/*.rb"]
=> ["/上の階層のパス/user_type/*.rb"]
```
```
# __FILE__あり
[File.expand_path("../user_type", __FILE__) << "/*.rb"]
=> ["/上の階層のパス/sample/user_type/*.rb"]
```

### 2.Dir[]について
[リファレンス](https://docs.ruby-lang.org/ja/latest/class/Dir.html#S_--5B--5D)でこのように書いてあります。
> ワイルドカードの展開を行い、パターンにマッチするファイル名を文字列の配列として返します。パターンにマッチするファイルがない場合は空の配列を返します。
ブロックが与えられたときはワイルドカードにマッチしたファイルを引数にそのブロックを 1 つずつ評価して nil を返します

今回のディレクトリ構成だと、`"/上の階層のパス/sample/user_type/*.rb"`にマッチする`user_a.rb`と`user_b.rb`を文字列として配列に入れることになります。
その後は、この配列をeach文でそれぞれrequireする処理を実行しています。

# 参考
- https://docs.ruby-lang.org/ja/latest/class/Dir.html#S_--5B--5D
- https://maeharin.hatenablog.com/entry/20130104/p1
「AtCoder」について簡単に紹介するよ。

私が2020年4月ごろからハマっている「AtCoder」について書きます。

※AtCoderについて説明している人は私以外にも大勢いるのでわざわざこの記事を読む価値があるかどうかはアレです。

# AtCoderとは
**[AtCoder](https://atcoder.jp/)**は、**競技プログラミングのコンテスト**のサイト。
プログラミングの問題を解くスピードを世界中のプレイヤーとオンラインで競い合うことができる。
会員登録もコンテスト参加も無料。

# コンテストはざっくりこんな感じ
・コンテストはほぼ毎週開催されている。いくつもある競技プログラミングサイトの中でもAtCoderはわりと有名なほうで、毎回だいたい5,000～10,000人が参加している印象。
・コンテストが始まったら、ネットなり本なりで調べながら制限時間内にプログラムを作る。**完成したソースコードを提出すると、正解かどうかがその場ですぐにジャッジされる。**不正解と言われたら急いで作り直し。
・コンテスト終了後には**プレイヤー全員の提出ソースコードをお互いに見ることができる。**ブログやTwitterに感想を書いている人も大勢いるので勉強になる。
・ソースコードの提出とその場でのジャッジは、コンテスト開催中でなくても自由に利用できる。暇なときに、面白そうな過去問を自分で選んでちょっとやってみるのも楽しい。
・コンテストに参加するたびにプレイヤーひとりひとりの「レーティング」、つまり**その人のプログラミング能力の「強さ」を示す数値**が変動する。自分の実力が数字となって目に見えるので、さらに高みを目指す気持ちがわく。

# どんな問題が出題されるのか
AtCoderに練習問題ページがある。これを見ると雰囲気がよくわかる。
⇒**[AtCoder Beginners Selection](https://atcoder.jp/contests/abs)**

# 会員登録したらどうすればいいのか
私の場合、こちらの記事が参考になった。
⇒**[AtCoder に登録したら次にやること ～ これだけ解けば十分闘える！過去問精選 10 問 ～](https://qiita.com/drken/items/fd4e5e3630d0f5859067)**
この記事の筆者である**[けんちょんさん](https://qiita.com/drken)**は、競技プログラミングの分かりやすい解説記事をたくさん書いているスゴイ人である。

***

AtCoder、面白くて勉強にもなります。もっと流行ってほしい！

では今回はここまでです。
[ Emmetで爆速コーディング ]VSCodeでEmmetを使ってみた

こんにちは！ゲンキです！
2回目の投稿です！今回は、Udemyの講座でemmetが紹介されていて__めっちゃ便利で感動したので__、みなさん知っているかもしれませんが紹介します！
自分への備忘録も兼ねているの暖かい目で見て頂けると嬉しいです:grin:

さっそく紹介していきます！

#目次
1.HTMLひな形展開
2.ID名のついたdivタグ展開
3.クラス名のついたdivタグ展開
4.クラス名のついたHTMLタグ展開
5.ID名のついたHTMLタグ展開
6.タグを入れ子にして展開
7.タグと入れ子に対してクラス名をつけて展開
8.タグを入れ子にして任意の数だけ展開
9.入れ子のクラス名にナンバーをつけて展開
10.ダミーテキストの展開

##HTMLひな形

```html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  
</body>
</html>
```
これはかなり知っている人も多いかもしれません！自分もいつ覚えたかは忘れてしまいましたがこれだけは知っていました！

！＋ __tab__　で展開することができます！
今から紹介していくのも最後に__tab__キーを押すのは変わりません！

##ID名のついたdivタグ展開

```html
#ID名
<div id="ID名"></div>
```
　# + ID名

##クラス名のついたdivタグ展開
```html
.クラス名
<div class="クラス名"></div>
```
. + クラス名

##クラス名のついたHTMLタグ展開
```html
span.クラス名
<span class="クラス名"></span>
<section class="クラス名"></section>
```
HTMLタグ　+　. +　クラス名

##ID名のついたHTMLタグ展開
```html
span#ID名
<span id="ID名"></span>
<section id="ID名"></section>
```
HTMLタグ　+　# +　ID名

##タグを入れ子にして展開
```html
div>span
<div><span></span></div>
```
HTMLタグ + > + HTMLタグ

##タグと入れ子にして対してID名をつけて展開
```html
#ID名>span#ID名
<div id="ID名"><span id="ID名"></span></div>
```
 # + HTMLタグ + ID名 + >+ HTMLタグ + # + ID名
クラス名をつけたいときは＃を.に変える

##タグを入れ子にして任意の数だけ展開
```html
ul>li.item*6
<ul>
  <li class="item"></li>
  <li class="item"></li>
  <li class="item"></li>
  <li class="item"></li>
  <li class="item"></li>
  <li class="item"></li>
</ul>
```
HTMLタグ>HTMLタグ.クラス名 * 展開したい入れ子の数

##入れ子のクラス名にナンバーをつけて展開
```html
ul>li.item$*6
<ul>
  <li class="item1"></li>
  <li class="item2"></li>
  <li class="item3"></li>
  <li class="item4"></li>
  <li class="item5"></li>
  <li class="item6"></li>
</ul>
```
HTMLタグ > HTMLタグ . クラス名 $ ＊　展開したい入れ子の数
※ $を２つにすると数字の前に０を入れれます

##ダミーテキストの展開
```
Lorem ipsum, dolor sit amet consectetur adipisicing elit. Corrupti nisi fugiat veritatis, cupiditate accusantium culpa quam ea fuga, reiciendis placeat cum tempore omnis! Illum ab nam rerum quo, ex quae.
```
lorem + __tab__キーでダミーテキストを挿入

##まとめ
今回はul,li,span,div,sectionタグなどを使っていますが他のタグも使用できます！
Emmetを使うと
- __コーディングを効率的にできる__
- __記述ミスを少なくできる__
などのメリットがあるのでぜひ使用してみてください！僕もこれからなるべく使っていこうと思います！
間違っているところなどありましたらコメントで教えて頂けると嬉しいです:sweat_smile:

>かなり分かりやすく解説されてあるので初心者の方にもおすすめです！
>[今回受講したUdemy講座]( https://www.udemy.com/share/102zAIAEcTd1pSQHQD/"Qiita")
Passwordを変えたらSourceTreeにログインできない

社内研修中に使用しているSourceTreeで、Passwordがあっているはずなのにログインができず少しハマった話

SourceTreeバージョン　4.0.1
Macバージョン　10.15.7

＜やったけど意味がなさそうなこと＞

・再起動(PC,SourceTree両方)

・Passwordがあっているかの確認

・キーチェーンからBitBucketのログイン情報の削除

・Users/Library/Application Support/SourceTree内のUser@bitbucketのファイルの削除

＜おそらく解決した原因＞

・SourceTree内の設定を開き、アカウントの項目で自分のアカウントを選び編集を押す
　アカウントを接続を押す


参考にしたページ
https://freesworder.net/sourcetree-no-push/
https://reasonable-code.com/sourcetree-invalid-error/
MySQLパーティションを使い、バッチ処理で日毎にデータを登録、取得するSQL

バッチ処理で、自動でパーティション追加、データ登録、パーティション削除をする処理を作り、それに必要なSQL部分を抜粋しました。

## やりたいこと（実際に作った処理とは異なります）
* あるゲームのプレイ結果を、日時で集計し、集計結果を画面に表示したい。
* バッチ処理で、集計し、結果を過去1週間分を保持し、過去分は毎日削除したい。
* 最新のパーティションからデータを取得したい。

## 事前準備
テーブルを作る

```sql:
CREATE TABLE IF NOT EXISTS `game_point_log` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `user_id` INT NOT NULL COMMENT 'ユーザーID',
  `point` INT UNSIGNED NOT NULL COMMENT 'ポイント',
  `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '登録日時',
  `updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新日時',
  PRIMARY KEY (`id`, `created_at`))
ENGINE = InnoDB
PARTITION BY RANGE COLUMNS(created_at)(
PARTITION p20210113 VALUES LESS THAN ('2021-01-13'),
```

* パーティションの種類は、「RANGE」にします。
* パーティションのキーには、created_atを使います。
* パーティションのキーは、PRIMARY KEYにしないといけないので、id、created_atをプライマリーキーに指定します。
* パーティションはバッチ処理で追加しますが、１つだけ事前に作っておきます。

## バッチ処理
以下の順で処理します。
### 1. 追加するパーティション名を決める。
ここでは日付とします。（例:2021年1月23日なら、p20210123）

### 2. パーティションを追加する

```sql:
ALTER TABLE game_point_log ADD PARTITION (
    PARTITION [パーティション名] VALUES LESS THAN ('[日付条件、どの日時までを対象にするか？]')
);

例：
ALTER TABLE game_point_log ADD PARTITION (
    PARTITION p20210124 VALUES LESS THAN ('2021-01-24')
);
```

* 日付をキーに作ります。
* LESS THANは、既存のパーティションの条件〜指定した日付までの間のデータを入れるという意味なので、今日の日付データを入れたい場合は、翌日の日付にすると良いです。

### 3. データを登録する
DB側でパーティションに入れてくれるので、通常のINSERT文で登録できます。

### 4. 古くなったパーティションを削除する
古くなったパーティションを一発で削除するコマンドはない（たぶん・・・。）
ので、今使っているパーティションを取得して、その中から削除したいパーティションを取得します。

```sql:
EXPLAIN PARTITIONS SELECT * FROM game_point_log
```

SQLを実行すると、partitionsという項目で、カンマ区切りでパーティション名が取得できます。
例：p20210124,p20210125,p20210126

それをカンマで分割で配列化し並び替えたりして消したい等でパーティションを探し、

```sql:
ALTER TABLE game_point_log DROP PARTITION [パーティション名]

例：
ALTER TABLE game_point_log DROP PARTITION p20210124
```

で削除します。


## 取得処理（最新のパーティションからデータ取得）
最新のパーティションを自動で選択して取得してくるコマンドはない（たぶん・・・。）
ので、取得する時も、古くなったパーティションを削除する時に使ったEXPLAINコマンドを使って、partitionsを取得し、自分で探します・・。

調べたパーティションを指定して、

```sql:
SELECT * FROM game_point_log PARTITION ([パーティション名]);

例: 
SELECT * FROM game_point_log PARTITION (p20210113);
```

とすると、対象のパーティションに入っているデータ（対象の日付データのみ）が取得できるので、where文なしで取得でき便利です。

## 参考URL
[MySQL 5.6 リファレンスマニュアル ](https://dev.mysql.com/doc/refman/5.6/ja/partitioning.html)
GitHub Actions には TTY がない

Travis CI から GitHub Actions に CI を移行しようとして微妙にハマったのですが、次の issue にあるように GitHub ホストランナーには TTY がありません。

https://github.com/actions/runner/issues/241

TTY が必要な場合は [issue 内のコメント](https://github.com/actions/runner/issues/241#issuecomment-634683367) で紹介されている [Action-FakeTTY](https://github.com/marketplace/actions/faketty) を使用すると良さそうです。
この Action を使用することで、TTY を偽装する `faketty` コマンドを使用することができるようになります。

次のように `Action-FakeTTY` を実行後、偽装 TTY が必要なコマンドの頭に `faketty` をつけてあげれば OK です。

```yaml:.github/workflows/CI.yaml
name: CI

on:
  - push
  - pull_request

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v2
      - name: Setup node
        uses: actions/setup-node@v2
        with:
          node-version: 14
      - name: Setup faketty
        uses: Yuri6037/Action-FakeTTY@v1.1
      - name: Test
        run: faketty npm test
```

注意点として、必ず [v1.1](https://github.com/Yuri6037/Action-FakeTTY/releases/tag/v1.1) 以降を明示的に指定するようにしてください。
`Yuri6037/Action-FakeTTY@v1` は現在の GitHub ホストランナーでは動作しません。
FlutterでiOSアプリの名前を日本語で設定する簡単な方法

ウェブで調べるとXcodeを使っての情報と日本語では簡単には設定できない旨の情報ばかりで、私のようにWindows→Codemagicで開発をしている物には参考情報が得られませんでした。
これを友人にぐちったところあっさり解決策が見つかったので、メモを兼ねて記載します。
__プロジェクトフォルダ\\ios\\Runner\\Info.plist__を編集する点は同じです。

--------

## 一番多く見つかる情報
先に注意を兼ねて半分間違いの情報です。
```
<key>CFBundleName</key>
<string>MyApp</string>
```
__CFBundleName__のstringにアプリ名を入力します。
ただしこれでは日本語の名前は設定できません。


## 正解の情報
```
<key>CFBundleDisplayName</key>
<string>私のアプリ</string>
```
とします。
__CFBundleDisplayName__はプロジェクト作成時には記載がありませんので追記する必要があります。


## まとめ
Xcodeでローカライズが必要などの情報ばかりでしたが、こんな簡単に指定ができると知って拍子抜けでした。
今後クロスプラットフォーム開発が売りなので、Androidのアプリ名と合わせてプロジェクト作成のときなどに簡単に設定できるようにして欲しい物です。
Tabaleauと自分

これまで年に1～2回程度しかTabaleauを触っており、都度都度テクニックを覚えては忘れ、覚えては忘れを繰り返していました。実際、それで業務は回っていましたし、何かあればエクセルで力づくでデータ可視化していました。

ただ、直近で参画しだした案件ががっつりTabaleauを回している世界なので、これを機にTabaleauスキルの脳への定着に取り組むべく、DataSaberに挑戦してます。
そして、その中で、個人的に習得できたり、知れてよかったTipsを残していきたいと思います。
何個残せるか正直わかりませんが、ちょいちょい投稿していきたいと思います。
【JSP/サーブレット】　JSPファイルを使ってブラウザに「Hello World」を表示させてみた！

#前回の続きになります:train2:
※動的プロジェクトの作成などは、前の[記事](https://qiita.com/iwasaki-hub/items/ed781ebe773d25cb28e9 "Qiita")で紹介しています:raising_hand:



#１，JSPファイルの作成:blue_book:

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/b3c28265-a21c-3f1f-f12c-c567874a6699.png" width="600">

#２，保存場所とソースコード:books:
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/55e36b6c-b3de-38e5-5f55-d6c9272454e8.png" width="600">

#３，サーバーを起動:cat:

>サーバー起動（Tomcat）

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/2966bec5-a489-1876-cba2-a79c7ffb6ada.png" width="600">

>ブラウザ表示（Google Chrome）

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/7d1dfbe6-f8e5-1b3b-f8b4-1e2c91904aa9.png" width="600">

#４，振り返り:pencil2:

>JSPファイルをブラウザ表示させることができました:blush:
>
>JSPファイルは**MVCモデル**の中で、**V（view)**として活躍します:dancer:
>
>URLとリクエストメソッドにも注目すると、
>
>　URL ⇨ **localhost:8080/JSP_Servlet/view/index.jsp**
>
>　Request Method ⇨ **GET**
>
>となっています.
>
>サーブレットクラスを起動させた場合とURLに少し違いがあると思います。
>
>**URL**にも注意しながら学習を進めて下さい:raised_hand:

#５，次のステップ:airplane:
次回は、[フォワード（forward）](https://qiita.com/iwasaki-hub/items/47d6e22bc0dcb6ed25b8 "フォワード（forward）")を扱います！
要するに、サーブレットクラスからJSPファイルに画面遷移する方法です！

キーワード : RequestDispatcher　:mag:
Ionic ngForを逆に繰り返す方法（Angular）

#はじめに
リストの表示などで絶対に使う`ngFor`

**表示される順番を逆にするにはどうしたらいいか？**を調べたら、何やら色々なやり方があった。。。

その中で一番良かったと思うやり方を紹介！

#環境
Ionic + Angular
[angularfire](https://github.com/angular/angularfire)がプロジェクトに入ってる

#結論、tsファイルを一切触らなくてもできました

```html
 <ion-item *ngFor="let monthCount of monthCounts.slice().reverse()">
```

このように`.slice().reverse()`を追加するだけでリストの順番が逆になりました。:thumbsup:

こんな感じで使えました:point_down:

```html:home.page.html
<ion-grid>
      <ion-row>
        <ion-col>
            <ion-list>
              <ion-list-header>
                毎月の回数
              </ion-list-header>
              <ion-item-group>
                <ion-item *ngFor="let monthCount of monthCounts.slice().reverse()">
                  <ion-col>{{ monthCount.monthDate }}</ion-col>
                  <ion-col>
                    <ion-text color="primary">
                    {{ monthCount.monthCount }}回
                  </ion-text>
                </ion-col>
                </ion-item>
              </ion-item-group>
            </ion-list>
        </ion-col>
      </ion-row>
    </ion-grid>
```

```typescript
import { AngularFireAuth } from '@angular/fire/auth';
import { AngularFirestore } from '@angular/fire/firestore';

// 省略
monthCounts = [];
// 省略

constructor(
    private afAuth: AngularFireAuth,
    private db: AngularFirestore,
  ) {
    afAuth.auth.onAuthStateChanged((user) => {
      if (user != null) {
        this.getMonthCounts(user.uid);
      }
    })
  }

getMonthCounts(userId: string) {
    this.db.collection(`users/${userId}/counts`).snapshotChanges().subscribe(colSnap => {
      this.monthCounts = [];
      colSnap.forEach(snap => {
        const monthData: any = snap.payload.doc.data();
        monthData.id = snap.payload.doc.id;
        monthData.monthDate = monthData.monthDate;
        console.log(monthData.id);
        this.monthCounts.push(monthData);
      })
    })
  }
```
[基礎]DB設計[Rails6]　エンティティの洗い出し~ER図作成



#エンティティ
サービスで扱われる情報のことをエンティティといいます。
下記のようにアプリケーションの機能を一つ一つ洗い出し、要素ごとにまとめます。
注意事項としては、エンティティはテーブルと等しい粒度で決める必要があるため、
可能な限り「異なるジャンルの情報」は混合させないようにすることです。

新規登録/ログイン
ログアウト

プロフィール詳細

新規投稿
投稿一覧表示
投稿詳細表示
投稿編集
投稿削除
[![Image from Gyazo](https://i.gyazo.com/91e17b7754db88815986a25c48aff2d7.png)](https://gyazo.com/91e17b7754db88815986a25c48aff2d7)


#モデリング
エンティティの分類や関連付けなどを行い、図で表すことです。
エンティティ自体を見直し、さらにエンティティ同士の関係性を考え、言語化していきます。
[![Image from Gyazo](https://i.gyazo.com/cf01ca5ef95bce1cbad32e1e6be5387b.png)](https://gyazo.com/cf01ca5ef95bce1cbad32e1e6be5387b)

#正規化
データベースの構造を効率的でシンプルな形にすることです。
段階で分かれています。
正規化は難しいので今後学びます。

正規形の段階|概要
----------|---------------
非正規形    |何もしていない状態
第一正規形  |重複する値やカラムを分離する
第二正規形  |テーブルのすべての候補キーにおいて部分関数従属性が存在しないこと
第三正規形  |情報が混在するエンティティを分離する

#ER図
Eはエンティティ（Entity）、Rはリレーションシップ（Relationship）の略で、
DBのテーブルや関係性をを図で表した設計図です。
線の形によって関係性が表されています。
PKは主キー　（primary key）
FKは外部キー（foreign key）
[![Image from Gyazo](https://i.gyazo.com/0fd189e558748af6482c66610dd7e702.png)](https://gyazo.com/0fd189e558748af6482c66610dd7e702)

#README
READMEに「カラム」「型」「制約」「アソシエーション」を記述します。
[![Image from Gyazo](https://i.gyazo.com/b6be8922ed24a30f82376204f82c9caa.png)](https://gyazo.com/b6be8922ed24a30f82376204f82c9caa)
【Rails】Rails5.2 リッチテキストエディタsummernote-railsのツールバーアイコンの表示・非表示を切り替える

gem 'summernote-rails'
https://github.com/summernote/summernote-rails

```summernote-init.coffee
$(document).on 'turbolinks:load', ->
  $('[data-provider="summernote"]').each ->
    $(this).summernote
      lang: 'ja-JP'
      height: 300
      toolbar: [
                ['insert', ['picture', 'link']],
                ["table", ["table"]],
                ["style", ["style"]],
                ["fontsize", ["fontsize"]],
                ["color", ["color"]],
                ["style", ["bold", "italic", "underline", "clear"]],
                ["para", ["ul", "ol", "paragraph"]],
                ["height", ["height"]],
                ["help", ["help"]]
             ]
```
![4bddbabf5f7dd3fbd8dff2fb73afe709.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501744/2c216ac7-ecf1-bd1a-a8f3-863fbc0f0dbd.png)


jsのオプションに、toolbar:[]部分の記述を足して、表示したくないアイコンに対応したハッシュの値を消せばアイコンが消える。
Vue.jsのwatch機能のまとめ

データ変更の監視機能をもつ"watch"についてメモしたいと思います。

vueの機能には,
data,methods,computedといった機能をよく使いますが、watchという"dataやcomputedのプロパティの値を監視して、変更がある時に任意の処理を実行させることができる機能です。

####基本的な使い方
#####【dataの値を監視】

下記のようにwatchオブジェクトの中で、

監視したい変数: 
function（next(変更後の値の引数）、prev(変更前の値の引数))

と宣言することで、監視したい変数に変更があった場合には関数が実行されます。
注意したいのはv-modelを使ったテキスト入力などは一文字ずつ反映されてしまうので、一文字ずつ入力するたびに反応してしまうので.lazyなど修飾子をうまく活用しましょう。
実際に現場で使っているかはわかりませんが、非同期処理やコストの高い処理に最も便利かもしれません。

```JavaScript"sampel.js"
Vue.createApp({
  data:function(){
    return{
       message:'',
    }
   },
   watch:{
     message: function(next, prev){
        console.log('next:' + next )
        console.log('prev:' + prev)
    },
```
```html"sample.html
<div id ="app">
	<div>
		<input type="text" v-model.lzy="todoTitle" />
		<p>
			{{ todoTitle }}
		</p>
	</div>
</div>
```

#####【computedの値を監視する】
watchはdataのみだけでなく、computedの値も監視することが可能です。使い方はdataと同じように

監視したい関数:function(今回の実行結果、前回の実行結果)

と言うような形で指定することで監視することが可能です。

```javascript
data: {
//省略
},
watch: {
	todoTitletext: function(next, prev){
		console.log('next:' +next);
		console.log('prev:' +prev);
		}
	},
	computed:{
			todoTitletext: function(){	
        return  this.todoTitlemessage=  '入力は' + this.todoTitle

		},
```
と言うような感じです。

####ちょっと応用編
#####配列内のオブジェクトのデータ監視について
よくよくアプリケーションの構築を考えてみると、単純なテキスト入力よりもオブジェクトで利用している場合がほとんどかと思います。
そういった場合には、基本的なやり方では検知してくれないので、、

```javascript

//todosのオブジェクトの中身を検知したい！！
watch: {
   todos:{
       handler:funciton(next,prev){

	todoTitletext: function(next, prev){
           console.log('todos変更あり')
	},
       deep: true,
    }
},
```

といった感じで、
　1.todosのオブジェクトを指定
　2.オブジェクトの中でhandlerプロパティに関数を指定
　3.deepプロパティを"true"に設定
することで<font color="red">監視しているプロパティのネストの深さに関係なく変更を検知できる</font>ようになります。
　
通常は値の変更はcomputedやメソッドで確認しているので、やはり非同期処理などで使うかもですね。。。

使用例【メモ】
watch関数を使ってローカルストレージへの保存
create機能を使ってローカルストレージからの呼び出し

```javascript
  watch:{
    todos:{
      handler:function(next){
        window.localStorage.setItem('todos',JSON.stringify(next))
      },
      deep:true,
    },
    categories:{
      handler:function(next){
        window.localStorage.setItem('categories',JSON.stringify(next))
      },
      deep:true,
    }
  },
  created: function() {
    const todos = window.localStorage.getItem('todos')
    const categories = window.localStorage.getItem('categories')

    if(todos){
      this.todos =JSON.parse(todos)
    }
    if(categories){
      this.categories = JSON.parse(categories)
    }
  },
```
Jetsonでお部屋の温度、湿度、気圧を測定

# はじめに
Jetson AGX XavierとAmazonで購入できる800円程度の気象センサを使って、温度、湿度、気圧を測ってみました。

# 前提
- Jetson AGX Xavier
- JetPack 4.5
- GY-BME 280
- [SWITCHSCIENCE/BME280](https://github.com/SWITCHSCIENCE/BME280)

![IMG_1304.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109483/979dad8e-58dc-f473-5edd-e13ce6fde8b0.png)


# ハードウェア接続

| 基板 Pin|機能| Jetson Pin |
|:-:|:-:|:-:|
|VCC|電源3.3V|電源3.3V|
|GND|GND|GND|
|SCL|クロック入力|5|
|SDA|データ入力|3|
|CSB|チップセレクト|電源3.3V|
|SDO|データ出力|GND|


# インストール

```sh
$ sudo apt install -y python-pip
$ pip install smbus2
$ git clone https://github.com/SWITCHSCIENCE/BME280
$ cd BME280/Python27
```


# 動作確認

```sh
$ vi bme280_sample.py
...
bus_number = 8 # 書き換える
...
$ python2 bme280_sample.py
temp : 23.21 ℃
pressure : 1008.06 hPa
hum :  38.78 ％
```

それっぽい値が読めています。

# 補足
アドレスは0x76(SDO=GNDの場合)で、Bus 8に接続されていますが、下記のようにSMBus Quick Commandがサポートされていないので、
i2cdetect -y 8としても見つかりません。

```
$ i2cdetect -F 8

Functionalities implemented by /dev/i2c-8:
I2C                              yes
SMBus Quick Command              no
SMBus Send Byte                  yes
SMBus Receive Byte               yes
SMBus Write Byte                 yes
SMBus Read Byte                  yes
SMBus Write Word                 yes
SMBus Read Word                  yes
SMBus Process Call               yes
SMBus Block Write                yes
SMBus Block Read                 no
SMBus Block Process Call         no
SMBus PEC                        yes
I2C Block Write                  yes
I2C Block Read                   yes
```

以下のコマンドでReadできれば正常に接続されているでしょう(内容未確認)。

```
$ i2cdump -y 8 0x76
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
80: 94 50 89 52 60 41 b9 06 50 6f c8 67 32 00 2b 8e    ?P?R`A??Po?g2.+?
90: 1a d6 d0 0b 39 20 ab ff f9 ff ac 26 0a d8 bd 10    ????9 ?.?.?&????
a0: 00 4b e5 00 00 00 00 00 00 00 00 00 33 00 00 c0    .K?.........3..?
b0: 00 54 00 00 00 00 60 02 00 01 ff ff 1f 4e 08 00    .T....`?.?..?N?.
c0: 00 40 27 ff 00 00 00 00 01 00 00 00 00 00 00 00    .@'.....?.......
d0: 60 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    `...............
e0: 00 71 01 00 12 2f 03 1e 3f 41 ff ff ff ff ff ff    .q?.?/???A......
f0: ff 00 01 0c 27 00 00 4f fd 00 81 78 00 67 07 80    ..??'..O?.?x.g??
```