OmniAICreator/Qiita-1.07M huggingface dataset:
ESlint, prettierを使ってjavascript, vueのコード品質を保つ

scssのコード品質については [stylelint,prettierを使ってscssのコード品質を保つ - Qiita](https://qiita.com/miwashutaro0611/items/437db965a819018f86d5)を参考。
また、`.js`と`.vue`が混在しているプロジェクトを想定。(`.js`については`jQuery`も使っている想定)

# eslint, prettierをインストール

```console
$ yarn add babel-eslint eslint eslint-config-airbnb eslint-config-prettier eslint-plugin-import eslint-plugin-prettier eslint-plugin-vue
```

## 参考
- [babel-eslint  -  npm](https://www.npmjs.com/package/babel-eslint)
- [eslint  -  npm](https://www.npmjs.com/package/eslint)
- [eslint-config-airbnb  -  npm](https://www.npmjs.com/package/eslint-config-airbnb)
- [eslint-config-prettier  -  npm](https://www.npmjs.com/package/eslint-config-prettier)
- [eslint-plugin-import  -  npm](https://www.npmjs.com/package/eslint-plugin-import)
- [eslint-plugin-prettier  -  npm](https://www.npmjs.com/package/eslint-plugin-prettier)
- [eslint-plugin-vue  -  npm](https://www.npmjs.com/package/eslint-plugin-vue)

# prettierrcの設定・.eslintrc.jsonの設定

## .prettierrc
```json
{
  "printWidth": 120,
  "tabWidth": 2,
  "useTabs": false,
  "singleQuote": true,
  "proseWrap": "preserve"
} 
```

### 参考
- [Options · Prettier](https://prettier.io/docs/en/options.html)

## .eslintrc.json

```js:.eslintrc.json
{
  "env": {
    "es6": true,
    "browser": true,
    "jquery": true // if use $
  },
  "plugins": [
    "import"
  ],
  "parserOptions": {
    "parser": "babel-eslint",
    "sourceType": "module",
    "allowImportExportEverywhere": false
  },
  "extends": [
    "airbnb-base",
    "eslint:recommended",
    "plugin:vue/recommended",
    "plugin:prettier/recommended"
  ],
  "globals": {
    "gon": true
  },
  "rules": {
    "semi": [
      "error",
      "never"
    ],
    "comma-dangle": [
      "error",
      "never"
    ],
    "no-param-reassign": [
      "error", {
        "ignorePropertyModificationsFor": [
          "state"
        ]
      } 
    ],
    "prettier/prettier": [
      "error",
      {
        "printWidth": 120,
        "singleQuote": true,
        "trailingComma": "none",
        "semi": false
      }
    ]
  }
}
```

## 参考
- [prettierの使い方 - Qiita](https://qiita.com/kiida/items/405bb07c4b52bfee0219)
- [ESLintとPrettierを併用するときの設定(eslint-plugin-prettier, eslint-config-prettier) - dackdive’s blog](https://dackdive.hateblo.jp/entry/2019/03/15/100000)
- [Vue.jsにPrettier環境を設定するときのメモ - Qiita](https://qiita.com/yasu_yyy/items/f4987a677137d8c9b6d6)
- [もうprettierで消耗したくない人へのvueでのeslint設定 - Qiita](https://qiita.com/diggy-mo/items/bb01bcb54237f16bb008)
- [Prettier 入門 ～ESLintとの違いを理解して併用する～ - Qiita](https://qiita.com/soarflat/items/06377f3b96964964a65d)
- [Vue.jsスタイルガイドとeslint-plugin-vue検証ルールのマッピング - Qiita](https://qiita.com/ota-meshi/items/85bf17494c8ea0be05d7)
- [運用中のVue.jsプロジェクトにESLintを入れるためにやったこと - Qiita](https://qiita.com/sympe/items/f6473c45d45c7be271e5)
- [ESLintのエラールール。日本語ざっくり解説スタイル編 - Qiita](https://qiita.com/M-ISO/items/113ddd448bdc496af783)

## package.json(npm script)

`app/frontend/javascripts`よりも下にjs,vueファイルを入れている場合。

```json
{
  "scripts": {
    "lint:javascript": "eslint --fix app/frontend/javascripts/**/*.{js,vue}"
  },
}
```
Firestoreの自動生成 IDが衝突しないか実際に試そうとしてみる。

Firestoreでaddするときに生成されるIDって衝突しないのか問題

こちらでも案内されていますが、そうそう衝突しないそうです。

https://qiita.com/yukin01/items/dcac3366adcf0fe827a3

FirestoreのautoIDで生成されるのは20桁のランダムな英数の組み合わせです。

autoIdのロジックこのようになってます。（すこし手直ししてます）

```javascript
autoId: function() {
 const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
 let autoId = '';
 for (let i = 0; i < this.strength; i++) {
  autoId += chars.charAt(Math.floor(Math.random() * chars.length));
 }
 return autoId;
}
```

いきなり20桁で衝突するまでループさせたらブラウザが落ちるので、すこしづつ桁を増やして衝突するまでの回数をカウントしてみました。理屈的には最大で「大文字小文字英数26＋26＋10＝62文字^桁」個作れば必ず衝突するはず。期待値は計算がよくわかりませんw

## 検証結果

3桁から始めたんですが、クライント(mac - chrome)では、しばらくほっておいても6桁までしか答えがでませんでした。同じ桁で5回試してます。

|桁数|繰り返し|衝突までの回数|
|:--:|--:|--:|
|3|0|482|
|3|1|196|
|3|2|896|
|3|3|674|
|3|4|513|
|4|0|4,862|
|4|1|4,459|
|4|2|10,343|
|4|3|10,119|
|4|4|10,252|
|5|0|32,336|
|5|1|36,289|
|5|2|57,630|
|5|3|30,874|
|5|4|19,568|
|6|0|341,898|
|6|1|86,129|
|6|2|421,980|
|6|3|174,363|
|6|4|480,189|

## 平均値など

各桁5回しか試してないので偏差は誤差大きそうなので出してません。

|桁数|衝突回数：平均値|衝突回数：最大62^桁|
|:--:|--:|--:|
|3|552|238,328|
|4|8,007|14,776,336|
|5|35,339|916,132,832|
|6|300,912|56,800,235,584|

なんか思ってた（期待値）より少ない回数で衝突してますね。

これが[誕生日のパラドックス](https://ja.wikipedia.org/wiki/%E8%AA%95%E7%94%9F%E6%97%A5%E3%81%AE%E3%83%91%E3%83%A9%E3%83%89%E3%83%83%E3%82%AF%E3%82%B9)ってのでしょうか？

実際には6桁ではなくて20桁ですので、62^20=7.0442343e+35=704,423,430,000,000,000,000,000,000,000,000,000個ですので、実害ない程度では衝突しないんでしょう。

ただ自分は心配性なので、そのドキュメントIDで既に他のドキュメントがあるかチェックしたいな...

ただ、

const id = firestore.collection('hoge').doc().id;
const docRef = firestore.collection('hoge').doc(id);

などで、docRefをとっても実際にget()しないと空かどうかわからないですよねぇ？get()するとdocument readの割り当てを消費しちゃいますし...
NoSQLで一貫性のあるトランザクションって実現できるんだっけ？と思ってしらべた時のリンクメモ

CAP定理ってのがあって、NoSQLみたいな分散型で可用性を担保しようとすると、一貫性が失われるんだったよなーと思ってた。

どうやら、これはミスリーディングだったみたい。CAP定理のブリュワー本人がこんな記事を書いている。

[12年後のCAP定理: "法則"はどのように変わったか(2012)](https://www.infoq.com/jp/articles/cap-twelve-years-later-how-the-rules-have-changed/)

> The "2 of 3" formulation was always misleading because it tended to oversimplify the tensions among properties.

> 3つのうち2つっていうあの公式は誤解されてしまいがち。単純化しすぎたわ。（意訳）



結論としては、分散型NoSQLでもロックやコミット処理は頑張れば可能らしい。
詳しくはこの記事に書いてあるが、なかなか難解。
[NoSQLは「一貫性あるトランザクションを実現できない」という誤解](https://www.atmarkit.co.jp/ait/articles/1801/31/news011_2.html)

## BASEという考え方

クラウドでの中心的なトランザクションの考え方。
cloudでは分散構成が基本なので、CAP理論のPとAは必須。
一貫性については時間が経てば反映される。つまりEventually Consistencyでいいじゃんって考え方。
Eventually Consictencyを許容すれば、ScalableでAvailableでかつEventually Consistencyなシステムは可能。

[クラウドでの新しいACID、そしてBASEトランザクションとCAP定理](https://www.sakatakoichi.com/entry/20090430/1241174854)
[丸山先生の資料](http://qcontokyo.com/tokyo-2009/pdf/GeneralSession-Day2-Maruyama.pdf)

## 調べたリンク

**そもそもACIDとは**
**[ACID(wiki)](https://ja.wikipedia.org/wiki/ACID_(%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E7%A7%91%E5%AD%A6))**

**トランザクション分離レベル**
**[トランザクション分離レベルについてのまとめ](https://qiita.com/song_ss/items/38e514b05e9dabae3bdb)**

**CAP定理**
**[cap定理](https://ja.wikipedia.org/wiki/CAP%E5%AE%9A%E7%90%86)**
electron-builderでcanary releaseするとき、ロールアウトされるかどうかはuuidで決まる

electron-builderではlatest.yml内にパーセンテージを記載することで、そのバージョンをどの割合でロールアウトするか設定することができます。
https://www.electron.build/auto-update#staged-rollouts

その際、定められたuuidによって端末にロールアウトされるかどうか決まります。
なお生成されたidは`.updaterId`ファイルに書き込まれます。

詳細は以下のコードを参照してください
https://github.com/electron-userland/electron-builder/blob/master/packages/electron-updater/src/AppUpdater.ts
ルパン三世のカシャカシャってなるタイトルコールのやつをsvgにしたかった

#はじめに
https://qiita.com/Sirloin/items/3db49c97763042e95eb5
この記事を見ましてこれを一枚のSVGとかに収めて他のところにも貼り付けたいなーとかgifとかmp4みたいにテキストエディタで見ると汚いやつにしたくないなーとか画面いっぱいに広げて大迫力のルパン三世が見たいなーとか思うわけです。
と思ってsvgの仕様書見てたらアニメーションに関する記述はありました。以下のやつ
<text begin="1s" fill="remove">
を文字ごとに作ってあげればけ行けるかなと思えど、うまく行かなかったので方針転換。
普通に要素をjavascriptで制御する形にしました。

できたやつがこれ【音量注意】
https://misogihagi.github.io/rupinthethirdtitlecall/

スライドバーをいじると拡大します。画面いっぱいのタイトルコールをご覧あれ。

#やってる最中に思ったこと
音声の遅延はどこから発生してるのかなと思って

```javascript
 playSound(KASYA){
  audioElem = new Audio();
  audioElem.src = filename;
  audioElem.play();
 }
```

これが一回一回インスタンスを生成して使いまわさない分の遅延かと思ったけれど、これはこれで問題があるようで、
文字と文字が切り替わる瞬間、音声は再生中（音声の長さは200ミリ秒よりながい？）のようで、再生中の音声に対してplay()をしても最初から再生されるのではなく無視されてしまう。
ので一回一回インスタンスを生成するよう戻しました。ちょっと変わってますが。

```javascript

const kasya = new Audio,
      kasya.src=base64~~   
      kasya.play()
```

#追伸
svgいいやつだからもっと流行って。早いし軽いし埋め込むときもbase64せずにそのまま使えてhttpリクエストを減らせるいいやつなんです。本当はjavascriptを使わずanimationだけで完結すれば。。リファレンス読み込みたい。
# Fractalで小規模なHTML/CSS統一化を図る話


※チュートリアルを目的とした記事ではありません。

## Fractalとは

- スタイルガイドジェネレーターだよ。
- Node.jsでインストールして、簡単にスタイルガイドページを作れるよ。
- 記述はMarkdown、ファイルもコンポーネントごとだから管理しやすいよ。

公式サイトは[こちら](https://fractal.build/)。

## スタイルガイドを作ろうと思った経緯
社内にデザイン部隊がなく、UIに気を使う人が少ない為に配慮の無さが日ごろから目についていた。
デザインについてはExcelベースの「画面イメージ」を頼りに各々が走り出し、
HTML/CSSに対するコーディング規約もない為に、後々になって解釈の差から生まれる微妙な違いを修正するコストも膨大。

さらに当時、新しく

- 基本はCSSフレームワークでデザイン構築。
- そこから、上書き用のCSSを適用して、色や配置の変更を行う。

という方針の案件が発生していた。
私の懸念点は**好き勝手に各々がCSS用意して適用してったら、修正で地獄を見るぞ……**ということだった。
そもそも、必ずCSSを別ファイルで作ってstyle適用してくれる保証もどこにもなかった。

## どんなスタイルガイドにするか
初めは、デザインのルールを作ってredmineのWikiなんかで周知することを計画していた。
しかし、このアプローチには社内環境を鑑みて以下の課題があった。
**ドキュメントを読む作業は人によってはかなり高コストなので、無視される可能性無限大。**
結果、使われないドキュメントは風化するどころか、半端に使われて混乱を招く恐れがある。
そうなれば、デザイン関連の事前決定不要の流れになってしまう。将来を考えてもそれは避けたい。

そこでどんなものなら受け入れられるかを考え、CSSフレームワークのサイトのようなものをイメージした。
BootStrapとか、Materializeとかのドキュメントのような形式を取れれば、
一目でどんなコンポーネントか確認できるし、簡単にコピペして使えるなら読ませるより抵抗感はないだろうと予想できる。
めんどくささがなければ、便利だと感じた人たちが社内での利用を定着させてくれる流れに期待も出来る。

加えて、ツールには以下を求めたい。

- すごいツールは買ってもらえないので、無料で使えるもの。
- 機能が膨大な学習コストの高いツールは間違いなく嫌煙されるので、シンプルなもの。
- 管理を引き継ぐ・ツールを広めることを考えて、デザインツールっぽくないコーディングで作成管理が出来るもの。

目指す方向性が定まった。

## Fractalと出会うまで
恥ずかしながら当初は「スタイルガイド」という単語にすらたどり着いておらず、
「なんかデザインを事前にルール決めしてみんなで見るようなツール」というふわっとしたイメージを頼りに調査していた。

スタイルガイドをテンプレートベースで作成するツールを見ては、こんなにちゃんとした規模でやる案件はほぼ来ない……と絶望し、
figmaを試してセンスの無さに絶望した挙句、デザインをやろうとしていたわけではないと冷静になり、
Frontifyを試して機能の多さに絶望し……似たようなツールを渡り歩き……。

そんな紆余曲折を経て出会ったのが、GitHubなどで公開されているスタイルガイドジェネレーター、中でも「Fractal」だった。


## Fractalに決めた理由
似たようなジェネレーターの有名どころとしてはKSSやStyleDoccoが上がると思われるが、
今回Fractalを選んだ決め手は、

- Markdownでの記述が出来る
- CSSを直接書き換える必要がない

の2つだった。

選ぶうえで、KSSやStyleDoccoもシンプルで魅力的だった。
が、SASS(SCSS)を扱える人が社内にほとんどいないこと、CSSが結構な頻度で変更になりそうなことを考えると、
CSS内にコメントアウトで書く方法は利用を推進していくことを考えると現実的ではなかった。

その点Fractalは、CSSファイルを書き換える必要がなく、社内でも多くの人が慣れているMarkdownでの記述。
これなら、環境さえ構築しておけば、誰かが手直ししていけるのではという希望が持てた。

## Fractalでやったこと
まずFractalをインストールして環境を設定を行った。
作成したのは、いくつかのサンプルコンポーネントと、デザイン方針や簡単なルール等のドキュメント類だ。

今回はCSSフレームワークのカスタムでUIを作っていく方針だったので、
CSSはカスタム用の自作ファイルと、CSSフレームワークのCSSファイルを読み込む必要があったが、
自作ファイルについてはFractalのフォルダ内に置き、
CSSフレームワークについては、未編集であることを強調したかったので、CDNを読込ませて対応することにした。

そんな形で出来上がったのが、このようなページである。
![01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445857/ff9d30b4-ef5d-4255-6352-bb7f68d00954.png)

すごい。

## 結末
ここまで読ませておいて言うことではないのだが、残念ながらFractalを作成した案件はサヨナラしてしまい、活躍を見ることが叶わなかった。
ただ、一度は納品資料として……という空気もあったので、爪痕は十分残したと感じる。
「これ、IEで見れる？」と聞かれて戦慄したのも良い思い出である。
(ちなみにIEだと表示崩れが起きるが、[IEで管理画面が表示くずれしたときの確認ポイント](https://www.powercms.jp/blog/2018/06/ie.html)で回避できる。)

また、作ったコンポーネントをまとめて、すぐ見れる自分用の資料にしておくだけでも価値があるはずなので、これからもあきらめずに取り組んでいこうと思った。

この記事が、同じような苦しみを味わっている誰かの、何かしらのきっかけになれば幸いである。
※ただ、残念ながら2019/9/24現在、npmでのfractalインストール時に相当数の脆弱性警告が発生する為、お手軽にとはいかないかもしれない。

## 参考記事
[スタイルガイドジェネレーターの「Fractal」がかなり良さそう | Rriver](https://parashuto.com/rriver/tools/getting-started-with-fractal)
図解 inject（reduce）メソッド の挙動 [RUBY技術者認定試験...問題13]

# 基本説明

- injectメソッド：ブロックを使う繰り返し計算を行うのに使います。メソッドの戻り値は最後のブロックの実行結果です。
- shiftメソッド：配列の最初の要素を削除し、その要素を返す。レシーバ自身を変更するメソッド。配列が空のときはnilを返す。

# 例題1

以下の出力結果は？

```rb
a = [4,3,2,1]
b = a
c = b.shift
puts a.inject { |x, i| x * i } + c
```

RUBY技術者認定試験 公式ガイド (ITpro BOOKs)　152p 問題13より抜粋

# 図解

injectは、値を置いておく箱に、全ての要素をひとつずつ、ブロック内部の処理（今回なら`x * i`）にしたがって順次繰り返しています。

![スクリーンショット 2019-09-24 17.19.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14191/903d75f1-b8b9-ba36-a562-b62cc07ed91c.png)

変数aにあった配列の最初の要素（4）は、shiftメソッドにより取り除かれました。shiftメソッドはレシーバ自身を変更するメソッドなので。

# 例題2

inject メソッドの理解に shiftがノイズなので、上記の図解から以下の出力結果を当ててください。

```rb
a = [5,4,3,2,1]
puts a.inject { |x, i| x * i }
```

# 実行結果は以下でサクッと試せます

[Online Ruby Editor and IDE \- Fast, Powerful, Free \- Repl\.it](https://repl.it/languages/ruby)

# 参考

- [inject \(Enumerable\) \- Rubyリファレンス](https://ref.xaio.jp/ruby/classes/enumerable/inject)
- [shift \(Array\) \- Rubyリファレンス](https://ref.xaio.jp/ruby/classes/array/shift)

# 正解

- 例題1：10
- 例題2：120
Fetch Metadata Request Headersって何ですか？

ある日UIを作る時に、ヘッダーが正しいのかをチェックするため、developer toolを見たら、ちょっと怪しいヘッダーを見つけました。

![屏幕截图 2019-09-24 18.26.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502430/ed9cfb9d-16ad-da75-2521-c3fb6cf8248e.png)

`Set-Fetch-Mode`？何これ？って思う方がいるかもれませんが、一緒に調べてみましょう。

ちょっと変だなと思って、何か誤ってヘッダーを入れたのか？と思いましたが、あまり記憶にありませんでした。

自分のコードは結構シンプルなので、多分これはブラウザから入れたヘッダーということを考えました。

ググってみて、実はこれはFetch Metadata Request Headersという新しい仕様でした。今 Chrome だけこのヘッダーを入れる、他のブラウザはまだ入っていないようです。

## CORSをもう一回理解しましょう

みんなさんご存知の通りに、ブラウザは怪しい人がブラウザーからデータを奪わないように、いくつかのポリシーがあります。例えば別のドメインのAPIを呼ぶ際、`Access-Control-Allow-Origin`を正しく設定しないといけないことや、Preflight しないといけないません。詳しくはMDNに書いてあるので、詳細を知りたい人は見てみてください。

それでもいくつの欠点があります。`<img>`タグは別のドメインにフェッチすることができ、もしsrcから怪しいクエストをしたらデータを奪うことが不可能ではありません。もちろん、サーバー側からちゃんとしたら、これらの攻撃も簡単に防げるでしょう。

もしブラウザからリクエストを送るときに、どこから来たという情報をmeta　dataヘッダーに入れたら、サーバー側も判断することができます。

このための仕様が `fetch-metadata-request` です。

## 標準仕様

今四つのヘッダーが仕様にあります

### 1. Sec-Fetch-Dest

どこからこのリクエストきましたっていうヘッダーです。可能な値は audio, document, font, image, object, serviceworkerなど。

このヘッダーさえあれば、サーバーはヘッダーによって、合法かどうかは判断できます。

もしこのリクエストがイメージタグからきた場合でもrouteは`/api/my/profile/remove` だったら、おそらく　hacker　と思って良い。エラーコードを返すのが良いでしょう。

### 2. Sec-Fetch-Mode

このリクエストもモードは何でしょうか？っというヘッダーですが、cors, navigate, nested-navigated, no-corsなどあります。
fetch のmodeオプションと似ています。

### 3. Sec-Fetch-Site

リクエストは同じドメインなのか、crossドメインなのかを判断できる

### 4. Sec-Fetch-User

このヘッダーはbooleanで、リクエストが [navigation request](https://fetch.spec.whatwg.org/#navigation-request)に限り、ユーザーがスクリーンから操作があったらtrueになる。

## ヘッダーを削除できるのか？

もし仕様になったら、[forbidden headers](https://fetch.spec.whatwg.org/#forbidden-header-name)になり、削除することができないと思われます。ブラウからコードを利用してヘッダーの値を変えることはできないので、サーバー側がこのヘッダーの値を信じて良いでしょう。

## 結論

古い環境で同じことをやりたい場合、自分でヘッダーの定義を制御して、偽造することもおかしくはありません。

仕様は、変えることが難しく 、同じ仕様があるため、サーバー側も実装しやすいです。これからアプリケーションの開発もより安全になるでしょう。
Laravel6への移行

弊社で稼働しているサービスを
Laravel5.8からLaravel6へ移行しました。

## 前提

一年前ほどから既存サービスをLaravelに徐々に移行中。
Laravelは月一くらいのペースで最新版に更新。

### サイズ感

モデル数：89
コントローラ数：62

## アップグレード

[Upgrade Guide - Laravel - The PHP Framework For Web Artisans](https://laravel.com/docs/6.x/upgrade)

### composer

まずはcomposer.json

```diff
- "laravel/framework": "5.8.*"
+ "laravel/framework": "^6.0"
```

ただこれだけでは、`composer install`がすんなり行かず下記の対応

- アップデート
	- appstract/laravel-opcache : "^2.0" → "^3.0"
	- hamburgscleanest/laravel-guzzle-throttle : "^3.0"  → "^4.1"
- 削除
	- beyondcode/laravel-query-detector : "@stable"
		- "^1.1"がリリースされていたのであとで復活しました

### array_*とstr_*ヘルパーの除去

https://laravel.com/docs/6.x/upgrade#helpers

deprecatedになった時点で利用を辞めていましたが、それ以前に利用していたものがそれなりにありました。
地道に`Arr::*`と`Str::*`に置き換えました。

### routeのパラメータ変更

```php

Route::get('/profile/{location}', function ($location = null) {
    //
})->name('profile');

// Laravel 5.8: http://example.com/profile/active
echo route('profile', ['status' => 'active']);

// Laravel 6.0: http://example.com/profile?status=active
echo route('profile', ['status' => 'active']);
```

これ地味に痛かったです。
grepで`route`を全て抜き出して、5.8と6でそれぞれ結果を吐き出してdiffとりました。

予想通り一定数の違いがあったのでこちらも地道に修正。

----
Laravel6が出て様子見していましたがそろそろかと思いアップグレードしました。

[Rails6がでて9日間でアップグレードしたGithub](https://www.publickey1.jp/blog/19/githubrails_69.html)ほどではありませんが、早めに移行できたかなと思います。
githubからsshでクローンする。sshでpushする

## 前提
sshキーが既にある状態。
sshのパスフレーズを把握していること。

※sshキーの作り方は[参考](#参考)にした記事へ

## 手順
### ①githubの設定を開く
https://github.com/settings/keys

title：適当にわかりやすい名前
Key:

`.pub`の内容、＝公開鍵情報をコピペする

```bash
pbcopy < ~/.ssh/id_rsa.pub
```

これでコピペ。

### ②接続確認
```bash
ssh -T git@github.com
```

これで

> Hi (account名)! You’ve successfully authenticated, but GitHub does not provide shell access.

的なのが返ってきたらOK。

## クローン
あとはGithub上の「Clone with SSH」を使ってクローンするだけ。

```
git clone git@github.com:user/repository.git
```

コマンドを打つとsshのパスフレーズを要求される。

はじめてやったとき「xcodeのライセンスかなんかに同意してください…」的なメッセージが出てきたけど、指示通りに進めれば問題なくクリアできた。

## プッシュで毎回パスワード（sshのパスフレーズ）聞かれる問題
pushしようとしたら、毎回パスワード聞かれるようになった。

```bash
ssh-add ~/.ssh/id_rsa
```

上記コマンドを打って、パスワードを一回打てば解決。
作業リポジトリにsshキーが紐付いてなかったのが理由っぽい。

パスワード聞かれるか以下のコマンドで確認。

```bash
git push origin hoge-branch
```

パスワード聞かれずに
> Everything up-to-date

と返ってきたらOK
## 参考
[GitHubでssh接続する手順~公開鍵・秘密鍵の生成から~ - Qiita](https://qiita.com/shizuma/items/2b2f873a0034839e47ce)
[Git 毎回パスワードを聞かれる問題について - Qiita](https://qiita.com/gdtypk/items/172d42c10761f5ef2387)
【RubyOnRails】Controller生成

# この記事の概要
・RubyOnRailsについて、Progateで学んだことを書き記す
・ガチ初心者によるもの
・主に備忘録として、随時書き足していく

# 項目
## Controllerの生成
ターミナルで、以下のコマンドを実行
` rails generate controller [コントローラー名] [アクション名] `

結果）
①ルーティングが自動で追加される
②Controller、Viewが自動で生成される
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
①の詳細）
` rails generate controller examples index`
⇒作業ディレクトリ/config/routes.rbに、

```
get "examples/index" => "examples#index"
```

の一行が自動追加される。

②の詳細
` rails generate controller examples index`
⇒作業ディレクトリ/app/controllers/に、
examples_controller.rb　が生成される

⇒作業ディレクトリ/app/views/に、
/examples/index.html.erb
が生成される
#docker の Alipine  で yum install も apt-get install もできないけど、どうなってんの？ apk っていう Alpine 専用のパッケージ管理ツールがあるらしいよ！ 

# vim をインストールしてみる

`apk add vim`

```
bash-4.4# apk add vim
(1/2) Installing lua5.2-libs (5.2.4-r4)
(2/2) Installing vim (8.0.1359-r2)
Executing busybox-1.27.2-r11.trigger
OK: 636 MiB in 140 packages
```

いけた。

# 参考

[Alpine Linux入門 -内部構造とapkでパッケージインストール編- · tehepero note(・ω<) 2.0](https://blog.stormcat.io/post/entry/alpine-entry-apk/)

# Help

```
apk

apk-tools 2.10.1, compiled for x86_64.

Installing and removing packages:
  add       Add PACKAGEs to 'world' and install (or upgrade) them, while ensuring that all dependencies are met
  del       Remove PACKAGEs from 'world' and uninstall them

System maintenance:
  fix       Repair package or upgrade it without modifying main dependencies
  update    Update repository indexes from all remote repositories
  upgrade   Upgrade currently installed packages to match repositories
  cache     Download missing PACKAGEs to cache and/or delete unneeded files from cache

Querying information about packages:
  info      Give detailed information about PACKAGEs or repositories
  list      List packages by PATTERN and other criteria
  dot       Generate graphviz graphs
  policy    Show repository policy for packages

Repository maintenance:
  index     Create repository index file from FILEs
  fetch     Download PACKAGEs from global repositories to a local directory
  verify    Verify package integrity and signature
  manifest  Show checksums of package contents

Use apk <command> --help for command-specific help.
Use apk --help --verbose for a full command listing.

This apk has coffee making abilities.

```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2518








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
コードを書かずにStoryboardで多言語対応

Xcode開発における多言語対応については記事はいろいろありますが、この記事では極力コードを書かずStoryboardで多言語対応する方法について説明します。

# 0. 環境
Xcode 11.0

# 1. プロジェクト自体の多言語対応手順
PROJECTのInfo - Localizationから、Japaneseを追加します。
※今回は英語をデフォルト言語とし、日本語を追加した場合を想定します。
![1-1 marked.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131255/c7941e7d-bd6f-f640-dae8-aa65d2848aff.png)
![1-2 trimmed.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131255/c0d217c7-7c4f-2509-8e23-325cffa6cd8a.png)

これにより選択したstoryboardには.stringsファイル（日本語での表示文字列を記述するためのファイル）が生成されます。
- .storyboardファイル：英語を記述
- .stringsファイル：日本語を記述（書き方は 「2. Storyboardを更新したときの多言語対応手順」参照）
とすれば多言語対応は完了です。

ただ.stringsファイルのUI要素の指定の仕方が特殊で、UIの種類によって指定すべきキーが変わってきます。
UI要素を追加したときにそのキーを調べて手打ちするのは手間なので、そうしたケースでのコツを以下で説明します。

# 2. Storyboardを更新したときの多言語対応手順
一旦Japaneseのチェックを外します。
このときに確認ダイアログが表示されることがありますが、"Remove"を選びます（つまりこれまでの.stringsファイルは削除されるので、要バックアップです）。

そしてJapaneseに再度チェックを入れます。
出てきたダイアログで"Replace file"を選ぶと、storyboardの内容に基づいてstringsファイルが再生成されます。
<img width="1440" alt="2-1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131255/8bf6613e-06bb-3a8d-35e1-2cf25bf85b6b.png">
![2-3 trimmed.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131255/527b8655-f95f-0d44-1f80-e715b3799a0d.png)
![2-4 trimmed.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131255/a94f8030-faa8-a562-ae58-ab8a70c51ee1.png)

上の画像の例で言えば
"cgO-CO-O4B.text": UILabelの表示文字列
"qY6-pH-68Q.normalTitle": UIButtonの表示文字列
となっているので、これらの右辺に好きな日本語を指定すれば良いわけです（下のコードでは自動生成されたコメントを省略しています）。

```
"cgO-CO-O4B.text" = "こんにちは！";
"qY6-pH-68Q.normalTitle" = "ボタン";
```

UI要素を追加した場合はこのやり方が良いですが、追加がない場合であれば.stringsファイルを直接編集する方が簡単ですね。

# 3. Storyboardを追加したときの多言語対応手順
Localizeから、まずはBaseを選び、その後でJapaneseにチェックを入れて追加します。
あとはこれまでと同様ですね。
<img width="200" alt="3-1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131255/99215a16-76c4-07c2-14d9-540617c4b576.png">

# 4. 多言語対応の動作確認
シミュレータ（もしくは実機）の言語設定を切り替えることで、アプリの英語・日本語表示が切り替わることを確認できます。
HTML5/CSS3　画像にfloatを適用する / floatを解除する　の書き方

マージンのたたみ込みと、不要なマージンを削除する方法。floatを適用したあとには、必ず解除する言語を記載しなければいけません。


```html:concept_section_float.html
...
<div id="main">
<article>
<h1>...</h1>
<section class="concept_box">
<h2>...</h2>
<p><img src="images/concept_photo1.jpg" alt="" class="image_right"></p>
<p>...</p>
<p>...</p>
</section>
<section class="concept_box">
<h2>...</h2>
<p><img src="images/concept_photo2.jpg" alt="" class="image_left"></p>
<p>...</p>
<p>...</p>
</section>
</article>
</div>
...
```

```css:consept_section_float.css
/* img_float ページここから ↓ */
	/* floatを解除する② ↓ */
.concept_box {
overflow: hidden;
margin-bottom: 30px;
}									
	/* 画像にfloatを適用する 最初にここの部分から書き始める① ↓ */
.image_right {
float: right;
margin-left: 25px;
}
.image_left {
float: left;
margin-right: 25px;
}
	/* 不要なマージンを0にする③ ↓ */
.concept_box:last-child,
.concept_box p:last-child {
margin-bottom: 0;
}
/* img_float ページここまで ↑ */
```
#Ruby の gem install xxx --verbose オプションでインストール先を確認する

# インストール先のファイルパス、ディレクトリが見たい

例えば付属のコマンドがインストールされないとか、そんな時に。

`gem install wkhtmltopdf-binary --verbose`

```
HEAD https://rubygems.org/api/v1/dependencies
200 OK
GET https://rubygems.org/api/v1/dependencies?gems=wkhtmltopdf-binary
200 OK
Downloading gem wkhtmltopdf-binary-0.12.4.gem
GET https://rubygems.org/gems/wkhtmltopdf-binary-0.12.4.gem
Fetching wkhtmltopdf-binary-0.12.4.gem
200 OK
/Users/yumainaura/.rbenv/versions/2.6.3/lib/ruby/gems/2.6.0/gems/wkhtmltopdf-binary-0.12.4/bin/wkhtmltopdf
/Users/yumainaura/.rbenv/versions/2.6.3/lib/ruby/gems/2.6.0/gems/wkhtmltopdf-binary-0.12.4/bin/wkhtmltopdf-binary.rb
/Users/yumainaura/.rbenv/versions/2.6.3/lib/ruby/gems/2.6.0/gems/wkhtmltopdf-binary-0.12.4/bin/wkhtmltopdf_darwin_x86
/Users/yumainaura/.rbenv/versions/2.6.3/lib/ruby/gems/2.6.0/gems/wkhtmltopdf-binary-0.12.4/bin/wkhtmltopdf_linux_amd64
/Users/yumainaura/.rbenv/versions/2.6.3/lib/ruby/gems/2.6.0/gems/wkhtmltopdf-binary-0.12.4/bin/wkhtmltopdf_linux_x86
/Users/yumainaura/.rbenv/versions/2.6.3/bin/wkhtmltopdf
Successfully installed wkhtmltopdf-binary-0.12.4
Parsing documentation for wkhtmltopdf-binary-0.12.4
Parsing sources...
100% [ 5/ 5]  bin/wkhtmltopdf_linux_x86
Installing ri documentation for wkhtmltopdf-binary-0.12.4
Done installing documentation for wkhtmltopdf-binary after 0 seconds
1 gem installed
```

# Try

この場合はバイナリのコマンドの場所を確認して、叩きたい。

最悪、フルパスを直接叩けばコマンドを実行できるとか、そういうことがわかる。

```
/Users/yumainaura/.rbenv/versions/2.6.3/lib/ruby/gems/2.6.0/gems/wkhtmltopdf-binary-0.12.4/bin/wkhtmltopdf --version
wkhtmltopdf 0.12.4 (with patched qt)
```



# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2516








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Ubuntu16.04にnodejsをインストール

##はじめに
Ubuntu16.04にnodeJsのインストール手順を書きます。

##nodejsのインストール
```
$ sudo apt install -y nodejs npm
$ sudo npm cache clean
$ sudo npm install n -g
$ sudo n 10.16.0
$ sudo ln -sf /usr/local/bin/node /usr/bin/node
```

##バージョン確認
```
$ node -v
```

##導入済みのNode.js、npmを削除
```
$ sudo apt-get purge -y nodejs npm
```

##おわりに
以上がインストール手順です。この記事がだれかの役にたったら幸いです。
nodejsは無名関数だったり、変数の型が決まっていなかったり、javaに
慣れていた私からすると「使いずらい。。。」イメージでしたが、
使ってみると必要なモジュールを楽に持ってこれたり便利なこともあって
最近は愛着が湧いてきました。これからももっと使いこなして可愛いがれる
くらいになりたいと思います。
ファイルを右クリックしてフルパスを取得するプログラムをPythonで作る

#背景
Outlookのメール文中にファイルサーバーのリンクファイルを記載することが多いです。
現在は、該当のファイルをShiftキー+右クリックしてパスをコピーしているのですが、
貼り付け後にパスを<>で囲う必要※があり、毎日のことになると地味に面倒くさいです。
※<\\ﾌｧﾌｨﾙｻｰﾊﾞｰ\ﾃﾞｨﾚｸﾄﾘ\ﾌｧｲﾙ名>

#目的
ファイルを右クリックして、フルパスを取得し、<>で囲うプログラムを作りたいと思います。

#pyperclipのインストール
クリップボードにフルパスをコピーするために、pyperclipが必要になります。pyperclipは標準ではないので、事前にインストールしておきます。

```PowerShell
$ pip install pyperclip
```

#コード
コードはとってもシンプル。これだけでOKです。
Outlookで使用せず、単純にフルパスだけコピーしたいならelse以降はpc.copy(file_path)だけでOK。

```FilePath.py
import sys
import pyperclip as pc

if len(sys.argv) < 2:
    #引数がない場合の処理。今回は何もしない。
    pass
else:
    #sys.argv[1]に指定ファイルのフルパスが入る。Outlookでリンクを張るために<>で囲う。
    file_path = "<" + str(sys.argv[1]) + ">"
    pc.copy(file_path)
```

#batファイルの作成
pyファイルはsendtoフォルダに置いてもキックされません。
作成したFilePath.pyをキックするためにbatファイルを作ります。※PowerShellでも良いです。

```FilePath.bat
python \\Pythonファイルの保存先\FilePath.py
```
#Sendtoフォルダに保存
作成したbatファイルをsendtoフォルダに保存します。
sendtoフォルダは[Win]キーと[R]キー同時押しして、検索ボックスに「shell:sendto」と入れれば表示されます。

#利用方法
ファイルを右クリック→送る→FilePath.batをクリックするとパスがクリップボードに張り付けられます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242659/fd40bb38-4f8a-4181-6f6c-e07eaff5000f.png)

#補足：ユーザーへ配布したい場合
ユーザーに配布する場合は、EXE化したものを同じくsendtoフォルダに置いてあげればbatファイル不要で起動出来ます。
Google Homeで自作アプリを動かす際には，まず「テスト用アプリにつないで」と話しかける必要がある．

## 経緯
### 目指したもの
自作アプリ(自分の保有している仮想通貨の，現在の収支を教えてくれる)を DialogFlow + Heroku で作って，Google Home と会話したかった．

【思い描いたやりとり】
> ぼく「OK, google. コインの価格を教えて．」  
> Google Home「現在の仮想通貨のスコアは．．．」  
> ぼく「(やったね)」  

### 現実
なんとか作成して，Actions on Google 内のテストでは，動作のOK確認できた．
しかし，いざGoogle Home と上記のやり取りをしようと思って話しかけても，こうなってしまった．

【実際のやり取り】
> ぼく「OK, google. コインの価格を教えて．」  
> Google Home「すみません．お役に立てそうにありません．」  
> ぼく「(なぜ．．．)」  


## 結論
**まず「OK, google. テスト用アプリにつないで」と話しかける必要がある．**

自作のアプリは最初にこう言わないとダメみたい．
自分は上記文言を，**Actions on Google 上でのテストにのみ使う**専用の呪文だと思いこんでいた．勘違い恥ずかしい．

そういうわけで，Google Homeとのやり取りは以下のようになる．

【正しいやり取り】
> ぼく「OK, google. テスト用アプリにつないで．」  
> Google Home「はい．テスト用アプリのテストバージョンです．」  
> ぼく「コインの価格を教えて．」  
> Google Home「現在の仮想通貨のスコアは．．．」  
> ぼく「(やったね)」

## でもなんかかっこ悪い．．．
"テスト用アプリ"って変えられないんかな？
→ Actions on Google の設定[^1]をいじくって，ちょっとだけマシにできた．

【最終型のやり取り】(口頭でも一緒)

![last](https://user-images.githubusercontent.com/20534543/65488500-40a55e80-dee4-11e9-9302-94a058c29341.jpg)

## 最後に
「〇〇につないで」すらを言わなくていい方法を見つけようとしたけど力尽きた．

[^1]: Actions on Googleでの設定変更．![name](https://user-images.githubusercontent.com/20534543/65490080-6ed86d80-dee7-11e9-9bc7-fab5bfc7e407.png)
typescript-eslint v2.x.xでパースに失敗する場合の対処法

[typescript-eslint](https://github.com/typescript-eslint/typescript-eslint)の[v2.0.0](https://github.com/typescript-eslint/typescript-eslint/releases/tag/v2.0.0)においてパース処理に変更があり、リント対象のファイルを明示的に指定しなければならなくなりました。
v1.x.xを使用しているプロジェクトでv2.x.xにアップデートすると、パース処理に失敗して正常にリントが行なえない状態になります。
ここでは、そのような状況に陥った際の対処法を示します。

## ESLint用のtsconfig.jsonファイルを作成
ESLint用の`tsconfig.json`ファイルとして、`tsconfig.eslint.json`ファイルを作成します（ファイル名はなんでもいいのですが、ここでは公式ドキュメントの記載に合わせています）。

```json:tsconfig.eslint.json
{
  "extends": "./tsconfig.json",
  "include": [
    "src/**/*.ts",
    "test/**/*.ts"
  ]
}
```

オリジナルの`tsconfig.json`を継承したうえで、`include`でリント対象のファイルを指定しています。

## ESLintの設定ファイルでtsconfig.eslint.jsonファイルを使用
ESLintの設定ファイルの`parserOptions.project`に、さきほど作成した`tsconfig.eslint.json`を指定します。

例：

```json:.eslintrc.json
{
  "plugins": [
    "@typescript-eslint"
  ],
  "parser": "@typescript-eslint/parser",
  "parserOptions": {
    "project": "./tsconfig.eslint.json"
  }
}
```

## 参考リンク
* [2.0.0 Parsing Issues · Issue #890 · typescript-eslint/typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/issues/890)
Xcode11.0にアップグレード後にフリーズしまくる（応答なし）ときの対処

再起動かけたり色々してたら一時間とかしてしまったので。。。

~~今日も今日とて給料泥棒しました~~

iPhone11のリリースに伴ってバグ報告を受けました
タピオカめ、ふざけるな！？

実機はないためシミュレーターでやろうにも、シミュレータにiPhone11があるわけもなく。。。

仕方なしにアップグレード

するとですね。。

いくつかのvalidationのコンパイルエラーが出ました
これはまあ良いです、テキトーに直しました。

が、いくつかのストーリーボードを覗き見るとフリーズするようになりました。

結論から書きますが、メモリ不足っぽいです。
おそらくXcode11.0で
@IBDesinableが強化されたのか、こいつを記述したXIBやストーリーボードを開くとフリーズします。

ほとんど使ったことはありませんが、リアルタイムでViewを描画してくれるやつだったかと思います。
~~微調整が楽なのでうるさいデザイナーさんもこれにて解決、的なやつ~~

アクティビティモニターを見たところこいつで2GBくらい食ってました
僕のmacは8GBなので厳しいスペックです。
desinableをコメントアウトしたらフリーズはぱったり起きなくなりました。

16GBのmacを支給して欲しいですね。
kuromoji.jsをNode.jsなしでローカルブラウザで扱う

Node.js不要。

[GitHub - takuyaa/kuromoji.js: JavaScript implementation of Japanese morphological analyzer](https://github.com/takuyaa/kuromoji.js)
>Browser
>
You only need the build/kuromoji.js and dict/*.dat.gz files

とあるように
[kuromoji.js/kuromoji.js at master · takuyaa/kuromoji.js · GitHub](https://github.com/takuyaa/kuromoji.js/blob/master/build/kuromoji.js)
と
[kuromoji.js/dict at master · takuyaa/kuromoji.js · GitHub](https://github.com/takuyaa/kuromoji.js/tree/master/dict)
を落として設置する。

あとはHTMLで読み込んで開くだけだが、
HTMLのパスは`file:///`ほげほげ。
(辞書のディレクトリパスはひとまず相対パス(`./dict`)などでOK)


Firefoxでは
`TypeError: this.character_definition is null`
Chromeでは
`*.dat.gz`の読み込みで
`from origin 'null' has been blocked by CORS policy`
が出るかもしれない。
ファイルから他のファイルへのアクセスを禁止するセキュリティが働いているので、Chromeならば起動オプションに
`--allow-file-access-from-files`
を追加してやれば機能する[^1]

[^1]: もしまだエラーが出るなら`--unsafely-treat-insecure-origin-as-secure`も足せば成功した環境に近づくはず。

辞書の扱いは調べるとcsvがどうとでるが、追加しようと考えなければとりあえず落としたままの`*.dat.gz`だけでOK。


```html
<script src="./kuromoji.js"></script>
<script>
var builder = kuromoji.builder({ dicPath: "dict/" })

var buildFunction = (string) => {
  return (err, tokenizer) => {
    //console.log('string',string)
    var path = tokenizer.tokenize(speech);
    console.log('path',path)
  }
}

builder.build(buildFunction("すもももももももものうち"))
</script>
```

# 参考

* [Javascriptでローカルファイル(file://)を読み込んでみる - Qiita](https://qiita.com/otakeuchi/items/fbd5f1771c56ddd0d708)
CodeBuildでGitHubのプルリクエストをビルドして自動テスト

GitHubでのプルリク作成時に、自動でテストとコードスタイルチェックがされるようにCodeBuildを設定する方法を記します。
##背景
https://qiita.com/t_kanno/items/d9eb7df78718be92a6ef
##この記事が役に立つ人
・プルリク作成時に自動でテストとコードスタイルチェックしたいと思ってる人。
#設定方法
<img width="805" alt="スクリーンショット 2019-09-20 19.49.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369932/3c9177fd-6c81-51be-8022-d89ced75f4de.png">
上記画像のように、ソースプロバイダに`GitHub`を、リポジトリに`GitHubアカウントのリポジトリ`を設定してください。
GitHubリポジトリにはクローンURLを入れましょう。

####※注意点
ソースプロバイダの選択肢の１つにGitHub EnterPriseがありますが、これはオンプレミス版である`Enterprise Server`プランの場合に選択するもののようです。クラウド版である`Enterprise Cloud`の場合はGitHubを選択しましょう。私はここで1日くらいハマりました。。。

#動作
CodeBuildの設定が終わり、実際にGitHubでプルリクエストを作成すると、CodeBuildが動作します。
<img width="758" alt="スクリーンショット 2019-09-21 10.44.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369932/5a3c9d17-e0e9-5db2-5fe5-ca66f1a04645.png">
Ubuntu16.04でCassandraをインストール

##はじめに
Ubuntu16.04によるCassandraインストール手順と動作確認が意外と大変だったため、
共有します。

##CassandoraのApacheリポジトリの追加(バージョン3.11の場合)
```
$ echo "deb http://www.apache.org/dist/cassandra/debian 311x main" | sudo tee -a /etc/apt/sources.list.d/cassandra.sources.list
```

##Apache Cassandraリポジトリキーを追加
```
$ curl https://www.apache.org/dist/cassandra/KEYS | sudo apt-key add -
```

##リポジトリを更新
```
$ sudo apt-get update
```
###※以下のエラーが発生した場合
```
GPG error: http://www.apache.org 311x InRelease: 
The following signatures couldn't be verified because the public key is not available: 
NO_PUBKEY A278B781FE4B2BDA
```
###公開鍵の追加
```
$ sudo apt-key adv --keyserver pool.sks-keyservers.net --recv-key A278B781FE4B2BDA
```
###もう一度リポジトリの更新
```
$ sudo apt-get update
```

##Cassandraをインストール
```
$ sudo apt-get install cassandra
```

##Cassandraの起動
```
$ sudo service cassandra start
```
###※メモリが少ないとCassandraが起動直後に落ちるため、ログを確認する
```
$ sudo tail -f /var/log/cassandra/system.log
```
###Cassandraの起動確認
```
$ cqlsh
Connected to Test Cluster at 127.0.0.1:9042.
[cqlsh 5.0.1 | Cassandra 3.11.4 | CQL spec 3.4.4 | Native protocol v4]
Use HELP for help.
cqlsh>
```
###※以下のエラーがでた場合
```
tttt@XXXXXX:~$ cqlsh
Connection error: ('Unable to connect to any servers', 
{'127.0.0.1': error(111, "Tried connecting to [('127.0.0.1', 9042)].
 Last error: Connection refused")})
```
Cassandra起動には時間がかかるため、30秒ほど待ってからもう一度起動確認を行う。

##おわりに
以上がCassandraのインストール手順と動作確認になります。
CASTableのデータをmatplotlibで簡易的にグラフ表示する

[SAS Viya](https://www.sas.com/ja_jp/software/viya.html)はAIプラットフォームです。PythonやJava、Rなどの言語を通して利用できます。そのSAS Viyaの中で使われているのがCASTableというテーブルオブジェクトです（CASはCloud Analytic Servicesの略です）。CASTableはMatplotlibと高い親和性を持っています。今回はCASTableをMatplotlibでグラフ化してみます。

## CASTableを取得する

まずはCASTableを取得します。今回はCSVをデータソースとします。

```py
tbl = conn.loadtable('data/iris.csv', caslib='casuser').casTable
```

## グラフ化する

ライブラリをインポートします。Jupyter Notebookの中でインライン表示する指定も行います。

```py
%matplotlib inline
# from matplotlib.pyplot import show
```

plotメソッドでグラフを出力します。

```py
tbl.plot()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274479/1e92014d-e7ec-278c-4f96-128b1a85fcc8.png)


## 描画対象を絞り込む

キーで出力対象を絞り込めます。

```py
tbl[['sepal_length', 'sepal_width']].plot()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274479/5dab96d9-d676-1df2-d024-6e85d45af122.png)

## グラフの種類を変更する

plotメソッドにオプション指定してグラフの種類を変更します。

```py
tbl[['sepal_length', 'sepal_width']].plot(kind='area')
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274479/d52fbe4a-b27a-8f7a-de98-9db8ee5daa98.png)


メソッドチェーンでも変更できます。

```py
tbl[['sepal_length', 'sepal_width']].plot.area()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274479/fcf96080-9073-13af-f423-aa5a393a6ab4.png)

## まとめ

CASTableを使えばデータを取り出して可視化するまでがとても簡単に実現できます。データを絞り込んだり、並び替えをしながらグラフに描くのも簡単です。ぜひ皆さんのデータ分析に役立ててください。

[SAS Viya | SAS](https://www.sas.com/ja_jp/software/viya.html)
AWS S3に複数画像投稿時にnodeのメモリーが足りなくなった

## rails FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory

AWSにCapistrano3を使いながらアプリを自動デプロイしていた時、突然こんなエラーが、、、、、

```
rails FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory
```

なんじゃこりゃ！？　メモリがない？

assets precompileを行なっていた時なので、画像のアップロードに問題があるということはわかったのですが、もしメモリに問題があるのなら、AWSに金かけなきゃいけないのかな。。。なんて思っていました。

しかし解決法をググりまくっていたら、同じ問題が怒っていた方のブログに出会うことができました。

http://tech-savvy.hatenablog.com/entry/2016/04/07/000102

そしてこちらのブログでも説明されている通り、サーバーのメモリは増やすことができます。


メモリの増やし方に関してはこちらのQiita記事に詳しく載っています。


解決法が見つかったので早速サーバーのSWAP領域を1GB増やしていきましょう

### 1.本番サーバーのインスタンスにて下記を実行

```
sudo dd if=/dev/zero of=/swapfile bs=1M count=1024
sudo mkswap /swapfile
sudo swapon /swapfile
```
これにより1GBのSWAP領域が生成されます。


### 2.SWAPの設定

次に下記のコマンドを入力して、SWAPの設定画面が開きます

```
sudo vim /etc/fstab
```

その後設定画面の中に以下のように１行挿入

```
LABEL=/     /           ext4    defaults,noatime  1   1
tmpfs       /dev/shm    tmpfs   defaults        0   0
devpts      /dev/pts    devpts  gid=5,mode=620  0   0
sysfs       /sys        sysfs   defaults        0   0
proc        /proc       proc    defaults        0   0

/swapfile 　　swap 　　swap 　　　defaults 　　    0   0 👈この１行を挿入
```

これが終わったら一度Ec2インスタンスを再起動し、また一からサーバーを立ち上げ、Capistrano
を実行するとassets　precompileに成功し、無事デプロイができました！！


インフラ関係って本当に知らないと本当に苦労しますね.....


もし間違っている点などがあればお申し付けください！


### 参考
http://tech-savvy.hatenablog.com/entry/2016/04/07/000102
https://qiita.com/snowsunny/items/aaeacf7aecb0121948d4
MySQLで採番する（採番用のテーブルを作る）

↓のテーブルを作って、

```sql
Create Table: CREATE TABLE `seq` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`)
)
```

↓を実行する。

```sql
UPDATE seq SET id=LAST_INSERT_ID(id+1);
select LAST_INSERT_ID();
```

`select LAST_INSERT_ID();` で取得する値は接続毎なので、別接続で同じ処理を実行された後、`select LAST_INSERT_ID();` しても結果は変わらない。
※別接続の方は、`update` で更新した新しいIDの値が取得できる。
※別接続で`update`された後、再度こちらで`update`した場合は、最新のIDからの連番がちゃんと取得できる。
リフレッシュ（フレーム）レートとPsychoPyのwin.flip()

#パソコンで呈示できる最も短い時間
例えば、プライミングの実験などで、非常に短い時間なにかを画面に呈示したいとします。さて、あなたのパソコンで、どれくらい短い時間、刺激を呈示できるでしょうか？

100ms?　50ms? それとも10ms?

もしかすると、刺激の呈示時間を、10ms, 11ms, 12ms・・・と1ms単位で変更して、その効果を検討したい！ なんてこともあるかもしれません。そういうときは、まず、モニター（ディスプレイ）のリフレッシュレート（フレームレート）について知る必要があります。

## Windowsでリフレッシュレートの確認
ディスプレイの設定を開きます。
![win_display1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495823/5bfb8cb2-ce5c-cba6-373d-240feb36e2df.png)

![win_display2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495823/23460229-41ff-fdd9-396d-6a1c07907712.png)

現在のリフレッシュレートが確認できます。リフレッシュレートを変更したい場合には、「ディスプレイのアダプターのプロパティを表示します」をクリック。ですが、液晶ディスプレイの場合は、60Hzから変更できないことが多いようです。

![ディスプレイ設定3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495823/78c72eb7-a76c-14f7-bb35-ec1305d4d045.png)


## Macでのリフレッシュレートの確認
システム環境設定からディスプレイを選択
![スクリーンショット 2019-09-24 15.48.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495823/f87f6a96-d5ce-7777-e202-51a4c334c15f.png)
![スクリーンショット 2019-09-24 15.48.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495823/18a71fc4-3175-e18c-da35-ba5d363da373.png)

Windowsと同じく、接続しているモニターによってはリフレッシュレートを変更できないかもしれません。

#win.flip()
次の図は、リフレッシュレートが60Hzの場合を例にとり、PsychoPyの関数である`win.flip()`との関係を示したものです。
![リフレッシュレート.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495823/41989164-0a64-9a9f-4bad-df628d6b8d38.jpeg)

冒頭でお話しした
>刺激の呈示時間を、10ms, 11ms, 12ms・・・と1ms単位で変更して、その効果を検討する

という実験は、残念ながら普通のパソコンで行うことはできないのです。リフレッシュレートが60Hzの場合は、呈示時間の短い順に、16.7ms, 33.4ms(=16.7x2), 50.1ms(=16.7x3)・・・でしか、呈示時間を変更することができないので注意してください。

同様に、リフレッシュレートが100Hzの環境では、呈示時間の短い順に、10ms, 20ms, 30ms・・・となります。

#win.flip()は画面が書き換わるタイミングに自動で同期します
上の図でも触れていますが、PsychoPyの関数`win.flip()`は、画面が書き換わるタイミングに自動で同期して実行されます。
どういうことか、下のコードで確認してみましょう。CodeコンポーネントのBegin Experimentに記述してください。

```python:BeginExperiment
# 次の関数も参照してください。
# win.fps(), win.getActualFrameRate(), win.getFutureFlipTime()

print(win.monitorFramePeriod) # 60Hzのとき約0.0167s

myText = visual.TextStim(win=win)

for i in range(100): # 0から99
    myText.text = str(i)
    myText.draw()
    win.flip()
```
このコードでは、0から99までの数字を画面に呈示します。for文でflipを100回呼び出していますね。では、画面上の数字はいったい何秒の間隔で書き換わるのでしょうか？

実際にプログラムを動かすと、かなり高速で数字が書き換わっているのが分かると思います。どれくらいのスピードで書き換わっているのかは、使っているパソコンのリフレッシュレートに依存します。

`win.flip()`が画面が書き換わるタイミングに自動で同期することを思い出してください。もしリフレッシュレートが60Hzの場合は、flip（画面の書き換え）は約16.7msごとに行われています。

また、PsychoPyのプログラムでは、`win.monitorFramePeriod`で１フレームの時間を知ることができます。単位は秒です。フレームレートも`win.getActualFrameRate()`や`win.getFutureFlipTime()`で知ることができます。詳細は[公式サイト](https://www.psychopy.org/api/visual/window.html)で確認してください。

#呈示時間を実測することが望ましい

すでに説明した通り`win.flip()`は、画面が書き換わるタイミングに自動で同期して実行されることになっていますが、それが本当に行われているかは実測してみないと分かりません。オシロスコープとフォトセンサー（フォトダイオード）があれば、測定することができます。もしくは予算があれば、[Black Box Toolkit](https://www.blackboxtoolkit.com/index.html)がお勧めです。

公式サイトの[Presenting Stimuli -> Timing](https://www.psychopy.org/coder/codeStimuli.html)もあわせてご参照ください。
CASTableをDataFrameのように扱う


[SAS Viya](https://www.sas.com/ja_jp/software/viya.html)はAIプラットフォームです。PythonやJava、Rなどの言語を通して利用できます。そのSAS Viyaの中で使われているのがCASTableというテーブルオブジェクトです（CASはCloud Analytic Servicesの略です）。今回はCASTableをPandasの中でDataFrameのように扱う方法を紹介します。

## CASTableを取得する

まずはCASTableを取得します。今回はCSVをデータソースとします。

```py
tbl = conn.loadtable('data/iris.csv', caslib='casuser').casTable
```

Pandasで同じようにCSVをデータソースとしてDataFrameを取得します。

```py
df = pd.read_csv('/u/username/data/iris.csv')
```

カラムを出力します。

```py
tbl.columns
# Index(['sepal_length', 'sepal_width', 'petal_length', 'petal_width',
#       'species'],
#      dtype='object')
```

DataFrameの場合です。

```py
df.columns
# Index(['sepal_length', 'sepal_width', 'petal_length', 'petal_width',
#        'species'],
#       dtype='object')
```

データタイプは次のようになります。

```py
df.dtypes

# sepal_length    float64
# sepal_width     float64
# petal_length    float64
# petal_width     float64
# species          object
# dtype: object
```

DataFrameの場合です。

```py
tbl.dtypes

# sepal_length     double
# sepal_width      double
# petal_length     double
# petal_width      double
# species         varchar
# dtype: object
```

## get_dtype_counts

get_dtype_countsの出力結果です。

```py
tbl.get_dtype_counts()

# double     4
# varchar    1
# dtype: int64
```

```py
df.get_dtype_counts()

# float64    4
# object     1
# dtype: int64
```

## describe

describeの結果です。

```py
casdesc = tbl.describe()
casdesc
```

| sepal_length | sepal_width | petal_length | petal_width
|--------------|--------------|--------------|--------------|
| count | 150.000000 | 150.000000 | 150.000000 | 150.000000
| mean | 5.843333 | 3.054000 | 3.758667 | 1.198667
| std | 0.828066 | 0.433594 | 1.764420 | 0.763161
| min | 4.300000 | 2.000000 | 1.000000 | 0.100000
| 25% | 5.100000 | 2.800000 | 1.600000 | 0.300000
| 50% | 5.800000 | 3.000000 | 4.350000 | 1.300000
| 75% | 6.400000 | 3.300000 | 5.100000 | 1.800000
| max | 7.900000 | 4.400000 | 6.900000 | 2.500000

```py
desc = df.describe()
desc
```

| sepal_length | sepal_width | petal_length | petal_width
|--------------|--------------|--------------|--------------|
| count | 150.000000 | 150.000000 | 150.000000 | 150.000000
| mean | 5.843333 | 3.054000 | 3.758667 | 1.198667
| std | 0.828066 | 0.433594 | 1.764420 | 0.763161
| min | 4.300000 | 2.000000 | 1.000000 | 0.100000
| 25% | 5.100000 | 2.800000 | 1.600000 | 0.300000
| 50% | 5.800000 | 3.000000 | 4.350000 | 1.300000
| 75% | 6.400000 | 3.300000 | 5.100000 | 1.800000
| max | 7.900000 | 4.400000 | 6.900000 | 2.500000

## まとめ

このようにCASTableはDataFrameと高い互換性を持っています。そのため、Pandasを用いてデータをグラフ化するのも可能です。皆さんのデータ分析にSAS Viya、そしてCASTableを活用してください。

[SAS Viya | SAS](https://www.sas.com/ja_jp/software/viya.html)
ubuntu16.04 でGradleをインストール

##はじめに
ubuntu上でGradleをインストールする手順が忘れがちだったので、書きます。
(Qiita初投稿です)

##必要なもの
・Ubuntu16.04 LTS
・Java(Oracle JDKまたはOpen JDKのVer.8以上)

#インストール手順
1.zip,unzipのインストール
⇒SDKManをインストールするために必要

2.SDKManのインストール
⇒Gradleインストールのために必要


3.Gradleのインストール

##zip,unzipのインストール
```
$ sudo apt install zip unzip
```

##SDKManのインストール
```
$ curl -s "https://get.sdkman.io" | bash
```
###SDKManの初期設定をする
```
$ source "/home/(自分のユーザ名)/.sdkman/bin/sdkman-init.sh"
```
###SDKManのインストールを確認
```
$ sdk version

SDKMAN 5.7.3+337
```
##Gradleのインストール
```
$ sdk install gradle 5.6.2 (2019/9/24現在最新バージョン)
```
###Gradleのインストール確認
```
$ gradle --version
------------------------------------------------------------
Gradle 5.6.2
------------------------------------------------------------

Build time:   2019-09-05 16:13:54 UTC
Revision:     ~~~~~~~~~~~~~~~省略~~~~~~~~~~~~~~~~~~

Kotlin:       1.3.41
Groovy:       2.5.4
Ant:          Apache Ant(TM) version 1.9.14 compiled on March 12 2019
JVM:          1.8.0_222 (Private Build 25.222-b10)
OS:           Linux 4.4.0-17763-Microsoft amd64
```

##おわりに
インストール手順は以上です。
Qiita初投稿で分かりずらい部分もあるかと思いますがだれかの助けになれば幸いです。
gradleはmavenリポジトリからライブラリを簡単に使うことができるのでプログラム
初心者ながら役に立つと感じます。gradleにはもっと便利機能が隠されていると思うので
これからも勉強していこうと思います。
lookerのダッシュボード運営あるある 〜項目定義はDescriptionに〜


BIツールを企業導入後に、長く運営していくと良く発生する事をメモしておきます。

## あるある事項

**ダッシュボードに表記されている項目定義の詳細を知りたい！！**

ダッシュボードの構築当初は、表示項目定義についてはそれほど細かく言及されないことが多いと思うのですが、業務拡大による増員、人の入れ替わりやデータの業務用途の広がりにより、データ定義が気になる人が増えてきます。

本来、項目定義をしっかり作っていれば、この事象は発生しなさそうですが、ベンチャーやITなどで比較的創業からの日が浅い環境の場合、開発者におまかせ！で作成されることもある為、こういった事象が発生してきます。

その結果、ドキュメント化されていない為、依頼が来た段階で、プログラムを見直すことで、問い合わせ対応をしていくことになります。

##対応策（工数小）

**LookerのDescriptionに、項目定義を書いてしまう。**

対象のダッシュボードを開いて、右上にあるDescriptionのEditをクリックして編集可能

![Looker_Descriptionについて.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242038/c1212bd8-9d71-f3d6-6b5a-b9605d0604fe.png)


##対応策（工数大）

**項目定義をドキュメント化して管理する**
※社内wikiやhandbook、スプレッドシートなど

本来はこちらの手法にすべきなのかもしれませんが、ドキュメント整備すること自体は出来ても、その後のメンテナンス含めた運営管理を行わないと、時間経過と共に、ドキュメント品質が低下していき、意味を失っていく事が多い気もしますので、やると決めたら覚悟を決めてやりきる気概も必要になります。


##まとめ

個人的には、工数の少ない**LookerのDescriptionに、項目定義を書いてしまう。**で対処するのが良いのかなと思います。
というのも、**ドキュメント管理は人の入れ替わりで廃れることが多い**為です。よほど社員の定着率が高い環境でない限りは、なかなか難しいので。
自前Lora Gateway を立ててみた

#はじめに
自宅にLoraGatewayを立ててみました．自身のメモとこれから立てようという人の参考になるかもということでまとめました．　　

#ハードウェア
##ケース
電波の飛びがよさそうな屋外に設置しますのでそれなりのケースが必要です．
アマゾンで未来工業 ウオルボックスWB-11DHMを選択しました．　　
取り付け板がついていましたがピッチがRaspberryPiの穴ピッチと微妙に合いませんでしたので３ｍｍの穴を開けて基板を固定しました．
裏から見るとこんな感じです．  
![lora-gateway_base.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353064/117bfe26-4cec-343b-8691-80fa1bde5531.jpeg)

つかったのは~~２．６ｍｍ~~2.5mmのねじです．
（RaspberryPiの基板の穴は~~２．６ｍｍ~~2.5mmのようですです．GPS-HATに付属のスペーサも~~２．６ｍｍ~~2.5mmでした．）   
（raspiのネジのサイズは2.5mmでした．2020/08/24 修正）　 
電源をとるためにケース下側の外寄りに穴を開けました．
目印となる浅い溝がつけてあり、そこをすこしづつ切って穴を開けました．
（本当は穴あけの道具があるのかも知れません）  
以下はRaspberryPiとアダプタを組み込んだ様子です．  
![lora-gateway.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353064/e39f67a8-53ae-aacb-da66-d866e023ba8d.jpeg)

屋外なので穴のすきまからほこりや虫とかが入ってこないようにACコードを通したすきまはダックテープで塞いでいます．  

#基板とソフトウェア
基板はRaspberryPi3B+とDragino GPS-HATの組み合わせです．
ソフトは自作の[Bidirectional_Single_ch_Pkt_Fwd](https://github.com/tsuyoshiohashi/Bidirectional_Single_ch_Pkt_Fwd)です．
日に一回は落ちるようでsystemdで自動起動するように設定していますが
Restart=Always の設定でごまかしています．．．
なお、ネットワークとはWiFiで接続しています．
現在２Fのベランダにひもでくくりつけていますがどれ位飛ぶのか試してみる予定です．
CASTableをメソッドとパラメータとで条件指定する

[SAS Viya](https://www.sas.com/ja_jp/software/viya.html)はAIプラットフォームです。PythonやJava、Rなどの言語を通して利用できます。そのSAS Viyaの中で使われているのがCASTableというテーブルオブジェクトです（CASはCloud Analytic Servicesの略です）。CASTableでは条件指定にメソッドとパラメータが使えます。今回はその方法を紹介します。

## CASTableを取得する

以下のようにしてCASTableを取得します。

```py
iris = conn.CASTable('data.iris', caslib='casuser')
```

## メソッドによる指定

メソッドでは set_param を使います。一つ目の引数に条件名、次に値を指定します。

```py
iris.set_param('where', 'sepal_length > 6.8 and species = "virginica"')
iris.set_param('computedvars', ['length_factor'])
iris.set_param('computedvarsprogram', 'length_factor = sepal_length * petal_length;')
```

条件はまとめて与えることもできます。

```py
iris.set_params('where', 'sepal_length > 6.8 and species = "virginica"',
                'computedvars', ['length_factor'],
                'computedvarsprogram', 'length_factor = sepal_length * petal_length;')
```

## 要素による指定

同様に要素で指定します。

```py
iris.params.where = 'sepal_length > 6.8 and species = "virginica"'
iris.params.computedvars = ['length_factor']
iris.params.computedvarsprogram = 'length_factor = sepal_length * petal_length;'
```

どちらも同じ意味になります。

## まとめ

set_paramは複数の条件をまとめて指定できるのが魅力です。プログラムとして順番に指定していくならば、要素で指定する方が分かりやすいかも知れません。使いやすい方で指定してみてください。

[SAS Viya | SAS](https://www.sas.com/ja_jp/software/viya.html)
【初心者向け】AWS IAM ポリシーとロールとグループの違いについて

<img width="1133" alt="スクリーンショット 2019-09-24 11.34.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41078/6d222cac-fe06-75cc-1a06-d6c23d26de2c.png">

### IAMポリシー
- IAMロールとIAMグループにアタッチできる。
- IAMユーザーにもアタッチできる。
- IAMグループにアタッチしてIAMユーザーをIAMグループに参加させればIAMユーザーに直接アタッチする必要がない。

### IAMロール
- IAMポリシーを複数アタッチできる。
- サーバ（EC2インスタンス等）にアタッチする。
- IAMユーザーにはアタッチできない

### IAMグループ
- IAMポリシーを複数アタッチできる。
- IAMユーザーを参加させることでIAMグループにアタッチされているIAMポリシーの権限を利用できる。
- 1つのIAMグループには複数のIAMユーザーを参加させられる。
- 1つのIAMユーザーは複数のIAMグループに参加できる。
CASTableパラメータについて

[SAS Viya](https://www.sas.com/ja_jp/software/viya.html)はAIプラットフォームです。PythonやJava、Rなどの言語を通して利用できます。そのSAS Viyaの中で使われているのがCASTableというテーブルオブジェクトです（CASはCloud Analytic Servicesの略です）。CASTableで使えるパラメータについて解説します。

## name

テーブル名です。

## caslib

利用するcaslibを指定します。指定しない場合は現在アクティブなcaslibになります。

## where

データの絞り込みを行う条件を指定します。

## groupby

データのグルーピングを行う条件を指定します。リストまたはDictで指定します。

## groupbyfmts

groupbyのフォーマットを指定します。デフォルトは `[]` です。

## orderby

データの並び替えを指定します。

## computedvars

computedvarsprogramと組み合わせて使います。computedvarsprogramで計算した結果を行に適用する場合に、変数名を指定します。

## computedvarsprogram

計算式を指定します。

## groupbymode

サーバでのグルーピング方法を指定します。デフォルトはNOSORT、その他にNOSORTとREDISTRIBUTEが指定できます。

## computedondemand

Trueを指定すると、アクション開始時ではなくデータのロード時にcomputedvarsの変数を適用します。

## singlepass

Trueを指定するとサーバに一時テーブルを作成しなくなります。


## importoptions

データソースからテーブルを読み取るための指定をします。

## ondemand

テーブルアクセス時に仮想メモリをあまり使わなくなります。

## vars

アクションで使用する変数を指定します。

## timestamp

テーブルに使用するタイムスタンプを指定します。出力されるテーブルに対してのみ利用されます。

## compress

Trueを指定すると、出力する際にデータ圧縮するようになります。

## replace

既存のテーブルを同じ名前で置換するかどうか指定します。

## replication

テーブルのレプリケーション数を指定します。あまり多く指定するとパフォーマンスが低下します。デフォルトは1で、0以上、147483647未満を指定します。

## threadblocksize

一度に読み取るブロック数を指定します。0以上、9223372036854775807未満を指定します。

## label

テーブル用の説明ラベルです。

## maxmemsize

テーブルに割り当てる物理メモリのサイズを指定します。

## promote

Trueを指定するとテーブルがグローバルスコープに指定されます。他のセッションからアクセスできるようになります。

## まとめ

CASTableはSAS Viyaを利用する上で基本的なデータモデルになります。CASTableのオプションを指定して、より効率的なテーブルアクセスを行ってください。

[swat.cas.table.CASTable — SWAT 1.5.2 documentation](https://sassoftware.github.io/python-swat/generated/swat.cas.table.CASTable.html)