OmniAICreator/Qiita-1.07M huggingface dataset:
JScript 覚書（実践編その弐：フォルダを操作してみる） 

# はじめに

@GORO_Nekoです。ご存知の方ご無沙汰してます。初めての方お初にお目にかかります。

今回も、先にお断りをば一言。

以下は、自分が所属する会社の意向を反映したものでもスタンスを示すものでもなく、単なる一個人の趣味の活動から産まれた記述です。

# JScriptって知ってます？

知ってますよね？　知らない方は[こちらの記事](https://qiita.com/GORO_Neko/items/0be4ddc3b40094d0006f)をご覧ください。

はい、この記事**も**上で紹介した記事「JScript 覚書」の続編です。

[初回](https://qiita.com/GORO_Neko/items/0be4ddc3b40094d0006f)は「JScript とは何か」、[二回目の記事](https://qiita.com/GORO_Neko/items/1ff0b973deb72bf4a6e7)では「JScript で Windows の標準入力・標準出力・標準エラー出力を利用する方法」を紹介してまいりました。

今回は「JScript で コンピューターのファイル システムへのアクセス(*1)をする方法」を紹介しようと思います。

*1: 本記事では、ディレクトリの操作（作成、コピー、削除、名前の変更）方法に関し紹介します。

# 操作方法の概略

JScript は CreateObject と言う関数を用いて Microsoft ActiveX Data Objects (ADO) オブジェクト等を生成し、生成したオブジェクトが持つ各機能を利用することが可能です。

今回紹介するディレクトリやファイルの操作機能は、Windows OS が提供する FileSystemObject オブジェクトが持っていますので、CreateObject でこのオブジェクトを生成することで実現可能です。

FileSystemObject オブジェクトが持っている機能と、機能を実現するメソッドにどんなものがあるかに関する情報が [Microsoft さんの Web ページ](https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/filesystemobject-object)にまとめられています。

詳しくはそちらを参照願います。

# ディレクトリの操作例

まずは基本編。新規のディレクトリを一つ作成するコードを書きてみます。

以下の例は C ドライブ直下に sample01 と言うディレクトリを新規に作成するコードになります。

``` create_directory.js

// FileSystemObject オブジェクトを生成する
var oFS = WScript.CreateObject("Scripting.FileSystemObject");

// ディレクトリを新規作成する
oFS.CreateFolder("c:\\sample01");

```

作成したディレクトリをコピーしてみましょう
コピー先はやはり C ドライブ直下とし、コピー先にディレクトリ名 sample02 でコピーする場合のコードは以下のようになります。

``` copy_directory.js

// FileSystemObject オブジェクトを生成する
var oFS = WScript.CreateObject("Scripting.FileSystemObject");

// ディレクトリをコピーする
// コピーではなく移動させたい場合は MoveFolder メソッドを利用する
oFS.CopyFolder("c:\\sample01","c:\\sample02");

```

先ほど作成したディレクトリ sample01 を削除してみましょう

``` delete_directory.js

// FileSystemObject オブジェクトを生成する
var oFS = WScript.CreateObject("Scripting.FileSystemObject");

// 既存ディレクトリを削除する
oFS.DeleteFolder("c:\\sample01");

```

残ったディレクトリ sample02 の名前を sample03 に変更してみましょう。

``` change_directory_name.js

// FileSystemObject オブジェクトを生成する
var oFS = WScript.CreateObject("Scripting.FileSystemObject");

// 名前を変更したいディレクトリをオブジェクト化する
var oDir = oFS.GetFolder("c:\\sample02");

// ディレクトリ名を変更する
oDir.Name = "sample03";

```

うまく動きましたでしょうか？

ディレクトリに関して言えば、FileSystemObject の別メソッドを利用してディレクトリ内に存在するサブディレクトリやファイルの名前を得ること等も可能です。

ファイル操作に関しても、ディレクトリとほぼ同様のやり方で操作可能なメソッドが FileSystemObject の中に用意されています。

※ ファイルの中身の操作（テキストファイル内のデータの編集等）は、また別の話ですが…

詳しくは、先にも書きました[Microsoft さんの Web ページ](https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/filesystemobject-object)をご覧ください。

では、また。
基礎から始める Revit Dynamo 超入門　～基礎知識・環境編～

# はじめに
　本記事はAutodesk Revit用のVPLであるDynamoについて、私が個人的に取り組んでいる内容及び社内で取り組んでいる内容の一部または抽象化したものについて、**備忘録として**、また**建築業界のICT技術活用の発展に寄与することを願って**執筆するものです。
  　特に入門的な内容を扱うシリーズとして作成しますが、たまに難しいことをし始めるかもしれないので、その際はご指摘、ご質問いただければと思います。  

また本記事をご覧になっている皆様は、おそらく建築に関わるお仕事をなさっている方ではないでしょうか。

* 会社からやれと急に言われた
* 自動化できると聞いて興味を持った
* RhinocerosのGrasshopperが得意でやってみようと思った

など、モチベーションは様々かと思います。
　ここでは、まったくビジュアルプログラミングをやったことがない人向けに基礎的な話から説明させていただきます。


# Revit Dynamoについて
　まずは本記事で扱うRevit Dynamoとは何かについてざっくりご説明いたします。

　公式からの文言ですが、```"Dynamoは、建物情報ワークフローのカスタマイズを可能にするグラフィカルなプログラミングインターフェースです。"```
　すごくざっくり説明するなら、**「BIMの情報を利用して手作業ではしたくないような操作をコンピュータにやってもらうためのツール」**だと今は思っておいて下さい。

できることとしては、繰り返し行われるタスクを自動化したり、法規などのルールにかかる問題がある際に警告を出したりと、様々なことがあります。

　基礎的な説明に時間をかけても仕方がないのでどんどん行きましょう（詳しく知りたい方は[こちら](https://primer.dynamobim.org/ja/)などを参照して頂ければと思います）。



# Dynamoの起動
　Dynamoは、Autodesk Revitをインストールすると併せてインストールされますので、特に個別でのインストール作業などを行う必要はありません。

　起動する際は```「管理」タブ＞「ビジュアルプログラミング」パネル＞「Dynamo」```をクリックします。

![１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350776/3b141c27-f9ce-554e-a76c-db168df295f3.png)


するとDynamoが起動しホーム画面が表示されますので、新規作成で新たなDynamoプロジェクトを作成しましょう。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350776/5da49fce-9623-194b-513b-865b571867e7.png)


# Dynamoのインターフェース
　新規プロジェクトを作成すると、以下のような画面が立ち上がります（色はついていませんが……）。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350776/957e4ab0-caea-fded-9e5c-835d755a19ab.png)

　非常に簡潔なUIですね。分かりやすくていいことです。
　注目すべきは以下の2つです。

　②ライブラリ：ノードと呼ばれる機能の塊が格納されています。
　③ワークスペース：ノードを配置してプログラムのフローを作成する場所です。


　少し整理してみると、以下の図のような感じでしょうか。ワークスペースという名のキャンバスにノードという絵の具を使って絵を描いていくイメージです。
　（ライブラリはパレットなのかというのが微妙なところですが、市販の絵の具のうち、利用したいものを購入して使うという点を考慮するとこれでいいかもしれないですね。）

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350776/50973064-d4ef-b6e1-cd0c-753f2c3a2c1a.png)




# Dynamoのバージョン
　次にDynamoのバージョンについてですが、現在、自身が利用しているDynamoのバージョンを確認する場合は、```「メニューバー」＞「ヘルプ」＞「バージョン情報」```から確認することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350776/aa2cdb34-5c08-6d40-65d1-dc17f7b1d434.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350776/cc92711d-c1fc-ae83-ae04-9b962a6b55a3.png)

　Dynamoは最近（2019年12月現在）でこそ仕様変更が落ち着いてきた様子ですが、以前は作ったプログラムが変更ですぐに動かなくなってしまうなどがよくありました。
　この記事執筆以降に取り組み始めた方々はあまり気にする必要はないかもしれませんが、一応ご使用のバージョンは確認するようにしてください（私の環境におけるバージョンは上図の通りです）。


# 次回
　内容的には薄いですが、この先は長くなりそうですので次回に譲ろうと思います。
　次回からは実際に簡単なプログラムを作成しながら解説を行っていこうと思います。
[ AndroidTest ] テストクラスからテスト対象クラスのフィールド、メソッドにアクセスする

Androidのテストをする上で、テスト対象となるクラスのフィールドやメソッドにアクセスしたい時があったので、その方法について記す。

##フィールド
フィールドにアクセスするときは以下のようにFieldクラスを使う。
テスト対象クラスがPersonActivity、テストクラスがPersonActivityTestとしている。

PersonActivity.java

~~~java
public class PersonActivity{
    private weight = 150;

    private cry(int index){}
}
~~~

PersonActivityTest.java

~~~java
public class PersonActivityTest{
    //1. インスタンス生成(4の段階で使う)
    PersonActivity personActivity = activityTestRule.launchActivity(null);

    //2. Field型の変数を定義し、getDeclaredField()の引数にアクセスしたいフィールド名を指定する
    Field fieldWeight = PersonActivity.class.getDeclaredField("weight");
    
    //3. アクセスしたいフィールドがprivateの時は、これをtrueにすることでアクセス可能になる
    fieldWeight.setAccessible(true);

    //4. アクセスしたいフィールドの値をテスト用に変更したいとき行う。
    //体重を150から49に変える
    fieldWeight.set(personActivity, 49);

    //5. Field型変数から値を取り出す、これをキャストするなりしてassertをつかってテストする
    fieldWeight.get(personActivity);
}
~~~

##メソッド
メソッドにアクセスする場合はMethodクラスを使う。
PersonActivityTest.java

~~~java
public class PersonActivityTest{
    //1. インスタンス生成
    PersonActivity personActivity = activityTestRule.launchActivity(null);

    //2. Method型の変数を定義し、getDeclaredMethod()の引数にアクセスしたいメソッド名とメソッドの引数の型を指定する
    Method methodCry = PersonActivity.class.getDeclaredMethod("cry", int.class);
    
    //3. アクセスしたいメソッドがprivateの時は、これをtrueにすることでアクセス可能になる
    methodCry.setAccessible(true);

    //4. Method型変数からinvoke()を使ってメソッドを実行する、これをキャストするなりしてassertをつかってテストする
    //第一引数にメソッドを持つクラスのインスタンス、第二引数にそのメソッドの引数を渡す減る
    methodCry.invoke(personActivity, 2);
}
~~~


##参考URL
https://qiita.com/stkdev/items/622e389e9387b75f99ad
自作キーボードのすすめ

この記事は[Playground Advent Calendar 2019](https://qiita.com/advent-calendar/2019/playground)の12/24の記事です。(気が早くて23日に投稿してしまった...w)
こんにちは。にっし〜です。
ここでは、自分にとって今年一番印象的な買い物になった自作キーボードについて書きます。
自分が購入したのはあくまで自作キットですので、キーボード基盤の設計みたいなコアな話には触れません。
自作キーボードをこれから始めてみようという人向けの入門記事になれれば幸いです。(遊舎工房最高しか言わない記事になってたらすみません...w)
## きっかけ
きっかけは単純なもので、**分割型キーボードへの憧れ** でした。
それまでmacbook airの備え付けのキーボードばかり触っていた自分にとって、手の形にfitしたあの厨二病心をくすぐるフォルムに完全に魅了されました。
ただ、自分は電子工作について特に素養があるわけでもなく(半田付けが人並み程度には何となく出来るくらい)、"作りたい"という気持ちの反面、"難しいんじゃね...?失敗したらどうしよう..."というハードルもありました。
そんな中、紹介していただいたのがこちらのお店、**遊舎工房** です。
![](https://yushakobo.jp/wp-content/uploads/2018/05/2e54f543e24dc22c6fe76c2ccdc1b285.png)
https://yushakobo.jp/#about

秋葉原から歩いて少しのところに実店舗があり、親切な店員さんが対応してくれます！
ここからは実際に自分が作ったものを含む入門にピッタリの自作キーボードキットについて紹介していきます。

## おすすめ３つ
1. ErgoDash mini(https://yushakobo.jp/shop/ergodash-mini/)

![ErgoDash mini](https://yushakobo.jp/wp-content/uploads/2019/02/155e315b-1b2a-4618-a9c3-d459cbb83053_base_resized-100x100.jpg)
自分が購入し、実際に組み立て、使用しているものです。
半田付けする箇所が割と多く、また小さめのモデル(4x7)なので半田する箇所同士の距離も近いので入門用としては難易度高めかもしれません。
自分のようにご家庭に半田ごてが常備されていて時間的リソースにも余裕がある方は挑戦してみてください。
　
2. ErgoDash(https://yushakobo.jp/shop/ergodash/)

![ErgoDash](https://yushakobo.jp/wp-content/uploads/2019/02/4f25af9c-da88-40b7-aebc-5663cb36cff6_base_resized-100x100.jpg)
上で紹介したErgoDash miniの大きいバージョンです。miniが4x7だったのに対して5x7と一列増えています。
1列増えることにより、一回り大きくなる反面、いわゆる数字キーが出来るのでレイヤー分けしなくて良いというメリットがあります。
大きい分半田付けもしやすく、初心者でも作りやすいはず
　
3. HelixPico(https://yushakobo.jp/shop/helixpico/)

![HelixPico](https://yushakobo.jp/wp-content/uploads/2018/07/HelixPico_keikou-100x100.jpg)
店員さんが「初心者ならこれが一番作りやすいよ！！」とオススメしてくれたやつです。(結局僕はminiの方を書いましたが。。。)
薄くて持ち運びしやすい&半田付けする箇所が少ないので作りやすいのが売りらしいです。
お値段も一番手頃ですね。
ちなみに自分がこれを選ばなかった理由はキースイッチやバネ、キーキャップ(普段推してる部分の部品のことです)にこだわりたかったからです。

## まとめ
自作キーボードを始めるにあたっての僕のお気持ちと、取っ掛かりにおすすめな3つの自作キーボードキットを紹介しました。
クリスマスプレゼントにおすすめですね。
みんな遊舎工房にこぞれ！！

### 追記
遊舎工房では半田ごてを貸してくれるサービスも行なっているほか、半田付け難しいところは店員さんが助けてくれるらしい？？です。ほんま神ですね！

利用料金：2時間 500円
最大料金：平日1,000円、土日祝1,500円まで

明日はまた自分が書きます。ポエムになるかどうかは明日の自分次第です。。。
pointer-events: none; を使うとマウスの当たり判定をなくせて便利だったという話

# こういうセレクトボックスを作りたかった

▼の部分はCSSで作った装飾です。標準の`<select>`タグをスタイリングしたものの上に置いてる感じ。

```
┌───────┐
│　　　▼ │
└───────┘
```

## 当たり判定

ただ、標準のセレクトボックスのUIの上にCSSで装飾した▼を乗せると、その部分をクリックしてもセレクトボックスの当たり判定がなくなってしまうという問題に直面した。。。

## 解決法

pointer-events: none;を上に置いた装飾に当てれば問題なくセレクトボックスとして使える！ :muscle:

[pointer-events - CSS: カスケーディングスタイルシート | MDN](https://developer.mozilla.org/ja/docs/Web/CSS/pointer-events)

## 余談

これを覚えておけばz-indexが上のDOMを置いて、当たり判定をなくすということもできるので結構便利な気がします。

プロパティの値はauto と none以外はSVG専用みたいですね。。。こっちはちょっとよくわかんないですけどとりあえずnone覚えておくと便利な気がします。。。。（２回目）

## ちなみに

appearance: noneで標準UIの▼みたいなやつを消せます。これもセットで使えば標準selectのスタイリングができていい感じです。

[appearance (-moz-appearance, -webkit-appearance) - CSS: カスケーディングスタイルシート | MDN](https://developer.mozilla.org/ja/docs/Web/CSS/appearance)
Google検索結果の「もっと見る」をiOSショートカットでページ表示にする

#iOSのショートカットを使ってGoogle検索結果をカスタマイズする
　（記載している内容は2019年12月23日現在／iOS13.3において確認）
　iPhoneのSafariでGoogle検索を行うと、2ページ目以降の検索結果を表示する際にページを切り替えるのではなく、「もっと見る」をクリックするとページ内で読み込んで無限スクロールするようになっている。
　これはFirefox(iOS版)でも同様の動作となるが、Google Chrome(iOS版)では「もっと見る」ではなく「次へ」でページを切り替えるようになっている。

　どちらが良いかは一長一短あるが、

 - 検索結果を表示した後にブラバすると高い確率でページ先頭に戻ってしまう
 - ブラバすると再読み込みが走り、場合によっては真っ白な画面で固まる
 - 『問題が起きたため、このWebページが再読み込みされました。』というメッセージが出る（そして再読み込みは失敗する…）

などの現象が発生することから、SafariでもChromeと同じように「次へ」でページを切り替えるようにしたい。
#やること
 - Safariで表示しているGoogleの検索結果のURLをコピーする
 - コピーしたURLに「&start=10」を追加する
    - Googleの検索結果のカスタマイズのうち、パラメータとして　&start=[検索項目数]　を設定すると、検索項目の何項目から表示するかを設定できる。1ページあたり10項目のようで、2ページ目から表示したい場合は10を設定すれば良い。
    - ショートカットのレシピ上の処理としては、追加ではなく置き換えとした。（もっともらしく見える「テキストを結合」というアクションがあるが、使い方がよくわからなかった・・・）
 - 追加済みのURLでページを再表示
 - 一連の動作をiOSのショートカットに登録して呼び出す

#実際のレシピ
 - 新規ショートカットを作成する
 - 「＋アクションを追加」で以下のアクションの追加と設定を行う
    - 「Safari Webページの詳細を取得」を追加し、『ページのURL』をSafariのWebページから取得というアクションに設定する
    - 「URLを展開」アクションを追加する
    - 「入力からテキストを取得」アクションを追加する
    - 「テキストを置き換え」アクションを追加し、テキストの『client=safari』を『client=safari&start=10』に置き換えというアクションに設定する
    - 「URLを開く」アクションを追加する
 - 適当な名前、例えば『Google検索2ページ目』とし、レシピを保存する
 - 保存したレシピのプロパティ（…）から、「共有シートに表示」をオンにする

<img width="414" alt="IMG_7124.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555718/00264817-1854-950f-7b86-f40c1a2ea748.png">

#使い方
- Safariで普通にGoogle検索をする
- Safariの共有ボタン（下部メニュー中央）から『Google検索2ページ目』を選択する
- 2ページ目以降が「次へ」でページ遷移したときと同じ状態で見れる
![kekka_m.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555718/2068dd03-f8f8-1931-5e2f-be343504695b.png)
※「共有シートに表示」をオンにしただけでは、リストの下の方に表示されるので、画像の例ではリストの一番下にある「アクションを編集…」から『よく使う項目』に作成したレシピを指定しています。

#他の使い方
- 今回の用途とは関係ないが、例えば『tbs=li:1』を追加するレシピに変更すれば、検索ツールから「すべての結果」→「完全一致」に変更するアクションにすることも出来る。
SES SE SIER の交渉・調整能力のケーススタディを考えてみる。

前回、お客さんと現場上司の板挟みになったので、こうなったらどうするのケーススタディを考えてみた。


①上司にwbsで１週間で設計書を書くように強要されたら。

「僕には設計書を正と確認して判断する能力がないのであと１週間執筆の間はしきるのは
フィードバック頂きたいのですがよろしいでしょうか？」



②スクリプト製造期間中にお客さんの毎日の打ち合わせで時間を取られる上に追加注文要求される。

↓

「どれくらい時間かかるか判断できないので
スケジュール調整させてください！」
などと言って遅れを匂わせ数分後→

「割り込み作業として納期遅れさせてください。工数２日伸びます！」

と言って納期を確保しつつ、上司に
「このままでは納期内に製造完了しないので
　相談のお時間いただけないでしょうか？」
と言ってこちらの状況を暴露する。
3Dマークアップ言語でWebサービス的なやつを作ってみる

# 目的

前回までの、3Dマークアップ言語を動的に出力するWebシステムを作る。

# 道具立て

比較的慣れてるので、PythonでFlaskを使ってサクッと作ってみる。

# 時計を作る

データベースとかアクセスしたりAPI使うのも大がかりなので、PoCとして最低限として、アクセス時刻の表示をする時計を作ってみる。
以下、時分秒に対応する球を表示するプログラム。時刻の経過に合わせて動くわけではない。

```app.py
from flask import Flask
import datetime
import math

app = Flask(__name__)

@app.route('/')
def clock():
    dt_now = datetime.datetime.now()

    hour = dt_now.hour % 12
    minute = dt_now.minute
    sec = dt_now.second

    yh = 0.2 * math.cos(hour * 2 * 3.141592 / 12)
    xh = 0.2 * math.sin(hour * 2 * 3.141592 / 12)
    ym = 0.4 * math.cos(minute * 2 * 3.141592 / 60)
    xm = 0.4 * math.sin(minute * 2 * 3.141592 / 60)
    ys = 0.35 * math.cos(sec * 2 * 3.141592 / 60)
    xs = 0.35 * math.sin(sec * 2 * 3.141592 / 60)

    homl = '''<homl><head><title>CLOCK</title></head>
<body><a-scene wx=0.2 wy=0.2 wz=0.2>
<a-sphere r=0.05 x=0 y=0 z=0 color=white />
<a-sphere r=0.05 x={xh} y={yh} z=0 color=red />
<a-sphere r=0.03 x={xm} y={ym} z=0 color=green />
<a-sphere r=0.01 x={xs} y={ys} z=0 color=blue />
</a-scene></body></homl>
'''.format(xh=xh,yh=yh,xm=xm,ym=ym,xs=xs,ys=ys)

    return homl

if __name__ == '__main__':
    app.run()
```

# 結果

![20191223_homl_clock.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30257/607a6726-0f67-9c5d-a07a-b78a6aab4626.png)

それっぽくなった。
これで、インターネットの世界とXRの世界が簡単につながるようになった。
[python]DataFrameを用いて任意の変数や配列をまとめてラベル付してcsvに保存[pandas]再UP

変数をまとめてラクに保存したいなーって思ったのでそういうプログラムを作りました。
2次元配列も応用すれば保存できます。

[[python]DataFrameを用いて任意の変数や配列をまとめてラベル付してcsvに保存[pandas]](https://qiita.com/drafts/526ef6f01262d55ad959/edit)でやってたんですけど
テストプログラムでなく本番でプログラムの中に組み込んだら
名前が全部`"data"`で保存されてしまうバグが発生していたのでその対処法を書きます。
原因は不明ですが細かい症状は [こちら](# バグの内容解析)にまとめておきました。

上記だと
forの部分でデータを`for data in datas:` としてしまったため
名前が全部`"data"`で保存されてしまったよう。
なので`datas[i]`の形で指定してあげればOK
なぜテストコードだと出来て、本番では出来ていないのかは謎です。関数のなかだから？？

大した書き換えじゃないのでソースコードだけ置いておきます

```python

import pandas as pd

# --- テスト用に変数を定義 ---
a ,b,c,d = 1,2,3,4
xx = [3,6,8]
yy = [5,8,2]
zz = [8,2,8]

# --- 変数をまとめてdataframeにしてcsv保存 ---
def getName(obj):
    return  [k for k, v in globals().items() if id(obj) == id(v)][0] # 変数名をstrでreturn

df = pd.DataFrame()

datas = [xx,yy,zz] # 変数名をヘッダーにしながら、1次元配列をまとめてdataframe化
for i in range(len(datas)):
    df = pd.concat([df, pd.DataFrame({getName(datas[i]):datas[i]})],axis=1) # {}集合を使ってdataframeをconcatで追加

datas = [a,b,c,d]# 変数名をヘッダーにしながら、変数をまとめてdataframe化
for i in range(len(datas)):
    df =  pd.concat([df, pd.DataFrame({getName(datas[i]):[datas[i]]})],axis=1)# {}集合を使ってdataframeをconcatで追加
df.to_csv('test.csv')
print(df)
del df
```

output

```
   xx  yy  zz    a    b    c    d
0   3   5   8  1.0  2.0  3.0  4.0
1   6   8   2  NaN  NaN  NaN  NaN
2   8   2   8  NaN  NaN  NaN  NaN
```


# バグの内容解析

元のプログラムを回したあと、変数名を変えてから再度回すと何故か上記エラーが発生した。

```python
import pandas as pd

# --- テスト用に変数を定義 ---
a ,b,c,d = 1,2,3,4
xx = [3,6,8]
yy = [5,8,2]
zz = [8,2,8]

# --- 変数をまとめてdataframeにしてcsv保存 ---
def getName(obj):
    return  [k for k, v in globals().items() if id(obj) == id(v)][0] # 変数名をstrでreturn

df = pd.DataFrame()

datas1 = [xx,yy,zz] # 変数名をヘッダーにしながら、1次元配列をまとめてdataframe化
for data in datas1:
    df = pd.concat([df, pd.DataFrame({getName(data):data})],axis=1) # {}集合を使ってdataframeをconcatで追加
    
datas2 = [a,b,c,d]# 変数名をヘッダーにしながら、変数をまとめてdataframe化
for data in datas2:
    df =  pd.concat([df, pd.DataFrame({getName(data):[data]})],axis=1)# {}集合を使ってdataframeをconcatで追加
df.to_csv('test.csv')
print(df)
del df
```
output


```python
   xx  yy  zz    a    b    c    d
0   3   5   8  1.0  2.0  3.0  4.0
1   6   8   2  NaN  NaN  NaN  NaN
2   8   2   8  NaN  NaN  NaN  NaN
```
このように1度目は成功するのですが
この状態のまま再度変数名を変えて回すと

```python
import pandas as pd

# --- テスト用に変数を定義 ---
a ,b,c,d = 1,2,3,4
xxx= [3,6,8] ###これを変更
yyy= [5,8,2] ###これを変更
zz= [8,2,8]

# --- 変数をまとめてdataframeにしてcsv保存 ---
def getName(obj):
    return  [k for k, v in globals().items() if id(obj) == id(v)][0] # 変数名をstrでreturn

df = pd.DataFrame()
###ここを変更
datas1 = [xxx,yyy,zz] # 変数名をヘッダーにしながら、1次元配列をまとめてdataframe化
for data in datas1:
    df = pd.concat([df, pd.DataFrame({getName(data):data})],axis=1) # {}集合を使ってdataframeをconcatで追加

datas2 = [a,b,c,d]# 変数名をヘッダーにしながら、変数をまとめてdataframe化
for data in datas2:
    df =  pd.concat([df, pd.DataFrame({getName(data):[data]})],axis=1)# {}集合を使ってdataframeをconcatで追加
df.to_csv('test.csv')
print(df)
del df
```

output



```python
   data  data  zz    a    b    c    d
0     3     5   8  1.0  2.0  3.0  4.0
1     6     8   2  NaN  NaN  NaN  NaN
2     8     2   8  NaN  NaN  NaN  NaN
```
このように名前がdataになってしまいます
SOURCE TREE を使っていたら知らないうちに .gitignore されていた

SOURCE TREE を使っていたら、対象ファイルが知らないうちに .gitignore されていてコミットできなくなってmした。
SOURCE TREE のアプリ上では解除できなかったので、 git check-ignore コマンドを使って .gitignore ファイルを特定しました。

# 実行コマンド

```
$ git check-ignore -v ファイルパス/sample.php
/Users/ユーザー名/.gitignore_global:16:sample.php	ファイルパス/sample.php
```

コマンド実行して、どの .gitignore で除外されているのかが特定できました。
プロジェクトの .gitignore ではなく .gitignore_global で除外されていたとは。。。
対象行を削除して無事コミットできました。
SQL視点で辿るHadoopのだいたいの歴史

# はじめに
## Hadoopとは
Aapche Hadoop(以降、Hadoop)とは、多種/大量なデータを蓄積し、高速に分散処理するための基盤となるOSSのミドルウェアです。Hadoopの周辺では、Hadoopをより高度に利用するための関連OSSが登場してきており、これらをうまく組み合わせて活用することでデータの収集から蓄積、分析、結果の可視化までをカバーすることができます。

## エコシステム
Hadoopの周辺で関連OSS群が結びつき、補いながら共存している様子はHadoopエコシステムとも呼ばれています。ただ新しいOSSは次々にリリースされることもあり、エコシステムは肥大化しています。経験がまだ高くない人が見ると、いったい何と何を組み合わせればよいのか、エコシステムに含まれるOSSはどのような役割をもっているものなのか分かりにくくなっています。

そこでこの記事では、Hdoopエコシステムが大きくなるまでの、だいたいの成長過程をSQL on Hadoopの視点で順に追ってみます。

# Hadoopの歴史
## Hadoop登場当初
ストレージサービスとして分散ファイルシステムのHDFS、並列分散処理フレームワークとしてのMapReduceを合わせてHadoopと呼んでいました。このフレームワークを活用して、ユーザ(アプリ開発者)は並列分散アプリケーションを開発します。
![fig1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328461/19ebc8bf-8e23-7da2-d2ad-b57b23d21528.png)

ただユーザはMapReduceのAPIを理解し駆使しなければならず、敷居や難易度が高いものでした。

## SQLクエリエンジンHive登場
アプリ開発者の多くはSQLを使い慣れていることもあり、データ処理をするのであればSQL(風の言語)を使いたいというニーズが生まれます。そしてHiveが登場します。HiveはHiveQLというSQLベースの言語を提供するので、SQLになれたユーザは処理ロジックの開発に注力できるようになりました。
![fig2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328461/e42800fb-3ec7-f1c9-1f88-0e105a7e9c40.png)

ここまでで分かる通り、Hadoopはファイルシステム(HDFS)にデータを蓄積して処理するものです。SQL(風の言語)でデータ処理できますが、リレーショナルデータベース(RDB)とは異なり、あくまでファイルシステムを操作している点に注意が必要です。つまりACIDトランザクションはサポートされませんし、テナントに相当する機能もないのでファイルシステムのパーミッションで考えることが原則です。(一部の操作にACIDをサポートしたり、認証サービスを提供するOSSも最近ではリリースされてはいます。)

## リソーススケジューラYARNが独立
Hadoopが2系へメジャーアップグレードして大きく変わったことがあります。それはMapReduceからリソーススケジューラ機能がYARNというOSSとして切り出されて独立したことです。YARNが登場したことで、同一クラスタ上で複数のフレームワークを用途によって使い分けるということが可能になりました。
![fig3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328461/332a9176-4a50-3d1d-53d1-17f5697d258d.png)

## 用途の変化とOSSの多様化
Hadoopはサーバやディスクを並列に使うことでスループットを高め、大量データを効率的にバッチ処理することが主でした。これは蓄積したデータの使い道がレポーティングだったためです。それが徐々にデータサイエンティスト等によるインタラクティブな分析にも貯めたデータを使いたいというニーズが生まれ、スループット重視ではなくレイテンシを重視したOSSが必要だということになりました。

そこで低レイテンシなクエリエンジンImpalaや、DAGによる効率的な処理を実現するフレームワークTez、表形式のデータを高頻度で格納・参照することに特化したストレージサービスKuduなどが登場しました。
![fig4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328461/f644d42e-1b07-6851-0163-f63c2d60710d.png)

このようにして、SQLの視点ではありましたが、Hadoopのエコシステムは成長してきました。

# おわりに
本記事ではHadoopの歴史をSQLの視点でおおまかに辿ってみました。Hadoopエコシステムの理解促進の一助となれば幸いです。
LPTポートをVirtualBoxで使用する方法

## 概要

VirtualBoxの現在のバージョン（v6.1.0）には、
VirtualMachineのLPT設定を構成するためのGUIサポートがありません。
代わりにCUIでVBoxManageコマンドを使用する必要があります。

慣れてきたら、VagrantとかDockerとかを使うので、
CUIがメインになってくると思います。
あくまでコンテナ技術中級者向けの記事です。

## 一般的なWindowsユーザーのための説明

VBoxManageコマンドを使用する前の下準備を説明します。
はじめにコマンドプロンプトを開き、

```
cd "c:\Program Files\Oracle\VirtualBox"
```
と入力してVBoxManageフォルダに移動します。
※パス文字列の周りにスペースが含まれているため、二重引用符に注意してください。
この後に、これ以降で説明するコマンドを入力できます。
コマンドを入力した後には`Enter`を押しましょう。

## コマンド構文

※<>括弧内のフィールドはプレースホルダーであり、括弧はリテラルではありません。

```
オンにする場合↓
VBoxManage modifyvm <VMname> --lptmode1 <host LPT device name>
VBoxManage modifyvm <VMname> --lpt1 0x378 7
```

`--lptmode1`を先に実行して、バーチャルマシン`<VMname>`のlpt1ではホストの`<host LPT device name>`を使用することを指定します。
そのあと`--lpt1`を実行してゲスト側で認識されるときのIOベースアドレスとIRQ番号を指定します。

### リファレンスに載っている基本構文

```
VBoxManage modifyvm [--lptmode<1-N> <host LPT device name>]
VBoxManage modifyvm [--lpt<1-N> off|<I/O base> <IRQ>]
```
>--lptmode<1-N> <Device>: Specifies the Device Name of the parallel port that the Parallel Port feature will be using. Use this before --lpt. This feature depends on the host operating system. For Windows hosts, use a device name such as lpt1. On Linux hosts, use a device name such as /dev/lp0.

>--lpt<1-N> <I/O base> <IRQ>: Specifies the I/O address of the parallel port and the IRQ number that the Parallel Port feature will be using. Optional. Use this after --lptmod. I/O base address and IRQ are the values that guest sees. For example, the values avalable under guest Device Manager.

`<I/O base>`と`<IRQ>`は、ゲスト側で表示されてほしい値を入力するようです。勘違いしやすいので要チェックです。

IRQ number とはWindowsでいうとデバイスマネージャーの表示をリソース種別に変更すると見やすいようです。
I/O base address についても同様です。
[割り込み要求（IRQ）の割り当て状況を一覧表示させるには（Windows 2000編）](https://www.atmarkit.co.jp/fpc/pctips/023viewallirqalloc2k/viewallirqalloc2k.html)
ポートの設定で「割り込みを全く使用しない」がデフォルトでオンになっているけれど、関係あるのかよくわかりません。

### Windowsホストの例

※ホストが使用するポートが "LPT4"の場合です。

```
VBoxManage modifyvm "My VM Name" --lptmode1 "LPT4"
VBoxManage modifyvm "My VM Name" --lpt1 0x378 7
```

### Linuxホストの例

※上記と同等でホストが使用するポートが "LPT4"の場合です。

```
VBoxManage modifyvm "My VM Name" --lptmode1 "/dev/parport3"
VBoxManage modifyvm "My VM Name" --lpt1 0x378 7
```

### 元に戻す

`
VBoxManage modifyvm --lpt1 off
`



### 実例

私が実機で試したときのコマンド実例です。

```
VBoxManage modifyvm "Win7(32bit)" --lptmode1 "LPT1"
VBoxManage modifyvm "Win7(32bit)" --lpt1 0x378 7
```

## 注意

コマンド実行時にはVirtualMachineはシャットダウンしている必要があります。
コマンドが正常終了した時にメッセージは帰ってきません。

## 情報元

[パラレル（LPTx）ポートの有効化と構成 | VirtualBoxのエンドユーザーフォーラム](https://forums.virtualbox.org/viewtopic.php?f=35&t=54187)

**Excelsior!**
DeepSpeech(ASR. 音声認識)で日本語を学習させたいメモ

現状成果物はありません.

## 背景

日本語の ASR(Automated Speech Recognition. 音声認識)やりたい(モデルがほしい).

自動スピーチ認識(ASR, automated speech recognition)ライブラリのメモ(2019 年 9 月 25 日時点)
https://qiita.com/syoyo/items/dc8ef3590c76cf3045b7

Mozilla deepspeech で speech-to-text する(English). アン・ハサウェイさんのスピーチの文字起こしにもチャレンジ
https://qiita.com/syoyo/items/9e5898344403b896bf04


英語はあるが, 日本語は自前で学習しないとダメっぽい.

DeepSpeech + JSUT データセットで試してみます.


## JSUT

JSUT (Japanese speech corpus of Saruwatari-lab., University of Tokyo)
https://sites.google.com/site/shinnosuketakamichi/publication/jsut

ありがとうございます.

日本語 End-to-end 音声合成に使えるコーパス JSUT の前処理 [arXiv:1711.00354]
https://r9y9.github.io/blog/2017/11/12/jsut_ver1/

参考になります.

## DeepSpeech

https://github.com/JeanMaximilienCadic/DeepSpeech.PyTorch

JSUT は, 漢字の台本(transcript)と .wav だけなので, DeepSpeech で学習させるために前処理が必要になります.

### KenKM

Hiragana based speech recognition for Japanese with DeepSpeech https://medium.com/sotuu/hiragana-based-speech-recognition-for-japanese-with-deepspeech-220d14047d51

MozillaのDeepSpeechで日本語音声認識エンジンを作る　〜ひらがなわかち書きで言語モデル〜
https://kouohhashi.qrunch.io/entries/TxTHZmOjX1HZgHCW

にあるように, KenLM を使って言語モデルを構築することになります.

https://github.com/kpu/kenlm

## TODO

* [ ] KenLM で言語モデルを作る.
* [ ] GiNZA あたりで文章を分解してみる.
* [ ] BERT/XLNET で言語モデル作るのができるか試す.


## References

* Hiragana based speech recognition for Japanese with DeepSpeech https://medium.com/sotuu/hiragana-based-speech-recognition-for-japanese-with-deepspeech-220d14047d51
* Simple PPDB: Japanese https://anlp.jp/proceedings/annual_meeting/2017/pdf_dir/P8-5.pdf
AV1のエンコーダ librav1e の2019年12月の状態

AV1のエンコーダ　`librav1e` について調べたのでメモを残す。



<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">AV1のエンコーダのrav1e はどうなっているかなと見たら、つい数日前に v0.2.0 がリリースされていた。<a href="https://t.co/3V6JTQ2cng">https://t.co/3V6JTQ2cng</a></p>&mdash; koba (@tetsu_koba) <a href="https://twitter.com/tetsu_koba/status/1208992668400807937?ref_src=twsrc%5Etfw">December 23, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ffmpeg のmaster リポジトリでは --enable-librav1e のパッチがマージされていた。<a href="https://t.co/2xJERZxG1t">https://t.co/2xJERZxG1t</a></p>&mdash; koba (@tetsu_koba) <a href="https://twitter.com/tetsu_koba/status/1208993149445558273?ref_src=twsrc%5Etfw">December 23, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ffmpegで librav1e を試す方法がここに書いてある。<a href="https://t.co/rncYXcnCh7">https://t.co/rncYXcnCh7</a></p>&mdash; koba (@tetsu_koba) <a href="https://twitter.com/tetsu_koba/status/1208993554372018177?ref_src=twsrc%5Etfw">December 23, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


ffmpegのgitリポジトリのmasterブランチで `rav1e` を検索

```
$ git grep rav1e origin/master
origin/master:Changelog:- AV1 encoding support via librav1e
origin/master:configure:  --enable-librav1e        enable AV1 encoding via rav1e [no]
origin/master:configure:    librav1e
origin/master:configure:librav1e_encoder_deps="librav1e"
origin/master:configure:librav1e_encoder_select="extract_extradata_bsf"
origin/master:configure:enabled librav1e          && require_pkg_config librav1e "rav1e >= 0.1.0" rav1e.h rav1e_context_new
origin/master:doc/encoders.texi:@section librav1e
origin/master:doc/encoders.texi:rav1e AV1 encoder wrapper.
origin/master:doc/encoders.texi:Requires the presence of the rav1e headers and library during configuration.
origin/master:doc/encoders.texi:You need to explicitly configure the build with @code{--enable-librav1e}.
origin/master:doc/encoders.texi:@item rav1e-params
origin/master:doc/encoders.texi:Set rav1e options using a list of @var{key}=@var{value} pairs separated
origin/master:doc/encoders.texi:by ":". See @command{rav1e --help} for a list of options.
origin/master:doc/encoders.texi:For example to specify librav1e encoding options with @option{-rav1e-params}:
origin/master:doc/encoders.texi:ffmpeg -i input -c:v librav1e -b:v 500K -rav1e-params speed=5:low_latency=true output.mp4
```

Rav1e Achieves Another ~20% Speed-Up For Rust-Based AV1 Video Encoding
https://www.phoronix.com/scan.php?page=news_item&px=Rav1e-20-Percent-Faster

## おまけ
Intel のAV1エンコーダ SVT-AV1 をffmpegで使えるようにするパッチ。
https://github.com/OpenVisualCloud/SVT-AV1/tree/master/ffmpeg_plugin

## 関連
[新しいビデオコーデックのAV1を使って無理やり HLSでストリーミングしてみた](https://qiita.com/tetsu_koba/items/44a2c4026c4cee8ab8f6)
ECS on Fargateでバッチを動かす

Fargateでバッチを動かすときにググってもちょうどいい事例が見つからず少し試行錯誤して動くようになったので、これからやる人が私と同じ思いをしなくて済むようにここに記しておく。
EKS on Fargateがre:inventで発表されて使えるようになったので念のためタイトルをECS on Fargateにしています。
まず最初に結論から。

# 結論
Fargateでバッチを動かすときの肝は登録数（Desired Count）を0にすること
![fargate.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39597/a99cef48-af59-665b-02d6-77191278e6cb.png)

# 構成
ざっくりですが構成
![fargate batch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39597/c0ee189d-251e-aeb3-c158-c8490d89ed6a.png)

1. GitHub ActionsでS3にコードを移して
2. ファイルの更新をトリガーにCodeBuildでコンテナのビルド
3. CodeDeployでECSサービスの更新
4. ECSのタスクスケジューリング（CloudWatch Events）でバッチ実行

CodePipelineでやってることを全部GitHub Actionsでやることも可能なんですが、どっちでやるのがいいんですかね

GitHub ActionsやGolangのChannelについても詳しく書きたかったんですが、ネットの海に広がっているので割愛

# 本題のFargateでバッチを動かす
## 概要
1. サービス作成時に登録数（Desired Count）を0にする
2. タスクスケジューリングでCloudWatch Eventsのルールとターゲットを設定して、ECSタスクを実行する

## サービス作成時に登録数（Desired Count）を0にする
サービス作成時にタスクの数を1以上にしてしまうとバッチが延々と実行されてしまうので0に設定します
![Desired Count.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39597/2a94fd33-09e4-b47b-55a1-1378fb70e0db.png)

## タスクスケジューリングを設定する
こちらもネットの海に広がっているので詳細は割愛しますが、CloudWatch Eventsのルールとターゲットを設定すると、ECSタスクが実行されるようになります
![タスクスケジューリング.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39597/6566bfc5-17ba-360a-1bc5-b54312f35508.png)

# まとめ
コンテナは本当に楽ですね
EC2管理しなくていいだけで本当にありがたい
アプリケーション実行環境は各クラウド早く標準化対応してもらってデータストアなんかのサービスでクラウドを選ぶ時代が来て欲しいですね

## AWSでバッチを作るなら
他にもLambda, AWS Batchと選択肢がありますが、比較記事を弊社の先輩が書いてくれているのでよろしければ参照ください
現状ではFargateが多くの状況に適していると思います
FargateなかったときにAWS Batch使ったことありますが大変でした

AWSでサーバレスな定期バッチ環境を作るには結局どれ使えばいいの？（Lambda vs Fargate vs Batch）
https://qiita.com/kazuktym/items/0ecc1dbf98c3c3623473

それではみなさん良いクリスマスと良いお年を！
たった一行！！Vue CLIでconsole.logを有効化する方法

#はじめに
Vue CLI（ESLint）のデフォルト設定では、`console.log`がエラーを吐く仕様になっています。
でも簡単なデバッグなどでは手軽に使えたら嬉しいですよね。
そこで、Vue CLIで`console.log`を有効にする方法をメモしておきます。
非常に簡単なので、お困りの方がいらしたらぜひお試しください。

##環境
Vue CLIバージョン：3.9.3

##1. 永続的に有効化したい場合
**■変更対象ファイル（src/package.json）**
・`eslintConfig`内の`rules`に`"no-console": 0`を設定

```package.json
"eslintConfig": {
    "root": true,
    "env": {
      "node": true
    },
    "extends": [
      "plugin:vue/essential",
      "eslint:recommended"
    ],
    "rules": {
      "no-console": 0
    },
    "parserOptions": {
      "parser": "babel-eslint"
    }
  }
```

####**★ポイント**
修正が完了したら、**一度サーバーを立ち上げなおさないと変更が反映されない**ので注意してください！
`ctrl(command) + c` → `npm run serve`



##2. 一時的に有効化したい場合
**console.logを使いたいファイルに、以下のコメントを追加**

```
/* eslint-disable no-console */
```
.jsファイルであればファイルの一番上に、
.vueファイルであればscriptタグ内の一番上に記述すれば有効化されます！



##参考
[Vue.js で console.log はできないのか？](https://qiita.com/key_it6/items/b5eca416461c6ae8b86a)
こちらの記事を参考に、一部記事を加筆修正させていただきました。（2020/2/14）
ありがとうございましたm(__)m！！


以上です！！



ぺーぺーなので、間違いなどあったら優しく教えていただけると泣いて喜びます( ;∀;)
PHP Debug Bar on Slim3

```
composer require maximebf/debugbar
composer require kriswallsmith/assetic
```
``` dependencies.php
 ...
    // PHP Debug Bar
    $container['debugBar'] = function($c) {
        $debugbar = new StandardDebugBar();
        $debugbar->addCollector(new DebugBar\Bridge\MonologCollector($c['logger']));
        $renderer = $debugbar->getJavascriptRenderer();
        $renderer->setIncludeVendors(false);
        return $debugbar;
    };
 ...
```
``` routes.php

use Slim\App;
use Slim\Http\Request;
use Slim\Http\Response;

return function (App $app) {
    $container = $app->getContainer();

    $app->get('/[{name}]', function (Request $request, Response $response, array $args) use ($container) {
        $debugbar = $container["debugBar"];
        $debugbar["messages"]->addMessage("hello world!");

        // Sample log message
        $container->get('logger')->info("Slim-Skeleton '/' route");

        // Render index view
        return $container->get('renderer')->render($response, 'index.phtml', array_merge($args, [
            "debugbarRenderer"=>$debugbar->getJavascriptRenderer()
        ]));
    });
};
```
``` index.phtml
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8"/>
        <title>Slim 3</title>
        <link href='//fonts.googleapis.com/css?family=Lato:300' rel='stylesheet' type='text/css'>
+        <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
        <style>
            body {
                margin: 50px 0 0 0;
                padding: 0;
                width: 100%;
                font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
                text-align: center;
                color: #aaa;
                font-size: 18px;
            }

            h1 {
                color: #719e40;
                letter-spacing: -3px;
                font-family: 'Lato', sans-serif;
                font-size: 100px;
                font-weight: 200;
                margin-bottom: 0;
            }
+            <?php $debugbarRenderer->dumpCssAssets(); ?>

        </style>
+        <script type="text/javascript">
+            <?php $debugbarRenderer->dumpJsAssets(); ?>
+        </script>
    </head>
    <body>
        <h1>Slim</h1>
        <div>a microframework for PHP</div>

        <?php if (isset($name)) : ?>
            <h2>Hello <?= htmlspecialchars($name); ?>!</h2>
        <?php else: ?>
            <p>Try <a href="http://www.slimframework.com">SlimFramework</a></p>
        <?php endif; ?>
+        <?php echo $debugbarRenderer->render() ?>
    </body>
</html>
```
Angular 9.0.0-rc.6 + Scullyを試してみた

Angularの静的サイトジェネレータが出来たので試してみました。

https://twitter.com/Netlify/status/1206630215314743297

公式のREADME読んでそのままやっただけですが、、、
以下参考
https://github.com/scullyio/scully/blob/master/docs/getting-started.md

# 下準備
表題通りにするためにAngular CLIをバージョンアップ。

```bash
$ yarn global add @angular/cli@next
```

# やってみた

まずはプロジェクトを作成します。

```bash
$ ng n learn-scully
```
Angular 9からはIvyがデフォルトで有効になっていますが、今回は関係ないですね。
`routing`を有効にしちゃったけど、静的化するなら意味ない？
とりあえず気にせず進みます。

プロジェクトのディレクトリになんやかんやで入って、
（自分はVSCode開いてターミナルでやりましたが、ぶっちゃけ要らないので`cd`でいいです）

早速`Scully`を入れていきます。

```bash
$ ng add @scullyio/init
```

`package.json`を確認すると、

```json
{
  "name": "learn-scully",
  "version": "0.0.0",
  "scripts": {
    "ng": "ng",
    "start": "ng serve",
    "build": "ng build",
    "test": "ng test",
    "lint": "ng lint",
    "e2e": "ng e2e",
    "scully": "scully",
    "scully:serve": "scully serve"
  },
  "private": true,
  "dependencies": {
    "@angular/animations": "~9.0.0-rc.6",
    "@angular/common": "~9.0.0-rc.6",
    "@angular/compiler": "~9.0.0-rc.6",
    "@angular/core": "~9.0.0-rc.6",
    "@angular/forms": "~9.0.0-rc.6",
    "@angular/platform-browser": "~9.0.0-rc.6",
    "@angular/platform-browser-dynamic": "~9.0.0-rc.6",
    "@angular/router": "~9.0.0-rc.6",
    "@scullyio/init": "0.0.8",
    "@scullyio/ng-lib": "latest",
    "@scullyio/scully": "latest",
    "rxjs": "~6.5.3",
    "tslib": "^1.10.0",
    "zone.js": "~0.10.2"
  },
  "devDependencies": {
    "@angular-devkit/build-angular": "~0.900.0-rc.6",
    "@angular/cli": "~9.0.0-rc.6",
    "@angular/compiler-cli": "~9.0.0-rc.6",
    "@angular/language-service": "~9.0.0-rc.6",
    "@types/node": "^12.11.1",
    "@types/jasmine": "~3.5.0",
    "@types/jasminewd2": "~2.0.3",
    "codelyzer": "^5.1.2",
    "jasmine-core": "~3.5.0",
    "jasmine-spec-reporter": "~4.2.1",
    "karma": "~4.3.0",
    "karma-chrome-launcher": "~3.1.0",
    "karma-coverage-istanbul-reporter": "~2.1.0",
    "karma-jasmine": "~2.0.1",
    "karma-jasmine-html-reporter": "^1.4.2",
    "protractor": "~5.4.2",
    "ts-node": "~8.3.0",
    "tslint": "~5.18.0",
    "typescript": "~3.6.4"
  }
}
```

こんな感じになってるはず。
記事書いてる時だと`9.0.0-rc.6`が最新だったのでこうなってます。

それではbuildしていきましょう。

```bash
$ ng build
$ yarn scully
```
これだけ。簡単。

ローカルサーバ起動は、

```bash
$ yarn scully:serve
```

Scullyの静的なサーバが立ち上がります。
Angularの標準のサーバも立ち上がってる？

# 感想
これでAngularでも流行りのJAMstack的なサイトを作れますね。
ありがとうございました。
python3でtkinter を使って入出力画面の基礎の基礎

## やりたかったこと
pythonを使い始めて、いろいろなことができることがわかってたレベルです。コマンドプロンプトから使ってきましたが、GUIで入出力をするツールもできるんじゃない？と思ってまずは自分向けのサンプルを作りました。
#### なぜシンプルなサンプルを書いたか
「tkinter」「GUI」「テキストボックス」で検索していくつかのサイトがヒットしますが、いきなり電卓が動いていたり、tkinterを初めて使う身としては説明が一部しかなかったり、入力のみ・出力のみだったり、でしたので、基礎の基礎である、入力して表示する部分のみを書きました

まずは動いたので、自分用の備忘録として記録します
<font color="#ff1493">早急に説明を追記</font>する予定です
ここまでできれば、あとはCUIで書いていたものを追加すれば、検索キーを入力して、その結果をGUIで表示することもいつもの手順でできるので、一安心です。
## イメージ
![tkinter-sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45016/0a1aa2f7-8704-028e-ab85-a8d922b4901e.png)

## まずは動いたソース
Enterキーを押すか、ボタンのクリックどちらでも、入力した文字が出力用のラベル（初期値で"OutputData"と表示している部分）に表示されます。
実際に使うときは、funcとcalcどちらかだけになると思います

```Python
import os, tkinter
def func():      # Etnerキー押下時の動作
    getvalue = textBox1.get()
    print("in the function =",getvalue)
    textBox1.delete(0,tkinter.END)
    label2["text"] = getvalue
def calc(event):  # ボタン押下時の動作 
    getvalue = textBox1.get()
    print("in the function =",getvalue)
    textBox1.delete(0,tkinter.END)
    label2["text"] = getvalue
# ウインドウ
root = tkinter.Tk()              # Tkクラス生成
root.title(u"ウインドウタイトル")  # 画面タイトル  
root.geometry("350x150")         # 画面サイズ 

# 入出力エリア
label1 = tkinter.Label(text='InputData')  # 入力用ラベル
label1.place(x=5,y=5)                     # ラベルの表示位置 
textBox1 = tkinter.Entry(width=5)         # 入力用テキストボックス 
textBox1.place(x=100, y=5)                # テキストボックス位置指定
label2 = tkinter.Label(text='OutputData') # 出力用ラベル
label2.place(x=100,y=50)                  # ラベル位置
textBox1.focus_set()                      # テキストボックスにフォーカス指定 
btn = tkinter.Button(text='Go', command=func) # ボタン作成
btn.pack()
textBox1.bind('<Return>', calc)           # Enterキーが押されイベント設定

root.mainloop()                           # 画面を表示
```
Automation Anywhere A2019 Community EditionのBot Migration Toolを試してみた（シンプルなBot編）



#試した環境
Automation Anywhere Community Edition v11
Automation ANywhere A2019 Community Edition
Surface Pro 5 (Model 1796)

#背景
Automation Anywhere Enterprise/Community Editionの次世代バージョン、
A2019はWebブラウザでBotが開発・実行できる、革新的なプラットフォームですが、
従来のバージョンv11からBotを移行するには、専用の移行ツールを使う必要があります。
今回は、その移行ツールがどんな風に使えるのか、まずはとてもシンプルなBotで試してみました。

#手順（概要）
1. Automation Anywhere Enterprise/Community EditionのBotのソースファイル(atmx)を用意する。
2. A2019 Community Editionにログイン。Botを新規作成する。
3. Bot Migrationのコマンドを置き、移行したいatmxファイルを選択する。
4. Botを実行する。
5. Control Room（A2019）に移行されたBotを開いて確認してみる。

#手順（スクショ付き）
#### 1. Automation Anywhere Enterprise/Community EditionのBotのソースファイル(atmx)を用意する。

今回用意したサンプルは、[Cookie Clicker](https://orteil.dashnet.org/cookieclicker/)をひたすらClickする。というBotです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490870/b727f351-ace4-e93c-35c1-dea5eeb3efa8.png)

#### 2. A2019 Community Editionにログイン。Botを新規作成する。

#### 3. Bot Migrationのコマンドを置き、移行したいatmxファイルを選択する。
このアクションコマンドです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490870/fe21cc39-0848-0834-dcdc-20ec143a0560.png)

こんな感じに設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490870/dcc5e047-6b53-6b78-88eb-1c49d36a68ee.png)

#### 4. Botを実行する。
例のキラキラの画面が出たら、完了。

#### 5. Control Room（A2019）に移行されたBotを開いて確認してみる。
無事、A2019へとBotが移行されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490870/904e29d2-f8f8-376e-ab0c-3d58fd361b24.png)

#まとめ
割とシンプルな手順でv11からA2019へBotの移行ができることが確認できました。
また時間があるときに、今度は他の複数のBotを呼び出す仕組みのBotや、さらに複雑なものなどを移行してみたいと思います。
「転職してエンジニアになりたい人」のためのポートフォリオ戦略

[MENTA](https://menta.work/?qiita)というプログラミングのメンターサービスを運営している[入江](https://twitter.com/iritec_jp)ともうします。

MENTAでは「**転職活動のためにポートフォリオをつくりたい**」という相談が多いです。転職を考えている人にとって、そして採用する側にとっても、**ポートフォリオはその人の技術力を見るための有力なツール**です。

そこで今回は採用する側の視点で、なにが大事なんだろう？ということを考えてみました。転職を考えていてポートフォリオをつくっている方の参考になればうれしいです。

# ポートフォリオはなくてもOK

ポートフォリオについて書いてるのに、のっけから何を言ってるんだ、という話なのですが、、、極端に言えば、作品はなくてもOKです。

それより毎日githubに草はやしてるとか、学んだことをQiitaに投稿してるとか、継続して学びを発信できてれば十分「代わり」になります。

そこに書かれてる記事を見れば、どんなことを考えてたのか、調べたのか、そして理解しているのかは一目瞭然です。Qiitaで役立つ投稿をつづけていればスカウトが入るかもしれないです。実際に僕はそうやってiOSアプリ開発者にアプローチして仕事を頼んだことがあります。

大切なのはポートフォリオは「技術力」を見るためのツールだということです。そして、変化が激しい業界なので、今の技術力より、どれだけコツコツ積み重ねてきたか、勉強する人かどうかというのは重視されます。

# 本当に動いているプロダクトを持っていると強い
僕が18年前に制作会社に入ったとき、すでに自分でホームページをつくって運営していました。どんなものにせよ、動いているプロダクトがあり、それを使うユーザーがいるということはビジネスに役立つ経験です。

独白でHTMLを学びました。業務未経験でしたが、ホームページのおかげで採用が決まり、翌日には出社していました。

### 1円でも収益が上がるものをつくってるのはすごい
さらに、そのプロダクトが収益を生み出しているなら有利すぎます。おそらく就職しようとしている会社の社員でも、そんなプロダクトを持ってる人は少ないでしょう。

収益化できているということはビジネスであり、貴重な経験、実績です。単にコードを書くだけでなく、より上位の目線から仕事に携われる人物だと見られるはず。

# チームで使うツールに慣れておく

これは僕も個人開発者だったので痛感しました。1人でやっているとチームのコラボレートツールなんて使わないんですね。でも、これは覚えておかないと苦戦します。

コード以外のところで苦戦しないためにも事前に勉強しておいて、面接の際にはそれらのツールを勉強して基本的なことは学習しています。と言えれば強いです。

具体的にはGitHubでブランチつくる・プッシュする・プルリクする、Dockerで環境構築する、Slackやtrelloなどの使い方を覚えておく。大きなプロダクトだとCircleCIとか使ってるところも多いです。現場に入ってコードは書けるのにそれ以外のところに苦戦して時間を使ってしまうのはつらいですよね。

意外と落とし穴です。現場でまわりの人に聞くのも嫌だと思うので、事前に勉強しておく方がいいです。

# ポートフォリオに数ヶ月もかけないこと

数ヶ月もかけるのはもったいない。見る方もそんなに真剣に見ないので、、、。

説明がむずかしいものより、たとえばTwitterの簡易版をつくるとか。わかりやすいものがいいでしょう。見る方も気楽にみれますし、説明しなくてもどんな機能かわかります。

入ろうとしている会社がつくっているプロダクトのミニチュア版とかつくると、ほぼ確定なんじゃないでしょうか。

# デザインはがんばらない

デザイン経験がないのにがんばっちゃうと、逆にダサくなります・・・
そしてデザインできないなら時間をかけるのは無駄です。

Bootstrapなど定番のデザインを兼ね備えたHTML・CSSライブラリはたくさんあるので、これらを使ってしまいましょう。アイコンはFont Awesomeが便利です。

あと、がんばってプロフィールしかのってないようなものを作る人もいるんですが、これはあまり意味がありません。エンジニアとして採用されたいなら、動的なものをつくりましょう。

# すでに働いている先輩エンジニアに相談してみる

すでに現場で働いている人がどうやって入ったのか、相談するのもいいでしょう。事前にこういうところをPRしたほうがいいよ、などアドバイスをもらっておくといいんじゃないでしょうか。手前味噌ですが、[MENTA](https://menta.work/?qiita)にも先輩メンターはたくさんいます。

# まとめ

結局、なんのためにポートフォリオをつくるのかを明確にすべきです。転職するための武器として、自分の技術レベルを知ってもらうためのツールにすぎません。そして例え現時点のスキルが未熟であったとしても、「コードを書き続けている熱意」が伝わるように努力しましょう。目的をもってつくる、ということはとても大事だと思います。
おすすめHelm学習資料

## 書籍
『実践Helm─自作アプリをKubernetesクラスタに簡単デプロイ！』
https://amzn.to/2QbbKQn

<img width="150" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18351/ad53ca52-b508-7961-c5b7-fb90f1ef5134.png">


## インタラクティブ学習サイト

『Play with Kubernetes』
（https://labs.play-with-k8s.com/ ）

『Helm using Interactive Browser-Based Labs | Katacoda』
（https://www.katacoda.com/courses/helm ）

『Helm Lab | mjboxboat | Katacoda』
（https://www.katacoda.com/mjboxboat/courses/kubernetes-fundamentals-2/04-helm ）

『Helm Demo by aptem | Katacoda』
（https://www.katacoda.com/aptem/scenarios/helm ）

『コンテナ技術の学習するなら圧倒的にKatacodaがおすすめ #k8s #kubernetes - My External Storage』
（https://budougumi0617.github.io/2018/06/10/katacoda-introduction/ ）


## Qiita
『helmを使ってKubernetesを楽にする - Qiita』
（https://qiita.com/Hiroyuki_OSAKI/items/8965ceb6c90bae3bea76 ）

『Helmの概要とChart(チャート)の作り方 - Qiita』
（https://qiita.com/thinksphere/items/5f3e918015cf4e63a0bc ）

『helmとは & helmの使い方 - Qiita』
（https://qiita.com/sheepland/items/75b647b71c34c7d38804 ）

『GKEとCloud SQLを使ってhelmでRedmineを建ててみる - Qiita』
（https://qiita.com/sandats/items/3336c274d72ca3052441 ）


## PDF
『JA-JP-Containerize_your_Apps_with_Docker_and_Kubernetes.pdf』
（https://azure.microsoft.com/mediahandler/files/resourcefiles/containerize-your-apps-with-docker-and-kubernetes/ja-jp/JA-JP-Containerize_your_Apps_with_Docker_and_Kubernetes.pdf ）

## Workshop
『Install Helm on EKS :: Amazon EKS Workshop』
（https://eksworkshop.com/beginner/060_helm/helm_intro/ ）

『The Azure Kubernetes Workshop』
（https://aksworkshop.io/ ）

『ameer00/advanced-kubernetes-workshop』
（https://github.com/ameer00/advanced-kubernetes-workshop ）

『Install Helm :: Istio Service Mesh Workshop』
（https://www.istioworkshop.io/04-install-istio/install-helm/ ）
LuaエンジンをUnityに組み込んでみる

# 目的

HTMLに対応するJavaScriptのように、前回の3Dマークアップ言語にスクリプティングシステムとしてLuaを組み込んでみたい。
そのためのとっかかりとして、UnityにLuaエンジンを組み込み、GameObjectをLuaから操作してみる。

# 道具立て

組み込むLuaエンジンとして、[NLua](http://nlua.org/)を使ってみた。
nugetなどで導入する。

# Unityプロジェクトとプログラム

Unityのヒエラルキーはこんな感じ。

![20191223_nlua.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30257/656ca727-db57-4f62-13f8-27c4a3a356e9.png)

プログラムは、まず、以下のコードを関係する全オブジェクト（Root,Child1,Cube）にアタッチしておく。これを介してLuaからGameObjectを操作する。

```NLuaTest.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace NLuaTestNS
{
    public class NLuaTest : MonoBehaviour
    {
        public NLuaTest getChild(int i)
        {
            return gameObject.transform.GetChild(i).gameObject.GetComponent<NLuaTest>();
        }

        public void setColor(int r, int g, int b, int a)
        {
            gameObject.GetComponent<Renderer>().material.color = new Color((float)r/255f, (float)g/255f, (float)b/255f, (float)a/255f);
        }

        public void setPosition(float x, float y, float z)
        {
            gameObject.transform.localPosition = new Vector3(x/10f,y/10f,z/10f);
        }

        public void setRotation(float x, float y, float z)
        {
            gameObject.transform.localRotation = Quaternion.Euler(x,y,z);
        }
    }
}
```

そして、以下のコードをRootにアタッチして実行。

```NLuaDo.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using NLuaTestNS;
using NLua;

public class NLuaDo : MonoBehaviour
{
    private Lua state;
    private int color;

    // Start is called before the first frame update
    void Start()
    {
        state = new Lua();
        state["root"] = GetComponent<NLuaTest>();
        state.DoString("root:getChild(0):getChild(0):setColor(0,0,0,255)");
    }

    void Update()
    {
        color += 1;
        color %= 256;
        state.DoString("root:getChild(0):getChild(0):setColor("+color+","+color+","+color+",255)");
        state.DoString("root:getChild(0):getChild(0):setPosition(" + color + "," + color + "," + color + ")");
        state.DoString("root:getChild(0):getChild(0):setRotation(" + color + "," + color + "," + color + ")");
    }
}
```

色を変えるのと、適当なアニメーションをつけてみた。

# 結果

素直に動いてくれた。

![20191223_nluaexec.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30257/ca6b7914-7ef6-3d3a-60ce-ddd1af5175e7.png)
メルカリをChrome検索バーから爆速検索

mercariの正式な表記って小文字であってますよね(?)

##前提 

最近PC版Chromeのカスタム検索エンジンの制作にはまっていて、AmazonやYodobashiを追加しました。そしてmercariも同様に追加したわけですが、いかんせんメルカリの検索はノイズが多い。

単に検索キーワードで最新出品順から表示するだけの仕様なので、

業者の出品(中国から輸入した安価なガジェット関連が多い)
新品(新品ならAmazonで買います)
再出品
複数出品
など、たくさんのノイズが含まれます。


##やったこと
これを解決すべく、



keyword=%s

に置き換えたものをChromeに登録


https://www.mercari.com/jp/search/?sort_order=&keyword=%s&category_root=&brand_name=&brand_id=&size_group=&price_min=&price_max=&item_condition_id%5B2%5D=1&item_condition_id%5B3%5D=1&item_condition_id%5B4%5D=1&item_condition_id%5B5%5D=1&item_condition_id%5B6%5D=1&shipping_payer_id%5B2%5D=1&status_on_sale=1

 

こうすることでChromeの検索バーで

"me"+Tab+"(キーワード)"

と入力するだけで

##結果

あ～ら不思議。(ちょっとは)ノイズが減りました。

いい加減業者とか重複出品とか排除してほしいんですけどね…

プログラミングとほとんど関係ないのですがとりあえず一つ書いておこうと思い、投稿してみました。
定性調査概論

## 構造化インタビュー

予め決められた質問、アンケート用紙などをもとに対話を続けていく。アンケートとの違いは、各設問にたいして深掘り、詳細情報ができているかどうか。

## 半構造化インタビュー

予め決められた質問を用意した上で、それを切り口として回答者の答えによって深掘りをしていく手法。

## 非構造化インタビュー

質問内容を特に決めず、回答者も意識していない答えを引き出す手法。
- デプス（深層）インタビュー　対象者とインタビュアーによる1対1の面談式インタビュー
- エスノグラフィックインタビュー　行動観察や体験からのインタビュー

## グループインタビュー

質問に対して回答してもらいつつ、自由に意見してもらい、会話から得られる意見も収集する手法。

## フォーカスグループインタビュー

一つのテーマ、対象に対して、集団で討論をしてもらう手法。座談会形式で意見を出しやすくなり、多くの回答を引き出せる。
逆に、本音を引き出すには雰囲気やモデレーターのスキルに依存してしまう。
※マーケティングリサーチでグループインタビューといえばコチラのことを指す場合が多い。
データ分析もプログラミングもできないのに何故かここにいる

Qiita初投稿です。
[データラーニングギルドアドベントカレンダー](https://qiita.com/advent-calendar/2019/data-learning-guild)
の24日目担当です！
クリスマスイブなのでサクッとした記事に修正しました♪

## まず簡潔にまとめ
 - 今年一年の振り返り・・・タイトルの通り
 - 来年の目標・・・一か月に一つ、どんなにしょうもなくてもWebアプリを作成。
 - 目的を明確にしてからイベントに参加する
 - 目標へのストーリー作りはよいぞ

### 今年一年の振り返り
今年何を成せたのかと問われると
何も成せてないというのが正しい。

自分の弱点がわかったこと、そしてその対処方法になんとなく
気付いたのが秋、具体的な対処方法とその計画を立てたのが
つい一昨日前である。

何故ここまで時間がかかってしまったかというと
色々あったｗというのもあるが、
人に頼らなさすぎたというのが大きな原因。

もちろん自分で調べない、教えてもらえばいいという意味ではなく、
「自分こうなりたいっす！」と目標ができたら、キャリアパス相談をするのがいい。
本当にいい。
[ここ](https://data-learning.com/guild)で相談するといい。
活用するのが2020年の吉である。

ノリで言っているのではなく、データ分析のような新しく専門的であるにも関わらず幅広い特殊な業界だからこそ、学習しなくてもいいものがあるからである。

「目標ができたらやるべきことは見えてくる」だけではどうにもならないこともあるのだ。

ゴールへの到達方法を知り、一度ゴールへ到達した後でもっと近道はあったかな、
足りないものはあったかなと振り返ればいい。
自分の力でというのももちろん無駄ではないけれど、気持ちだけが焦ってしまい自分が見えなくなってしまっては勿体ない。

当然のことだけれど、頼ることも覚えなさいということがよくわかった一年であった。


### 来年はどんな活動をする予定か？
冒頭で述べた通り、
一か月に一つ、どんなにしょうもなくてもWebアプリを作成（試しにTwitterつぶやくだけのを作成した♪）

- 何故か？
 - ノースキルなので自信作り（小さくても達成できた自信を積み重ねたい）。
 - 業務でお客様の声（フリーテキスト）の視覚化を求められるが、
社内にエンジニアがいないためそのポジションを求められるand狙いたい。
 - 作る癖、学習する癖を作りたい。
 - 小さくても達成できたという自信を積み重ねていく。



### 今後こんなキャリアを構築したい
- テンションが上がる業務に携わりたい。
- 某企業のWebサイト分析をしていた時に、流入元や原因を調べる方がテンションが上がった.
- 数字とにらめっこするのはテンション上がらない。
- ツールを使いこなせるようになるとテンション上がる。

なんでもできないといけないと思っていたが、所属している課ではチーム体制をとっているので、@msdtakashiさんの記事にある
[データサイエンスチームとデータアーキテクトのキャリア](https://qiita.com/msdtakashi/items/8ae653b4f7ef3dccc6d7 #Qiita)
ポジションを明確に分ける説明あたりが、理想となりそう。

### 最後におすすめ
講座や会議、飲み会でもいいのですが参加する時に目的を明確にしてみてください。
「こういう目的で参加します。こんな収穫を期待してます。」とメモを作り、開始直前に見返したり、話すことができたらより効果的。

最近目的を見失うことが多くなってきていたのですが、この方法で気付くことも出てくるのでおすすめしておきます。

### 追記
そして目標ができたらGROWモデルをしてみてください♪
**G**oal……目標の明確化（具体的にどうなりたいかのイメージ）
**R**ealty……現状の把握（現状はどう作り出されて、その原因は何か）
**R**bsource……資源の発見（人、物、金、情報、時間など）
**O**ptions……選択肢の創造（自分で選択肢を作る！）
**W**ill……目標達成の意志（具体的な行動の約束）

です！
特にResource大事です♪


それではみなさまよいクリスマスとお年を～！
jQueryで input, select, textarea を判定する

# やり方

```js

$(":input").each(function() {
    var $this = $(this);
    if ($this.is("input")) {
        // <input> element.
    } else if ($this.is("select")) {
        // <select> element.
    } else if ($this.is("textarea")) {
        // <textarea> element.
    }
});
```
## 参照
forms - determining input vs textarea in jQuery - Stack Overflow https://stackoverflow.com/questions/8300584/determining-input-vs-textarea-in-jquery

## めも
`textarea`か？？？の判断をしたかったときに、 `attr('type')` で属性が取得できなかった。
よく考えれば、`textarea`に `type`などない。どうやって判定するのかちょっと躓いたので、めもった。
AWS Lambdaで動的サイトのwebスクレイピングをしてtwitterに投稿するbotを作った(続)

[2018/10に作ったtwitterのbot](https://qiita.com/kihoair/items/3a50454bae6c6bc6a2d6)をリファクタリングしました。理由としては

* python2.7で実行していた。
* Lambda Layer実装以前だったため、ソースコードのサイズが大きすぎてコンソールからは確認・修正できなかった。
* Serverless Framework/Lambda Layerを使ってみたかった。

などもあり、AWSの一年間の無料期間が終わるのでアカウントを作り直すついでに作り直しました。
ソースコードは[こちら](https://github.com/kihoair/intro_bot)。
レポジトリの構成の概要は以下の通りです。

```
.
├── lambda (Lambda本体)
│   ├── includeするmoduleたち
│   ├── lambdafunction.py
│   └── serverless.yml
│ 
└── selenium-layer (Lambda Layer用)
    ├── chrome-driver
    ├── selenium
    └── serverless.yml
```


Serverless Frameworkが簡単すぎて感動しました。

# 前提条件
serverlessインストール済み(node.js v4以上必須)
AWSアカウント取得済み
aws-cliインストール・設定済み

# 使い方
先にソースコード肥大化の原因のselenium+chromiumたちをLambda Layerにアップロードします。

```bash
$ cd selenium-layer
$ sls deploy
```

そのあとはLambda本体をアップロード

```bash
$ cd ../lambda
$ sls deploy
```

これで終わりです。