OmniAICreator/Qiita-1.07M huggingface dataset:
今更ながらWPFに置き換えてみる（7）

遅い原因は単にCanvasのChildrenをClearしていなかっただけの模様。
修正したところ何とか違和感ないレベルになりました。
とはいえWindowトランジションの際はメキメキパフォーマンスが落ちるのでいったん不要なコントロールは非表示に。
![TestApp3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590512/c631d739-7f42-adcc-736f-d3a3df18faeb.gif)

#NotifyIconの動的な生成・更新
NotifyIconに左上のCanvasのBitmapイメージを突っ込んでいます。
左に同じようなアイコンがもう一つありますが、そちらはForms＋VB版のアイコン。同じようにGDIで描画したものを動的に入れてますが１６ピクセル固定のイメージをそのまま入れているので当ノートPC（１２５％）のスケーリングにより２０ピクセルサイズになっているため、ボケ度合いが激しいです。

![toolbar-1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590512/e516f743-dbf5-cfe7-cbed-9355e21ee8a0.png)

拡大するとより分かりやすい。

![キャプチャ-2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590512/b3ba1a7c-7d75-9206-7a3e-5e448875d6d7.png)

NotifyIconのもとになるCanvasのサイズを１６ピクセルではなく２０ピクセルで作ってるので、きれいに表示されています。１６のサイズで作っちゃうと
Froms版と大して変わりません

NotifyIconへのセット手順としては
①Canvas上に作成した時計のイメージを
②CanvasごとRenderTargetBitmapにして
③RenderTargetBitmapをCopyPixelsで普通のBitmap（System.Drawing）にして
④IconHandleをとって
⑤アイコン化してセット
という流れ。

```C#
       private void MainLoop(object sender, EventArgs e)
        {
            //毎秒処理
            if (G.DispIcon != 0)
            { 
                DrawClock2(this.aCanvas);

                aCanvas.Arrange(new Rect(aCanvas.RenderSize));
                aCanvas.Measure(aCanvas.RenderSize);
                var bounds = VisualTreeHelper.GetDescendantBounds(aCanvas);
                var RTbitmap = new RenderTargetBitmap((int)bounds.Width, (int)bounds.Height, 96.0d,96.0d,PixelFormats.Pbgra32);
                var dv = new DrawingVisual();
                using (var dc = dv.RenderOpen())
                {
                    var vb = new VisualBrush(aCanvas);
                    dc.DrawRectangle(vb, null, bounds);
                }
                RTbitmap.Render(dv);
                RTbitmap.Freeze();

                //RenderTargetBitmap => bitmap
                var bitmap = new System.Drawing.Bitmap((int)bounds.Width, (int)bounds.Height, System.Drawing.Imaging.PixelFormat.Format32bppPArgb);
                var bitmapData = bitmap.LockBits(new System.Drawing.Rectangle(System.Drawing.Point.Empty, bitmap.Size), System.Drawing.Imaging.ImageLockMode.WriteOnly, bitmap.PixelFormat);
                RTbitmap.CopyPixels(Int32Rect.Empty, bitmapData.Scan0, bitmapData.Stride * bitmapData.Height, bitmapData.Stride);

                //bitmap => bitmapHandler => ImageSource(参考）
                IntPtr Hbitmap = bitmap.GetHbitmap();
                var ImageSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(Hbitmap, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());
                this.image.Source = ImageSource;

                //bitmap =>iconHandler => icon
                bitmap.UnlockBits(bitmapData);
                IntPtr Hicon = bitmap.GetHicon();
                System.Drawing.Icon icon = System.Drawing.Icon.FromHandle(Hicon);
                this.NotifyIcon.Icon = icon;

                bitmap.Dispose();
                DestroyIcon(icon.Handle);

            }
       }

```

変換が多くて非常に手間がかるやり方なんですが、stream使うのも、なんかなあという気がしてこのような手順で行くことに。きっともっとうまい方法があるに違いない。
効果検証入門のまとめ　第一章

この[本]
(https://www.amazon.co.jp/%E5%8A%B9%E6%9E%9C%E6%A4%9C%E8%A8%BC%E5%85%A5%E9%96%80%E3%80%9C%E6%AD%A3%E3%81%97%E3%81%84%E6%AF%94%E8%BC%83%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E5%9B%A0%E6%9E%9C%E6%8E%A8%E8%AB%96-%E8%A8%88%E9%87%8F%E7%B5%8C%E6%B8%88%E5%AD%A6%E3%81%AE%E5%9F%BA%E7%A4%8E-%E5%AE%89%E4%BA%95-%E7%BF%94%E5%A4%AA/dp/4297111179/ref=sr_1_1_sspa?adgrpid=75791098064&gclid=Cj0KCQjw6sHzBRCbARIsAF8FMpXHAgjyv6HwbEvNhB0pxWMYwZLz9Z0zTd8J43Dmlhxvu9XsvvCYDcsaAjQTEALw_wcB&hvadid=342721188909&hvdev=c&hvlocphy=1009300&hvnetw=g&hvqmt=e&hvrand=6698681904157057032&hvtargid=aud-758806828496%3Akwd-903018875247&hydadcr=846_1012609051&jp-ad-ap=0&keywords=%E5%8A%B9%E6%9E%9C%E6%A4%9C%E8%A8%BC%E5%85%A5%E9%96%80&qid=1584451377&sr=8-1-spons&psc=1&spLa=ZW5jcnlwdGVkUXVhbGlmaWVyPUFPQUJaQldGVTVQTlgmZW5jcnlwdGVkSWQ9QTAxNTU2OTQyT1I2R0E4MVZKVzI1JmVuY3J5cHRlZEFkSWQ9QTI5OVJBOFcyQURCMkcmd2lkZ2V0TmFtZT1zcF9hdGYmYWN0aW9uPWNsaWNrUmVkaXJlY3QmZG9Ob3RMb2dDbGljaz10cnVl)の第一章のまとめです。まとめと言いつつ少し書き足しているので間違ってたらごめんなさい、教えてください。

# 因果推論でやりたいこと
対象の集団を考える。その集団全体がある介入を受けたときの目的変数の期待値と、その集団全体が介入を受けなかったときの目的変数の期待値の差を得たい。
例：クーポンを一部の顧客に配信したら、クーポンを配信していない顧客に比べて売上が20%高かった。この20%はクーポンを配信によるものか？クーポンを配信しなくても売上が高い顧客だったのではないか？この問いは次のことがわかれば答えられる。顧客全体に対してクーポンを配信したときの売上と、顧客全体に対してクーポンを配信しなかったをときの売上。

# 因果推論の難しいところ
顧客全体に対してクーポンを配信したときの売上と、顧客全体に対してクーポンを配信しなかったをときの売上の両方を計測することは不可能である。 [^1]
観測できるのは一部の顧客にクーポンを打ったという現実世界の売上だけである。

# RCTなら相関を因果とみなすことができる
## 世界観
Rubin流の因果推論の世界観を図で表現する。
![効果検証入門-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132734/19f69d67-71b0-f262-38d5-143586cc7b05.jpeg)


上の図では色がクーポンが打たれたかどうかを表現している。Zはクーポンが打たれたかどうかは表現しない。イメージで説明すると、Zは人の分別に使われる。我々が観測できる世界で、クーポンを打たれた人はバッジをつける。すべての顧客がクーポンを打たれていない世界でもその人はバッジをつけている。Zはバッジを付けている人かどうかを分別する。

我々が知りたいのは次の式で表現できる因果である。

```math
E[Y^{(1)}-Y^{(0)}]
```

しかし、我々が観測できるのは$Y$と$Z$のみである。例えば、次の式で表現できる相関は観測できる。

```math
E[Y|Z=1] - E[Y|Z=0]
```

## 仮定
次の仮定を置く。[^2][^3]

```math
E[Y|Z=1] = E[Y^{(1)}|Z=1]    
```
```math
E[Y|Z=0] = E[Y^{(0)}|Z=0]  
```



## RCTのすごいとこ
RCTならば次の式が成り立つ。

```math
E[Y^{(0)} | Z=1] = E[Y^{(0)} | Z=0]
```

```math
E[Y^{(1)} | Z=1] = E[Y^{(1)} | Z=0]
```

これにより、相関と因果が等価であることを示すことができる。

```math
\begin{equation*}
\begin{split}
E[Y|Z=1] - E[Y|Z=0] &= E[Y^{(1)}|Z=1] - E[Y^{(0)}|Z=0]\\
&=E[Y^{(1)}-Y^{(0)}|Z=1] + (E[Y^{(0)}|Z=1]- E[Y^{(0)}|Z=0]) \\
&=E[Y^{(1)}-Y^{(0)}]
\end{split}
\end{equation*}
```
[^3]
相関が因果になった！！！！！！！やっったね！！！！！！！！！:clap::clap::clap::clap::clap::clap::clap::clap::clap:

[^1]: 母集団すべてのサンプルが得られない（顧客全てにクーポンを配信することができない）という意味ではなく、顧客に対して、クーポンを配信されたかつ配信されていない状態にすることが不可能であるという意味。
[^2]: いわゆるConsistency。これは仮定するしかないという理解をしています。詳細はこちらhttps://www.hsph.harvard.edu/miguel-hernan/causal-inference-book/
[^3]: 第三式の第一項がこうなるのは、$Y^{(1)}\perp Z$かつ$Y^{(0)}\perp Z$なら$Y^{(1)}-Y^{(0)}\perp Z$
私的shellspec Tips

# 概要

最近開発したシェルスクリプトのテストツールとして[shellspec](https://shellspec.info/)を活用している。
シェルスクリプトは、

* 処理が比較的高速  
単体で並列化も可能
* 簡単  
コマンド並べるだけ
* 追加パッケージ不要  

というメリットがあり、特にインフラ界隈ではしょっちゅう使用するものの、モジュール化しにくいので見通しが悪く、バグを作り込みやすい。
そして記述済みの部分に場当たり的に修正や機能追加を行ってブラックボックス化してしまうこともしばしば。

テストツールを使って、細かい処理毎に関数を設けてテストを繰り返すことで、品質の向上が期待できる。
また、リグレッションテストを容易にすることでリファクタリングのハードルを下げ、ブラックボックス化を抑止できる。

いざ使ってみたところ、テストツールに対する私の理解があまりなかったこともあって、テストの作成にかなり時間がかかってしまった。

ここでは、テストで確認したい内容の実現方法について自分用にまとめる。

### When句で実施した処理の結果をコマンドで確認する。

When call/runで関数/コマンドを実行したあと、別のコマンドで結果を確認する場合。例えば、サブプロセスを立ち上げるシェルスクリプトを実行して、プロセスが存在しているか調べる。

追記：作者の方からコメントいただいたので記載見直ししました。

```
Describe "コマンド結果確認"
  check_subprocess(){
    [[ $(pgrep -f subprocess.sh | wc -l) -gt 0 ]] && echo OK
  }

  It "サブプロセス起動"
    When run ./start_subprocess.sh
    The result of "check_subprocess()" should eq OK
　End
End
```

### 関数以外の処理をスキップさせる

Include句でシェルスクリプトを読み込むと、関数内に記述していない処理は実行されてしまう。

```bash:test.sh
#!/bin/bash

function hoge(){
    echo "hoge"
}

hoge
echo "fuga" >&2
```

```test_spec.sh
Describe "test"
  Describe "test"
    Include ./test.sh

    It "hoge()"
      When call hoge
      The output should eq "hoge"
    End
  End
End
```

以下の実行結果を見ると、テストそのものはOKとなっており問題はないのだが、"fuga"が出力されてしまっていることがわかる。

```実行結果
Running: /bin/bash [bash 5.0.3(1)-release]
fuga
Unexpected output to the stderr at line 2-4 in 'spec/hello_spec.sh'
.

Finished in 0.26 seconds (user 0.26 seconds, sys 0.05 seconds)
1 example, 0 failures

An unexpected error occurred or output to the stderr. [0] [0] [102]
Fatal error occurred, terminated with exit status 102.
```

`${__SOURCED__:+return}`を関数外処理の始まりに記載する。
shellspec実行時はここで処理が打ち切られるので関数外処理が実行されずにすむ。


```bash:test.sh
#!/bin/bash

function hoge(){
    echo "hoge"
}


# shellspecテスト時は以下の処理は実行しない。
${__SOURCED__:+return}

hoge
echo "fuga" >&2
```

### 動作するシェルを指定する。

`.shellspec`ファイルに以下を追記する。

```:.shellspec
--shell bash
```

### パターンをまとめて列挙する

```test_spec.sh
Describe 'DHCPCDは起動していて、wpa_supplicantは停止していることを確認する。'
  Parameters
    "#1" "dhcpcd" 0
    "#2" "wpa_supplicant" 3
  End

  Example "example $1"
    When run sudo systemctl status $2
    The status should eq $3
  End
End

```

### 標準出力が指定した行を含むかチェックする。

```:test_spec.sh
Describe "IP addr check"
    grep_eth0(){
        # $1に標準出力、$2にエラー出力、$3に返り値が入る。
        echo "$1" | grep "eth0" | awk '{if($1=="inet")print $2}'
    }
    It "eth0に規定のIPアドレスが設定されているか確認する。"
         When run ip a
         The result of "grep_eth0()" should eq "192.168.3.142/24"
    End
  End
```

以下、おいおい追記していく
[Rails]hamlでのform_with／form_for／form_tagの書き方

#はじめに
hamlでのformの書き方がまとまっていなかったのでまとめる

※`form_tag`と`form_for`は`Rails5.1`で非推奨となっており、将来的に`form_with`に置き換えられる予定です。
極力、`Rails5.1以上`と`form_with`の使用を推奨します。

#Railsのformの種類
##1. form_tag
- 関連するモデルがない時に使用する（検索機能など）
- inputタグを用いる（ビルドヘルパーを用いない）

```ruby
<%= form_tag users_path do %>
  <%= text_field_tag :email %>
  <%= submit_tag %>
<% end %>
```

##2. form_for
- 関連するモデルがある時に使用する（投稿機能など）
- ビルドヘルパー（`form.xxxx`）を用いる

```ruby
<%= form_for @user do |form| %>
  <%= form.text_field :email %>
  <%= form.submit %>
<% end %>
```
##3. form_with
- Rails5.1以上は問答無用でform_with

###**form_tag／form_forとの違い**
- form_withで自動でパスが選択されるので、HTTPメソッド(`get`や`post`など)を指定する必要が無い
- コントローラーから渡されたActiveRecordを継承するモデルのインスタンスが利用できる
- form_withは、form_forとform_tagの機能を組み合わせたもの、とイメージすると分かりやすい

```ruby
#関連するモデルがない場合 → urlの指定のみで、modelの記述がない
<%= form_with url: users_path do |form| %>
  <%= form.text_field :email %>
  <%= form.submit %>
<% end %>
```

```ruby
#関連するモデルがある場合 → modelの記述のみで、urlの指定は不要
<%= form_with model: @user do |form| %>
  <%= form.text_field :email %>
  <%= form.submit %>
<% end %>
```

#hamlでの書き方
この記事のメインはこちら

##form_tag
ビルドヘルパー(`f.text_field`など)は記述しない点に注意

```ruby
= form_tag users_path do 
  = text_field_tag :email
  = submit_tag
```
##form_for

```ruby
= form_for @user do |form|
  = form.text_field :email
  = form.submit
```

##form_with

```ruby
#関連するモデルがない場合 → urlの指定のみで、modelの記述がない
= form_with url: users_path do |form|
  = form.text_field :email
  = form.submit
```

```ruby
#関連するモデルがある場合 → modelの記述のみで、urlの指定は不要
= form_with model: @user do |form|
  = form.text_field :email
  = form.submit
```

##参考記事
[【Rails】form_for/form_tagの違い・使い分けをまとめた](https://qiita.com/shunsuke227ono/items/7accec12eef6d89b0aa9)
[【Rails 5】(新) form_with と (旧) form_tag, form_for の違い](https://qiita.com/hmmrjn/items/24f3b8eade206ace17e2)
プログラミング一般で使えるデバッグ方法

# 概要
プログラミング言語に依存しない、一般的なデバッグ技法をまとめる。
# 障害箇所の絞り込み
## 二分探索
### 前提
この方法を使うためには、処理が逐次実行されていることが前提となる。
### やり方
1. まず、普通の二分探索同様、バグが眠っていそうな範囲を大まかに半分程度に分ける。
2. 前半の処理を実行し、正常に実行されることを確認する。
3. 前半の処理が正常に実行されれば、バグが後半の処理のどこかにあることが分かる。
4. もし、前半の処理が失敗すれば、バグは前半の処理のどこかにあることになる。

上記の手順を、障害箇所が特定できるまで繰り返す。これが二分探索によるデバッグである。
### 適用範囲
#### プログラミング
商用システムのプログラミングでは、処理が逐次的に実行されることが多く、この手法は大半の障害の切り分けに有用である。
#### ネットワーク
ネットワークの障害においても、障害箇所の切り分けで使えることが多い。デフォルトゲートウェイまで通信できるか、インターネットには出られるかなど、通信の正常を確認したり、Webサーバーに届いているか、アプリケーションサーバーまで届いているかなど、HTTP通信の切り分けに使えたりもする。
#### 性能問題
これはプログラミングに含まれるが、いわゆる機能の部分でのバグではなく、性能が出ないケースでもこの手法は有効である。
処理の中のどの部分で性能がぐっと落ちるのか、二分探索で調べることができる。
SQLなどでも、この手法で切り分けていくと、特定の処理で急に重くなっていることが発見できることがある。
#### コンパイルエラーと実行時エラー
コンパイルでこけたら、文法エラーであり、実行時にこけたら実行時エラーである。
SQLなど、実行するタイミングでコンパイルされる言語でも、先に文法チェックを走らせられる場合があり、これでどちらのエラーか切り分けられる。
### やり方の工夫
#### ミニプログラムで動作を確認する
疑わしい箇所がシステムの奥に埋め込まれていて、調査範囲が絞り込みづらい場合、うまく動かない箇所を切り出して別に実行してみるのが有効である。
埋め込みSQLのデバッグは、そのSQLをコピーしてSQL単体で実行した方がデバッグしやすいだろうし、プログラムの文法があっているか自信がなければ、小さなサンプルプログラムを作って実行してみれば良い。最近は大概○○Fiddleという感じでオンライン上で実行できる環境があったりする。そこでチェックすれば簡単である。
## printfデバッグ
いわゆるステップ実行というやつである。IDEで実行中の変数の中身を見れたりすれば、わりとすぐに原因が分かることが多い。そこまで開発環境が整っていなくても、変数の中身を出力したり、ステップごとにログを出力したりできないケースは少ない。何か方法があるはずである。
## 正常に動作している別のアプリの設定と比較する
Webサーバーやアプリケーションサーバーの設定に問題がある場合、どうやってデバッグしたら良いか。
前述の二分探索以外に、正常に動いているアプリの設定と比較するというやり方がある。
Webサーバーが3台あって、1台だけうまく動かない場合、設定画面を開いて、ひとつひとつ正常に動作しているWebサーバーと比較する。
すると、うまく動かないWebサーバーだけ設定が違っていることがある。
ただ、Webサーバーの設定項目というのはたくさんあるのであって、ある程度疑わしい範囲を絞り込むことはやはり別途必要になる。
しかし、正常に動いているアプリが見つかれば、不具合が起きているアプリを正常に動かせる見通しはそれなりに明るくなるわけなので、この方法も大切である。
# 障害の発見
## 障害に関する記録を調べる
### エラーメッセージ
エラーメッセージがそのまんま教えてくれていることがある。これは重大なヒントであって、無視すべきではない。もちろん、必ず正しいとは限らない。
### エラーログ
エラーログがどこかに吐かれていないか見る。アプリケーションログではなく、Windowsのイベントログに何かあるかもしれない。Linux系は知らないが、話は一緒のはずである。エラーログが出ているはずなら、見てみる価値はある。
### ただのログ
アクセスログとか。ともかく記録が見つかれば、それが手がかりになる。
## 大量のデータを流す
大量のデータを流してみる目的はいくつかある。
### 障害を再現する
事象を再現できれば、なんとかなるものである。そもそも障害が再現できないとき、大量にデータを流してみて、異常を発生させることを狙うわけである。
### 障害が発生するデータの特徴をつかむ。
1万件のデータを流して、30件程度エラーになったとする。
そのデータには何か特徴がないだろうか？　例えば、「特定のクラスタの会員データがエラーになっている」ということはないか、調べてみるのである。
### 障害が発生していないことの確認
修正前後のソースコードでそれぞれデータを流し、処理結果が一致している場合、流したデータについて行われた処理の結果が一致していることになる。このとき、何万件という大量のデータを流せば、ほぼほぼ機能の正常動作が確認できる。リファクタリングをしたときや、修正箇所の周囲でデグレードが起きていないことを確認したいときにこの方法が使える。
## 直近の修正箇所を疑う
1箇所しか修正していないなら、そこがバグっている可能性が高い。
リリースが何回か行われているなら、どのリリースまでは正常に動作しているか、例の「二分探索」で調べれば良いのである。
## データを疑う
流れてくるデータが間違っている可能性もある。例えば、「会員名」のデータに、予想外に長い名前のデータが入っていて、システムが落ちているのかもしれない。もちろん、そういうデータを許容したUIが悪いという結論になるかもしれないが、データの異常を疑うことも、障害の特定には必要なことである。
# 並行プログラミングのデバッグ
これは難しいし、そもそも並行処理を書いた経験が少ないのだが、知っている、または聞いた範囲で書いておく。
## 処理の実行速度をわざと遅らせる
処理の合い間合い間にsleep処理を仕込んで、ひとつひとつの処理をゆっくり流すことで、race conditionなどのエラーを再現するという手法を読んだことがある。これは使えることがあると思うので、ここに記しておく。
## スレッドの数を大幅に増やす
5,6個のスレッドが並行して動く処理があったとする。このスレッドの数を2～3000スレッドに増やす。こうすることで、障害を発生しやすくし、障害の発見に役立てる。
### Webサイトへのアクセス数を増やす。
Webサイトへの大量アクセス時に障害が起きる場合、Fiddlerなどのデバッグ用プロキシサーバーを立てて、HTTPアクセスを自動で行うようにプログラミングする。こうすると、数人のチームであっても、大量のHTTPアクセスを実現でき、障害の再現を試みることができる。
# 参考文献
- 『CODE COMPLETE 第2版 上 完全なプログラミングを目指して』スティーブ マコネル (著)
- 『Java言語で学ぶデザインパターン入門 マルチスレッド編』結城 浩 (著)
STLファイルを符号付き距離関数に変換する

# はじめに

**符号付き距離関数（Signed Distance Function: SDF）**について詳しくは以下参照。

- [Signed distance function - Wikipedia](https://en.wikipedia.org/wiki/Signed_distance_function)

符号付き距離関数は、3次元空間の各点におけるポリゴンデータへの最短距離（距離関数）を符号付きで示した関数です。符号付き距離関数の0等値面はポリゴンデータの表面と一致します。ポリゴンデータの中と外で符号が異なることが符号付き距離関数の特徴です。
$$
f(x)=\begin{cases}d(x,∂Ω)\quad if\quad x∈Ω \\\\-d(x,∂Ω)\quad if\quad x∈Ω^{c} \\\ \end{cases}
$$
ここで、Ωはポリゴン面の境界です。

# 概要

**ASCII形式のSTLファイルをSDFデータに変換します。**流体解析等の物理シミュレーションをスクラッチで実装するには、複雑な境界条件のインポートが一つの大きな壁になります。そんな時、境界面のSDFデータがあると非常に便利です。

STLからSDFへの変換には[basilisk](http://basilisk.fr/Front%20Page)を使用します。[basilisk](http://basilisk.fr/Front%20Page)のインストールは以下から。

- [Basilisk - src/INSTALL](http://basilisk.fr/src/INSTALL)

# ソースコード

符号付き距離関数をcsvで出力するソースコードです。Basilisk Cで実装しています。basiliskのexampleの[Basilisk - src/examples/distance.c](http://basilisk.fr/src/examples/distance.c)を参考にしました（というかほとんどコピペです）。

```c
#include <sys/stat.h>
#include "grid/octree.h"
#include "utils.h"
#include "distance.h"
#include "fractions.h"

void mk_outfilepath(char *outfilepath, char *stlfilename, char *output_dir){
	char *ptr;
	char *ptr2;
	char *buf;
	ptr = strtok(stlfilename, "/");
	while(ptr != NULL) {
		buf = ptr;		
        ptr = strtok(NULL, "/");
    }
	ptr2 = strtok(buf, ".");
	sprintf(outfilepath,"%s%s_sdf.csv", output_dir, ptr2);
}

int main(int argc,char *argv[]){
	char *input_file = argv[1];
	char *output_dir = argv[2];
	int grids = atoi(argv[3]);
	mkdir(output_dir,0755);

	coord *p = input_stl (fopen (input_file, "r"));
	coord min, max;
	bounding_box (p, &min, &max);  
	double maxl = -HUGE;
	foreach_dimension()
		if (max.x - min.x > maxl)
			maxl = max.x - min.x;

	init_grid (grids);
	size (1.2*maxl);
	origin ((max.x + min.x)/2. - L0/2,
		(max.y + min.y)/2. - L0/2,
		(max.z + min.z)/2. - L0/2);
		
	scalar d[];
	distance (d, p);
	
	FILE *fp;
	char outfilepath[256];
	mk_outfilepath(outfilepath,input_file,output_dir);
	if ((fp = fopen(outfilepath, "w")) == NULL) {
		printf("file open error!!\n");
		exit(EXIT_FAILURE);
	}
	fprintf(fp,"x,y,z,distance\n");
	foreach() fprintf(fp,"%lf,%lf,%lf,%lf\n",x,y,z,d[]);
	fclose(fp);
}
```

# 実行

```
stl2sdf <stlfile_path> <output_dir> <grid_size>
```

| option       | 説明                           |
| ------------ | ------------------------------ |
| stlfile_path | STLファイルのパス              |
| output_dir   | 出力先ディレクトリ（自動生成） |
| grid_size    | 符号付き距離関数の空間分割数   |

output_dirに元のSTLファイル名から.stlを引いたもの+_sdf.csvが出力されます。

csvファイルの中身はx,y,z座標と各座標における符号付き距離関数です。オブジェクト内は正値、外は負値になります。以下図はStanford Bunnyの例です。
![bunny.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550487/bcbe6d09-b85f-8ecd-a0f1-b250fb28edbb.png)
![sdf_paraview.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550487/cfd2261a-ed9f-0c2a-b19e-dd6fd5fdbcec.png)


# GitHub

https://github.com/JmpM-0743/stl2sdf/tree/master
アプリ作成　アウトプット

# ツイート機能実装アプリ開発
本日
１スケジュール作成していく中で何が実装に必要なのか、整理することが出来た。
２新規アプリの立ち上げrails new など　必要な作業が、何も見ずに作成していくのは難しい。

本日はここまで、データバースの設計等調べながら進めていく。
if文の条件式を使いこなしたらかっこいいよね

## 問題
こんなドリル問題がありました。
20時から翌朝7時までにオウムに喋られると問題があるのでその場合は「NG」、
それ以外は「OK」と出力するメソッドを作成します。
オウムが喋る時をture、喋らない時をfalseと入力することにし、時刻も同時に入力します。

呼び出し方：
parrot_trouble(talking, hour)

出力例：
parrot_trouble(true, 6) → NG
parrot_trouble(true, 7) → OK
parrot_trouble(false, 6) → OK
parrot_trouble(false, 7) → OK

## どうやって条件式を書くか
この問題は2つの条件を満たした場合のみOKと出力する条件式を記述する必要があります。
それはtalkingが"true"かつ時間が7時〜19時の場合のみです。
それ以外はtalkingが"true"でattatositemo出力は"NG"です。
実際に条件式を記述してみましょう

## 条件式

```ruby
def parot_trouble(talking, hour)
  if (talking == true) && (7..19).cover?(hour)
    puts "OK"
  else
    puts "NG"
  end
end
```
※ご指摘をいただきまして2行目を一部修正を行いました。
1行目でメソッドを定義して引数talkingとhourを受け取ります
2行目ではtalkingがtrueかつhourが7~19の中の数字である場合を定義し
3行目でOKを出力します。
4行目のelseにてそれ以外の場合を指定し
5行目でNGを出力
この条件式により出題の要件を満たすことができます。

## if文を制するものはプログラムを制する？
条件式はrailsではコントローラにてエラーハンドリングを行うのに使用されたり、プログラム中に出力を条件によって変えたりとあらゆる場面で使用します。
この条件式の扱いの理解を深めれば深めるほど複雑なロジックを組むことができたり、それを簡単に実装できたりとプログラマとしてのスキルが上がっていくと感じます。
無駄のなく、チーム開発でも他人が理解しやすいコードがかけるようにどんどん練習していきたいですね
Laravel DBクラスを利用(SQL文を使ってDB操作) クエリ・検索とか(where, orderBy等)個人メモ


##使い方

```php
use Illuminate\Support\Facades\DB;
```

```php
# 例　　DB::select('select * from テーブル名')
$items = DB::select('select * from people'); #この例ではpeopleテーブルを全て呼び出し
```

###パラメータ結合
```
# 例  id検索
$param = ['id' => $request->id];
$items = DB::select('select * from people where id = :id', $param);
```

###インサート
```php
DB::insert(クエリ文, パラメータ配列);
```

###viewにidを渡す

下記のようにするとurlにidを含めることができる

```HogeController.php
  public function edit(Request $request){
    $params = ['id' => $request->id];
    # select文でurlで指定したidデータを取得(今回はエラー処理していないのでidがなければコケる)
    $item = DB::select('select * from people where id = :id', $params);
    return view('hello.edit', ['form' => $item[0]]);
  }
```

```web.php
Route::get('/hoge/edit/{id}', 'HogeController@edit');
```
コントローラで```['form' => $item[0]```をviewに渡しているので```$form```が使える

```view.blade.php
  <table>
    <form action="/hoge/edit" method="post">
      {{ csrf_field() }}
      <input type="hidden" name="id" value="{{ $form->id }}">
      <tr>
        <th>name: </th>
        <td><input type="text" name="name" value="{{ $form->name }}"></td>
      </tr>
      <tr>
        <th>email: </th>
        <td><input type="text" name="email" value="{{ $form->email }}"></td>
      </tr>
      <tr>
        <th>age: </th>
        <td><input type="text" name="age" value="{{ $form->age }}"></td>
      </tr>
      <tr>
        <th></th>
        <td><input type="submit" value="送信"></td>
      </tr>
    </form>
  </table>
```

update

```HogeController.php
  public function update(Request $request){
    $params = [
      'id' => $request->id,
      'name' => $request->name,
      'email' => $request->email,
      'age' => $request->age
    ];
    DB::update('update people set name = :name, email = :email, age = :age where id = :id', $params);
    return redirect('/hoge');
  }
```

```web.php
Route::post('/hoge/edit', 'HogeController@update');
```


show

```
  public function show(Request $request){
    $item = DB::table('people')->where('id',$request->id)->first();
    return view('hello.show', ['item'=>$item]);
  }
```

```web.php
Route::get('/hoge/{id}', 'HogeController@show');
```

##where orWhere

すべての条件に合致するものを検索

```php
#where使い方
where()->where()
```


条件の１つでも合致するものを検索

```
# orWhere使い方
where(フィールド名, 演算記号, 値)->orWhere(フィールド名, 演算記号, 値)
```

####例：
```
    $items = DB::table('people')
      ->where('name', 'like', '%' . $name . '%')
      ->orWhere('email', 'like', '%' . $name . '%')
      ->get();
```

##whereRaw

配列にいれた値で条件検索できる

```php
#whereRaw使い方
whereRaw(条件式, パラメータ配列)
```

####例：
```php
$items = DB::table('people')
  ->whereRaw('age >= ? and age <= ?', [1, 30])->get();
```

##orderBy
desc ascでソート

```php
#使い方
orderBy(フィールド名, 'asc又はdesc')
```

####例：
```php
$items = DB::table('people')->orderBy('age', 'desc')->get();
```

##offset/limit

指定位置からレコード取得

```php
offset(整数)
```

指定数だけレコードを取得

```php
limit(整数)
```
Selective Classification for Deep Neural Networks【Abstract】【論文 DeepL 翻訳】

この記事は自分用のメモみたいなものです.
ほぼ [DeepL](https://www.deepl.com/home) 翻訳でお送りします.
間違いがあれば指摘していだだけると嬉しいです.

翻訳元
[Selective Classification for Deep Neural Networks](https://arxiv.org/abs/1705.08500)
Author: Yonatan Geifman, Ran El-Yaniv

前: 無し
次: [【1 Introduction】](https://qiita.com/tomato_/items/31d88fddd83ca0b21581)

# Abstract

## 訳文

選択的分類技術 (リジェクトオプションとしても知られている) は, ディープニューラルネットワーク (DNNs) のコンテキストではまだ考慮されていない. これらの技術は, カバレッジをトレードオフすることで DNNs の予測性能を大幅に向上させる可能性がある. この論文では, 与えられた訓練されたニューラルネットワークで選択的分類器を構築する方法を提案する. 我々の手法では, ユーザが所望のリスクレベルを設定することができる. テスト時には, 分類器は必要に応じてインスタンスを拒否し, (高確率で) 所望のリスクを付与する. CIFAR と ImageNet を用いた実証結果は, 我々の手法の実行可能性を説得力を持って示しており、ミッションクリティカルなアプリケーションで DNNs を運用する可能性を切り開いている. 例えば, 我々の手法を使用すると, ImageNet の top-5 の分類において, 前例のない 2% の誤差が 99.9% の確率で保証され, ほぼ 60% のテストカバレッジが保証される.


### 原文

Selective classification techniques (also known as reject option) have not yet been considered in the context of deep neural networks (DNNs). These techniques can potentially significantly improve DNNs prediction performance by trading-off coverage. In this paper we propose a method to construct a selective classifier given a trained neural network. Our method allows a user to set a desired risk level. At test time, the classifier rejects instances as needed, to grant the desired risk (with high probability). Empirical results over CIFAR and ImageNet convincingly demonstrate the viability of our method, which opens up possibilities to operate DNNs in mission-critical applications. For example, using our method an unprecedented 2% error in top-5 ImageNet classification can be guaranteed with probability 99.9%, and almost 60% test coverage.
複数ファイルから特定キーワードを検索して一括置換するワンライナー

カレントディレクトリ内のファイル内の%キーワード%を%置換後文字列%に置換するイメージです。

```shell
for file in $(find -maxdepth 1 -type f | xargs grep -F '%キーワード%' | awk '{sub(":","",$1);print $1}'); do sed -i 's %キーワード% %置換後文字列% g' $file; done
```

サンプルファイル

```text
$ cat aaa.txt
   hoge
```

```text
$ cat bbb.txt 

  hogehogehogheoghogefuga
```

カレントディレクトリ内のファイルを列挙します

```shell
find -maxdepth 1 -type f
```

各ファイル内の%キーワード%を検索します

```shell
| xargs grep -F '%キーワード%'
```

ここまでで以下のような出力が得られます。

```shell
$ find -maxdepth 1 -type f | xargs grep -F 'hoge'
./bbb.txt:  hogehogehogheoghogefuga
./aaa.txt:   hoge
```

左端のファイル名だけ得られるように、
以下をつなげます。（：が邪魔なので、awkでsubを使って除去します）

```shell
| awk '{sub(":","",$1);print $1}'
```

こんな感じになります

```shell
$ find -maxdepth 1 -type f | xargs grep -F 'hoge'| awk '{sub(":","",$1);print $1}'
./bbb.txt
./aaa.txt
```

この結果をforにかけて、sedで置換します

```shell
$ for file in $(find -maxdepth 1 -type f | xargs grep -F 'hoge'| awk '{sub(":","",$1);print $1}'); do sed -i 's hoge moge g' $file ; done
```

以下のように置換されました

```text
$ cat aaa.txt
   moge
```

```text
$ cat bbb.txt 

  mogemogehogheogmogefuga
```

もう少し簡潔に書き方も考えたいと思います。

あと、テキストが左端から開始しているとうまくいかないので別途考えたいと思います。
基本情報技術者試験の勉強　第22週(3/16週)

## 目標と結果
### 目標
・アルゴリズムの問題を解けるようにする
・表計算を完璧にする
### 結果
・まだ曖昧なところが多い
・表計算ほぼできるようになって、得意になれた
## 振り返り
### keep
・できる日は長い時間復習する
### problem
・目標が達成できない
### try
・忘れないように、午前問題の復習を行うために電車に乗っている時間は過去問道場の時間にあてる
・アルゴリズムは見るより時間をかけて書いて理解する
【編集中】ImageMagick＋GhostScriptでPDFの画像変換＆画像比較

# TODO
- [ ]  最終的に整理したコードを公開
- [ ]  画像変換をPNG/JPGのどっちにするか？
- [ ]  画像比較時の色々なメトリックスについて試してみる
- [ ]  余白のトリミング(-trim)なんてのがある!?ので、試してみる
- [ ]  オプション指定を調べる(たまにカッコ付けて実行しているコマンドが...)

# はじめに


# 環境構築
インストールは下記を特に指定せず...

◆ImageMagick
 https://imagemagick.org/script/download.php
　※ImageMagick-7.0.10-3-Q16-x64-static.exe

◆GhostScript
 https://www.ghostscript.com/download/gsdnld.html
　※gs952w64.exe

# 参考サイト
◆PDFの画像比較をリファクタリングに活かす
　https://qiita.com/oohira/items/184dbbe7c631e8c335a1
　　※下記記載がきっと重要な気がする。。。
　　　「また、PDF ファイルによっては背景色が透明の画像が生成されてしまいます。後述する画像比較がうまくできなくなってしまうようなので、-alpha off オプションを指定して不透明にします。」
　　　　⇒　が、私が試したら、逆に対象箇所が黒になってしまった。。。ということで、このオプションはPDF→PNGでは利用しない。

◆コマンドラインで画像処理が行える便利ツール「ImageMagick」
　https://www.atmarkit.co.jp/ait/articles/1809/25/news020.html
　　※導入サイト

◆ImageMagick で PS や PDF を扱えないのは脆弱性対策でした
　https://www.t3nro.net/2019/06/imagemagick-and-postscript-files/
　　※「convert: attempt to perform an operation not allowed by the security policy `PDF'」というエラーが出たときに
　　※policy.xmlの下記に対して対応すればよいらしい
　　　policy domain="coder" rights="none" pattern="{PS,PS2,PS3,EPS,PDF,XPS}"

◆ImageMagickでPDFをPNGやJPEGに変換する。
　https://ginpen.com/tag/pdf/
　　※「convert-im6.q16: not authorized `a.pdf'」というエラーが出たときも

◆ImageMagickのインストール
　https://qiita.com/mtakizawa/items/d903c9f8e94c6dff123f
　　※インストーラー解説やインストール時の注意事項が書かれている。
　　　「問題が発生した場合、vcomp100.dllが必要かもしれません。」っていやな予感しかしない。。。

◆pdf を convert コマンドで分割し画像化すると劣化する
　https://takuya-1st.hatenablog.jp/entry/2014/09/17/043550
　　※基本的には、ここで解説されている下記コマンドで導入予定。処理時間等でチューニングするとは思うが

```sh:convertPDF.bat
convert -density 400 -colorspace RGB /Users/takuya/Desktop/image.pdf dest*.png
```

◆PDFを大量に結合する – ImageMagick(convert)編
　https://blog.katsubemakito.net/macos/join_many_pdf_width_imagemagick
　　※一通り解説してくれている

◆ImageMagick の JPEG オプション
　https://qiita.com/yoya/items/216d2fc98deb88fa7157
◆ImageMagick の PNG オプション
　https://qiita.com/yoya/items/6e3117b317b3b435fa48
◆ImageMagick で画像比較 (Compare)
　https://qiita.com/yoya/items/2021944690bd9c0dafb1
　　※ここにあるコマンドを参考に一通りのメトリックス試してみる!?
◆「さようなら ImageMagick」の考察
　https://qiita.com/yoya/items/2076c1f5137d4041e3aa
　　※セキュリティ(policy.xml)

◆ImageMagick を使ってファイルをjpgに一括変換 (PowerShell)
　https://qiita.com/kik4/items/3ea740abdaf83b1a1b37
　　※後でPowershellで作成するときに参考に...

◆ImageMagick - Command-line Tools: Convert
　http://www.imagemagick.org/script/convert.php
　　※本家のコマンドライン解説。多すぎるので必要な時に確認...

◆JPEGエンコーダの画質評価を行う
　https://wave.hatenablog.com/entry/2019/03/01/221500
◆２つの画像が似ているか、SSIMとPSNRを計算するには 
　https://www.ninton.co.jp/archives/3122

◆SSIMがウソをつく例
　https://qiita.com/miyanaga/items/16c8b89b3aa20356b6fe
◆画像のSSIM算出のための6+2ツールまとめ
　https://qiita.com/miyanaga/items/f3690c826008999296f9
　　※この方のサイトははまったら参考にすることになりそう

◆※画像処理の勉強になる
　https://qiita.com/yoya
【Day31】積み上げ日記

##予定
■スキプラさんnote①

##完了
■スキプラさんnote①

##学習時間
２h

##学習ポイント
■ヘッダーメニュー
✖︎左右100％（見づらい）
○左右60％、中央寄せ、外側にあるクラスに背景色つける

■li要素を横並びにするにはinlineに指定
liタグはブロック要素なので縦になる。
インライン要素にすると、横並びになる。
※flexbox使わなくてOK

■文字の下線をなくす
text-decoration: none;

■背景画像を指定する
✖︎ height
○ min-height

■背景画像の固定（スクロールしても動かない）
background-attachment: fixed

■position
親要素→relative 
子要素→absolute
※背景画像として使った場合：relative使わない。
　img画像として使った場合：親要素にrelative

##疑問点
○色を指定するときに、色の数値わからないので指定できないが？

○liタグは基本的にflexではなく、inlineにして横並びにする？


##計画通り進んだか？
進んだ。今回はより理解が進んでいないpositionやinlinnに関して、時間をかけて復習した。うまく自分の中に落とし込めたが、実際にアウトプットしないと定着しないので、次は見ないこと！
スピード感的には全然満足できる進捗ではないので、明日は②を確実に終わらせる！
Fullcalendarでイベント作成するも、なぜか月表示した時に、9時以降にならないとその日に表示されない問題

カレンダー界のパケットモンスター、きゃりーぱみゅぱみゅこと、FullCalendarには、イベント作成機能がある。
しかし、こいつはなぜか、9時を一日の終わりとみなしているらしく、２０日8時30分とかにイベント作成しても、１９日に表示されて困った。

これを解決する方法は、optionsにnextDayThreshold: '00:00:00'を明記することだったが、[公式ドキュメント](https://fullcalendar.io/docs/nextDayThreshold)には、defaultが'00:00:00'であると書いてある
ところで、ご存知の通り、日本時間９時は世界標準時で0時なのである。
だから当然タイムゾーン設定が悪いのだと思う人がいるだろうが、timezoneを東京にしても結果は同じなのである。
この問題、わかる人はコメントをください。

[参考サイト](https://kaede.jp/2014/08/30175019.html)
Google日本語入力のキーバインド設定(SKK,Anthyのいいとこ取り)

社内のVDI環境を触っていて、日本語入力周りが色々面倒だなぁと感じる[^1]今日このごろですが、
普段使っているGoogle日本語入力のキーバインド設定について記しておきます。
[^1]: 管理者権限を使うことができないため、JIS配列しか使えなかったりMS-IME以外のインストールも不可能だったり。

# やりたいこと
SKKとAnthyの個人的に好きな部分をパクりつつ、

- 入力モード切り替え
- 変換中の文節の調節
- 英数字,カタカナ,ひらがなへの変換

を手軽にできるようにします。

# 設定方法
下記のように設定します。

|モード|入力キー|コマンド|
|---|---|---|
|直接入力|Ctrl + j|IMEを有効化|
|入力文字なし|l|IMEを無効化|
|変換中|Ctrl + o|文節を伸ばす|
|変換中|Ctrl + i|文節を縮める|
|変換中|Ctrl + b|文節を左に移動|
|変換中|Ctrl + f|文節を右に移動|
|変換中|Ctrl + a|文節を左端に移動|
|変換中|Ctrl + e|文節を右端に移動|
|変換前入力中|Ctrl + k|全角カタカナに変換|
|変換前入力中|Ctrl + l|半角カタカナに変換|
|変換前入力中|Ctrl + u|ひらがなに変換|
|変換前入力中|Ctrl + r|全角英数に変換|
|変換中|Ctrl + k|全角カタカナに変換|
|変換中|Ctrl + l|半角カタカナに変換|
|変換中|Ctrl + u|ひらがなに変換|
|変換中|Ctrl + r|全角英数に変換|

Ctrl+o / Ctrl+iで文節位置を変更するのはAnthyから取っています。
Ctrl+j / lで日本語入力のon/offを切り替えるのはSKKで一番好きなキーバインドです。
個人的に、半角/全角キーを押すよりもかなり快適です。

## Ctrlを使わないキーバインドの設定について
ちなみに、Google日本語入力の設定画面からは「l」だけのキーバインドが設定できませんが、
キー設定画面の「編集」→「エクスポート」を選ぶと出力されるkeymap.txtを直接編集すれば設定可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602746/66c30fd5-35e9-8119-6d9c-4edf899c3ed8.png)

keymap.txt内に下記の行を追加してから「インポート」で取り込んでください。
```
Precomposition	l	IMEOff
```

すると、Ctrlを押さないキーバインドが設定できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602746/ce6df8b3-e74c-d0fe-80c7-64c7565dace6.png)


# 本設定によるkeymap.txt
初期設定のコマンドが割と放置されていてあまり綺麗ではないですが、
keymap.txtを貼っておきます。これを保存して取り込んで貰ってもOKです。
https://github.com/dj-kata/open_misc/blob/master/lib/keymap.txt

# おわりに
Google日本語入力は固有名詞に強かったり電卓として使えたりするのもいいですが、
キーバインドを自由に弄れるのも個人的にかなり好きです。
オススメの設定があったら教えてください。
初心者から始めるJava、オーバーライド

#はじめに
この記事は備忘録である。
参考書レベルの内容だが、本記事に掲載するコードについては、
~~**間違えた**ものが中心となる。これは実際にコーディング中に間違えた部分を掲載し、自分で反省するために投稿するという目的によるもの~~。
また、後日にJavaSilver試験問題の勉強を兼ねて復習するため、深い部分の話はここでは触れない。

##環境
言語：Java11、JDK13.0.2
動作環境：Windows10

#オーバーライド
前回でスーパークラスとサブクラスの関係は扱った。

サブクラスにはスーパークラスのメソッドが継承されているが、同じメソッド名を使いながら別の処理を定義したいということがある。
例えば`show〇〇()`でメンバをチェックするためのメソッドを用意する場合。同じチェックするにしても`watch〇〇(),see〇〇(),check〇〇()`と使い分けを作ることはできるだろう。だが、引数や型がそれぞれ違うとなれば覚えて使うのが非常に困難になるし、それだけコードが無駄に長くなれば可読性も落ちる。
サブクラスには、**スーパークラスで実装されたものと全く同じメソッドを新たに定義することができ、オブジェクトから呼び出す場合サブクラスの方が優先される。**

条件としては、
1.シグニチャ（メソッド名、引数リストの型、数、順番）が同じ
2.アクセス修飾子が同じかより緩い
3.戻り値の型が原則同じ（共変戻り値を除く）

サブクラスのメソッドが、スーパークラスのメンバに代わって機能することを**オーバーライド(overriding)**と呼ぶ。

##スーパークラスでまとめて扱う
何度も書くが、サブクラスにはスーパークラスのメンバが継承されている。そしてオーバーライドでサブクラス専用の処理を書いて優先的に機能させることが出来る。
よって、同じスーパークラスの子であるサブクラスを使う際、スーパークラスのメソッドで一括して処理を記述することが出来る。

```Java:arrayCatsShow.java
class WildCat
{
  protected int number;
  protected double weight;

  public WildCat()
  {
    number = 1;
    weight = 1.0;
  }
  public void getCat(int n,double w)
  {
    number = n;
    weight = w;
    System.out.println(number +"番目の猫の体重は" + weight + "kgです。");
  }

  public void show()
  {
    System.out.println("この猫は" + number + "番目の猫です。");
    System.out.println("この猫の体重は" + weight + "kgです。");
  }
}
```
この`WildCat`クラスをもとに、`HouseCat`と`MyCat`のクラスを用意する。

```Java:arrayCatsShow.java
class HouseCat extends WildCat
{

  public void show()
  {
    System.out.println("このイエネコは" + number + "番目です。" );
  } 
}

class MyCat extends WildCat
{
  public void show()
  {
    System.out.println("このうちの猫は" + number + "匹目で、今の体重は" + weight + "でした。" );
  }
}
```

そのうえで、個別の猫を用意する。

```Java:arrayCatsShow.java
class arrayCatsShow
{
  public static void main(String[] args)
  {
    WildCat[] cats = new WildCat[4];
 
    cats[0] = new WildCat();
    cats[0].getCat(1, 5.2);

    cats[1] = new HouseCat();
    cats[1].getCat(2, 4.2);

    cats[2] = new MyCat();
    cats[2].getCat(3, 5.6);

    cats[3] = new MyCat();
    cats[3].getCat(4, 8.4);

    for(int i=0; i< cats.length; i++){
      cats[i].show();
    }
  }
}
```
スーパークラスの配列を用意してから個別に`new`したので、それぞれの`show()`定義に基づいた文章が現れる。

##付け足しだけしたいとき
スーパークラスの処理＋サブクラスの処理　にしたい場合。

```Java:HouseCatShow.java
class HouseCat extends WildCat
{
  public void show()
  {
    super.show();
    System.out.println("このイエネコは" + number + "番目です。" );
  }
}
```
`super.メソッド名`でスーパークラスの処理をそのまま持ってこれるので、あらためてすべて書く必要はない。これはフィールドにも言えることなので、`super.フィールド`でスーパークラスの値を持ってくることもできる。

ところで、スーパークラスのメソッドをオーバーライドされたくないときは、`public final void show()`のように**`final`をつければオーバーライドできなくなる**。
これはクラス名とフィールドでもできるので、`finalクラス`なら**サブクラスの拡張不可**になり、`finalフィールド`なら**フィールドの値が宣言時の初期化を除いて変更されない`定数(constant)`**になる。

#おわりに
**共変戻り値**という言葉をSilver問題集から見つけたが、近いうちにクラスライブラリを調べるつもりなので、そこでクラス間の関係をはっきりさせてから扱いたい。
#参考
出来るだけ自分で変数や式を書いてコンパイルしているので、完全に引用する場合はその旨記述する。

[やさしいJava 第7版](http://mana.on.coocan.jp/yasaj.html)
[Java SE11 Silver 問題集](https://book.impress.co.jp/books/1118101186)（通称黒本）
Rspecでネスト有りのルーティングパスにvisitコマンドでアクセスする  for Ruby on Rails

# ネスト有りのルーティングでテストしようとした
specファイルを書いていたとき、ネスト有りのルーティングのテストでvisitコマンドのパスはどう書くんだと？疑問に思いました。
viewファイルと同じ感じでいけるのか？いう疑問で、試してみるといけました。



# routes.rbの設定
`routes.rb` ではこのような設定があるとします。

```ruby:routes.rb
  resources :categories do
    resources :products
  end
```

`rails routes` とすると、こんな感じになります。

```console:結果ログ
    category_products GET    /categories/:category_id/products(.:format)          products#index
                      POST   /categories/:category_id/products(.:format)          products#create
 new_category_product GET    /categories/:category_id/products/new(.:format)      products#new
edit_category_product GET    /categories/:category_id/products/:id/edit(.:format) products#edit
     category_product GET    /categories/:category_id/products/:id(.:format)      products#show
                      PATCH  /categories/:category_id/products/:id(.:format)      products#update
                      PUT    /categories/:category_id/products/:id(.:format)      products#update
                      DELETE /categories/:category_id/products/:id(.:format)      products#destroy
```

# visitの失敗例
一番上のpathにアクセスしようとして、やりがちなことですが、そのままパスを書くとエラーになる。

```ruby:実行例

let!(:category) { FactoryBot.create(:category)
visit category_products_path
```


```console:結果ログ
     ActionController::UrlGenerationError:
       No route matches {:action=>"index", :controller=>"products"}, missing required keys: [:category_id]
```

# visitの成功例
viewファイルと同じ感じで、ルーティングパスに変数を渡すと成功します。
`root_path`から、ちまちまと`click_link`で移動するのも良いのですが、こういう手もありかなと思います。

```ruby:実行例

let!(:category) { FactoryBot.create(:category)
visit category_products_path(category)
```


```console:結果ログ
Finished in 1.05 seconds (files took 2.33 seconds to load)
1 example, 0 failures
```
【ruby】Docker開発環境へのGoogle Cloud Translation API (v2)導入手順

# 開発環境
ruby '2.6.3'
rails '6.0.2'

# Google Cloud Translation APIとは

* ウェブサイトやアプリを 100 以上の言語に瞬時に翻訳したい場合などに役立つのが Translation API です。
* 
# Translation API の料金

* [Translation API の料金](https://cloud.google.com/translate/pricing?hl=ja)
* [Google Cloud の無料枠](https://cloud.google.com/free/docs/gcp-free-tier?hl=ja)
私の場合は`12 か月間の無料トライアル（Google Cloud サービスで使用できる $300 相当のクレジット付き）。`なので無料です。

# 導入手順

* [GCP公式サイト](https://cloud.google.com/)
* [導入参考サイト](https://www.apps-gcp.com/gcp-startup/)
最初にプロジェクトが作成されます、そこのIDはあとから使います。

# Cloud Translate API の有効化

* [APIとサービスを有効化を押す](https://console.cloud.google.com/apis/dashboard?hl=ja)
`Cloud Translate API`を検索→有効化

# サービスアカウントキーの作成

```
サービスカウント: 「新しいサービスアカウント」を選択
サービスアカウント名: (任意)
役割: オーナー (Project > オーナー)
サービスアカウントID: (任意)
キーのタイプ: JSON
```

`「作成」ボタンを押下すると、jsonファイルがダウンロードされます`

# サービスアカウントキーの適用,環境変数の設定

* GOOGLE_APPLICATION_CREDENTIALSという名前の環境変数を作成し、先ほどダウンロードしたjsonファイルのパスを設定します。

```:ターミナル
vim .zshrc
```

```:.zshrc
export GOOGLE_APPLICATION_CREDENTIALS="ダウンロードしたファイルパス"
```

* .zshrcの更新。

```:ターミナル
source ~/.zshrc
```

これでいつでもローカル環境では参照できるようになります。

## 保存されているか確認

```:ターミナル
printenv | grep GOOGLE
=> export GOOGLE_APPLICATION_CREDENTIALS="ダウンロードしたファイルパス"
```

# docker上でGOOGLE_APPLICATION_CREDENTIALSを適応

1. 開発中のディレクトリにjsonファイルをコピーする。（ファイル名は変更しても問題ありません、今回はkey.jsonという名前で行います。）
2. .gitignoreに追記する

```:.gitignore
/key.json
```

* DockerfileでDocker内にコピーする

```:Dockerfile
COPY key.json key.json
ENV GOOGLE_APPLICATION_CREDENTIALS key.json
```
そして`docker-compose build`

# rails編

1. gem導入

```
gem 'google-cloud-translate'
```

2. 私の場合は外部DBから取ってきた英文を日本語にして保存する感じなので下記を変えればいい感じですが。実際にviewから翻訳したい場合はリンクを参照してください。

* [Quick Start: Google Translation API in Rails](https://dev.to/nodefiend/quick-start-google-translation-api-in-rails-4j81)
* [Cloud Translation APIをRailsで使用する](https://note.com/hikkymouse_pro/n/n55736c4662ca)

* [参考文](https://cloud.google.com/translate/docs/basic/translating-text)

```ruby:seeds.rb
# 最初に作ったプロジェクトのIDです。そのまま書くのはあまりよろしくないです。
project_id    = "Your Google Cloud project ID"
# 実際に訳す文です
text          = "The text you would like to translate"
# 何に訳すかを指定します `"The ISO 639-1 code of language to translate to, eg. 'en'"`
language_code = "en"

require "google/cloud/translate"

translate   = Google::Cloud::Translate.new version: :v2, project_id: project_id
translation = translate.translate text, to: language_code

puts "Translated '#{text}' to '#{translation.text.inspect}'"
puts "Original language: #{translation.from} translated to: #{translation.to}"
```

```ruby:私の場合
require "google/cloud/translate"

def translate(synopsis:)
  project_id    = Rails.application.credentials.api[:id]
  text          = synopsis
  language_code = 'ja'

  translate   = Google::Cloud::Translate.new version: :v2, project_id: project_id
  translation = translate.translate text, to: language_code

  return translation.text.inspect
end
```

* [List of ISO 639-1 codes](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)

# 最後に
 `今回は（v2）のGoogle Translation APIということをお忘れなく。`
 おしまい
【AWS】DynamoDBとRDSの違いについて

# AWSのデータベースサービスについて
AWSが提供するデータベースは下記の5つ

- [Amazon RDS](https://aws.amazon.com/jp/rds/)
- [Amazon DynamoDB](https://aws.amazon.com/jp/dynamodb/)
- [Amazon Neptune](https://aws.amazon.com/jp/neptune/)
- [Amazon Redshift](https://aws.amazon.com/jp/redshift/)
- [Amazon ElastiCache](https://aws.amazon.com/jp/elasticache/)

# DynamoDBとRDSの違いについて
データベースサービスの中で「DynamoDB」と「RDS」の違いがよく理解できなかったため色々な記事や資料をあさりました。
RDSの各種操作にはSQLを使用し、業務ではOracleやPostgresを用いておりかつRDSは用いていたためすぐに理解できました。ただし、DynamoDBについてはSQLを使わないデータベースアーキテクチャ（NoSQL）となります。RDBと比較したときのNoSQLの特徴としては「柔軟でスキーマレスなデータモデル」「水平スケーラビリティ」「分散アーキテクチャ」「高速な処理」が挙げられ、RDSが抱えるパフォーマンスとデータモデルの問題に対処することを目的に作られたアーキテクチャとなっています。

# 参考URL
タイトルにある通り、具体的にDynamoDBとRDSの違いについてわかりやすく説明されている記事を下記に記載します。

- [何が違う？DynamoDBとRDS](http://blog.serverworks.co.jp/tech/2017/04/12/what_is_different_dynamodb_and_rds/)

- [RDSではなくてやっぱりDynamoDBで管理したくなる](http://grgsiberia-mitou.hatenadiary.jp/entry/2014/02/03/170940)

- [AWS｜AWSのDynamoDBについてまとめました【解説】](https://dev83.com/aws-dynamodb/)

# 最後に
[何が違う？DynamoDBとRDS](http://blog.serverworks.co.jp/tech/2017/04/12/what_is_different_dynamodb_and_rds/)
に記載があるように、DynamoDBとRDSの気を付けポイントや使いどころがそれぞれあり、メリットデメリットがそれぞれ存在します。

- DynamoDBの使いどころ

> 読み込み/書き込みの多いシステム
> テーブル結合が不要なシステム

- RDSの使いどころ

> 更新が頻繁なシステム
> テーブル結合が必要となるテーブル設計のシステム

特徴に合った使い方をして、その効果を存分に得られるように使い分けできるようにしていく必要があるようです。
Next.js 9.3で追加されたgetStaticPropsでSSRからSSGにする

## はじめに
先日、[Next.js9.3](https://nextjs.org/blog/next-9-3)がリリースされました。

待望のSSGサポートがされ、コミュニティがだいぶ賑わっていましたね。
(個人的にはSassのサポートがかなり嬉しいです)

SSGを使いたいときに、[Gatsby](https://www.gatsbyjs.org/)ではなくNext.jsが選択されることも増えてくるのではないでしょうか?
私は、プライベートでGatsbyも触っていたのですが、業務ではNext.jsを使っており、GraphQLの学習コストも相まってNext.jsを選択する機会が増えていきそうなので嬉しいです。

今回は、SSRで使っていたブログを、今回追加された、`getStaticProps`というSSG用のAPIを使ってSSGにしたので、簡単にですがビフォーアフターを載せておきます。

## 実装
### ビフォー(SSR)
```javascript
Home.getInitialProps = async () => {
  const key = {
    headers: { 'X-API-KEY': process.env.api_key }
  }
  const res = await axios.get('https://self-site.microcms.io/api/v1/skills', key)
  const skills = await res.data

  return { skills }
}
```
```
Page                                                           Size     First Load
┌ λ /                                                          17 kB       75.4 kB
└   /_app                                                      289 B       57.2 kB

λ  (Server)  server-side renders at runtime (uses getInitialProps or getServerSideProps)
○  (Static)  automatically rendered as static HTML (uses no initial props)
●  (SSG)     automatically generated as static HTML + JSON (uses getStaticProps)
```

### アフター(SSG)
```javascript
export const getStaticProps: GetStaticProps = async () => {
  const key = {
    headers: { 'X-API-KEY': process.env.api_key }
  }
  const res = await axios.get('https://self-site.microcms.io/api/v1/skills', key)
  const skills = await res.data

  return { props: { skills } }
}
```
```
Page                                                           Size     First Load
┌ ● /                                                          11.8 kB     69.8 kB
└   /_app                                                      287 B       56.8 kB

λ  (Server)  server-side renders at runtime (uses getInitialProps or getServerSideProps)
○  (Static)  automatically rendered as static HTML (uses no initial props)
●  (SSG)     automatically generated as static HTML + JSON (uses getStaticProps)
```

ビフォー(SSR)では元々あった、`getInitialProps`を使用しています。
今は、`getStaticProps`と`getServerSideProps`に別れ、これらを使うことが推奨されています。
少しの変更で切り替えれるので、簡単にできました。

## 参考
[公式 getInitialProps](https://nextjs.org/docs/api-reference/data-fetching/getInitialProps)
[公式 Data fetching](https://nextjs.org/docs/basic-features/data-fetching)
学習記録（６日目）#セット型#ディクショナリ型#リスト・タプル・セットの相互変換#ndarray型#Pandas(DataFrame型)

# 学習内容
* セット型
* デイクショナリ型
* リスト・タプル・セットの相互変換
* ndarray型
* Pandas(DataFrame型)

## セット型
リストやタプルと同様に複数のデータを格納することができるデータ型。以下の特徴がある。

* 同じ値をもつデータを重複して保存することはできない
* 格納されている複数のデータには順序づけがされない
* `{}`によって定義する。

##### 記述例
~~~python
a = {1,0,2,9,8,3,7,5,4,6}
print('a = ',a)

b = {2,4,4,6,5,2,1,0,8,7,9,3,6}
print('b = ', b)
~~~
実行結果
>a = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
>b = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

実行結果のようにどのような順序でデータを指定してもソートされて出力される。

## ディクショナリ型
リストやタプル、セットと同様に複数のデータを格納することができるデータ型。以下の特徴がある。

* 複数のデータにそれぞれ異なるラベルをつけてデータを入れる。
* `{ラベル１:データ１, ラベル２:データ２, ラベル３：データ３}`のように定義する。
* `keys()`によってラベルの一覧を、`items()`によって値の一覧を得られる。

リストやタプルでは複数のデータをインデックスで指定していたが、ディクショナリではラベルによって指定する。

##### 記述例
~~~python
c = {'l1':12, 'l2':45, 'l3':36, 'l4':58}

print('c = ', c)
print("c['l2'] = ", c['l2'])
print("c['l4'] = ", c['l4'])
print(c.keys())
print(c.values())
~~~
実行結果
>c =  {'l1': 12, 'l2': 45, 'l3': 36, 'l4': 58}
>c['l2'] =  45
>c['l4'] =  58
>dict_keys(['l1', 'l2', 'l3', 'l4'])
>dict_values([12, 45, 36, 58])

## リスト、タプル、セットの相互変換
リスト、タプル、セットはそれぞれメソッド`list()`、`tuple()`、`set()`を用いて相互変換可能である。

##### 記述例
~~~python
# 相互変換を利用してリストから重複データを削除するプログラム
d = [0,2,6,4,2,8,0,2]

e = list(set(d))
print('e = ', e)
~~~
実行結果
>e =  [0, 2, 4, 6, 8]

## ndarray型
代表的な数値計算パッケージの`Numpy`で使用する基本データ型。

##### 記述例
~~~python
# ndarray型の作成
import numpy

f = [0, 1, 2, 3]
g = numpy.array(f)   # リストからndarray型を作成
print('g = ', g)

h = [1, 2]
i = [2, 3]
j = [3, 4]
k = numpy.array([h, i, j])   # 二次元のndarray型を作成
print('k = ', k)

l = numpy.array(a, dtype = numpy.float16)   # データ型を指定してndarrayを作成
print('l = ', l)
~~~
実行結果
>g =  [0 1 2 3]
>k =  [[1 2]
> [2 3]
> [3 4]]
>l =  [0. 1. 2. 3.]

また、ndarray型のデータやリストに対して、Numpyに用意されている関数を使うと様々な数値演算ができる。代表的な物を以下に紹介する。

~~~python
import numpy

m = numpy.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

n = numpy.median(m)   # 中央値
o = numpy.mean(m)   # 平均値
p = numpy.std(m)   # 標準偏差
q = numpy.var(m)   # 分散

print(n)
print(o)
print(p)
print(q)
~~~
実行結果
>4.5
>4.5
>2.8722813232690143
>8.25

## Pandas
### 基本データ型
* `DataFrame`型（表データを表す）
* `Seriez`型（行または列のデータを表す）

#### DataFrame型
以下のように作成する。
##### 記述例
~~~python
import pandas

r = pandas.DataFrame([1, 11.1], [2, 22.2], [3, 33.3])
~~~
`colums`、`index`でそれぞれ列、行の添字を指定できる。
##### 記述例
~~~python
r.colums = ['C1', 'C2']
r.index = ['A', 'B', 'C']
~~~
インデックス型と同じように、添字を指定して列のデータを取得できる。

##### 記述例
~~~python
s = r['C1']   # 一列目のデータだけを取り出す
t = s['A']   # 一列目、一行目のデータを取り出す
~~~
XcodeGenのちょっとしたTips

XcodeGenの地味なTipsについてまとめました。

## XcodeGenのBuild Configurationsの階層について
XcodeGenのビルド設定は以下の階層になっています。これを最初に知っておくとスムーズです。
[公式ドキュメント](https://github.com/yonaskolb/XcodeGen/blob/master/Docs/ProjectSpec.md)の目次の構成がproject.ymlの構成のそれなので、そのまま参考にすると良いかと思います。


```
# Project全体の設定
settings:
  # Projectの全Build Configurationsに反映される設定
  base:
  # Projectの各Build Configurationごとの設定
  configs:
    Debug:
<中略>
# Targetごとの設定
targets:
 {Target名}:
    # Targetの全Build Configurationsに反映される設定
    base:
    # Targetの各Build Configurationごとの設定
    configs:
      Debug:
```

## cacheを利用する
`xcodegen --use-cache`でXcodeGenのキャッシュが効くようになります。

キャッシュファイルは `--cache-path` のオプションで指定しない限り、`~/.xcodegen/cache/{xcodeprojファイルのpathのMD5ハッシュ値}`に保存されます。

* ファイル構成(追加・削除)
* project.yml

に変更がない場合、キャッシュが効きます。
実際は、一時的に生成したcacheファイルと実在するキャッシュを比較して差分がなければ何もしない処理になってます。

キャッシュの判定処理は[ここ](https://github.com/yonaskolb/XcodeGen/blob/master/Sources/XcodeGenCLI/Commands/GenerateCommand.swift#L65-L69)

## project生成後に何かしらのコマンドを実行する
`postGenCommand`のオプションで指定ができます。(例えば`pod install`など)
これと上記のキャッシュを利用すると、ローカルのproject構成に変更がない場合、xcodegenコマンドも実行されないし、合わせてpod installも実行されないので省エネです。
例えばgit checkoutを頻繁に繰り返す時など地味にこの設定が効くと思います。

※公式でもオススメされてます (https://github.com/yonaskolb/XcodeGen/blob/master/Docs/FAQ.md#can-i-use-cocoapods)

```yaml
options:
  postGenCommand: pod install
```

## 一部の値だけBuildConfig間で共有する
単純にprojectファイルを編集する場合だと複数のターゲットでコピペが発生してしまうところを、`Setting Groups`や`Target Template`など使って、共通化できる点もXcodeGenの魅力かと思います。

それ以外にもyamlの記法を使って一部のパラメータだけ共有するようなこともできます。
例えばyamlのアンカー記法を使うと変数を参照するような書き方もできます。

```yaml
ATarget:
  CURRENT_PROJECT_VERSION: &a_build_number 1
  <中略>
BTarget:
   CURRENT_PROJECT_VERSION: *a_build_number
```

他にも何かあれば追記します。
メモリ不足でLaravelインストール、composer update失敗

#なにがおきたか
Laravelを5.8から6にしようと
`composer update`したら

下記のようなエラーがたくさん出た

```

mmap() failed: [12] Cannot allocate memory

mmap() failed: [12] Cannot allocate memory
PHP Fatal error:  Out of memory (allocated 448884736) (tried to allocate 20480 bytes) in phar:///usr/local/bin/composer/src/Composer/Json/JsonFile.php on line 275

Fatal error: Out of memory (allocated 448884736) (tried to allocate 20480 bytes) in phar:///usr/local/bin/composer/src/Composer/Json/JsonFile.php on line 275

mmap() failed: [12] Cannot allocate memory
PHP Fatal error:  Out of memory (allocated 448884736) (tried to allocate 20480 bytes) in phar:///usr/local/bin/composer/src/Composer/Console/Application.php on line 82

```

思い出せばLaravelを入れたときもメモリが足りないとかなったなと思い備忘録

#対処法

swapの設定をすればいいらしい

そもそもswap何やねんレベルだったので勉強になった
>Swap とは、簡単に言うと物理メモリを使い切った場合に、物理メモリの代わりに使われる領域のことで、パーティション、またはファイルを使って作成できますが、推奨されるのは、パーティションです。

https://wa3.i-3-i.info/word1718.html

https://server.etutsplus.com/allocate-swap-space/

##設定する

確認

```
free -m
```

>freeコマンドは空きメモリと使用しているメモリの容量を表示するコマンドです。

結果こんな感じで、swapは0

```
              total        used        free      shared  buff/cache   available
Mem:            983         474         416           0          92         392
Swap:             0           0           0
```

```
sudo dd if=/dev/zero of=/swapfile bs=1M count=2048
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
```
ddコマンドで指定サイズの空のファイルを作成
mkswapで、作成したファイルをスワップ領域として使用できるようにする
swaponでスワップ領域を有効化

>dd」コマンドはファイルをブロック単位で読み出し、指定通り変換して出力します ※1。入力と出力にデバイスを指定できるため、HDDのパーティションをコピーする、USBメモリやCD-ROMのバックアップを取る、といった使い方が可能です。
処理するブロック数を指定でき、任意のサイズのファイルを作成するといった用途にも役立ちます。

勉強になった....
Spotlightからネットワーク設定を呼ぼう

超小ネタかつ既出感もありますが、結構便利なので一応記事にしてみます。

macのwifiを切り替える時、メニューバーにwifiアイコンを表示しておけば一覧から接続先を切り替えられますよね。でも、カーソルを移動するのが億劫です。macにはSpotlightというなんでも屋がいるので、こいつから直接ネットワーク設定パネルを開けるようにしたいのです。~~以下用語など、表現はいろいろあると思いますが、細かいことはなしでお願いします。~~

# Automatorを使って、「ネットワーク設定」をアプリケーション化する
Spotlightは検索結果として`/Application`下のアプリケーションが優先的に出がちです(体感)。それを利用してAutomatorで設定パネル呼び出しをアプリケーション化してしまい、一発で呼べるようにしようと考えました。

1. Automatorを起動
2. ⌘+N で新規書類を作製、種類は「アプリケーション」とします![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168044/f698734a-8f18-56f3-610b-3bcd2e2f4b33.png)
3. 左のメニューから「ライブラリ>ユーティリティ」を開き、「シェルスクリプトを実行」を右側にドラッグアンドドロップします ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168044/62ff342b-9ad2-1ec8-4852-a5253a1c224d.png)
4. 四角の中に `open /System/Library/PreferencePanes/Network.prefPane` をコピペし、「シェル」のプルダウンメニューを`/bin/bash`にします![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168044/98aa86f6-9e81-c582-0f33-b65d63a17298.png)
5. 最後に呼び出したい名前(自分の場合はwifi) をつけて `/Application`に保存します![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168044/dceec637-7192-0b85-d982-ada98fd8afee.png)

ここまですればSpotlightに設定した名前を打ったとき、作製したアプリケーションがトップヒットするようになるのでサクッと設定パネルが開けます。

# おまけ
今回使った`/System/Library/PreferencePanes/`には「システム環境設定」の各設定項目があります。なので`Network.prefPanes`を任意の設定項目に変えるだけで別の項目のショートカットも作れます。また、それぞれの`.prefPanes`を`open`コマンドで開けばいいのでお使いのシェルにアイリアスを貼ればターミナルからでも呼び出せます。「設定の操作までcuiでやれば?」と思うかもしれませんがちょっとめんどくさいのでパスしてます。

Appleの`.prefPanes`とか`.mobileconfig`とか変な拡張子ちょっとすきです。