OmniAICreator/Qiita-1.07M huggingface dataset:
新人から「APIてナンスカ（ﾊﾅﾎｼﾞｰ）」という質問がきたときの話

新人から「APIてナンスカ（ﾊﾅﾎｼﾞｰ）」という質問がきたときの話。

この素晴らしい記事([WebAPIについての説明](http://qiita.com/busyoumono99/items/9b5ffd35dd521bafce47))を2万回読んで、
疑問に思ったところを質問して。
とブン投げたら、
5分後くらいに「パイセン、ブラウザって何スカ？ﾏﾁﾞぅけるｗｗｗ」とさらに無邪気な質問がきました。

とても素直で素晴らしい疑問と着眼点だと思いました。
（自分で調べろ、はまた別の話。）

とりあえずこれを見て半泣きになりやがれ！
[ブラウザの仕組み: 最新ウェブブラウザの内部構造](https://www.html5rocks.com/ja/tutorials/internals/howbrowserswork/)

新人へのマウンティングが済んだところで、この素晴らしい記事を紹介します。
[[フロントエンド] ブラウザレンダリングの仕組みを理解して、ブラウザに優しいJavaScriptを書こう](http://www.yoheim.net/blog.php?q=20140703)

知らない単語や略語を調べても、また知らない単語で説明が書かれている。
で、それを調べてもまた知らない単語が...（以下ループ）
これは誰でも経験があると思いますし、避けては通れないと思います。

あれ、結局私は何も教えてない...。
いやいや、良記事を教えたことはとても大事なことだと思ってます。

ググり方や検索ワードを教える、という方もいらっしゃいますが、
私の場合はノイズになるような内容を含む記事を読ませるより、
まず純度の高い記事（公式サイトや公式サイトの解説サイト）を紹介するようにしています。

## 公式ドキュメントに辿りつくまで掘り下げて欲しい
W3CやRFCなどの標準化団体や、
Google、Microsoftなどが出している公式文書が必ずあります。
英文が多いですが、臆せず積極的に読む癖をつけてほしいです。
案外読めるようになります。**英語赤点だった私が読んでいるのですから。**

「よく分からないことがあれば、まず公式文書を読む」
この域に達するには技術や経験の積み重ねが必要ですが、
公式ドキュメントまで掘り下げる癖を、新人の頃からつけておくことが大事だと思っています。
Rails: 指定したカラムを持つ全てのmodel名を取得する




```
def models_with_attribute(attr)
  ActiveRecord::Base.connection.tables.
    select{ |table| table.classify.safe_constantize&.has_attribute?(attr) }
end

 => ["ModelA",
 "ModelB",
 "ModelC"]
```



* @QUANONさんから教えてもらった`select`を加えて更にシンプルになりました。
jest+babel+async/awaitで`regeneratorRuntime is not defined`と言われる。


Jestがよくなったようなのでお試ししているのだが、testスクリプトでasyncを使うと、

```
ReferenceError: regeneratorRuntime is not defined
```

と出て困る。

僕はBabelを使っていて、拡張子を`.es6`にしているのだが、そこが問題だった。

jest 19.0.2で確認


## Before

### .babelrc

```json
{
  "presets": ["react", "es2015", "stage-1"],
  "plugins": [
    "transform-function-bind",
    ["module-resolver", {
      "root": ["./src"],
      "alias": {
        "src": "./src/js",
      }
    }]
  ],
  "env": {
    "development": {
      "presets": [
        "power-assert"
      ]
    }
  }
}
```

### package.jsonのjest

```json
  "jest": {
    "moduleFileExtensions": [
      "es6",
      "js"
    ],
    "testMatch": [
      "**/__tests__/**/*.es6"
    ],
    "roots": [
      "<rootDir>/src/js/"
    ],
    "transform": {
      "^.+\\.es6$": "babel-jest"
    },
    "
```

こうしていた。


## 原因
jestの`jest-config/build/normalize.js`でbabelを使っているか判断し、使っている場合はbabel-polyfillを挿入する。みたいな処理をしているのだが、その判定ルーチンと上記設定の相性が悪かった。

```js
    const customJSPattern = Object.keys(config.transform).find(pattern => {
      const regex = new RegExp(pattern);
      return regex.test('a.js') || regex.test('a.jsx');
    });

    if (customJSPattern) {
      const jsTransformer = Resolver.findNodeModule(
      //$FlowFixMe
      config.transform[customJSPattern],
      { basedir });

      if (
      jsTransformer && jsTransformer.includes(NODE_MODULES + 'babel-jest'))
      {
        babelJest = jsTransformer;
      }
    }
```
こんなコードになっているので、`/^.+\\.es6$/`だとテストに通らない。
`/^.+\\.(es6|js)$/`に直して動くようになった。


## After

```json
  "jest": {
    "moduleFileExtensions": [
      "es6",
      "js"
    ],
    "testMatch": [
      "**/__tests__/**/*.es6"
    ],
    "roots": [
      "<rootDir>/src/js/"
    ],
    "transform": {
      "^.+\\.(es6|js)$": "babel-jest"
    },
    "verbose": true
}
```

`.es6`なんて使うなってことっぽい


## ヒント

jestがうまく動かないときは、CacheDirectoryの中の変換済みコードを見ると捗る
rails5でactive_hashのモデルをbelongs_toで参照できるようにする

# 動作確認バージョン

```Gemfile.lock
rails (5.0.0.1)
active_hash (1.4.1)
```

# 親モデル

```ruby
# == Schema Information
#
# Table name: parents
#
#  blood_type_id :integer
#
ApplicationRecord.extend ActiveHash::Associations::ActiveRecordExtensions

class Parent < ApplicationRecord
  belongs_to_active_hash :blood_type
end
```

# active_hashモデル

```ruby
class BloodType < ActiveHash::Base
  include ActiveHash::Associations
  has_one :parent

  fields :label, :name
  add id: 1, label: 'A型',   name: 'a'
  add id: 2, label: 'B型',   name: 'b'
  add id: 3, label: 'O型',   name: 'o'
  add id: 4, label: 'AB型',  name: 'ab'
end
```

# 使用例
```
irb(main):001:0> parent = Parent.new(blood_type_id: 4)
=> #<Parent id: nil, blood_type_id: 4,created_at: nil, updated_at: nil>

irb(main):002:0> parent.blood_type.label
=> "AB型"
```
2017-05-02 SmartGit > 試用 | SourceTreeと同じデータを見ている? | license

```txt:動作環境
Windows 7 Pro (32bit)
Sublime Text 3 Build 3126 
SmartGit v17
```

### 前置き

SourceTreeの最新バージョン(v1.9.10.0)を試した。
いつまでもv1.6.22.0を使い続けるのも問題があるかと思われるから。

(3分後) なかったことにした。

他のGitクライアントを探した。
slantのリストを見つけた。
https://www.slant.co/topics/2089/~git-clients-for-windows

SmartGitというのが有料ではあるが評価が高い。

### インストールしてみた

インストール直後、SourceTreeでCloneしていたリポジトリが既に見えている。

~~SmartGitでStageに追加したら、SoureceTreeでもStagedの状態になっていた。
SourceTreeでUnstagedにすると、SmartGitでもUnstagedになった。
同じデータを見ているようだ。~~
( 追記: これは同じ.gitフォルダを見ているためだろう。)

UIとしてはSmartGitの方が直感的で迷うことが少ないように設計されているようだ。
使い勝手が良い。

http://www.syntevo.com/smartgit/purchase
によると3年間Update可能ラインセンスで169 USD。
( 非商用の場合はフリーという情報もあります。
http://qiita.com/yuba/items/cfddd2692668d1a8398e )

１つのライセンスで複数のOS上で使用可能とのこと。
> Multiple Machines or Operating Systems
Each user can use their license on as many machines or operating systems as they prefer.

月払いで5.99USD。

EvernoteやDropbox、その他、色々なサービスに加えて上記の支払いを追加していいかは悩むところ。
[NAOqi OS 2.4.3 ] タッチするタイミングによって tabret browser が応答しなくなる事象について

# はじめに
Show Image, Show WebView といった機能を使って Pepper のタブレットに何かを表示することは多々あると思います。
実はこの機能、ある操作を行うと「tabretbrowser は応答していません。このアプリケーションを終了しますか？」というアラートが表示表示されタブレットが操作できなくなってしまう、という事象が発生してしまいます。
あまつさえ「OK」なんぞを押そうもんなら、タブレットの表示はなくなるのにロボアプリは動いているという状態に…
こんなことにならないように情報共有と対処法を記載します。

ちなみにこの事象は NAOqi OS 2.5.5 の Pepper (for Biz モデル)では発生しませんでした。

# 前提
- Pepper: 一般販売モデル、for Biz モデル 
- NAOqi OS: 2.4.3.28
- Choregraphe: 2.4.3.28

# どんな事象が発生するのか
先にどんな事象が発生するのか見てもらった方が早いと思うのでまずは画像を。

![IMG_1526.jpg](https://qiita-image-store.s3.amazonaws.com/0/172685/34ba0392-c248-cfb6-420d-332938fef102.jpeg)

このアラートは Pepper のタブレットで動画を再生するとか何か重めの処理をしているときにたまに遭遇する画面なのですが、
今回はただ画像(25kb)を表示してみただけです。１回だけ。
ただし、**表示前にタブレットに対してある操作**を行っています。

# 発生手順
通常の Show Image ボックスや Show App ボックスを使って画像や HTML を表示しようとすると以下のような画面遷移をしますよね。

![IMG_1525.jpg](https://qiita-image-store.s3.amazonaws.com/0/172685/030ccd12-da5d-d2f7-ac7d-4f98eef6b09b.jpeg)
もやもやしてて…

![IMG_1529.jpg](https://qiita-image-store.s3.amazonaws.com/0/172685/b45fc417-5114-e7c3-061f-ddec5f41c755.jpeg)
真っ黒になって…

![IMG_1527.jpg](https://qiita-image-store.s3.amazonaws.com/0/172685/1644d778-6d55-76a5-c2c4-1a8e2c9407dc.jpeg)
画像（or HTML）を表示

実はこの表示中にある操作を行うと先ほどの確認アラートが出てきます。
その手順は以下の通り。

1. 真っ黒画面のときにタブレットにタッチ
1. そのまま画像が表示されても5秒ほど待つ

これは Show Image, Show App どちらも起こります。

# 対策
現状の対策としては、

- アプリ起動中はもやもや画面から画像(or HTML)を表示する画面に切り替わる箇所（真っ黒画面が表示されるタイミング）を完全に無くす
- そもそもタブレットに触る必要を無くす
- 定期的にタブレットからのイベントをチェックして、イベントが来ていなければ再表示を試みる

とかでしょうか。

# おわりに
アプリによってはタブレットに触って操作は必須かと思うので、現状は対策方法の一個目を採用しています。
何かしらのお役に立てれば幸いです。
GCPUG Tokyo Firebase Day 参加したからメモ

https://gcpug-tokyo.connpass.com/event/53787/
　
#~~雑なメモですね！~~

#あじぇんだ
１回のGoogleログインで、モバイルアプリ・自社サーバー・Googleサービス・Firebaseを連携させる by eaglesakura
	Container EngineでFirebase Realtime DBをWatchしつつ、ゲームのNPCを動かす by sinmetal
ゼロから始めるCloud Functions for Firebase by k2wanko
Firebase Function with Cloud Function by soundTricker318
Firebase by あんどうやすし

#１回のGoogleログインで、モバイルアプリ・自社サーバー・Googleサービス・Firebaseを連携させる 
by eaglesakura
https://docs.google.com/presentation/d/1X4lADaZP642Gr97SWJVAH-DTS5bD_DGy24zxpKFdS8w/edit#slide=id.g1d3cc86dbc_3_0

一般的な認証だといろいろ大変だよね
　データの整合性，暗号化，ハッシュ化，パス再発行など
認証は他所にまかせよう！

##firebaseの認証の流れ
ぐぐるとかついったにトークンもらう
↓
それをFirebaseに送り，Json Web Tokenもらう
↓
それ使ってFirebase機能にアクセス

##Json Web Token自社さばでもつかえる！
JWTはOSS！
URLにそのまま使える
暗号化はされない（**読まれるのが前提**と考えないと．正しいかどうかがわかるもの）
　jwt.ioに入れると丸見え
　GCPプロジェクトIDとかFirebase UIDとか

##検証の実際
JWTの署名・発行者の正しさ，期限切れでないことを確認

`kid`　　　公開鍵で署名チェック
`iss` `aud`　GCPプロジェクト名チェックっぽい？
`exp`　　　期限確認（突破されてるかもしれないから
　firebase の get token は新鮮なものもらえるよ

##Custom Authだと，
**セキュリティルールのカスタマイズ**も　Key-Value追加してやる
　（claim以下に入力　Firebaseが勝手にトップレベルに持ってくる
UIDを任意なものにもできる　mailのハッシュとか

標準認証だとサーバのアクセスコードもらえない…
Firebaseなら事前設定してくれる
　ユーザにとって，**さばくらどっちも一度に**


##[GAE/Fire](https://github.com/eaglesakura/gaefire)　
もろもろやってくれるライブラリ作った
　GAEのキャッシュにしか依存してないとおもう

　



#Container EngineでFirebase Realtime DBをWatchしつつ、ゲームのNPCを動かす 
by sinmetal
http://sinmetal-slide.appspot.com/20170426-metal-tile/slide.slide#1



| つかったもん      |       目的 |    補足    |
|:-----------------|:------------------|:------------------|
| Realtime DB   | マップ，プレイヤー，NPCの共有 |座標もDB細かく書き換えてる<br>→download costがｗ<br>　100MB/1h/1キャラ       |
| tmlib(deprecated) | Canvasに描画 |              |
| GKE           | NPCの位置書き換えとか        | vm2台で安く　<br>片方死んでもpodもう片方に<br>[#17](http://sinmetal-slide.appspot.com/20170426-metal-tile/slide.slide#17) 水色がごるーちん            |
| TensorFlow          |  NPCのAI    |              |

　

MBAだと重いｗ

##この構成以外にしなかった理由
GAEだと状態保持とか繋ぎっぱ得意じゃない
CloudMLはお値段ががが


#ゼロから始めるCloud Functions for Firebase 
by k2wanko
http://qiita.com/koki_cheese/items/458d3822a2850b22b230
https://github.com/k2wanko/gae-gcf-vue-ssr-example

##Functions for firebase
Realtime dbとかイベントをトリガにできる
生のFunctionsより使いやすいよ
**GAEでサーバサイドレンダリング**できる！

###以前やったSSR
Vue.jsのSSRをGAE/Goで
いろいろつらみ

###今回のSSR
Functions for firebase，GAEにキャッシュ
webpack.comfig.jsはやっぱりきもい

**FunctionsのHTTP Triggerはエッジキャッシュに乗る**よ！
　

**~~ここらから眠くて全然聞いてない~~**

#Firebase Function with Cloud Function 
by soundTricker318
https://docs.google.com/presentation/d/1yl8bjMyOe2q1KEM0PrOcvDOopaPx49orx_Pedn_qJ-4/edit#slide=id.p

##具体的な使い方
丁寧です．スライド参照←

##Functions for firebaseとは
「何か起きたら何かやる」
クライアントとサーバを完全に分離できうる（**リクエストも不要**）
リアルタイムには向かない，分単位まではないけど
ほぼ確実に捌いてはくれる，取りこぼしたことなし



#Firebase 
by あんどうやすし

ボクスケ　web版firebaseでやった
　ポチポチつくって3Dプリンタ印刷できる
　高さは積めないようにしている（時間がかかる）
　山の形にしかできないのでサポート材もいらん

OpenSCAD　コーディングで3Dモデリングしてるしゅごい

　

　

~~クラッシュアカデミーさん動画ﾏﾀﾞｰ?~~
LaravelにASCII制御文字を削除する処理を追加

Laravel(5.1)にASCII制御文字を削除する処理がない？ので追加してみました。

これで、リスクエスト値全てに制御文字削除の処理が実行されます。

```php:\App\Http\Middleware\RemoveInvisibleCharacters.php
namespace App\Http\Middleware;
use Closure;

class RemoveInvisibleCharacters
{
    public function handle($request, Closure $next)
    {
        $input = $request->all();

        $input = $this->removeInvisible($input);

        $request->replace($input);
        return $next($request);
    }

    private function removeInvisible($input)
    {
        if(is_array($input)){
            foreach($input as $key => $val){
                $input[$key] = $this->removeInvisible($val);
            }
        }else{
            return preg_replace('/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]+/S', '', $input);
        }
        return $input;
    }
}
```

```php:\App\Http\Kernel.php
namespace App\Http;
use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{
    protected $middleware = [
        \App\Http\Middleware\RemoveInvisibleCharacters::class,
    ];

    protected $routeMiddleware = [];
}
```
Android Listvew 長押し、短押しのイベント処理

# 長押し後の短押しイベント
Listviewの長押しイベントを処理した後に何故か短押しイベントの処理が動いてしまう問題が発生しました。長押しイベントだけに留める方法を以下に記載します。

![image](https://qiita-image-store.s3.amazonaws.com/0/137470/138e2073-79e6-382c-3998-9391e5c752dd.png)

ポイントはonItemLongClickの戻り値。
ここでtrueを返却すると長押しイベントのみを処理することができました。
よかった。
JAVA NULL checker

Javaの各オブジェクトがNULLまたは空(要素無し)をチェックする為のメソッドを作成。

[https://github.com/sacred-sanctuary/Preconditions]

#各メソッドの説明
* checkNotNull(object)

>objectがnullかチェックする

* isEmpty(object)

>objectが空かチェックする
pdftk の基本的な使い方

Linuxでpdfを編集できるソフトとして, pdftkがある. コマンドラインでしか使えない(かもしれない)が, フリーなわりにかなりいろいろなことができる.

# pdfの結合

```bash:pdfの結合
pdftk hoge1.pdf hoge2.pdf cat output hoge.pdf
```

hoge1.pdfとhoge2.pdfをくっつけて, hoge.pdfにする.  

# pdfの抽出

## 指定ページを抽出する
```bash:pdfの抽出1
pdftk hoge.pdf cat 1 3 7 output fuga.pdf
```
hoge.pdfのp.1, p.3, p7を抽出して, fuga.pdfに出力する.  

## 連続したページを抽出する

```bash:pdfの抽出2
pdftk hoge.pdf cat 2-5 output fuga.pdf
```
hoge.pdfのp.2からp.5までを抽出して, fuga.pdfに出力する.  

# pdfのページの回転

```bash:pdfのページの回転1
pdftk hoge.pdf cat 1down output fuga.pdf
```

hoge.pdfのp.1の上下をひっくりかえして, fuga.pdfに出力する.  

```bash:pdfのページの回転2
pdftk hoge.pdf cat 1right output fuga.pdf
```

hoge.pdfのp.1を右に(時計周りに)90°回転させて, fuga.pdfに出力する.  

# pdfに背景の追加

```bash:pdfに背景の追加 
pdftk foo.pdf background bg.pdf output hoge.pdf
```
foo.pdfにbg.pdfを背景としてくっつけて, hoge.pdfに出力する. pdfファイルの書類をTeXで作ろうとするときに便利 


# pdfのパスワードを設定する

```bash:pdfのパスワードを設定する
pdftk foo.pdf output hoge.pdf user_pw hogehoge 
```

パスワードのないpdfファイル foo.pdf にパスワード hogehoge を設定して、ファイル hoge.pdf を作成する. このコマンドは user_pw を output の後におかないといけないことに注意。


# pdfのパスワードを解除する

```bash:pdfのパスワードを解除する
pdftk foo.pdf input_pw hogehoge output hoge.pdf 
```

hogehoge をパスワードに持つpdfファイルfoo.pdfから, パスワードのないファイルhoge.pdfを作成する. 覚えられないパスワードを設定されたら, これで解除可能.

# 偶数ページの上下を入れかえる

```bash:偶数ページの上下を入れかえる
pdftk A=hoge.pdf B=hoge.pdf shuffle Aodd Bevendown output fugafuga.pdf
```

hoge.pdf の偶数ページの上下をひっくりかえしたfugafuga.pdf を作成する.
AWS CLIのインストール

**AWS CLIのインストールのメモ**

## Windows
### MSIインストーラのダウンロード & 実行
  - [64bit Download](https://s3.amazonaws.com/aws-cli/AWSCLI64.msi)
  - [32bit Download](https://s3.amazonaws.com/aws-cli/AWSCLI32.msi)

## Linux、Unix or macOS

### ダウンロード

```bash:コマンド
curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
sudo python get-pip.py
```

### Linux、Unix 

```bash:コマンド
sudo pip install awscli
```

### macOS

```bash:コマンド
#sixのアップグレード無視
sudo pip install awscli --upgrade --ignore-installed six
```

## AWS CLI設定

### aws configure実行

```bash:コマンド
aws configure
```

```bash:設定
AWS Access Key ID [None]: *************ID
AWS Secret Access Key [None]: ******************************KEY
Default region name [None]: ap-northeast-1
Default output format [None]: json
```


### 一時設定変更

* Linux、Unix or macOS

```bash:コマンド
export AWS_ACCESS_KEY_ID=*************ID
export AWS_SECRET_ACCESS_KEY=******************************KEY
export AWS_DEFAULT_REGION=ap-northeast-1
export AWS_DEFAULT_OUTPUT=json
```

* Windows

```cmd:コマンド
set AWS_ACCESS_KEY_ID=*************ID
set AWS_SECRET_ACCESS_KEY=******************************KEY
set AWS_DEFAULT_REGION=ap-northeast-1
set AWS_DEFAULT_OUTPUT=json
```

### 設定確認

```bash:コマンド
aws configure list
```

```bash:結果
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key     ****************VNPA              env    
secret_key     ****************dSZJ              env    
    region           ap-northeast-1              env    AWS_DEFAULT_REGION
```

## awscliのversionアップグレード

### Windows

最新版のインストーラーをダウンロードし再インストールする。

### Linux、Unix、macOS

```bash:コマンド
sudo pip install -U awscli
```

## コマンド補完を有効にする

Linux、Unix、macOS(Unix似)のみ


###　AWSコンプリータを見つける

```bash:whichで見つける
which aws_completer
```

```bash:findで見つける
find / -name aws_completer 2> /dev/null
```

```bash:結果
/usr/local/bin/aws_completer
```

###　補完を有効にする。`~/.bash_profile`ファイルの行末に追加すると便利

```bash:bashシェル
complete -C '/usr/local/bin/aws_completer' aws
```

###　補完の確認

```bash:確認
aws ec2 describe-i <-ここでtab
```

下記のように出力される

```bash:結果
describe-iam-instance-profile-associations   describe-images                              describe-instance-credit-specifications 
describe-id-format                           describe-import-image-tasks                  describe-instance-status 
describe-identity-id-format                  describe-import-snapshot-tasks               describe-instances 
describe-image-attribute                     describe-instance-attribute                  describe-internet-gateways
```

以上。
bashで色付きlogger

ただ色つけてTLSVで出力するだけ

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

batch_logger(){
  message=${1:?}
  LOGLEVEL=${2:-INFO}
  case ${3:-NORMAL} in
    'RED' )   COLOR_HEADER='\e[1;31m' ;COLOR_FOOTER='\e[m' ;;
    'BLUE')   COLOR_HEADER='\e[1;34m' ;COLOR_FOOTER='\e[m' ;;
    'YELLOW') COLOR_HEADER='\e[1;33m' ;COLOR_FOOTER='\e[m' ;;
    'GREEN')  COLOR_HEADER='\e[1;32m' ;COLOR_FOOTER='\e[m' ;;
    * )       COLOR_HEADER='' ;COLOR_FOOTER='' ;;
  esac
  /bin/echo -e "time:$(date +'%Y/%m/%d:%H:%M:%S')\tclass:$(basename $0)\thost:$(hostname)\tLEVEL:${LOGLEVEL}\tmessage:${COLOR_HEADER}${message}${COLOR_FOOTER}" 
}

batch_logger "普通のメッセージ"
batch_logger "警告のメッセージ" WARN YELLOW
batch_logger "エラーメッセージ" ERROR RED
batch_logger "正常終了メッセージ" INFO GREEN
```
![test.png](https://qiita-image-store.s3.amazonaws.com/0/63102/77ab9c17-9897-2537-8f03-b60081a424bf.png)
Pycharm 　設定　メモ書き

・.exeの場所（デフォルト）
---------------

C:\Program Files (x86)\JetBrains\PyCharm Community Edition 2016.3.1\bin

これで、デフォルトでは32bitのexeが実行されるが、この場所にある64bitのexeのショートカットを作ることで、64bitのPycharmをショートカットから実行することができる。

(Pycharm 2017.1.1では、インストール時に32bitと64bitを選べる。)

・コードテンプレート
----------

File -> Settings... ->Editor -> Code Style -> File and Code Templates -> Python Script

このコードをコピペすると最後に改行が入らないため、貼り付けた後に改行を入れる。

改行を入れないと、

W292 no newline at end of file　# 最後に改行が無いという警告

が出てしまう。

```py_template.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Created by ${USER} on ${DATE}.




def main():
    

if __name__ == '__main__':
    main()


```

```
# Created by ${USER} on ${DATE}.
```
でユーザ名と一番最初の作成日時を書き入れられる。(pycharmで作成した場合)

・フォント・文字サイズ
-----------

File -> Settings... -> Editor -> Colors & Fonts -> Font

この場所でエディタのフォントなどを変更できる。

私は、MeiryoKe_Gothicを使っている。（自分でフォントをインストール？する必要あり）

File -> Settings... -> Editor -> Colors & Fonts -> Console Font

この場所でコンソールのフォントなどを変更できる。

私は、文字サイズを20くらいにしている。

・カラースキーム
--------

"Solarized light"を使っている。

[このサイト](http://ethanschoonover.com/solarized)から対応しているエディタ・IDEのリンクを選択しダウンロードする。

解凍したファイルから.jarを

File -> import setting で読み取る。

そのあとに

File -> Settings... -> Editor -> Color & Font

Schemeで設定を変更する。

・ユニットテスト
--------

ワーキングフォルダで Alt + insert、python Fileを選択。出てきたウィンドウのkind:の部分をunittstに変更。名前を入力してOKを押すとユニットテストのファイルが作成できる。

・Postfix Completion
-------------------

これを使うとコードの入力が楽になる。

a.ifと入力すると、自動で

if a:

と変換してくれる。

SettingsでLive Templatesで検索すると利用できるパターンを設定できる。

https://www.jetbrains.com/help/pycharm/2016.3/postfix-completion.html

・デバッガがうまく動かないとき(2017/04/07 Pycharm 2017.1)
------------------------------------------

対症療法。自分でもよくわかっていない。

SettingsからPython Debuggerを検索。

PyQt comatibleからGevent compatibleに変更する。

※Anacondaを利用しているためPyQtが上手く動作しなかったのかもしれない。

・pydev debugger: process xxxxxxx is connecting
ブレークポイントを何もつけていないとこの文が表示される。

・コード補完のときに最初の補完結果を選択しておくようにする
----
他のJetbrainsのIDEを使ったときに，コード補完が面倒だったので．

1. Help -> Find Action
2. "Registry"で検索
3. "ide.completion.lookup.element.preselect.depends.on.context" を探してアンチェックにする．

最初の選択肢を選んでいない状態のほうが多数派なのだろうか・・・．
エンター押すだけで決定できるから便利な気がするが．

>[Ruby Code Completion auto select first](https://intellij-support.jetbrains.com/hc/en-us/community/posts/206703555-Ruby-Code-Completion-auto-select-first)
最速の素数列挙プログラム C#

Code IQなどのアルゴリズムを問う問題で、素数を使うものが頻繁に出題される。
そういう時に迷わず使えるように、現時点で最速の素数列挙プログラムを残しておこうと思います。

# エラトステネスのふるい
アルゴリズムはウィキペディアを参考にしました。

**エラトステネスの篩(Wikipedia)**
https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%A9%E3%83%88%E3%82%B9%E3%83%86%E3%83%8D%E3%82%B9%E3%81%AE%E7%AF%A9

数学初心者にとっても理解しやすくて、単純なところが良いですね。
コード量もこんなもん。

```csharp
public static List<int> GeneratePrime(int max)
{
    System.Diagnostics.Debug.Assert(max >= 2);  // maxは2以上の数

    int prime;
    double sqrtMax = Math.Sqrt(max);
    var primeList = new List<int>();

    // ■ステップ 1
    // 探索リストに2からxまでの整数を昇順で入れる。
    var searchList = Enumerable.Range(2, max - 1).ToList();

    do
    {
        // ■ステップ 2
        // 探索リストの先頭の数を素数リストに移動し、その倍数を探索リストから篩い落とす。
        prime = searchList.First();
        // 素数リストに追加
        primeList.Add(prime);
        // 倍数をふるい落とす
        searchList.RemoveAll(n => n % prime == 0);

        // ■ステップ 3
        // 上記の篩い落とし操作を探索リストの先頭値がxの平方根に達するまで行う。
    } while (prime < sqrtMax);

    // ■ステップ 4
    // 探索リストに残った数を素数リストに移動して処理終了。
    primeList.AddRange(searchList);

    return primeList;
}
```


# その他のアルゴリズム
世の中には他にもこういったアルゴリズムがあるらしい・・・

* Atkin（アトキン）の篩

## 参考にしたサイト
**エラトステネスの篩**
https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%A9%E3%83%88%E3%82%B9%E3%83%86%E3%83%8D%E3%82%B9%E3%81%AE%E7%AF%A9
**素数判定**
https://ja.wikipedia.org/wiki/%E7%B4%A0%E6%95%B0%E5%88%A4%E5%AE%9A
**素数判定・素数列挙を行う主なアルゴリズムをPython 3で実装してみた：試し割り法からMiller-Rabin素数判定法まで**
http://hamukichi.hatenablog.jp/entry/2016/02/17/215948
**PHPでエラトステネスの篩で素数判定をやってみる 『素数』を数えて落ち着くんだ…**
http://tech.basicinc.jp/php/2013/08/18/php_prime_eratosthenes/
Faultline::Rackを使ってRailsのエラートラッキングにfaultlineを利用する

## faultlineとは

オープンソースのエラートラッキングツールです。

AWSのマネージドサービスのみで構築されており、運用コストが小さい（当社比）のが特徴です。

### 参考URL

- https://github.com/faultline/faultline
- [サーバーレスアーキテクチャなエラートラッキングツール faultline](http://k1low.hatenablog.com/entry/faultline)

## Faultline::Rack

Railsのエラートラッキングにfaultlineを利用するときには、[faultline-rack](https://github.com/faultline/faultline-rack) が利用できます。

faultline-rack はRackミドルウェアとして提供されています。

## インストール

Gemfileに以下のコードを記載してインストールしてください

```
gem 'faultline-rack'
```

## 使い方

config/application.rb などでfaultlineの設定を追加したあと、Rackミドルウェアとしてuseすれば完了です。


```ruby
require 'faultline/rack'

Faultline.configure do |c|
  c.project = 'faultline-rack'
  c.api_key = 'xxxxXXXXXxXxXXxxXXXXXXXxxxxXXXXXX'
  c.endpoint = 'https://xxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/v0'
  c.notifications = [
    {
      # Slackへの通知
      type: 'slack',
      endpoint: 'https://hooks.slack.com/services/XXXXXXXXXX/B2RAD9423/WC2uTs3MyGldZvieAtAA7gQq',
      channel: '#random',
      username: 'faultline-notify',
      notifyInterval: 1,
      threshold: 1,
      timezone: 'Asia/Tokyo'
    },
    {
      # GitHub Issueへの登録
      type: 'github',
      userToken: 'XXXXXXXxxxxXXXXXXxxxxxXXXXXXXXXX',
      owner: 'k1LoW',
      repo: 'faultline',
      labels: [
        'faultline', 'bug'
      ],
      if_exist: 'reopen-and-comment',
      notifyInterval: 1,
      threshold: 1,
      timezone: 'Asia/Tokyo'
    }
  ]
end

[...]

module MyApp
  class Application < Rails::Application
    config.middleware.use Faultline::Rack::Middleware
  end
end
```

設定はこれだけです。

## エラー通知イメージ

![ss.png](https://qiita-image-store.s3.amazonaws.com/0/808/ec0a7612-6562-4571-d4a3-7a0753003153.png)

というわけでRackアプリケーションでもfaultlineが使えますよ！
PhpStormでシングル・ダブルクォーテーションを変換するPHP 1Up! プラグイン

Convert a (single | doubule) quoted string to (single | doubule) quoted

他人のコードを自分の流派にしたいときなどに。

[新しめのものならデフォルトでできるような記事も見たかも。] .(読んでいない 



# <i class="fa fa-cube"></i>  プラグイン

[PHP 1Up! :: JetBrains Plugin Repository]

[axelcostaspena/php-1up: PHP 1Up! is a plugin for IntelliJ based IDEs which provides a growing collection of inspections, intentions and other utils for PHP development.]

登録されているのでPhpStormからも
![image.png](https://qiita-image-store.s3.amazonaws.com/0/62354/8a09b6e5-552f-068f-fef0-1c897cb155d5.png)

# <i class="fa fa-cube"></i> 使う

String上で、Windowsなら<kbd>Alt + Enter</kbd>

![image.png](https://qiita-image-store.s3.amazonaws.com/0/62354/e17b239b-f719-2de4-2ccc-73cba34b677f.png)

変数展開していても、無視してシングルにすることもできるし、

![image.png](https://qiita-image-store.s3.amazonaws.com/0/62354/88a4e4e5-8f22-2b3b-5c28-8c3101efab17.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/62354/204c1e91-883c-0656-9d76-15431c6466bc.png)

適切に分けることもできる。

ただ、

```
"a\nb"
```

は

```
`a
b`
```

になる。

自分は

```
'a' . "\n" . 'b'
```

をよく使うかな？
[PHP 1Up! :: JetBrains Plugin Repository]:https://plugins.jetbrains.com/plugin/7577-php-1up-

[axelcostaspena/php-1up: PHP 1Up! is a plugin for IntelliJ based IDEs which provides a growing collection of inspections, intentions and other utils for PHP development.]:https://github.com/axelcostaspena/php-1up


[新しめのものならデフォルトでできるような記事も見たかも。]:https://www.reddit.com/r/phpstorm/comments/4cg7wb/swapping_quote_types/
Manjaro Linux MATE 17.0 + xrdp + xorgxrdpでのリモートデスクトップ

# はじめに

xrdpを使ったリモートデスクトップ環境をセットアップしたので、そのメモ。

# 環境
- Manjaro Linux Mate (17.0)
- テスト用のためFW設定は省略

# ソフトウェアバージョン
- xrdp 0.9.2-1 (AUR)
 - AURで提供されているので、yaourtなどで入れる。
- xorgxrdp 0.2.1
 - まだAURには登録されていなかったので、 [xorgxrdp](https://github.com/neutrinolabs/xorgxrdp)からインストール。

WMを起動できないとき、xrdpはxtermを起動する設定になっているので、xtermも入れておくと問題の解決に役立つかもしれない。

# インストール直後の状態
`xrdp.service` と `xrdp-sesman.service` は実行できる状態だが、実際に接続してもデスクトップ画面は現れない。順をおって解決していく。

# Xorg.Wrapを動くようにする

デスクトップ画面が出ない状態でプロセス一覧を見ると、`Xorg.wrap` が止まったままになっている。どうも正しい権限で実行できていないようにみえるので、以下のような設定ファイルを作成してやる。

```shell-session:/etc/X11/Xwrapper.config
allowed_users=anybody
needs_root_rights=auto
```

# pam.dの修正

接続してみると、今度はDBus関連のエラーが表示されてしまう。`startwm.sh`のタイミングですでにDBus関連の環境変数が落ちてしまっているので、[xrdpのIssue情報](https://github.com/neutrinolabs/xrdp/issues/419)を元に修正をする。

```shell-session:/etc/pam.d/xrdp-sesman
auth      include   system-remote-login
account   include   system-remote-login
password  include   system-remote-login
session   include   system-remote-login
```

これで`startwm.sh`にいくつかの環境変数が渡るようになる。


# .xinitrcの修正

上記修正をしても、まだDBusのエラーが表示されてしまう。実際には、Manjaro Linux MATE版は`.xinitrc`で`dbus-launch`が走るようになっているのだが、これが正しく動いていない様子。調べたところ、`--exit-with-session`がなければ動作するようであった。


```diff:.xinitrc
get_session(){
-        local dbus_args=(--sh-syntax --exit-with-session)
+        local dbus_args=(--sh-syntax)
        case $1 in
                awesome) dbus_args+=(awesome) ;;
                bspwm) dbus_args+=(bspwm-session) ;;
                budgie) dbus_args+=(budgie-desktop) ;;
                cinnamon) dbus_args+=(cinnamon-session) ;;
                deepin) dbus_args+=(startdde) ;;
                enlightenment) dbus_args+=(enlightenment_start) ;;
                fluxbox) dbus_args+=(startfluxbox) ;;
                gnome) dbus_args+=(gnome-session) ;;
                i3|i3wm) dbus_args+=(i3 --shmlog-size 0) ;;
                jwm) dbus_args+=(jwm) ;;
                kde) dbus_args+=(startkde) ;;
                lxde) dbus_args+=(startlxde) ;;
                lxqt) dbus_args+=(lxqt-session) ;;
                mate) dbus_args+=(mate-session) ;;
                xfce) dbus_args+=(xfce4-session) ;;
                openbox) dbus_args+=(openbox-session) ;;
                *) dbus_args+=($DEFAULT_SESSION) ;;
        esac

        echo "dbus-launch ${dbus_args[*]}"
}
exec $(get_session)
```

# 番外編: NVIDIA GPUでxorgxrdpが読まれるようにする

video-nvidia を使っている場合、mhwdのxorg.conf(/etc/X11/xorg.conf.d/90-mhwd.conf)が読まれてしまい、xorgxrdpが読まれないことがある。幸い、sesman.iniからXorgへオプションを渡すことができるので、/etc/xrdp/sesman.iniを以下のように修正することで回避する。

```diff:/etc/xrdp/sesman.ini
[Xorg]
param=Xorg
param=-config
param=xrdp/xorg.conf
param=-noreset
param=-nolisten
param=tcp
param=-logfile
param=.xorgxrdp.%s.log
+param=-layout
+param=X11 Server
```
cordovaでメッセージ、ファイルを共有

「cordova-plugin-x-socialsharing」を利用します
基本的にはこちらに書いてある通り
https://github.com/EddyVerbruggen/SocialSharing-PhoneGap-Plugin

#プラグインの導入

```
$ cordova plugin add cordova-plugin-x-socialsharing
```

#使い方
ボタンを用意して、クリック時イベントにて指定

メッセージ共有

```
<button onclick="window.plugins.socialsharing.share('Test Message')">MSG Share</button>
```

画像共有

```
<button onclick="window.plugins.socialsharing.share(null, null, [イメージファイルのパス], null)">IMG Share</button>
```

メール送信用？（メッセージとタイトル）

```
<button onclick="window.plugins.socialsharing.share([メッセージ], [タイトル], [イメージファイルのパス], null)">Mail Share</button>
```

共有用ボタン表示
![1.png](https://qiita-image-store.s3.amazonaws.com/0/175762/b31ea170-1473-f1f7-3b68-04eab013ee7b.png)

「MSG Share」クリックすると、共有先が表示される
![2.png](https://qiita-image-store.s3.amazonaws.com/0/175762/4a70e868-0363-2908-adb1-5874a8e55651.png)

チャットワークに共有してみる
![3.png](https://qiita-image-store.s3.amazonaws.com/0/175762/bbf045b3-6db9-e53f-07f5-55c30d9f304b.png)

以上です。
RSpec (shoulda-matchers) のensure_inclusion_in、ensure_length_ofがundefined methodになる際の解決方法

#バージョンアップによるメソッド名の変更
ensure_inclusion_in、ensure_length_ofから始まるメソッドはバージョンアップ時に名前が変更された。

###★Version2系の時はensureで書くことができた
以下の様にテストコードを書くことができた。

```ruby:test_spec.rb
it { should ensure_length_of(:comment).is_at_most(10000) }
```

###★Version3系になるとensureがvalidateにリネームされている。
以下の様に書く必要がある。

```ruby:test_spec.rb
it { should validate_length_of(:comment).is_at_most(10000) }
```

### 参考

- https://github.com/thoughtbot/shoulda-matchers/blob/master/NEWS.md#270
- https://github.com/thoughtbot/shoulda-matchers/blob/master/NEWS.md#280
JenkinsでOpenstf連携までの手順

# はじめに
本章はOpenstfとJenkinsを連携させ、Jenkins上でOpenSTFの端末を使ってビルドできる状態にするまでの手順のメモです。

# 環境
- JenkinsとOpenstfは同一PC(Mac)上にある
- Dockerは使ってない

# Jenkinsにプラグインを入れる
Jenkinsのトップから「Jenkinsの管理」→「プラグインの管理」→「利用可能タブ」→「[Open STF Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Open+STF+Plugin)」を選択し、インストールする

# アクセストークンの作成をする
JenkinsからOpenSTFにアクセスするためのトークンを作る。トークン作成はOpenSTF側で行う。これをしないと端末は見れるけど触れない。
**この作業はSafariでやると正しく動かないので注意！(ブラウザの相性・・？)**

まずOpenSTFにログインし、「設定」→「認証キー」タブを開く

その後、「アクセストークン」の横の＋ボタンを押す
<img width="618" alt="スクリーンショット 2017-05-02 10.54.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/76726/ad2282fc-904b-58be-cc07-b93dde8f8cd1.png">

押すとトークン名入力欄が出てくるので任意に入力し、「新規トークン生成」をクリック

<img width="601" alt="スクリーンショット 2017-05-02 10.54.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/76726/c3d18e51-4c95-7915-9ee7-bf1e4a7425c5.png">

するとトークンが表示されるのでコピーする。
これは注釈にもある通り、**一度しか表示されないので注意すること!**
<img width="610" alt="スクリーンショット 2017-05-02 10.54.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/76726/2b4abc8e-c64e-2561-3402-7fb03bc7df2d.png">

コピーが終わったらチェックマークをクリックすればOK

# Jenkinsにトークンを登録する
JenkinsにOpenSTFの設定を行う。**事前にプラグインがインストールされていること**

Jenkinsのトップページから、「Jenkinsの管理」→「システムの設定」と移動する。
その中の「STF API endpoint URL」には`http://<hostName>/api/v1`を指定、
「STF Access Token」には先ほどコピーしたトークンを貼り付ける。
<img width="876" alt="スクリーンショット 2017-05-02 11.08.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/76726/5289dab5-656a-804a-58c1-ea8314fd862f.png">

その後、保存する。

# ジョブで端末を指定する
ジョブのビルド欄に「Use a STF Device during build」が追加されているのでチェックを入れるとOpenSTFで登録してある端末一覧が並ぶ
<img width="646" alt="スクリーンショット 2017-05-01 15.57.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/76726/9947b46d-167a-77f8-84cd-223278ecdd75.png">

「追加」ボタンを押し、ビルド時に使う端末の条件を指定する。
この辺りはほぼ直感でできるので割愛。

また、端末のサムネイルにマウスオーバーすると、各端末のスペックが表示される
<img width="629" alt="スクリーンショット 2017-05-01 15.58.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/76726/84e6f71f-de15-606c-4ee0-d123bf2f0cfc.png">


あとは普段通り、Androidビルドの設定を行えばOK、、、多分。


# うろ覚え情報
試行錯誤中にやったので、必要条件か曖昧な情報。もしうまく行かなければ試して見てください。

## ADBKeyの登録
初めてサーバーからアクセスする際、ADBKeyの登録が要求される。
`adb connect` コマンドで接続を行うと、OpenSTF側にダイアログが表示されるのでそれを承認する。
AndroidのSQLiteでrawQueryを使ってDELETE

# 1.AndroidでSQLite
AndroidでSQliteを使う時、DELETE文をrawQueryで実行する時。Cursorに対してrawQueryを実行した後にmoveToFirst()を実行しないと実際にはレコードの削除が実行されない。

<pre>
// サンプル
SQLiteDatabase db;
db = dbHelper.getWritableDatabase();

// SQL文
String sqlStr = "DELETE FROM " + TABLE_NAME + " WHERE " + COneRowInfo.COL_ID + " = " + alarmId;

// SQL実行
Cursor cursor = db.rawQuery(sqlStr, null);
// 以下の文を実行しないとRecordは削除できない！
cursor.moveToFirst();

</pre>

なぜcursor.moveToFirst()が必要なのか？それは仕様なんですかね～。
あまり深く突っ込まず、ここは必要なのだと割り切りましょう！
PowerShell で、SharePoint Online の リストの一覧を書き出してみた

# 目的
SharePoint Online では、Client Side Object Model(CSOM)を使って、
色々な情報を抜き出したり、書き込んだりすることができる。
これを使うと、簡単に管理作業が出来るので、これから色々なスクリプトを書いてみる。 

CSOMに関することは、サポートチームのblogで、
https://blogs.technet.microsoft.com/sharepoint_support/2014/10/19/sharepoint-online-powershell/

# 事前準備

以下のインストール

- PowerShell Ver 3.0 以上
- SharePoint Server 2013 Client Components SDK  
（ https://www.microsoft.com/en-us/download/details.aspx?id=42038 ）


# サンプル

設定する項目は、以下の二か所

\$SiteCollectionUrl ：サイトコレクションのURL
\$Account ：管理者権限のアカウント

```PowerShell
 # Read CSOM
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client") | Out-Null
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client.Runtime") | Out-Null

# SiteCollection URL 
$SiteCollectionUrl = "https://tenant-name.sharepoint.com" 
# $SiteCollectionUrl = "https://tenant-name.sharepoint.com/sites/subsite" 

# Account
$Account = "administratorsName@tenant-name.onmicrosoft.com" 
$SecurePassword = Read-Host -Prompt "Enter Your Password." -AsSecureString

# Create Credential
$Credential = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($Account, $SecurePassword) 

# Create Context
$Context = New-Object Microsoft.SharePoint.Client.ClientContext($SiteCollectionUrl)
$Context.Credentials = $credential

# Create List object
$Context.Load($Context.Web.lists) 
$Context.ExecuteQuery()

# Output 
foreach($objList in $Context.Web.lists)
{
    Write-Host "list Title : " $objList.Title
}

# Dispose Context
$Context.Dispose()
```

# 参考
List メンバー
https://msdn.microsoft.com/ja-jp/library/microsoft.sharepoint.client.list_members.aspx

# 要望
他のプロパティも、そのうち追加しますが、これを見たいというものがあれば、コメントにお願いします。
href="javascript:void(0)"した<a>タグで別ウィンドウが開いた

```html
<a href="javascript:void(0);" target="_blank">
```

`<a>`タグのデザインを利用しつつリンク機能を抑制するために、このようなコードが書かれていた。

Chromeでは意図した動きになるが、
IE11ではアドレスバーに`javascript:void(0);`が入力された状態でタブが開いた。
もちろん`target`属性を付ける必要はないので消して解決。

あまり価値はなさそうだが、こんなこともあったなと一応メモしておく。

```
Chrome 57.0.2987.133
IE 11.0.9600.17420
```
`xargs` と `-` の違いについて

`xargs` と `-` の違いについて簡潔にかきたいと思います。


たとえば、

```bash:例1
$ find ./*.txt | xargs grep 'hoge'
```

とか、

```bash:例2
$ sed 's/a/c/g' sample_a.txt | diff - sample_b.txt
1c1
< This is c
---
> This is b
```

など、パイプにからめて使うことがあります。


# 違いについて

- `xargs` は、標準入力を引数のリストとして解釈します。
- `-` は、標準入力の内容を、引数（ファイル）の内容として解釈します。


**例1は...**

```bash:findはファイルのリストを返します。
$ bash-3.2$ find ./*.txt
./sample_a.txt
./sample_b.txt
```

そして、grep は下のように、そのファイルリストをそのまま引数として受取りたいところです。

```
grep 'hoge' file1.txt file2.txt
```

ですので、`xargs` を使います。



**例2は...**

diff は通常、以下のようにファイル名を引数に持ちます。

```
diff file1.txt file2.txt
```

ですが、`-` によって、標準入力を使うこともできます。

```
$ diff sample_a.txt -
hoge
1,2c1
< This is a
< hello
---
> hoge
```

そして、パイプと絡めます。
パイプは、パイプ前部の標準出力を、パイプ後部に標準入力に渡してくれるものです。
ですので、以下のような書き方が有効になります。

```
sed 's/a/c/g' sample_a.txt | diff - sample_b.txt
```
EMRを使うときに便利なSSHの設定

EMRを使うとき、以下の点が不便だと感じたので、設定しました。

* スレーブにSSHできない
* しばらくプロンプトをほうっておくとタイムアウトしてしまう
* YARNのResource ManagerなどのWebUIのためのポートフォワード用に別でsshを実行するのが面倒
* 毎回ssh -i keypair.pem ・・・ hadoop@***のようにキーペアとユーザを指定するのが面倒

以下のようにSSHの設定を行いました。

SSHエージェントの登録
-----

```
localhost$ ssh-add ~/.ssh/keypair.pem
```

SSHconfigの設定
--------

```
localhost$ touch ~/.ssh/config
localhost$ chmod 644 ~/.ssh/config
```
~/.ssh/configの中に以下の内容を記述する

```
ServerAliveInterval 300
TCPKeepAlive yes
Host *.compute.amazonaws.com
    IdentityFile    ~/.ssh/keypair.pem
    User            hadoop
    DynamicForward  8157
    ForwardAgent    yes
    StrictHostKeyChecking no
    UserKnownHostsFile /dev/null
```

設定後は、以下でEMRへ接続できる。

マスターノードへの接続
------
```
localhost$ ssh ec2-XX-XX-XX-XX.ap-northeast-1.compute.amazonaws.com
```

マスターノードからスレーブノード（コアノード）へのSSHアクセス
------

```
emr-master$ hadoop dfsadmin -report |grep ^Name |cut -f2 -d: |cut -f2 -d' '
10.187.XX.XX <- slaveのIPアドレス
10.167.YY.YY
emr-master$ ssh hadoop@10.187.XX.XX
```

皆さんのEMRのインテグレーションが楽になりますように＼(^o^)／
【Python R pyper】pyper.Rが関数内だと使えない？解決方法

#引数RCMDに値を渡すとpyper.Rにエラーがでる、、、？

python3だと、インタープリタで以下に打つとインスタンスが作成されますが、（ただしRへのパスを通している場合）

```
>>> import pyper
>>> r = pyper.R() 
```
以下のようにRへのパスを記入するとエラーがでました。

```
>>> import pyper
>>> r = pyper.R(RCMD ="Rの場所")
```

別にパス通さなくても実行できるし、放置で良いかと思ってました。

##引数RCMDにパスを渡さないと、関数内で使えない、、、
困りました。python初心者なため、原因が何なのか検討がつかないため、とりあえず、入門python3を読みなおしました。
関数の作り方をいろいろ試したけど、うまくいかない、、、さて困った。

###エラーを見直そう。そうしよう。
自分の無知はさておいて、エラーと向き合うことにしました。

```
childstderr = file('nul', 'a')
```
どうやら、pyper.pyのここが悪さをしているようです。なにがいけないんでしょうか。

###途方にくれている最中、神様が耳元でふっと囁いた
**関数fileってpython3では使えないんだぜ、、、、**

まさかね、fileをopenに組み替えればいいなんてあるわけないよね。そんな簡単な話じゃないよね。
半信半疑でしたが、

```
childstderr = open('nul', 'a')
```

に書きなおしましたよ。ええ、ちゃんと動くようになりましたよ。パチパチパチ。

#結論
エラーを解決するには、エラーを理解するしかないんですね。当たり前ですね。
でも、pythonの勉強になりました。あーでもない、こーでもないと考えていると、自分の理解が足りていないところが
明確になったり、遠回りも悪くありません。
SQLServerでストアドプロシージャを登録する際のテンプレート

忘れそうなのでメモ書き

```SQL
--XXXXがストアドプロシージャ名になる

--すでにストアドプロシージャがあるなら削除する
If Exists (Select * From sys.objects Where Object_Id = Object_Id(N'dbo.XXXX') And Type In (N'P', N'PC'))
	Drop	Procedure	XXXX					
Go
CREATE PROCEDURE XXXX
	--引数エリア
	 @aaa int
AS
BEGIN
	--ストアドプロシージャ処理

END
GO
```
Docker Community Edition for WindowsをWindows 10 Proにインストール

Docker Community Edition for WindowsをWindows 10 Proにインストールします。
Dockerは、商用版がEnterprise Editionとなり、Community Editionが無償版となるようです。

# Hyper-Vを有効化
まずは、Windows 10 Proの「Windowsの機能」画面を立ち上げて、Hyper-Vを有効化する。
![2017-04-30 (1).png](https://qiita-image-store.s3.amazonaws.com/0/100712/28f46eab-872c-bf13-f013-22c18ddac5e8.png)


# Docker CEをダウンロード＆インストール
以下の場所からWindows版をダウンロードする。
[Docker Community Edition](https://www.docker.com/community-edition)
![2017-04-30 (2).png](https://qiita-image-store.s3.amazonaws.com/0/100712/c7d0e983-0b7e-48e9-e2d5-c7b7224f3a4f.png)

「InstallDocker.exe」をダウンロードしたら、インストール（全てデフォルトのまま）。

# インストール後の確認
インストール後、hello-worldを試してみる。
ローカルにないので、インストールされる。その後、hello-worldが実行される。

```
Windows PowerShell
Copyright (C) 2016 Microsoft Corporation. All rights reserved.

PS C:\Users\spiderx> docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
78445dd45222: Pull complete
Digest: sha256:c5515758d4c5e1e838e9cd307f6c6a0d620b5e07e6f927b07d05f6d12a1ac8d7
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $
```

ubuntuのbashを試してみる。
Hello-worldと同じく、パッケージが無いのでインストールされる。
その後、bashが立ち上がる。

```
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://cloud.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/engine/userguide/

PS C:\Users\spiderx> docker run -it ubuntu bash
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
aafe6b5e13de: Pull complete
0a2b43a72660: Pull complete
18bdd1e546d2: Pull complete
8198342c3e05: Pull complete
f56970a44fd4: Pull complete
Digest: sha256:f3a61450ae43896c4332bda5e78b453f4a93179045f20c8181043b26b5e79028
Status: Downloaded newer image for ubuntu:latest
root@e2151021af68:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@e2151021af68:/# pwd
/
root@e2151021af68:/# ls home
root@e2151021af68:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@e2151021af68:/# pwd
/
root@e2151021af68:/# exit
exit
PS C:\Users\spiderx>
```
とりあえず、インストールは成功！

# 参考URL等
[無償のDocker for Windowsで手軽にLinuxコンテナを利用する](http://www.atmarkit.co.jp/ait/articles/1609/01/news053.html)
Git 鬱陶しいのでローカルのブランチを消す

# どうしてそうなった
Gitを使っていて
```git branch```
したらブランチがばーーっと100個くらい出てきて
「これもうわかんねえな...」てなったのでローカルブランチを消した。

# どうやって？

```sh
# マージしたものだけ消す
% git branch --delete [branch名]
# マージ関係なく消す
% git branch -D [branch名]
# 全部消す
% git branch --merged | grep -v '*' | xargs git branch -D
```

# 疑問へと変わった
ブランチって消していいの？
みんなブランチ増えていっても消さないのかなー。
Excel 2013 > tips > フィルタ > フィルタ条件に適合するデータとその近辺データを閲覧する手順

```txt:動作環境
Excel 2013 on Windows 8.1 pro(64bit)
```

### やりたいこと

`19:00:00`のように分と秒が0の時刻近辺のデータを見たい。
フィルタをかけると「分と秒が0の時刻」のデータしか見れない。

### 手順 v0.1

以下でできそうだ。

1. フィルタに使う列を含めて表示したい列を全部選択
2. データ > フィルタ を押す
  - 1行目の各列にフィルタ用のマーク(:arrow_down_small:)が表示される。
3. 選択したい列のフィルタマークをクリックする
4. 検索用キーワードを入力する
  - `:00:00`
  - 検索用キーワードをCtrl+cしておく
5. OKを押してフィルタを適用する
  - フィルタがかかったデータのみ表示される
      - 17:00:00, 19:00:00, 21:00:00, 23:00:00
6. 近辺を閲覧したいデータの行を選択する
  - 例: 782
7. データ > フィルタを押す
  - フィルタが解除される
8. データ > フィルタを押す
  - フィルタが再適用され、カーソルの位置は手順6で選択した行に移る
9. マウスの上下スクロールで近辺のデータを見る
10. 手順6で選択した行に戻り、そのうちのフィルタ適用列の :arrow_down_small:をクリックする
   - 検索キーワード入力画面になる
11. 検索キーワードとしてCtrl+vする (手順4で記憶したもの)
12. OKを押してフィルタを適用する
   - 782行目より下のデータにフィルタがかかる
13. 手順6以降を繰り返す

もっと簡単な方法はあるかもしれない。

### 手順 v0.2

以下の方が簡単だ。

1. フィルタに使う列を含めて表示したい列を全部選択
2. データ > フィルタ を押す
  - 1行目の各列にフィルタ用のマーク(:arrow_down_small:)が表示される。
3. 選択したい列のフィルタマークをクリックする
4. 検索用キーワードを入力する
  - `:00:00`
5. OKを押してフィルタを適用する
  - フィルタがかかったデータのみ表示される
      - 17:00:00, 19:00:00, 21:00:00, 23:00:00
6. フィルタ適用データの右側の開いているセルにジャンプ用テキストを入力する
  - 例: `a`
7. フィルタを解除する
8. 手順6で入力した列でCtrlとカーソル上下を使って、フィルタ条件適合データに飛ぶ
Visual Studio / WPF > IDE > グリッド分割を行う

[Visual Studio 2010のWPF/Silverlightデザイナの基本的な使い方 by かずきさん](http://blog.okazuki.jp/entry/20110702/1309611366) 

上記を見ていると、Gridの分割をWPFデザイナでできるようだ。

グリッドの中心を通る縦の線と横の線は以下の手順でつけることができた。

1. グリッドをクリック
   - 中心と垂直二等分線と水平二等分線が表示される
2. グリッドの端にマウスをもっていき、オレンジの線を表示させる
3. 表示されている垂直二等分線の位置で線を確定する
4. 水平二等分線についても同様にする


![work.png](https://qiita-image-store.s3.amazonaws.com/0/32870/5eb52f98-cdf7-08b6-a32a-ed04c7f7a83e.png)

横のサイズが奇数なので、きれいな分割になっていない。
縦のサイズは中心を通っている。

## v0.2 > 追加してからマウス操作

上記のようにグリッドをクリック、しなくても良さそう。

Grid分割線を作ると、`259* 258*`のような比率が表示されるので、それを見ながら位置調整すればいい。

## v0.3 > 追加してから数値操作

グリッド追加後に１つのグリッド分割にマウスカーソルをあてると`16 *`のような表示になる。
この16という数字をもう片方のグリッド分割(`31`)にあわせると、1:1の比率の分割になる。

![work.png](https://qiita-image-store.s3.amazonaws.com/0/32870/381dbdc6-19ef-d933-aef7-12c84c6954b3.png)

![work.png](https://qiita-image-store.s3.amazonaws.com/0/32870/93aec5c0-aff2-dab7-e6ee-934e98aacaa8.png)

`*`(Star)、Pixel, Autoの表示を切り替え可能。
![work.png](https://qiita-image-store.s3.amazonaws.com/0/32870/cdd71fb4-6e13-2244-38b7-7a5ed2d46839.png)

応用するとこういう分割が簡単にできる。

![work.png](https://qiita-image-store.s3.amazonaws.com/0/32870/094a1a4a-fb73-e575-d377-98076e2dbe0e.png)
技術英語 > counter-example | counter-proposal

思い出したもの

counter-example

http://ejje.weblio.jp/content/counterexample
> 反例、反証

機能が分化したとき、既存の機能と追加した機能のテストを検討する。
それぞれの「正常系」と「異常系」を考えることになる。

異常系を考えていた時にふと思い出したのが「counter-example」。

### 反証

「反証」の使い方は、「xxは正しい」ということを「xxは間違いである」という反対の証拠を挙げることだろう。

https://en.wikipedia.org/wiki/Counterexample
> a counterexample is an exception to a proposed general rule or law. 

とある研究で片方の成果があまりに印象的すぎて、その反証の情報が埋もれるという傾向がある。一方の情報だけを見ていると、判断を誤る場合がある。

### 関数のnaming > 対案
関数を追加したとする。
関数名について気になる。

7of9 「この関数で意味が取れる」
7of9(@別の視点) 「この関数はこういう意味とも取れる」
7of9 「じゃあこういう名前でどうだ」

**対案 counter-proposal**
https://www.merriam-webster.com/dictionary/counterproposal

### poem

スレイン・トロイヤード「空が青いのは屈折によるものです」
界塚伊奈帆「空が青いのはレイリー散乱のためです。大気中の微粒子はMie散乱をします。」
誰か @ 2017年「空が青いのはレイリー散乱により、[波長の4乗に反比例して](https://www.princeton.edu/cefrc/Files/2011%20Lecture%20Notes/Alden/Lecture-7-Rayleigh.pdf)散乱現象が起きるためです」
7of9 @ 2019年2月「空が青いのはレイリー散乱による寄与が大きいためですが、森林火災が発生した時に生成されるバイオマスバーニングエアロゾルがそこに含まれると、数千万個のnmサイズの粒子の多重散乱により波長変化特性が変わります。結果として、空は青くならなくなります。この場合、球形ではないため、Mie散乱だけでは計算できません。これは最近開発したTensorFlow 3.0用コードで1024GPUを用いて確認済です。」
アセイラム「。。。」

Assamで見たダストが飛来した時の真っ赤な空は、未だに強い印象で記憶している。
ダストの場合はgeometrical opticsが主体となる散乱形態となる(一部physical opticsも関係する?)。上記のバイオマスバーニングエアロゾルとは別の散乱計算方法を用いる。
DELL XPS15 9550,9560 に ubuntu 16.04 LTSをWindows10とデュアルブートでインストールする

## どうでもいい背景

約2年半ほどMacbookPro15インチをメインマシンとして使用していました。
もともとデスクトップPCでubuntuを使っていた身だったので、BSDベースとはいえどの程度unixなのかとかなりネガティブな目で触り始めたのですが、作りこまれたハードウェアに、優等生なGUI、brewのパッケージ管理システムも行き届いているはで、すっかりマカーになっておりました。
が、ある日ふとした事件で水没。AppleCare期間中にもかかわらず修理代は**諭吉先生10人超**。
おいおい。。

そもそもは水没させた私が悪いんですが、この機会にまた馴れ親しんだ混沌のubuntuに戻ることにしました。
なんでもあるけどMacOSほど作りこまれていないあのアナーキーな感覚。慣れればやみつきになります。するめのごとしです。
気分によってWindow Managerも変えられるしね！でも私はオワコンなUnity7愛用者だけどね！...orz


あと安い。てかマックが高い？同じスペックで10万は違うという。。
10万ですよ、10万!そのお金で、PS4とPSVRが買えちゃうじゃないですか！

というわけで、XPSにubuntuをwindowsとデュアルブートで入れるなんてありふれてんだろ、と対して調べもせずにとりかかったのですが、これが茨の道！

> DELL XPS13 (9350 2015/11モデル)にUbuntu15.10をデュアルブートインストール(with Windows10)
http://qiita.com/NewGyu/items/d25cda12e0e1c5259121

えっ、デュアルブートしたいだけなのにWindows10を再インストールしなきゃならんてどういうこと！？
これはもうWindowsを捨てるしかないか、、と悲壮な覚悟()でggった結果、以下の手順に従えばWindows10を再インストールしなくてもいいことがわかりました。

>Ubuntu 16.04 on Dell Xps 15 9550 (i7-6700HQ - 1TB SSD - UHD 4k touch)
https://ubuntuforums.org/showthread.php?t=2317843


簡単な英語なんで読めばわかりますが、せっかくなんで同じ道を歩む同好の士のために日本語で足跡を残しとこうと思います。


## デュアルブートのための準備

0.BIOSをアップデートする

- Windowsから実施

ともかくBIOSを最新にする必要がある模様。私は以下を参考に実施しました。
DELLが親切なインストーラーを用意してくれているので難しくはないと思います。

> BIOSをアップデートする手順
https://www.dell.com/support/article/jp/ja/jpbsd1/SLN294907/bios%E3%82%92%E3%82%A2%E3%83%83%E3%83%97%E3%83%87%E3%83%BC%E3%83%88%E3%81%99%E3%82%8B%E6%89%8B%E9%A0%86?lang=JA


1.リカバリディスク、もしくはUSBメモリを用意する

これもWindowsからやっちゃってください。説明は省きます。

2.Ubuntu用パーティションを作成

これも私はWindowsから実施しました。最近のWindowsって現在使用中のパーティションもリサイズできるんですね。ちょっと感動。以下の説明がわかりやすかったです。

> やらない理由が見つからない！Windows10のパーティション分割！
http://yakudate.com/win10-partition-division/


3.Windows10の高速スタートアップを無効にする

以下を参考に高速スタートアップを無効にしてください。


> Windows 10で高速スタートアップを無効にする方法
https://i-bitzedge.com/tips/how-to-turn-off-fast-start-up-on-windows-10


4.Windowsをセーフモードで起動する準備をする

これがミソです！
SATAの設定をRAIDから AHCI SATAに変更しても、セーフブートなら起動できるんです。
一旦起動しちゃえば、次からは通常モードでも起動できるんです。
というわけで下準備。

Windowsキー+Rで表示させたダイアログに``msconfig``と入力
"Boot"メニューから"Safe mode boot"を選択。


5.SATAの設定を変える

- リブート後、DELLのロゴがでているうちにF2キーを連打してBIOSメニューに入ります。
- Secure Bootを無効にします。
- SATAの設定をRAIDからAHCIに変更します。
- 設定を反映してリブートします。


6.Windowsがセーフモードで起動するので、セーフモードブートを解除する

前述のmsconfigを用いてセーフブートを解除します。
もしできない場合は、管理者ツールからシステム設定を選択し、「起動」タブのセーフブートの選択を解除します。


# インストール

- Ubuntuをインストールする

Ubuntuのインストールメディアを挿入し、しかるのちにリブート
あとは流れに従ってインストールしちゃってください！


# 追記
9560でもこの方法でうまく行ったのでタイトルに追加しました。
Railstutorial 4版　覚書 第３章

この章は順調にいった。が、ここだけ注意。

- ルートを変更する場合

```config/routes.rb
get  'static_pages/home'
```
を

```config/routes.rb
root 'static_pages#home'
```

に変更するとき**/を#に**変更

###個人的なまとめ

- テストに色をつける

```test/test_helper.rb
追加
require "minitest/reporters"
Minitest::Reporters.use!

```
MkDocs と GitBucket と GitBucket Pages Plugin で簡単ドキュメントサイト構築

# TL;DR

MkDocs は GitBucket の Pages プラグインとも相性良くて簡単！

# はじめに

ちょっと [GitBucket](https://github.com/gitbucket/gitbucket) の利用者向けガイドみたいなものを公開したくて、Markdown あたりで書いたものを簡単に公開できる仕組みを探していた。
普段静的サイトジェネレータとしては [Nikola](https://getnikola.com/) を使っているけど、ちょっと設定が多いしデフォルトだとブログっぽい感じになりすぎるので別のを探した。
[MkDocs](http://www.mkdocs.org/) というのを見つけて試してみたところ、簡単で GitBucket とも相性良かったので採用した、という話。

# 準備

- GitBucket に Pages Plugin を入れておく
- Python が動く環境を用意しておく
- Git が（略

# インストール

```
pip install mkdocs 
```

システム全体に入れるか、`--user` したり virtualenv で入れたり pyenv で入れたりはお好みで。

# サイトの作成

```
mkdocs new MkDocsSample
```

で `MkDocsSample` という名前のディレクトリに雛形が出来る。

# GitBucket に置く

GitBucket でリポジトリを作成しておいて、MkDocsSample の中で `git init` `git remote add origin http://server/git/user/repo.git` しておく。あと、`.gitignore` に `site/` と書いておいた方が良い。

で、適当に `git add .` `git commit -m "initial commit"` して、`git push -u origin master` で生成元の Markdown を入れておく。

# サイト生成＆Pages に公開

mkdocs コマンドはオプションも少なく非常にシンプル。

```
Usage: mkdocs [OPTIONS] COMMAND [ARGS]...

  MkDocs - Project documentation with Markdown.

Options:
  -V, --version  Show the version and exit.
  -q, --quiet    Silence warnings
  -v, --verbose  Enable verbose output
  -h, --help     Show this message and exit.

Commands:
  build      Build the MkDocs documentation
  gh-deploy  Deploy your documentation to GitHub Pages
  json       Build the MkDocs documentation to JSON files...
  new        Create a new MkDocs project
  serve      Run the builtin development server
```

- `build` で site/ 以下に HTML を生成する。
- `serve` で localhost:8000 に HTTP サーバを起動するのでブラウザでチェック（Live reload対応）
- `gh-deploy` で GitHub Pages や GitBucket Pages が使う `gh-pages` ブランチに `site/` の中身を入れて自動的に push してくれる。
- `json` で JSON ファイルを生成する・・・って何に使うんだろ？

ということで、`mkdocs gh-deploy` と打つだけで GitBucket の `gh-pages` ブランチに Push されているので、http://server/user/repo/pages/ という URL でドキュメントが公開された状態になっている。簡単。

# コンテンツの作成

あとは `docs/` 以下に *.md を放り込んだり、mkdocs.yml を色々いじったりして、`mkdocs serve` で確認、確認が終わったら `mkdocs gh-deploy` で公開、を繰り返して良い感じのドキュメントを公開しよう！
RF Python Basic_01

Vertion RealFlow10
Pythonの基本ができればRF_Pythonもサクサクかけますよ

今回はBatch Scriptを使用します。
`:F10keyで表示できます。`

:僕はこんな感じのlayoutにしてます。
`Script view`
![Script_Setup..PNG](https://qiita-image-store.s3.amazonaws.com/0/179218/ce4a19ec-8c18-5141-7e9d-d8f87e1c2c9e.png)



`入門編`

---
```
#Create Helloworld

word = "HelloWorld";
scene.message(word);

```
Scriptの実行はCtrl+Enterで実行されます。
`日本語入力はErrorでますよぉ`

MessagesにHelloWorldが表示されたら...
おめでとうございます!
実行成功です。

---

さて....

値や何かしらの演算結果をmessageに出力したい場合は
`.message`

`scene`
はモジュールとなっています。
`scene`は変数にmappingする事ができます。

```
#into variable
moj = scene;
moj.message("helloWorld");

```


stringの連結は...

```
scene.message("hello"+"World");
``` 

```
word = "hello";

scene.message(word+"World");
```
確認済みっす。

---


*`vector  module`*

![vector ..PNG](https://qiita-image-store.s3.amazonaws.com/0/179218/6522b1a1-51ed-7702-13d9-7b274d856819.png)

```
# Create a new vector a compute its module.

vector = Vector.new( 1.0, 2.0, 3.0 );
scene.message( str( vector ) );

```

ＣＧでおなじみの三次元コンポーネント
:Arg(引数)
:messageで出力する場合はstr()で囲う必要があります。
:floatの値を取得する場合は...

```
#get float component
vector = Vector.new( 1.0, 2.0, 3.0 );
vecX = vector.getX();
scene.message( str( vecX) );

```


![Vector_operater.PNG](https://qiita-image-store.s3.amazonaws.com/0/179218/1f060fae-d38b-191f-0c71-592aae596684.png)

---
`Edit_vectorfunction`
![set_function.PNG](https://qiita-image-store.s3.amazonaws.com/0/179218/1b62f369-8cd1-5553-3254-55979d6a8e2a.png)

---

僕が体感的に習得が難しかった部分は上記の２つでした。
この二つさえ抑えておけば、サックサクにScript書けると思います。