OmniAICreator/Qiita-1.07M huggingface dataset:
本を色々な形の本棚に詰め込む

#本を色々な形の本棚に詰め込む

本を色々な形の本棚に詰め込む方法をご紹介します。
こんな感じになります。
![PackingBooks.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541880/b2db3c98-6aff-cb5c-1117-71ef3aac7a0e.jpeg)
プロセスはこんな感じ。
![Pack2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541880/5c7e1dfa-998e-32af-3da7-e3512e533cf9.gif)

大事な機能はUVlayoutノードのIslands from Second InputとDOPシュミレーションです。
![Dop_Gravity_03.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541880/6cd22c29-9661-20c9-5df5-b2d96d710ff8.jpeg)


まずはIslands from Second Inputについて。
形状は平面である必要はありますが、Second Inputで差した形状をレイアウトする形状に指定できます。
プリミティブが離れてバラバラになっていても、指定できます。
![UVlayoutNode.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541880/5243dadd-b3ab-7a4a-5c5c-ed2bb41c1878.jpeg)

これがこのように本を本棚に詰めるキーノードです。

![PackingBooks_Gravity.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541880/494c62ee-4552-5963-4773-35c54e6362d1.jpeg)
詳しくは我らがEntagmaさんが丁寧に解説されているので、<a href="https://vimeo.com/296292351">こちらから</a>
なんとHipファイルもダウンロードできます。

ただこのノード、UVをレイアウトするノードです。
なのでこのままでは本と本が接しておらず、隙間が空いていたり
重心が偏っているのに倒れていない、宙に浮いているなど本の配置として不十分です。
![PackingBooks_Gravity_Explanation.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541880/8b0d7246-758b-cc8f-64de-d490b4b46958.jpeg)

そこで本棚をコリジョンとして使い、DOPシュミレーションで本の配置に重力を足してあげます。
![Dop_Gravity_02.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541880/1fd4c491-0d7f-57db-c1b7-243a2d2f3101.jpeg)

![bookshelves_gravity.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541880/6dabf5ea-3662-1247-71e4-41a37d918a31.gif)


こうすることで、よりいい感じの自然な本の配置になります。

と、かなりざっくり書いてきましたが、ここから文章でみなさんに全てをしっかり解りやすく解説する自信がない・・・。
やはり、Houdiniなのでノードを実際にみてもらった方が一番理解がしやすいはず！！！
<b>という事で、HoudiniBLUEPRINTSという便利なウェブサイトがあるのでそちらにhipをアップしました。</b>
ウェブサイト運営者の方、ありがとうございます。

<b><a href="https://hdbp.io/uAjGikDH">こちらから</a></b>

こんな感じでウェブ上でHoudiniのデータを確認できます。
Hipファイルもダウンロードできます。
![HoudiniBlueprints.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541880/555085be-3e2c-abd1-0661-31a61c107073.jpeg)
これを作成したのがHoudini17.0の時ですので、今は標準ノードも色々改良されてよりスマートな方法が簡単に出来ると思いますがそこは目をつぶって頂ければ・・。
あとウェブサイトの仕様で、日本語があるとデータが上がらないのと、ノード数は１００個以下に収める必要がありました。
なので日本語の説明文と本棚のバリエーションが無いのと、本の形状がただのボックスになりました・・・。
すみません・・・。

皆さんも、色々な形の本棚にぎゅうぎゅうに本を詰めてみてください。
それでは少し早いですが、楽しいクリスマスと良いお年を。
初めてやるDDDでデジモンをモデリングする その１

アドベントカレンダー書くための考えた流れを残しておくメモです。

自社でDDDやってるけど、DDD実践したことがない。
個人でお試しでDDDやってみよう。
好きなことの方がモデリングしやすいのでは？
と思い、昔好きだったデジモンアドベンチャーをDDDで表して見ようと思い、
今に至る。

経験ないので、
技術書店で買った
もくもくモデリングの森を旅するチビドラゴンの軌跡
https://taimen.jp/f/867
を参考に試行してみる

# 題材
デジモンアドベンチャーといえば、
デジモンの進化も良し、
子どもたちの成長も良しと
色々ありますが、
広げすぎると何もできないので、
今回は「アグモン」を題材にやってみます。

# いざモデリング
## ユースケース
本に「誰が何をするとこうなる」を書き出してみようとあるので書いてみた。

- アグモンが進化するとグレイモンになる
- グレイモンが超進化するメタルグレイモンになる
- グレイモンが暗黒進化するとスカルグレイモンになる
- メタルグレイモンが究極進化するとウォーグレイモンになる
- アグモンがワープ進化するとウォーグレイモンになる

### 悩んだところ
アグモンがワープ進化するとウォーグレイモンになるのか。
それとも、ワープ進化とは、アグモン、グレイモン、メタルグレイモン、ウォーグレイモンの順に進化していくことをワープ進化というのか。
アニメでは、メタルグレイモンに進化するときは必ずグレイモンへの進化シーン入るけど、
ウォーグレイモンに進化するときは、アグモンから進化のモーション入るよね？って考えると、
自分はアグモンがウォーグレイモンにワープ進化している。の定義に落ち着きました。
で、一応公式確認したところ、メタルグレイモンからウォーグレイモンへの進化は究極進化というそうだ。
http://digimon-adventure.net/tri/evolution/agumon.html
つまり、「究極進化」と「ワープ進化」は言葉として別だという整理になった。

## 用語集
次に本では、ユースケースができたら、
ヒト、モノ、コトに当たる単語を抜き出そう。
って書いてあるので実践。
ここで思ったのは、「ヒト、モノ、コト」ってことは名詞を抜け
ということで「進化する」とかの動詞はここでは抜いてはいけないってことだ。

- アグモン
- グレイモン
- メタルグレイモン
- スカルグレイモン
- ウォーグレイモン

## ドメインモデル
ここでドメインモデル。
用語集に上がったアグモンたちをドメインに。
ユースケースに合わせて関係するドメインに線を引いていく。

![dijimon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483215/bca096aa-4ad6-a3cf-fcbb-5d6824ab23c6.png)

こんな感じになった。
次はこれでクラス図を書いています。
【1分解説】Apacheの同時接続数上限の変更方法

##はじめに
Apacheの同時接続数上限を変更する方法。

##設定を確認しよう

```
$ less /etc/httpd/conf/httpd.conf
<IfModule prefork.c>
  StartServers 5
  MinSpareServers 5
  MaxSpareServers 10
  ServerLimit 256 ★
  MaxClients 256 ★
  MaxRequestsPerChild 10000
</IfModule>
```

##ServerLimitとMaxClientsの値を大きくする
同時接続数上限を上げるには、ServerLimitとMaxClientsの値を大きくします。

##設定反映
httpdサービスを再起動して設定を反映します。
vue error 

## エラー: vue create 

 The engine "node" is incompatible with this module. Expected version "^8.12.0 || >=9.7.0". Got "8.11.3"

### 対処

Expedted versionに合わせる

```
nvm install 8.12.0
nvm alias default　 v8.12.0
```

mac

/usr/local/bin/nodeが優先的に動作している

```
rm -rf /usr/local/bin/node
```

確認

```
nvm ls
```

## エラー: ファイル保存時・ビルド時

[Vue warn]: Unknown custom element: - did you register the component correctly? - For recursive components, make sure to provide the "name" option.

### 対処

Vue.component('xxx',{})が無い
Vue.component('xxx',{})がnew Vueより後に書かれている

## エラー： yarn serve

error: Unexpected console statement (no-console) at ...


### 対処

javascriptでconsole.log を許可するか、console.logを削除する

```json:package.json
{
"eslintConfig": {
    "rules": {
      "no-console": 0
    }
}
}
```
Rで3次スプライン補間の実装

以下のように実装しました。原理は省略（後日書き足すかも）。

```spline3.R
spline3 <- function(X, Y){
  N <- length(X) -1 
# N-1*N-1の行列Hを定義
  H <- matrix(0, nrow=(N-1), ncol=(N-1))
# ujを求める
  h_0 <- X[2]-X[1]
  h_1 <- X[3]-X[2]
  h_Nm2 <- X[N] - X[N-1]
  h_Nm1 <- X[N+1] - X[N]
  H[1,1:2] <- c(2*(h_0+h_1), h_1)
  H[N-1, c(N-2, N-1)] <- c(h_Nm2, 2*(h_Nm2 + h_Nm1))
  vi <- rep(0, N-1)
  vi[1]   <- 6 *((Y[3] - Y[2]) / h_1 - (Y[2] - Y[1]) / h_0)
  vi[N-1]  <- 6 *((Y[N+1] - Y[N]) / h_Nm1 - (Y[N] - Y[N-1]) / h_Nm2)
 
  for(i in 2:(N-2)){
    h_im1 <- X[i+1] - X[i]
    h_i   <- X[i+2] - X[i+1]
    vi[i]   <- 6*((Y[i+2] - Y[i+1]) / hi - (Y[i+1] - Y[i]) / hi_1)
    H[i, c(i-1, i, i+1)] <- c(h_im1, 2*(h_im1+h_i), h_i)
  }
  H_1 <- solve(H)
  u_ <- H_1 %*% vi
  u  <- c(0, u_, 0)
# 求まったujからaj, bj, cj, djを計算
  a <- NULL; b <- NULL; c <- NULL; d <- NULL
  for(j in 1:N){
    a[j] <- (u[j+1] - u[j]) / (X[j+1] - X[j]) / 6
    b[j] <- u[j]/2
    c[j] <- (Y[j+1] - Y[j]) / (X[j+1] - X[j]) - (X[j+1] - X[j]) * (u[j+1] + 2*u[j]) / 6
    d[j] <- Y[j]
  }
  output <- data.frame(a, b, c, d)
  return(output)
  }
```

実は、spline()関数を使えば自分で実装しなくてもよいです。
rnorm()で乱数を20個生成してプロットし、19区間のそれぞれに対して係数a,b,c,dを上のspline3()関数から計算して描画し、最後にRのspline()関数で計算した分（実線）も重ね描きしました。区間以外にも点線で描画されてしまってごちゃごちゃしていますが、実線と点線が重なっていることがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100982/a7731544-8c95-9acb-292f-b965e974ea8c.png)

参考にしたページ
http://www.yamamo10.jp/yamamoto/lecture/2006/5E/interpolation/interpolation_html/node3.html
Raspberry Pi 4 Model B 4GBにNode-REDを整える

この記事は <a href="https://qiita.com/advent-calendar/2019/node-red" target="_blank">Node-RED Advent Calendar 2019 1日目</a>の記事です。

いよいよスタートです！参加される、Node-RED UG のみなさまよろしくおねがいします！

今年もアドベントカレンダー始まりましたね！

さて今回はRaspberry Pi 4 Model B 4GBにNode-REDを整えます。

## 以下を購入しました

![2019-11-30_17h27_14.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56170/ce704d04-edf4-908b-e0f4-5cf7a971bb04.jpeg)

<a href="https://www.switch-science.com/catalog/5680/" target="_blank">【順次出荷】Raspberry Pi 4 Model B / 4GB（Element14製） - スイッチサイエンス</a>

![2019-11-30_17h31_51.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56170/5d6f918d-4b49-d400-7269-ad07a0fa1100.jpeg)

![2019-11-30_17h34_08.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56170/7cf170d5-282b-c33a-ac4c-951873ec28a9.jpeg)

microHDMI 2つとUSB Cによる給電が面白いポイントですね。たまたま家にあった microHDMI と HDMI の変換ケーブルでディスプレイへ接続。Raspbianのイメージは、最新より一つ前の2019/7を使いました。

![2019-11-30_17h37_58.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56170/74825838-5b85-64b0-956e-77935ec617a0.jpeg)

SDカードにイメージを入れて、すんなり起動しました。起動も早い。

## Node-RED アップデート

初期設定。VNC/SSHのオンや一通りのアップデートを行って、いよいよプリインストールNode-REDのアップデートです。

<a href="https://nodered.jp/docs/getting-started/raspberrypi" target="_blank">Raspberry Piで実行する : Node-RED日本ユーザ会</a>

こちらの記事を使います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56170/a1bd612a-319b-8a77-9538-66afb5a56940.png)

スタート！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56170/1c6f2f4d-666f-a619-4004-a2d5340426ca.png)

下部のStartedを見てみる、およそ5分でインストールできました。インターネットの調子がよくダウンロードが早かったのかもしれませんが、処理速度に関連するInstallまわり早かったです。これもRaspberry Pi 4 Model B 4GBのパワーゆえでしょうか。

## Node-REDを動かしてみる

```bash
node-red
```

で起動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56170/8bd6b5de-9e38-14ea-4adf-c333668ec95a.png)

バージョンは1.0.3で最新のものが入っています。1.0感慨深いですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56170/2059a9fd-dc8a-b499-0ecc-78405fc15f7d.png)

inject ノードと debug ノードをつなぎます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56170/9843c54b-770a-aa7b-b113-940482039555.png)

無事、動きました！

Raspberry Piのエコシステム的には、3B+から4へとハードウェアが変わっても、OSなどソフトウェアの影響は受けにくいとは思ったのですが、一通り試せてよかったです。

## Raspberry PiとNode-REDの活用について深堀りしたい方は

こちらの記事 @utaani さんの[Raspberry PiにおけるNode\-REDの活用について](https://qiita.com/utaani/items/7155c62d6c5e96822afb) や、[Node\-RED日本ユーザ会のドキュメント](https://nodered.jp/docs/)も是非参考ください！

## 明日は

明日のNode-RED Advent Calendar 2019の担当は <a href="https://qiita.com/taiponrock" target="_blank">taiponrock</a> さんのです！

楽しみです！
AWS認定ソリューションアーキテクト – アソシエイト試験を受験してきた

これは[ニフティグループ Advent Calendar 2019](https://qiita.com/advent-calendar/2019/nifty)の1日目の記事です。

# はじめに

去る11月30日に、AWS認定試験の一つであるAWS認定ソリューションアーキテクト – アソシエイトを受験してきました。
n番煎じですが、受験体験記を残しておきます。ちなみに技術系の資格受験はこれが初めてです。

試験の概要についてはこちらもご覧ください。
https://aws.amazon.com/jp/certification/certified-solutions-architect-associate/

# 私について

- 新卒２年目エンジニア
- 学生時代は高エネルギー天文学を専攻し、当時はAWSはおろかITに関する知識もほぼゼロ
- 入社後に新規サービスのAWS環境構築や、自社サービスのAWS移行などを担当

私が入社する少し前からAWS導入の波が来ており、幸運なことに業務でAWSに触れる機会は多くありました。
特に、サービスのAWS移行などを通して一般的なネットワークの知識や、[AWS Well-Architected](https://aws.amazon.com/jp/architecture/well-architected/)で挙げられているような概念を身につけることができました。

# 勉強したこと

社内でAWS認定試験取得を目指している者同士で定期的に集まる勉強会が開催されており、私もそれに参加していました。SAAを始めとして、更に上位の資格を取得している先輩も参加しており、有益なアドバイスを多く頂くことができました。

自習としては以下の本のKindle版を購入し、通勤時間に読み進めて一ヶ月ほどで一周しました。
[AWS認定資格試験テキスト　AWS認定 ソリューションアーキテクト-アソシエイト](https://www.amazon.co.jp/gp/product/B07R1H87Y1/ref=ppx_yo_dt_b_d_asin_title_o09?ie=UTF8&psc=1)

基本的なコンピューティングサービスやストレージサービスなどは、業務でも使っていたので、自分の知識を確認するような作業でサクサク読み進めていきました。
逆にKinesisやSQSなどは実際に使用したことがなかったので、解説を読んでも理解が追いつかない部分もありました。これらについて、もう少し重点的に勉強したい気持ちもありましたが、とりえあず試験を受けてみることにしました。
落ちたら勉強し直せばいいやと気楽に考えました。

# 模擬試験
模擬試験は当日の朝に受けました（笑）
もっと余裕を持って受けておいて苦手な箇所を把握し、潰していくべきなのでしょうが、いつの間にか当日になってしまいました。
まあ試験画面のUIに慣れることが出来たので、受けてよかったと思っています。
ちなみに、模擬試験の結果は以下のとおりです。

>総合スコア: 72%
トピックレベルスコア:
1.0  Design Resilient Architectures: 77%
2.0  Define Performant Architectures: 57%
3.0  Specify Secure Applications and Architectures: 83%
4.0  Design Cost-Optimized Architectures: 50%
5.0  Define Operationally-Excellent Architectures: 100%

合格ラインが7割だとすると、かなりギリギリですね。。

# 本番
実際の試験は模擬試験よりも難しく感じました。問題文が長めの問題が多かった印象です。選択肢に聞いたことない機能名が書かれている時などは絶望しかけましたが、なんとか消去法で絞り込んでいき答えを捻り出しました。
正直試験中は受かる気が全くしませんでした。
一通り解き終えた段階で半分ほど時間が余っていました。途中退出する人もちらほらいましたが、私は念の為最初から順に見直してから提出しました。

# 結果
アンケートに答えた後、結果が表示されます。
結果は…合格でした！！

まだアカウントに結果が反映されていないため、総合スコアや得点の分布は確認できないのですが、無事に合格できて良かったです。

# 結び
私の場合は、業務でAWSに触れていたのが大きく合格に寄与しており、対策本はあくまで補助的な役割を果たしていたと思います。
過去の体験記などを見ていると、AWSコンソールを全く使ったことがないのに合格している方もいますが、自分には真似できそうにないです。
実際に使ってみるのが理解を深める一番の近道だと思います。

今後は上位資格の[SAP](https://aws.amazon.com/jp/certification/certified-solutions-architect-professional/)や[AWS 認定 機械学習 – 専門知識](https://aws.amazon.com/jp/certification/certified-machine-learning-specialty/)などにチャレンジしていきたいと思います。

明日は @johnFkennedy さんがteachablemachineを使って、なんかやってくれるそうです。
お楽しみに！
docker & gulp(brower-sync)で環境作りたい！

## やりたいこと
docker-composeで作ったwordpressのローカル環境でgulpのbrowser-syncを使いたい

###　課題
- brower-syncのことをよく知らない
- dockerで立ち上げたサーバーとbrowser-syncでのサーバーをリンクさせたい

### 参考サイト
https://qiita.com/Black-Yamasan/items/5b7d5feceed95cebbcad


##　browser-syncについて調べる
https://www.browsersync.io/docs/gulp
↑公式のドキュメントです。公式読む癖つけないと。
以下、公式から引用

```javascript

var gulp        = require('gulp');
var browserSync = require('browser-sync').create();

// Static server
gulp.task('browser-sync', function() {
    browserSync.init({
        server: {
            baseDir: "./"
        }
    });
});

// or...

gulp.task('browser-sync', function() {
    browserSync.init({
        proxy: "yourlocal.dev"
    });
});
```

`var browserSync = require('browser-sync').create()`
の`create()`って何？と思って調べたら、
https://www.browsersync.io/docs/api
こちらの公式に以下の記述が。
>Calling .create() means you get a unique reference & allows you to create multiple servers or proxies.

複数のサーバを建てられるしuniqueな参照（いまいちわからん）になるので推奨とのこと。

`server:{}`では指定したファイルでサーバーを構築でき、
`proxy:{}`では proxyで構築できる。

私の作業の場合はdockerですでに建てたサーバーを参照したいので、`proxy:{}`の方を使います。

## 実際に設定してみる

```javascript
var browserSync = require('browser-sync')

function browserSyncTask() {
  return browserSync.init({
    proxy: 'localhost:8000'
  })
}

function bsReload() {
  return browserSync.reload()
}

exports.browserSync = browserSyncTask
exports.bsReload = bsReload
```

これでlocalhost:3000で開くようになり、
bsReloadを好きなところで呼び出して自動リロードできるようになります。やったぜ！
Let'sEncryptのSSL証明書を更新忘れたので再作成した話

はい。更新しなさいメール📩が来てたのは確認したのですが、更新忘れていました💦

と言うことで、次回も同じことをしても良いように（しないようにじゃなく笑）、
備忘録として残しておきます。🗒

# 環境
|種類|バージョンなど|補足|
|:-:|:-:|:--|
|OS|CentOS 7.6||
|Httpd|Nginx|Apache等、他の場合は置き換えて実行ください。|

# 手順
1. httpd停止
2. 既存の証明書を削除する
3. 作成し直す
4. httpd起動

# httpd停止
**動いている状態だと失敗する為、停止します。**
*私の環境ではnginxを使っているため、nginxを停止しますが、*
*httpdなど環境によって置き換えて下さい。*

```terminal:httpd停止
systemctl stop nginx
```

# 既存の証明書を削除する
*削除しなくても再作成は出来ますが、同じドメイン名で作り直すため、*
*削除しないと作成されるファイルに* **自動で連番** *がつけられてしまいます。*
*その為に、一旦消しましょう。消すファイルは以下の通りです。*

 * /etc/letsencrypt/archive/{ドメイン名}
 * /etc/letsencrypt/live/{ドメイン名}
 * /etc/letsencrypt/renewal/{ドメイン名}.conf

**もちろん、心配な場合は、バックアップ（退避するなど）した方が良いです❗️**

# 作成し直す
```terminal:作り直す
certbot certonly --standalone -d {ドメイン名}
```
*「certbot」ではなく「certbot-auto」を使う方法のサイトもあるようですが、*
*私の環境には入っていなかったので、「certbot」を使いました。*

# httpd起動
```terminal:httpd起動
systemctl start nginx
```

# 更新されているか確認
ブラウザで更新対象のドメインにアクセスし、SSL証明書が更新されていればOKです！

以上、ありがとうございました。
モデル　データ取得


テーブルからデータを取得します

モデルから取得したデータはコントローラーに送られます。

その為には**ActiveRecordクラス**が必要です

|                         |                                        |
|:----------------------- |:--------------------------------------|
| メソッド                   | 用途                                   |
| all                     | テーブルの全てのデータを取得する             |
| find                    | テーブルのレコードの内、ある1つのデータを取得する |
| new                     | クラスのレコードを生成する         |
| save                    | クラスのレコードを保存する         |

```post_controller.rb
def index

@post = Post.all #大文字Pからスタート　
@post_2 = Post.find(1) #1番のレコードを取得
```

以上でモデル内からデータを取得し、コントロール内で定義しているインスタンス変数に代入した
SQLでエラーが起きた時の調査法

#はじめに
今回はSQLクエリでエラーが起きた、またはプログラムに組み込んだSQLでエラーが発生した場合の調査のコツを自分なりに書いていこうと思います。殆ど自分用のメモみたいなものです。

#自己紹介
過去の記事でも書いてますが、社内SEをやっています。
ただ最近はプログラムだけじゃなく、RPA、PM業、法改正対応などもやってるので、また何でも屋に戻った感じです。

#SQLエラーは何で意外と苦戦する？
SQLは短いプログラムです。でも複雑な結合とかで長文になると、エラーが起きた時に原因が非常に分かり辛いのもSQLです。
普通のプログラムより、SQLクエリエラーの方が対処が苦手って人もいるんじゃないかな？

##１行で構成されている
SQLは見やすいように改行しても、**実態は１行の処理**です。
そのため、他のプログラムと違ってステップを出してくれない！
ここがエラーを探しにくい原因でしょう。

##エラーコードが多い
とにかくエラーコードが多い！
にも関わらず、Oracle、DB2、MySQL、PostgreSQLと種類多い、構文違う、エラーコードも違う…
対処し辛いですよ（統一してくんねぇかなぁ、割りと真面目に）

#エラー原因の探し方
とまぁ、自分なりの原因を並べたところで、次は自分なりの探し方を書いていきます。

##FROMから見る！
SQLを習う時は、大抵**SELECT句**から習うことが多いと思います。個人的には既にこれが罠だと思います。
プログラムは基本的に上から下に流れていくものだから学習としては正しいんですが…SQLは別にSELECTから読み込まれるわけじゃないんですよね。

###SQLの実行順序
色々端折りますが、色々な関数を除いた基本構文だけの場合、

1. FROM（ターゲット）
2. WHERE（条件）
3. SELECT（結果）

の順番に実施されます。
実際はJOINやORDER BYも絡むともっと順番が複雑化するんですが、SQLの基本のキだけピックアップするとこんな感じ。（もっと詳細な順序を知りたい人は調べてみましょう！）
上の通りSELECTは結果、だから順番的には最後。そして、**SQLエラーは実行順序の順にエラーが出力**される。
なので、エラーが起きたから必死に上から調査！ってやると、時間だけかかっちゃう。
でも、プログラム組んだことある人は習性で上から調査する…
時間かかる…
**罠か何か？**

##構文エラーは怖くない！
構文エラーも意外とクセモノ。１文で構成されているのでピンポイントでここがおかしいって出してくれないので分かり辛いです。（曖昧には出してくれる）
エラーに出力されたクエリの一部を使って、作成したクエリに検索をかけるとおかしい部分だけは分かるので、その場所をターゲットに自分流の決め打ち的な調査法をポイント毎に書いていきます！
※関数間違いでのエラーは書いてません、そこは正しい使い方を調べよう！

###FROMで発生した場合
* テーブルが存在していない
* スキーマが違う
* JOIN内に書いた別名間違い（個人的に一番多い）

###WHEREで発生した場合
* FROMで指定した別名orテーブル名違い（真面目にこれくらいしかWHEREでは起きない）

###SELECTで発生した場合
* FROMで指定した別名orテーブル名違い（FROMでサブクエリ使った場合とかに多い）
* カンマ抜けてる（よくやらかす、むしろ個人的には一番頻度多い…）

###SyntaxError 〜 "'"の場合
* プログラムで設定した変数に「'（シングルクォーテーション）」が紛れてる（プログラム内にSQLクエリを組み込んでるとよくある）

###SyntaxError 〜 ","の場合
* プログラムで設定した変数が空（ブランク）になってる（UPDATEやINSERTでよくある、特に文字列だけど数値型に書き込む場合）

#最後に
最近、意外とSQLエラーって解決するの苦手な人って多いなぁと思って、簡単にですが自分がやらかしやすいSQLエラーの原因と対処法を書いてみました。
SQLエラーの対処が苦手な人が多少は参考にしてくれると嬉しい限りです。

さて最近UiPathをいじったので、次回はそっちの話を書こうかな。
C#でJSONを扱うときはSystem.Text.Jsonを使う

# はじめに

「C# JSON」とかで検索するとDataContractJsonSerializerかJson.NETを解説した記事がよくヒットします。
しかし、[DataContractJsonSerializer クラス](https://docs.microsoft.com/ja-jp/dotnet/api/system.runtime.serialization.json.datacontractjsonserializer?view=netframework-4.8)のページを見ると「JSON へのシリアル化と JSON からの逆シリアル化を含むほとんどのシナリオでは、system.string名前空間のツールを使用することをお勧めします。」と書いてるので、使えるならこっちを使った方がよいと思います。

# 使用条件

[.NET での JSON のシリアル化-概要](https://docs.microsoft.com/ja-jp/dotnet/standard/serialization/system-text-json-overview)から抜粋。

.NET Core 3.0の場合はデフォルトで入ってます。
.NET Standard 2.0以降、.NET Framework 4.6.1以降、.NET Core 2.0以降はSystem.Text.Jsonのnugetパッケージを入れることで使えるようになります。

# 使用方法

[.NET で JSON をシリアル化および逆シリアル化する方法](https://docs.microsoft.com/ja-jp/dotnet/standard/serialization/system-text-json-how-to)から抜粋。

## シリアライズ

System.Text.Json名前空間をusingして次のようなコードでシリアライズできます。
SerializeToUtf8BytesというUTF8を高速で処理できるメソッドもあります。

```csharp
string jsonString = JsonSerializer.Serialize(serializeObj);
```

`[JsonIgnore]`を使用してシリアライズしたくないプロパティを除外することができます。
下の例では自動実装じゃないプロパティを除外しています。

```csharp
class Test
{

    public double Property1 { get; set; }

    // 自動実装ではないプロパティを除外する。
    [JsonIgnore]
    public double Property2
    {
        get => Property1 * 2;
        set => Property1 = value / 2;
    }

}
```

## デシリアライズ

デシリアライズは下記のコードで行えます。
ジェネリックなのでキャストの必要が無いところがいいですね。

```csharp
TestClass deserializeObj = JsonSerializer.Deserialize<TestClass>(jsonString);
```

# メリット

- 基本的にジェネリックメソッドなのでキャストやtypeofが必要ない。
- `[DataContract]`みたいなアノテーションが不要。

# 参考

文中でも取り上げましたが再度まとめ。

- [.NET での JSON のシリアル化-概要](https://docs.microsoft.com/ja-jp/dotnet/standard/serialization/system-text-json-overview)
- [.NET で JSON をシリアル化および逆シリアル化する方法](https://docs.microsoft.com/ja-jp/dotnet/standard/serialization/system-text-json-how-to)
【Julia】汎用AIプログラミングシステムGenを使ってみた

# LT資料リンク

[![thumbnail](http://image.slidesharecdn.com/aboutgeneral-purposeaiprogrammingsystemgen-191130020555/95/slide-1-1024.jpg)](https://www.slideshare.net/JunKaneko3/aigen)

昨日(2019/11/29)、[JuliaTokyo#10](https://juliatokyo.connpass.com/event/153435/)に参加しました。私、どちらかというと隠匿な人間 ~~(陰キャ)~~ なのでユーザー主体のコミュニティに少し苦手意識があるのですが、それでも昨日はパッケージ開発者、IDE開発者、日本語翻訳の方のリアルな姿を見れて感動した。次もまた参加したいですね。そんな中表題の件でLTに挑戦したので、資料をslidesahreにアップしておきます。

間違いの指摘・ご意見等ございましたら、コメントでお知らせいただければ幸いです。
動的に表示されるHTMLを確認したいがデベロッパーツールをクリックすると消えてしまうとき

例えばこのサイト。
http://i-like-robots.github.io/react-tags/

<img width="1106" alt="Screen Shot 2019-11-30 at 17.06.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34733/73e9e8b3-203a-a217-3fc0-6522643244cd.png">

`input`要素をフォーカスするとタグをサジェストされるが、要素を確認しようと、ChromeDevToolを操作すると、サジェスチョンが消えてしまう。

<img width="732" alt="Screen Shot 2019-11-30 at 17.08.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34733/bb4737b7-708a-8619-4c35-02e7e4c261db.png">

こういう`is-focused`みたいなそれっぽいクラスをいじって表示できればいいが、だめな時は方法を調べるのがめんどくさい。
`Break on > subtree modifications`機能が使えそう。

<img width="610" alt="Screen Shot 2019-11-30 at 17.11.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34733/ab374401-f9db-feba-9dca-523056d85136.png">

子要素のHTMLが変わるときにJSを止めてくれるので便利。

<img width="1261" alt="Screen Shot 2019-11-30 at 17.11.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34733/3684e13d-7950-9c99-7c2e-cfdfe6f298cf.png">
InDesignってやつのザックリ紹介

# InDesignって知ってますか

 Adobeが販売するDTPソフトウェアです。文書処理ソフトウェアとしてはWYSIWYGのWordやtexなどがあります

## 個人的に重いInDesignの良いところ

　texよりはGUIなので直感的でWordよりはキッチリ作れます。マスター機能が結構便利で、繰り返しになるようなデザインを簡単に適用できます。しかも複数のマスターを組み合わせて適用したりできるので、ある程度長さのある書籍ではかなり役に立つと思います。

 あまり使われませんが、インタラクティブなコンテンツを埋め込むことができます。pdfはそもそもAdobeの規格なので、ここら辺で強みが出ますね。

## 悪いところ

　数式入力にサードパーティソフトがいるところ。理系学生には使えなかった。

<br><br>

 学習ソースとしてはAdobeの[チュートリアル](https://helpx.adobe.com/jp/indesign/how-to/beginners-tutorial-1.html?playlist=/services/playlist.helpx/products:SG_INDESIGN_1_1/learn-path:get-started/set-header:ccx-designer/playlist:ccl-get-started-1/ja_JP.json&ref=helpx.adobe.com)が無難だと思います（動画最初のうるさいライザーサウンドにご注意ください。早く治してくれ～）

<br>

こんなかんじ

![履歴書サンプル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106327/f1883988-b83d-e88a-691a-587fc623b25e.png)
![履歴書サンプル2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106327/41bfe045-895b-9a93-491b-8158b6b18665.png)
![履歴書サンプル3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106327/c566c245-adf2-aff9-a5ac-0702a3c6a5e6.png)
![履歴書サンプル4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106327/02454c2e-f7db-c17e-07af-34b73cffe45a.png)
曲率

コンピュータ支援の幾何学的設計（CAGD）の基礎として、曲線・曲面の微分幾何学は形状処 理分野でよく使われています。 
パラメータにより表現された曲線・曲面をパラメータで微分することで、接線・法線・曲率などの 情報が得られます。 
[アルモニコス](https://www.armonicos.co.jp/) のアプリケーションは、上記情報を算出し、内部の計算で多用しています。 
今回は、曲線または曲面の曲がりの程度を表す量である曲率について紹介します。

# 曲線の曲率

微分幾何学では、曲線長（弧長）$s$ をパラメータとして、曲線 $\boldsymbol{r}$ を表すことができます。

```math
\boldsymbol{r}=r(s)
```

2階微分可能な曲線の点 $P$ での近似円は曲率円といいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316651/2de90d4c-f20c-df8f-3230-c750361936ae.png "曲率円")

曲率円の半径 $\rho$ は曲率半径といいます。
曲率半径の逆数は曲率です。

曲線を弧長で2階微分すると、

```math
\boldsymbol{k}=\frac{d^2\boldsymbol{r}}{ds^2}=\frac{\boldsymbol{n}}{\rho}=\kappa\boldsymbol{n}
```

が得られます。ここで $\boldsymbol{k}$ は曲率ベクトル、nは主法線方向の単位ベクトル、$ρ$ は曲率半径、$κ$ は曲率です。

[spScan](https://www.armonicos.co.jp/products/spscan/) で表示した曲線の曲率：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316651/653b4636-61d3-5714-2d00-a64f4ca2cfe6.png "spScanで表示した曲線の曲率")


# 曲面の曲率

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316651/6463d119-c6c9-1f08-bd0d-14d83a34b005.png "曲面の曲率")
出典：Nicholas M. Patrikalakis.; Takashi Maekawa. Shape Interrogation for Computer Aided Design and Manufacturing (Springer-Verlag, 2010), 424p. p.56 : 図3,6

曲面上の点 $P$ を通る曲面に乗る曲線の、点 $P$ での曲率ベクトルは以下で表せます。

```math
\boldsymbol{k}=\kappa\boldsymbol{n}=
\boldsymbol{k}_n+\boldsymbol{k}_{g}
```

ここで $\boldsymbol{k_n}$ は法曲率ベクトルであり、 $\boldsymbol{k_g}$ は測地線曲率ベクトルです。

$\boldsymbol{k}_n$ は $\boldsymbol{k}$ の曲面法線方向への投影です。

```math
\boldsymbol{k}_n=\kappa_n\boldsymbol{N}
```
ここで $\kappa_n$ は曲面の法曲率です。

法曲率の最大値 $\kappa_{max}$、最小値 $\kappa_{min}$ は主曲率といいます。また、

```math
K=\kappa_{max}\kappa_{min}
```
```math
H=\frac{\kappa_{max} + \kappa_{min}}{2}
```

を、それぞれガウス曲率、平均曲率といいます。
各曲率を利用し、形状の区分や特定形状の認識が可能になります。
例えば [spScan](https://www.armonicos.co.jp/products/spscan/) では曲率によってメッシュをグループ分けし、そのグループごとに曲面を作成できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316651/561d4d46-ef12-e508-af11-315551ec8e53.png "spScanでのメッシュグループ分け、曲面作成")

[spGauge](https://www.armonicos.co.jp/products/spgauge/)・[spScan](https://www.armonicos.co.jp/products/spscan/) では、主曲率を利用し、プリミティブ形状のメッシュを一括選択することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316651/3c7a1a5d-8d63-8571-0190-f667b8c6d43a.png "spGaugeによる円錐形状一括選択")

[spGauge](https://www.armonicos.co.jp/products/spgauge/) の打点検査機能では、ガウス曲率を利用し、メッシュ上の打点形状を抽出しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316651/9bee7d78-b21d-fc09-0954-a29bd0a4fb91.png "ガウス曲率を利用したspGauge打点抽出（イメージ）")

# 参考文献
[Nicholas M. Patrikalakis.; Takashi Maekawa. Shape Interrogation for Computer Aided Design and Manufacturing (Springer-Verlag, 2010), 424p. ](https://www.springer.com/gp/book/9783540424543)

# 本記事のPDF版
https://www.armonicos.co.jp/hola/hola70/
モデル作成

モデルの作成手順

ターミナル
rails g model モデル名

マイグレーションファイルが作成される

**マイグレーションファイル**とは.....
モデル内のテーブルを設計することができるファイル
例）モデル内のカラム名の変更

```
def made
  create_table :posts do |t|　#Postテーブルを作成する
      t.text :content　　　  　#t.型の名前　：カラム名
      t.timestamps           #Railsが独自に用意している特別なもの
  end
end
```

マイグレーションファイル記載後、データベースに記載内容を反映させる

```
rails db:migrate 
```

テーブルに記載事項が追加さてます。
[C# 8.0] 整数の範囲とのパターンマッチ

C# 8.0から使用できるswitch式で、整数の範囲とマッチさせたい場合、破棄パターン+`when`句で下記のようになります。

```cs
var num = 100;
var rsult = input switch {
    _ when 1 <=  num && num < 13 => "special",
    _ => "",
};
```

これでも十分ですが、どうせならC# 8.0から導入された`System.Range`構造体(`1..13`)を使用したいです。
しかし、`System.Range`構造体は配列内の範囲を表すことを想定されて設計されているため、特定の値が含まれるかどうかを判定するメソッドがありません。

`Enumerable.Range()`メソッドを使えばもう少し綺麗に書けますが、ヒープにオブジェクトが作成されるのが少し嫌なので拡張メソッドを用意します。

## 拡張メソッド
```cs
static class RangeExtention
{
    public static bool Contains(this Range range, int value)
    {
        var start = range.Start.IsFromEnd ? (int.MaxValue - range.Start.Value) : range.Start.Value;
        var end = range.End.IsFromEnd ? (int.MaxValue - range.End.Value) : range.End.Value;
        if (start > end)
            throw new ArgumentOutOfRangeException(nameof(range));
        return start <= value && value < end;
    }
}
```

```cs
var num = 100;
var rsult = num switch {
    _ when (1..13).Contains(num) => "special",
    _ => "",
};
```

### 注意点

`System.Range`構造体を使用するので、制約があります。

- 型は`int`しか使用できない。
- 値の範囲は0以上しか使用できない。(`Enumerable.Range()`メソッドを使えば負値も可能)
- `(2..0)`のような、大小関係が逆転している範囲は例外を投げるようにしている。
- 半閉区間しか使用できない。  
  (`System.Range`構造体の想定は半閉区間なのでそれに従っている。)
TortoiseSVNで自分専用コミットログのテンプレートを使用する

## 概要

TortoiseSVNでコミット時に入力するログ（コメント）に初期表示値を設定する方法です。
ただし、他の人には影響を与えないこととします。

## なぜにWhy？

コミットログの初期値を設定する方法をググると、
サーバフックで実現するかプロパティを使うかのどちらかしか出てきません。

ただし、上記の方法では同じリポジトリを使う全ての人に影響を与えてしまいます。

普通の使い方をする場合はむしろその方が統一性があって都合が良いことでしょう。
ですが、そうは言っても簡単には全使用者にこのテンプレートで行きましょうと言えない場合もあるのではないでしょうか？

というわけで、自分だけにしか影響しない方法で実現したいと思います。

## 方法

結論から言うと、 **クライアントフック** を使用します。
フックとは、コミット等の処理が実行される際にあらかじめ用意していたスクリプトを実行する仕組みのことです。
通常はサーバ側に設定するものですが、TortoiseSVNにはクライアント側にも設定することができます。

### フックスクリプトの作成

以下の通りスクリプトを作成します。

```javascript
//=================================================================================================
//コマンドライン引数（パラメータ）の取得
//=================================================================================================
var objArgs = WScript.Arguments;
var num = objArgs.length;
if (num !== 3)
{
    WScript.Echo("Usage: [CScript | WScript] comment_template path/to/pathsfile path/to/messagefile path/to/CWD ");
    WScript.Quit(1);
}

var messageFilePath = objArgs(1);

//=================================================================================================
//実行部
//=================================================================================================
var objFso = WScript.CreateObject("ADODB.Stream");
objFso.Type = 2; // 1:バイナリ、2:テキスト
objFso.Charset = "UTF-8"; //SVNログメッセージはUTF8を使用する
objFso.Open();

// ここにログメッセージの初期設定値を書き込む(第2引数が1の場合は改行する)
objFso.WriteText("【】《課題番号:》　", 1);
objFso.WriteText("", 0);

// BOMを除去する
objFso.Position = 0;
objFso.Type = 1;
objFso.Position = 3;
var bin = objFso.Read();
objFso.Close();

// 指定されたファイルに上書き保存する
objFso.Open();
objFso.Write(bin);
objFso.SaveToFile(messageFilePath, 2);
objFso.Close();

WScript.Quit(0);

```

ファイル名は「comment_template.js」とします。（任意の名前でも大丈夫です）

### フックスクリプトの登録

TortoiseSVNの設定画面を表示します。
ツリーから「フックスクリプト」を選択します。
その後「追加」を押下します。

![SVN_Comment_Template_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145504/597705ca-7478-a9c3-a596-47c306695d60.png)

フックの種類は「Start Commit フック」を選択します。
作業コピーのパスはチェックアウトしたフォルダのパスを指定します。
実行するコマンドラインは「WScript {先ほど作成したスクリプトファイルのパス}」を指定します。
「スクリプトが終了するまで待機する」「実行時にはスクリプトを非表示にする」にチェックを付けます。
「OK」ボタンで登録完了です。

![SVN_Comment_Template_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145504/810ebd90-8ef8-d3d4-ae09-27bd7ef27647.png)

これでコミット時に初期値が表示されるようになります。
G検定(ジェネラリスト検定)を合格するまでにやったこと

# はじめに
2019/11/9(土)にG検定を受けて合格するまでにした勉強内容を記載します。
文系大学卒でAI等の事前知識はほぼありませんでした。なんとなく聞いたことあるぞくらいです。
これから勉強して合格目指す人の参考になれば幸いです。

# 1ヶ月前～2ヶ月前
いろいろな人がオススメしていた[AI白書2019](https://www.amazon.co.jp/dp/B07QGRH7F6)を購入し、少しずつ読み進めていきました。

ただし、途中から何を言ってるのか私には理解できませんでした。。。
ある程度、知識がある前提で書かれていることがあります。
それでも飛ばし飛ばし読んでいき、何度か読めば理解できるかと思いましたが3分の1くらい読んだところで諦めました。
読む気がなくなり、どんどん読まなくなっていきました。
G検定を諦めるか少し悩みました。

# 3週間前～
問題集を解いて暗記すれば何とかなるのではと思い、AI白書の理解を諦めて下記の本で学習始めました。
・[徹底攻略 ディープラーニングG検定 ジェネラリスト 問題集 徹底攻略シリーズ](https://www.amazon.co.jp/%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5-%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0G%E6%A4%9C%E5%AE%9A-%E3%82%B8%E3%82%A7%E3%83%8D%E3%83%A9%E3%83%AA%E3%82%B9%E3%83%88-%E5%95%8F%E9%A1%8C%E9%9B%86-%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-ebook/dp/B07NDVCN99)

この本は、非常にわかりやすかったです。
解説を読めば1から教えてくれるので、誰でも理解できるように書いてくれています。
この本を試験直前まで勉強し、4周ぐらい解いて問題集の問題はほぼ一瞬で解けるようにしました。

# 試験本番
2時間で240問程度？と問題数は非常に多いです。
ググりながら試験を受けることができますが、単純計算で1問30秒で答えていかないといけないので、一瞬で解ける問題が多くないと調べる時間が作れないです。
問題集を暗記したおかげで、4割程度は一瞬で解くことができました。
しかし、残りの6割は自信がなかったり全くしらない問題がでました。
特に最新の法律の問題などは試験中に勉強して答えました。
後半が問題集で勉強した内容中心でしたが、前半は知らないところが多く焦りました。。
わからないところは調べて、見直しも終わって残り10分で試験を終了しました。
試験中は調べることもあるので、モニターを使って2画面(試験用の画面と調べる用の画面)で受けていました。

# 合格発表
2019/11/18(月)にメールが来て合格したことを知りました。
試験を受けてから1週間以上掛かってきたので、けっこう遅いという印象です。

# 最後に
問題集をひたすらといて、暗記して、本番で調べながら問題を解いていけば合格できるなと思いました。
G検定を取って、まずは一般常識的なことがわかったのでここからAIについて勉強を進めディープラーニングのモデルを作っていけるようになっていきたいと思います。
flaskでHello world

# 目標

ブラウザに"**Hello, world!**"と表示するだけ。
![fisrst-flask.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226452/b2684b37-1ea1-9dd5-92c3-3cab743334bc.png)

# 環境

* Windows 10 Pro
* Python 3.7.5
* flask 1.1.1

# ディレクトリ構成

これだけ。
![tree.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226452/6242f8db-b203-f927-0399-0c999f4761b8.png)

# ソースコード

`index.html`はVSCode上でEmmetで`!`と打ってtabで展開したものに`<h1>Hello, world!</h1>`を書いただけ。

```html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <h1>Hello, world!</h1>
</body>
</html>
```

`sample.py`で`port='5555'`としてるのに特に理由はない。

```python
from flask import Flask, render_template

# インスタンス化
app = Flask(__name__)

@app.route('/')
def index():
    return render_template('index.html');

if __name__ == '__main__':
    app.run(host='0.0.0.0', port='5555', debug=True)
```

# 起動

```
>python sample.py
```
.Netのクラスオブジェクトの比較の謎について

.Netが内部で管理しているメモリ上のオブジェクトと、どのオブジェクトがどの変数名なのかという紐づけがあり、それをC#などでプログラムで制御しています。
クラスの比較や代入の書式といったプログラム側からだとわかりずらいので、内部管理側の制御方法とプログラム記述といった順序でまとめてみました。


画像にまとめたものがわかりやすいので載せています。

![クラスの比較.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374317/da310076-33f8-de13-a75d-d557022f2319.png)

どうして「オブジェクト同士が同じか」というものが直接的に書かれたページが少ないのか、といった理由が雰囲気だけでも伝わればと思います。

.Netといっても、アセンブラやCでメモリ参照するというのと、概念に違いは無く、
そのプログラムはいったい、メモリ上に実在するデータの「どれ」を参照しているのか、ということをイメージする必要があります。


例えば、C#の関数の引数でclassオブジェクトを渡されたとき、その関数内で class USAinfo RA = new USAinfo(); として作ったとき。
引数のclassオブジェクトの参照先をこのRAの参照先にしたいのですが、

private void main()
{
    class USAinfo MOTO = new USAinfo(); 
    UMM(MOTO);
}

private void UMM(class USAinfo in_class_obj)
{
    class USAinfo RA = new USAinfo(); 
    in_class_obj = in_class_obj;
}
としても、あくまで『in_class_objの参照先が変わるだけ』なので、MOTOの参照先は変わりません。
そんな感じです。
読書メモ：ソフトウェアテストの教科書

# 第1章
懐かしい内容。
品質特性で、セキュリティが機能性に入っていたなんて、今だと不思議な気がする。
# 第2章
・ホワイトボックステスト→内部の構造に着目したテスト
・ブラックボックステスト→入出力に注目したテスト
　・境界値テスト
　・デシジョンテーブルテスト
　・状態遷移テスト
　・組み合わせテスト
・静的テスト→ソフトウエアを動作させないテスト。レビューなど。
・動的テスト→ソフトウエアを動作させるテスト
・インスペクション→公式性の高いレビュー。公式記録に残すべき文書に適したレビュー
・テクニカルレビュー→専門知識をモツレビュアーによるレビュー
・非公式レビュー→ペアレビュー。特に決まった形式はない
・ウォークスルー→作成者がレビューを作成し、レビュアーにコメントを求める形式で進める
# 第3章
ホワイトボックステストのこと
# 第4章
・テスト計画
　テスト工程の目的と範囲を明確にする
　テストアプローチ、人員、環境、リソース、スケジュールのことなど立案
・テスト設計
　テストの種類、目的、テスト対象機能、テスト技法、インプットとアウトプット、合否判定基準を定める
・テストケース作成
　テスト手順、機体結果、判定欄を記載するドキュメント
・テスト報告
　テスト結果を要約し、合否判定やその根拠となるデータを示す
# 第5章
・同値クラステスト
　同じ動作をする条件の集まりごとにテストを行う技法
・境界値テスト
　仕様条件の境界となる値とその隣接した値に対するテスト
# 第6章
・デシジョンテーブル
　複数の条件によって決定されるソフトウエアの動作の一覧表
　（これ、昔の詳細設計書だよね）
# 第7章
・状態遷移テスト
　メリット
　　仕様が曖昧な箇所に潜む欠陥を発見できる
　　状態遷移の不備を発見できる
# 第8章
・組み合わせテスト
　複数の条件を組み合わせてソフトウエアの動作を確認するテスト
　・2因子網羅
　　２つの因子の組み合わせをすべて網羅する
　　「多くの欠陥は２因子間で見つかる」の定説
# 第9章
　テスト技法チャートを用いることで、要求に適したテスト技法を見つけやすくなる
# 第10章
　テストフェーズごとにテストドキュメントを作成する理由
　　・テスト工程間で品質が劣化することを防ぐ
　　　→担当者間の認識の齟齬を防ぐ
　　・テスト対象のソフトウエアの品質状況を可視化する
# 第11章
　・テスト設計仕様書の書き方
　　追跡性
　　関連性
　　定義の理由
　　記述の粒度
　　規模
# 第12章
　モニタリング
　　・時間経過にともなう状況変化の把握
　　・不具合の分類による傾向の把握
　　・信頼度成長曲線を用いたモニタリング

# 感想
　古くなってる部分もあるけど、逆に今のやり方と比べて、なにが普遍的なのかがわかる（ような気がする）
何も知らずにchshした話

前回[何も知らずにHomebrewアップデート](https://qiita.com/masajiro/items/5473160d89e5096f5b19)
したら、ターミナル起動直後に↓これが出るようになった

```
The default interactive shell is now zsh.
To update your account to use zsh, please run `chsh -s /bin/zsh`.
For more details, please visit https://support.apple.com/kb/HT208050.
```

直していきたい。指定されたURLへ行くと404！？
仕方なくrunしろと書かれてるコマンドを

```
chsh -s /bin/zsh
```

再起動したら $ が % になってる。。。？！

```
masajiro@MacBook-Pro ~ % 
```

ちょっと意味わからないけどこれで一応終わりか

完

追伸：意味わかったわ[デフォルトでbashからzshに変わる](https://news.mynavi.jp/article/osxhack-241/)

Macお前、変わっちまったな...

#合わせて読みたい？
[osx-catarinaでシェルがbashからzshに変わったので、zshの設定を](https://etama.jp/osx-catarinaでシェルがbashからzshに変わったので、zshの設定を/)

MacOS Catalina、BashをやめてZshに
https://www.infoq.com/jp/news/2019/07/macos-ditches-bash-for-zsh/

Catalinaでデフォルトシェルが「zsh」に変わる、bashとの違いは?
https://qiita.com/tukanpo/items/c845b7d34227c9d31cff

【macOS】10.15 Catalinaのzshプロファイルに対応する
https://www.yokoweb.net/2019/10/12/macos-catalina-zsh-profile/
【Docker】はじめてのDocker〜概要・PHPコマンドの実行まで

名前しか知らなかったDockerを使ってみました。
備忘録です。

# Dockerとは
コンテナ型の仮想環境を提供するツール
[docker初心者の方が知っておいた方がよい基礎知識](https://www.osscons.jp/cloud/%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89/?action=common_download_main&upload_id=698)

# なぜ使うのか
- 従来の仮想環境(ハイパーバイザ型)と比較して軽く、リソース消費が少ないから
- 作成した環境を簡単に配布できるから

# 用語集
解説は[Docker-docs-ja/用語集](http://docs.docker.jp/glossary.html)を参考にしています。

ハイパーバイザ型・コンテナ型の概要も含め、図で見た方が分かりやすいです。
[Dockerのすべてが5分でわかるまとめ!(コマンド一覧付き)](https://paiza.hatenablog.com/entry/docker_intro)

## Dockerコンテナ
- Dockerイメージを実行するときの実体(runtime instance)
- Dockerイメージを実行(run)するとDockerコンテナが生成される
- OSレベルの仮想化を行う

## Dockerイメージ
- Dockerコンテナの元のようなもの
- 環境を作るための設定がひとまとめになっている

## Dockerfile
- Dockerイメージを構築するために必要な命令の一覧
- DockerfileをビルドするとDockerイメージが構築される
- テキスト形式のドキュメント

## リポジトリ
- Dockerイメージの集合体

## レジストリ
- リポジトリを預かるサービス(Docker Hub)


# 実行
## ファイル作成
必要なディレクトリ・ファイルを作成します。

```
$ mkdir docker_test
$ cd docker_test
$ touch main.php
$ touch Dockerfile
```

### 実行ファイル

```main.php
<?php 
echo "Hello! World!\n";
echo phpversion()."\n";
```

### Dockerfile
イメージは``php:7.2-cli``を指定したので、7.2系で最新のバージョンが呼び出されます。

[Docker Hub - php](https://hub.docker.com/_/php/)
[Dockerfile リファレンス](http://docs.docker.jp/engine/reference/builder.html)
[【入門】Dockerfileの基本的な書き方](https://techblog.recochoku.jp/1022)

```.dockerfile
# イメージを指定
FROM php:7.2-cli

# イメージ上で実行するコマンドを指定
# helloディレクトリを作成
RUN mkdir /hello
# helloディレクトリにmain.phpをコピー
COPY main.php /hello

# 実行コマンド
# php /hello/main.phpを実行
CMD [ "php", "/hello/main.php" ]
```

## ビルド
``buildコマンド``でビルドし、新しいイメージを生成します。

``tオプション``で``リポジトリ名hello-app``と``実行場所``を指定します。
``タグ名``は指定していないので、デフォルトのlatestが設定されます。

同名のリポジトリが複数存在する場合は、タグをつけて識別します。

[イメージのタグ付け、送信、取得](http://docs.docker.jp/linux/step_six.html)
[リポジトリ（repository）](http://docs.docker.jp/engine/reference/glossary.html#repository)
[タグ](http://docs.docker.jp/engine/reference/glossary.html#tag)

```
$ docker build -t hello-app .
# 省略
Successfully built b9d2c9893a00
Successfully tagged hello-app:latest
```

ビルドが成功しました。

## 起動
``runコマンド``で新しくコンテナを起動します。

```
$ docker run hello-app
Hello! World!
7.2.25
```

Dockerfileのコマンドが実行されました。
phpのバージョンもFROMで指定したバージョン(7.2系で最新)になっています。

コンテナはイメージIDを指定して起動することもできます。

```
$ docker run b9d2c9893a00
Hello! World!
7.2.25
```

``imagesコマンド``でイメージの一覧が表示されます。
ここでリポジトリやタグの確認ができます。

```
$ docker images
REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
hello-app                  latest              b9d2c9893a00        11 minutes ago      398MB
```

その他のコマンドは[コマンドライン・リファレンス](http://docs.docker.jp/engine/reference/commandline/toc.html)で確認できます。
Scratchで作ったRPGメーカーの一部機能紹介

# Scratchで作ったもの紹介
# 1 マップチップ
## 1-1　マップチップをつなげる機能
　上下左右にあるブロックを判断してマップチップの見た目が変わる機能を作ってみました
　<img width="361" alt="スクリーンショット 1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444994/3cc379a4-170b-5a5d-f508-4f27ae472de7.png">
　こんな感じで、上下左右にあるブロックで変わります
　方法としては

１・上下左右のブロックをリストから検索
２・自分と同じブロックなら1、違かったら0に変更して個人リストに入れる
３・コスチュームのIDと上下左右の情報からコスチュームを検索して変更する
　　検索失敗したら、一ずつ回して検索できるまで最大4回繰り返す
４・4回以内に検索できなかったら、元のコスチュームにもどす
　
　みたいな感じでやってます
　下に貼ってあるのはIDがa2から始まる6枚です
　回転させるので、90度回転させたら同じ画像は一枚で大丈夫です
　![スクリーンショット 10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444994/d653f029-bad4-ebba-575d-623a6d750c4d.png)
# 1-2　マップチップをつなげる機能の追加機能
　実はこれ同じブロック以外も対応させることができます。対応リストの自分のIDのところに特定の文を入れておくと、マップチップが繋がる時に色々おきます。
　
　**ok(ID)**
　=登録したIDを同じブロックとみなして判定を1に変えてくれます
　**ng(ID)**
　=登録したIDを違うブロックとして判定を0に変えてくれます　自分のIDにも対応してます
　**only(ID)**
　=登録したIDと自分以外が四方向のどこかにあれば、
　 onlyの後につけたIDのブロックに変わります、海岸線とかに使えます

　他にもroomとか＝ありますが、解説するのが難しすぎるので長くなりそうなのでまた次書く機会があったら書こうと思いますに、実際に使うとこんな感じです。okとかの前にある、二つの数字は当たり判定と表示する層です。当たり判定は0~99まで入力でき、それぞれに別の動きを指定できます、どの方向に強制移動とかどの方向には進めないなど、一個一個決めることができます

 　<img width="300" alt="スクリーンショット 1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444994/61cc008d-3d32-e4d1-5af0-161c4b3afe4f.png">
# 2メニュー
## 2-1　メニューについて
　作ってるRPGメーカーの制作モードのメインとしてメニュー画面があります。チップを選んだり、ツールを変えたり、セーブしたりする時に使います。全部紹介するとすごく長くなっちゃいそうなので好きな機能をいくつか紹介します。
　<img width="362" alt="スクリーンショット 2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444994/8a983f3b-deca-ce92-d963-7b00b2f853fd.png">
## 2-2　ツール
　隣り合った同じブロックをまとめて塗れるバケツや、範囲を指定して全部置き換えれる範囲選択などがありますが、僕が一番紹介したいのは、なんと言っても、ツールが一つのボタンにまとめられている部分です。
　![T・ペン2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444994/99661fff-8c80-6d0b-5b8e-c24d1794182d.png)
このRPGメーカーはスマホで遊ぶことも考えている作品なので、画面がちっちゃいスマホで操作した時の誤タップを減らすためにもボタンを極力減らさないといけませんでした。なので、一つのボタンで、いくつかの機能を変えれる仕様にしてみました。

基本的な動きとしては、
　１、選択中のツールが現在のコスチュームではないなら
　　　選択ツールを現在のコスチュームにする
　２、選択中のツールが現在のコスチュームなら
　　　選択ツールとコスチュームを一個次のにする
の二つでできています、1の役割としては、このボタンに含まれていないツールを選択してる時に、これを選択した時に、次のツールに変わっちゃうのを防いでいます。

これだけのちっちゃい機能だけど、個人的に、メニューバーで二つ目に好きな機能です
## 2-3　メニュー反転機能
メニューバーは開いてない時に、展開アイコンを画面外にスワイプすることで反対側に移動させることができます。メニューバーの下を塗りたいときや、左手の方が操作しやすい時に使えます。勝手に反転が起きることを防ぐために、右にある時は左に、左にある時は右にうごかさないと起動しないようになってます。
<img width="362" alt="スクリーンショット 3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444994/83302d61-6206-447f-9259-36c0a9379a68.png">
小さなこだわりポイントとして、メニューバーを反転しても、反転しないツールがいくつかあります、色切り替えや、ブロックパレット移動などです。本来反転しているなら矢印が、向き合っちゃうはずですが、これだけは向きが変わらないようになっていたりします。

# 3-1　終わりに
今回はこんな感じで終わります。初めてだったのでどのくらいの量書けばいいのかもいいのかもわからなかったたし、文章の書き方も下手だと思うけど、僕は書いてて楽しかったです。また何かこういう感じで書く機会があったら嬉しいです、それではまた。
Laravelの認証機能ui（外部パッケージライブラリ）導入


##ターミナルでインストール

composerを使ってuiライブラリをインストールする

```terminal
$ composer require laravel/ui
```

Package manifest generated successfully.　と表示されたらOK

##artisanコマンドでvueを追加

```terminal
$ php artisan ui vue --auth
```

スタイルシートが壊れた場合は、npmから不足するパッケージをインストールすることで修復する

```terminal
$ npm install
```

```terminal
$ npm run dev
```
Pandas使いが手軽にSQLを練習するために

# 背景
Pandasの方が慣れており、仕事でSQLにつまづく
⇨手軽に練習する環境が欲しい（ローカル、Python）
⇨pandasql


# 備考
* SQLiteです。職場の環境とは違いますが、一般的なSQL練習として良しとしました
* pandasqlを紹介するページは他にありますが、「sqlをpandasでどう書けばいいの？」という主旨のページが多く、私と同じ背景の人は少ない印象だったので、ページを残すことにしました

# パッケージをインストール
```bash
pip install pandasql
```

# コード例
データフレームの変数名をテーブル名のところに入れて、SQLを書くだけ
いつもPandasで触ってるデータフレームに対して、SQLを発行できます

```python
import pandas as pd
from pandasql import sqldf, load_meat, load_births


# get data
df_meat = load_meat()
#df_births = load_births()


# check data (if you want)
if False: # just check
    df_meat.shape
    df_meat.head(2).T
    df_meat.dtypes
    df_meat.duplicated().sum()
    df_meat.isnull().sum()
    df_meat.nunique()
    desc = df_meat.describe().T
    desc[['min','25%','50%','75%','max']]
    desc[['mean','std']]


# sql scripts 1
sql = '''
    SELECT
        *
    FROM  
        df_meat
    LIMIT 
        10;
'''
# execute sql 1
res = sqldf(sql, locals())
res


# sql scripts 2
sql = '''
    SELECT
        other_chicken,
        avg(beef) as avg_beef
    FROM  
        df_meat
    GROUP BY
        other_chicken 
    ORDER BY
        avg_beef DESC
    LIMIT
        10
    ;
'''
# execute sql 2
res = sqldf(sql, locals())
res
```

# 参考リンク
[pypi](https://pypi.org/project/pandasql/)
【未完成】ドットインストールでHTML/CSS,JavaScriptを学習してみた所感と学習内容

# はじめに
フロントエンドに興味がある新人技術者がプログラミング学習サービス「[ドットインストール](https://dotinstall.com)」で学習してみた感想と、そこで得た知識をアウトプットしてみました。
実施したレッスンは以下。
　・HTML/CSSの学習環境を整えよう macOS編 (全5回)
　・はじめてのHTML (全14回)
　・はじめてのCSS (全15回)
　・はじめてのJavaScript (全11回)

# 活用してみた所感
今回「ドットインストール」を初めて活用して感じた所感をあげていきます。

## ①動画なので操作がわかりやすい
書籍で学習する際との決定的な違いです。
書籍だと省略されがちな操作方法を動画で見ながら確認できるので、「説明書いてあるけど難しすぎてどう操作していいか分からない」といった詰み状態にならないのが最大のメリットだと思いました。

## ②手軽に学習できるため、学習がストップしない
動画1本の時間が1〜3分くらいと短めなので、集中力が切れることなくサクサク進められるのが特徴です。
ゲームのステージをこなしていく感覚で実際に手を使いながらどんどん学習できます。

## ③OSごとの解説がある
環境設定やショートカットキーなど、Mac環境とWindows環境で異なる部分の解説をしっかりとしてくれているため、誰でもスムーズに学習に取り組めます。
個人的に、覚えておいて役立つショートカットキーを動画内で説明してくれるのはありがたかったです。

## ④自分に必要なレッスンが分かりやすい
目的別でやるべきレッスンがまとめられているため、初心者にありがちな「何から手をつけていいか分からない問題」が起こりづらいのではないでしょうか。
動画内でも事前に受けておいた方が良いレッスンを教えてくれるので、迷いなく学習に入れます。

# 実際に学習した内容
以下、実施したレッスンのアウトプットです。
なぜこのレッスンを選んだのかも記載していきます。

## ① HTML/CSSの学習環境を整えよう [macOS編]
もともとJavaScriptを勉強しよう！と思い、後に出てくる「はじめてのJavaScript (全11回)」を始めたのですが、動画冒頭で「HTML/CSS」の学習が大前提と説明があったため、HTML/CSSの学習から始めることに。
エディター環境が整っていなかったため、このレッスンをまず実施しました。
MacOS編とWindows編があり、とても親切。
レッスン内容は以下。
　・Chromeブラウザの導入方法
　・VS Codeの導入と設定

## ②はじめてのHTML
①の経緯で学習を開始。
実際に手を動かしながら簡単なプロフィールサイトを作成していきます。
以下、レッスンのアウトプット。

#### ■タグでテキストを意味付けしていくことを”マークアップする”という
```html:index.html
<h1>ダイエット</h1>
<p>健康的なダイエット法を紹介します。</p>
```
#### ■タグの種類
`<h1></h1>` : 見出しタグ。数字が小さいほど大きな見出しになる。
`<p></p>` : 段落タグ。
`<img src="画像のファイル名"> ` : 画像を表示するためのタグ。マークアップする文章がないため、終了タグは不要。

※[参考になったタグ入れの子ルール](https://matome.naver.jp/odai/2137515842633207101)
【備忘録】PythonからDLL呼び出し + 二次元配列を渡す

## 1. 背景
PythonからCで作られたライブラリにndarray(2次元)をpointer-to-pointerで渡す必要が出てきた．例えばこんな感じ．
（単ポインタで渡せよという意見はごもっともだが，使いたいライブラリがご丁寧にpointer-to-pointerで作られているのでしゃあなし．）

動作検証もかねて記事を作ることにした．

```python
# python
from ctypes import *
lib = LoadLibrary()
lib.func.argtypes = [POINTER(POINTER(c_float)), c_int, c_int]
# how to pass?
lib.func(???, size_y, size_x)
```

```C
// C, exported as dll.
void func(float **arrays, y, x){ // 省略 }
```

## 2. コントリビューション
本記事では，
1. CMakeでDLLの作り方(Linux, Macのみ)
2. PythonでのDLLの呼び方
3. ndarray to pointer pointer
にわけて解説する．なお，２次元配列を出力する`print2f`を作成およびコールするものとする．

本記事は中上級者向けの記事です．
おそらく生ポを扱うことになるので試す場合は自己責任で．
あと結論だけ欲しい人は3.4だけ見れば良い．


## 3. 本編

### 3.1 DLL作成
まずはじめにCMakeであるが，SHAREDを忘れないように．

```cmake
add_library(libPtP SHARED library.cpp library.h)
```

次にCコードlibrary.c．ダブルポインタでも配列として扱うことにする．
ほんとはポインタを進める書き方がいいのだろうけどここではこうしておく．

```c
#include <stdio.h>
#include "library.h"

void print2f(float **arrays, int y, int x) {
    for(int i=0; i<y; i++) {
        for(int j=0; j<x; j++) {
            printf("%f ", arrays[i][j]);
        }
        printf("\n");
    }
}
```

ヘッダーlibrary.h． extern Cを忘れると詰む．

```
extern "C" {
    void print2f(float **, int, int);
}
```
あとはビルドしてやれば良い．ビルドの仕方については解説しない．
CLionとか使えばビルドボタン一撃である．

### 3.2 PythonでDLLを呼ぶ
ctypesというDLLを扱うためのライブラリがあるのでこいつを使ってライブラリのロードと関数の呼び出しを行う．
が，ここでPOINTER(POINTER(c_float))をどうするか問題が出てくるので，3.3でどうするか説明する．

```python
import numpy as np
from ctypes import *
lib = cdll.LoadLibrary(path)

arrays = np.zeros((2, 2))
lib.print2f.argtypes = [POINTER(POINTER(c_float)), c_int, c_int]
lib.print2f(arrays, 2, 2) # error
```

### 3.3 ndarray to pointer pointer

シングルポインタの場合は特に問題がない．なぜならnp.ctypeslib.as_ctypeがArrayをPointerにしてくれるからだ．
（print1fは一次元配列を出力する関数で，ライブラリに定義されているものとする)

ちなみにここでprint(a)すると，`c_float_Array_2`と出るので，`c_float_Array_[n]`と`POINTER(c_float)`には互換性があるのだろう．たぶん．


```python
# print1f
import numpy as np
from ctypes import *
a = np.zeros((2, )).astype(np.float32)
a = np.ctypeslib.as_ctypes(a)
lib.print1f.argtypes = [POINTER(c_float), c_int]
lib.print1f(a, 2)
```

問題はpointer-to-pointerの場合だ．一捻り必要になる．
以下手順をコードで解説する．

```python

# まず出力する配列を作成
arrays = np.array([[1, 2], [3, 4]]).astype(np.float32)
# >> arrays = [[1, 2]
#              [3, 4]]

# 次にポインタのリストにしてやる
ptrs = [array.ctypes.data_as(POINTER(c_float)) for array in arrays]
# >> ptrs = [ &arrays[0], &arrays[1] ]

# ポインタリストをctypesに変換する
pp = (POINTER(c_float) * y)(*ptrs)
# >> <__main__.LP_c_float_Array_2 object>

# 出力
lib.print2f.argtypes = [POINTER(POINTER(c_float)), c_int, c_int]
lib.print2f(pp, 2, 2)

```


## 3.4 まとめ
コードを乗せておく．

```python
import numpy as np
from ctypes import *

arrays = np.array([[1, 2], [3, 4]]).astype(np.float32)
ptrs = [array.ctypes.data_as(POINTER(c_float)) for array in arrays]
pp = (POINTER(c_float) * y)(*ptrs)
lib.print2f.argtypes = [POINTER(POINTER(c_float)), c_int, c_int]
lib.print2f(pp, 2, 2)
```

多分もうちょっといい方法があると思う．

## 4. 環境
C++11
Python 3.5
clang-1000.10.44.4
Mac OS High Sierra
Rails 流れ　其の壱

# Rails 流れ 

①
ターミナル　rails new アプリケーション名 -オプション名
アプリケーションの作成

ターミナル　rails db:create 
データベースの作成

ターミナル　rails g controller コントローラー名アクション名
コントローラーの作成





②ブラウザからURLが送信される

③ルーティングにて受け取ったURLに対してどのコントローラーのどのアクション（コントローラー内のメソッド）かを識別。

[アクション]   
.index   :詳細表示
.new     :新規保存　　
.create  :保存
.edit    :編集表示
.show    :一覧表示
.update  :更新
.delete  :削除


ルーティングファイル内 　　HTTPメソッド "URL" => "コントローラー名#アクション名
　
. GET   :ページを表示する操作のみを行う時 
. POST  :データを登録する操作をする時 
. PUT   :データを変更する操作をする時 
. DELETE:データを削除する操作を行う時
Twitterでのエゴサーチを便利にしたかった

TwitterREST APIを用いた検索ツールです
※2023年5月頃のTwitterのAPI仕様変更に伴い、現在は使用できません…
跡地として残しておきます。
https://github.com/shioharugit/twitter

## エゴサーチ
みなさんはエゴサーチしますか？
自分は音楽作ったときとかめっちゃします。
![image01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290284/8ef844f6-f4d7-457f-7f51-d5eb76f65cfc.jpeg)

## 問題点
ところが作品を作るたび、検索したい項目が増えるので大変です。
エゴサーチが気軽にできるようなツールがあればなーと思い、
TwitterREST APIを使用して実現しようとしました。

## 導入方法

- 『[Twitter API 登録 (アカウント申請方法) から承認されるまでの手順まとめ　※2019年8月時点の情報](https://qiita.com/kngsym2018/items/2524d21455aac111cdee)』
Twitterのアカウントを取得し、こちらの内容に沿ってTwitterREST APIを使用する申請を行います。
英語での申請が必要です。
以前は公式が申請の許可を手動で行っていたようで申請後めっちゃ時間が掛かったようですが、
今は自動応答になったらしくすんなり申請が通りました。  

- 『[TwistOAuth](https://github.com/mpyw-junks/TwistOAuth)』
APIの申請が完了したら実際にAPIを使用するわけですが、コード書くのが大変なのでライブラリを使用します。
Qiitaで有名なmpywさんのTwistOAuthを使います。
使い方は簡単で、ライブラリーをダウンロード後、TwistOAuth.pharをrequireしてあげるだけでokです。
curlを使用しているライブラリなので、phpにcurlを導入するする必要ありです。
windows環境はcurl導入が面倒なので注意。

## 実装

- 検索ワードをクッキーに1週間保存するので次回からはブラウザを開いただけで検索可能
- 半角スペースでOR検索対応
- 検索ワード -(ハイフン)検索ワードの結果から非表示にしたいワード　(いわゆるマイナス検索)に対応

![image02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290284/f99d14e2-a22d-335b-7363-38b2cc40bfaa.jpeg)


## 結果
- 通常だと検索範囲が過去1週間しか指定できない仕様の様子 ※参考記事にて補足
- 思いのほか検索精度が低い(?)
- マイナス検索＋複数ワード検索に対応するため、  
複数回APIにリクエストするという無理やりな実装になってしまった

## 総評
- TwitterREST APIを用いれば自分のエゴサが快適化すると思ったがそうでもなかった
- しかしながら検索範囲や検索の指定の仕方を熟考して実装すれば、  
会社や企業アカウントの評判を適切に拾うなど業務にも利用できるのではないか

## 参考記事

- 『Twitter API 登録 (アカウント申請方法) から承認されるまでの手順まとめ　※2019年8月時点の情報』
https://qiita.com/kngsym2018/items/2524d21455aac111cdee  

- 『TwistOAuth』
https://github.com/mpyw-junks/TwistOAuth   

- 『Twitterの検索API & Twitterでの検索術』
https://gist.github.com/cucmberium/e687e88565b6a9ca7039
TwitterのAPIで使用できるパラメータがまとまっています。

- 『Twitter公式/非公式クライアントのコンシューマキー』
https://gist.github.com/uhfx/3922268
過去1週間以上の検索を行うにはこちらのコンシューマキーの指定が必要なようです。
しかしながらこちらを指定したとしても、認証エラーになってしまい過去1週間以上の範囲を検索できませんでした…
intra-martスクリプト開発　ファイルダウンロード後に自画面をリロード

## はじめに
intra-martスクリプト開発にて、嵌ったことを未来の自分あてに情報共有できればと考えています。
※なおQiitaへの投稿は初めてなので、多少見苦しかったらすみません・・・。

## やりたいこと
- 画面には、出力日時を表示するラベル、ならびに、出力ボタンが存在している
- 出力ボタンでファイルを作成し、Storageに保存する
- 作成したファイルを即座にダウンロード
- ダウンロードできたら自画面をリロードして、出力日時ラベルを更新

## はまった現象
HTML側からformのaction属性にて指定した関数を呼び出し、
同関数内でファイルを作成⇒ファイルのダウンロードまではできたが、
自画面のリロードは行われず、出力日時が更新されなかった

## 原因
ダウンロードをするのに使用したAPI(Module.download.send)は
**現在実行中のプログラムを中断して**ダウンロード処理を行うため、
当該APIをコールした時点で処理が中断され、ファンクションコンテナのinit関数もコールされなかったもよう・・・。
https://www.intra-mart.jp/apidoc/iap/apilist-ssjs/doc/platform/Module.download/index.html#method-send_4

## 対応策
- 【HTML】**formをファイル作成用、ダウンロード用の2つに分けます。**
   1つめのformに出力ボタンを、2つめのformの隠し項目として、作成したファイルのパス、ファイル名をバインド変数にて設定します。(初回アクセス時は空です)

- 【JS】出力ボタンを押下した際にコールされる関数では、ファイル作成のみ行います。
- ファイル作成ができたら、作成したファイルのパス、名称、ファイル作成フラグ、出力日時を**引数のrequestオブジェクトに**設定しましょう。

- 【JS】init関数にて、requestオブジェクトから上記４つ(ファイルパス、ファイル名、ファイル作成フラグ、出力日時)を取得し、バインド変数に設定します。

- 【HTML】onload時、ファイル作成フラグが立っている場合、ダウンロード用formをsubmit

- 【JS】コールされた関数内で、引数のrequestにファイルパス、ファイル名が渡ってくるので、ここでようやくModule.download.sendを実行


## 備考
自画面にリロードするために「imart type="form"」を使っていましたが、どうやら非推奨のようです。。。
https://www.intra-mart.jp/apidoc/iap/apilist-jssp-tagdoc/doc/imart_tag_api/form/index.html

それと、今気づいたのですが、タイトル詐欺ですね・・・
結局の対応策は、**自画面をリロード後にファイルをダウンロード**でした。。

以上です。