OmniAICreator/Qiita-1.07M huggingface dataset:
gem bulletを入れてみた（N+1問題に自分で気づけない人のために）

## 何をしたか
Railsアプリを作っています。`N+1問題`について前々から関心はあったのですが、SQLについて学習が不足していることもあり、自分では気づけないことも多いので、N+1問題が発生している箇所があったら教えてくれる`gem bullet`を入れてみることにしました。

▶︎公式のドキュメントはこちら:[bullet](https://github.com/flyerhzm/bullet)

## 導入方法
以下のコードをGemfileに記載します。

```ruby:Gemfile
group :development do
  gem 'bullet'
end
```
`bundle install`後、以下のコマンドを実行します。

```
bundle exec rails g bullet:install
```
この時、テスト環境にも`bullet`を入れるかどうか聞かれると思いますが、公式の`install`のところには`develop`環境へのインストールだけが記されていたのと、

[公式のテスト環境へのインストールの記述](https://github.com/flyerhzm/bullet#run-in-tests)を見てみても、なんだか色々大変そうだな（今回はそこまで時間をかける必要はない）だったので、今回は見送りました。

### デフォルトで設定される内容

↑上記のコマンドで、`config/environments/development.rb`にデフォルトで以下の様なコードが追加されました。

```Ruby:config/environments/development.rb
Rails.application.configure do
  # ここから
  config.after_initialize do
    Bullet.enable        = true
    Bullet.alert         = true
    Bullet.bullet_logger = true
    Bullet.console       = true
  # Bullet.growl         = true デフォルトでコメントアウトされてる
    Bullet.rails_logger  = true
    Bullet.add_footer    = true
  end
  # ここまでが追加される。以下、同ファイルにもとから入っていた内容は省略
end
```

[bulletの設定可能な項目一覧](https://github.com/flyerhzm/bullet#configuration)は←こちらにありましたが、デフォルトで入っている項目について確認すると、

- `Bullet.enable`...Bulletのgemを利用可能にします。でも、何もしません。
- `Bullet.alert`...ブラウザにJSのアラートを出します。
- `Bullet.bullet_logger`...bulletのログファイルを出します(場所：Rails.root/log/bullet.log)
- `Bullet.console`...console.logに警告を出します。
- `Bullet.growl`...`Growl`がインストールされているときに、ポップアップの警告を出します。
- `Bullet.rails_logger`...railsのログに警告を出します。
- `Bullet.add_footer`...画面左下にメッセージを出します。

...なるほどです。

## 実際の使用画面

実際に使用すると、こんな感じで警告が出ました。
![n+1のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393888/5f1a40ce-35fd-874a-f48e-a75b18b3b622.png)

直し方まで教えてくれていて便利ですね＾＾

## 未解決の問題
ところで、実際のテーブルはこんな感じで。。。。
[![Image from Gyazo](https://i.gyazo.com/3ff5532b162755ce3983340414e8fc9a.png)](https://gyazo.com/3ff5532b162755ce3983340414e8fc9a)

`users`と`images`の両方のテーブルに対して、`N+1`問題が発生していたので、この様に直し...。

```Ruby
#before
@posts = Post.order(created_at: 'DESC')

#after
@posts = Post.includes(:user, :images).order(created_at: 'DESC')
```
実際に、クエリは減りました。。。。

▼beforeの時
[![Image from Gyazo](https://i.gyazo.com/6b029c5d0cf6b08d9851a846eb4d7555.jpg)](https://gyazo.com/6b029c5d0cf6b08d9851a846eb4d7555)

▼afterの時
[![Image from Gyazo](https://i.gyazo.com/2ac982cf4d976aca9d99e1ed8a3f5a41.jpg)](https://gyazo.com/2ac982cf4d976aca9d99e1ed8a3f5a41)

countがいっぱい回っている、という別の問題があらわになりました:joy:

教えていただいて＆調べてわかったのですが、これはまた別の問題のようで、[こちらの方法](https://qiita.com/tanutanu/items/e5399f113360e05032e0)で解決できました！

早くSQLに詳しくなってN＋1問題も素早く発見＆解決＆未然に防止できる様になりたいです:relaxed:
Gitのよく使うコマンド

#Gitコマンド
業務中によく使うコマンドをまとめてみました。

###クローン
任意のフォルダ名(task1)配下にクローンする

```
git clone -b develop git@github.com:XXXX/YYYY.git ~/github/task1
```
###ブランチの確認
```
git branch
```
###ブランチの新規作成
```
git branch task1(ブランチ名)
```
###ブランチの切り替え
```
git checkout task1(ブランチ名)
```
###変更したファイルの状況確認
```
git status
```
###指定したファイルの差分を表示
```
git diff ~/github/task1/lib/screens/XXXX.dart
```
###変更内容をインデックスに追加する
```
git add  ~/github/task1/lib/screens/XXXX.dart
```
###ローカルブランチにコミット
```
git commit -m 'コミット内容を記載'
```
###リモートブランチtask1にプッシュ
```
git push -u origin task1
```
##まとめ
よく使うコマンドだけど、よくわからなくなり毎回調べていたので忘れないように!!
root権限のないサーバーでpipでpython モジュールをインストールする


# 手順

Python virtualenv を使用し、仮想環境からパッケージをインストールする。

```
$ curl --location --output virtualenv-16.1.0.tar.gz https://github.com/pypa/virtualenv/tarball/16.1.0
$ tar xvfz virtualenv-16.1.0.tar.gz
$ python pypa-virtualenv-****/src/virtualenv.py my_env
$ . my_env/bin/activate
(my_env)$ pip install (pillowなど)
```
【Ruby】配列から重複していない要素を取得する

## 概要
配列内の重複していない要素を取得し、計算するというプログラムを書きました。
重複しているものがほしいときには比較演算子の記述を変更すれば取得することができます。認識に間違いがありましたらご指摘いただけたら幸いです。

## 目次

- 実践
    - 問題
    - 解答

- 参考文献

## 実践

#### 問題
>任意の3つの数値の合計を出力するメソッドを作成してください。ただし、同じ数が含まれている場合はカウントしない。

#### 解答
ハッシュを始めに生成しているのは、要素数を計算し、条件に合うものを `select` で取得したいからです。

```ruby
def uniq_num(ary)
  counts = Hash.new(0)                             # ハッシュを生成
  ary.each { |v| counts[v] += 1 }                  # 重複している要素を検索
  i = counts.select { |v, count| count == 1 }.keys # 重複していないものだけ取得
  p i.sum                                          # 合計を出力
end

# メソッド呼び出し
uniq_num([1, 2, 3])
uniq_num([3, 2, 3])
uniq_num([3, 3, 3])

# ターミナル出力結果

# 6
# 2
# 0
```

## 参考文献

- [Ruby 3.0.0 リファレンスマニュアル ( Hash.new )](https://docs.ruby-lang.org/ja/latest/method/Hash/s/new.html)
- [Ruby 3.0.0 リファレンスマニュアル ( filter )](https://docs.ruby-lang.org/ja/latest/method/Array/i/filter.html)
- [Rubyの配列から重複した要素を削除する](https://www.it-swarm-ja.tech/ja/ruby-on-rails/ruby%E3%81%AE%E9%85%8D%E5%88%97%E3%81%8B%E3%82%89%E9%87%8D%E8%A4%87%E3%81%97%E3%81%9F%E8%A6%81%E7%B4%A0%E3%82%92%E5%89%8A%E9%99%A4%E3%81%99%E3%82%8B/941035029/)
- [Ruby配列で繰り返される要素を効率的に抽出するにはどうすればよいですか？[複製]](https://stackoverflow.com/questions/786879/how-can-i-efficiently-extract-repeated-elements-in-a-Ruby-array)
Git Bashの初期設定

##WindowsでGit Bashを使う理由
Windowsであればコマンドプロンプトが標準で用意されているのでそれを使用する方法もありますが、Git BashはmacOSのターミナルとほとんど同じコマンドを実行できる（汎用性が高い）ため、推奨されています。

##コマンドの書き方

コマンドの構成の各名称は以下のとおりです。

```
$ ls -a Documents
```

$：プロンプト（標準で入力されています）
ls：コマンド
-a：オプション
Documents：パラメーター
※オプション、パラメーターは省略されることがあります。
※空白は半角スペースです。

##Gitの初期設定をするgit configコマンド

###設定する理由
設定したユーザー名とメールアドレスがコミットした際に記録され、だれがコミットしたのかが明らかになります。

###ユーザー名を設定する

```
git config --global user.name ユーザー名
```
Enterキーを押すと確定します。

###メールアドレスを設定する

```
git config --global user.email メールアドレス
```
Enterキーを押すと確定します。

###設定ができているか確認する

```
git config --list
```
色々と項目が出てきますが、user.nameやuser.emailで始まる部分が今回設定した部分になります。
また、このように表示結果が多いとき、一番下に「：」の表示が付きます。その場合、上下キーにて表示をスクロールすることができ、最終は「END」の表示がついています。
表示をやめるときは「Q」キーを押すとエスケープ（コマンドラインに戻ること）ができます。
FD1158Dのコンデンサー

PC-9801FA2の5インチフロッピーがまったく読み取らず不調でネットで調べて見たところコンデンサーの劣化が原因ぽい。

![IMG_20210105_192308.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/b5b57d16-44f1-9539-dd0b-9b2dd243a751.jpeg)

上から怪しいのが

C5 10uF 10V
C4 22uF 16V
C3 22uF 6.3V
C1 10uF 10V
C2 22uF 16V

すべてRubycon社製のようです。Rubyconは決して悪い会社ではなく、経年変化なのでしかたないと思います。

初期のロットなのかダイオードが後付されてますね。

たまたま捨てようと思って分解した製品の基板に似た形状の電解コンデンサーがのっていたので部品取りをして取り替えて見ました。

![IMG_20210106_133142.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/11d04717-173e-6c89-2914-861dd2d0f6cd.jpeg)

C1はちょっと大きいものしかなかったので、フレームに当たってしまうので反対にして付けてみました。すべてnichiconです。

2ドライブとも正常に動くようになりました。PC-9801FAに付属していた98トレーニングディスクを実行してみました。

![IMG_20210106_123807.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/200d8453-bbf3-0c9b-cc59-d17e39f2a47a.jpeg)

640x400が表示できるLCD-A173Kを使いました。Cバスにグラフィックアクセラレーター(IO DATA GA-1280A-2)が入っていて、VGAタイプのコネクタもあるので、そのまま接続できます。

メイン基板の表面実装タイプの電解コンデンサーも傷んでいるようなので、ちゃんと使いたいのであれば、交換したほうが良いかもしれません。

参考

http://blog.i-w-i.net/2017/08/pc-9801fau225.html

おまけ

このPC-9801FA2にはLogitecのLDF-331Fという3.5incドライブが入っていて、こちらは問題なく使えています。このドライブにはGO2DD.EXEというドライバーが付属していて、これを実行すると2DDのFOARMATが可能になります。実行していなくてもフォーマット済みの2DDは読み書きできるようなのですが。

おまけ2

PC-9801の3.5inc HDは5incと同等の1.2Mになります。PC/ATでは1.44Mとなっていて互換がありませんでした。PC-9821では1.44Mも使えるようになりました。昔PC/ATやMacとデータ交換をするときは2DDを使っていました。
Ubuntuでnvidiaのxorg.conf関連を触ってみた

# TLDR;
Ubuntuでnvidiaのグラボを弄る時にxorg.confが無くて困っていたけれど、
/usr/share/X11/xorg.conf.d/11-nvidia-prime.conf
をいじってなんとかなった。(本当は弄っちゃダメ！)

## 画面の表示が出来ないとき💻
nVidiaのGPUが搭載されているゲーミングノートがX11を表示できなかった時は
/usr/share/X11/xorg.conf.d/11-nvidia-prime.conf
の"OutputClass"に下記を追記して表示してもらった。

```/usr/share/X11/xorg.conf.d/11-nvidia-prime.conf
Option "PrimaryGPU" "No"
```

## GPUをパフォーマンスモードにしても本気出してくれないとき🐢🐇
nVidiaのGPUが本気を出してくれなかった時は
/usr/share/X11/xorg.conf.d/11-nvidia-prime.conf
の"OutputClass"に下記を追記して本気を出させた。

```/usr/share/X11/xorg.conf.d/11-nvidia-prime.conf
Option "RegistryDwords" "PowerMizerEnable=0x1; PerfLevelSrc=0x2222; PowerMizerDefaultAC=0x1"
```

または

```/usr/share/X11/xorg.conf.d/11-nvidia-prime.conf
Option "RegistryDwords" "PowerMizerEnable=0x1; PerfLevelSrc=0x3322; PowerMizerDefaultAC=0x1"
```

**ただし、このファイルは人間が弄ってはいけないものらしい。**

# 画面が表示されなくなった
僕は普段から研究目的にゲーミングノート(Dell G3 3579)というエントリー機[^graduate]でCUDAをブン回しています。
GTX 1050TiというGPUが載っている機種で、まぁ、ショボいゲームなら動きます。~~(skyrimは動きません)~~

ある日、なんにもしてないのに画面が表示されなくなった(何かしている)ことがあります。
正直、こういう時のGPU搭載ノートってLinuxの場合クソダルいです。ゲームも出来ないし気分悪いです。
GPU関連再インストールって重いです。そこで、設定でどうにかならないか見てみました。
どうも、GPUの画面の優先度の問題らしいなぁとなんとなく思っていました。
だけど、新しいubuntuには/etc/X11/xorg.confがなくて泣いていました。
んで、なにかいいものないかなって探してみると、下記の様なファイルを読みにいっている様でした。
/usr/share/X11/xorg.conf.d/11-nvidia-prime.conf
どうも、xorg.confに酷似しているので、nvidiaのGPUの優先度を下げるべく書き換えました。
すると、何故か動くようになりました。

# GPUが本気を出してくれない！🐢🐇
上記設定でなんとか画面は映ったものの、問題がありました。
GPUが本気を出してくれなかったのです。
CUDAはpythonのcupyで使っていますが、ショボい学生とは言え一応自称パソヲタですので
非同期・低水準のメモリ管理とかはしていて、それなりの性能を出してくれています。
もちろん、GPGPUブン回す時はnvidia-settingsを起動して、
Powermizer settingsをPrefer maximum performanceにしています。
基本ですね。
が、Prefer maximum performanceにしているのに、GPUのクロック周波数が350MHzとかになって泣いていました。
これも結局/usr/share/X11/xorg.conf.d/11-nvidia-prime.confを弄ることで上手く行きました。

# 上手くいかなかった設定😢
以下の設定をやればいいって色んな所に書いてあった。

```/etc/X11/xorg.conf
Option "RegistryDwords" "PowerMizerEnable=0x1; PerfLevelSrc=0x2222; PowerMizerDefaultAC=0x1"
```
これはノートPCとかなら一寸違って下記のようにするらしいです。詳しくはないです。

```/etc/X11/xorg.conf
Option "RegistryDwords" "PowerMizerEnable=0x1; PerfLevelSrc=0x3322; PowerMizerDefaultAC=0x1"
```

まぁ、実際は前後にもっと色々と設定がくっついていましたが、詳しくはググって下さい。
これやると、僕の環境では画面が表示されなくなりました。
X11なしで画像やPDFが表示できるならば別にX11は無くても仕事は出来るんですが、
そのへん詳しくないし、そもそも設定がおかしいのは明らかなのでした。
ちなみに、gpu-managerを回すと動かない設定に戻りました。

...何かいい方法ないんですか？知っていたら教えて下さい。

# 上手くいった設定の問題点⚙

/usr/share/X11/xorg.conf.d/11-nvidia-prime.conf
を弄る事自体が罪。以上です。
このファイルには「このファイル弄るな。gpu-managerが作るものだから！」って冒頭に書いてあるんですが、
いや、どう考えてもgpu-managerさんが吐いた設定ファイル、自分の思い通りに動いてくれないんですもん…。

# Ubuntu搭載ノートPCでGPGPU💻
ゲーミングノートにUbuntuを入れること自体が若干変態的なことではあります。
そもそも画面が表示されないとかあってツラミが出てくることも無くはないです。
それでも手軽な実験環境としてまずまず快適であり、
1050Tiみたいな弱っちい子でもマルチコアCPUに比べると圧倒的に速いです。

こういうの弄るのが苦じゃなくて、かつ出張先[^shakai]でGPGPUしたいとか、
奥さんがデスクトップ機が禁止されてるとか、宗教上の理由を持っているとかなら、候補に上がるかと思います。


[^graduate]: 自腹。早く大学院卒業して研究費でもっと良いゲーミングPCやラズパイ買いたい…。
[^shakai]: 僕はノートPCでGPGPU出来ないと研究がはかどらない。そんな人、他にも居ると思う。
[Angular] 「基本的なAngularアプリをはじめる」をやってみる(2)

#「基本的なAngularアプリをはじめる」をやってみる(2)

[[Angular] 「基本的なAngularアプリをはじめる」をやってみる(準備)](https://qiita.com/IwashiMorino/items/3325a4a3f7fe6692c259 "[Angular] 「基本的なAngularアプリをはじめる」をやってみる(準備)")

[[Angular] 「基本的なAngularアプリをはじめる」をやってみる(1)](https://qiita.com/IwashiMorino/items/91da278069abff1f500d "[Angular] 「基本的なAngularアプリをはじめる」をやってみる(1)")

Angular のチュートリアルをやってみています。

##商品リストを作成する

Angular公式ページ ： [商品リストを作成する](https://angular.jp/start#%E5%95%86%E5%93%81%E3%83%AA%E3%82%B9%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B "商品リストを作成する")

今日から本格的にチュートリアルを進めていきます。と言っても指示通りにコピー＆ペーストしていくだけなのですが。

#####1.product-listフォルダ内の product-list.component.html に以下のタグを記述します。

```html:product-list.component.html
<div *ngFor="let product of products">
</div>
```

#####2.divタグの中に下記のh3タグを記述します。

```html:product-list.component.html
<div *ngFor="let product of products">

  <h3>
      {{ product.name }}
  </h3>

</div>
```

この時点でプリビュー画面は、以下のようになります。
![017a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/897250/ce1da306-e5e7-5d5b-721e-785615233f86.png)

*ngForはfor文のようですね。

#####3.{{ product.name }} を下記の a タグで囲みます。

```html:product-list.component.html
<a [title]="product.name + ' details'">
  {{ product.name }}
</a>
```

![018a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/897250/fe3c1b44-fc61-2feb-c839-acbe4f81eaa3.png)

製品名にオンマウスすると、文言が表示されるようになります。
チュートリアルを読んでいますと、この [] の使い方をプロパティバインディングと呼んでいるようです。

#####4.下記の p タグを追加します。

```html:product-list.component.html
<p *ngIf="product.description">
  詳細: {{ product.description }}
</p>
```

![019a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/897250/4a13ef27-cbde-f9d0-63b0-5e8a1760305e.png)

product.description が表示されるようになります。
*ngIfはif文のようです。

ところで、product.description とは何でしょうか？
ファイルを見ていくと、products.ts に記述されている内容のようです。
ちなみに、以下の内容になっています。

```typescript:products.ts
export const products = [
  {
    name: 'Phone XL',
    price: 799,
    description: 'A large phone with one of the best screens'
  },
  {
    name: 'Phone Mini',
    price: 699,
    description: 'A great phone with one of the best cameras'
  },
  {
    name: 'Phone Standard',
    price: 299,
    description: ''
  }
];
```

#####5.ボタンを追加します。

product-list.component.html に以下のタグを追加します。

```html:product-list.component.html
<button (click)="share()">
  shareボタン
</button>
```

![020a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/897250/c4de4499-5080-04f9-8a89-b05c2cc5422f.png)

ボタンが表示されるようになります。（今のところクリックしてもメッセージが表示されるだけでshareされるわけではありませんが。）
(click) のような使い方をイベントバインディングと呼んでいるようです。

次の記事 ： [[Angular] 「基本的なAngularアプリをはじめる」をやってみる(3)子コンポーネントにデータを渡す](https://qiita.com/IwashiMorino/items/9930c34a73e0840ce6e9 "[Angular] 「基本的なAngularアプリをはじめる」をやってみる(3)子コンポーネントにデータを渡す")
プラットフォームイベント、変更データキャプチャ　メモ

プラットフォームイベントと変更データキャプチャの違いに関してメモ
（勉強中です。）
https://developer.salesforce.com/events/webinars/data-linkage-201908

プラットフォームや変更データキャプチャを使えば、
SFDCと外部システムの連携ができます。

＜どんな機能を持っている？＞
■変更データキャプチャ
　・特定のDBに変更があった際に、検知
　・イベントバスへチャネル作成
　・購読/配信の仕組み

■プラットフォームイベント
　・購読/配信の仕組み


ざっくり言うと、
変更データキャプチャ≒Trigger+プラットフォームイベントで実現可能。
（厳密には違う。）

※以下イメージ
■変更データキャプチャの機能
　・特定のDBに変更があった際に、検知　→Triggerで代替
　・イベントバスへチャネル作成　　　　→Triggerで代替
　・購読/配信の仕組み　　　　　　　　 →プラットフォームイベント


例えば、
ユーザがSFDC画面からデータを入力し保存、
保存した結果、非同期通信で外部システムへ通知したい場合。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450298/387efbdd-3af5-b6c0-1b4b-9f6c8a5904b3.png)

＜前提＞
まず外部システムは、イベントを購読する必要がある。
購読したシステムに対して、イベントを配信するため。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450298/330f6aae-ad04-bc78-9088-d77e1a29ce25.png)

＜処理の流れ＞
ユーザがUI（LWCやVFなど）からデータを入力し、保存。
そのタイミングでApexのコントローラ側のメソッドが走り、DBに対してDML発行

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450298/86b4845d-fee6-19aa-5225-78c30a04dec8.png)

それ（＝DBの変更）を受けて、
ApexTriggerで検知し、Bus（＝イベントバス）に対してイベントデータを生成することも可能。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450298/4aca2123-2318-2737-7aab-c203b72d4328.png)

イベントバスは、イベントの生成を受けて、
事前に購読した外部システムに対して、イベントを配信する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450298/c41f07d2-f3f0-f7b4-fd89-fa8680f0e672.png)

で、ここがプラットフォームイベント
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450298/e2963572-47f0-bec8-e420-6c93dfac4481.png)

ここが、変更データキャプチャです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450298/106e473b-1a7b-0632-db6f-8ce2daba6d6b.png)



留意事項
・大量データはBulkでやりましょう
・プラットフォームイベントは非同期のため、同期処理したい場合にはSOAP/RESTを選択しましょう。
・外部システムは、イベントを購読できる必要があります。
・同時接続システムや24hの配信数に制限あり。（ガバナ）
https://developer.salesforce.com/docs/atlas.ja-jp.platform_events.meta/platform_events/platform_event_limits.htm

構築方法
・変更データキャプチャ
　→設定から変更データキャプチャを検索し、対象オブジェクトを選定してSFDC側は完了

・プラットフォームイベント
　→設定からプラットフォームイベントを検索し、イベントオブジェクト（__e）の作成が可能。イベントオブジェクトに対して項目追加やTriggerの構築が可能。


・Pub/Subモデルとは？（Publish＝配信、Subscribe＝購読）
事前に購読した人に向けて配信するモデルを指しており、何かソリューションを指しているわけでない。ただの概念。

LINEを思い浮かべるとわかりやすいかもなのだが、
グループチャットに100人いたとして、
誰かがチャットを投稿した際に、みんな受信/成功するまで待つ（＝同期）場合に、
時間がものすごいかかったり、処理が重くなるかと思われる。
そういったときに、非同期の相手の受信を待たない通信が最適となる。
つまり、受取手にとって多少タイムラグがあるが、送ったら送りっぱなしとなる。
また、グループチャットに参加した人は購読すれば配信を受けられる点で、配信側に手が入らない。
システムでいうと、受信したいシステムが増える場合のスケーラビリティがある、と言える。

＜PubSubモデル＞
グループチャットを色んな人が購読する。（＝グループチャットに参加する。）
誰かが発言すると、購読している人（＝グループチャットに参加している人）に対して、配信する。（＝チャットを送る。）
https://dev.appswingby.com/gcp/pub-sub%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%83%B3%E3%82%B0%E3%83%A2%E3%83%87%E3%83%AB%E3%80%9Ccloud-pub-sub%E3%82%92%E4%BE%8B%E3%81%AB%E3%80%9C/
react hooksでrouterを利用するやり方とハマりポイント

## ぼくは
やっている最中exactの意味が分からず20時間くらいハマりました


## 初期アプリの作成

```bash
create-react-app react-router
cd react-router
rm -fr src/*
```

## routerパッケージをインストール

```
npm install react-router-dom
```

## ファイルを配置

```src/index.html
<div id="root"></div>
<script src="./index.js"></script>
```

### ポイント
- `Route`内の`exact`は必須
    - `exact`はデフォルトだとfalse
    - 有効にする（書く）と、前方一致で`/`がヒットしてしまう
    - 今回の場合のRouteは`/`と`/react`とあるが、`/react`にあたるRouteで`exact`をつけていないと、先に`/`がヒットしてそちらにリダイレクトするような動きになるので、たぶんとりあえずつけておいたほうが良いんじゃないかなと思う
- `BrowserRouter as Router`
    - as句があるので、`Router`は実質`BrowserRouter`が呼び出されていることになる
    - RouterとBrowserRouterが何が違うかと言うとよくわからないけど、BrowserRouterは内部的にhistoryをpropsに渡しているらしい
    - つまるところ、Routerを使って、次のようなエラーになった場合、historyがpropsにわたっていないのでエラーになっているので、わからないうちはBrowserRouterを使ってあげるのがたぶん早いんだと思う
        - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293481/3d8ca0aa-9788-1ee3-5a32-155eb57ecb1d.png)
        - 参考記事
        - https://qiita.com/koja1234/items/486f7396ed9c2568b235#router%E3%81%A8browserrouter%E3%81%AE%E9%81%95%E3%81%84

```src.index.js
import React from 'react';
import ReactDOM from 'react-dom';
import { BrowserRouter as Router, Route, Switch, Link } from 'react-router-dom';

function Hello() {
  return (
    <div>
      <h1>to react</h1>
      <Link to={"/react"}>
          Link
      </Link>
    </div>
  );
}

function HelloReact() {
  return (
    <div>
        <h1>to root</h1>
        <Link to={"/"}>
            Link
        </Link>
    </div>
  );
}

function App() {
  return (
    <Router>
      <Switch>
        <Route path="/" component={Hello} exact />
        <Route path="/react" component={HelloReact} exact />
      </Switch>
    </Router>
  );
}

ReactDOM.render(<App />, document.getElementById('root'));

```

## 起動
```
npm start
```

### /reactへ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293481/3000fe2f-2c0e-348a-8388-d9a2de50f903.png)

### /へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293481/facfac91-e2eb-ac7d-7072-f3b593463650.png)
CSS Gridの基本

#はじめに
Gridレイアウトの基本について、初心者向けの備忘録です。

#作成手順

###1.htmlを記述
グリッド全体を囲むcontainerの子要素にレイアウトしたいアイテムを記述します。
タグやクラスは任意です。

```
<div class="container">
    <div class="header">header</div>
    <div class="sidebar">sidebar</div>
    <div class="main">main</div>
    <div class="nav">nav</div>
  　<div class="form">form</div>
    <div class="footer">footer</div>
</div>
```
###2.CSS Gridを適用
containerに「display : grid;」を指定します。
アイテムはそれぞれグリッドラインという縦横の線で分割されます。

```
.container{
    display: grid;
}
```
##3.グリッドトラックのサイズ指定
グリッドトラックとは、隣接する2本のグリッドラインの間のスペースのことを指します。

・ grid-template-rowsでグリッドトラックの高さ
・ grid-template-columnsでグリッドトラックの幅
を指定していきます。

※プロパティ名の末尾が複数形なので注意。

```
.container{
    display: grid;
    grid-template-rows: 1fr 1fr 1fr 1fr;
    grid-template-columns: 100px 1fr 1fr;
}
```
frとは「fraction(分割)」の略で、枠に合わせたグリッドの大きさを自動的に調整してくれます。
上のコードでは、縦は均等に4分割、横は100pxと残りの幅が均等に2分割されます。
単位は他にvhやautoなども使用できます。

##4.アイテムの位置を指定
作成したラインに対して、何番目から何番目のラインにかけて要素を配置するかを指定します。
ラインは左上を起点として、1から順番に番号が付与されます。
例では縦線に1〜5の番号、横線に1〜4の番号が割り振られます。

・ grid-rowプロパティで行の配置
・ grid-columnプロパティで列の配置
を指定します。

```
.footer{
    grid-row: 3/4;
    grid-column: 1/4;
}
```
上記では、行は3〜4番目のラインにかけて、
列は1〜4番目のラインにかけて要素が配置されます。

他の要素も同様にrowとcolumnの配置を指定します。

```
.header{
    grid-row: 1/2;
    grid-column: 1/4;
}
.sidebar{
    grid-row: 2/4;
    grid-column: 1/2;
}
.main{
    grid-row: 2/3;
    grid-column: 2/4;
}
.nav{
    grid-row: 3/4;
    grid-column: 2/3;
}
.form{
    grid-row: 3/4;
    grid-column: 3/4;
}
.footer{
    grid-row: 4/5;
    grid-column: 1/4;
}
```

##レイアウト例
分かりやすく色をつけてレイアウトしたものが下記になります。
今回は基本的なプロパティのみ使用しましたが、他にもラインに名前を付けたり、余白を指定したりできる便利なプロパティがあります。

<p class="codepen" data-height="265" data-theme-id="dark" data-default-tab="css,result" data-user="poci" data-slug-hash="BaLxdjW" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="BaLxdjW">
  <span>See the Pen <a href="https://codepen.io/poci/pen/BaLxdjW">
  BaLxdjW</a> by trym-endo (<a href="https://codepen.io/poci">@poci</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>


#おわりに
Gridは縦横の幅や高さが絡むレイアウトを作成するのに便利ですが、一方でFlexboxよりもCSSが煩雑になってしまうデメリットもあります。
特性の違いによってFlexboxと使い分けたり、組み合わせて使用することで様々なレイアウトに対応できそうです。
【初心者でもわかる】親子関係を持つメニューの作り方

メニューの中でも、①②③と続く中で、①-1、①-2と子供を持つメニューを作る場面があると思います。
WEBサイトを利用するユーザーに伝わりやすいような親子関係が分かりやすいメニューを作ります。

![sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/5e6f90e1-3d94-9766-f78c-5fe0244c95e9.png)

## ソース

```index.html
<ul class="menu">
  <li>
    <a href="#">①あの段</a>
    <ul class="child">
      <li><a href="#">①-1 あ</a></li>
      <li><a href="#">①-2 い</a></li>
      <li><a href="#">①-3 う</a></li>
      <li><a href="#">①-4 え</a></li>
      <li><a href="#">①-5 お</a></li>
    </ul>
  </li>
  <li>
    <a href="#">②かの段</a>
    <ul class="child">
      <li><a href="#">②-1 か</a></li>
      <li><a href="#">②-2 き</a></li>
      <li><a href="#">②-3 く</a></li>
      <li><a href="#">②-4 け</a></li>
      <li><a href="#">②-5 こ</a></li>
    </ul>
  </li>
</ul>
```

```style.css
.menu {
  width: 150px;                /* 適当なサイズを指定 */
  border: 1px solid #666;      /* 枠線を作成 */
}

.menu li a {
  width: 100%;                 /* 幅を100%に指定 */
  border-top: 1px solid #666;  /* 上に線を引く */
  padding: 10px 20px;          /* 余白を指定 */
  display: inline-block;       /* 幅指定・余白を付けるために必要 */
  box-sizing: border-box;      /* 計算を簡単にするために必要 */
}

.menu > li:first-child > a {
  border-top: none;            /* 最初は上の線を無くす */
}

.menu li a:hover{
  background: #CCF;            /* カーソルを乗せた時の見た目 */
}

.menu li .child li a {
  padding-left: 40px;          /* 左の余白を大きめに上書き */
}
```

## 解説

まずは親子関係を持たせるためにhtmlのソース側で親子関係を作ります。
`ul`の`li`の中に、また`ul`と`li`の組み合わせを用意して親子関係を持たせます。
CSSを当てやすいように親の`ul`には「.menu」、子の`ul`には「.child」のクラスを付けています。

基本的にはliのデザインテイストを合わせるために`.menu li a`にたいして主要なCSSを作っていきます。

その後、`.menu li .child`以下にたいしてのみ効かせるようなCSSを書くことで、差別化を測ります。
今回の例ではシンプルに少し右寄せにしてみました。
ほかにもこのようなデザインも作る事が可能です。

![sampl2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/3fdc6332-d314-9b75-b57f-ea4e0ea7903b.png)


```style.css
/* .childのCSSを少し変更 */
.menu li .child li a {
  width: calc(100% - 30px);
  margin-left: 30px;
  padding-left: 10px;
  border-top: 1px solid #CCC;
}
```

## まとめ

ヘッダーのハンバーガーメニューをクリックしたら、今回作成したメニューが出てくるように作成したり、
目次ボタンを押したらアコーディオンでメニューが出てくるなど使い方は様々あるかなと思います。

コーディング始めたての頃はタグの要素が2重になったりするとややこしくて上手くCSSがかけない事もありますが、
落ち着いて綺麗に作れば改良も修正も簡単になるので、様々なサイトを参考にしながら模写コーディングするなどでスキルを上げていくのがいいのかなと思います。

#### おそまつ！
~ Qiitaで毎日投稿中!! ~
[【初心者向け】WEB制作のちょいテク詰め合わせ](https://qiita.com/7note)
MacのディスクユーティリティでのCD/DVDマスター(cdr)イメージ作成をコマンドラインから実行する

Macで単純なCD/DVDのisoイメージを作成するためには、GUIのディスクユーティリティを使い、「CD/DVDマスター」を作成します。

![スクリーンショット 2021-01-07 21.49.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110606/7b3891a5-1443-314d-8382-6049a626cecd.png)
![スクリーンショット 2021-01-07 21.51.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110606/ea881bfe-b3a5-c549-bee6-b5325f960ecb.png)


これをターミナルから実行し、自動的にイジェクトするワンライナーコマンドこちらです。
diskutilなどでデバイスのマウントポイントを調べておいてください。ここでは外付DVDドライブが/dev/disk3にマウントされていることとします。

```shell:terminal
$ hdiutil convert /dev/disk3 -format UDTO -o output.cdr;hdiutil detach /dev/disk3
TOSHIBA_DVD_VOLUME             （Apple_UDF: 0）を読み込み中…
...............................................................................
経過時間:  9m 25.604s
速度: 7.2Mバイト/秒
節約率: 0.0%
created: /tmp/output.cdr
"disk3" ejected.
````
/dev/disk３に入っているCD/DVDメディアから、UDTOフォーマット(CD/DVDマスター)のイメージを作成し、output.cdrとしてカレントディレクトリに出力したのちに、ディスクをイジェクトします。

通常にGUIを使って吸い出すよりも時間が早い気がします。（気のせいかも。。）

さらにこのイメージ（output.cdr）を同じ光学ドライブを使って焼くコマンドはこちら。
光学ドライブにディスクが入っている状態だとそのまま焼き込みがスタートしますが、入っていないと次のように表示され、ディスクが挿入されるまで待機状態になります。

```shell:terminal
$ hdiutil burn -speed max -noverifyburn output.cdr
Please insert a disc:
ディスクに書き込むデータを準備中
セッションを開いています
トラックを開いています
トラックを書き込み中
...............................................................................
トラックを閉じています
...............................................................................
セッションを閉じています
...............................................................................
ディスクの作成を終了中
ディスク作成が完了しました
...............................................................................
hdiutil: burn: completed
```
output.cdrを速度最大で光学ドライブに入っているメディアに焼き込みます。書き込み内容の検証はスキップし、終わったらディスクがイジェクトされます。

これらを全部つなげて作ったワンライナーがこちら。色々とお遊び機能もつけてるので、あとで解説します

```shell:terminal
$ hdiutil convert /dev/disk3 -format UDTO -o output.cdr;hdiutil detach /dev/disk3;say "読み込み完了。DVD-Rを入れてください";hdiutil burn -speed max -noverifyburn output.cdr;rm -f output.cdr;say "焼き込みが完了しました。"
```
ちょっと見やすくします。

```shell:terminal
$ hdiutil convert /dev/disk3 -format UDTO -o output.cdr;
hdiutil detach /dev/disk3;
say "読み込み完了。DVD-Rを入れてください";
hdiutil burn -speed max -noverifyburn output.cdr;
rm -f output.cdr;
say "焼き込みが完了しました。"
```
コピー元のDVDと焼き込み先のDVD-Rなどを用意しておき、上記のコマンドを叩けばバックアップしたディスクイメージも残さず削除して、メディアの出し入れ操作のみでDVDコピーを完了させることができます！しかもこのワンライナーでは、読み込みが終わったあとと書き込みが終わった後に、sayコマンドで合成音声を再生します。他の作業をしながらのDVDバックアップに最適です。

GUIを使ってのDVDバックアップは、やれクリックだ文字入力だなどとちょいちょい手間でなんとかならんのかコレって思って作りました。これによりめっちゃくちゃDVDバックアップが捗る捗る。１枚あたりだいたい２０分程度で完了します。しかも作業するのはコマンド発行のEnterキーとディスク入れ替えの時のみ！最高！

きっと誰かにニーズがある、、、はず！
Swiftでドキュメントベースアプリを作る時はクラス名の設定に注意が必要

当初シングルのアプリとして作っていたものに、後からドキュメントベース要素を追加しようとした時にどうしてもファイルを認識してくれなくてハマったことのメモ。
ドキュメントベースアプリではInfo.plistの項目としてDocument Typeの設定を行う箇所がある。この場所でファイルのUTIやRoleを宣言する他、Documentクラスと連携する場合はClassに対応するCocoaのクラスを設定する。
Objective-Cの場合はクラス名をそのまま書けば問題ないのだが、Swiftでモジュールを構成する場合、Documentクラスの名称は次のように書くのが正式となる。

```Info.plist
$(PRODUCT_MODULE_NAME).DocumentClass
```

これが正しく設定されていないとオープンダイアログやDockのドラッグでファイルを渡しても認識してくれない。

エラーメッセージも開けないということしか教えてくれず、なぜ開けないのか説明がないのでハマってしまう。実は[Appleのサンプル](https://developer.apple.com/documentation/appkit/documents_data_and_pasteboard/developing_a_document-based_app)に記述があるのだが、NSDocumentには直接記載がない上、ドキュメントベース周りは古いドキュメントも多いので、うっかりObjective-Cの感覚でいると見落としてしまうと思う。というか、これで一時間悩んだ。
テスト23

```vb
'フィルターをかけた後、可視セルの値だけ取得
Sub Kashi_Cell()

Dim r As Variant
Dim rr As Variant
Dim rs As Variant
Dim AAA As Variant

With ThisWorkbook.Sheets("Sheet5")

    .Range("$A$1:$G$40").AutoFilter Field:=1, Criteria1:="神奈川"
    
    Set r = .Range("A1", Range("A" & Rows.Count).End(xlUp)).SpecialCells(xlCellTypeVisible)
    
    For Each rr In r
    
        AAA = Split(rr.Address, "$")
        
        If AAA(2) <> 1 Then
            MsgBox rr.value
            MsgBox .Cells(rr.Row, 6).value
        End If
             
    Next

End With

End Sub

```
Pythonでファイルをフォルダ分けしてみた

# はじめに

Python初心者が勉強のために、まずはファイル整理からしてみました！
需要があるかは分かりませんが、`拡張子 / 年_月`の構成でフォルダ分けしてみましたので、備忘もかねて記録に残しておきます。

# ソースコード
```Python

import shutil
import os
import glob
import datetime
import sys

# 参考サイト
####################################################

# Pythonでファイル・ディレクトリを移動するshutil.move
# https://note.nkmk.me/python-shutil-move/

####################################################

# Pythonでglobモジュールを使う方法【初心者向け】
# https://techacademy.jp/magazine/18928

####################################################

def mv_file(ex):
    df_path = 'bk/' + ex
    os.makedirs(df_path, exist_ok=True)

    # mv_file 関数の引数で指定した拡張子を持つファイルを検索（同フォルダ内）
    for x in glob.glob('*.' + ex):
        print(x)
        # ファイル作成日のタイムスタンプを取得
        dt = datetime.datetime.fromtimestamp(os.path.getctime(x))
        if dt: # 作成日を取得できた場合
            # タイムスタンプから 『年_月』 へフォーマット変換
            fm = dt.strftime('%Y_%m')
            path = df_path + '/' + fm 
        else: # 作成日を取得できなかった場合
            path = df_path + '/others'
        # ディレクトリを生成（既にあった場合は無視される）
        os.makedirs(path, exist_ok=True)
        # ファイルを『path』へ移動する
        new_path = shutil.move(x, path)

# 以下、関数実行
mv_file('pdf')
mv_file('zip')
mv_file('jpg')
mv_file('png')
mv_file('xls')
mv_file('xlsx')
mv_file('xlsm')
mv_file('doc')
mv_file('docx')
mv_file('ppt')
mv_file('pptx')
mv_file('csv')

# 動作確認のため、Enterキーが押されるまで待機させる
input("Press Enter to continue...")

```

# 最後に

命名規則やエラー防止等、作りこみができていない箇所が多々ありますので、もしソースを流用される場合は、破損しても問題のないファイルで動作確認してからご利用下さい！
Rhinoceros with Python でLattice Hingeを書くプログラム

#　使い方
1. drawlatticehinge.pyを[download](https://github.com/drleonardo1010/drawLatticeHinge "Download")
1. drawlatticehinge.pyを同じメインプログラムと同じディレクトリに保存
2. メインプログラムでdrawlatticehinge.pyをimport
3. パラメータを設定してdraw_lattice_follow_crosspointで描画

# サンプルプログラム
```SampleProgram.py

import rhinoscriptsyntax as rs
import drawlatticehinge as lh
import math

def clear_all():
    all_obs = rs.ObjectsByType(0)
    rs.DeleteObjects(all_obs)

clear_all()

parameter = [37.5,0.2,0.4,1.5,10]
lattice = lh.LatticeHinge(parameter)

startPoint = (0,0,0)
endPoint = (200,200,0)

lattice.draw_lattice_follow_crosspoint(startPoint,endPoint)
```
# パラメータ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377555/347832b7-ae47-df5a-6259-3203e9f70763.png)

```python
parameter = [37.5,0.2,0.4,1.5,10]

LINE_LENGTH = parameter[0] #37.5#
LINE_WIDTH = parameter[1] #0.2#
OVERLAP_RATE = parameter[2] #0.4#
LINE_INTERVAL = parameter[3] #1.5#
INTERVAL_LIMIT = parameter[4] #10#
cutAngle = (math.radians(90),math.radians(90),math.radians(90),math.radians(90))
```

※コメント
LINE_LENGTH = 1本の線の長さ
LINE_WIDTH = 1本の線の幅（ レーザーのカット幅なので0.2mm ）
OVERLAP_RATE = 線の長さの重なり具合
LINE_INTERVAL = 線と線の間隔
INTERVAL_LIMIT = Latticeの繰り返し回数(この数値でlatticeの幅と数が決まる)

## 実行結果 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377555/04257275-224a-911f-06e0-6d6c1028d546.png)

startPoint = (0,0,0)　から　endPoint = (200,200,0)　までの間でLattice Hingeが描かれた
Herokuにデプロイしたのにうまく反映できない時

#はじめに
忘備録として記載します。

#結論
「Command+z」で戻りすぎていた。

#過程
デプロイした後、
heroku open
でブラウザを立ち上げたところ、なぜか反映されていない。
そこで、念のためローカルホストでまずは確認した。
すると、書いたはずのコードが消失していた。
「Command+z」で戻りすぎてしまい、消えたと思われる。

こんなミスで1時間もの間、Pushしたり、マイグレートしたりと不毛な時間を過ごしてしまったので、しっかり確認してから進めていこう。
あなたがGo test をしても通らない理由【凡ミス備忘録】

この記事はGoのテストを実装する時によく凡ミスをするので、備忘録として残します。

【はじめに】
参考にならない人
go testを詳しく知りたい人

参考になる人
go test ./ ..._test.go(ディレクトリの指定) 

をしても undefine (メソッド名)　とでてきて実行をすることができない人


【結論】
なぜあなたが 

go test ./.._test.go

でテストファイルを指定しても実行をされないのか

それは

テストファイルのみを指定しているからです

単純にテストのファイルだけを指定したら、他のファイルにあるメソッドを参照することができないので実行をすることができないから

通すためには、

go  test -v

または

go test ./.._test.go ./.. （メソッドのあるディレクトリを足してあげる）

で指定をしてあげるということが必要です

以上
「面着」という言葉を、使われていますか？

×「月面着陸」という意味では、ありません。検索ででるかも。
×(google翻訳)「面着」→「Face dress」
?(google翻訳)面と向かって→face to face
?(google翻訳)差し向かい→Opposite

・wikipediaでヒットしませんでした。
・(参考)2014/08/27　面着（対面によるコミュニケーション）を重視するトヨタ自動車＞
　＞本社から離れる辺境に組織を置く
  ＞トヨタの本気、本腰を感じる　モビリティの未来を考える組織
　https://www.recruit-ms.co.jp/issue/interview/0000000204/

①リモートでも、面着になりますか？
②「面着」どのように使われていますか？
VirtualBox でVT-xを有効化した仮想マシンを作る

仮想マシンの設定で【ネステッドVT-x/AMD-Vを有効化】がグレーアウトされており、有効化できない。
有効化する方法を記載する。

# 筆者の環境
■ホストOS
OS：Linux Mint20（64ビット）

■ゲストOS
OS：Linux Mint20（64ビット）

# なぜチェックできない？
正確な情報は不明だが、IntelのCPUの場合はチェックできず（VT-x）、AMDのCPUだと有効化できるとか。

# チェックをつけると何ができるようになるの？
仮想マシンの中で仮想マシンを立ち上げることができるようになります。

# チェックの付け方

通常どおり作成されたVMの名前を指定して、下記コマンドを実行します。

``` bash
VBoxManage modifyvm [vm-name] --nested-hw-virt on
```

[参照元(StackOverflow)](https://stackoverflow.com/questions/54251855/virtualbox-enable-nested-vtx-amd-v-greyed-out)
読書会「プログラマが知るべき97のこと」 #9

# 1．今回の読んだ記事
No.5　[美はシンプルさに宿る](https://xn--97-273ae6a4irb6e2hsoiozc2g4b8082p.com/%E3%82%A8%E3%83%83%E3%82%BB%E3%82%A4/%E7%BE%8E%E3%81%AF%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%95%E3%81%AB%E5%AE%BF%E3%82%8B/)　
著者: Jørn Ølmheim
# 2．記事の概要
**美しいコードとは、シンプルなコードのこと**

+ ソフトウェア開発に携わる人ならぜひ知っておくべき言葉
    + 「文章にしろ、和音にしろ、リズムにしろ、美しく、優雅なもの優れたものはすべてシンプルである」
+ コードの「美しさ」はあいまい。主観的な判断になる。
+ 著者がこれまで見た中で美しいと思えるコードは「シンプルである」という共通点がある
    + システム全体がどれだけ複雑であろうと、個々で見ればすべてシンプル


# 3．この記事を選んだ理由・感想
**理由**
自分も美しいコードを書きたいと思っているから
美しさの価値観は個々で違っていると思っているのでそれぞれの「美しさ」について興味があるので議論したい

**感想**

+ コードの美しさを「シンプル」だとするのは共感する、著者のあげる例としては以下
    + オブジェクトのメソッドはすべて機能が絞り込まれていること
    + メソッドを短くする
+ 「シンプル」＝ 「短さ」という著者の主張だが、単純に短さだけが重要ではないかもしれないと思う
    + 極端に短すぎるコードは、難解なコードになってしまう懸念もあるのでは？
+ この「プログラマが知るべき97のこと」のなかには「シンプル」に関係するエッセイがあったのでそちらも気になった
    + 複数のエッセイが存在しているということは、やっぱり「シンプル」は重要だなんだ、と思った
        + 参考：[72.シンプルさは捨てることによって得られる](https://xn--97-273ae6a4irb6e2hsoiozc2g4b8082p.com/%E3%82%A8%E3%83%83%E3%82%BB%E3%82%A4/%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%95%E3%81%AF%E6%8D%A8%E3%81%A6%E3%82%8B%E3%81%93%E3%81%A8%E3%81%AB%E3%82%88%E3%81%A3%E3%81%A6%E5%BE%97%E3%82%89%E3%82%8C%E3%82%8B/)　

# 4．議論

**皆さんの思う「美しい」を教えてください**

   - ソースコードでの美しさとはなんですか？（可読性・保守性・開発効率 以外で主観でなにかありますか）
     - 無駄をなくして短く書く
     - 共通化すること
     - 別の人のコードの改修だとしても、そのプログラム内で書き方を統一するようにする
        - 改行だったり、スペースだったり・・・
     - テストしやすくする

**その他、美しいと感じるポイントがあれば教えてください**

- 仕事面のうちソースコード以外で「美しく」するために気を付けていることはありますか
    - メールなど
        - 見やすい位置で改行する
        - メールは後で見直すときに内容を忘れていることもあるので、何の議論だったか思い出しやすいように記載する
    - 文書
      - メールなども含みますが、全体の余白がバランスよくなるようにしている
- プライベートでも何かありますか
    - 洋服のコーディネートとか
        - 黒で統一しています！同色になるようにしている
        - （別意見として）派手なのも好きです

# まとめ
「オンライン + 飲み会」での開催して、その時間で２テーマ実施しました、その２つ目。
飲み会でお酒付きなので議論は盛り上がりますが、議事が満足に取得できなかった・・・今回も議論のメモが少なめとなってしまいました。
次回へ続く。
Amazon VPCでシンプルなネットワークを構築する

# はじめに
- AWS無料枠のお勉強記録です
- 今回はAmazon VPCを作成し、サブネットで分割してみます
- VPC内にパブリック、プライベートのサブネットを作成します

# 構成図
- パブリックサブネットはインターネットにつながる
- プライベートサブネットからの返信はプライベートサブネットを介して行う
    - パブリックサブネットにNATゲートウェイを設置する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/779593/ee3905a3-a495-e667-902a-27214d488e2a.png)


# 手順と各種設定
## 1. VPCの作成
- Name: Develop
- IPv4 CIDR ブロック: 10.1.0.0/16
- IPv6 CIDR ブロック: なし

## 2. サブネットの作成
- [左側タブ] サブネットをクリック
- サブネットの作成をクリック
    - 下記設定でサブネットを作成
 
### 2.1 public-subnet-1a-devの作成
- VPC: Develop(10.1.0.0/16)
- AZ : ap-northeast-1a
- IPv4 CIDR: 10.1.**1**.0/24
- Name: **public**-subnet-1a-dev

### 2.2 private-subnet-1a-devの作成
- VPC: Develop(10.1.0.0/16)（パブリックと同じ）
- AZ : ap-northeast-1a（パブリックと同じ）
- IPv4 CIDR : 10.1.**2**.0/24
- Name: **private**-subnet-1a-dev
    
## 3. インターネットゲートウェイの作成
- [左タブ] インターネットゲートウェイ
- インターネットゲートウェイの作成
    - Name: Develop
- 作成したインターネットゲートウェイを選択
    - アクション
    - VPCにアタッチ
        - 使用可能なVPC: Develop
  
## 4. ルートテーブルの設定　-パブリック-
### パブリックサブネットの宛先をインターネットゲートウェイに向ける
- [左タブ]: サブネット
    - public-subnet-1a-devをクリック
    - 画面下部にスクロール
    - 「詳細」内から「ルートテーブル」を見つける
        - ID（rtb-hogehoge）をクリック
    - アクション：ルートの編集
        - ルートの追加
        
        | 送信先    | ターゲット       |
        | --------- | ---------------- |
        | 0.0.0.0/0 | Internet Gateway |

        - ルートの保存
    - サブネットの関連づけ：サブネットの関連づけの編集
        - **public**-subnet-1a-devを関連づけて保存
    - Nameを「dev-route-public」に変更

## 5. NATゲートウェイの作成
- [左タブ]: NATゲートウェイ
- NATゲートウェイを作成
    - Name: dev-nat
    - サブネット: public-subnet-1a-dev
    - Elastic IPの割り当てをクリック
    - NATゲートウェイを作成

## 6. ルートテーブルの設定　-プライベート-
- ルートテーブルの作成
    - Name: dev-route-private
    - VPC: Develop
- [左タブ]: サブネット
    - private-subnet-1a-devをクリック
    - 画面下部にスクロール
    - 「詳細」内から「ルートテーブル」を見つける
        - ID（rtb-hogehoge）をクリック
            - サブネットの関連づけで**private**-subnet-1a-devを対象外にする
    - dev-route-privateをクリック
        - サブネットの関連づけで**private**-subnet-1a-devを対象にする
        - ルートの編集
            - ルートの追加
        
                | 送信先    | ターゲット       |
                | --------- | ---------------- |
                | 0.0.0.0/0 | NAT Gateway |

            - ルートの保存
            
## 7. 完成

# 終わりに
- NATゲートウェイは有料ですので、使用しない場合は削除することをオススメします
- 次回はサブネット内にEC2インスタンスを配置し、sshで疎通を確認していきます
- 間違いや改善点等ございましたらコメントを頂ければ幸いです


### 作図ツール
- draw.io (https://www.draw.io/?splash=0&libs=aws4)
ロボットの把持位置(Python PCA 主成分分析)


- 3D点群から物体をアームでピッキングする際に,認識点群を主成分分析し第二主成分を把持方向とすることがある

```python:pca.py
import numpy as np
import scipy as sp
from sklearn.datasets import make_classification
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt

# サンプルデータを生成
X, y = make_classification(n_samples=200, n_features=2, n_redundant=0, n_informative=2,
                           n_classes=1, n_clusters_per_class=1, random_state=0)

# 主成分分析
pca = PCA(n_components=2)
pca.fit(X)

# 可視化
plt.scatter(X[:, 0], X[:, 1], alpha=0.5)

l = pca.explained_variance_[1]
vector =  pca.components_[1]
v = vector * 3 * np.sqrt(l)
plt.annotate('',  pca.mean_ + v, pca.mean_ - v,
             arrowprops=dict(connectionstyle='arc3', width=2))



plt.axis('equal')
plt.show()
```
結果

![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/a9d14b7d-a831-9e1b-7b91-f7c974c1be20.png)

###参考
https://hawk-tech-blog.com/python-machine-learning-basic-pca/
PHP 数値の3桁の区切りカンマを打つ

# 目的

- PHPで数値の3桁の区切りカンマを打つ方法まとめる

# 情報

- 下記サービスを用いて動作確認を実施
    - [https://paiza.io/ja](https://paiza.io/ja)

# 方法

1. number_format関数を使用する。
1. 例えば「1000」を「1,000」のようにカンマを打ってほしい場合、下記のようにする。実行すると「1,000」が出力される。

    ```php
    echo number_format(1000);
    ```

1. 変数`$num`に格納された数値の3桁区切りのカンマを打ち、再び変数`$num`に格納する場合は下記のようにする。

    ```php
    $num = 1000;

    $num = number_format($num);

    echo $num;
    ```

# 参考文献

- [https://www.php.net/manual/ja/function.number-format.php](https://www.php.net/manual/ja/function.number-format.php)
manimの作法 その10

#概要

manimの作法、調べてみた。
add_updater、使ってみた。

#サンプルコード


```
from manimlib.imports import *

class test(Scene):
	def construct(self):
		self.t_offset = 0
		dot = Dot()
		rate = 0.25
		orbit = Circle()
		def around_circle(mob, dt):
			self.t_offset += (dt * rate)
			mob.move_to(orbit.point_from_proportion(self.t_offset % 1))
		dot.add_updater(around_circle)
		self.add(dot)
		self.wait(5)
```

#生成した動画

https://www.youtube.com/watch?v=c5djg93rWjg

以上。
【Git初心者】Sourcetreeの導入方法

Git初心者が理解を深める為にSourcetreeを導入したのでその時の作業の備忘録です。

環境
-
macOS バージョン10.15.17


Sourcetreeのインストール
-
公式よりダウンロード
https://www.sourcetreeapp.com/

ダウンロード後、インストールの際に「Appストアからのインストールではない」的なエラーを表示しますがmacの「設定→セキュリティとプライバシー→一般」下部の「ダウンロードしたアプリケーションの実行許可」よりエラーを回避してインストールできます。


インストール後
-
参考：
https://confluence.atlassian.com/get-started-with-sourcetree/get-started-with-sourcetree-847359026.html

公式の手順通りやってみました。


アカウント設定
-

####「Sourcetree→環境設定→アカウント」より登録を行う

**ホスト**
リモートリポジトリを選択
**認証タイプ**
BasicとOAuthを選択可能
**ユーザー名**
「アカウントを接続」をクリックすると認証が走り表示されるようになる
**プロトコル**
HTTPSかSSHを選択可能、SSHを選択すると公開鍵をコピーできる

今回はGithub,OAth認証、HTTPSを選択して認証まで完了した様子だけど、ここから公式に記載の内容と様子が違ってきてしまいました。


アカウント設定後
-
アカウント設定が済んだら、本当なら下記のように表示されるようですが私の場合表示できず、空の状態でした。
もちろんリモートリポジトリにはファイルが存在します。なぜ、、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469267/63aea00e-1ee5-5b64-fad0-9dceb7cc96c5.png)

リモートリポジトリのファイルが表示されない理由を調査は後日、、


ローカルリポジトリの追加
-
これでローカルの方は追加できました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469267/e898ad67-7fcb-b56d-b26b-e5966744d0ac.png)

そうするとここに一応リモートリポジトリも表示されるように。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469267/d78dca49-4f03-3eb0-9a07-3e40e14fbb25.png)

既存のリモートリポジトリはここから確認するのが良いのか。

最後に
-
一応これでSourcetreeを使用する準備は一通り整ったことになります。
あとは使ってみてどうなるか、使用時のTipsは別途まとめます。
labelimg　インストール方法

環境：windows10

Anacondaのcmdで

①PyQt5のインストール
pip install PyQT5

②lxmlのインストール
pip install lxml


③labelImgのインストール
git clone https://github.com/tzutalin/labelImg.git
cd labelImg
pyrcc5 -o libs/resources.py resources.qrc
python labelImg.py


・labelimgのGitHub
https://github.com/tzutalin/labelImg
【Swift】SwityJSONを使用して占いAPIのJSONデータから簡単に情報を取得する

占いを無料で提供しているAPIがあったので、Swiftで呼び出そうと思ったらJSONの子要素の名前が日付（2021/01/01)のような形式で戸惑ってしまった。
SwiftyJSONを使用することで解決出来そうなので試してみた。

##開発環境
Xcode 12.3
SwiftyJSON 5.0.0

##SwiftyJSONを使用し、APIから情報を取得
例として、2021/01/05の牡羊座の恋愛運（love)を取得

```swift
import UIKit
import SwiftyJSON

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        getHoroscopeDate()
    }

    private func getHoroscopeDate() {
        
        guard let url = URL(string: "http://api.jugemkey.jp/api/horoscope/free/2021/01/03") else { return }
        let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
            if let error = error {
                print("error", error)
                return
            }
            guard let data = data else {
                print("Data情報の取得に失敗しました")
                return
            }
            do {
                let json = try? JSON(data: data)
                if let json = json {
                    let love = json["horoscope"]["2021/01/05"][0]["love"]
                    print(love)
                }
            }
        }
        task.resume()
    }
}
```
API用に構造体を作成する必要もなく、かなり簡単に希望の情報が取得出来ました。


##JSONデータ
取得結果(2021/01/05)

```json
{
    "horoscope": {
        "2021/01/05": [
        {
        "content": "図書館で過ごす時間は、あなたの想像力を高めてくれます。悩んでいることがあるなら、好きな作家の本を読んでみて。",
        "item": "鍋料理",
        "money": 4,
        "total": 3,
        "job": 3,
        "color": "グリーン",
        "day": 5,
        "love": 3,
        "rank": 7,
        "sign": "牡羊座"
        },

.......以下１１星座分が続きます

        ]
    }
}

```

##参考
<a href="https://cocoapods.org/pods/SwiftyJSON">SwiftyJSON</a>

##使用したAPI
<a href="http://jugemkey.jp/api/waf/">Web ad Fortune 無料API</a>
利用の条件があり、商用利用する場合は有料版を使うようにしてください。

##まとめ
SwiftyJSONを使用したら本当に簡単にJSONデータから情報を取得できた。
とても便利なライブラリなので理解をもっと深めたい。
Alamofireでインターネット接続状態を確認する

## はじめに
AlamofireでAPIリクエストをする際に端末がインターネット接続されていなかった場合エラーを流す必要がありました。
その時に調べたことのまとめになります。

## NetworkReachabilityManagerを使う
Alamofireには標準で```NetworkReachabilityManager```というクラスがあります。
今回はそちらを使用して接続状態を確認します。
[参照](https://github.com/Alamofire/Alamofire/blob/master/Source/NetworkReachabilityManager.swift)

## 使い方
その①
ベタがき
コード量が少ないがパッと見読みにくい

```swift
import Alamofire
if let isConnected = NetworkReachabilityManager()?.isReachable, !isConnected {
     print("Disconnect")
 }
```

その②
クラスを定義する
見やすい

```swift
import Alamofire
class ConnectCheck {
    func isConnectedNetwork() -> Bool {
        return NetworkReachabilityManager()?.isReachable ?? false
    }
}
```

使う時

```swift
if ConnectCheck().isConnectedNetwork() {
    print("Connect")
} else {
    print("Disconnect")
}
```

こんな感じでした。
docker / docker-compose バージョン指定 インストール (アップ|ダウン)

## インストール 覚え書き

```
function version () {
  [ -e $1 ] && $1 -v | sed -r 's/.* ([\.0-9]+), .*$/\1/'
}

VER=19.03.8
BIN=/usr/bin/docker
if [ $(version $BIN) != $VER ]; then
  curl -s -fsSL https://get.docker.com \
    | sed 's/sleep [0-9]*//' \
    | sed 's/apt-get install/apt-get install --allow-downgrades/' \
    | VERSION=${VER} sh
fi

VER=1.24.1
BIN=/usr/bin/docker-compose
if [ $(version $BIN) != $VER ]; then
  URL=https://github.com/docker/compose/releases/download/${VER}/docker-compose-$(uname -s)-$(uname -m)
  curl -s -L $URL -o ${BIN}
  chmod +x ${BIN}
fi
```

### リリースノート
https://docs.docker.com/engine/release-notes/
https://docs.docker.com/compose/release-notes/
m1向けdocker-desktop previewが出たので、手持ちのmacbook pro 15inchと対決してみた


(2021/1/13) ryzen7 + windows10 + wsl2追加

スペック
- MacBook Pro 15インチ i7-8750H 6cores メモリ16GB
- MacBook Pro 13インチ m1 メモリ16GB
- ThinkPad T14 Gen 1　AMD Ryzen7 PRO 4750U 8cores メモリ16GB

docker-compose upでnode:12でアプリビルド x 4コンテナ
毎回事前にdocker-compose down
3回ストップウォッチ計測

||1回目|2回目|3回目|
| ---- | ---- | ---- | ---- |
|i7|55s|57s|61s|
|m1|32s|31s|31s|
|Ryzen7|27s|30s|26s|

Ryzen7がm1をさらに上回る。
でもm1速いな！！

5000番台になればさらにRyzenが伸びそうだけど、Macもまだハイスペック版のm1を隠し持っている状態。

この性能差だったら、windowsに行かなくても良い気がする。
sfdx cliでデプロイ時に差分を認識してくれない

## 事象

以下コマンドで、ソースコードを環境にデプロイしようとしましたが、
差分があるにも関わらず、差分が無いと表示されてしまいました。

```bash
sfdx force:source:deploy -u ALIAS -p ./

=== Deployed Source
No results found
```

## 解決法

もともとは7.78.0を使用しておりましたが、`sfdx`をバージョンダウンすることで解決しました。うーん・・・なんていうか。。

```bash
npm install sfdx-cli@7.75.0 --global
```
[ServiceNow] Go to ナビゲーションのデフォルトのクエリ条件を部分一致に変更する

# きっかけ
ServiceNowのGo to ナビゲーションに検索条件を入力してEnterすると通常は>=（Grater than）になるが、部分一致検索をすることのほうが多い。
（「*検索条件」を入力することで部分一致させることができるが、うっかり忘れがち）
![Incident_list.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676866/fff99113-1a39-8ea1-39b3-7e6164c182f0.jpeg)
![Incident_result.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676866/11f744f2-2213-cb7f-654c-18fe72244020.jpeg)

## 確認したプラットフォーム
Paris

# 設定方法
システムプロパティ`glide.ui.goto_use_contains`をtrue に設定する。
![sys_property.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676866/852679bd-8ee2-6dc8-541c-8ef6b4d6bd21.jpeg)
「*」を入れなくても部分一致の検索結果が表示される。
![Incident_result2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676866/542d3a6b-7286-36e7-f63a-59eae81e1826.jpeg)

# 参考
[Search a list（ServiceNow Docs）](https://docs.servicenow.com/bundle/paris-platform-user-interface/page/use/using-lists/task/t_SearchAList.html)

数字を入力した場合、ContainsではなくEndsWithになる既知のエラーが存在する。
[Property glide.ui.goto_use_contains set to true causes doing a number search using starts with/ends with but not contains](https://hi.service-now.com/kb_view.do?sysparm_article=KB0717344)
manimの作法 その9

#概要

manimの作法、調べてみた。
ParametricSurface、使ってみた。

#サンプルコード


```
from manimlib.imports import *

class DSurface(ParametricSurface):
	def __init__(self, **kwargs):
		kwargs = {
			"u_min": -1.5,
			"u_max": 1.5,
			"v_min": -1.5,
			"v_max": 1.5,
			"checkerboard_colors": [GREEN, BLUE],
			"checkerboard_opacity": 0.5
		}
		ParametricSurface.__init__(self, self.func, **kwargs)
	def func(self, x, y):
		return np.array([x, y, x ** 2 + y ** 2])

class test(ThreeDScene):
	def construct(self):
		sphere = ParametricSurface(lambda u, v: np.array([1.5 * np.cos(u) * np.cos(v), 1.5 * np.cos(u) * np.sin(v), 1.5 * np.sin(u)]), v_min = 0, v_max = TAU, u_min = -PI / 2, u_max = PI / 2, checkerboard_colors = [RED_D, RED_E], resolution = (15, 32))
		def param_plane(u, v):
			x = u
			y = v
			z = 0
			return np.array([x, y, z])
		plane = ParametricSurface(param_plane, resolution = (22, 22), v_min = -2, v_max = +2, u_min = -2, u_max = +2, )
		def param_gauss(u, v):
			x = u
			y = v
			d = np.sqrt(x * x + y * y)
			sigma, mu = 0.4, 0.0
			z = np.exp(-((d - mu) ** 2 / (2.0 * sigma ** 2)))
			return np.array([x, y, z])
		gauss_plane = ParametricSurface(param_gauss, resolution = (22, 22), v_min = -2, v_max = +2, u_min = -2, u_max = +2, )
		cylinder = ParametricSurface(lambda u, v: np.array([np.cos(TAU * v), np.sin(TAU * v), 1.0 * (1 - u)]), resolution = (6, 32))
		surface = DSurface()
		axes = ThreeDAxes()
		self.set_camera_orientation(phi = 75 * DEGREES, theta = 30 * DEGREES)
		self.add(axes)
		self.play(ShowCreation(sphere))
		self.wait()
		self.remove(sphere)
		self.play(ShowCreation(plane))
		self.wait()
		self.remove(plane)
		self.play(ShowCreation(gauss_plane))
		self.wait()
		self.remove(gauss_plane)
		self.play(ShowCreation(cylinder))
		self.wait()
		self.remove(cylinder)
		self.play(ShowCreation(surface))
		self.wait()




```

#生成した動画

https://www.youtube.com/watch?v=HATdDHmnmD8

以上。
BigQueryでスコアの上位x%ラインをNTILEで算出する

# 概要

スコアの上位x%ラインを算出して欲しいという要求があった。NTILEでやったのでメモ。


# SQL
例として上位10%とする。
NTILE(10)の1のscoreの最小値をとる。

```sql

WITH ntiled as (
    SELECT score, NTILE(10) OVER (ORDER BY score desc) as ntile FROM table_name 
)

SELECT MIN(score) FROM ntiled WHERE ntile = 1
```
Codeigniter4 で VIEWPATH を取得したい

Codeigniter3では定数になっていたビューのパスを取得する `VIEWPATH` 。
これがCodeigniter4には存在しない。

参考： Global Constants
https://codeigniter4.github.io/userguide/general/common_functions.html#global-constants

そのため、動的にビューを利用していて存在チェックが入る場合に困るケースがある。

## 1. APPPATHから取得する

特に特殊な使い方をしていない場合は以下で問題ない。

```php
$viewpath = APPPATH . 'Views';
```

## 2. Config\Path から取得する

`app/Config/Paths.php` を書き換える可能性がある場合はこちらを利用

```php

// どちらも同じ
$viewpath = config('Paths')->viewDirectory;
$viewpath = (new \Config\Paths())->viewDirectory;

/*
\Config\Paths には以下のようなプロパティが定義されている。
なお、viewDirectory, testsDirectory 以外はGlobal Constantsに存在する。

object(Config\Paths)#84 (5) {
  ["systemDirectory"]=>
  string(76) "/path/to/root/app/Config/Paths/../../../vendor/codeigniter4/framework/system"
  ["appDirectory"]=>
  string(36) "/path/to/root/app/Config/Paths/../.."
  ["writableDirectory"]=>
  string(48) "/path/to/root/app/Config/Paths/../../../writable"
  ["testsDirectory"]=>
  string(44) "/path/to/root/app/Config/Paths/../../../tests"
  ["viewDirectory"]=>
  string(41) "/path/to/root/app/Config/Paths/../../Views"
}
*/
```

## 3. 自分で `VIEWPATH` を定義する

上記を用いて `app/Config/App.php` あたりのコンストラクタで定義してしまう。
利用頻度が高い場合には使えるかも。

```app/Config/App.php
public function __construct() {
	parent::__construct();
	defined('VIEWPATH') || define('VIEWPATH', config('Paths')->viewDirectory);
}
```

なお、viewDirectoryが変動しない場合は `app/Config/Constants.php` に書いてしまっても良い。

```app/Config/Constants.php
defined('VIEWPATH') || define('VIEWPATH', APPPATH . 'Views');
```

以上、
恐らく設定のロード順の関係でハブられてしまったのだと推測されるが、個人的には入れてほしかった機能ではある。
Redmine view customize プロジェクト識別子による条件分岐

パスのパターン	/issues
挿入位置	全ページのヘッダ
種別	JavaScript
コメント	新規チケット画面のファイル非表示（複数PJで条件分岐）

````javascript
$(function() {
  var pid = ViewCustomize.context.project.identifier;
 if (pid == 'プロジェクト識別子1'){
  　$('#attachments_form').hide();
   } else if (pid == 'プロジェクト識別子2'){
    $('#attachments_form').hide();
   }
});
`````

プロジェクト識別子の調べ方は
http://(ホーム画面のURL)/projects.xml
MySQLでデータベースの名前を変更する方法

##問題
MySQL5.1.23以降では、それまでに使えたRENAME DATABASEが廃止されてしまいました。
そのため、1つのSQL文で簡単にデータベース名を変更することができません。

##解決法
他にも方法はあるかもしれませんが、ここでは1つの方法を紹介します。
データベースを新しく作り、そのデータベースに元のデータベースのテーブルを移動させるという方法です。

```
// 移動先のデータベースを作成
CREATE DATABASE db_b;

// 移動先のデータベースにテーブルを移動
RENAME TABLE
	db_a.table1 TO db_b.table1,
	db_a.table2 TO db_b.table2,
	db_a.table3 TO db_b.table3,
	...
	...

// 元のデータベースを削除
DROP DATABASE db_a;
```