OmniAICreator/Qiita-1.07M huggingface dataset:
usdz形式の3DモデルをSceneKitに読み込みんでアニメーションさせる

usdz形式の3DモデルをSceneKitに読み込んでアニメーションさせる方法を紹介します。

こちらの記事を参考にしましたが、現在は`ModelIO`を使う必要がなかったので、改めて書いておこうと思います。
[USDZ形式の3DモデルをModel I/Oで読み込みSceneKitで利用する](https://qiita.com/shu223/items/84cc00802399c381aefe)

### 手順

1.usdz形式の3Dモデルを用意する
今回は、[Appleの公式サイト](https://developer.apple.com/jp/augmented-reality/quick-look/)からtoy drummerをダウンロードしました

2.Xcodeのプロジェクト作成からGameのプロジェクトを作成する

3.プロジェクトにusdzのファイルをドラッグ & ドロップする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116010/637c68a5-9f8e-ab94-8626-ce5bb4562c2b.png)

4.モデルを読み込む

GameViewControllerのviewDidLoadに書いていきます。

```swift:GameViewController.swift
override func viewDidLoad() {
    super.viewDidLoad()
    
    guard let url = Bundle.main.url(forResource: "toy_drummer", withExtension: "usdz") else { fatalError() }
    let scene = try! SCNScene(url: url, options: [.checkConsistency: true])
```
SCNSceneに直接urlを渡せばそのままusdzのファイルをロードできます。

5.アニメーションを制御する
実は、この時点でusdzに含まれるアニメーションの再生が始まり、Toyドラマーはドラムを叩き始めます。

左腕の動きだけ止めてみましょう。

usdzファイルを開くと、左腕には`arm_keft`という名前がついており`transform`という名前のアニメーションが指定されていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116010/651f3cf4-9f43-bb4f-6a39-89b3ed622136.png)

コードで取り出します。

```swift:GameViewController.swift
let drummer = scene.rootNode.childNode(withName: "toy_drummer", recursively: true)!

let armLeft = drummer.childNode(withName: "arm_left", recursively: true)
let player = armLeft?.animationPlayer(forKey: "transform")
player?.stop()
```

toy_drummerのノードから左腕のノードを取得しています。
そして`transform`アニメーションを取得し、止めています。

6.タップしたら左腕が動くようにする

先程はanimationPlayerをローカル変数に取得していましたが、イベントハンドラで使用できるようにインスタンス変数に保存するようにします。

```swift:GameViewController.swift
class GameViewController: UIViewController {
    var player: SCNAnimationPlayer?
```

イベントハンドラで、左腕が動くアニメーションを開始します。
イベントハンドラの登録に`addGestureRecognizer`を呼ぶ必要がありますが、Gameプロジェクトを作ったときに自動的に生成されるコードを流用しています。

```swift:GameViewController.swift
@objc
func handleTap(_ gestureRecognize: UIGestureRecognizer) {
    player?.animation.repeatCount = 1
    player?.play()
}
```

### 仕上がり

左腕はタップしたときにアニメーションします。
それ以外にもアニメーションがありますが、今回は制御していないのでループしているのがわかると思います。

![toy_drummer.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116010/85472e5a-409c-2a97-aa30-1c4d990742f2.gif)


iOSアプリ開発に関する情報を発信しています。
Twitterでも発信していますのでフォローして下さい。
https://twitter.com/jugemjugemjugem
MRTK 2.5 を Unity Package Manager を使って取り込む

日本時間 10/2(金) にリリースされた MRTK v2.5 から Unity Package Manager に対応しました。

今までは MRTK を、.unitypackage ファイルを GitHub から落としていましたが、今回から、Unity Package Manager を使うと以下のように簡単に (？) 取り込めます。

公式ドキュメント：https://microsoft.github.io/MixedRealityToolkit-Unity/Documentation/usingupm.html

## 手順

Unity 2019.4 ↑ 。

プロジェクトのフォルダーの `Packages/manifest.json` をテキストエディタで開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24609/0c1ee8d4-2d83-5bab-489b-a08780175aa8.png)


この長い json ファイルの最初にこれを追記してください：

```json:manifest.json
  "scopedRegistries": [
    {
      "name": "Microsoft Mixed Reality",
      "url": "https://pkgs.dev.azure.com/aipmr/MixedReality-Unity-Packages/_packaging/Unity-packages/npm/registry/",
      "scopes": [
        "com.microsoft.mixedreality",
        "com.microsoft.spatialaudio"
      ]
    }
  ],
  "dependencies": {
    "com.microsoft.mixedreality.toolkit.foundation": "2.5.0",
    "com.microsoft.mixedreality.toolkit.tools": "2.5.0",
    "com.microsoft.mixedreality.toolkit.examples": "2.5.0",
```
`"scopedRegistries"` のセクションと
`"dependencies"` に 3 行追加した形になります。

こんな感じになります：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24609/54677e71-a720-d68d-586a-4efc7beee163.png)

保存すると Unity エディタのほうで Unity Package Manager が動きます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24609/76139930-ff19-83c0-46d8-db717f563839.png)


以下のように Packages の下に MRTK 関連のフォルダーが出来る。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24609/292172a9-2c92-5c67-6074-2c6d8a562d97.png)

* Mixed Reality Toolkit <b>Examples  </b>
* Mixed Reality Toolkit <b>Extensions</b>
* Mixed Reality Toolkit <b>Foundation</b>
* Mixed Reality Toolkit <b>Standard Assets</b>
* Mixed Reality Toolkit <b>Tools</b>



## 留意しておくべきこと

今回の MRTK v2.5 から Unity Package Manager 対応して、それで入れた場合。

今までは `Assets` フォルダに MRTK が入っていたけど
今回 `Packages` に入るから

これまで `Assets/MRTK/SDK/Features/...` みたいな path があったら

`Assets` を `Packages` (例：`Packages/Mixed Reality Toolkit Foundation/SDK/...`) に置き換えて読む感じになる
TextBoxのフォーカスを解除する備忘録

エンターキーが押されたらフォーカスを解除する等の処理の実装時、少しハマったので書いておく。
コントロールに```control.UnFocus()```的なメソッドがあればよいのだが、残念ながらそのようなものはなかった。
まず、これを実装するために初めに思いつくのは```Keyboard.ClearFocus()```を使うことだが、これだとコントロールの```LostFocus```が呼ばれない。
では、どうするのかというと答えは単純である。
別のコントロールにフォーカスを当てればよい。
ただ、プログラムごとに特定のコントロールにフォーカスを当てる処理を書くのは個人的にスマートではないので、一般化しておく。
コード例を以下に示す。

```c#:Sample.cs
// コントロールのフォーカスを解除する
public void BreakFocus(Control control){
   DependencyObject ancestor = control.Parent; 
   while (ancestor != null)
   {
      // フォーカスできるか
      if (ancestor is UIElement element && element.Focusable)
      {
            element.Focus(); // フォーカスを当てる
            break;
      }
      ancestor = VisualTreeHelper.GetParent(ancestor);
   }
}
```

非常に単純である。フォーカス可能なコントロールが見つかるまでさかのぼって、当ててやるだけである。
これでコントロールのアンフォーカスが実装できた。
HTMLでid属性は重複してはいけない！重複を防ぐためには

#プログラミング勉強日記
2020年10月3日
HTMLのコードを見ていたとところ、id属性を重複させてしまっていることがあったので、[こちら](https://qiita.com/mzmz__02/items/a1d3c708d7d830023f03)の記事でもclassとid属性について扱っているが改めて、重複を防ぐためにするべきことを簡単にまとめる。

#id属性とは
　CSSのセレクタ(h1, p)などでスタイルを指定することはできるが、h1やp要素は多く利用されるので、同じ要素でも別のスタイルを使用したいときにHTMLのid属性を使う。
　HTMLタグのid属性によって決められた値はブラウザの固有の識別子として扱われるので、<b>id属性は同じページにHTML内に重複してはいけない！！</b>

#id属性を重複して書いた場合
　CSSのスタイルの適応において、ブラウザに不具合が生じることもあれば、全く影響がない場合もある。また。JSにおいても要素のid属性を抽出条件に関した関数の実行にて、要素の参照や習得に失敗してしまう結果の可能性がある。

#重複を防ぐためには
　[Markup Validation Service](https://validator.w3.org/#validate_by_input)を使うことで、調べることができる。id属性が重複している場合にはErrorとWarningの内容として表示される。他にも文法エラーなどを抽出してくれる。

#参考文献
[HTMLでid属性が重複した時の動きについて現役デザイナーが解説【初心者向け】](https://techacademy.jp/magazine/24111)
[CSSのidとclassの使い分け](https://qiita.com/mzmz__02/items/a1d3c708d7d830023f03)
gitでハマったお話

やってみれば当然っちゃ当然のことにハマってしまったので、誰かのために残しておきます。
### 概要
結論をまず言います。
`git status`コマンドを実行し、下記のような表示がでるようなとき、`git add`、`git commit`、`git push`はできません。

```
# On branch master
nothing to commit, working directory clean
```
git管理下におかれたディレクトリ内で、「変更されたものはないから、コミットするものはないよ」ということです。

(･д･)？「は？なにをあたりまえのことを」

って、なりますよね…。わかります。

では、今回おちいった（といってもすぐに解決した程度のレベルですが）ことを簡単な例をおって説明していきます。

### 解説
実験用のディレクトリを作り、`git init`します

```
$ mkdir git_test
$ cd git_test/
$ git init
Initialized empty Git repository in /home/hogeuser/git_test/.git/
```
ディレクトリを作成、その中に適当なファイルを作成します

```
$ mkdir test_dir
$ touch test_dir/test_file

# ディレクトリ構成はこんな感じ
$ tree git_test/
git_test/
└── test_dir/
    └── test_file
```
ひとまずgit commitまでします

```
$ git status
# On branch master
#
# Initial commit
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       test_dir/
nothing added to commit but untracked files present (use "git add" to track)

$ git add .
$ git commit -m "first commit"
[master (root-commit) f28650e] first commit
1 file changed, 0 insertions(+), 0 deletions(-)
```
新規ファイルを作成します（ここで作成するファイル名は先ほど作成したファイルと同名にします。ここがハマりポイント）

```
$ touch test_file
$ ls
test_dir/  test_file <-- こいつを追加した
```
この時点で`git status`すると…

```
$ git status
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       test_file
nothing added to commit but untracked files present (use "git add" to track)
```
はい、「追跡対象になってない（`git add`していない）ファイルがあるよ」と。そりゃ新しいファイル作ったんだもんね。そうだよね！ってなる。

追加したファイルを`test_dir`ディレクトリへ移動。`test_file`ファイルを上書きします

```
$ mv test_file test_dir/
```
同じファイルとはいえ、**タイムスタンプとか違う**から、状態としては更新されたことになってるよな！と、考えてました。はい…

再度、`git status`

```
$ git st
# On branch master
nothing to commit, working directory clean
```
！！！なぬ？なんもコミットするものはないだと…？

はい、これがハマりポイントでした。ただの認識ミスです…。

推測ですが、`diff`で内容を比較して違いがないのなら、git的には「それ内容は変わってないよね？同じだよね」という扱いになるのですね。
てっきり**更新時間が変われば**、gitで変更されたと認識される（`git add`してね状態になる）と思ってました。なりません！

手動で順を追ってやってみれば気づくものも、パイプライン中のシェルスクリプトの中にgitコマンドを記述してて、「おかしいな、git pushされてないな…」みたいになってました。

どなたかの「へぇ～」くらいになればうれしいですが…ほとんどポエムですね。
Google Driveでダウンロードできないときの対処

#はじめに
　自分が使っているGoogleアカウントの量がわりと多めで度々Google Driveからファイルがダウンロードできないときがありました。ほぼ備忘録的な感じですが、「Google Drive　ダウンロードできない」とかって調べてもなかなか出てこなかった記事に救われたので、改めてまとめてみようかなと思いました。基本的にまとめ記事のまとめになります。なのでリンクばっかりです。救われる方が少しでもいらっしゃれば幸いです。

#ヒットしたサイトたち
##「Google Drive　ダウンロードできない」でヒットしたサイト
- [https://www.imobie.jp/cloud-tips/fix-can-not-download-google-drive-files.htm](https://www.imobie.jp/cloud-tips/fix-can-not-download-google-drive-files.htm)
- [https://dime.jp/genre/707867/](https://dime.jp/genre/707867/)

基本的にはこれらの記事で紹介いただいている内容で解消できると思います。僕はたぶん複数アカウントでログインしているという原因でダウンロードできない問題を抱えました。

##「docs.googleusercontent.com　リダイレクト」でヒットしたサイト
- [https://yoshidastyle.net/Blogs/2018/11/06/google_drive_download_%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%8C%E6%8B%92%E5%90%A6%E3%81%95%E3%82%8C%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82](https://yoshidastyle.net/Blogs/2018/11/06/google_drive_download_%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%8C%E6%8B%92%E5%90%A6%E3%81%95%E3%82%8C%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82)

　正直このリンクを載せたかっただけです。僕の症状はこの記事で紹介されているような「拒否されました」というメッセージとは違って「リダイレクトされました」で終わってダウンロードに移行せず無反応という症状でした。
　まだ問題自体は解消できていないのですが、こちらの記事でご紹介いただいている「共有可能なリンクをコピー」からアクセスしてダウンロードという方法で今のところは切り抜けています。めちゃめちゃ悩んでたのでめちゃめちゃ救われました。

###「共有可能なリンクをコピー」のやり方
　ちなみにリンクのコピーの仕方を書いておこうかと思います。これは多分調べれば出てくると思うのですが書いてみますね。

Google Driveを開く -> ダウンロードしたいファイルを右クリック -> 「共有可能なリンクをコピー」もしくは「リンクを取得」というのを選択 -> 「リンクをコピー」のボタンを選択

　これで「貼り付け」やCtrl+Vなどで検索窓にペーストすれば検索できる状態になると思います。

##追記(2020/11/26)　Cookie許可による解消法
　本記事のコメントで教えてくださった方法になります。
　ウィンドウの右上の方に「目に斜め線がかかったようなマーク」がある方はそれをクリックして「Cookieを許可」もしくは「サイトが動作していない場合」->「Cookieを許可」の順番にボタンを押してください。
　「目に斜め線がかかったようなマーク」から斜め線が消えると思います。消えたらとりもなおさずダウンロードボタンを押したらできると思います！

　ちなみに僕は最初から「目に斜め線がかかったようなマーク」がウィンドウの右上に出てきてくれなかったので、ダウンロードしたいファイルのプレビューを表示した後にダウンロードボタンを押したら「目に斜め線がかかったようなマーク」が出て来てくれました！出て来てくれた後は上記と同じような手順を踏めばダウンロードできると思います。お知らせ頂いた方本当にありがとうございます！

　すみません画像を使えば説明しやすかったかも知れまないのですが、Googleのプロダクトのスクリーンショットを部分的に切り取って載せる(たぶん「改変」に該当する)ことになってしまいそうだったので、とりあえず文章だけで説明させていただきました。読みづらかったらすみません！

#おわりに
　ブラウザで解決方法を探すのに時間と労力を奪われたのでそこそこ辛かったです。検索が上手な方や頭の良い方はすぐに解決できた問題なのかなと思いましたが、よくありそうなタイトルでまとめておけば今後同じ問題を抱えた方が解決法を見つけやすくなるかなと思っています。ストレスが少しでも軽減されたら嬉しいです。
【連載】へっぽこエンジニアが「Webを支える技術」を要約してみた（第3章）

# はじめに
自分はWebの基礎を固めないままエンジニアとして過ごしていました。
そのことに焦燥感を感じることが多いため、今回 [技術評論社](https://gihyo.jp/book) から出版されている [Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)](https://gihyo.jp/book/2010/978-4-7741-4204-3) を要約する連載することにしました。

今回は第2章の要約となります。

[前回 - 【連載】へっぽこエンジニアが「Webを支える技術」を要約してみた（第2章）](https://qiita.com/sasanda_panda/items/e64032cc3fb3e7d6cd1e)

# 対象読者
「はじめに」を読んで心当たりのあるエンジニアの方。

# 第3章 REST Webのアーキテクチャスタイル
## 3.1 アーキテクチャスタイルの重要性
- RESTはWebのアーキテクチャスタイル
- アーキテクチャスタイルは複数のアーキテクチャに共通する性質・仕様・流儀などのことを指し、  
  システムのアーキテクチャを決定する際の指針となる

## 3.2 アーキテクチャスタイルとしてのREST
- RESTは、クライアント/サーバのアーキテクチャスタイルを基にいくつかの制約を加えたもの
- Webのアーキテクチャスタイル/アーキテクチャ/実装の分類は下記の通り

| 抽象化レベル         | Webでの例                              |
|:-------------------|:--------------------------------------|
| アーキテクチャスタイル | REST                                  |
| アーキテクチャ       | ブラウザ、サーバ、プロキシ、HTTP、URI、HTML |
| 実装               | Apache、Firefox、IE                    |


## 3.3 リソース
- リソースはWeb上の情報のこと
- リソースはそれぞれURIで一意の名前を持つ
- URIを用いることで、プログラムはリソースの表現する情報にアクセスできる

### リソースの名前としてのURI
- リソースの名前とは、URIのこと

### リソースのアドレス可能性
- アドレス可能性とは、URIによってリソースを簡単に指し示すことのできる性質のこと

### 複数のURIを持つリソース
- 現在が2020年9月1日だとすると、下記の2つのURIは同じリソースを指す  
  http://weather.example.jp/tokyo/today  
  http://weather.example.jp/tokyo/2020-09-01
- リソースに複数のURIをつけるとクライアントがリソースにアクセスしやすくなるが、  
  どれが正式なURIか分からなくなる

### リソースの表現と状態
- サーバとクライアント間でやりとりするデータのことを「リソースの表現」と呼ぶ
  - HTML形式、PDF形式、テキスト形式など
  - 天気予報、株価などの過去現在未来の情報

## 3.4 スタイルを組み合わせてRESTを構成する
### クライアント / サーバ
- クライアントとサーバを分離して処理できるので、
  クライアントをマルチプラットフォームできる
  - PC、スマートフォン、ゲーム機など

### ステートレスサーバ
- クライアントのアプリケーション状態をサーバで管理しないこと
- **ステートレスではない**例としてCookieを使ったセッション管理やフォーム認証があげられる  
  これらは必要最低限にするべきである

### キャッシュ
- 一度取得したリソースをクライアント側で使い回すこと
- サーバとクライアント間の通信を減らすことができるが、  
  古いキャッシュを利用して情報の信頼性が下がることがある

### 統一インタフェース
- URIで指し示したリソースに対する操作を限定的なインタフェースで行うことで、
  サーバとクライアントの独立性を向上させる
- HTTP1.1のリクエストメソッドが8つだけとなっている

### 階層化システム
- サーバとクライアント間に独立したシステムを設置できること  
  - ロードバランサを用いて負荷分散
  - プロキシを用いてアクセス制限

### コードオンデマンド
- JavaScriptのように、サーバからプログラムコードをダウンロードしクライアントで実行すること
- クライアントを後から拡張できることが魅力だが、  
  HTTPにしたがって通信が行われないためプロトコルの可視性が低下する

### REST = ULCODC$SS
- RESTとは上記6つのアーキテクチャスタイルを組み合わせたもので、  
  ULCODC$SSと呼ばれることもある


# 今回のうろ覚えワード
- **ロードバランサ**  
  複数のサーバを利用している際、  
  各サーバの処理負荷を分散させるために誘導をするもの
- **プロキシ**  
  クライアントの代わりにサーバにリクエストを送ることができ、  
  クライアントの身元を隠せたりアクセスを制限したりすることができる

# 感想
- [3.4 スタイルを組み合わせてRESTを構成する](https://qiita.com/sasanda_panda/items/4c558152713cb945eccc#34-%E3%82%B9%E3%82%BF%E3%82%A4%E3%83%AB%E3%82%92%E7%B5%84%E3%81%BF%E5%90%88%E3%82%8F%E3%81%9B%E3%81%A6rest%E3%82%92%E6%A7%8B%E6%88%90%E3%81%99%E3%82%8B) で、  
  今まで曖昧だったRESTの意味を理解することができた
  

# 参考
- [ロードバランサ (load balancer)とは｜「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word11013.html)
- [プロキシ (proxy)とは｜「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word1752.html)
【Ruby】n進数を0から始まる数値で表現する

# 0から始まる数値

## 例→09

```ruby
irb(main):027:0> 09
```
こちらでエンターキーを叩くと↓になる。

```ruby
irb(main):027:0> 09
SyntaxError: (irb):27: Invalid octal digit
	from /Users/username/.rbenv/versions/2.1.5/bin/irb:11:in `<main>'
```

## 例→0x10

```ruby
irb(main):028:0> 0x10
```
こちらでエンターキーを叩くと↓になる。

```ruby
irb(main):028:0> 0x10
=> 16
```

# 基数指示子

## 一覧
|進数|基数指示子|
|---|---|
|2進数|0b|
|8進数|0oもしくは0|
|10進数|0d|
|16進数|0x|

## 例

上記**一覧**の通り、基数指示子の後の数値が対応する進数に変換される。
上記の記法に該当しないものは、**例→09**のようにエラーになる。

```ruby
irb(main):047:0> 0b10
=> 2
```

```ruby
irb(main):049:0> 0o10
=> 8
```

```ruby
irb(main):050:0> 010
=> 8
```

```ruby
irb(main):051:0> 0d10
=> 10
```

```ruby
irb(main):052:0> 0x10
=> 16
```

# 参考文献
[［改訂2版］Ruby技術者認定試験合格教本（Silver/Gold対応）Ruby公式資格教科書](https://www.amazon.co.jp/%E6%94%B9%E8%A8%822%E7%89%88-Ruby%E6%8A%80%E8%A1%93%E8%80%85%E8%AA%8D%E5%AE%9A%E8%A9%A6%E9%A8%93%E5%90%88%E6%A0%BC%E6%95%99%E6%9C%AC-Silver-Gold%E5%AF%BE%E5%BF%9C-Ruby%E5%85%AC%E5%BC%8F%E8%B3%87%E6%A0%BC%E6%95%99%E7%A7%91%E6%9B%B8/dp/4774191949)
（アフィリエイトリンクではありません）
Signate第2回_Beginner限定コンペの振り返り

# はじめに
2020年10月から始まるAIQuest2期に向けて肩慣らしがてらビギナー限定コンペ(https://signate.jp/competitions/293 )に参加した。
AIQuestに参加するために参加したコンペではそこまでよい順位ではなかったが何とか参加に漕ぎつけることができた。
このままでは結果を出せないどころかついていけない、、、と思い9月後半からではあったがある程度時間を投下して本コンペに参加することができた。

本コンペは一定のスコアを出せばクリア、といったもので順位はあまり意味を持たないものだったが「勉強のため」と「自信をつけるため」に順位を上げる努力をした。結果としては運よく一位を取ることができたので今回自分が実施したことを紹介していこうと思う。

# コンペの概要
今回は血液のデータと年齢、性別で肝疾患かどうかを判断するといったもの。
評価関数はAUCを使用。
クリア条件はAUC=0.92を超えること。

# 環境
環境はGoogle Colaboratory

# 序の口
テーブルデータの分析で共通して実施していることをピックアップしていく。

1. データを見る

データそれぞれがどのような意味のものか、データの型は何か、欠損値がないかを確認。
後はどれだけ偏りがあるか可視化をしてみる。

2. feature_importanceを見てみる

一旦何も工夫せず学習してみて何を重要視しているか見てみる。
ほーんくらいの感想しか出なくても仮定を立てていく上でイメージ作りにこの作業は重要に思える。(捉え方によってはここで得た印象は足枷となってしまうかもしれないが)

3. 色々なモデルで学習してスコアを見てみる
Kaggleの有名なTitanicのノートでも実施されているが色々なモデルでスコアを出してみる。
今回私が試したのは
`Support Vector Machines`, `KNN`, `Logistic Regression`, `Random Forest`, `Naive Bayes`, `Perceptron`, `Stochastic Gradient Decent`, `Linear SVC`, `Decision Tree`,`catboost`

採用したのは`catboost`。
今回は欠損値も存在しなかったので何も考えず色々なモデルでスコアを出し、一番結果が良いものをfirst_commitとした。結果は0.8程度だったと思う

# クリアするのに必要だった最低限のこと
↑で0.8とクリア条件と大幅にかけ離れているので無工夫ではさすがにクリアはできなかった。
私の場合、以下の2つの工夫(といえるものではないかも)をしてクリア条件を満たすことができた。

1. 性別と年齢の列を削除する

一見とても肝疾患か否かと関係がありそうだが(実際相関も高かった)これを削除すると精度が向上した。
本当は何か根拠を持って消したかったが自分はそれをつかむことができず「機械的に消してみたらうまくいった」といったものだった。
ここに至るまでには
- `TargetEncoding`をやってみる
- 年齢を10代、20代…とわけてみる
を実施したがどれも成果はなかった。
ここで精度が0.83くらいまで上昇。

2. 推論結果を確率表記にする
この手の推論は1か0で出力する脳しかなかったので思いつくのに時間を要したがこれで飛躍的にスコアが向上した。

``` assessment.py
# 0か1で出力
model.predict(pred)

#　確率表記
model.predict_proba(pred)[:, 1]

```

これで0.83⇒0.92と合格ラインに到達。

# さらに精度を向上するために実施したこと
順位は関係ないコンペだったがモチベーションがあったのでさらに精度向上を試みた。以下は実施してスコアが上がったもの。

1. 医学的視点での血液正常値の範囲内かどうかの特徴量を追加
値では判断ができるものではあるが単位が皆異なっており総合的判断が難しく、「正常値の範囲内なのかどうか」だけで判断する特徴量が欲しいと思い、取り入れた。実際にこの方法はかなり有用でこれをやるだけで順位がTop10に入るくらいまで向上した。

2. ↑で得た知識で訓練データのイレギュラーデータを除去する

単に機械的に突出したデータを持つデータを削る、では見いだせなかった「ほとんどの数値で異常値を取っているのに正常と判断されているデータ」を除去した。
1か0の推論ならそこまで影響はないのかもしれないが確率表記なので傾向と真逆のデータを消してやることで突出してシロ・クロなデータを限りなく1か0で表現できるようになるのでは？という仮定からこれを実施した。
これが1位まで上り詰めることができた決定打となった。

# まとめ
ビギナー限定のコンペで順位もあまり関係がない、ということで喜んでいいことなのか微妙なところだが自信はついたので取り組んでよかった。

こんなしょぼいデータ分析では実務レベルには耐えられない気がするのでもっと詰めていけるようになりたい。
ページ内ジャンプ


# ページ内ジャンプとは
#### ページ内（シングルページ等で使い勝手が良い）で更新せずにダウンスクロールで指定した要素に飛ばしてくれる機能。

######⚠️下の「ここをクリック！」は画像の為実際に押せません
![565a83a908b7b8ae4f73ca0ed734fdc7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/725167/3f7f34e4-cee8-0b0e-1a34-875d8c40a86d.png)
*ヌルッと指定の要素へ⬇️*
![c9f9e31159d77b59c602738a7be35bbb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/725167/eb4fcd7f-7805-bcbd-2413-4e969085698d.png)

#HTMLの記述
```java:ジャンプボタン
<a href="#sample">ここをクリック！</a>
```
```java:ジャンプ先(アンカー)
<h2 id="sample">これは見出しです。</h2>
```

#コードで使い方を説明
```java:sample.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>sample</title>
  </head>
  <body>
    <h1>page内ジャンプの使い方</h1>
    <p>
      <a href="#link">クリックすると飛びます</a>
    </p>
    <p style="padding-top: 1000px">
      <a name="link">ジャンプ先です</a>
    </p>
  </body>
</html>
```

#飛ばす速度(スクロール速度)を調整する
###①HTML
```java:html
<a href='#target'>Topへ戻る</a>
```
###②jQuery
```java:jQuery
// ページ内リンクのみ取得します。
$('a[href^=#]').click(function(){
    //デフォルトのイベントをキャンセル
    event.preventDefault();
 
    // 移動先となる要素を取得します。
    var target = $(this.hash);
    if (!target.length) return;
 
    // 移動先の位置を取得します
    var targetY = target.offset().top;
 
    // animateで移動します
    $('body').animate({scrollTop: targetY}, 500, 'swing');
});
```
###速度調整
```java:jQuery
var targetY = target.offset().top - 50;
```
###倍速でスクロール
```java:jQuery
$('body').animate({scrollTop: targetY}, 1000, 'swing');
```
###画面内スクロールはシングルページでかなり使えますし、UIの使い勝手を考えた素晴らしい技術なのでおすすめです！
BIで会計の仕訳データを集計してみる

# はじめに
Business Intelligenceの最もメジャーな使い方というのは**明細データを集計して全体を把握すること**だと思います。
例えばPOSシステムの売上データ。
いつ、どの店で、誰が、どんな商品を、いくらで購入したか　という情報を
　・地域別商品毎 売上推移
　・顧客層別商品毎　売上分析
など、多種多様な軸を用いてデータを分析します。
アドホックに分析した内容を定点観測の形にする、という流れですね。

Business Intelligenceの中では今のような売上分析の他に、IoTなどのセンサーデータのリアルタイムの可視化や、SFAから販売管理までのカスタマージャーニーの分析など、分析するデータは山ほどあります。

今回はその中でも、財務会計データの分析についてを記事にします。

例えば全社の売上から始まり、部門集計、課集計、商品単位の集計など、Business Intelligenceの世界では、最上位から明細までドリルダウンして、大局的な流れから詳細の要因までを分析する手法が一般的です。

財務会計データの場合、明細データは**仕訳データ**になります。
この仕訳データが、POSの売上データなどと異なり、分析するにはクセモノになるのです。

本記事ではクセモノである仕訳データの分析の方法についてを解説します。


# 仕訳データとは
データ分析を生業としている人間として、この10年で様々なパッケージの仕訳データを見てきました。
扱った会計システムのパッケージは5種類あります。
10年前と今では仕訳データの持ち方が異なるのですが、現在の仕訳データはおおよそこのような構成になっています。

|項目 |
|---|
|伝票番号|
|年月日|
|借方部門コード|
|借方部門名|
|借方科目コード|
|借方科目名|
|借方補助コード|
|借方補助名|
|**借方金額**|
|貸方部門コード|
|貸方部門名|
|貸方科目コード|
|貸方科目名|
|貸方補助コード|
|貸方補助名|
|**貸方金額**|
|決算区分|
|摘要|

# 仕訳データを分析する

### 仕訳データは同じデータを２度集計する

仕訳データが通常の売上データと異なるのは、**集計項目が２つあることです。**
売上データであれば、**売上金額**を集計すればよいのですが、仕訳データの場合は、1レコードの中に借方金額、貸方金額という２つの集計対象の項目があるのです。

仕訳データを集計して、最終的に可視化したいことはおおよそPL表関連のデータとなります。
その場合、借方貸方問わず、科目単位での集計が必要となります。

この時点で、貸借合計金額を計算する場合に、仕訳データを２度集計する必要がございます。
すでにこの時点でトリッキーですね。


### 仕訳データは科目の貸借区分を見る

２度集計するだけじゃありません。
もうひとつ、**貸借区分**を判定することが重要です。

勘定科目には、科目のひとつずつに貸借区分が振ってあります。
こちらの記事が参考になると思います。
[「税理士いらず」の勘定科目一覧表](http://z-irazu.jp/kamoku_list.php)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657414/539581b4-f546-9c1a-d748-84feb0308d6b.png)

このような形で、科目には貸借の区分がついているのです。
当座預金なら借方の科目、買掛金なら貸方の科目となります。

例えば現金であれば、借方科目ですが、仕訳上は借方金額、もしくは貸方金額にデータが入るのです。
仕訳の原理で考えると、当然ですよね。

さて、そうなると、BIで分析をするときに、気にしないとならない点があります。


### 仕訳データをサマリする

今までの流れを追いますと
**①仕訳データは勘定科目ごとに貸方金額、借方金額のそれぞれで集計をする**
**②勘定科目の貸借区分を判定する**
という必要性がご理解いただけたかと思います。

勘定科目ごとの貸借区分が判定出来たら、最後の仕事です。
**③"借方-貸方"なのか"貸方-借方"なのか、科目ごとに式を分ける**

とする必要がございます。

例えば"現金"であれば借方の項目なので、仕訳の借方金額に載っている数値が正となります。
逆に貸方金額に載っていると負の扱いになります。
データ上、仕訳は正負がありませんので、明示的に支持をする必要があるのです。


ここまでをおさらいすると、
POSのような売上金額であれば、売上テーブルの中の売上金額を集計すればよいだけのところを、
仕訳データが対象となると
**①仕訳データは勘定科目ごとに貸方金額、借方金額のそれぞれで集計をする**
**②勘定科目の貸借区分を判定する**
**③"借方-貸方"なのか"貸方-借方"なのか、科目ごとに式を分ける**

という３つの要素が必要となるのです。

### 対処策はいろいろ
そのような理由で、仕訳データをただ単純に集計しただけでは、求める数値は出てきません。
先ほどの３要素を攻略する必要があります。

ただし、BIツールの力だけで、クエリ発行→仕訳の集計は製品上できないツールが多いので、
データマートやキューブという集計済のデータを作ることが得策となります。

今回の場合は、①～③の要素を計算したデータを明細状態で保持することとなります。
世の中のパッケージはこの状態のデータを出力できることが多いです。
なので、仕訳に固執せずに、①～③が実装された後のデータを出力し、BIシステムに取り込むことを推奨します。


もうひとつは、PL表のデータを取り込むこともオススメです。
会計パッケージのほとんどはPL表の科目で集計されたデータを出力することができます。
それをBIツールに取り込み、可視化するだけでも効果は絶大です。

MotionBoardに代表されるように、PL表の集計したデータソースから、仕訳の明細表にリレーションをすることも可能です。
例えば、PL表の中で、画面左のように売上高の予実推移を表示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657414/58373a19-0fe7-68f4-b7cd-15bc0091fd38.png)

特定の月の売上が低いことがわかったら、その部分をクリックすれば、別の画面で**仕訳データの一覧**を表示することが可能です。
このようにPL表のデータ、仕訳のデータという元データが違う状態でも、詳細を掘り深められるBIツールが今後重宝されることと思います。


言葉だけの説明で、わかりにくい箇所もあると思うのですが、BIツールにおける仕訳データの集計の注意点について、投稿させていただきました。
macでQiitaを書くときのメモ

#macでQiitaを書くときのメモ

##カーソル移動

* control+f　:右移動
* control+b　:左移動
* control+n :下に移動
* control+p :上に移動
* control+a  :行頭に移動
* control+e　：行末に移動



##削除

* control+d:右側の文字を削除
* control+h:左側の文字を削除
+ control+k:右側から行末まで削除
+ control+y:kで削除した文字を貼り付け

##safariの移動
+ tab+control:タブ移動
+ command+t:タブ新規作成
+ command+option+f:ネット検索バーに移動
+ command+window:タブを閉じる
「SOAP」「WSDL」って何？初めて聞いた。。

## SOAPって何・・・？WSDLとかいうのもある・・・
 仕事で外部とやり取りをするAPIの設計書に「SOAP通信で行う」「WSDLがどうのこうの～」という記述があるのを発見して「何すかそれ・・・石鹸？しかもWSDLに至っては何も分からん・・・」となったので調べました。

## SOAP
   * 「Simple Object Access Protocol」の略で、ネットワーク越しにサービスを呼び出すためのデータのやり取りを決めた仕様のこと（＝APIの仕様の一つ）。
    <br>同様にAPIの仕様の一つである「REST」と比較されることが多いみたいです。
   * SOAPでは、HTTPのPOSTメソッドを利用してXMLデータのやり取りを行う。（GETも利用可能らしい）


## WSDL
   * 「Web Services Description Language」の略で、Webサービス＝WebAPIの仕様を記述するためのデータ形式のこと。SOAPと同時によく利用されるらしい。
   * WSDLはXMLで記述されており、あるWebAPIがどんなメソッドを公開しているのか、アクセスすべきURIはどこか、渡すべきパラメータは何か、戻り値は何か、利用すべき名前空間は何か、といったことが記述されている。
   * WSDLを読み込むことで、リクエストデータを自分で生成しなくても、どのメソッドを呼び出して、どのパラメータに何を渡すかを指定すれば、自動的にリクエストデータを生成してAPIを利用できるようになるという便利なモノ。

<br>
##### 「SOAP通信を使ったAPIを作って外部APIとデータのやり取りをして、その際にWSDLを使ってより簡単にリクエストデータを作るよ！」
ということだったんですね！これでまた一つ知識を得た！


## 参考URL

* [SOAPを利用したWeb API](https://thinkit.co.jp/free/article/0609/8/3)
* [3.8 Web 2.0時代のWebServices ～SOAP/REST使い分けの指針](http://xmlconsortium.org/wg/web2.0/teigensho/4--REST-SOAP.html)
* [WSDL：Webサービスのインターフェイス情報](https://www.atmarkit.co.jp/ait/articles/0303/18/news003.html)
【Web制作&開発者向け】「Git超入門&EC-CUBE最新情報！」 | EC-CUBE名古屋 vol.76

# 今回は文字が多いので Qiita スライドモードでお送りします

----

## 自己紹介

- 名前: 大河内健太郎(@nanasess) 年齢: 43才
- 出身: 愛知県西尾市一色町
- 在住: 大阪市(四天王寺の近く)
- 前職:寿司屋の板前
- 資格: 調理師・ふぐ処理師
- EC-CUBE コミッター・公式エバンジェリスト
- 最近のマイブーム: Civilization® VI 

----

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">R言語界隈で有名なプログラマHadley Wickhamは、Gitを使わないソフトウェア開発を&quot;Coding without commits is like free-climbing&quot;（命綱無しでするロッククライミングのようなもの）と言っていた。金属を打ち込む一つ一つの場所がcommitに相当する。言い得て妙な喩えである。 <a href="https://t.co/3TmjMrmH8l">https://t.co/3TmjMrmH8l</a></p>&mdash; やすい (@yas_tnk) <a href="https://twitter.com/yas_tnk/status/949850554825695232?ref_src=twsrc%5Etfw">January 7, 2018</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

----

## Git の特徴

- 最悪なUX
- 多機能
- 速い

----

## GitHub や Bitbucket

- Git で共同作業するための Webサービス
- 独りで使うのもあり
- 無いと途方に暮れる

----

## Git 超入門

- 使いこなせなくていい(エンジニアでもフルに使いこなしてる人は稀)
- とりあえず今日は2つだけ覚えて帰りましょう
  - `git add` ファイルをリポジトリに追加する
  - `git diff` 差分を確認する

----

# git add と git diff だけで、(とりあえず)差分が確認できるようになります

----

## そのあと覚えるといいコマンド

- `git commit` ファイルを履歴に保存する
- `git log` 履歴を確認する
- `git status` 状況を確認する

----

## 共同作業するためには

- `git branch` ブランチを作成する
- `git checkout` ブランチからファイルを取り出す
- `git push` 履歴をリモートに保存する
- `git pull` 履歴をリモートから取り出す
- `git merge` 履歴を取り込む

----

## 参考にすると良いサイト

- [サル先生のGit入門](https://backlog.com/ja/git-tutorial/)

----

# EC-CUBEの最新情報

----

#＃ EC-CUBEの最新情報

- 4.0.5 リリース
- 4系APIプラグイン
- 2系の weekly ビルド
- PHP8の対応状況

----

# 質疑応答

----

# ご静聴ありがとうございました！

----
無限反復を含むパズル/ゲームをCoqで定義する

Coq、もっと言えば数学的にパズルやゲーム等を扱う上で**無限反復**の難しさがあります。

Coqでは再帰関数として**停止性が明らかなもの**しか認められないという制限があるためです。[^1]
[^1]: FunctionやProgram Fixpointで停止性の証明付きで再帰関数を書けますが、停止しない可能性がある関数は書けません。

しかし一方で現実で扱う問題には無限反復は日常的にあります。

迷路では通ったところを繰り返しぐるぐる回ればいくらでも続けることができ、

囲碁では３コウといって、反復が続いて抜けられないので無勝負となる場合があります。

このような状況では数学は無力なのでしょうか。

## サンプル問題：迷路

サンプル問題として迷路を考えます。![パズル画像（横）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135284/8bbf4336-8234-619c-a7c5-ba3288ee637c.png)


このように`2`をスタート、`0`をゴールする一直線上の迷路問題です。
一度の移動で右または左に`1`動くことができる、とします。

皆さんは解けますか？

## ナイーブな再帰関数定義

自分の状態（位置）を自然数`n`とし、左右への移動を定義します。

```coq
Definition go_right (n : nat) := S n.
Definition go_left  (n : nat) := pred n.
```

このとき、この迷路を解く（解けるなら`true`を返す）プログラムは以下のように書けます。

```coq
Fixpoint maze (n : nat) : bool :=
  match n with
  | 0 => true
  | _ => maze (go_right n) || maze (go_left n)
  end.

Compute maze 2.
```

しかし！残念ながらCoqはこの関数を受理しません。

```
Recursive definition of maze is ill-formed.
```

この関数は停止性の根拠がなく、実際、計算順が左からならば`n = 2`でも停止しません。[^2]
[^2]: `2`から`3`への移動を禁じても、`1`と`2`の間を往復し続けるでしょう。 

## 解決法１：帰納的にゴール到達可能状態を定義

解決方法の一つは、後退解析の考え方に基づく方法です。
ゴールの状態を始点とし、ゴール到達一歩前、二歩前、…のように順繰りに全てのゴール到達可能な状態をカバーしていきます。

```coq
Inductive goal_reachable : nat -> Prop :=
  | OnGoal : goal_reachable 0
  | RightToGoal (n : nat) (H : goal_reachable (go_right n)) : goal_reachable n
  | LeftToGoal (n : nat) (H : goal_reachable (go_left n)) : goal_reachable n.
```

すると`2`がゴール到達可能であることを「左がゴール到達可能なら到達可能」ルールの適用で証明できます。

```coq
Example goal_reachable_2 : goal_reachable 2.
Proof.
  apply LeftToGoal.
  simpl.
  apply LeftToGoal.
  simpl.
  apply OnGoal.
Qed.
```

一方で、後退解析を用いることは、「最初にスタートにいる」というパズル/ゲームの自然な定義から離れてしまう感じもします。

## 解決法2:深度制限付き再帰関数の極限値で定義

そこで再帰関数での定義を再度試みます。

```coq
Fixpoint maze (d n : nat) : bool :=
  match n with
  | 0 => true
  | _ =>
    match d with
    | 0 => false
    | S d' => maze d' (go_right n) || maze d' (go_left n)
    end
  end.
```

停止性を明示するために、再帰の最大深さ`d`を設定しました。

```coq
Compute maze 0 2.
Compute maze 1 2.
Compute maze 2 2.
```

```
     = false
     : bool
     = false
     : bool
     = true
     : bool
```

深さ`2`あればゴールに到達できることがわかります。
一方でこの`2`は結果的にわかった値であり、予め知ることはできません。

そこで、逆に「ゴール到達可能」の定義を変える方法があります。

```coq
Definition goal_reachable' (n : nat) :=
  exists m : nat, forall d : nat, m <= d -> maze d n = true.
```

「ある`m`があって、全ての`d`について`m <= d`なら制限深さ`d`でゴール到達可能」

これは、「制限深さが無い」を「**制限深さが無限**」と読み換えて、ε-N論法により極限値を定義したことになります。[^3]
[^3]: Wikipedia 「イプシロン-デルタ論法」より「数列の収束」の項参照。　https://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%97%E3%82%B7%E3%83%AD%E3%83%B3-%E3%83%87%E3%83%AB%E3%82%BF%E8%AB%96%E6%B3%95

ゴール到達可能の証明も行えて、この新しい定義を人間側が受け入れるならこれでもOK、といえます。

```coq
Require Import Bool.

Example goal_reachable'_2 : goal_reachable' 2.
Proof.
  exists 2.
  intros d H.
  induction d.
  - inversion H.
  - destruct d.
    + inversion H.
      inversion H1.
    + simpl.
      apply orb_true_iff.
      right.
      apply orb_true_iff.
      right.
      destruct d.
      * simpl.
        reflexivity.
      * simpl.
        reflexivity.
Qed.
```

## おわりに

無限をどう扱うにしても何かしらのしこりは残るのですが、一方で無限を気にせず生活できる人間というのは数学を超えた高度な存在なのか、それとも定義に失敗した存在なのでしょうか。
革命的なエクセルのアドインData Streamerをやってみた

###革命が起こった

おとといTwitterで見つけたすごいエクセルの機能をみつけました。
まさに革命的です！

こんな凄い情報を教えていただき、誠にありがとうございました！！


<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">え、Excelに追加されたDataStreamerってこれもしかして超楽なやつ？？<br>適当にArduinoシリアル接続してシリアル通信でセンサーの値吐くだけでExcel上でログ取れる？マジ？？<a href="https://t.co/MRZT3wmvMk">https://t.co/MRZT3wmvMk</a></p>&mdash; コンノ＠戦車作る人 (@john_kon) <a href="https://twitter.com/john_kon/status/1311245188765868032?ref_src=twsrc%5Etfw">September 30, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


##さっそくやってみた

マイクロソフトのサイトに書いてあるとおりにやってみました。
https://support.microsoft.com/en-us/office/enable-the-data-streamer-add-in-70052b28-3b00-41e7-8ab6-8a9f142dffeb

なお、Windowsじゃないとダメらしいです。
<br>

エクセルに
Data Streamerのアドインが追加されました。
[![Image from Gyazo](https://i.gyazo.com/8bb66e5cba21471019d66ae2d58bf863.png)](https://gyazo.com/8bb66e5cba21471019d66ae2d58bf863)

最初は手元にあったM5Stackで試みましたが、文字化けだらけで、うまくいかなかったので、ジャイロ・加速度センサーMPU6050 を Arduinoをつなげ、昔書いたコードで試してみました。
（コードは省略）
<br>

エクセルで
Data Streamer > デバイスの接続

うまく接続できるとこんなシートが現れます。
[![Image from Gyazo](https://i.gyazo.com/822f21b9da9284544adb1508f7e9007a.png)](https://gyazo.com/822f21b9da9284544adb1508f7e9007a)

シート「設定」では、
データの取得感覚などを設定できます。
[![Image from Gyazo](https://i.gyazo.com/6a404d007a20dc7640edb82acb5829fa.png)](https://gyazo.com/6a404d007a20dc7640edb82acb5829fa)

<B>Data Streamer > 設定
ボーレートはArduinoIDEのと同じにします。
※ここを設定してなかったので結構ハマりました。</B>
[![Image from Gyazo](https://i.gyazo.com/8a11e1551c596d67d4718cab3298ca64.png)](https://gyazo.com/8a11e1551c596d67d4718cab3298ca64)



##そして

Data Streamer > データの開始



おお、センサーからArduinoを経由してシリアルでエクセルに送れました！！
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">FF外から失礼します。感動のあまり直ぐやってみました。まさに革命ですね。 <a href="https://t.co/hQv4NEnyQC">pic.twitter.com/hQv4NEnyQC</a></p>&mdash; たつや (@tatsuya1970) <a href="https://twitter.com/tatsuya1970/status/1311680768561696769?ref_src=twsrc%5Etfw">October 1, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<br><br>
まさに。革命的です。

IoTのプロトタイプするにはもってこいですね。

<br>
Golangで対話型CLIツールの作り方

golangで対話型のCLIツールを作成する。

コマンドを叩くと入力待ちの状態となり、
適切な値を入力するまで無限ループする。


## 必要なパッケージ
- bufio
- os

## サンプルコード
```go
package main

import (
	"fmt"
	"bufio"
	"os"
)

func main() {
	fmt.Println("stop と入力して下さい。")
	scanner := bufio.NewScanner(os.Stdin)
	for scanner.Scan() {
		if scanner.Text() == "stop" {
			break
		}
		fmt.Println("stop と入力されるまでループします。")
	}
	fmt.Println("終了します。")
}
```
```go
// このメソッドで入力待ちとなる
scanner.Scan()
```
```go
// 正常に入力値を受け取ると true を返す
val := scanner.Scan()
fmt.Println(val)
// => true
```
```go
// 入力された値はこのメソッドで呼び出せる
scanner.Text()
```
dockerについて学んだことをとにかく書いていく(1つ目)

# 次回
[dockerについて学んだことをとにかく書いていく\(2つ目\) \- Qiita](https://qiita.com/taninao1122/items/71bfd466e15adda5ae42)

# 参考図書
[Docker/Kubernetes 実践コンテナ開発入門 \| 山田 明憲 \| コンピュータ・IT \| Kindleストア \| Amazon](https://www.amazon.co.jp/Docker-Kubernetes-%E5%AE%9F%E8%B7%B5%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E9%96%8B%E7%99%BA%E5%85%A5%E9%96%80-%E5%B1%B1%E7%94%B0-%E6%98%8E%E6%86%B2-ebook/dp/B07GP1Q3VT/ref=sr_1_2?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=3M8BPC6XQJ2SA&dchild=1&keywords=docker+kubernetes&qid=1601461470&sprefix=docker+%2Caps%2C263&sr=8-2)

# Dockerコンテナオーケストレーションシステム
複数のノードをまたいで多くのコンテナ群を管理する手法
## Docker Swarm
- Docker Composeを単一のサーバだけではなく、複数のサーバをまたいで複数のコンテナを管理できるようにしたもの
- 複数のコンテナ群の管理だけではなく、コンテナの増減、ノードのリソースを効率的に利用するためのコンテナを配置や負荷分散などの機能も用意されている

# DockerイメージとDockerコンテナの相関
### Dockerイメージ
- Dockerコンテナを構成するファイルシステムや実行するアプリケーションをまとめたもの
- コンテナを作成するための利用されるテンプレート

### Dockerコンテナ
Dockerイメージをもとに作成され、具現化されたファイルシステムとアプリケーションが実行されている状態

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472955/840d19a8-df36-9ea3-5e13-46f1b6a19a14.png)

- DockerイメージはUbuntuのファイルシステムと実行するアプリケーションを含む

# Dokcerfileのインストラクション(命令)
## FROM 
dokcerイメージのベースになるやつ

## RUN
`Dockerイメージビルド時に、Dockerコンテナ内で実行するコマンド`

## COPY
Dockerを動作させているホストマシン上にファイルやディレクトリをDockerコンテナ内にコピーするためのインストラクション

#イメージのビルド

```
docker image build -t イメージ名[:タブ名] Dockerfile配置ディレクトリパス
```
-t　オプションには任意のイメージ名を指定可能。オプションであるがほぼ必須

## ENTRYPOINT
### ENTRYPOINTを利用するとコンテナのコマンド実行の仕方を工夫することができる
- ENTRYPOINTを指定するとCMDの引数はENTRYPOINTで実行するファイルの引数となる
- ENTRYPOINTはイメージの作成者側でコンテナの用途をある程度制限したい場合に活躍できる

# その他インストラクチャ
## LABEL 
イメージの作者名記入

## ENV 
Dockerfileをもとに生成したDockerコンテナ内で使える環境変数を指定

## ARG
ビルド時に情報を埋め込むために使用

# Dockerポートフォワーディング
- HTTPリクエストを受けるアプリケーションの場合は、コンテナの外から来たリクエストをコンテナ内で実行しているアプリケーションにまで到達させる必要がある
- ポートフォワーディングではコンテナポートに紐づけ、コンテナの外から来た通信をコンテナポートに転送することができる。

```
dokcer container run -p {ホスト側ポート}:{コンテナ側ポート} {以下いろいろコマンド}
```
DOM操作を合言葉で理解しよう

#はじめに
JavaScriptについては初投稿。学習３日目。理解に時間がかかったところを中心にまとめる。とにかく、新しい言葉が多くて、中々頭に入らない。

#JavaScriptで何ができるの？
　HTMLを操作できる。操作とは、背景色を変えたり、プルダウンメニューを表示させたり。今回はそのHTMLの操作について少し説明をする。

##DOM
　DOMとはDocument Object Modelの略で、HTMLのデータを解析して、データを作成する仕組みのこと。JavaScript(以降、JS）では、DOMを操作することでHTMLを操作している。

　操作についてコードを書くときに、必要な合言葉がある（自作）

<font color=red>〇〇に、△△したら、□□する</font>

つまり、「ユーザーが何をした時に、どんな動きをするのか」をJSで操作をする。
以下、この合言葉を意識しながら、説明していく。

##○○に

 操作をするにしても、どこに操作をするのか、JSで定義をしてあげなければならない。そこで、HTMLから何を頼りにするかだ。
　id名やclass名は指定すれば、簡単に要素にたどり着くことができる。これは、CSSで装飾する感覚に似ている。

　documentオブジェクトのメソッドを使う。Documentオブジェクトはブラウザにある、windowオブジェクトの一つ。ブラウザ上で表示された、情報を操作することができる。
①`getElementById("id名")`
→HTMLから( )に入れたid名の要素を取得する。

②`getElementsByClassName("class名")`

→HTMLから( )に入れたclass名の要素を取得する。
※Element<font color=red>s</font>と複数形になっている点に注意。同じclass名はいくつでもつけられるので、初めから複数個取得する想定。一方、同じid名は一つのHTMLファイルには存在し得ないので、Elementは単数形。

③`querySelectorAll("セレクタ名")`
→HTMLから( )に入れたセレクタを全部取得する。
※Allを取ると、指定したセレクタの一つめだけを取り出すことになる。

```js
const note = document.getElementById("text")
```

上記のコードは、HTMLファイルのidがtextの要素をnoteという変数に入れる、となる。documentオブジェクトの中のメソッドを使って、取得しているので、必ず、「document.」をつける。

一つ一つのメソッド名は長いが、どれもHTMLの要素を取得するだけの処理だと言うことを意識する。

##△△したら
　ここでは、ユーザーが何をしたら、JSの処理が動くのかを定義する。具体的には、クリックをしたらやマウスのカーソルを合わせたらなどがある。

addEventListenerメソッドを使う。
`要素.addEventListener("イベント",関数)`
イベントとは、ブラウザ上で起きた出来事。単純にクリックしたや再読み込みしたなど。

要素とは、「〇〇に」のこと。

つまり、コードを書くと、

```js

note.addEventListener("click",function(){})
```
先ほど定義したnote（HTML上でid="text"となっているもの）を<font color=red>クリックしたら、</font>となる。

##□□する
　ここでは、実際にHTMLに何かをさせる処理を説明していく。
具体例としては、

①`要素.setAttribute("属性","値")`
→要素の開始タグの中に、属性と値を追加（値の変更）する。

②`要素.removeAttribute("属性","値")`
→要素の開始タグの属性と値を削除する。

要素とは、「〇〇に」のこと。

##まとめ

```js
const note = document.getElementById("text")       #HTMLのidがtextに
 note.addEventListener("click",function(){         #クリックすると
 note.setAttribute("style","background-color:red") #背景色を赤にする
})
```

##ポイント

- [x] 　要素を取得する、イベントを指定する、動作させる。の３段階。
- [x] 　○○に、△△したら、□□する。


#最後に
JSはコードが長くて、ごちゃごちゃするが、一つのコードが行っている処理は一つなので、落ち着いて読み解く。

合言葉に当てはまる言葉で、大喜利にしないで（笑
Rotrics DexArm を python APIで動かす


Rotrics DexArm を入手したので、python API で動かしてみます。
アーム位置の調整には、[Rotrics Studio](https://www.rotrics.com/pages/download)を使っています。


## 環境
* Windows10
* python 3.7.9

## API の入手
Rotrics の [レポジトリ](https://github.com/Rotrics-Dev/DexArm_API)から、`pydexarm.py`を入手して、作業ディレクトリに配置しました。

## 動かす
`pydexarm.py` と `example.py` を参考に、動作を記述します。
`Dexarm`の引数には、割り当てられたポートを入力します。
ポートは Rotrics Studioの接続画面、またはデバイスマネージャーの USB シリアルデバイスで確認できます。

```demo.py
from pydexarm import Dexarm


def main():
    dexarm = Dexarm("COM3")  # 接続されたポート番号
    dexarm.go_home()

    dexarm.move_to(350, 0, 0)
    dexarm.move_to(350, 0, -50)

    dexarm.soft_gripper_pick()

    dexarm.move_to(350, 0, 100)
    dexarm.move_to(350, 0, -50)

    dexarm.soft_gripper_nature()

    dexarm.move_to(350, 0, 0)
    dexarm.go_home()


if __name__ == "__main__":
    main()

```

## 実行結果
[このように動きます](https://youtu.be/uSdTPCWNzwk)
ServiceNow - REST API Explorerを使う

#概要
REST API ExplorerとはServiceNowのAPIを使うプログラムを作成する場合に利用できるツールです。
REST API Explorerを使うと次の利点があります。

1. ページからServiceNowのAPI設定を行えます
1. 実際にそのAPIを呼び出しでデータを取得することができる
2. 設定したパラメータを含むソースコートを生成することができる
　（ServiceNowスクリプト、cURL、Python、Ruby、JavaScript、Perl、Powershell）

#REST APIを利用してインシデントデータを取得するスクリプトを作成する手順
1.アプリケーションナビゲータから「REST」を検索して、「システムWebサービス」下の「REST API Explorer」を選択
![rest_api_explorer_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/10011996-bc92-e907-b2ec-12d26a286f12.png)
2.今回はServiceNowインシデントを取得するため「Retrive records from a table (GET)」を利用。tableNameを「インシデント」に指定。
![rest_api_explorer_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/65fbae75-2da9-d040-ddf3-6e896c918b9b.png)
3.先ず試しにデータを取得して見る。
ページの下の方にある「送信」ボタンを押下。
![rest_api_explorer_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/1f206d7c-ba80-6d37-ad15-6ce71ea1ad27.png)
4.ページの下に結果が表示される。試しなので1レコードのみ取得される。
![rest_api_explorer_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/e2319a5a-32cf-7298-f0ce-70c9fe64b6aa.png)
5.取得条件を絞る。Webブラウザで別タブを開いてServiceNowページを表示する。
アプリケーションナビゲータから「インシデント」を検索して、「インシデント」下の「すべて」を選択。
![rest_api_explorer_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/af816d71-2a33-20fd-eba2-8e08a2dc5e09.png)
6.漏斗アイコンをクリックして条件を入力する
![rest_api_explorer_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/4e83a015-5166-d9cc-e261-d9a4bb47040c.png)
7.更に列ヘッダの検索フィールドに文字列を入力して結果を絞る
![rest_api_explorer_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/52d8c073-f30d-9056-9958-0fc07cefde1a.png)
8.ブレッドクラムを右クリックして「クエリのコピー」を選択
![rest_api_explorer_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/1f2c6282-eeb5-1048-8d25-ceca1cb27b95.png)
9.元のREST API Explorerに戻り、「sysparam_query」フィールドを右クリックして「貼り付け」を選択
![rest_api_explorer_20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/a86cf851-5300-b4a5-0775-dc0febf266a3.png)
10.検索条件が入力される。
最大10件のレコードを取得するようにする。「sysparam_list」を「10（テストでは、結果は10件に制限されています）」を選択。
取得するフィールドも制限する。「sysparam_fields」右の鉛筆アイコンを選択
![rest_api_explorer_21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/589f5995-30fd-fe11-a69a-93869b948b62.png)
11.取得するフィールド名を選択した後に「保存」ボタンを押下
![rest_api_explorer_22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/94755789-e75d-8061-2fef-d6e6098b1a19.png)
12.再び試す。
「送信」ボタンを押下
![rest_api_explorer_23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/0def5907-a556-ccb3-1715-83089b0d73d9.png)
13.指定した条件のデータが取得されたことを確認
![rest_api_explorer_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/f7515a40-f4c3-64dc-0446-f793fc55e424.png)
14.ページ中央にある「コードサンプル」へ移動
今回はJavaScriptのソースコートを生成して見る。「JavaScript」リンクを選択
![rest_api_explorer_30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/ce5d0e1b-2dc0-0e8d-e3e5-ed2b3dfa3c17.png)
15.JavaScriptのソースコードが表示さる。「スニペットの選択」ボタンを押下するとコードはコピーされる。
![rest_api_explorer_31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/19e371e0-b57e-15c0-7e47-b65531df468f.png)
【Xcode12】久しぶりにXcode触って、storyboardが以前と違って焦ったこと

Xcode12にしてみて、
久しぶりにXcode触ったら、いろいろ戸惑った。


##storyboardが無い！

困った、困った。


と思いきや、

Xcode 11からは、ダウンロードした直後では、デフォルトでSwiftUIが選択されており、

新規プロジェクトの設定画面で、
<B>「User Interface」　に　「Storyboard」</B>を選べば大丈夫。

[![Image from Gyazo](https://i.gyazo.com/35b5be28f139fc942d61e443771e8aa0.png)](https://gyazo.com/35b5be28f139fc942d61e443771e8aa0)


## Labelとか、Buttonはどこ？

右上のプラスマークを押せば出てきました。
[![Image from Gyazo](https://i.gyazo.com/e3629acd1127311d51c13711068e81cc.png)](https://gyazo.com/e3629acd1127311d51c13711068e81cc)

ほら
![スクリーンショット 2020-10-02 22.01.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291592/ba9f02d5-e6e7-9058-358c-57378a3b2a89.png)
<br>
c言語用Makefileテンプレート

# 背景
c言語で簡単なアプリを作るときに毎回同じようなMakefileを使っているが、その度に大体同じ内容をしらべており、面倒なのでテンプレートファイルを残す。
もっと良い書き方があればコメントください。

# Makefile

```makefile
CC = gcc
CFLAGS = -g3 -MMD -O0
#LDFLAGS =
TARGET = sample # need to change
SRCS = $(wildcard *.c)
OBJS = $(SRCS:%.c=%.o)
DEPS = $(SRCS:%.c=%.d)
RM = rm -f

.PHONY: all
all: $(TARGET)

$(TARGET): $(OBJS)
        $(CC) $^ -o $@ $(LDFLAGS)

%.o: %.c
        $(CC) $< -c $(CFLAGS)

.PHONY: clean
clean:
        $(RM) $(TARGET) $(OBJS) $(DEPS)

-include *.d
```
あとはMakefileと同じディレクトリにソースファイルを配置する。
機能要件、非機能要件

#【機能要件、非機能要件】

システム開発において、機能要件と非機能要件がある。
まとめたものを備忘録として残します。
IPAのサイトを参考にさせていただきました。

##機能要件

要件定義の中で「実装する機能」に関する要件のことを機能要件という。
実際にユーザが必要になる機能は機能要件として分類される。
Webサービスやアプリケーションがユーザに提供しなければならない機能そのものである。

・プロセス機能
・データ機能
・インターフェース機能　など。

##非機能要件

当たり前だが、機能要件以外のものを指す。
システムが実現する必要のある機能以外のもの。
要件定義の中で、システムの性能など「実装する機能以外」に関する要件を非機能要件という。

・品質要求
・技術要求　
・運用、保守　など。

##非機能要求グレードでの6分類

非機能要件は、情報処理推進機構（IPA）が大きく6つのカテゴリに分類している。
良いシステムをリリースするためにこれらを満たした要件定義を心がける。

###・可用性
運用スケジュールや障害発生時の復旧などに関する要求は可用性に分類される。
バックアップ体制や障害発生時の回復方法を確立し、対策する。

###・性能、拡張性
ピーク時の負荷や業務量増加の対応などに関する要求は性能/拡張性に分類される。
ソフトウェア内部の処理を効率化したり、ネットワーク機器の配置に配慮したりする。

###・運用/保守性
システム運用時の稼働率や問題発生時の対応などに関する要求は運用、保守性に分類される。
正常運用のための監視の充実や、運用マニュアルの拡充をする。

###・移行性
新システム移行に関する要求は移行性に分類される。
移行までのスケジュール調整や、リハーサルの実施する。

###・セキュリティ
利用者の制限や不正アクセスの防止などに関する要求はセキュリティに分類される。
アクセスの制限や不正利用者の監視、社員への情報セキュリティ教育をおこなう。

###・システム環境、エコロジー
システムの設置環境や消費エネルギー量などに関する要求はシステム環境、エコロジーに分類される。
設備に適した機器の選定、環境負荷を低減させるシステムの構成をおこなう。
【Pythonメモ】2次元配列(リストのリスト)の作成で注意すること

##0.問題

__1行目に行(n1)と列(n2)が、2行目以降にn2列の.または#がn1行入力されます。
2行目以降のn1行の文字列を2次元配列に格納してください。__


##１．入力データ

例として以下の入力データを与える

```
3 5
#####
.#.#.
#.#.#
```

###2．コード例


```python

#作成する配列の行と列をスペース区切りで入力
in1 = input()
arr1=in1.split()

#横に上記で指定したarr1[1]列分の文字列をarr1[0]行文読み込む
in2=[]
for i in range(int(arr1[0])):
    tmp1=input()
    in2.append(tmp1)
        
#以下の二次元配列(arr1[0]行arr1[1]列)を作成
arr2=[[''] * int(arr1[1]) for i in range(int(arr1[0]))]
arr3=[['']*int(arr1[1])]*int(arr1[0])

#上記で定義した2次元配列を表示
print(arr2)
print(arr3)

for i in range(int(arr1[0])):
    tmp2=in2[i]
    for j in range(int(arr1[1])):
        arr2[i][j]=tmp2[j:j+1]
        arr3[i][j]=tmp2[j:j+1]


print(arr2)
print(arr3)
```
###３．出力結果

```
[['', '', '', '', ''], ['', '', '', '', ''], ['', '', '', '', '']]
[['', '', '', '', ''], ['', '', '', '', ''], ['', '', '', '', '']]
[['#', '#', '#', '#', '#'], ['.', '#', '.', '#', '.'], ['#', '.', '#', '.', '#']]
[['#', '.', '#', '.', '#'], ['#', '.', '#', '.', '#'], ['#', '.', '#', '.', '#']]
```

1行目と2行目は、初期化した2次元配列のデータが表示される。
注目するのは__`3行目と4行目の実行結果の違い`__だ。

arr3の全ての配列の値が、入力最終行のデータに置き換わっているのだ。

##４．検証

[Pythonのリスト（配列）を任意の値・要素数で初期化](https://note.nkmk.me/python-list-initialize/)を参考に
上記コードに下記コードを追加する。

```python
print(arr2[0]==arr2[int(arr1[0])-1])
print(arr3[0]==arr3[int(arr1[0])-1])
```

```
False
True
```
arr3の要素のリストが全て同じオブジェクトとして扱われるため、
一つのリストが更新されると他のリストも同じ内容で更新されるという事らしい。

##結論

2次元配列を初期値付きで宣言する場合は

__`リスト名=[[初期値] * 列数　for 任意の変数 in range(行数)]`__

を使う。
ローカルに立てた複数のdocker-compose上のRailsでAPIを叩きたい

### 完成イメージ図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260354/41e04c46-6ec8-b77e-b588-77a49afe7462.png)

### 前提
docker-composeで別々のRails Appを立ち上げておいてください。
こちらではdocker-composeでの設定のみ書きます。
※ ネットワーク等の設定値は参照先にある記事を参考にしています
※ DB = MySQL

### したいこと
ローカルで別々のdocker-composeで立ち上げたRails App間でAPI通信がしたい。
e.g. イメージ図のRails App2のAPIをRails App1から叩きたい

### 何もしない状態で通信してみた時のエラー
キーワードからこのメモにたどり着けるように残しておきます。

```
Errno::ECONNREFUSED: Connection refused - connect(2)
```

### 概要
1. 共通ネットワーク作成
2. それぞれのdocker-compose.ymlのservicesに共通ネットワーク設定
3. リクエストが届くか確認
4. 完成

### 手順
- `docker network create --driver bridge common_link` (共通ネットワーク作成)
- `docker network ls` (作成したネットワーク確認)
- Rails App1とRails App2のdocker-compose.ymlのservicesの階層に `networks:` を定義

`docker-compose.yml`

```yml
services:
.
.
networks:
  common_link:
    external: true
```

- Rails App1, DB1, Rails App2, DB2それぞれのコンテナ設定箇所で `networks` を定義

```yml
services:
  rails_app1:
    networks:
      - common_link
  db1:
    networks:
      - common_link
```

- docker-compose2のMySQLのポートを3306と被らないようにするためにdocker-compose.ymlの修正

```yml
services:
  db2:
    ports:
      - "127.0.0.1:3307:3307"
```

- docker-compose2のRails App2でMySQLをバインドする設定があるなら同じくポート値を変更

```yml
services:
  rails_app2:
    environment:
      DATABASE_URL: mysql2://root:root@mysql:3307
```

- docker-compose2のMySQLのconfigにポート指定
e.g. /Dockerfiles/mysql/conf.d/mysql.cnf

```ini
[client]
port=3307
[mysqld]
port=3307
```

- docker-compose1とdocker-compose2の両方起動
- `docker network inspect common_link` (Rails App1, DB1, Rails App2, DB2の計4つのコンテナが同じネットワークに属している確認)

e.g. `Containers` のところ
![image (8) (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260354/0a6fc90e-16f6-e185-d1f2-6fa0b27f0650.png)

- 問題なさそうならping, curl, API叩いたりしてみてください
  1. docker-compose exec rails_app1 bash
  2. `ping 172.19.0.5` # 上の仮画像で確認したIP(172.19.0.5)を仮にrails_app2とした場合
  3. `curl 172.19.0.5`

- 完成です。お疲れ様でした。

他に良い設定あったら教えてください。

### 参照先
https://qiita.com/reneice/items/20e981062b093264cd0a
Macのターミナルのユーザー名の変更

今回はMacOSのターミナルに表示されるユーザー名の部分の変更の仕方を解説したいと思います。
（今回はMacOS Catalina (2019/10) 以上のバージョンでの説明になりますのでzshというシェルを使用する前提での説明になります。それ以前のOSのMojaveですとbashというシェル名になりますので一部相違してくる内容が出てくると思いますのでご注意ください。）

#はじめに
つい先日知った豆知識みたいなものなんですがMacの環境がささやかながら快適になりましたのでこの記事を見てくださっている皆さんにも共有したいと思いました。

#デフォルトの表示
まず初めにターミナルのデフォルトの表示はこうなっているかと思います。
（表示は分かりやすいように変更してあります。）

```:ターミナル
ユーザー名@ホスト名 ~ %
```



#変更例
この表示を例えばこう変更することが出来ます。

```:ターミナル
~ %
```


これはユーザー名とホスト名を表示しないように変更したものです。
こうするとだいぶスッキリして見やすくなったかと思います。

#ではどのように変更するか

では実際に変更するやり方を解説したいと思います。
結論から言いますと**開発環境の環境変数内**に設定することで好きな表示にカスタマイズすることが出来ます。
開発環境の環境変数とは**「.zshrc」**というディレクトリ（フォルダ）のことです。
このディレクトリを開いてその中に追加をします。
この**「.zshrc」**を開く方法は各々のMacの設定で違うと思いますのでお手数ですが調べて頂けたらと思います。自分の設定ですとターミナルから「vim ~/.zshrc」でディレクトリを開いてその後「i」を押すと編集が可能になるインサートモードというモードに変わりますのでその後編集をします。

#「.zshrc」内の編集
<font color="red">ここで注意なのですが既存の文字（一番上の方にある）は絶対に消したりしないでください。Macが正常に動かなくなる可能性があります。</font>

それでは編集していきます。
下の方の空いている部分をEnterなどで行を作って以下のように編集してください。


```:.zshrc
export PS1="ここに表示したい内容を記述する"
```

例えば最初の方で紹介した変更例の場合は以下のように編集します。

```:.zshrc
export PS1="%1~ %# "
```

これでターミナルの表示が「~ %」のようになります。

----
元のデフォルトの表示にしたい時はこう編集します。

```:.zshrc
export PS1="%n@%m %1~ %# "
```

これでターミナルの表示は元々のご自身の「ユーザー名@ホスト名 ~ %」
に戻っているかと思います。

---

#編集が終わったら
インサートモードの場合はescキーを押してから : w q の順番に押して**[.zshrc]**から抜け出してください。抜け出したらターミナル上で反映させる必要がありますので**「source ~/.zshrc」**を入力してください。
（「:wq」は保存して終了の意味。「:q」は保存しないで終了の意味）
（「source ~/.zshrc」は.zshrcを再読み込みし、変更を反映させるの意味）

---

以上のようにしてターミナルの表示を自由に変えることが出来ます。

では先程の記述した内容について少し説明させて頂きます。
開発環境の環境変数内に新しい環境変数を追加する時は**「export」**のあとに追加したい内容を記述します。今回使用した**「PS1」**というのはプロンプトの表示形式を定める環境変数になります。

それと以下に使用出来る記号の一覧の一部を抜粋して載せておきます。

| 記号 | 表示される内容 |
| --- | ---- |
| %1~ | 〜 |
| %#  |  ％
|\$   |一般ユーザーの時 $、rootの時 # を表示|
| %n  | ユーザ名
|%m   |ホスト名
|%M   |ホスト名
|%~   |カレントディレクトリ
|%d   |カレントディレクトリ
|%c   |カレントディレクトリ(相対パス)
|%C   |カレントディレクトリ(相対パス)
|%#   |ユーザ種別
|%?   |直前のコマンドの戻り値
|%D   |日付(yy-mm-dd)
|%W   |日付(yy/mm/dd)
|%w   |日付(day dd)
|%T   |時間(hh:mm)
|%t   |時間(hh:mm(am/pm))


#おわりに
いかがでしたでしょうか。
是非みなさんもターミナルの表示をカスタマイズして快適なプログラミング生活をお送りください。
今回の記事が少しでもみなさんのお役に立てれば幸いです。

#今回参考にさせて頂いたサイト
[ターミナルの表示内容(プロンプト)の変更・カスタマイズ方法まとめ](https://qiita.com/hmmrjn/items/60d2a64c9e5bf7c0fe60)
[ターミナルに毎回表示される長ったらしい表示を短くする](https://qiita.com/tonkotsuboy_com/items/b752a86cee7eaedf28da#%E5%BF%AB%E9%81%A9%E3%81%AA%E3%82%BF%E3%83%BC%E3%83%9F%E3%83%8A%E3%83%AB%E3%83%A9%E3%82%A4%E3%83%95%E3%82%92)
[Macのターミナル（zsh）のプロンプト表示（ユーザー名等）を変更する方法](https://code-graffiti.com/how-to-change-the-prompt-display-on-the-mac-terminal/)
concrete5 のキャッシュファイルのディレクトリやファイルのパーミッションを設定する方法


- /application/config/concrete.php のファイルを作る
- 以下の内容で自分の希望する権限に変更してアップする
- /application/files/cache 以下のフォルダ・ファイルの権限が指定された権限で表示されます。

```
<?php

return [
    'cache' => [
        'levels' => [
            'overrides' => [
                'drivers' => [
                    'core_filesystem' => [
                        'options' => [
                            'dirPermissions' => 0755,
                            'filePermissions' => 0644,
                        ],
                    ],
                ],
            ],
            'expensive' => [
                'drivers' => [
                    'core_filesystem' => [
                        'options' => [
                            'dirPermissions' => 0755,
                            'filePermissions' => 0644,
                        ],
                    ],
                ],
            ],
        ],
    ],
];
```

※ ただし、サーバー（レンタルサーバー）によってはこの設定が無視される設定をしている場合があります。この設定をしても変更ができようされない場合は、サーバーの大元の設定が原因で変更できない可能性があります。
※ ヘテムルでは動作確認済み (感謝 hdk さん)