OmniAICreator/Qiita-1.07M huggingface dataset:
審査にとって大切な3つのこと

#自己紹介
<strong>（めろん、以下め）</strong>
こんにちは！アプリ審査チームのめろんです、好きなおでんの具はたまごです。

<strong>（すいか、以下す）</strong>
アプリ審査チームのすいかです。好きなおでんの具はごぼう入りの練り物です！

<strong>（め）</strong>今日はアドベントカレンダーの14日目ということで、「審査にとって大切な３つのこと」ということですが、10日目の[「審査ってなあに？」](https://qiita.com/sanshi/private/c7b16779e77c858afe7d)の記事をうけての記事になりますね。

<strong>（す）</strong>審査に携わる年月も思えば長くなってきましたね～。今回このテーマを選んだ理由なのですが、２点ありまして。
1点目は改めて審査に携わる立場として、何を大切にしてきたか/大切にしないといけないかを振り返るということ。そして2点目は審査という組織はアプリ開発に携わる方からすると謎めいているのではないかと思い。審査のポリシーをお伝えしたいなと思ってます。

<strong>（め）</strong>審査という品質を守るチームに外からかかわる皆様に、こういうことを大切にしながら日々業務を遂行していますよ～というのを知っていただくという目的もありますよね。
今回は特に大切な3点に絞ってすすめていきます～。

#１．軸をぶらさないこと
<strong>（す）</strong>「軸をぶらさない」。かっこいいですね。とはいえどういった業務に携わったとしてもぶれない心は必要かと思うのですが審査における「ぶれない」とは具体的にどういうことですかね。

<strong>（め）</strong>そうですね、面白いゲームをお客さまに届けたい！でも、審査として忘れてはいけないのが「リスクヘッジに必要な判断を下すこと」です。いくら面白い企画であっても、法や基準に照らし合わせた結果、リスクが高いと判断したものに対しては、「NO」と言えることが大事です。結構、勇気が要りますね。。

<strong>（す）</strong>これが難しいんですよね。。。もちろんできる限り企画側の意図を汲み取り、どうすれば実施が可能か？、について寄り添うことも大事ではありますが、私たち審査の目的ってなんだっけ？というところを念頭にジャッジを下さないといけないですね。

<strong>（め）</strong>一生懸命考えたであろう企画に「NO」を言うのってはっきり言って嫌な役回りですが。。。まず「NO」を伝えないことには次の議論もはじまらないので、企画側の「期待に添えない」などの感情に流されず、審査という立場から、まずそれが言えることが大事だなと思ってます。

<strong>（す）</strong>確かに、「NO」を伝えることでそこから落としどころが見えてくる、というのはありますよね。それで関係が崩れるとかはなく、はっきりしないのが一番困るというか。

<strong>（め）</strong>そうです。タイム・イズ・マネーですよ★

#２．決まり事を疑うこと

<strong>（め）</strong>なんだか物騒なものがでてきましたね～。

<strong>（す）</strong>これはですね、私たちは普段、法令だったり定まっているガイドラインを基準に判断していくのですが、そこに書かれている字面だけだと読み取れない何かを感じ取れるか？という意味です！

<strong>（め）</strong>え？すごいむずい、スピリチュアル的な何か？・・・冗談だよ。そういうセンスって本当に大事だよね。原則に対して忠実であることは大切だけど、さらにそこから「行間を読むこと」「裏を読むこと」が大切ということですかね。

<strong>（す）</strong>ですね。ここの解釈はこうあってそのまま考えると実施不可っていう判断になるんだけど、この視点を加えると実施はできそうだな、とか、反対に実施可能に見えるけど実はだめなんじゃ？みたいな。。。言い方をかえると「多角的な目線」、でしょうかね。

<strong>（め）</strong>ただ、「なんとなく」じゃだめというのもポイントですよね。行間を読んだとして「なぜ」よいのか/だめなのか、相手に納得いただける材料をそこからさらに集められるかどうか。

<strong>（す）</strong>ですね、ですね、なんとなくダメだと思うんです～いいと思うんです～じゃ、納得感ありませんし、ものごとは動き出しませんよね。

<strong>（め）</strong>私だったら張り倒したいですね！
ものごとを額面通りに受け取るだけでは、本当の意味での正しい判断ができない、ということ、でもそこからなぜ？を突き詰めて言語化して相手に伝えきる、が大切ですね。

#３．意図をよみとること

<strong>（め）</strong>これはですね、企画書読むのにも法令を解釈するにも必要だと思います。

<strong>（す）</strong>なぜアプリの開発側でこういった仕様変更をするのだろう？とかなぜ、これはNGなんだろう？とかそういうことをまずは想像でもなんでも感じ取れるか？ってことですかね。

<strong>（め）</strong>そうですね。たとえば、判断結果を伝えるにしても意図がわかっていれば伝え方も変わってくるかなということで。

<strong>（す）</strong>NGを伝えるにしても企画意図が分かっていれば、「こうすればどう？」みたいな提案ができるってことですね。法令解釈についてはどうでしょうか？

<strong>（め）</strong>法令解釈はですね、条文作った人の意図を知るｗ

<strong>（す）</strong>難しいですねそれは。。。。

<strong>（め）</strong>だよね？なので、法令の解釈は、法の成り立ちや背景などについて概要だけでも触れていれば、理解が深まるかと思います。

#さいごに

<strong>（め）</strong>ここまでご覧くださったみなさまありがとうございました！
記事を読まれるのは審査以外の方が多いと思うのですが。他にもQAだったり品質を守る部門はありますが、その品質を守る一つの組織として審査チームは存在しています。その審査チームの面々がどういったポリシーで仕事をしているんだろう？を理解するにあたっての一助になれているといいなと思います。

<strong>（す）</strong>改めてこうして必要なことを「言語化する」って大切だなと思いました。これから審査チームにJoinするメンバーも今いるメンバーも「こういったことを意識して行動できているか？」と考える機会になればいいなと思います。

<strong>（め）</strong>今、他社さんで同じような機能を有するチームの皆さんと情報交換する機会があるのですが、この視点でも今後語り合っていきたいなと思いました！
[Salesforce]取引先リレーションデータ共有ルール

# 取引先リレーションとは
Salesforceで、取引先同士を関連付けることができる標準オブジェクト。

- **A社**の下請け業者に**B社**を設定した場合の例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573815/f5b8a398-3737-324c-450f-00a47949a1b1.png)

# 取引先リレーションデータ共有ルールとは
A社の持つレコードを**取引先リレーションで設定した他社に共有する**…といったことができる。

# 取引先リレーションデータ共有ルールの使い方
#### 設定手順
以下を参照
https://help.salesforce.com/s/articleView?id=networks_configure_account_relationship_data_sharing_rules.htm&type=5&language=ja

#### 設定項目の意味
取引先に紐づけられたケースは、その取引先の下請業者にも共有したい…という場合の設定例で説明します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573815/f3a39e13-d3f0-ce90-4173-2058ac0be0cb.png)

# 取引先リレーションデータ共有ルールを使えるのは誰？
[Partner または Customer Community Plus ユーザが利用可能。](https://help.salesforce.com/s/articleView?id=sf.networks_account_relationships_best_practices.htm&type=5)
[ ]BracketsはPhoenixとなった

**現在はPhoenix codeがアプリケーション化され、Ver2から一部のBracketsプラグインが対応となりました**

https://brackets.io/

2021年3月頃、Webシステム、Webプログラム周りの構築を行うプログラマーやデザイナーの間で衝撃的なニュースがありました。それは

**Adobe社が2021年9月を以て、Bracketsの開発を凍結し、サポートを終了**

そして、公式サイトからもVisual Studio Codeへの移行を推奨していました。ですが、これにはある条件が付されていました。それは「Githubにソースを公開しておくから、引き続き開発を続けたいなら自由にやってね」というアナウンスがあり、それによって2021年7月頃、後継コミュニティは結成されました。そして、

2021年9月頃にこういうリリースがありました。

> **Brackets is being transitioned from Adobe to the Brackets Community. Brackets v1.14 has issues   with loading the extension library.
Please download and use Pre-release V2.0.0 till we roll out the latest release of Brackets in 
Novemver.**

だいたい訳すると、**開発はAdobeから有志コミュニティに移行されることが決まったし、11月にV2.0版をプレリリースするからダウンロードしてね**

こういう内容です。そして2021年12月に正規版2.0.1がリリースされ、JavaScript記述のパッケージとなりました。

その後は半年に1回、正規リリースをしてくれているみたいです。

## そして、起動…

は、早い！！…今まで少しもたついた起動が、**VSCodeと変わらないぐらいの起動速度**となっていました。また、それまで設定していたプラグインも全て引き継がれていました。

また、**使っていると次第に動作が重くなってくる点も大幅改善されていました**。上書き保存のたびに蓄積していたキャッシュが開放されるようで、長時間続けてサクサクと使えるようになっています。Gitとの連携もスムーズになっており、定期的にコミットすることで重くなる事態も回避できるようになりました。

自分がこのエディタを重宝している点ですが

- Git連携用プラグインBrackets Gitの恐るべき利便性
GUIの感覚でボタンを押すだけで簡単に同期が取れるGit連携ツールがあり（スター数50万以上で、他のツールよりぶっちぎりでトップでした）、正直あまりGitの知識がなくても、簡単に操作できます（有償化してしまったGit Kraken並に使いやすい）。

- ファイルを他のエディタで開いて編集したりしても、自動で同期を取ってくれる。
変換機能はお世辞にも優れているとは言えないので、置換は他のエディタで作業していますが、その場合、開きっぱなしにしているファイルに対しても自動で同期を取ってくれます。

- エンコードが優秀
日本語はEUC-JP、shiftJISにも自動エンコード対応しており、ほかだと文字化けしてしまうファイルも正しく表記できるので、世代の古いhtmlファイルを処理するのに重宝しています。

- 画像ファイルのプレビューが可能
画像ファイルをクリックするだだけで、エディタ画面にプレビュー表示され、PSDファイルにまで対応しています。さすが、もともとAdobeが作っていただけのことはあります。拡張プラグインを使えば編集もできます。

# そしてPhoenixへ
ブラウザ型コードエディタの[Phoenix code](https://phcode.dev/)もこのBracketsのレイアウトを用いているようでしたが、2023年にアプリケーション化され正式にBracketsの後継エディタとなりました。**Brackets-git、linterなどの評判が高かった高性能プラグインは標準機能化**されています。

おまけにBrackets2より更に起動が高速になっていました（体感Notepad＋＋と変わらないぐらい）。

現在は、**段階的にBrackets時代のプラグインを使用可能にカスタマイズしている**ようなので、今後も進化に期待できそうです。特にSftp-uploadを早くカスタマイズしてほしいですね。


## Atomも終了、そして名前を変えて復活
こんな記事を書いていたら、今度はGithubのAtomが2022年12月15日を以て終了してしまいました（同様にオープンソース化していますが、Bracketsより差別化が困難なエディタゆえに、後継コミュニティは現れるのでしょうか）。

**現れました。**　Pulsar Editと名前を変えていたみたいで、暗号化メールサーバ大手のtutanota（改め、現在はTUTA）がスポンサーにもなっているみたいです。

https://qiita.com/access3151fq/items/6fd35685510aa5f954e6

また、開発者のRUST使用の次世代エディタ、zedに期待したいところです（ベータ版を公開しているようですが、今はMAC版しかありませんし、拡張プラグインも使えません）。
【Prezto】slコマンドを実行しようとしてるのにlsが動いちゃうので直した

ジョークプログラムの[slコマンド](https://qiita.com/gm_kou/items/2840a6670dc2e733d00a)が使えなかったので調べてみたら__sl__が__ls__のエイリアスに設定されてた。どうやらPreztoの仕様みたい。設定ファイルがどこにあるのか調べてみた。

# エイリアスが記述されてるファイルのパス
見た限り２種類のファイルがあるっぽい。
### 1つ目（主なエイリアス）
`~/.zprezto/modules/utility/init.zsh`

この__init.sh__の中の#Aliasesの下にバーっと書かれてるやつが主なエイリアス。

__.zpresto__はもちろん隠しフォルダ。Finderでは'Shift'+'Command'+'.'で隠しファイル（フォルダ）の表示/非表示の切り替えができる。

### 2つ目（cdコマンド系？のエイリアス）
`~/.zprezto/modules/directory/init.sh`

__1__で１つ前のディレクトリに戻るみたいなエイリアスはこっちに記述されてるっぽい。

## 参考記事
[Preztoのおせっかい機能を除去する - Qiita](https://qiita.com/VienosNotes/items/d5447145ff17a69c9f07)
ServiceNow - フォームに添付されたExcelファイルを処理する

#目的
リクエストに添付されたExcelファイルの内容をServiceNowに一括登録する。
セキュリティを強化するためにServiceNowに直接データを登録する権限を与えずにデータ登録をインシデントから依頼させて記録を取れるようにする。

# 手段
スクリプトでServiceNowのGlideExcelParser()を利用して添付されたExcelファイルを開き、読込んだセルデータを該当テーブルに登録する。

# 例
①インシデントに添付されたExcelファイルを処理する
②ExcelファイルにはIPアドレスが記述されている

## サンプルExcelファイル
次ぎの内容のExcelファイルを処理する

|No.|IP Address|Service Name|
|:--|:--|:--|
|1|192.168.0.1|DNS|
|2||LDAP|
|3|192.168.0.3|Radius|
|4|192.168.0.4|Wiki|

## サンプルコード
```javascript:title
const attachment_filename = "ip_address.xlsx";　// 添付ファイル名
const incident_number = "INC0000003";　　　　　　// 処理するインシデントの番号。実際には引数にする

var parser = new sn_impex.GlideExcelParser();
parser.setNullToEmpty(true);                   // 空白セルを空文字列にする。設定しないと「null」になる
var attachment = new GlideSysAttachment();

var gr_incident = new GlideRecord("incident");  // インシデントを処理する
gr_incident.query("number", incident_number );  // インシデント番号で検出
if (gr_incident.next()){
  var incident_sys_id = gr_incident.sys_id;
  var gr_attachment = new GlideRecord("sys_attachment"); // 添付テーブルからインシデントに添付したファイルを取得する
  gr_attachment.addQuery("table_sys_id", incident_sys_id);  // インシデントレコードのsys_idで検出
  gr_attachment.addQuery("file_name", attachment_filename); // インシデントに複数ファイルが添付されている場合もあるので、Excelファイル名でも絞る
  gr_attachment.query();                                    // 検索を実行

  ip_address_list = [];　　　　　　　　　　　　　　　　　　　　// 取得したIPアドレスを保管する配列を初期化
  if (gr_attachment.next()) {
    var attachment_sys_id = gr_attachment.sys_id;
    var attachmentStream = attachment.getContentStream(attachment_sys_id); // 添付ファイルの内容を取得するストリーム
    parser.setSource(attachmentStream);
    var list_sheet_name = parser.getSheetNames();         // シート名を取得
     parser.setSheetName(list_sheet_name[0]);             // 今回は最初のシートのみを対象にする
     if (parser.parse()) {
       var column_names = parser.getColumnHeaders();      // 列名を取得
       var ip_address_col= column_names[1];               // 2番目の列名を取得。今回は「IP Address」のはず
       var service_name_col = column_names[2];            // 3番目の列名を取得。今回は「Service Name」のはず
       while (parser.next()) {                            // データ行をループする処理する
         var row = parser.getRow();
         ip_address_list.push([row[ip_address_col], row[service_name_col]]); // IPアドレスとサービス名を読み取る
       }
     } else {
       gs.info(parser.getErrorMessage());
    }
  }
  for (var i=0; i < ip_address_list.length; i++) {        // 結果を出力する
    gs.info(ip_address_list[i][0] + "," + ip_address_list[i][1]);
  }
}
```

以上
ボードゲームとソフトウェアテストの似ているところ

障害が流出してしまったとき、テストエンジニアが抱く感想は以下の2つのパターンがあると思います

・その観点は思いつかなかった
・あー、その観点があったか…。

これ、ボードゲーム(例えば将棋や麻雀)で遊んでるときの感情と似ているなと思っています。前者は知識不足が原因で、後者は麻雀で言うところのチョンボ(うっかりミス)に近いでしょうか。


個人的には、テストの観点は、知識と時間を変数にしたものになっていると思っています。知識が多いほど、時間が豊富にあるほど、テストの観点は網羅されていくでしょう。しかし、ひとつ大事な点があって、時間が豊富にあれば、必ず観点漏れを防げるわけではない、ということです。なぜかというと、複雑な条件のテスト観点は、ロジカルに物事を考える力だけでなく、発想力が必要になるからです。発想は時間をかけたほうが見つかる可能性は高いですが、時間をかけたからといって、見つかるとは限りません。

将棋を例にすると、「1時間かけて考えた手の方が、1分で考えた手よりも優れている可能性は高いが、絶対に1時間のほうが優れているわけではない」、というのと似ているかもしれません(プロ棋士には当てはまらないかもしれませんが)。


障害流出の振り返りミーティングなどで、「なぜテストで見つけられなかったのか」という質問がきたら、知識不足が原因なのか、時間(=発想)が必要な観点だったのか、切り分けられると良いかもしれません。そして、テストフェーズに時間的な余裕がないときに、障害が起きやすい理由は、こういうところにあるのかな、と思ったりするのでした。
勝手にSHUZO化してくれるメモ帳

※記事内容を[シンプルブログ](https://simblo.net/u/WKZXBT/post/145881)に移しました。

https://simblo.net/u/WKZXBT/post/145881

＝＝＝


[クソアプリ Advent Calendar 2021](https://qiita.com/advent-calendar/2021/kuso-app) の10日目の記事です。


# なにこれ？

メモした内容を**勝手にSHUZO化してくれるメモ帳！！！！！！**

そうだ！！！！！！！それが**「shuzo-memo」**だ！！！！！！！！！！！！！！！

[shuzo-memo](https://buta3.net/shuzo-memo/)

https://buta3.net/shuzo-memo/


# どんな感じ？

これを見てみろよ？！！！！！！！

<iframe width="560" height="315" src="https://www.youtube.com/embed/Xo75e9R1P3k" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


すごいよね〜
力強いよね～

台風が来たり、大雨が来たりしても、**このメモ帳があれば絶っっっっ対負けないよね！！！！**

そうだよ！！！！！！！

お前もこのメモ帳のように強い根っこを持て！！！できるよ？！！！？！！！！

**お米食べろ！！！！！！！！！！！！！！！！！！！！！！！！！！！**


# 使用ライブラリは？

「[kuromoji.js](https://github.com/takuyaa/kuromoji.js/)」、使わせていただくぜ！！！！！！！！！！！！


# 仕組みは？

「難しそうだなぁ〜…」

「高度なことやってるんだろうなぁ〜…」

**と思ってるんじゃないですか？？？？！**

何いってんだよ！！！！！！！

**そんなわけねぇじゃん！！！！！！！！！！！**

kuromoji.jsで「こんにちは、私はイカです。」を**形態素解析**してみろよ？！！！！！！

```
0: こんにちは（感動詞）
1: 、（記号）
2: 私（名詞）
3: は（助詞）
4: イカ（名詞）
5: です（助動詞）
6: 。（記号）
```

はいバラバラ！！！！いま君のテキストバラバラになったよ！！！！！！！

すごいよね〜
力強いよね～

バラバラになったワードで、最後に出現する「名詞」または「動詞」より後ろを、適当なSHUZO語に置き換えてみろよ？！！！！

するとどうなると思う？ねぇどうなると思う？？？？

これを見てみろよ！！！！！！！！！！

```
"こんにちは、私はイカ"
+
"だ！！！！！！できる！できる！！！絶対にできるんだから！！！！！！！！！" ←※ランダムなSHUZO語
↓
"こんにちは、私はイカだ！！！！！！できる！できる！！！絶対にできるんだから！！！！！！！！！"
```

そうだ！！！！！！！**末尾を置き換えただけだ！！！！！！！！！！！**

君もやってみろ！！必ず目標を達成できる！！！！！！！！！！

だからこそ！！！！！！！！

**Never Give Up！！！！！！！！！！！！！！！！！！！**


# まとめ

**今日から君は！！！！！！**

**メモ帳だ！！！！！！！！！！！！！！！！！！！！！！！！！！！！！**


# おまけ

ついでに10年前に作ったクソアプリも見て😂

**[トンボキャッチャー](https://play.google.com/store/apps/details?id=net.mbtl.apk.TombowCatcher)**
>トンボを捕まえるための支援アプリ。
>画面上に回転した指が映し出されるため、トンボは目を回し、その隙に簡単にトンボを捕まえることが出来るという、未曾有の便利アプリです。

https://play.google.com/store/apps/details?id=net.mbtl.apk.TombowCatcher
【JavaScript】Proxyの使い方


#はじめに

Udemyの[【JS】ガチで学びたい人のためのJavaScriptメカニズム](https://www.udemy.com/course/javascript-essence/)の講座の振り返りです。

前回の記事


https://qiita.com/nao0725/items/ba5dbb62e9ed99f76461


#目的

* Proxyについての理解を深める

#本題
###1.Proxy

Proxyというのはプロパティーの操作に独自の処理を加えるオブジェクトのこと

####例1

基本的な使い方(set)


````main.js
// オブジェクトを変数に格納
const targetObj = { a: 0 };
const handler = {
  // setというメソッドを登録する（トラップとも呼ばれる）
  // 第一引数にはtargetObjが渡ってくる
  // 第二引数にはプロパティにアクセスされた際のプロパティの名前が渡ってくる
  // 第三引数にはsetの場合には新しい値が渡ってくる
  // 第四引数はnew Proxyのオブジェクト（proxy）が渡ってくる
  set: function (target, prop, value, receiver) {
    // Proxy経由で値が呼ばれた際に、setのトラップが呼ばれているのか確認する
    console.log(`[set]: ${prop}`);
    // 下記を定義することで新しい値を設定できるようにする（a = 1と表示される）
    target[prop] = value;
  }
}
// new演算子でProxyを定義し変数に格納
// 第一引数に定義したオブジェクトを入れる
// 第二引数にはhandlerというtargetObjを操作した際に実行されるメソッドを格納したオブジェクトを入れる(上記)
const proxy = new Proxy(targetObj, handler)
// ここで出力結果が[set]:aとなるのでproxy経由で呼ばれていることがわかる
proxy.a = 1;
`````


####例2

基本的な使い方（get）

`````main.js
const targetObj = { a: 0 };
const handler = {
  // getでは値の取得が行われた際の検知ができるようになる
  // 値の取得なので新しい値は渡ってこない　＝　第三引数は削除（value）
  get: function (target, prop, receiver) {
    console.log(`[get]: ${prop}`);
    // returnで値を返す
    return target[prop];
  }
}

const proxy = new Proxy(targetObj, handler)
// [get]:aと出力される
proxy.a;
``````

####例3

基本的な使い方(delete)

````main.js
const targetObj = { a: 0 };
const handler = {
  get: function (target, prop, receiver) {
    console.log(`[get]: ${prop}`);
    return target[prop];
  },
  // 下記のdeleteでは値が削除された際の検知を行う
  // deletePropertyの場合にはreceiverは渡ってこないので削除
  deleteProperty: function (target, prop) {
    console.log(`[delete]: ${prop}`);
    // deleteとして値を削除
    delete target[prop];
  }
}

const proxy = new Proxy(targetObj, handler);
proxy.a;
// delete aと出力される
delete proxy.a;
// targetObjの中身をコンソールで確認してみるとオブジェクトの中身も削除されている
``````

####例4

実用的な例
const targetObj = { a: 0 };に対して値の変更を許可しない場合にはどのようにするべきか


`````main.js
const targetObj = { a: 0 };
const handler = {
  set: function (target, prop, value, receiver) {
    console.log(`[set]: ${prop}`);
    // setのトラップが呼ばれた際にErrorが発生するようにする
    throw new Error(`cannot add prop`)
    // deleteでも削除不可にできる
  }
}

const proxy = new Proxy(targetObj, handler);
// 以下でaの値を1に変更使用としてもエラーが発生し変更できない
proxy.a = 1;
`````

####例5

デフォルト値をgetで取得した際に渡したい場合

`````main.js
const targetObj = { a: 0 };
const handler = {
  get: function (target, prop, receiver) {
    // if文を使用する
    // 最初の条件は自分自身のプロパティにpropの名前が見つかった場合
    if(target.hasOwnProperty(prop)){
      // returnで返す
      return target[prop]
    } else {
      // 見つからなかった場合にはデフォルト値を返す
      // 数値はなんでも可
      return -1;
    }
  }
}

const proxy = new Proxy(targetObj, handler);
// elseの方に条件が分岐するので　-1と出力される
console.log(proxy.b);
```````



今日はここまで！

#参考にさせて頂いた記事

* [【JS】ガチで学びたい人のためのJavaScriptメカニズム](https://www.udemy.com/course/javascript-essence/)
* [Let'sプログラミング JavaScript入門](https://www.javadrive.jp/javascript/)
Unity uGUIで使える無料/OSSなカラーピッカー

Unity uGUIで使える無料/OSSなカラーピッカーを調べました。
Github Star数の大きい順に並べています。

### HSV Color Picker

- Github Star 409
- 最終更新 2ヶ月前

https://github.com/judah4/HSV-Color-Picker-Unity

### Unity Color Picker

- Github Star 69
- 最終更新 3年前

https://github.com/jongallant/UnityColorPicker

### Color Picker for Unity UI in a single script/prefab

- Github Star 57
- 最終更新 5年前

https://github.com/SnapshotGames/cui_color_picker

### UnityColor

- Github Star 25
- 最終更新 5年前

https://github.com/coding2233/UnityColor

### ACP

- Github Star 12
- 最終更新 2年前

https://github.com/Dandarawy/ACP

## 結論
GitHub Starが一番多く、更新も新しいHSV Color Pickerが有力。

以上です。
TiDB 検証ライフ(1-検証環境構築)

# TiDBの検証を始めました

０から触ってみるので、メモ書きを兼ねて情報共有します。

TiDBを検証してみたいと思ったきっかけは「db tech showcase 2021」のTiDBセッションでした。

PingCAP社の主力製品で、「水平方向の拡張性、強力な一貫性、MySQLとの互換性による高い可用性を備えたオープンソースのハイブリッド・トランザクション/分析処理（HTAP）データベース」と紹介されていました。

ハイブリッド・トランザクション、がとても気になるところです。

## 早速、まずは検証環境の構築から

### 検証環境

MacBook Airの貧弱なスペックでも、果たして動いてくれるだろうか

```
プロセッサ: 1.3 GHz デュアルコアIntel Core i5
メモリ: 4 GB 1600 MHz DDR3
```

### インストール手順

PingCAP社のMacOSデプロイ手順ありました。

https://docs.pingcap.com/tidb/stable/quick-start-with-tidb#deploy-a-local-test-environment-on-mac-os

1. TiUPのダウンロードとインストール

``` shell
$ curl --proto '=https' --tlsv1.2 -sSf https://tiup-mirrors.pingcap.com/install.sh | sh
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 6335k  100 6335k    0     0  4342k      0  0:00:01  0:00:01 --:--:-- 4345k
WARN: adding root certificate via internet: https://tiup-mirrors.pingcap.com/root.json
You can revoke this by remove /Users/apple/.tiup/bin/7b8e153f2e2d0928.root.json
Successfully set mirror to https://tiup-mirrors.pingcap.com
Detected shell: bash
Shell profile:  /Users/apple/.bash_profile
/Users/apple/.bash_profile has been modified to add tiup to PATH
open a new terminal or source /Users/apple/.bash_profile to use it
Installed path: /Users/apple/.tiup/bin/tiup
===============================================
Have a try:     tiup playground
===============================================
```

2.　環境変数変更を反映

```
$ source .bash_profile
```

3.　クラスタを起動

TiDBテストクラスタは、通常以下の構成が必要とのことです。
-　TiDBインスタンス、二つ
-　TiKVインスタンス、三つ
-　PDインスタンス、三つ
-　TiFlashインスタンス、一つ

```
$ tiup playground --db 2 --pd 3 --kv 3
```

いくつかコンポーネントがインストールされ、最後に

```
CLUSTER START SUCCESSFULLY, Enjoy it ^-^
To connect TiDB: mysql --comments --host 127.0.0.1 --port 4000 -u root -p (no password)
To connect TiDB: mysql --comments --host 127.0.0.1 --port 4001 -u root -p (no password)
To view the dashboard: http://127.0.0.1:2379/dashboard
PD client endpoints: [127.0.0.1:2379 127.0.0.1:2382 127.0.0.1:2384]
To view the Prometheus: http://127.0.0.1:9090
To view the Grafana: http://127.0.0.1:3000
```

と表示されたら、成功です。

4.　TiDBに接続

別端末から、TiUPクライアントをインストールします。

```
$ tiup client
```

エンドポイント選択画面で、4000を選択しました。

```
Choose a endpoint to connect
SqO0bRV mysql://root@127.0.0.1:4000
SqO0bRV mysql://root@127.0.0.1:4001
```

おっと、mysqlと表示されたので、きっとMySQLと親和性高そうです。

試しに、showコマンド実行してみると

```
my:root@127.0.0.1:4000=> show databases;
      Database      
--------------------
 INFORMATION_SCHEMA 
 METRICS_SCHEMA 
 PERFORMANCE_SCHEMA 
 mysql 
 test 
(5 rows)
```

## 終わりに
ブログ記事書きながらインストールしていましたが、サクッとインストール終わった感じでした。

次回は各種機能を触ってみようと思います。ワクワクしますね、お楽しみに。
AWS 今すぐ 簡単 ちょっとしたコスト削減レシピ

## はじめに

開発環境のEC2やRDS、夜間も立ち上げっぱなしにしていませんか。
特に個人でサービス開発している方にとっては直接おサイフに響くので、１万円/月でも固定費が下がったら嬉しいはず。

今回は、今すぐ簡単にできるちょっとしたAWSコスト削減についてまとめてみようと思います。


## 本記事の主な対象者

 - 主にスタートアップや個人のサービス開発において、少しでもAWSからの請求費用を削減したいと思っている方
 - AWSコスト関連のノウハウが少なく、どこから手をつけて良いかがよくわからない方



## 筆者について
 - [2020 APN AWS Top Engineer](https://aws.amazon.com/jp/blogs/psa/2020-apn-aws-top-engineers-announcement/)
 - [2021 APN AWS Top Engineer / APN ALL AWS Certifications Engineer ](https://aws.amazon.com/jp/blogs/psa/apn-engineers-award-2021/)


## レシピその１：[Savings Plans](https://aws.amazon.com/jp/savingsplans/)
#### AWS Cost Explorer から、必要なパラメータを選択してポチるだけ

とはいえ、Cost Explorer は業務においては開発者として、EC2やRDSを利用しているだけだと中々馴染みのない部分かと思います。以下の手順で進めて下さい。

 - AWS コンソールから、AWS Cost Explorer を開く
 - 左メニューから、「Savings Plans」> 「推奨事項」を選択する

![スクリーンショット 2021-11-21 13.54.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489184/dd9ce4e1-4abd-4934-acd4-6c312c47c671.png)

- この画面では、ざっくり上半分（↑）がコストシミュレーションのパラメタ。下半分（↓）が、コストシミュレーションの結果となります。
- おすすめは「Compute Savings Plans」で、リージョンを意識することなく、EC2 / Fagate / Lambda をまるっと割引してくれるというもの。

![スクリーンショット 2021-11-21 13.54.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489184/1760d25a-a68b-db94-0e68-39862b4d31fa.png)

- 上記はざっくり「１年：前払いなし」の、オプションで、20%削減できるシミュレーションとなります（３年：全額前払いだと、驚きの47%削減ですが、ここは初回の場合はスモールスタートで良い気がします）

さらに詳しく検討してみたい方は、公式ドキュメントなど確認の上、クッキングされると良いかと思います。

## レシピその2：[Instance Scheduler](https://aws.amazon.com/jp/solutions/implementations/instance-scheduler/)
#### 1. 提供済みの CloudFormation テンプレート のスタックをデプロイし
![スクリーンショット 2021-11-22 10.22.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489184/697fa8a8-0e46-6b38-3c56-f9103e9b419d.png)

#### 2. 作成された DynamoDB の 起動スケジュールの管理項目をメンテし
![スクリーンショット 2021-11-22 10.25.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489184/b167845e-fabc-8f9f-91c6-13da088e4a87.png)

#### 3. 自動起動/停止の対象としたい、EC2/RDS にタグをつけるだけ
![スクリーンショット 2021-11-22 10.31.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489184/29d3a068-ae4a-c556-93fb-9534efbf9e1f.png)


何が実現できるのかというと、これまで自前構築で Lambda + EventBridge で自動起動/停止行っていたようなものが、用意されたDynamoDBの項目メンテと対象のタグ付けだけで、夜間などの時間を指定して自動停止 / 翌朝起動とかが設定次第で簡単にできてしまうというもの。

開発環境など、24/365の稼働が必要でない非クリティカルな環境においては、平日夜間と土日を止める設定をするだけで、コストは半分くらいまで抑えることができるのではないでしょうか。

なお、Instance Scheduler の具体的なレシピについては、下記の builders.flashの 記事がハンズオン形式でとてもわかりやすいと思いましたので、興味がある方に向けてはこちらをご紹介したいと思います。

 - [サーバーを指定した期間で停止する「AWS Instance Scheduler」を試してみる](https://aws.amazon.com/jp/builders-flash/202110/instance-scheduler/)
 - [Instance Scheduler 実装ガイド](https://d1.awsstatic.com/Solutions/ja_JP/instance-scheduler.pdf)
 
## おわりに

今すぐ 簡単 にできる レシピ２選のご紹介でした。
この年末年始、お使いのAWS環境の固定費に対するの割引サービスの検討や
リソースのお掃除など、コストの見直しなど検討されてみるのはいかがでしょうか。

少しでも、皆様のおサイフのお役にたてれれば幸いです。
フィッシングEメールはどう防ぐべきか

[BBC](https://www.bbc.com/news/technology-52319093)によると、Googleはおおよそ1800万ものCOVID-19に関連したフィッシングEメール毎日がGmailユーザーに送られているようだ．またGoogleは1日あたりやく1億件ものフィッシングEメールをブロックしていると報告している．Eメールを利用するにあたってフィッシングEメールを目にするのは止むを得ないことである．基本的にはプロバイダーによるアルゴリズムによってそのようなEメールはブロックされるか，スパムフォルダーにストアされることになるが，それでもそのEメールを受け取ること自体を防ぎたいというのはある程度共通の意見なのではないだろうか．そこで今回はそれをどう防ぐかについて少しお話ししたいと思う．

1. ___フィッシングEメールを受け取る前___
    1.  ___自身のEメールの扱い___
    2.  ___捨てアカウント___
    3.  ___センダーをブロック___
2. ___フィッシングEメールを受け取った後___
    1. ___返信しない___
    2. ___リンクを開かない___ 

## 1. フィッシングEメールを受け取る前
###　1.1 自身のEメールの扱い
これは最も初歩的であり，効果的なメソッドであるが，フィッシングEメールを受け取らないためには自身のEメールをセンダーに知られないことが重要である．EメールアドレスはEメールを送る際のデスティネーションアドレスであり，それなしでランダムに送ることはできない．Eメールアドレスを公にするということは自身の住所を公にするのに等しい．誰しも自分の住所を公にしようとは思わないはずだ．

###　1.2 捨てアカウント
フィッシングEメールを受け取るようというと語弊があるが，受け取っても構わないアドレスとそうでないアドレスを分けて持つのは有効的な手段であろう．なんのアカウントであろうとアカウントを作る際，ほとんどの場合，Eメールアドレスを要求してくる．またそれがIDとして使用されるケースも多い．世の中にはいい会社もいれば悪い会社もいるわけで，その会社が裏でEメールアドレスをリークさせていないかなど，一般人には到底知り得ないことである．そこで複数のアカウントを持つことで信用できない場合には捨てアカウントを使うことで，重要なアカウントにフィッシングEメールをが送られることを防ぐことができる．

###　1.3 センダーをブロック
基本的にはセンダーは毎回アドレスを変えて送ってくるが，もし複数のフィッシングEメールを同じアドレスから受信している場合は，センダーをブロックすることで直接的に特定のセンダーをブロックすることができる．これはEメールのクライアントによって違うのでブロックの方法についてはお使いのクライアントによってググってもらえればと思う．

## 2. フィッシングEメールを受け取った後
###　2.1 返信しない
それがスパムだと分かった場合返信をしないことは非常に重要である．時にそれをあんサブスクライブしようとトライするも，それがうまくいくことはまずない．ただここで，注目すべきはどのようにそれがフィッシングEメールであるか認識すべきかである．最も容易な方法としてはスパムフォルダーに入っているかどうかである．また，サブジェクトやコンテントから推測するのも比較的容易であろう．ここでは少しレベルアップした確認方法を紹介したいと思う．それはEメールのヘッダーを読むという方法である．

####Eメールヘッダー
EメールヘッダーとはEメールを作成する際に作られるヘッダーであり，EメールのボディだけでなくEメールを送るにあたって必要な様々な情報を含む．ここでEメールヘッダーを読むことによって探し出せるレッドフラッグを全てお話しするのは，少し本題からズレるので一つEメールヘッダーを使った有効的な解析方法を紹介したいと思う．これは最近よく聞く，国際ロマンスを歌った詐欺なのへも有効である．

それはセンダーがいるべきロケーションと実際にメールが送られらたロケーションがマッチするかを調べるほい方である．まず初めにヘッダーの探し方に関してはプロバイダーによって異なるので各自調べていただければと思う．

* センダーがいるべき場所を特定する
<br>これに関しては比較的簡単に知ることができる．まずボディ内にセンダーが情報を載せている場合や，既に知っている場合はそれを参照すれば良い．仮にとある会社を謳っているのであれば会社のロケーションを調べれば良い．

* 実際にどこから送られてきたかを特定する 
<br>これに関しても非常に簡単でセンダーのIPアドレスからロケーションを探ることができる．[IP-Lookup.org](https://www.ip-lookup.org/location)

これらが食い違うようであればそのEメールは怪しいとみていいだろう．

###　2.2 リンクを開かない
多くの人がリンクは開くなと教わってきたことであろう．では，それは何故なのか，リンクを開くと何が起こるのか．リンクを開くことによって，ハッキングされるということはほとんど考える必要がないが，それによって少しばかりアタッカーに情報を与えることになる．まずはそのアカウントがアクティブであるということ．そのほかにも，使用したブラウザ，OSの種類やバージョン，デバイスの種類がアタッカーに知られることになる．実際には画像をエンベディットすることで，リンクを開かずともメールを開けるだけで同じことが起こるのが，昨今のプロバイダーはほとんどの場合ユーザーに確認してから画像を開けるので，基本的にメールを開けるだけであれば大丈夫だが，開けなくて済むのであれば開けないことが得策であろう．
ルービックキューブを半自動でぐりぐりさせるthree.jsのサンプルプログラム

この記事はBeeXのアドベントカレンダーの記事です。みんな真面目なネタを書くかもしれないので、私は早めに軽いネタを書いておこうと思います。少し前に書いたお遊びプログラムのメモです。

私は10年に1回ぐらいの頻度でルービックキューブをネタにしたプログラムを書いています。

今回書いたプログラムはこれです。
![image.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490207/9d08901b-1b28-b6dc-3fff-3129dde0ee12.gif)

ブラウザ上で動かすことができます。マウスでぐりぐりすると、見る角度だけ変えられます。キューブの絵の下にある青いボタンが回転操作をするためのボタンです。（本当はマウスでキューブを回転操作できるとよかったのですが、そこまでは到達せず）

以下のリンクで直接試すことができます。

[サンプル](https://suzuki-navi.github.io/threejs-sample/sample04.html)

JavaScriptで書きました。突貫で作っています。コードが汚いのはご容赦ください。three.jsという3Dオブジェクトを描くJavaScriptのライブラリを利用しています。

また10年後にルービックキューブのなにかを書きたくなると思うので、本記事のこれ以降は10年後の自分に向けたメモです。

# キューブ配置のデータ構造

各面の9個のセルの色を6面、計54個の情報を配列として持たせます。要素数54の配列は展開図にするとこのような順番に並べます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490207/2fcc5b49-bf0e-5b17-2b78-8335279f524c.png)

色はルービックキューブがそろったときの状態です。シャッフルされると色はバラバラになってますが、配列の要素の位置は固定です。

配列の要素は色情報が主ですが、このサンプルプログラムではthree.jsのオブジェクトもここで保持させました。

## 採用しなかった出た構造

最初は、2面以上あるキューブはいつも必ず一体となって動くので、各キューブがどこにあるのかを保持しようと考えていました。例えば以下の図でいうと青と赤のキューブは、ルービックキューブをどう操作しようが必ずいっしょにくっついて移動します。なので青と赤を別々にせずに1つのオブジェクトとして保持しようとしました。しかし、位置情報や回転操作が複雑になりそうで、結局上記54要素の配列で表現することにしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490207/24ee8b36-bb15-b673-ec68-be07c1ddce91.png)

# 回転操作情報

X軸、Y軸、Z軸を適当に決めます。今回は、上のルービックキューブの絵でいうと、赤面の方向をX軸、黄色の方向をY軸、青の方向をZ軸としました。

回転操作を表現するには、まず回転の軸をx, y, zのいずれかで指定します。

次に回転の向きを指定します。各軸で正の方向から見て時計回りを+1、反時計回りを-1とします。回転できる層が3つありますので、それぞれの層に対して+1または-1または0を指定することにします。層は各軸の負の方向から並べます。

この説明ですとわかりづらいのですが、ルービックキューブの回転記号で表すと次のようになります。

`R`: `{axis: "x",  direction: 0,  0, +1}`
`R'`: `{axis: "x",  direction: 0,  0, -1}`
`L`: `{axis: "x",  direction: -1,  0, 0}`
`L'`: `{axis: "x",  direction: +1,  0, 0}`
`U`: `{axis: "y",  direction: 0,  0, +1}`
`U'`: `{axis: "y",  direction: 0,  0, -1}`
`F`: `{axis: "z",  direction: 0,  0, +1}`
`F'`: `{axis: "z",  direction: 0,  0, -1}`
`M`: `{axis: "x",  direction: 0,  -1, 0}`
`M'`: `{axis: "x",  direction: 0,  +1, 0}`

90度の回転までしか表現しません。180度の回転は、回転操作2回分とします。

回転操作はキューで保存します。キューの先頭にある回転操作情報が現在アニメーション中のものです。回転アニメーションが完了したらキューの先頭を削除して次のアニメーションに進みます。キューが空になるとアニメーションが停止します。

回転操作ボタンを押すと、キューの最後に回転操作情報が追加されます。

# 回転アニメーション中

回転操作キューの先頭がアニメーション中の回転操作です。

回転中は、

- 要素数54の配列情報
- 回転操作情報（キューの先頭）
- 時刻情報から計算できる回転角度

から3Dオブジェクトの位置や角度を計算します。ここでは三角関数や行列で自力で計算しました。

90度まで回転が完了したら、要素数54のキューブ配置情報を再配置して完了です。

# 回転操作による再配置

要素数54の配置情報は展開図に基づいており、軸や層による対称性に乏しいため、回転操作ごとの再配置ルールを地道に書きました。ここがコーディングするうえでは面倒でしたし、デバッグもたいへんでした。

回転方向+1と-1とありますが、+1だけ実装して、-1は+1を3回繰り返すことにしています。

# 半自動で揃えるためのボタン

ルービックキューブを揃えるために次になにをしたらいいのかをある程度自動で判定しています。たくさんある青いボタン群の下半分がそれです。初心者向けのルービックキューブの揃え方を調べて、それを自動で判定させられるように大量のif文を書きました。揃えるための回転操作を判定して、それを回転操作情報のキューの最後に追加します。

手早く実装したために、ルービックキューブの手数はとても多くなっています。

アニメーション中も次の操作ボタンを押せるようになっていますが、これはアニメーションが完了した状態の配置状態を先に作っておいて、それをもとに判定しています。

以上。
gitにcommitするときにブランチからメッセージを追加するメモ




```sh:commit-msg
#!/bin/sh

if [ -n "${GIT_DIR}" ]; then
    hooksdir="./${GIT_DIR}/hooks/"
else
    hooksdir="./.git/hooks/"
fi

. "${hooksdir}common.sh"

ticket="$(extractTicketId)"
if [ -n "${ticket}" ]; then
    appendMsgTo1stLine "$1" "${ticket}"
fi
```


```sh:common.sh
#! /bin/sh

getGitBranchName()
{
    branch="$(git symbolic-ref HEAD 2>/dev/null)" ||
            "$(git describe --contains --all HEAD)"
    echo ${branch##refs/heads/}
}

isOnMasterBranch()
{
    if [ "$(getGitBranchName)" = "master" ]; then
        return 0
    fi
    return 1
}

isOnDevelopBranch()
{
    if [ "$(getGitBranchName)" = "develop" ]; then
        return 0
    fi
    return 1
}

isOnFixBranch()
{
    if [[ "$(getGitBranchName)" =~ ^feature/#[0-9]+.* ]]; then
        return 0
    fi
    return 1
}


appendMsgTo1stLine()
{
    mv $1 $1.$$
    if [ -s "$1.$$" ]; then
    if head -1 "$1.$$" | grep "$2" > /dev/null; then
        cp "$1.$$" "$1"
    else
            sed '1s/$/ '"$2"'/' "$1.$$" > $1
    fi
    else
        echo "$2" > "$1"
    fi
    rm -f $1.$$
}

extractTicketId()
{
    echo "$(getGitBranchName)" \
    | awk 'BEGIN{ FS="[/]"}
           $1 == "feature" || $1 == "id" { printf "#%s", $2, $3 }
           $2 == "feature" || $2 == "id" { printf "#%s", $3, $4 }
           '
}

hasTicketId()
{
    first="$(git cat-file -p $1 \
    | sed '1,/^$/d' | head -1 \
    | sed '/.* #[0-9][0-9]*.*/!d')"

    if [ -n "${first}" ]; then
        echo "true"
    else
        echo "false"
    fi
}

extractParents()
{
    parents="$(git cat-file -p $1 \
    | grep '^parent [0-9a-f]\{40\}$')"
    echo "${parents##parent }"
}

```

オリジン２つ登録

```
git remote add foofoo git@github.com:redamoon/foofoo.git
```

https://qiita.com/k-o-u/items/80b31679c41a6e65376e
[WinForms] Languageの値ごとにコントールの大きさが定義できる


```Language``` の値ごとに、コントールの大きさが定義できる。
例えば以下のように設定することが可能。
日本語なら```Size = (100,100)```
英語なら```Size = (50, 200)```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2087075/d0cecb1b-e523-1c33-4526-9b64621c01fd.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2087075/8a36b92d-0dd6-67d3-50d6-0795fc736ef2.png)
numerapiの早見表 (quick reference table)

この記事は、[Numerai Advent Calendar 2021](https://adventar.org/calendars/6226) の2日目の記事です。

[numerapi](https://github.com/uuazed/numerapi/)は、[Numerai GraphQL API](https://api-tournament.numer.ai)のPythonクライアントライブラリです。
本記事では、[Classic Tounament](https://numer.ai/tournament)に関する機能の早見表を書きました。
現在のnumerapiバージョンはv2.9.4です。

- Method
    - メソッド名
- Op (**Op**eration)
    - メソッドが実行しているGraphQL APIの操作
        - `q` (**q**uery): データ取得操作
        - `m` (**m**utation): データ変更操作
        - `-`: GraphQLではないので該当なし
- Ke (API **Ke**y)
    - `r` (**r**equired): APIキー(public_idとsecret_key)が必要
- Description
    - 機能の概要説明
- Category
    - 今回、表を作るにあたり私が作成した大まかな分類です。numerai あるいは numerapiの公式な分類ではありません。
    - I roughly make some categories for grouping methods. These are numerai /numerapi unofficial.

| Method | Op | Ke | Description | Category |
|:------------- |:------------- |:------------- |:------------ |:------------- |
|raw_query | q |  | GraphQL APIを実行。numerapiが未サポートのAPIがあれば、自身でGraphGLを実行可能。 | all|
|get_leaderboard | q |  | リーダボード | performance|
|daily_user_performances | q |  | モデルの日次パフォーマンス（DEPRECATED） | performance|
|daily_model_performances | q |  | モデルの日次パフォーマンス | performance|
|daily_submissions_performances | q |  | モデルの日次パフォーマンス（モデル名指定） | performance|
|round_details | q |  | ラウンドの全モデルのパフォーマンス（ラウンド指定）。日次ではなく、各ラウンドの最新のみ。 | performance|
|round_model_performances | q | | モデルの全ラウンドのパフォーマンス（ラウンド指定不可） | performance |
|get_current_round | q |  | 最新のアクティブなラウンド番号。土曜18:00 UTC（日曜03:00 JST）に更新される。 | round|
|get_competitions | q |  | 全ラウンド情報一覧（ラウンド指定不可） | round|
|check_new_round | q |  | 新ラウンドの開始確認 | round|
|list_datasets | q |  | データセット一覧（ラウンド指定） | dataset|
|download_dataset | q |  | データセットをダウンロード（ファイル名指定、ラウンド指定） | dataset|
|get_dataset_url | q |  | 旧データセットのURL | dataset|
|download_current_dataset | - |  | 最新のアクティブなラウンドの旧データセットをダウンロード | dataset|
|get_latest_data_url | - |  | 旧データセットのURL（データタイプ指定） | dataset|
|download_latest_data | - |  | 最新のアクティブなラウンドの旧データセットをダウンロード（データタイプ指定） | dataset|
|set_submission_webhook | m | r | Computeで予測提出する際に使うWebhook | submission|
|upload_predictions | m | r | 予測ファイル提出 | submission|
|get_submission_filenames | q | r | 提出済み予測ファイル一覧（モデルID指定）| submission|
|submission_status | q | r | 旧データ予測提出時のvalidation診断結果（モデルID指定） | submission|
|upload_diagnostics | m | r | 診断対象のvalidation予測ファイル提出| diagnostics|
|diagnostics | q | r | 診断結果 | diagnostics|
|public_user_profile | q |  | モデルの公開情報 | account|
|get_account | q | r | アカウント情報 | account|
|get_models | q | r | アカウントのモデル情報一覧 | account|
|get_account_transactions | q | r | 入出金履歴 (DEPRECATED) | account|
|wallet_transactions | q | r | ウォレットのトランザクション履歴 | account|
|get_user | q | r | アカウント情報 (DEPRECATED) | account|
|stake_set | m | r | ステイクを設定。設定額に合わせてメソッド内部で自動で増減。 | staking|
|stake_get | q |  | ステイクを取得 | staking|
|stake_change | m | r | ステイクを変更 | staking|
|stake_drain | m | r | ステイクをゼロにする。メソッド内部ではstake_decreaseで大きい額を指定。 | staking|
|stake_decrease | m | r | ステイクを減らす。メソッド内部ではstake_change。 | staking|
|stake_increase | m | r | ステイクを増やす。メソッド内部ではstake_change。 | staking|

# 関連記事

https://qiita.com/murenoha/items/a64f4c6e473066b0ce22
（続）RPAの開発見積について

# はじめに

この記事は「RPAにおける開発見積」についての個人的意見・メモです。
「RPA」カテゴリ の アドベントカレンダーの 2日目 の記事でもあります。

https://qiita.com/advent-calendar/2021/rpa

# 前回の続き

以前に、RPAの見積について書きました。今回はその続きを書きます。

https://qiita.com/miya_gis/items/9cf1bd45d8bec4b194fe

前回の内容を簡単にまとめると、こんな内容でした。

```
# そもそも、工数見積は難しい
　- 後の方で全貌が見えてくるから
　- 見積をしている初期フェーズでは、そもそも情報の確度が低いから

# RPAの見積は、さらに難しい
　- ツールを使ったローコード開発だから
　- 短期で低コストが前提だから
　- ぞもそも業務改善自体が難しいから

# RPA特有の見積の仕方
  - 画面操作／複雑ルール／イレギュラーパターンをどうするか
  - テスト難しい／要件定義とか無いことも多い
  - 開発する人のレベル差が大きい

# じゃあどうするの？
 - 前提を整理する
 - 先にプロトタイプを作っちゃう
 - 成果物どこまで作るか考える
 - 契約を考える
```

前回は「上記のような内容」で書いたのですが、

- そもそも「開発の形態（プロ開発・ユーザー開発）」によって、考え方が変わるよね
- 見積工数よりも「イテレーション（改善スプリント）」が大事だよね

という事を書けていなかったので、今回「追記」として書きます。


#  開発の形態（ユーザー開発／プロ開発）によって、考え方が変わる
ここで言う「ユーザー開発／プロ開発」は、以下のような意味合いです。

| 分類 | 内容 | メリット | デメリット |
|:-|:-|:-|:-|
| ユーザー | 自社（部門）が、自ら業務を自動化する | 柔軟に開発できる| 品質担保が難しい |
| プロ開発  | 外部会社が、プロとして開発をする  | 品質担保が楽 | お金がかかる|

ユーザー開発の一番のメリットは「スピード感」です。

極端な話、ユーザー開発であれば「バグ発生」は仕方ないものとして `バグが発生したら速やかに直す` ことを優先する進め方も「健全」です。

開発工数も、`厳密に見積りしないで「ざっくり」` でも良いと思います。

ただし、この `「バグ出たら考えよう＆スケジュールはざっくり」で頑張ろう」` 作戦を続けると、「品質が低くなり、手がつけられない状態になる」ことも多いので

- 「振り返り」や「見なおしポイント」を設けること
- 「仕組みから作り変える」ことを予定すること（その分の工数＆仕組み作りが出来る人 を用意）

が必要だと思います。

リスク回避という観点で、初期時点で「プロ開発」の手を借りておくと、今後の拡張・保守も考えてアドバイスを貰えるかもしれません。（品質面・拡張面での「手詰まり」を避けられる）




# RPAの見積はイメージ力が大事
RPAの開発をしていると、以下のような「意外」な場面に出会います

```
-「この機能なら2日できるだろ！」と言っても 5日 掛かった（とある機能でハマった）
-「分かんないから10日にしとこ！」としといたら、3日で終わった（類似ロボを流用できた）
```

この「予想との乖離」は、`RPAがローコードツール開発` であり、 `普通の開発より「ブレ幅」が大きい`  から「起きやすい」のだと思います。

このブレ幅は、案件をいくつか経験し「危険予想力・妥当な見積力」が上がることで、減っていきますが、そこで、いちばん大事なのは「処理フロー／コード」をイメージする力だと思います。

要件を聞いて「どの部品を使って、どんな風に組み立てるか？」をどれだけイメージできるか。
「苦労しそうな部分はどこか？落とし所はどこになるか？」まで事前に考えられると、後々楽になると思います。

実装のイメージは、人によって様々ですが、突き詰めていくと数パターンに落ち着きます。
なので、日頃から「**人の書いたコード**」や「**他人がハマったポイント**」を読んで「引き出し／パターン」を増やしておくと、イメージ力がアップして、見積の際にも役に立つはずです。



# 見積工数よりもイテレーション（スプリント）が大事

RPA開発は人の手作業を自動化するもので、最初は人とロボットの一部協業を目指して、将来的に「完全自動化」を目指すのがセオリーだと思います。また、段階的に業務を自動化することで、後から見えてくる課題も正確に対応できます。

そういう意味で、RPAは最初から完全系を目指すのではなく「**今月はココまでを目指そう**」といったスプリント（短期的な目標）を重ねる（イテレーション）が向いています。（アジャイル開発的な考え方）

ただし、初期見積フェーズではこの「スプリント／イテレーション」を意識して数字を出すのは難しい、というより不可能に近い。なので、

```
- 開発フェーズを積極的に分ける
- 今月はここまでやろうという目標決め
- 成果を振り返るタイミングを用意しておく
```

といった「短期目標＆中長期目標」を意識して、フェーズを設定できるプロジェクトが健全 なのかもしれません。


# 終わりに

RPAの開発見積は簡単ではありません。難しさには「RPAならでは」の部分もあります。

この記事が参考になったら、 LGTMをお願いします。閲覧ありがとうございました。
neosでlogix その11

#概要

niosでlogixやってみる。
whileノード、使ってみた。

#写真

![2021-12-01 20.54.24.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/ce4ebe94-a37c-88eb-b02c-1f3d71e16a0c.jpeg)


#while

```

Inputs
 	Impulse	Run
 	Bool	Condition
Outputs
 	Impulse	LoopStart
 	Impulse	LoopIteration
 	Impulse	LoopEnd
```


以上。
neosでlogix その10

# 概要

niosでlogixやってみる。
forノード、使ってみた。
初期値は、０から。

# 写真

![2021-11-30 22.31.21.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/670ba278-824c-8f7f-41d7-d0729c46ad8e.jpeg)


# for

```
Inputs
 	Impulse	Run
 	Int	Count
 	Bool	Reverse
Outputs
 	Impulse	LoopStart
 	Impulse	LoopIteration
 	Impulse	LoopEnd
 	Int	Iteration
```

# 手順

- logixtooltipを装着。
- Flow>forをスポーン。
- Actions>writeをスポーン。
- Variables>Storage>intをスポーン。
- つなぐ


以上。
IPアドレスの設定範囲に制限があることを知った

## 1～223の間である必要がある。

![error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/c477f4b2-fb8e-17c5-6947-b13887066e51.png)


> 255 の入力は無効です。1 と 223 の間の値を指定してください。

最大の値は

* 223.255.255.0 - 223.255.255.255
Couldn't decrypt config/credentials.yml.enc. Perhaps you passed the wrong key?のエラー解決方法

##背景
RDSに接続できるようにするために

```
 EDITOR='vi' bundle exec rails credentials:edit
```
をしてcredenialsファイルを開こうとしたところ

```
Couldn't decrypt config/credentials.yml.enc. Perhaps you そしてpassed the wrong key?
```
という風に言われました。ちなみにmaster.keyはちゃんと中身入ってます。

##結論
解決方法としてはcredentialsファイルを作り直します。
ただ、作り直すといっても、そんな難しい作業ではないです。

まず既存のローカルのcredentialsファイルの名前を適当なファイル名に変更します。

そしてそのローカルのcredentialsファイルにRDSのusernameやpassword等を記述します。
ちゃんと記述ができたことが確認できたら、githubにpushします。

pushができたらSSHでEC2サーバ内に入り、アプリディレクトリで

```
git pull
```
を実行します。そしてEC2内で

```
 EDITOR='vi' bundle exec rails credentials:edit
```
を実行するとcredenttialsの中身がちゃんと確認できるかと思います。
境界値分析・同値分割

##00. はじめに
ソフトウェア開発を行う際、ほとんどの場合さまざま制約（Ex. 時間、予算）によりテストデータの各セットに対して徹底的にテストを実行することができません。しかし、ソフトウェアの品質を保証するためにもテストは必要不可欠です。制約の中でテストを行うためにはテストケースを必要なものだけに絞り出す必要があります。これを実現するための手法が「境界値分析」と「同値分割」を用いたテストになります。どちらの手法もブラックボックステスト手法の一つで、少ないテスト回数でより広範囲をカバーできるのが特徴です。

##01. 同値分割（Equivalence Partitioning Testing）とは？
同値分割とはシステム上同等に処理されると想定した値をグルーピングする手法のことを言います。
##02. 境界値分析（Boundary Value Analysis）とは？
境界値分析とは同値分析によってグルーピングしたグループが隣接する境界やその前後の値（境界値）を入力としてテストを行う手法のことを言います。
>**境界値の例 :**
最大値　最小値　中央値 etc

##03. 同値分割と境界値分析を用いたテスト例題
まず二つの手法を用いたテストまでの一連の流れのイメージを掴んで下さい。

>**テストまでの一連の流れ** :
①**値をグルーピング（同値分割）**
②**グループ毎の境界値を見つける（境界値分析）**
③**境界値を用いてテスト**

テストまでの一連の流れを掴めたところで例題を用いて具体的に説明していきたいと思います。

###例題1
０から１４の値をテストする際、６から１０を有効な値とし、その他の値(0~5、11~14)を無効な値とした場合、境界値分析と同値分割を用いてどのようにテストを行えば良いでしょうか？

####解答
まずは同値分割を用いて下記のように有効な値と無効な値を３つのグループにグルーピングします。
![example-for-equivalence-class-partitioning.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300331/4a77f4a1-6458-2704-ea9d-bc4a8a530b27.jpeg)
次に境界値分析を用いて境界値(今回の例では最小値と最大値)を下記のように各グループ毎に出しそれらの値を入力としてテストします。
0~5の無効な値のグループ　: Min=0, Max=5
6~10の有効な値のグループ : Min=6, Max=10
11~14の無効な値のグループ : Min=11, Max=14

###例題２
下記のようなピザの数量を入力するボックスがあります。このシステムでは1~10枚のピザを有効なオーダー数と見なし、有効な値が入力されSubmitボタンが押されるとオーダー確認画面へ遷移し、無効な値が入力された場合はエラーメッセージを表示します。この数量入力ボックスの機能は境界値分析と同値分割を用いてどのようにテストすることができますか？

![スクリーンショット 2021-12-01 午後1.47.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300331/ff921e68-8c25-9302-7f00-f9a2ee02f7c0.png)

####解答
まずは同値分割を用いて下記のように入力ボックスで有効とされる値と無効となる値を３つのグループにグルーピングします。
![IMG_0356.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300331/b8e603e6-d413-1e21-fe64-194d96e42590.jpeg)

次に境界値分析を用いて境界値(今回の例では最小値と最大値)を各グループ毎に出します。ここで注意していただきたいのが分類したグループに毎回最大値/最小値が存在するとは限らないということです。そのため今回の場合テストする値は以下の通りになります。
1以下の無効な値のグループ: 0以下は無限なので0のみを境界値とする。
1~10の有効な値のグループ: 1, 10
11以上の無効な値のグループ: 11以上は無限なので11のみを境界値とする。
オフライン環境のPythonにライブラリをコピーする方法

自分のための作業メモです。

### 想定環境

* オンラインにつながったPC
* オフライン状態のPC

それぞれにインストールされているpythonは同一のバージョンである仮定とする。

### 手順

#### 1. オンライン状態のPCでvenv環境を作る

```shell
> python -m venv env
> .\env\Scripts\activate
```
ここでは`env`という仮想環境にした

#### 2. venvに必要なライブラリを全部インストールする

```batch
>(env) pip install opencv-python timm scikit-leaarn
```

#### 3. venvからライブラリ一覧を保存する

```batch
>(env) pip freeze > -r requirement.txt 
```

#### 4. ライブラリ一覧を使って、すべてのライブラリをローカルにダウンロードする

```batch
>(env) pip download -d modules -r requirement.txt 
```

modulesという名前のフォルダが出来るのでそれがコピー対象.

#### 5. ライブラリとrequirement.txtをオフラインPCにコピーする

ここでオフラインPC側の操作に切り替え。
USBメモリなどでmodulesフォルダとrequirement.txtを一式コピーするので良い。

#### 6. オフラインPCでvenvを作る

```batch
>python -m venv env_offline
```
オフラインPC側には、env_offlineという仮想環境を作った。

#### 7. オフラインPCのvenvにコピーしたライブラリをすべてインストールする

```batch
>(env_offiline) pip install --no-index --find-link modules -r requirement.txt 
```
コピーしたrequirement.txtファイルやmoduleフォルダが見えるパスを記述する必要がある。
next-pwa が動かないよー ｳﾜｧｧｧﾝ

# 本記事の対象者

* 最近(2021年11月以降)
* React ＋ Next + next-pwaライブラリを利用したPWAを作成しようとしていて
* 本番環境でService Workerの問題でPWAが動作しない現象に悩まされている

という人。

# 要約

* 現時点(2021-12-02)のnext-pwaライブラリとそのライブラリが利用するworkboxライブラリにおいて、
* デフォルト設定ではService Workerが正常動作しません。
* `next.config.js` に以下のような除外設定を追加する必要があります。

```js
    buildExcludes: [/middleware-manifest.json$/]  // 追加
```

# 現象の再現

## 1. プロジェクト新規作成

node v16.13.0 環境にて、
create-next-app + progressive-web-appテンプレートを使い、
プロジェクトを新規作成します。

```sh
## create-next-app + progressive-web-appテンプレートで 新規プロジェクト my-app を作成
npx create-next-app --example progressive-web-app my-app
```

ローカルの開発環境でdevサーバを立ち上げ、
ブラウザで http://localhost:3000/ を開くと PWAが正常動作する。

```sh
## 開発環境で動作確認
cd my-app
npm run dev
```

## 2. Vercelにデプロイ

その後 Githubにpushして、Vercelにプロジェクトを取り込んでデプロイします。
(手順省略)

しかし、デプロイされたページをブラウザで見てみると、PWAとしてアプリケーション保存ができません。
Chromeのデベロッパーツールで見てみると、以下の問題が目に付きます。

1. ChromeのPWAインストールボタンが表示されない

2. Installabilityに問題あり
`No matching service worker detected. You may need to reload the page, or check that the scope of the service worker for the current page encloses the scope and start URL from the manifest.`
サービスワーカー関連の問題みたい。

3. Consoleエラー
workbox-*.jsの処理にて、`Uncaught (in promise) bad-precaching-response: bad-precaching-response :: [{"url":"https://.../_next/server/middleware-manifest.json","status":404}]`というメッセージ。
middleware-manifest.json が見つからないっぽい。

![err.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111017/6884bb55-fac0-de01-e9dc-6e4ee3e67129.png)


# 何が問題か？

以下で議論されています。
next-pwaライブラリが利用するworkboxライブラリの間にミスマッチがあるか、またはworkboxの問題により、想定外のファイル(middleware-manifest.json)を読み込もうとしているのではないか、と推測しているようです。

[next-pwa not working in Production Envrionment · Issue #295 · shadowwalker/next-pwa](https://github.com/shadowwalker/next-pwa/issues/295#issuecomment-972302942)


# 対応

ワークアラウンドとして、next.config.js に buildExcludesオプションの記述を追加します。
直接の問題となっているファイル(middleware-manifest.json)を明示的に除外するオプションに指定しています。

```js:next.config.js
const withPWA = require('next-pwa')
const runtimeCaching = require('next-pwa/cache')

module.exports = withPWA({
  pwa: {
    dest: 'public',
    runtimeCaching,
    buildExcludes: [/middleware-manifest.json$/],  // 追加
  },
})
```

再度Vercelで確認すると、今度は正常にPWAアプリとしてインストールすることができるようになりました。

![ok.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111017/41dea147-101d-f682-945b-caaff4437cfb.png)

いずれnext-pwaライブラリ、またはworkboxライブラリで対応されると思われますが、今しばらくはこのワークアラウンド対応でしのぎましょう。
ジェネラティブアートとp5.jsって何？

##前置き
Qiita初投稿なので優しい目線でお願いします。
あと、仕事とか全く関係ない趣味の分野のお話です。
#ジェネラティブアートとは
簡単に言うと「デジタルアート」です。だけど、ペンタブとか液タブで書いたかわいいイラストとかではなくて"アルゴリズム"や"数学"を駆使して自律的に生み出されたアートです。
ようは、プログラミングを書いてできる幾何学的なアートが「ジェネラティブアート」です。
注意:細かいことを言うと人間が書いたものも含まれます。
#p5.jsとは
JavaScriptライブラリであり、Webエディタです。
詳しくは、「[Processing](https://processing.org/)」というデジタルアートに用いられるプログラミング言語とその環境をJavaScriptの形に落とし込んだものです。なので、「[p5.js](https://p5js.jp/get-started/)」はJavaScriptの基礎を知っていればほとんどゼロ知識でいじれちゃいます。それに加え、そもそもプログラミング初学者向けのコーディング環境なので、小中学生でも遊べるレベルです。
個人的な感想では、プログラミングでゲーム作るのに近いイメージです。

#簡単なお絵描き説明
もともとあるものと簡単な図形のコメント

```
// 備考：初期装備→☆
// 初めに一回呼び出される☆
function setup() { 
  // キャンバスの作成（単位：ピクセル）☆
  // createCanvas(x座標, y座標);
  createCanvas(400, 400);
}

// 毎秒６０回繰り返される☆
function draw() {
  // 背景色（無彩色:黒 0~255 白）
  // background(数);☆
  background(220);
  
  // x:円中心x座標, y:円中心y座標, r:円の半径
  // circle(x,y,r);
  circle(200,200,100);
  
  // x:楕円中心x座標, y:楕円中心y座標
  // w:横幅, h:縦幅
  // ellipse(x,y,w,h);
  ellipse(100,100,75,50);
}
```

![ダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472594/30ffe867-bd62-9c1d-357b-4db30a7d901e.png)

他には...

こう言うのも簡単にできる
![maru.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472594/80c90941-0f08-787b-6f90-2845e9a807cb.gif)

詳しい機能は自分で調べてださい＿|￣|○



#画像を差し込むとさらに面白い
色々コード書いてみると…
###元画像
![ひよこ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472594/57637624-1087-215c-0b47-136a7fc5face.png)
###結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472594/dfd76808-5dc8-1ca6-6f42-50b4d79404ca.png)
他にも動きのあるものなんかも色々あるから試してみてください。




#遊ぶだけなのにいちいち説明とか読んでられるか!?
Youtubeに動画あげている人もいます。
「[あしべ数学教師](https://www.youtube.com/watch?v=wvPsFPddBIw&list=PLF_7n67X9aX_HiEvMqM2l7ym9rq90tJ1X)」さん
まさに、ジェネラティブアートをp5.js使って解説されております。

「[ヘロンの数学 Heron's math](https://www.youtube.com/watch?v=rdGKg6VbFBo&t=9s)」さん
アートではないのですが、p5.jsを使ってゲームを作っています。

他にも、ドットインストールとかにも動画上がってました。

#その他
ジェネラティブアート作品公開サイト: [OpenProcessing](https://openprocessing.org/browse/#)

#ひとりごと
某デベロッパーエバンジェリストの方が仰るにはコードを"おかずにご飯を食べる人"や"肴にお酒飲む人"もいるくらいらしいから""遊ぶ""くらいはいかがでしょうかってことで…。
【Rails】モデルとテーブルの関係について【初学者の疑問点を簡潔に】

## はじめに
　本記事は、Railsの学習を始めて1ヶ月の初学者が、学習を進めていて疑問に思った点について調べた結果を備忘録も兼ねてまとめたものです。
　そのため、記事の内容に誤りが含まれている可能性があります。ご容赦ください。
　間違いを見つけた方は、お手数ですが、ご指摘いただけますと幸いです。

## 今回の疑問点
　今回の疑問点は、

　　・モデルとテーブルの関係
　
　です。　

 　現在、Twitterクローンを作成しており、フォロー/フォロワー機能の実装の際に上記について疑問を抱きました。
　
## 疑問点についての解説


#### モデルとテーブルの関係について
**`結論：テーブルとコントローラをモデルがつなぎ、モデルとテーブルの関連付けは、それぞれの名前によってRailsが自動的に行う。`**
<dl>
<dt>　モデルとは</dt>
  <dd>　モデルとは、コントローラとテーブルとの繋ぎ役です。コントローラから指示を受けてデータベースとの間で情報のやり取りを行います。簡単に表すと以下の通りです。　　
　　
　　　　　コントローラ ⇄ モデル ⇄ データーベース</dd>
　 　<dt>　データベースとは</dt>
  <dd>　データーベースとは、データを格納する保存先です。さまざまなデータを整理して格納したテーブルが複数保管されています。　</dd>
　　　　<dt>　テーブルについて</dt>
  <dd>　テーブルには、データを整理するために、表計算ソフトのような表形式でデータが格納されています。</dd>
　データベースとテーブルの関係は以下の通りです。
　　※データベースには複数のテーブルが保管されています。
　　　　 データベース　
　　　　　・テーブルa
　　　　　・テーブルb
　　　　　・テーブルc
　　　　　　　  ：　　
　　<dt>　モデルとテーブルの関連付けについて</dt>
 <dd>　モデルとテーブルの関連付けは、それぞれの名前によってRailsが自動的に行います。そのため、命名規則に従い、モデルとテーブルの名前をつける必要があります。命名規則については、[Railsにおける命名規則](https://qiita.com/gakkie/items/3afcd505c786364aa5fa)をご参照ください。
</dd>
</dl>     
## まとめ
　モデルとテーブルの関係については、テーブルとコントローラをモデルがつなぎ、モデルとテーブルの関連づけは、命名規則に基づき付けられたそれぞれの名前によって、Railsが自動的に行うということがわかりました。最後に簡単に図示します。

  　　　　コントローラ ⇄ モデル ⇄ テーブル（inデータベース）
　　　　　　　　　　　　　　　↑関連付けは、モデル及びテーブルの名前により自動的に行われる。
一文字一文字に心を込めるプログラム～Tcl編～

昨年の今頃は空前の湯婆婆ブームで、私も[湯婆婆 Advent Calendar](https://qiita.com/advent-calendar/2020/yubaba)に2件も書かせて頂きました。(実は今年も[ある](https://qiita.com/advent-calendar/2021/yubaba)んですが、さすがにもうニーズは無いようです)

https://qiita.com/qoLop/items/11f0678eeb83003903b8

https://qiita.com/qoLop/items/a5ae9432b5502ff19935

12月を目前に、今年も何かその手のネタが投下されないかとソワソワしていたところ、同じ匂いのする記事を見付け、嬉しくなって便乗させて頂くことにしました。(特にブームにはなっていませんが)

https://qiita.com/chikuwaespresso/items/55fbde95db7ff308e5eb

以下、Tclを使って「これはペンです」という文章に、心を込めるプログラムを作成してみました。

# 1. 素直な実装

## 仕様
文字数分だけループを回します。

## Python

元記事では

```python
a = "これはペンです"
for i in range(len(a)):
    print(a[i] + "心", end='')
```

の出力結果が

```
こ心れ心は心ペ心ン心で心す心
```

になるとされています。

私はPythonを使えませんので、Tclに書き替える第一歩として、まずはCygwinに入っていたPython 2.7.18で動作確認してみることにしました。

```
    print(a[i] + "心", end='')
                           ^
SyntaxError: invalid syntax
```

エラーになってしまいました。う～ん、なぜ?

とは言え、今回はPythonのお勉強ではないので、

* 変数aは文字の配列っぽい
* for文では配列の添字を列挙しておいてループしてるっぽい
* print関数の第2引数は改行抑制っぽい

とテキトーに解釈して話を進めます。

## Tcl

最初に思い浮んだ記述は以下の通りで、

```tcl
set a これはペンです
foreach ai [split $a ""] {
	puts -nonewline ${ai}心
}
```

出力結果もちゃんと

```
こ心れ心は心ペ心ン心で心す心
```

になります。(元記事の脚注1の簡潔バージョンには近いかも)

しかし仕様は「文字数分だけループを回す」となっていますし、無理やり元記事と同じ様な記述にする方が面白そうだったので、以下のように修正しました。

```tcl
proc range length {
	for {set i 0} {$i < $length} {incr i} {
		lappend ret $i
	}
	return $ret
}

proc array_set_str {varname str} {
	upvar $varname var
	set i -1
	foreach c [split $str ""] {
		set var([incr i]) $c
	}
}

array_set_str a これはペンです
foreach i [range [array size a]] {
	puts -nonewline $a($i)心
}
```

無理やりaを配列にしたり、rangeを自作したりして似せてみました。

# 2. joinメソッドを用いた方法

## 仕様
joinメソッドを使う。

## Python

```python
a = "これはペンです"
print("心".join(a))
```

と記述すると、

```
こ心れ心は心ペ心ン心で心す
```

と出力されるとのことですが、Cygwinに入っていたPython 2.7.18で動作確認してみたところ、

```
�心�心�心�心�心�心�心�心�心�心�心�心�心�心�心�心�心�心�心�心�
```

となりました。う～む。

## Tcl

```tcl
set a これはペンです
puts [join [split $a ""] 心]
```

と記述すると、元記事と同じく

```
こ心れ心は心ペ心ン心で心す
```

と出力されました。

たぶんニュアンスは合っているのではないでしょうか。

# おわりに

い心か心が心だ心っ心た心で心し心ょ心う心か心。心T心c心l心で心も心心心が心込心も心っ心た心文心章心に心な心り心ま心し心た心で心し心ょ心う心か心?
Pythonの実行方法（初歩の初歩）

# はじめに
本当に初歩の初歩。Pythonの実行方法を2通り書きます
Windows10で公式Pythonインストール済が対象

ps, 大学の研究でたまにPythonを使う（数か月に一度）と、実行方法がわからず毎回検索していたので、自分のためのメモとなっております。

# 記事の構成
・コマンドプロンプト上で直接コードを記述し実行
・コードを記述し保存したファイルを実行

（初歩の初歩のため1+1=2の計算とhelloの出力のみを行います。）

# 本題
上記の2通りともに、まずはコマンドプロンプトを起動する必要があります。
キーボードで「Windowsキー」＋「r」を同時に押すと、検索窓が表示され、「cmd」と入力しコマンドプロンプトを起動します。

1つめの方法については、簡単です。
コマンドプロンプトで、Python　と入力しエンターを押せば、Pythonが起動し、直接コードの実行が出来ます。

```
C:￥User￥ユーザー名>python  //pythonと入力しエンター
Python //Pythonのバージョンが表示され、起動する
>>>1+1
2
>>>print('hello')
hello
quit()  //Pythonの終了コマンド
C:￥User￥ユーザー名>exit  //コマンドプロンプトの終了
```

Tips
「>>>」が表示されていればPythonは起動できている。

2つめの方法も難しくはありません。

まず、準備としてコードを記述したファイルの作成を行います。
デスクトップ上で右クリック→新規作成→テキストファイル→

```
print(1+1)
print('hello')
```
と記述し、「test.py」で保存。

コマンドプロンプトを起動し、以下のコードを書けば実行可能

```
C:￥User￥ユーザー名>cd desktop  //
C:￥User￥ユーザー名>Desktop>python test.py

#実行結果
2
hello
```

Tips
・コマンドプロンプトでの対話型の実行方法とは異なるため、計算結果の出力にもprint関数は必要
・1つめの方法と違いファイルを実行する方法は、Pythonを起動していない状態で、実行する。

# 終わりに

2つの方法を書いたが、本当に簡単な計算などは対話型（1つ目の方法）で問題ないが、
基本的には2つめの方法を用いた方が、コードを保存しておけるので、あとで見返すなどの管理が楽だと感じる（非エンジニアの独り言）