OmniAICreator/Qiita-1.07M huggingface dataset:
毎朝7時にグーグルスプレッドシートのセルに記入した、その日のタスクを読み取ってスラックに投稿する。

##Microsoft Flowとは

Microsoft Flowは、Microsoft公式のタスク自動化ツール。
その最大のの特徴は**コードを書く必要が全くない**。
選択肢を選ぶだけで誰でも簡単に自動化するフローを作成でき、人気のフローはあらかじめテンプレートとしてされているので、自分でつくらなくても選ぶことができる。

類似製品にはZapier、IFTTTなどがある。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295666/a5954864-b064-846f-4340-c8d93eae26a3.png)

詳しくは[こちら](https://ferret-plus.com/9333)を見てください！

##Flowを一つ作ろう！

###作りたいフロー
僕はスポーツのデータ分析を研究していますが、論文読みグループで論文を読んだり、紹介し合ったりしています。
最近、[ウェブサイト](https://atomscott.github.io/Sportech-Sanity/)も作って、アウトプットを増やしていこう！と考えていたのですが、みんななかなか時間が取れなく論文紹介のアウトプットが増えません。。。

そこで、論文読みグループで順番を決めて、毎日担当の人が１つの論文を読んで紹介しよう！と目標を決めたので

今日が、**誰が**担当で、**どの論文**を読むのかをグループが使っている**Slackに**リマインドするFlowを作れたらいいなと思ってます。


###ロジックを考える

1. 毎朝７に日毎の担当者と論文情報がのっているスプレッドシートを持ってくる
2. スプレッドシートから今日の情報を特定する
3. 今日の情報の中からSlackに投稿するメッセージを作る
4. Slackに投稿する

驚くことに完成したFlowはほぼ上記の流れ通りになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295666/15ea47a7-a3dc-29db-8710-31a19c25d8a5.png)


###スプレッドシートシートに情報を記入する

まず、担当者と論文情報がのっているスプレッドシートを以下のように作りました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295666/270ce330-8560-0765-f5f8-9c0beec7f188.png)

※日付の設定がちょっと難しいのですが、このように表示させるためにはファイル＞スプレッドシートの設定＞全般＞言語と地域でアメリカ合衆国を選択する必要があります。そのあとに表示形式＞数字＞日付を選択すればOKです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295666/43f9e288-fab5-e9c2-1af8-3f66714f04ab.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295666/44d996a6-3964-45ee-25bf-72b1e8bbe1a0.png)


###実際に作っていく
まずいちばん最初に貼ったサイト（ https://ferret-plus.com/9333 ）を見てください！
登録やFlowの作り方に関して詳しく書いています。

あとは以下のようにステップをしていくだけです！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295666/5c76b39f-25cf-7ef5-a68b-cf31081db7b8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295666/6a1658f6-de48-ac4d-c7ce-6fb3c027fda9.png)


###テストする
右上のテストボタンを押して、自分でトリガーアクションを行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295666/8254dff2-66e6-9322-f306-4e05b3b2e7ff.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295666/77aa7b57-906a-3715-921a-73dff3a53bb1.png)


###結果

上手く行きました！！
下はテストしたときの画像なので、時間は７：００ではありませんが、ちゃんとスラックに投稿できたようです。

![698075.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295666/64aaa5a7-ad18-cb91-1445-68e9570a92d8.jpeg)

さらに、Microsoft Flowを使ったとまだ言っていないチームメイトからはこんな反応が笑

![698068.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295666/59ae2381-cfc0-0ee9-fa4f-d2c1bd37794d.jpeg)

###※余談
Slackへの投稿など自動化の方法ミスるまずいです。
注意して使ってくださいね笑

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295666/7de0df5d-e5a1-b35d-5a72-b069f08b9ffd.png)
#python の 辞書 に対して #Ruby on #Rails の pluck 的なことをやる

Funcyだぜ！

```py
>>> from funcy import pluck
>>> list(pluck("name", [ {"name": "fix", "ext": "wow"} , {"name": "bug" }, {"name": "dig"}  ]))
['fix', 'bug', 'dig']
```

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
webpack-dev-serverでtypescript, eslintを使ってコンパイルすると無限ループになる時の対処

webpack-dev-serverでconfigを整理した時にやったミスに気付かず1日悩んだのでメモ。

# 環境
```
webpack-dev-server 3.3.0
webpack 4.29.6
node 11.3.0
npm 6.7.0
typescript 3.4.2
ts-loader 5.3.3
```
環境ってどこまで書けば良いのやら。。。

# 問題
typescriptをwebpackでコンパイル & eslintで構文チェックなどをやるとdevserverでのみ

```
ℹ ｢wdm｣: Compiled successfully.
ℹ ｢wdm｣: Compiling...
```
となってコンパイルが終わらないうえ`^C`で終了もできないという現象

# 結論
ts-loader
    ↓
 eslint
となっているのを
  eslint
    ↓
ts-loader
にすると治った

# 格闘
stackoverflowなどを回ってもなかなか情報がない
↓
ひたすらプラグインをon/offしてみる
↓
治るどころかプロセスが増える
↓
消す
↓
https://qiita.com/riversun/items/d27f6d3ab7aaa119deab
この記事を見てメモリ上にデータがあるということを知る
↓
メモリ上にあるなら(devserverなら)意味ない物をdevserverならoff、でなければonという形にした
**ここでeslintの存在を思い出す(重要)**
↓
eslintのfixオプションをoffにして見る
↓
**大量のエラー！**
(インデント関係でした)
↓
不思議に思ってconfigを眺める
↓
_もしかしてtscのコンパイル後の結果のインデントが元のファイルに沿ってなかったんじゃね？_と思ってeslintとts-loaderを入れ替える
↓
エラーが出なくなる

# 経緯
configのrolesを見直した時になんとなくeslintをts-loaderの後に記載したのが原因
もともと`enforce: true`と書いてあったが意味がわからず消してしまった
次から帰る前にドキュメント読もう。
KarabinerでCtrl + [をEscの代わりにする設定

表題の通りKarabinerでCtrl + [をEscの代わりにする設定です。

VSCodeでVimのキーバインドを導入した際、EscがCtrl+]に割り当てられており、キーバインドを変更してみたのですが、効果がなかったのでOSレベルでキーバインドを変更してしまいます。

```json:~/.config/karabiner/assets/complex_modifications/vim-esc.json
{
    "title": "Change ctrl+[ to ESC",
    "rules": [{
        "description": "Change ctrl+[ key to Escape key",
        "manipulators": [{
            "type": "basic",
            "from": {
                "key_code": "open_bracket",
                "modifiers": {
                    "mandatory": ["control"]
                }
            },
            "to": [{
                "key_code": "escape"
            }]
        }]
    }]
}
```

上記ファイルを作成すれば自動的にComplex ModificationsのAdd Rule内に項目が出てくるのでEnableをクリックするだけです。

ちなみに環境はMac (JIS配列) + 外付けUS配列キーボードでした。
Next.js + TypeScript 環境を爆速で作る

## 必要なパッケージをインストール

```console
npm init -y
npm i next react react-dom @zeit/next-typescript && npm i -D @types/next @types/react @types/react-dom
```

## 設定ファイルの作成

`next.config.js`を作成し、以下を記述。

```js
const withTypescript = require('@zeit/next-typescript')
module.exports = withTypescript()
```

`.babelrc`を作成し、以下を記述。

```js
{
  "presets": [
    "next/babel",
    "@zeit/next-typescript/babel"
  ]
}
```

`tsconfig.json`を作成し以下を記述。

```json
{
  "compilerOptions": {
    "allowJs": true,
    "allowSyntheticDefaultImports": true,
    "jsx": "preserve",
    "lib": ["dom", "es2017"],
    "module": "esnext",
    "moduleResolution": "node",
    "noEmit": true,
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "preserveConstEnums": true,
    "removeComments": false,
    "skipLibCheck": true,
    "sourceMap": true,
    "strict": true,
    "target": "esnext"
  }
}
```

`package.json`の`npm script`を変更

```js
{
  "scripts": {
    "dev": "next",
    "build": "next build",
    "start": "next start"
  }
}
```
## コンポーネントを作成

`pages/index.tsx`を作成し、以下を記述。

```tsx
export default () => <h1>Welcome to Next.js for TypeScript!</h1>
```

## ローカルサーバー立ち上げ

以下のコマンドを実行し、ローカルサーバーを立ち上げ。

```console
$ npm run dev
```

[http://localhost:3000](http://localhost:3000)に、`Welcome to Next.js for TypeScript!`があれば成功。

## もっと爆速に環境を構築したい
ちまちまシャラクセー！！って方は、こちらで。

```console
npx create-next-app --example with-typescript with-typescript-app
npm install
npm run dev
```
[TypeScript Next.js example](https://github.com/zeit/next.js/tree/canary/examples/with-typescript)
Kaminariで各cssフレームワークのviewを生成する

## やること

- ページネーションできる便利なkaminariのpaginationのviewを各CSSフレームワークでいい感じに出力できる
- https://github.com/kaminari/kaminari#themes
- 導入などは他の記事参照

## やりかた
```
$ rails g kaminari:view THEMA
```

THEMAの部分を使っているCSSフレームワークを入力する

ちなみにTHEMAの部分を空欄にして実行したら以下の感じで出力された


```
    - default
        The default one.
        This one is used internally while you don't override the partials.
    - bootstrap2
            bootstrap2
        - bootstrap3
            bootstrap3
        - bootstrap4
            bootstrap4
        - bourbon
            bourbon
        - bulma
            bulma
        - foundation
            foundation
        - foundation5
            foundation5
        - github
            github
        - google
            google
        - materialize
            materialize
        - purecss
            purecss
        - semantic_ui
            semantic_ui
```

例えば`semantic-ui`のCSSフレームワークのviewを出力する場合は

```
$ rails g kaminari:view semantic_ui
```

とすれば良い

## バージョン

```
Rails:5.2.2
ruby:2.5.1
kaminari:1.1.1
```
VSCode で関連拡張子を追加する

+ File->Preferencs->Settings

![vs00.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125746/bbe4dd9e-dbe4-fa22-2ce9-38a4312a3b23.png)

+ associations で検索

![vs01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125746/d540d40f-03ab-8ed5-24d9-235b168f3c3f.png)

+ Edit in settings.json をクリック

+ 新しい関連拡張子を追加

![vs02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125746/32b41ba1-d2b7-3bfa-7102-b1bbcc2bc999.png)
AutoHotkeyによるキーバインド設定について(Windows)

#はじめに
特定のキー組み合わせで上下左右キーが打てるキーボードありますよね。あれはかなり便利だと思います。しかし、違う環境のPCを使うとき、キーボードが異なるため使うことができません。また、vimやemacs, vscodeのエディタにはありますが、何らかの理由でエディタを変更したとき、使えません。新たに覚えなおすのは大変です。そこで、AutoHotkeyを用いたキーバインド設定を紹介します。

#自分的なキーボードの不満
無変換キーと変換キーが全く使わないのにとても押しやすい位置にあります。これはもったいないので、これらのキーを使って便利にしようと思います。

#AutoHotkey
AutoHotkeyは、スクリプトを書くことで、キーバインドを設定できるソフトです。キーバインド設定だけでなく、マウス操作、キー押下の時間、連打も設定できます。ウィンドウを作成することもできるので、簡単なGUIも作成できます。

簡単なキーバインド設定をするだけでもとても便利です。

#AutoHotkeyの導入
1．[AutoHotkeyのHP](https://www.autohotkey.com/)からInstallerをダウンロードしてインストール
2．適当なファイルを作成し、メモ帳などで編集してコードを記載、拡張子を変更するなどしてahkファイルを作成します

#設定の紹介
キーボードの組み合わせの例です。

```
;;上下左右移動、無変換キーをScrollLockに割り当てた状態を想定
sc079 & l::Send, {Blind}{right}
sc079 & j::Send, {Blind}{left}
sc079 & i::Send, {Blind}{up}
sc079 & k::Send, {Blind}{down}
```

;;はコメントアウトです。この例では、sc079というのは変換キーのキーコードです。l, j, i, kはそれぞれそのキーのことです。変換キーとl, j, i, kキーが押されたとき、Send関数によって, の次のコードが読まれ、カーソルの上下左右を打つことができます。

#ここで問題
変換キーと無変換キーは、**キーボードドライバによって読み込まれないことがあります。**
どうしようかと考えたときに、ChangeKeyというソフトを発見しました。

#ChangeKey
レジストリを書き換えることでキー設定を変更するものです。今回はこれを使って、変換キーにScrollLockキーを割り当てました。

#割り当て後のキー設定

```
;;上下左右移動、無変換キーをScrollLockに割り当てた状態を想定
ScrollLock & l::Send, {Blind}{right}
ScrollLock & j::Send, {Blind}{left}
ScrollLock & i::Send, {Blind}{up}
ScrollLock & k::Send, {Blind}{down}

;;単語移動と行頭末尾移動
ScrollLock & o::Send, {Blind}^{right}
ScrollLock & u::Send, {Blind}^{left}

;;マウスクリックとエンター
ScrollLock & Space::Send, {Blind}{Enter}
ScrollLock & w::MouseClick,left,,,,,D
ScrollLock & w Up::MouseClick,left,,,,,U
ScrollLock & R::MouseClick,right,,,,,D
ScrollLock & R Up::MouseClick,right,,,,,U

;;無変換キー＋CTRLでマウス移動
ScrollLock & s:: MouseMove, -20,0,0,R
ScrollLock & f:: MouseMove, 20,0,0,R
ScrollLock & e:: MouseMove, 0,-20,0,R
ScrollLock & d:: MouseMove, 0,20,0,R

ScrollLock & z:: MouseMove, -400,0,10,R
ScrollLock & v:: MouseMove, 400,0,10,R
ScrollLock & c:: MouseMove, 0,-400,10,R
ScrollLock & x:: MouseMove, 0,400,10,R
Return
```
私の設定はこれになります。ScrollLockになっている変換キーを押しながら、&　の後のキーを押すことでこの動作をします。MouseClickはマウスのクリックで、leftが左クリック、rightが右クリックです。Dが押下、Uが押した後上げる動作です。クリックなので、押して上げる必要があります。MouseMoveはマウス移動で、移動のx座標, y座標, 移動速度, Rがあれば相対座標になるという順番で書かれています。

#終わりに
かなり便利なので、ぜひ使ってみてください。自分が便利になる設定を探して、幸せになりましょう。
インピーダンスミスマッチについて本気出して考えてみた - 酔いどれ設計ナイト2019

## 自己紹介

- Twitter: @a_suenami 
- Ruby書いてる
- 最近はフロントエンドもがんばってる
- RDBが好きなのでそれっぽいことをよくつぶやいてる
- 酒と肉が好き

---

## 今日話すこと

- 今日話すことになった経緯
- そもそもインピーダンスミスマッチって
- リレーショナルモデルとは何か
- リレーショナルモデルとERモデル
- 項中心の世界と実体中心の世界
- リレーションの種類とテーブル
- まとめ

---

## 今日話すことになった経緯

![スクリーンショット 2019-04-13 11.08.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/662/3574843c-9d2e-4e2a-b260-991a90453660.png)

---

## 今日話すことになった経緯

![スクリーンショット 2019-04-13 11.06.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/662/754e3568-9805-f8b3-8a70-97c404a5b519.png)

---

## 今日話すことになった経緯

![スクリーンショット 2019-04-13 11.07.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/662/818bc505-766c-dd61-2668-ecb2267c2b16.png)

---

## 今日話すことになった経緯

というわけでここにいます。

---

## そもそもインピーダンスミスマッチって

> コンピュータシステムでは、物理的なちゃんとした対応があるアナロジーではないが、APIなどのようなレイヤや領域が異なるシステム間の界面（インタフェース）に
おいて、想定された設計と異なる使われ方（ユースケース）であったり、「セマンティックギャップ」がある場合に、その界面を挟んだ処理の効率の低下や、プログラミ
ングなどの実装の工数の著しい増加などといった非効率が発生することから、そういった不整合を「インピーダンスミスマッチ」と俗に呼ぶことがある。
> 特に、アプリケーション開発においてしばしば発生するオブジェクト指向言語とリレーショナルデータベースとのギャップのことを指す[1]。[2]システム開発上、煩雑
となりがちで生産性が著しく低下する要因として挙げられる。主に、この問題を解決するO/Rマッピングなどの手法を説明する文脈で用いられる。

by Wikipedia

---

## そもそもインピーダンスミスマッチって

> オブジェクト指向プログラミングとリレーショナルデータベースは異なるデータモデルを持つ。リレーショナルデータベースの関係モデルは整合性を重視した２次元表
の構造を持っており、データ同士は関係（リレーション）によって表現される。一方オブジェクト指向プログラミングのデータはひとまとまりのオブジェクトとして扱わ
れ、関係モデルにおける関係と同じような構造を持つとすれば、オブジェクト指向としての恩恵が得られるモデル設計ができない。

なんかこの説明はもにょるけど、言いたいことはなんとなくわかる。つまり、データモデルの違いの話。

---

## オブジェクトとリレーション

- 「オブジェクトとは何か？」っていう話をし始めるとあらゆる方向からマサカリが飛んできそうなので今日はあまり踏み込まない。
- とりあえず今日この発表においてはクラスベースオブジェクト指向における、クラスおよびインスタンス、つまりは「データとそれに付随する手続きをひとつにまとめたもの」とします。

---

## リレーショナルモデルとは何か

- N項関係をベースとするデータモデルで、関係とはある命題を満たすN個の項の組み合わせの集合のことをいう。
  - 自然数（1以上）の項 x, y, z があった場合、x + y + z = 4 という命題に対する3項関係は (1,1,2), (1,2,1), (1,1,2) を要素とする集合になる。
- 閉世界仮説に基づく。
  - 「現時点で存在を知りえない事実は存在しない」と見なす
- リレーショナル演算を用いることによって、ある関係から別の関係を導出することができる。
- 関係はタプルの集合であり、タプルの形は選択演算や結合演算によって柔軟に変わる。

---

## リレーショナルモデルとERモデル

- RDBのテーブル、カラム、インデックス、制約などの設計に使われるモデルとしてリレーショナルモデル以外にERモデルがある。
- リレーショナルモデルよりむしろERモデルを用いるほうが一般的。（だと思う

---

## 項中心の世界と実体中心の世界

- リレーショナルモデルは言うなれば項中心の世界で、その項が何者であるかはその定義域（ドメイン、データ型）によってのみ決まり、項の間に優劣や主従はない。
  - 項の間の関係はリレーショナル演算によって見出され、逆に言うとそれによってのみ項間の関係は決まる。
- ERモデルは実体があり、それに属する形で属性項目があるため、明確な主従がある。

---

## リレーションの種類とテーブル

- 基底リレーション(base relation)と導出リレーション(derived relation)がある
    - 基底リレーションは冗長性を持たない（正規化されている）リレーションで、導出リレーションは基底リレーションをもとにリレーショナル演算をした結果得られたリレーションのこと
- 保存リレーション(stored relation)というのもある
    - 実際にディスクに書き込まれているリレーションで、要するに我々がテーブルとして定義するもの
    - コッドは基底リレーションと保存リレーションを区別していない

---

## まとめ: 各モデルの特徴と設計観点

こんな感じのことを意識してモデリングすればいいのではないか？（意見歓迎）

| モデリング手法 | 実装対象 | 設計観点 |
|:-------------|----------|----------|
| オブジェクト  | クラス（のメンバーフィールド） | ロジック実装  |
| ERモデル  | テーブル、外部キー制約  | データのライフサイクル、状態遷移  |
| リレーショナルモデル  | クエリ、ビュー、タプル | 同時に参照/計算に利用したい  |
Vagrantのスナップショット機能を使う

開発環境をVagrantにしようとしたときのメモ。

## スナップショット機能

環境をいろいろと試行錯誤するときに失敗しても元に戻せるようにスナップショット機能を
利用してみました。

## Save/Restore でスナップショットの取得/リストア
### スナップショットを取得

```bash
vagrant snapshot save {セーブポイント名}
```

### スナップショットからリストア

```bash
vagrant snapshot restore {セーブポイント名}
```

## Push/Pop でスナップショットの取得/リストア
save/restoreとの大きな違いは、popでリストアするとスナップショットも
削除されます。

### スナップショットを取得

```bash
vagrant snapshot push
```

### スナップショットからリストア

```bash
vagrant snapshot pop
```

## スナップショットのリストを見る

```bash
vagrant snapshot list
```

## スナップショットを削除する

```bash
vagrant snapshot delete {セーブポイント名}
```

## 最後に
まあ、結局、仮想のイメージはVirtualBoxにあるので、そちらでもできるんでしょうがコマンドだけで実行できるので便利ですね。
フィボナッチ数列を取得する（再帰）

Qiitaへの投稿、Go言語の練習がてら投稿

### フィボナッチ数列　漸化式（Wikipedia参照）
```math
F_0 = 0\\
F_1 = 1\\
F_{n+2}=F_{n+1}+F_n (n≧1)\\
```
Fnの時の値を求める、再帰的に処理を行うため

```math
F_n=F_{n-1}+F_{n-2}

```


### ソースコード
```golang
package main

import "fmt"

func main() {

	fmt.Printf("4番目の値 → %v \n", fib(4))
	fmt.Printf("5番目の値 → %v \n", fib(5))

	fmt.Printf("7番目の値 → %v \n", fib(7))
	fmt.Printf("23番目の値 → %v \n", fib(23))

}

func fib(num int) int {
	if num == 0 {
		return 0
	} else if num == 1 {
		return 1
	} else {
		return fib(num-1) + fib(num-2)
	}
}

```
【2019年4月版】LXC/LXDでホストのディレクトリをコンテナ内にコピーする

# ホストの特定ディレクトリだけ、コンテナ内にコピーしたい。

コンテナに**マウント**ではなく、**特定ディレクトリだけコピー**したい場合は以下のコマンド。

```console
$ tar cf - /path/on/host | lxc exec container -- tar xvf - -C /path/on/target
```
コンテナ内のカレントディレクトリに送り元と同じディレクトリ名で展開していいなら`-C`は省略可能です。

```console
$ tar cf - /path/on/host | lxc exec container -- tar xvf -
```

元ネタ：
https://github.com/lxc/lxd/issues/1218
Jupyter Notebook上の関数とクラスだけをimportする方法

# モチベーション
* 開発段階ではJupyter Notebookがとても便利なので使って開発したい！
* コマンドラインから実行できる`.py`も作りたい！
* でもそのためにはJupyterで定義した関数やクラスはコピペしなきゃいけないからめんどくさい！

そんなときに、Jupyter Notebookをmoduleとしてインポートできたら便利だと思いませんか？
[この記事](https://qiita.com/tdual/items/32d3918b4c8dd1f703e7)でもその方法が書かれていますが、これだとnotebook自体を一度実行しているので、重い処理を書いていたりするとインポートに時間がかかってしまったり、`print`などの出力も出てしまいます。

そこで今回は、**Jupyter notebookを実行せずに、そこで定義された関数やクラスのみをインポートする方法**を紹介します！

# Jupytextのインストール
まず`Jupytext`という、Jupyter notebookと同期した.pyファイルを生成してバージョン管理をしやすくするツールをインストールします。これ自体すごく便利なツールなので、インストールしておいて損はないと思います。

↓この記事がとてもわかりやすいので参考にしてください。
https://qiita.com/cfiken/items/8455383f32ee19dfbba3
記事の通りに進めて、Jupyter notebookと同期した`.py`ファイルを作成します。
ちなみにこの`.py`ファイルは、notebookの方を変更して保存すると勝手に同期してくれるので毎回生成し直す必要はありません。

今回は、[sample.ipynb](https://github.com/kamata1729/Jupyter_import_sample/blob/master/sample.ipynb)というnotebookを作成し、そこから[sample.py](https://github.com/kamata1729/Jupyter_import_sample/blob/master/sample.py)を生成しました。
[sample.ipynb](https://github.com/kamata1729/Jupyter_import_sample/blob/master/sample.ipynb)には関数&クラスの定義の他に、`print`文を含んだ実行される処理も含まれています。これをそのままimportした場合は、このprint文も実行されることになります。

# notebookのインポート
さてここから、notebookの関数とクラスだけをインポートしていきます。
コマンドラインから実行するための`run.py`を以下のように書きました。
やってることとしては、`.py`ファイルを読み込んで、必要な部分だけを残してコンパイルし直し、それをimportしています。

```run.py
# notebookの関数とクラスのimport
import ast
import types
import sys

# ここには先ほど生成した.pyファイルを入れる
with open("sample.py") as f:
       p = ast.parse(f.read())

for node in p.body[:]:
    # 関数定義、クラス定義、import文以外のものは呼び出されないようにする
    if not isinstance(node, (ast.FunctionDef, ast.ClassDef, ast.Import, ast.ImportFrom)):
        p.body.remove(node)

module = types.ModuleType("mod")
code = compile(p, "mod.py", 'exec')
sys.modules["mod"] = module
exec(code,  module.__dict__)

from mod import *

if __name__ == '__main__':
    # sample.ipynbで定義した関数とクラスの実行
    sample_class = SampleClass(10)
    print("run.py: SampleClass", sample_class())
    print("run.py: make_randint", make_randint(100))
```

これの実行結果は以下のようになります。`sample.ipynb`や`sample.py`の中のprint文は実行されずに**関数とクラスだけインポートされている**ことがわかります！

```
 $ python run.py
run.py: SampleClass [0 1 2 3 4 5 6 7 8 9]
run.py: make_randint 28
```

これでnotebookだけ変更すれば他の**全てのファイルも同期される**ようになります！
↓このリポジトリは完全にこのような方法で開発しているので参考にしてください
https://github.com/kamata1729/QATM_pytorch
TypeScriptで型レベルハイパー演算子

この記事はTS3.4.3で動作確認をしています。

# ハイパー演算子とは
```
hyper(1,a,b)=a+b
hyper(2,a,b)=a*b
hyper(3,a,b)=a^b
︙
```
のような演算子です(雑)
詳しくは[Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%8F%E3%82%A4%E3%83%91%E3%83%BC%E6%BC%94%E7%AE%97%E5%AD%90)を見て下さい。

定義だけ貼っておきます。

```
hyper(1,a,b)=a+b
hyper(_,a,1)=a
hyper(i,a,1)=hyper(i-1,a,hyper(i,a,b-1))
```

# 型レベルタプル操作
型レベルのタプル操作を行うので以下の記事を読んでおくといいかもしれません。
https://qiita.com/kgtkr/items/11c8dceae012ae306abe

ちなみに今回は上の記事の型レベルタプル操作などをまとめた自作ライブラリ`typepark`を使いますが機能は上の記事の通りです。

# 再帰制限回避テク
`F`や`G`が複雑な関数だと以下のような書き方をするとコンパイルエラーが発生することがあります。

```ts
type Hoge<T>=F<Cast<G<T>,any[]>>;
```

このような時は以下のように書き直すことで回避できます。

```ts
type Hoge<T>=F<G<T> extends infer X?Cast<X,any[]>:X>;
```

# 方針
* 筋肉で全列挙コードを書くと言った事は一切しない
* 数値リテラル型3つを受け取って数値リテラル型1つを返す関数を実装する
* 数が大きいと色々な制限に引っかかって死ぬけど気にしない

# 実装
数値リテラルを直接扱うのは大変です。
そこで`any`が`N`個のタプル型を数値リテラル型の`N`代わりに使う`_Hyper`関数を実装しましょう。
例えば`_Hyper<[any],[any,any],[any,any,any]>`は`[any,any,any,any,any]`です。

これは定義通りですね。
ところどころコンパイルエラー回避のテクニックを使っているくらいです。
数値リテラルの代わりにタプルを使っているので`A-1`は`Tail<T>`に、`A+B`は`Concat<A,B>`と言った書き方が出来ます。

```ts
type _Hyper<I extends any[], A extends any[], B extends any[]> = {
  0: Concat<A, B>,
  1: A,
  2: _Hyper<Tail<I>, A, _Hyper<I, A, Tail<B>> extends infer X ? Cast<X, any[]> : never>,
}[I extends [any] ? 0 : (B extends [any] ? 1 : 2)];
```
では数値リテラルを受け取り数値リテラルを返す関数はどう実装したらいいでしょうか？
タプル→数値リテラルと数値リテラル→タプルの変換が出来ればいいことが分かると思います。
前者は`T["length"]`と書くだけなので簡単です。
後者は以下のような`Repeat`関数を使いましょう。

```ts
export type Repeat<T, N extends number, R extends any[]=[]> = {
  0: R,
  1: Repeat<T, N, Cons<T, R>>
}[R["length"] extends N ? 0 : 1];
```

これも`typepark`に含まれていますが、Qiitaで解説してなかったので軽く解説しておきます。
要素`T`を`N`個持つタプルを返す関数です。
結果値が`R`なので`R`の長さが`N`になるまで`T`を`Cons`しています。

これで`Repeat<any,N>`と書くことで数値リテラル→タプルの変換が出来るようになりました。

では`Hyper`関数の実装です。

```ts
export type Hyper<I extends number, A extends number, B extends number>
  = _Hyper<Repeat<any, I> extends infer X ? Cast<X, any[]> : never, Repeat<any, A> extends infer X ? Cast<X, any[]> : never, Repeat<any, B> extends infer X ? Cast<X, any[]> : never> extends infer X ? Cast<X, any[]>["length"] : never;
```

ところどころコンパイルエラーを回避して実装しています。

```ts
Hyper<1, 1, 4>//5
Hyper<2, 5, 4>//20
Hyper<3, 2, 4>//16
Hyper<1, 100, 200>//数値が大きすぎてコンパイルエラー
```
ActiveAdmin.registerでassociationのfilterをすべて無効にする

`ActiveAdmin.register`で毎回`remove_filter`やるのめんどくさい。。
そしてそれをうっかり忘れてたらページがとんでもなく重くなることがある。。:fearful: 
（全association引っ張ってきてるので当然）

## 対応
`include_default_association_filters`というオプションがあるのでそいつを`false`にします。

```rb:config/active_admin.rb
ActiveAdmin.setup do |config|
  config.default_namespace = :hoge_admin

  # namespace単位で設定します。
  config.namespace(:hoge_admin).include_default_association_filters = false
  ...
```

以上です。
ActiveAdminはこういうの多いので大変 :hugging: 

## 参考
- [activeadmin/resource\_spec\.rb at master · activeadmin/activeadmin](https://github.com/activeadmin/activeadmin/blob/master/spec/unit/filters/resource_spec.rb#L34-L39)
np.arrayが他のnp.arrayに含まれるか判定

例えば、こんな感じになってた時、

```python

import numpy as np
a = np.array([1,2,4,2,5])
b = np.array([2,2,4,5])
c = np.array([1,3]) 
```

`b`が`a`に含まれてるか、`c`が`a`に含まれてるか、判定したいときのやり方です

# 1. `np.isin` を使う
`np.isin(arr1, arr2)`とすると、`arr1`の各要素が`arr2`に含まれているかのTrue/Falseのnp.arrayが帰ってきます
これを使って、

```python

sum(np.isin(b, a)) == len(b) # returns True
sum(np.isin(c, a)) == len(c) # returns False
```
のように判定することができます。
`np.isin`を`np.in1d`に変更しても全く同じ結果になります。

# 2. `np.intersect1d`を使う
`np.intersect1d(arr1, arr2)`で、`arr1`と`arr2`の共通部分を返してくれます。
デフォルトでは同じ要素は一つのみ返ってくるので、`np.intersect1d(a, b)`は`array([2, 4, 5])`を返すことになります。
それゆえ、以下のようにして比較できます

```python

len(np.intersect1d(a, b)) == len(np.unique(b)) # returns True
len(np.intersect1d(a, c)) == len(np.unique(c)) # returns False
```

# 3. 単純に`set`にして包含関係を見る
うだうだnumpyでやってきましたが、単純にこれでいいですよね

```python

set(b) <= set(a) # returns True
set(c) <= set(a) # returns False
```

他に良いやり方があったら教えてください
Eclipse で "Fail to load the JNI shared library" が表示された時の対処法

## 環境
- Windows10
- eclipse neon  
起動時に下記エラー  
![eclipse起動エラー.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275331/2edff9ee-ed62-43a3-52d6-0a06e0ee147e.png)

## 原因
- 環境変数Pathに通してあるJavaが何故か32bit だった

## 解決法
- 環境変数に64bit のJavaを通したら普通に起動した
Swift4 UIColloctionViewを使った時の表示順序

# はじめに

Swiftで、UICollectinViewを使った時に、view〜のライフサイクルとcollectionの表示のためのコールバックがどの順で呼ばれるかを調べたメモ書きです。
Xcode 10.2で調べました。

# 画面遷移時
他の画面から遷移してきた時の呼び出し順序です。

1. viewDidLoad
2. viewWillAppear
3. viewDidAppear
4. viewWillLayoutSubviews
5. viewDidLayoutSubviews

      この後collectionViewのコールバックが呼ばれます。
6. numberOfSections
7. collectionView numberOfItemsInSection (セクションの数だけ繰り返し呼ばれる)
8. collectionView cellForItemAt (section * item の数だけ繰り返し呼ばれる）

       そしてもう一組LayoutSubviews関係が呼び出されてました。
9.  viewWillLayoutSubviews
10. viewDidLayoutSubviews

# collectionView.reloadDate呼び出し時

この時は、当然view〜のライフサイクルのメソッドは呼ばれなく、collectionViewのコールバックのみ呼ばれます。

1. reloadData
2. numberOfSections
3. collectionView numberOfItemsInSection (セクションの数だけ繰り返し呼ばれる)
4. collectionView cellForItemAt (section * item の数だけ繰り返し呼ばれる）
Lora Beacon with 4 Button in RAK811

RakWirelessのRak811 LoraButtonとRAK811 TrackerBoardの良いとこ取り状態のデバイスを作ってみました。
私が2016年から開発しているBluetoothBeaconの意匠をそのままに中身をLoraにしたものです。
(回路図を見るとわかりますが。LoraButtonとTrackerBoardのあわせ技です）

ちなみに、この製品企画は2017年のInaHackで発表したものでもあります。

左はBluetoothBeaconで、同じ外装の中に入れることが可能です。
![Lora-beacon.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/12a38d0a-99f9-bcd8-4b93-3ac258cf59c9.jpeg)

RakWirelessのRAK811製品と比較してみましょう。
![LoraButton-all-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/871edd9a-a546-3db9-2f00-dd0ac1a4449b.jpeg)
![lora-button-all-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/992ece0a-365c-308b-3377-28833934db53.jpeg)

私がBeaconを設計した時に、ボタンの数を3個以上にする必要がありました。
最終的に、最適な数として4個にしました。
LoraButtonのボタン数は私の考えを裏付けており、私がRakWirelessを好きになった理由でもありますw
RAK811 TrackerBoardは、サイズ的にもすごくいいです。
今回ボタンを操作する前提で考えた為にこのサイズですが、ボタンが無い場合は、TrackerBoardにリポを搭載するのが良いと思います。
今回バッテリーの充電回路を入れていませんが、本来は搭載すべきです。
アンテナは最適なサイズの物が見つからなかった為、かなり大きいものを採用しており、UFLを使用することも可能です（C7,C8はそれようのキャパシタのランドです）

試作品にしてはキチンと動く物が出来てかなりうれしい限りですｗ
(実際は、1回目にモジュールのピンアサインミスをし、今回は、Li3DHを縦横間違えてハンダ付けして直しており、Mic5219が載っているのは5V、充電系を入れる前提だからですw）
pgAdmin4ではまった

#pgAdmin4の使い方
　ちょっとトラブったのでメモ

#トラブったこと
　-行が追加できない
　-データがはいらない

#行が追加できない
　なんのことはない、プライムキーが設定されていないとだめみたいでした
　プライムキーがあれば、最下行に空白が表示されて大丈夫です。

#データがはいらない
　データを変更したあと、「save」というのを押せばDBに反映するようです。
　oracle developperだと、commitだったのだけど、「save」なのかなあ？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60225/f866e9a3-cb41-851e-2eb0-cd245c25ad5c.png)

#クエリーツールとデータの閲覧／編集
テーブルを右クリックすると「データの閲覧／編集」と「クエリーツール」というのが出てきます。「クエリーツール」というのは、上の図の上のペインが活性化されて、それを実行すると下のペインに表示されます。こちらでは、データの編集はできません。ただ、表示するだけです。

「データの閲覧／編集」は選択したテーブルの一覧を表示して、データを編集するのに使います。

ナビゲータの上の３つのアイコンは「クエリツール」と「データの表示」＝データの閲覧／編集に対応しているようです。

#ubuntoで苦戦
windowsだとposegres-11でpgadmin4でいいんだが、ubuntoにpgadmin4がなかなか入らないし、windows上のpgadmin4からvmwareにインストールしたpostgresql-10との接続がうまくいかない。単に設定の問題だと思うけど、わかったら更新しましょう。

#他のホストとの通信
上の通信できないのがうまくいきました。その設定
vmware側のpostgreの/etc/postgresql/10/main/postgres.confの
listen_addrs='*'
に変更（元はlocalhost)

/etc/postgresql/10/main/pg_hba.confに
\#ipv4の下に
host all all 0.0.0.0/0 trust
を追加

#感想
まあ、まあ使えそうだけど、やっぱりoracle developperはすげー！と思った。そうそう、oracle developperでもpostgreを参照はできるんだけど、データの追加ができないんだよなあ・・残念だなあ
PowerAppsとは

#はじめに
業務でPowerAppsを扱うことになり、PowerAppsについて１から勉強することにしました
ここでは学習したことを随時発信していこうと思います！
分からない所も多く間違い等あるかもしれませんが、その際はご指摘いただけますと助かります


#今回のテーマ
PowerAppsについて理解する


#PowerAppsとは
>PowerApps は一式のアプリ、サービス、コネクタ、データ プラットフォームであり、ビジネス ニーズに合わせたカスタム アプリを短期間で開発する環境を提供します。 PowerApps を利用することで、基になるデータ プラットフォーム (Common Data Service) "と" さまざまなオンライン/オンプレミス データ ソース (SharePoint、Excel、Office 365、Dynamics 365、SQL Server など) の "いずれか" に保存されているビジネス データに接続するカスタム ビジネス アプリを短期間で作成できます。
PowerApps で作成されたアプリはビジネス ロジックとワークフローの機能性に優れ、手作業のビジネス プロセスを自動化されたデジタル プロセスに変換します。 さらに、PowerApps で作成されたアプリは設計上、応答性に優れ、ブラウザーやモバイル デバイス (スマートフォンやタブレット) で滑らかに実行できます。 PowerApps はカスタム ビジネス アプリを作成する能力をあらゆるユーザーに与えます。ユーザーはコードを記述することなく、機能が豊富なカスタム ビジネス アプリを作成できます。
PowerApps はまた、プラットフォームの拡張性に優れ、プロの開発者はプログラミングでデータやメタデータを操作し、ビジネス ロジックを適用し、カスタム コネクタを作成し、外部データと統合できます。

PowerAppsは2016年11月にリリースされたビジネスアプリケーション作成ツールです

プログラミング無しで簡単にビジネスアプリケーションを作成できるのが特徴です
PowerPointのような直観的な操作＋Excelのような関数を入力するだけでビジネスアプリケーションが作れるようになっています

#何のために提供されたのか
PowerAppsを使えば簡単にビジネスアプリケーションを作れるということは分かりましたが、そもそもどんな目的で提供されたのでしょうか？

**Dynamics365との比較**
PowerAppsと同時期にDynamics365と呼ばれるCRMが提供されました
Dynamics365ではセールス、カスタマーサービス、マーケティングなど9つのビジネスアプリケーションを提供しています

ですが、これらの機能だけで全体の業務を回せるかというとなかなか難しいです
Dynamics365の提供するビジネスアプリケーションがカバーできる範囲というのは限定されています

そこでPowerAppsの出番です
本来の機能でカバーできない領域にITを浸透させることにより、組織全体の業務プロセスの効率化や情報共有力を向上させることができます
<br>

**「開発ではなく作成」**
PowerAppsは「開発ではなく作成」といわれます

開発＝プログラミングが必要なので、開発ツールごとに異なる開発言語や専門技術を持った人が必要になってきます
それに比べてPowerAppsはビジネスアプリケーションを作成するツールなのでプログラミングを必要としません

また実際に開発するとき、開発の必要性を感じたユーザーが情報システム部門へ依頼し、要件を定義して開発へ進むという流れになります
それに対しPowerAppsはユーザーが主体となってビジネスアプリケーションを作成できるようになります

情報システム部門を挟むことなくユーザー自らが業務実態に即したビジネスアプリケーションを作成できるため、より迅速に開発が出来るようになります


#特徴
PowerAppsには以下のような特徴があります

**１．OSやブラウザに依存しない**
PowerAppsはOSやブラウザを問わず、どの環境下でも使用することができます
またPowerAppsで作成して保存したアプリは、WindowsやMacブラウザ、そしてiOSやAndroid（専用のモバイルアプリが必要）などで動きます
PC向け、モバイル向けにそれぞれ別のアプリを作成する手間がかかりません

**２．コネクタを使ったデータ連携**
PowerAppsではMicrosoft系のサービスやその他の外部サービス（kintoneやSalesforce）など延べ200種類以上のデータと連動することができます
さらにDropboxなどのクラウドサービス、TwitterなどのSNSにも接続が可能です
オンプレミスのデータベースとも連動することができます

**３．自動バージョン管理**
PowerAppsで作成したアプリは、保存と発行の2ステップでユーザーに展開します。
まず自分で試してみて、動作に問題がなければ「発行」というものを押して社内のユーザーに展開します

展開されたアプリは自動的にバージョン管理されるようになっています
仮に発行したアプリで何か設定を間違えていた場合は、ワンクリックで1つ前のバージョンに復元することが可能です


#実際にPowerAppsを立ち上げてみる

今回はPowerAppsの無料試用版を使っています
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373059/c8cb0159-f833-d284-2160-9d6994c67414.png)

**キャンバスアプリ**
主にこちらの方で実際のアプリを開発していくイメージだと思います
テキストボックスやボタンを挿入したり、ページ遷移やボタンのクリックによるアクションなどは全てPowerAppsの関数で書くことができます

**モデル駆動型アプリ**
見た目はDynamics365で、グラフやダッシュボードなどのDynamics365の機能を使用することができます

次回は実際にキャンバスアプリを使い、アプリを作成してみようと思います

#参考
Microsoft PowerApps　公式リファレンス
https://docs.microsoft.com/ja-jp/powerapps/powerapps-overview

最近よく聞く「PowerAppsって何？その概要を5分で解説！」
https://www.cloudtimes.jp/dynamics365/blog/what-is-microsoft-powerapps.html

ASCII.jp Excelとパワポの知識だけで業務アプリを開発できる「PowerApps」とは
https://ascii.jp/elem/000/001/669/1669792/

データのじかん　パワポ気分でアプリが簡単に「作成」できる『Microsoft PowerApps』とは？
https://data.wingarc.com/microsoft-powerapps-10278

PowerApps モデル駆動型アプリとDynamics365
https://qiita.com/dinok/items/3203e3338bda1e12b382
Cognos Analytics レポート リストでデータの並び順やグルーピングや集計の指定をする

#リストでデータの並び順やグルーピングの指定
リストの表示を、単にデータが並んでいる結果の表示ではなく、画像のイメージのように製品ラインでグループ化や並べ替え規則を指定し、グループ毎の集計行を追加する事で、見栄えを良くする手順です。
![012.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/543b6f4d-dd86-7d19-bd92-57fe797ad7d7.jpeg)


#手順
A1.Reportを開始点とする。
![001.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/06770d1f-2a53-ead2-8f62-6ae09b9019cd.jpeg)

実行時のイメージはこの表示
このままだとデータが並んでいるだけで、何だかみにくいかと思います。
![002.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/7ac5ef1b-de60-a269-6fab-6fed36d06ba5.jpeg)

「製品ライン」の本体部分を選択した状態で、赤枠の「グループ化/グループ化を解除」を選択。
![003.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/95329884-b884-01bb-dc9d-e4f8fb18ad26.jpeg)

レポートを実行するとこの表示。
多少見やすくなりました。
![004.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/b3f95d0c-f1f4-eca7-e691-0f07abc5ee89.jpeg)

「製品ライン」の並び順は、日本語名称でのソート順ですが、実は製品ラインには「製品ラインコード」というコード番号があったとして、コード順に並べたいとします。

「クエリー1」に移動。
![005.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/cac80509-ec9c-a07c-38e1-38b39e973aa7.jpeg)

「製品ライン コード」をクエリー1に追加。
![006.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/003e33da-121e-06d2-8bf8-380755bbbe76.jpeg)

「ページ1」に移動。
![007.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/ab75e28c-2846-0da7-a707-4982fad39d58.jpeg)

「リスト」の左上部分をクリックし、プロパティから「グループ化とソート」を開き、図のように「製品ライン コード」を「ソートアイテムのリスト」に配置し「OK」。
![008.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/2a459371-1a23-a7a8-4440-98e592f70f78.jpeg)

レポートを実行するとこの表示。
製品ラインが「製品ラインコード」の昇順で並び替えられています。
![009.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/655ec355-26ae-99bf-91b0-a6d8f9b0d716.jpeg)

「製品ライン」グループ毎の集計行を入れてみたいと思います。
「数量」の本体部分を選択し、赤枠の「集計」アイコンのプルダウンから「合計」を選択。
![010.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/01dc6413-354b-a783-7bd8-29e71aedec92.jpeg)

この状態となるので、レポートを実行。
![011.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/f7a98b39-f05d-1d96-c1c1-40c786812387.jpeg)

レポートを実行するとこの表示。
最初よりかなり見やすくなっていると思います。
![012.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/b9052e73-3ea4-31f3-29fb-8b374003ad26.jpeg)

A9.Reportとして保存。


#自己学習記事一覧
**Cognos Analytics をエンドユーザーの方に自己学習して頂くためのサイト**
https://qiita.com/shinyama/items/95885c7246dc413b6448
CrowiでとあるREVISIONととあるREVISIONの差分を見たい

# 概要
[Crowi](http://site.crowi.wiki/)よいです。
差分も見れて良いです
<img width="753" alt="スクリーンショット 2019-04-12 17.20.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3800/c578d87e-ba81-8f30-d952-0563d78ce2d3.png">

ただ連続したREVISION同士の差分しか見られません。
たまにとあるREVISIONととあるREVISIONの差分を見たくなります。
**知らないだけで見る方法があったら教えてください**

# とあるREVISIONととあるREVISIONの差分を見たい
## install
```
% npm i -g crowi-page-diff
% crowi-page-diff
crowi-page-diff PAGE_ID OLD_REVISION_ID NEW_REVISION_ID
```

## 差分確認
```
% export CROWI_URL=https://demo.growi.org
% export CRWOI_TOKEN=<必要があれば>
% crowi-page-diff 5c9403b8ef06c40058a243e8 5caab014ef06c40058a244c2 5caeecdcef06c40058a244ea
Index: /
===================================================================
--- /	2019-04-08T02:21:08.619Z
+++ /	2019-04-11T07:29:32.346Z
@@ -1,10 +1,6 @@
 # Overview

-
-<span style="color:red;">赤文字テスト</span>
-<iframe width="560" height="315" src="https://www.youtube.com/embed/FwCqxHGfHAk" frameborder="0" allowfullscreen></iframe>
-
 文字の装飾

 太字

@@ -65,10 +61,8 @@
 ハイパーリンク

 https://www.qoosky.io/help/general#ハイパーリンク

-https://www.qoosky.io/help/general#ハイパーリンク
-
 ハイパーリンクの使い方

 [ハイパーリンクの使い方](https://www.qoosky.io/help/general#ハイパーリンク)

@@ -165,9 +159,8 @@
 | test | test2 | test3 |
 | ---- | ----- | ----- |
 | $lsx(/Backend) | $lsx(/Altair)      |  $lsx(/test)|

-![](/attachment/5c9c7138ef06c40058a2443e)
 [testmovie.mov](/attachment/5c9c71a7ef06c40058a24440)

 [![wercker status](https://app.wercker.com/status/595b761d0e26796ddb304679f7bf27de/s/master "wercker status")](https://app.wercker.com/project/byKey/595b761d0e26796ddb304679f7bf27de)
 [![dependencies status](https://david-dm.org/weseek/growi.svg)](https://david-dm.org/weseek/growi)
```

# まとめ
とあるREVISIONととあるREVISIONの差分は見られたけど、ブラウザでお手軽に見たい
**お手軽に見る方法があったら教えてください**
【情報設計】意図を表明する

# まとめ

- 自分の意図は自分の言葉に現れる。
- 自分の意図の範囲で、われわれは「良い」とか「悪い」とかいった言葉を使っている。
- 伝言ゲームでは意図は歪んで伝わる。よって、言葉を自分の意図した通りに使う訓練を行うと良い。

# エクササイズ
自分の意図の通りに、自分の言葉を使う。
そのために、自分の仕事はユーザにどう思われるのが理想なのか、形容詞で表現する。

- 自分の仕事をユーザに以下のように形容してもらうことが理想です：
    - 楽になりました
    - そんな考え方もあったのですね
    - 勇気づけられました
    - わかりやすいですね
    - そういう理由だったのですね
    - しっかりしてますね
- つまり、以下のようには形容されません：
    - 素早い対応ですね
    - すぐに効果が出ますね
    - 安価で便利で、助かります

# 所感
マーケティングには、商品の差別化について戦略を一貫させるために、[３つの軸](http://www.sandt.co.jp/sabetsukajiku.htm)で商品について考えることを行う。

- 手軽軸
    - 早い、安い、美味い
- 商品軸
    - 高品質、最新技術で差別化
- 密着軸
    - 顧客の個別ニーズに応えて差別化

自分の場合は、密着軸に少し商品軸が混じっていて、中途半端な感じだ。
**ただ、手軽軸ではない**。

密着軸か商品軸かの、どちらか。
それが自分の意図なのだ。
Einstein Next Best Actionお試し

#1.Einstein Next Best Actionとは
Einstein Next Best Actionは**AIではありません**。
Einstein Next Best Action で**適切なおすすめ**を、**適切なタイミング**で、**適切なユーザ**に表示します。

**Lightning Experience と Salesforce Classic に適用されます。** 

- **Lightning レコードページ**
  - Einstein Next Best Action コンポーネント
- **Lightning コミュニティページ**
  - 推奨アクションコンポーネント
- **Visualforce ページ**
 - lightning:nextBestAction コンポーネント
  
#2.構成要素
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332907/173ec9bc-ec8f-b75d-abb4-37eefd2d29d8.png)
#3.実装例
##3.1.おすすめタブ設定
**おすすめタブは「タブを隠す」から「デフォルトで表示」に設定する**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332907/9fefe9c8-b1a2-c44f-1b43-12b56f1359f4.png)
##3.2.オブジェクトカスタマイズ
**取引先オブジェクトに「点数」項目を追加する**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332907/a2e3c78b-2fa0-2213-73c9-5f695cffbb80.png)
**おすすめオブジェクトに「カテゴリ」と「点数」項目を追加する**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332907/65f08836-e859-e0ac-5704-406bd396b62a.png)
##3.3.お客さん採点フロー作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332907/0653cdd7-1de0-e5c5-2306-0b999b28988e.png)
##3.4.おすすめデータ作成（2件）
**1件目**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332907/f3e68362-b9c4-e552-7935-b7d5f74c52ca.png)
**2件目**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332907/6b4af503-5960-eded-6dc3-757e04e98b5b.png)
##3.5.Strategy Builder作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332907/b938a1ab-bf6d-fb52-7c67-c931c3928cf7.png)
##3.6.画面表示設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332907/0febd0f6-4117-3c28-652f-35ae460ef620.png)
#4.結果確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332907/d0c1785a-a064-c383-7315-c606f86cc83b.png)
Onsen UIコンポーネントのデザインをAndroidとiOSで統一する方法

ons.platformのselect()メソッドでプラットフォーム名（android, ios, etc.)を指定してあげれば良いです[^1]。
Onsen UIをインポートした直後に記述します。


[^1]: https://ja.onsen.io/v2/api/js/ons.platform.html#method-select
オレオレコマンド集　キホンのk【随時更新】


#### Docker
| command | Description |
|:-:|:-:|
|  docker ps -a |  全コンテナ表示 |
| docker exec -it [コンテナ名] bash  | コンテナに入る  |
| docker stop $(docker ps -q)  | 全コンテナ停止  |
| docker rm $(docker ps -q -a)  | 全コンテナ削除  |
|  docker rmi $(docker images -q) | 全イメージ削除  |

#### Git
| command | Description |
|:-:|:-:|
| git clone [url] | 既存リポジトリの複製取得 |

#### Firebase
| command | Description |
|:-:|:-:|
| firebase login | ログイン（要Googleアカウント） |
| firebase init | 初期化 |
| firebase use [プロジェクト名] |  プロジェクトを使う |
| firebase deploy |  デプロイする |
| firebase hosting:disable  | ホスティングを停止 |

#### IntelliJ(Mac)
| command | Description |
|:-:|:-:|
| Option + Command + L | コードフォーマット | 
| Control + Option + O | インポート |

#### 
| command | Description |
|:-:|:-:|
|   |   |

#### 
| command | Description |
|:-:|:-:|
|   |   |

## おまけ
#### 二郎系
| command | Description |
|:-:|:-:|
| ヤサイ | 野菜追加 |
| ニンニク  |  ニンニク追加 |
|  アブラ |  背脂追加 |
|  カラメ |  味の濃さ |
|  ヤサイ、カラメ |   |

#### 家系
| command | Description |
|:-:|:-:|
|  カタメ、オオメ、コイメ | （麺）固め、（脂）多め、（スープ）濃いめ  |
|  ライス | 白米  |
AWS Marketplace にある Amazon SageMaker についてまとめてみた

##はじめに

AWS マーケットプレイスにて提供されている Amazon SageMaker について簡単にまとめてみました。
詳しい内容については、下記のリンクを参照して下さい。

■　AWS Marketplace の Amazon SageMaker リソース
https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/sagemaker-marketplace.html


## Amazon SageMakerとは

Amazon SageMakerの主な特徴は3つあります。

・フルマネージド型
・機械学習モデルの構築やトレーニングが簡単に可能
・既存の機械学習アルゴリズムも利用可能


ユーザ側で特に機械学習の準備をしなくても、SageMaker を使用することで簡単にモデルの構築やトレーニングができるサービスです。



##AWS MarketPlace にある Amazon SageMaker 

AWS MarketPlace では、ユーザや企業が提供しているプロダクトを閲覧できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/ca5aaacb-009d-4c63-d3d3-680ce8669044.png)
コンソール画面で、SageMaker と入力


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/a5c090c8-38af-ef81-d66f-92f9965a056d.png)
左下の AWS Marketplace を選択


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/5e7b8ff3-9019-2574-9d11-06207f0b9c20.png)
写真の項目をそれぞれ選択することで、MarketPlace にて提供されている　SageMaker のモデルパッケージを閲覧できます。


今回は、MarketPlace に SageMaker のモデルパッケージを提供している企業の中で、提供数が多かった企業とそのプロダクトについて、それぞれ簡単に紹介したいと思います。

- AWS 
  - 幅広いクラウドサービスを提供
  - 様々なプロダクトがあるので、まず最初に見るべき先

- ThingLogix Inc 
  - IoT関連のサービスを提供
  - プロダクトは主に Prediction 関連

- Sensifai
  - 映像・画像・音声を対象としたサービスを提供
  - プロダクトは主に画像・映像を対象とした Recognition 関連

- Persistent Systems
  - ソフトウェアを開発している
  - プロダクトは主に Classification、Identification、Detection など

- Perception Health
  - 医療やヘルス関連のサービスを提供
  - プロダクトは主に Predicton 関連


- Twinword Inc.
  - テキスト解析の API などを提供
  - プロダクトは主に Inference model など


- Cloudwick
  - オープンソースやビッグデータを対象としたプロダクトを提供
  - プロダクトは主に Prediction 関連


- Figure Eight
  - MLをアシストする役割のプロダクトを提供
  - 主なプロダクトは classify 系（CPU, GPU）


- RocketML
  - 複雑で巨大なデータセットに対応
  - 主なプロダクト は Analysis、Classification、Detectionなど


##おわりに

AWS MarketPlace にある Amazon SageMaker についてまとめた内容は、以上です。今回紹介した企業とその機械学習サービス以外にも、様々な企業がサービスを提供しております。
SageMaker を利用したいけど、モデルをどうするかで悩んだ際は、ぜひ MarketPlace を利用してみて下さい。
arXivのabstractを日本語訳してslackに流すbot作ってみた

画像系の研究室にいるので、arxivの新規論文はチェックしたいものです
Twitterではこのような[新規論文の情報を教えてくれるbot](https://twitter.com/arxiv_cscv)もあるのですが、できればabstractも一緒にみたいなぁ、さらに言えば日本語訳してくれたら便利だなぁ、と
となるとTwitterでは字数が足らないから、**slackに垂れ流すbot**を作ろうと思って作ってみました

# 作ったもの
GitHub: https://github.com/kamata1729/arxiv-crawler
以下はこれのreadmeの日本語訳になります


# botの動作
1. 前日にarXivに投稿された`cs.CV`の論文をとってくる
   (カテゴリを変えることも可能です）
2. それのabstractを日本語に翻訳する
3. 下のような感じでslackに投下する
![](https://i.imgur.com/LhkcYRX.png)


# 使い方
## 1. slack botを作る
### 1.1 slack Appとそのbot userを作る
[このページ](https://api.slack.com/apps?new_app=1 to create slack app)を開いてslack Appを作成したください
そのあと、 `Bot users` もしくは`ボットユーザー`のタブに行って、先ほど作ったAppのbot userを作ります

### 1.2 権限を付与する
bot userには、メッセージを投稿できるようにpermissionをつける必要があります。
 `OAuth & Permissions` もしくは`認証&権限`(かな？日本語版ページみてない）のタブを開いて、`chat:write:bot`の権限を付与します。
![](https://i.imgur.com/52xx3PJ.png)

### 1.3 slack botをワークスペースにインストール
同じタブからslack botをインストールします
インストールした後、下の画像のように出てくるアクセストークンをメモしておいてください
![](https://i.imgur.com/xLtCz4A.png)

## 2. Google Translation APIの設定
さて、今度はGoogle翻訳APIを使えるようにします
[このページ](https://cloud.google.com/)に行って、コンソールから`Google Translation API`を使えるようにします
そのあとコンソールの認証情報のタブから、**APIキー**を取得できるので、そのAPIキーもメモしておいてください。
APIキーの取得方法は、[このページ](https://life89.jp/register_gcp_get_api_key/)がわかりやすいと思います

注意点ですが、このAPIは地味にお金がかかるので、**無料トライアル**に申し込むことをお勧めします。申し込むと33350円のクレジットが使えるようになります。


## 3. AWS Lambda にコードをアップロード

### 3.1 zip ファイルに固める
以下を実行して、`arxiv_crawler.zip`を作成します

```
bash make_zip.sh
```

### 3.2 zipをAWS Lambdaにアップロード
[AWSのコンソール](https://console.aws.amazon.com/console)で、アカウントを作ってない場合は作成し、そのあと`Lambda`のサービスのページに行き、新しいlambda関数を作成します。
↓作成するときはこんな感じです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262908/758d8143-58fe-51c8-ac56-53f685fcea77.png)

そのあと、先ほど作成した`arxiv_crawler.zip`をlambda関数にアップロードします
ハンドラには、 `arxiv_crawl.lambda_handler`を書き込んでください

### 3.3 環境変数を付与
下の画像のように環境変数を設定します。これまでで取得したAPIキーなどです。 
`CHANNEL_ID` はボットは投稿するチャンネルのIDです。
チャンネルidの確認方法は以下のページを参考にしてください
https://qiita.com/YumaInaura/items/0c4f4adb33eb21032c08
![](https://i.imgur.com/tXU3HjK.png)

### 3.4 CloudWatch Eventsのトリガーを設定する
`CloudWatch Events`を左側のリストから選ぶと下のようになります
![](https://i.imgur.com/nOLeJYz.png)

この`CloudWatch Events`のトリガーを、下のように設定します。 
`cron(0 6 * * ? *)`のように書くと、毎日15:00に実行されることになります。

![](https://i.imgur.com/sn7hdvL.png)

これで完成です！！
### 新規論文の山に圧倒される快適な生活を！！
VagrantをProxy環境下で使う

得意のプロキシネタ。
現場がプロキシ環境下なので大体詰まります。

## プラグインをインストールする

vgrant-proxyconfというプラグインを使います。
ということでインストール

```bash
set http_proxy=http://{proxy_ip}:{proxy_port}
set https_proxy=http://{proxy_ip}:{proxy_port}

vagrant plugin install vagrant-proxyconf
```

setで設定した「http_proxy」「https_proxy」は今後のためにも環境変数に設定しておいてください。


## Vagrantfileを修正する

```bash
if Vagrant.has_plugin?("vagrant-proxyconf")
    config.proxy.http     = "http://{proxy_ip}:{proxy_port}"
    config.proxy.https    = "http://{proxy_ip}:{proxy_port}"
    config.proxy.no_proxy = "localhost,127.0.0.1"
end
```

## 認証プロキシの場合

環境が認証プロキシでないので、確認はしていませんが、
こんな感じで書けば行けると思います。

```bash
http://username:password@proxyhost:port
```
疑似乱数超入門

B1のときのゼミで発表したスライドをアップロードしました。

疑似乱数についてなんにも知らない人向け。そもそも疑似乱数がなにかということと、線形合同法、C言語のrand()関数についてしっかりめに、メルセンヌ・ツイスタについてほんのり解説しています。 
2019/4/12に若干修正しました。

https://www.slideshare.net/m4_ms1/ss-140562178

(MSの人は情報処理とかで役立つかも？先生変わったのでわからないですが)
「入門 監視」を読んでの監視設計まとめ 2

## 監視のデザインパターン

## デザインパターン1 : 組み合わせ可能な監視
専門化させたツールを疎結合で組み合わせて総合的な「監視プラットフォーム」を作ること

### 監視の構成要素

専門化させたツールを疎結合で組み合わせるためにまず監視の構成要素を分解してみると…

* データ収集
* データストレージ
* 可視化
* 分析とレポート
* アラート

これらを一つずつ紐解いていく

### データ収集
文字通りデータを収集する要素。

#### 収集方法
大きく分けて主に2つの手法に分けられる。

* プル型……
  * サービスがクライアントに対してノードの状況を送り付けてくるよう要求する。
  * サービスが全てのクライアントを把握しスケジューリングしないといけないのでスケールしづらい
* プッシュ型
 * クライアントが監視サービスに対して一定間隔あるいはイベント発生時に情報を送る。
 * ポーリングを行う必要はないのでクラウド環境のような分散アーキテクチャに向いている

どちらにもメリットとユースケースがあるので使い方次第ではある。

#### 種類

* メトリクス
  * カウンタ……増加していくメトリクス。Webサイトの訪問数を数えるといった用途に最適
  * ゲージ …… ある時点の値を表すメトリクス。現時点を表すため過去の値についての情報はない。時系列データベース（TSDB）に保存して過去のデータを取り出し扱う。主に扱うものはこちら
* ログ
  * 構造化……キーと値がペアになっているようなもの。例としてはJson
  * 非構造化…… 各フィールドに明確な意味のマッピングはない。例としてはApacheなどのログ

### データストレージ

収集したデータをどのように保存しておくかを考える必要がある。データ次第では特別な方法で保存することになる。
上記で主に扱うと書いたメトリクス（ゲージ）での話になりますが時系列データベースに保存する。
ここにはタイムスタンプをキーとして値が保存される設計。

データを無制限には保存しておけないので「間引き」や「有効期限切れ」について考えなければならない。
データが古くなってきたら複数のデータを1つにまとめることである。例えば、1分ごとのデータを1週間後には1時間平均にまとめるなどしてディスク容量の確保やデータ読み出しの速度改善に使われる。

ログデータに関してはシンプルなストレージに保存するか検索エンジンに保存する方法がある。
より高度に検索や活用をしたい場合は後者のほうが便利である。
こちらもデータ容量に関しては圧縮や保存期間を設定して保存しておく

### 可視化

監視プラットフォームを目に見える形にする要素。たくさんのデータを収集することはよいことであるが目的に沿った形でデータを理解できないといけない。
目的に合わせてダッシュボードを構築すること。より良いダッシュボードはそのサービスやシステムを最も詳しく理解している人たちによって作られて運用されている時である

### 分析とレポート

監視データによっては分析とレポートの分野に踏み込むと有益なこともある。
よく使われる例としてSLA（サービスレベルアグリーメント）がある。
SLAの話が大半であったので割愛する

### アラート

監視の目的を理解しないまま監視の仕組みを構築している場合が多い。こういう場合は何か起きたときにアラートを出すことが監視の目的になっている。
本書にはこう書かれていた
「監視は、質問を投げかけるためにある」-- Dave Josephsen, Monitorama 2016

監視=アラートではなくシステムをより知るためだと解釈しました。
収集しているメトリクスやグラフそれぞれに作った目的に合わせてアラート（通知）を設定すればよいと考える。

## デザインパターン2 : ユーザ視点での監視

多くの可動部分から成り立っているシステムに対してどこから始めたらいいのか。
計測する必要な場所はたくさんありますがまずは**ユーザ**視点が手を付け始めるのに最適な場所である。
ユーザがアプリケーションとやり取りするところをまずは監視に追加する。
ユーザから見ると裏側の構成なんて気にしていない（意識していない）のでとにかくアプリケーションが動いているほうが大切。

効果的に監視できる方法の1つがHTTPレスポンスコードを使うこと、その次がリクエスト時間（レイテンシ）である。どちらも何が問題かの特定はできないがユーザ影響が出ていることはわかる。

これにより個々のノードを機にすることから解放される。
（とあるサーバのCPUが急上昇したところでユーザに影響が出ていなければ問題なしとの考え方）

だだし、これだけ取っていればいいのではなく、万能でもないのでそれぞれのワーカーノードで何が起こっているかなどの監視へ広げていく。
広げていく中でも「このメトリクスはユーザへの影響をどう教えてくれるか」と常に考え設計すること。

本デザインパターンが実装するうえで一番参考になった。
実際の体験でもシステムに着眼せず個々の機に集中することをよく目にしていたのでこれはよい方法だと考える。

## デザインパターン3 : 作るのではなく買う

実際にツールを導入する際に起こるツール依存アンチパターンに対する方法。
始めるにあたっては基本的な監視から始めてツールを気にするのは最低限にしておく

## デザインパターン4 : 継続的改善
 
監視の仕組みの短い時間でできるわけもなく、日々改善していくこと。
もちろん、1年後には使われなくなることもあるがよい仕組みは長い期間にわたり継続した注意深さと改善から生まれるものである。

## まとめ

* 組み合わせ可能な監視の仕組みはモノリシックな仕組みよりも効果的
* ユーザして優先での監視によって、より効果的な可視化ができる
* 監視の仕組みは可能な限り自分で作るのではなく買うことを選ぶ
* 常に改善し続ける

長々と書いてしまったがまずはデザインパターン2から考えるのがわかりやすく、重要だと考えました。
Python (cx_Oracle) から２つ目のAutonomous Database (ADWやATP）に接続してみる

**■■■Oracle Cloudのウェビナーシリーズは→[こちら](https://bit.ly/2VJS8pU)■■■**

# はじめに

Autonomous Database (ADW=Autonomous Data Warehouse や ATP=Autonomous Transaction Processing) では接続にはWalletファイルが必要です。接続先の Autonomous Database が複数ある場合に、Walletファイルの置き場所とその指定をTNS_ADMINで行い接続してみました。

ざっくりこんな感じ。

- 接続するためのWallet_XXX.zipを、新しいディレクトリに配置しunzip
- 新しいディレクトリ内にあるsqlnet.oraをディレクトリ名に合わせて編集
- そのディレクトリをTNS_ADMINとして設定

# 環境

[Oracle CloudにあるAutonomous Data WarehouseにJupyter Notebookから接続してみる](https://qiita.com/mikika/items/62757402810af5ad122d)

にて、1つ目のAutonomous Database（ADW）への接続設定が完了している。

# 設定した内容

以降、Oracle Instant Clientのバージョンは 18.5 を使っているが、ADWのマニュアルでは18.3をインストールしていたので、心配な方は18.3を推奨。


## 接続に必要なファイルをダウンロード

2つ目の Autonomous Database（ADW）に接続に必要な、Wallet_XXX.zip（クライアント・セキュリティ資格証明のファイル一式 ）を、[Download Client Credentials (Wallets) ](https://docs.oracle.com/en/cloud/paas/autonomous-data-warehouse-cloud/user/connect-download-wallet.html#GUID-B06202D2-0597-41AA-9481-3B174F75D4B1) の手順でダウンロードする。

## Wallet_XXX.zipを 新しいディレクトリに配置し展開

場所は任意。ここでは、1つ目の接続に使用するデフォルトの場所（ $HOME/instantclient_18_5/network/admin ）と並列になるようにadmin_cactusディレクトリを作成し、そこにunzipした。

※この場所（ディレクトリ）を、後でTNS_ADMINとして指定する。

```console
$ mkdir /home/app/instantclient_18_5/network/admin_cactus

### Wallet_XXX.zipを配置しunzip
$ cd /home/app/instantclient_18_5/network/admin_cactus
$ unzip Wallet_XXX.zip
```

## sqlnet.oraを編集

新しく作成し配置したディレクトリ（ここでは/home/app/instantclient_18_5/network/admin_cactus）にある、sqlnet.ora を編集する。

WALLET_LOCATION = をこのディレクトリを示すように編集。

```:sqlnet.ora
WALLET_LOCATION = (SOURCE = (METHOD = file) (METHOD_DATA = (DIRECTORY="/home/app/instantclient_18_5/network/admin_cactus")))
```

## 環境変数 TNS_ADMINを Pythonプログラム内で指定

os.environ['TNS_ADMIN'] = '/home/app/instantclient_18_5/network/admin_cactus'

で、TNS_ADMINを指定している（このPythonプログラムの中でのみ有効な書き方）。

そのこと以外は1つ目のAutonomous Database接続時と同じように、conn=cx_Oracle.connect で接続先を指定する。

```connect_sample.py
import cx_Oracle
import os

# 環境変数TNS_ADMINを指定
os.environ['TNS_ADMIN'] = '/home/app/instantclient_18_5/network/admin_cactus'
# [任意] 環境変数をprintして確認
print(os.environ)

# あとは通常通り cx_Oracle.connect() で指定
conn=cx_Oracle.connect(user='scott',password='tiger',dsn='cactus_high')

sql='select table_name, status from user_tables'
print(sql)
cur = conn.cursor()
for row in cur.execute(sql):
    print(row)
```

# 参考

https://stackoverflow.com/questions/37890898/how-to-set-env-variable-in-jupyter-notebook
Python基本文法その１

# はじめに
Pythonを使うためには、環境構築が必要なのですが私はProgateで学習していたため、
環境構築の知識は持ち合わせていません。
また、覚書でもあるのでところどころ抜けている部分などあるかと思います。

# 基本文法

## 変数宣言

```hensu.py

# 数値の変数宣言
hoge = 1

# 文字列の変数宣言
hogehoge = 'hogehoge'

```
一般的には、「=」は「同じ」という意味ですが、Python(というかプログラミングのほとんど)では、
「=」は、代入を意味します。
すなわち、上記のサンプルソースだと、
hogeという変数には、数字の「1」という値を入れる。hogeは数値の1という意味になります。

hogehogeは、代入する値を ' '(シングルクォーテーション)で囲っています。
これは、hogehogeという変数に「文字列」すなわち、hogehogeという意味になります。
※hogehogeというのに特に意味はありません。
　また、文字列として扱う場合は" "(ダブルクォーテーション)で囲っても同じことです。

## 計算をしてみる

``` keisan.py
# 足し算の結果を出力
print(1 + 1)
# 結果：2

# 引き算の結果を出力
print(10 - 1)
# 結果：9

# 掛け算の結果を出力
print(2 * 2)
# 結果：4

# 割り算の結果を出力
print(2 / 2)
# 結果：1

# 余りの結果を出力
print(15 % 3)
# 結果：0
```
print関数を使い、結果を表示しています。
このように計算することができます。

## 文字列を結合する
+演算子では数値の足し算だけではなく、文字列同士を結合することができます。
ただし、異なる型の結合はできません。

``` ketsugo.py
hello = 'こんにちは'

name = 'm.hosokawa'

print(hello + name)

# 結果： こんにちはm.hosokawa

# 文字列型のnameと数値型のageは異なる型のため、結合はできません。
name = 'm.hosokawa'
age = 26

print(name + 'は' + age + '歳です')
# 結果：エラーが返ってきます。
```
そんな時は、str関数を使って数値を文字列型に変換して、結合できるようにします。

``` ketsugo_str.py

# 結合する型が同じなので結合できます。
name = 'm.hosokawa'
age = 26

print(name + 'は' + str(age) + '歳です。')

#結果:  m.hosokawaは26歳です。
```

# まとめ
今回はこの辺で。
基本文法その2ではif文や繰り返し処理などの説明をしていこうと思います。