OmniAICreator/Qiita-1.07M huggingface dataset:
awscliでPublicIpAddressからPublicDnsNameを抽出する

## パブリックIPアドレスでfilterをかけたい

まず`aws ec2 describe-instances`を叩くと以下のように表示される(関係ある項目以外は省いてます)

```awscli
$ aws ec2 describe-instances --region ap-northeast-1

  "Instances": [
      {
          "PublicIpAddress": "52.198.249.123",
          "PrivateIpAddress": "172.31.40.37",
          "NetworkInterfaces": [
              {
                  "Association": {
                        "PublicIp": "52.198.249.123",
                        "PublicDnsName": "ec2-52-198-249-123.ap-northeast-1.compute.amazonaws.com"
                  },
・・・・・・・・・・・・・・・・
```

googleで調べてみると、出力結果に表示されるキーを小文字にして単語をハイフンで区切ると覚えておけば大丈夫らしい。
参考：[AWS CLIのフィルタの使い方](https://www.karakaram.com/aws-cli-filters-usage)
たとえばPrivateIpAddressからPublicDnsNameを取得するときは、`Name=private-ip-address`で抽出する。

```
aws ec2 describe-instances --filters "Name=private-ip-address,Values=172.31.40.37" --query 'Reservations[].Instances[].PublicDnsName' --region ap-northeast-1 
[
    "ec2-52-198-249-123.ap-northeast-1.compute.amazonaws.com"
]
```
## public-ip-addressではNGになる
次にPublicIpAddressからPublicDnsNameを取得するために、以下のようにコマンドを打つとNGになった。

```
aws ec2 describe-instances --filters "Name=public-ip-address,Values=52.198.249.123" --query 'Reservations[].Instances[].PublicDnsName'  --region ap-northeast-1 

An error occurred (InvalidParameterValue) when calling the DescribeInstances operation: The filter 'public-ip-address' is invalid
```

調べてみると、`name=network-interface.association.public-ip`でfileterをかけると抽出できるらしい。
参考：[EC2 describe instances, public-ip invalid filter #1299](https://github.com/boto/boto3/issues/1299)

```
aws ec2 describe-instances --filters Name=network-interface.association.public-ip,Values=52.198.249.123 --query 'Reservations[].Instances[].PublicDnsName' --region ap-northeast-1
[
    "ec2-52-198-249-123.ap-northeast-1.compute.amazonaws.com"
]
```

以下にfiltersで使用できる項目の一覧があります。
参考：[AWS CLI 1.16.258 Command Reference　describe-instances](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instances.html#options)
try except について

今回は私がHackerRankの30 Days of Code をやっていたときに出てきた問題について書きたいと思います。

#try　except
問題の内容はインプットされたものが整数ならばそのまま出力し、文字列がインプットされればBad　Stringと出力する。

```python:qiita.rb
s = input()
try:
   print(int(s))
except ValueError: 
   print("Bad String")
```
コードはこのようなシンプルなものになりました。
このコードの解説をすると、インプットで受け取ったものをtryでintに変換しようと試みる。もしそれが数字ならばもちろん変換することができるが、文字列であるとエラーとなってしまいます。exceptの後にそのエラー文を書いて、「このエラー文が出た時はこのような対処を行うと」と設定します。このようにtry exceptを使うことによってこの類の問題を解決することができます。
2019-10-14 WRF > WPS > metgrid.exe実行時 > "error while loading shared libraries: libnetcdff.so.6:"

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
GeForce GT 730 1GB GDDR5
CentOS Linux release 7.7.1908 (Core)
```

### 症状

```
$ ./metgrid.exe 
./metgrid.exe: error while loading shared libraries: libnetcdff.so.6: cannot open shared object file: No such file or directory
```

下記のディレクトリには`libnetcdff.so.6`ファイルはある。

```
$ ls /usr/local/netcdf-4.4.1.1/gcc485/lib/
libnetcdf.a   libnetcdff.la  libnetcdff.so.6      libnetcdf.la        libnetcdf.so     libnetcdf.so.11.0.4
libnetcdff.a  libnetcdff.so  libnetcdff.so.6.1.1  libnetcdf.settings  libnetcdf.so.11  pkgconfig
```

### 対処

.bashrcに下記を追加した。

```
export LD_LIBRARY_PATH="/usr/local/netcdf-4.4.1.1/gcc485/lib/:$LD_LIBRARY_PATH"
```
文系出身エンジニアが学ぶ正規表現の基本

# 記事を書く背景
最近さくらエディタを使ってファイルの編集をすることが多く、その際に正規表現を使って検索や置換を素早く行えるようにするため正規表現を勉強し直そうと思ったのがきっかけ。
# 対象者
・正規表現って言葉は知っているが、毎回コピペで正規表現を使っている人(自分で正規表現が書けない人)
・正規表現について学び直したい人

# 正規表現を試せるサイト
まず、簡単に正規表現を試せるサイトを紹介。
https://rubular.com/

下記のように、「Your regular expression:」に正規表現を打ち、「Your test string:」に自分が試したい文字列を打つことで、正規表現が自分の試したい文字列にマッチしているか簡単に知ることができる。
<img width="1114" alt="スクリーンショット 2019-10-14 1.51.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513534/7e8cc12e-5702-0110-5cb8-fed716ecbde3.png">


# 文字の表現
■「.（ドット）」
任意の**１文字**を表す。
「.」に入るのは改行以外（漢字・アルファベット・数字など）の文字なんでもOK！
２文字は「..」、３文字は「...」のように表したい文字列の数だけドットを書いて表現する。

```
⑴ .が降っている
⑵ ....を食べたい
```

【マッチする例】
⑴ `雨`が降っている
⑵ `ラーメン`を食べたい

■「\w」、「\W」
「\w」・・・**アルファベット**、**数字**、**アンダスコア**（ _ ）のどれかの1文字
「\W」・・・アルファベット、数字、アンダスコア（ _ ）**以外**の1文字

```
⑴ リンゴを\w個食べた
⑵ \Wが降っている
```

【マッチする例】
⑴ リンゴを`5`個食べた、リンゴを`X`個食べた
⑵ `雨`が降っている

■「\d」、「\D」
「\d」・・・**数字**1文字
「\D」・・・数字**以外**の1文字（漢字・アルファベットなど）

```
⑴ リンゴを\d個食べた
⑵ \Dが降っている
```

【マッチする例】
⑴ リンゴを`5`個食べた
⑵ `雨`が降っている

# 条件を使った文字の表現
※複数一致する場合は後方一致（後方一致の例は後述）

■「\[](半角の角括弧)」(使い方[abc])
カッコ内に指定した文字のうち、いずれかの**一文字**

```
⑴ [abc]
⑵ [リンゴ]を2個食べた
```

【マッチする例】
⑴ `a`
⑵ リン`ゴ`を2個食べた
※後方一致のため`ゴ`だけがマッチする

■「|」（使い方：A|B）
AまたはBに一致する**文字列**
※AとBは文字列なので、１文字以上の文字を入れることが可能
※「|」の間は半角スペースを開けない

```
(リンゴ|モモ)を2個食べた
```

【マッチするもの】
・`リンゴ`を2個食べた
・`モモ`を2個食べた

■「[ - ]」(使い方：[a-z])
[]内のハイフンは、文字の文字コード上の範囲を指定
※後方一致
[a-z]・・・小文字のaからzまでの全てのアルファベット
[0-9]・・・0から９までの全ての数宇(\dと同義)

```
[a-z]を2個食べた
```

【マッチする例】
⑴ `f`を2個食べた
⑵ eg`g`を2個食べた
※後方一致のため`g`だけがマッチする

■「[^]（ハット）」(使い方：[^a])
[]内のハットは否定を表す。カッコ内で指定した文字以外のいずれかの一文字
※[]の外の「^」は行の先頭を表すため注意（後述）
[^a]・・・「a」以外の全ての一文字
[^abc]・・・「abc」以外の全ての文字列

```
[^a-z]を2個食べた
```

【マッチする例】
・`桃`を2個食べた※[^a-z]は小文字のaからzまでの全てのアルファベット以外の一文字

#文字の繰り返し
■「\*(アスタリスク)」
**0回**以上の繰り返し。

```
 [a-z]*を2個食べた
```

【マッチする例】
⑴ `egg`を2個食べた
⑵ `tomato`を2個食べた
⑶ を2個食べた
0回以上なので⑶のように文字列が入っていなくてもOK

■「+(プラス)」
**１回**以上の繰り返し。

```
[a-z]+を2個食べた
```

【マッチする例】
⑴ `egg`を2個食べた
⑵ `tomato`を2個食べた
1回以上なので「＊」⑶のように文字列が入っていない場合はNG

■「?(ハテナ)」
０回か、１回の繰り返し。

```
 今日はやるぞ〜?。
```

【マッチするもの】
・今日はやるぞ〜。 
・今日はやるぞ。
※ここでは「〜」が０回か、１回の繰り返した文字列

■「{n,m}」
繰り返しの回数の指定。
下記、⑶⑷のように上限、下限を省略することも可能。

```
⑴ [a-z]{５}を2個食べた  　※5回繰り返す
⑵ [a-z]{1,５}を2個食べた　※１回以上５回以下繰り返す
⑶ [a-z]{,5}を2個食べた　 ※５回以下繰り返す
⑷ [a-z]{1,}を2個食べた　 ※１回以上繰り返す
```

【マッチする例】
⑴ `tomato`を2個食べた
⑵ `egg`を2個食べた、`tomato`を2個食べた
⑶ `tomato`を2個食べた、を2個食べた
⑷ `egg`を2個食べた、`cucumber`を2個食べた

# 行頭・行末の指定
■行頭（行の先頭）「^」
行の先頭は「^（ハット）」を使って表す。

```
^私の.+。
```

【マッチする例】
・`私の`好きな食べのもはリンゴです。

■行末（行の末尾）「$」
行の末尾は「$」を使って表す。

```
.+リンゴです。$
```

【マッチする例】
・私の好きな食べのもは`リンゴです。`

#空白文字の扱いについて（改行、空白、タブなど）
■「\n」、「\r」（改行コード）
改行コードはOSによって複数の種類が存在する。
「\n(LF)」　　　：Unix系OS全般、Mac OS X
「\r\n(CR+LF)」 ：Windows系OS
「\r(CR)」　　　：古いMac OS（9以前）

なので、「|」を用いて下記のように表すことで上記の改行コードもいずれでもマッチできるようになる。

```
\n|\r\n|\r
```

■「\R」
上記`\n|\r\n|\r`と同義。

■「\t」
タブを表す。

■「\f」
改行ページを表す。

■「\s」、「\S」
「\s」・・・空白文字（半角スペース、\t、\n、\r、\f）すべての文字。( |\t|\n|\r|\f)と同義
「\S」・・・空白文字以外のすべての文字
Rails  controller createアクション #メモ

###ストロングパラメータとは
Rails4からの新機能らしい｡
Web画面から流れてきたデータを保存する時に､安全に保存する仕組み｡



```ruby:post_controller.rb
def create
   @post = Post.new(post_params) #paramsメソッドを利用 ストロングパラメータを引数として記述
   @post.save 
   redirect_to @post  #createしたidのshowページにリダイレクト
end

private #private以下にストロングパラメータの定義を記述

def post_params  #ストロングパラメータを定義していく
   params.require(:post).permit(:title, :body, :category) #requireメソッドとpermitメソッドを利用
end
```
###params
送られてきた値を受け取るメソッド

###.requireメソッドと.permitメソッド

.requireメソッドでオブジェクト名を定義､
.permitメソッドで保存処理を許可する項目のキーを記述

これで､Web上から悪意のあるデータが送られてきたとしても､許可している項目しか保存処理されない｡

---
参考サイト

[きゃまなかのブログ](https://techblog.kyamanak.com/entry/2017/08/29/012909)
Android Downloadライブラリ覚書

# はじめに
PJでダウンロードを管理するライブラリの検討、サンプル実装をすることになりました。
こちらはその時の覚書です。

要件

- 複数のダウンロードリクエストを管理できる （ダウンロード状態を管理できる、 開始・実行中・完了・エラーなど）
- ダウンロードするファイルはユーザーが通常使えない場所が好ましい
- 一定以上の使用実績や情報がある

# 検討1. DownloadManager
Google のガイドにある通り、はじめはDownloadManagerで開発を進めていました。
https://developer.android.com/guide/background

が、DownloadManagerは今回のPJの要件では使えない致命的な特徴がありました...
[stack over flow](https://stackoverflow.com/questions/38563474/how-to-store-downloaded-image-in-internal-storage-using-download-manager-in-andr)
の記事にもある通り、DownloadMangaerでは一時的であっても、
外部ストレージにファイルを保存する必要があります。

ここが引っかかって、今回は不採用となりました。
(もちろん、BroadcastReceiver使えばいいんですが、外部ストレージの削除を保証する仕組みができるか怪しいのと一部端末でダウンロードができない事象が発生したため。元々、メーカーごとに外部ストレージの構造が異なるAndroidでは動かない端末なども出てきそうなので...)

# 検討2. Fetch
自分が検討したというよりも、推薦・サンプル実装を他のメンバーが進めていたものになります。
https://github.com/tonyofrancis/Fetch

Githubで探してみても、AndroidのDownloadManagerって驚くほど少なくて、
これはほぼ唯一と言っていいくらい作り込みや宣伝がきちんとできていたものでした。

使ってみて、内部ストレージへの直接保存もできているのでひとまずはこちらを使ってます。

ちょっと作りかけですが、サンプルも置いておきます...
https://github.com/shinya-takano/FetchSample

# まとめ
そもそも、大容量ファイルでなければDownloadManagerやFetchなどの選択肢じゃなくていいのかもと思いました。
（以前のPJでは、普通にOkHttpを使用していたので...とはいえ、今回は多数のダウンロードリクエストを管理しないといけないためダウンロードライブラリが必要でしたが...）

皆様はどうやっているのでしょうか...

# その他
ログ送信のような機能でWorkManagerも使ってみてます。
案外、WorkMangagerでも今回は足りた気がしていて、
短時間のダウンロードであればこちらにスイッチした方が使いやすいかなと若干思いました。
【Blender】Blender日本語化メモ

![スクリーンショット 2019-10-14 14.42.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422079/2d08557f-7ffa-c08f-6125-6fb28c4a664a.png)
![スクリーンショット 2019-10-14 14.43.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422079/b1196332-3c02-a830-a04a-4c11d58dcdfc.png)
<img width="1440" alt="スクリーンショット 2019-10-14 14.44.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422079/d4ebfcc5-7060-5a91-c650-adc1993324f1.png">
<img width="772" alt="スクリーンショット 2019-10-14 14.59.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422079/f194d721-c42f-9c96-0939-31740b8208e5.png">
<img width="772" alt="スクリーンショット 2019-10-14 15.00.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422079/932a9afa-8298-e885-f7f3-b23a95046ea8.png">
Vagrant を使用してvue-cli をgestOSで使用する際に、vue create実行時にエラーが発生してハマったこと

## Vue CLIを作成（vue create my-cli）
名前はなんでもよいとして、今回は。

```
npm install -g @vue/cli
```

と。ここでつまずく。

下記のエラーがでてしまう。

```
npm ERR! A complete log of this run can be found in:
npm ERR! /home/vagrant/.npm/_logs/2019-10-11T10_51_25_764Z-debug.log
ERROR command failed: npm install --loglevel error
```
よく見ると、ログの上のほうに、

```
npm ERR! codeEI0
npm ERR! syscall symlink
```
とあり、どうやらシンボリックリンクの作成に失敗している模様。

## 解決策

[Windowsホスト上のVagrantのシンボリックリンクフォルダでyarn installできない問題の解決](https://qiita.com/maikya_gu/items/8e313dcd50c39f5a4b0b)
を参考に、Vagrantfileの修正を行うも、やはりエラー。

とりあえず、共有をかけていないところで実行すると、正常に作成されることから、シンボリックリンクの何かだと思っていたのかと思い・・・。
色々調べていると、Windowsのファイルのパスの長さでは？？と疑い、そもそものubuntsのパスを
C:\vagrant\ubuntu64_16\workspace\my-cli\
など、直接C:\直下にに移動すると、今度は正常に作成できました！！

Windowsのファイルパスの文字数の制約は結構短いので注意しないといけないですね。
GitHubの自分に関連するプルリクを確認する

# はじめに

複数のプルリクのレビューを受けると自分が対応しないといけないプルリクはどれなのか把握しにくくなったり、GitHub内を行き来する効率が悪くなったりするので自分に関連するプルリクを一覧でみたいという需要がありました。GitHubでは簡単に検索できる機能があったので紹介します。

# 自分に関連するプルリク一覧を見る

以下をGithub内で検索。

```
is:open is:pr involves:(自分のユーザー名)
```

自分の作ったプルリクなど関係する全てのプルリクを見ることができるので便利です。

# 自分がレビュー依頼を受けているプルリク一覧を見る

以下をGitHub内で検索。

```
is:open is:pr review-requested:(自分のユーザー名)
```

https://github.com/pulls/review-requested から直接見ることもできる。
ただし、プルリク内でコメントをつけたりすると消えてしまうことに注意。

レビュー対応をまだしていないものを見れるので、レビューの見逃しを防げます。

# 参考

- [検索を使用して Issue およびプルリクエストをフィルタリングする](https://help.github.com/ja/articles/using-search-to-filter-issues-and-pull-requests)
- [githubのissue, pull request 検索をハックする！](https://engineer.blog.lancers.jp/2016/12/github_search_query_hack/)
go buildでcannot find packageのエラーとなった時

# 環境

- go1.13.1

# エラーメッセージ例

```
../../go/src/github.com/hoge/fuga/piyo.go:7:8: cannot find package "golang.org/x/sys/unix" in any of:
        /usr/local/Cellar/go/1.13.1/libexec/src/golang.org/x/sys/unix (from $GOROOT)
        /Users/(username)/go/src/golang.org/x/sys/unix (from $GOPATH)
```

依存するパッケージ(この例では`golang.org/x/sys/unix`)が`$GOROOT`や`$GOPATH`から見つからず、ビルドに失敗している。

# 対処

該当のパッケージを`go get`する。

```
$ go get -u golang.org/x/sys/unix
```

その後、`go build`する。
Androidアプリ(Java)から非同期でAPIを呼びJSONレスポンスをTextViewに表示させる方法


# やりたいこと
JavaでのAndroidアプリ開発にて。
メインスレッドからAPIを非同期で呼び、
APIのJSONレスポンス（に含まれる文字列）を、
UI（ビュー）に表示させたい。

# 前提

* APIへアクセスできる設定（Manifestなど）が完了していること。
* OkHttpClientが使える状態であること。


# 実装

たとえば MainActivity にて、下記のようなメソッドを実装する。

```java
    /**
     * http(s)で始まる、APIのURLを文字列（String）で受け取り、
     * APIにアクセスしてJSONレスポンスを取得し、メインスレッドのUIを更新する。
     */
    void httpRequest(String url) throws IOException
    {
        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder().url(url).build();
        client.newCall(request)
                .enqueue(new Callback() {
                    @Override
                    public void onFailure(@NotNull Call call, @NotNull IOException e) {
                        Log.e("onFailure", e.getMessage());
                    }
                    @Override
                    public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
                        final String jsonStr = response.body().string();
                        try {
                            JSONObject json = new JSONObject(jsonStr);
                            final String name = json.getString("name");
                            Handler mainHandler = new Handler(Looper.getMainLooper());
                            mainHandler.post(new Runnable() {
                                @Override
                                public void run() {
                                    TextView textView = (TextView)findViewById(R.id.hoge);
                                    textView.setText(name);
                                }
                            });
                        } catch(Exception e) {
                            Log.e("Exception", e.getMessage());
                        }
                    }
                });
    }

```



# 呼び出し方


```java
try {
    String api_url = "http://hoge.com/api/get_contents";
    httpRequest(api_url);
} catch(Exception e) {
    Log.e("エラー処理",e.getMessage());
}

```
FXのデータを特異値分解(Singular Value Decomposition)

#前準備
まずFXのデータを準備する。今回用いたFXのデータは[stooq](https://stooq.com/q/d/?s=usdjpy&c=0)から入手したcsvファイルを用いた。データ量に関しては任意。また実行するファイルとFXのデータは同一ディレクトリ内に保存している。
#前処理

```
import pandas as pd
import numpy as np
A = pd.read_csv("usdjpy20142019.csv")
A.head()
```
実行結果(今回のデータはここ最近のおよそ5年分のデータを用いた。)
![FX.head.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401291/3465b4af-52d4-257f-67ed-184b3f0c7699.png)

Dateを除く。Dateを含めると、「TypeError: No loop matching the specified signature and casting was found for ufunc svd_n_f」というエラーを吐き出すため。
そして最後に特異値分解を行った結果をcsv形式にして保存を行う。

```
df = A.iloc[:, 1:]
U, S, V = np.linalg.svd(df, full_matrices=True)
```

```
U = pd.DataFrame(U)
U.to_csv("U.csv", index=True)
V = pd.DataFrame(V)
V.to_csv("V.csv", index=True)
S = pd.DataFrame(S)
S.to_csv("S.csv", index=True)
```

データ解析についてはまた今度、とりあえず今回は方法などを一通り実行できることの確認のつもりで行ってみた。また今回行ったプログラムについて

**1. ファイルの取り扱いにおいて、別のディレクトリの場合の保存方法**
**2. Dateは含めるべきかどうか**
**3. 2において含めてよい場合の解決方法**
**4. excelファイルの場合の読み込み方法**
**5. excelファイルとcsvファイルの違い**

以上についてが少し気になるため調べてみようと思う。

(追記)
[pd.read_csv及びpd.to_csv](https://pandas.pydata.org/pandas-docs/stable/user_guide/io.html#io-read-csv-table)
[pd.read_excel及びpd.to_excel](https://pandas.pydata.org/pandas-docs/stable/user_guide/io.html#io-excel-reader)
[excelとcsvの違い](https://www.webernote.net/webinfo/excel_csv_xls.html)は理系の大学では実験装置に接続しているPCがOfficeをインストールしているわけではないからだ。簡単に言えば互換性の高いからcsvファイルで取り扱っている。
Excel と Access で建築コスト管理を作成する(Tips2)

# 建築コスト管理システムを作成する
建築コスト管理（工事原価管理）システムを作成する。

Access で入力して、Excel に出力する方法で作成しようと思う。

## 管理する工事項目を登録する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93227/7971c2fe-805d-0766-dd54-7b142ec9f620.png)

並び順は、自由に変更できるようにする。

上から順にA～Zの記号を付ける。

Excelに転記した時に、工事区分の頭にA～Zの記号を付ける
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93227/dd6a449d-cf6f-ea55-cd27-d14f0fbac039.png)

小計を取る時は、項目の記号で小計内容を説明する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93227/327ba3ea-d935-568d-96c4-18c01d297931.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93227/f6d50b36-dc1b-1b3d-3533-e750cd33d7e4.png)

## 工事項目マスターは、2階層にする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93227/270cbd67-752e-2ef4-519b-f2224a6d1203.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93227/0d7eac1e-a964-c798-67ab-7495b9916237.png)

こんな感じで進めています。
機能に関する助言などございましたら、コメントお願いします。

#### 関連投稿（Excel と Access で建築コスト管理を作成する）
(1) [建築コスト管理 システム概要](https://qiita.com/muramoto_jp/items/a0ad20207d4d0647bbc2)
(2) 管理する工事項目を登録する
Ubuntu19.10 Static IP  address setting

```yaml:/etc/netplan/01-netcfg.yaml
network:
  version: 2
  renderer: networkd
  ethernets:
    enp8s0:
      dhcp4: no
      addresses: [192.168.0.xx/24]
      gateway4: 192.168.0.yy
      nameservers:
        addresses: [8.8.8.8,8.8.4.4]
```
循環配列を用いたキューの実装

## 概要
キュー（Queue）は先入れ先出し（First In First Out）を実現するためのデータ構造です。無限の長さを持つ配列があれば末尾に要素を追加していくだけでキューを実装できますが、実際には有限長の配列でキューを実装する必要があります。有限長の配列に要素を追加する際、配列の末尾がすでに埋まっていたら配列の先頭から格納していく必要があるため、剰余算術を用いて格納位置を決定します。下記に実装例を示します。

![Screen Shot 2019-10-14 at 13.09.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122091/5cc25c49-2f5f-1c7a-0867-5d7a2841e545.png)

## 実装例
```python
class MyCircularQueue(object):
    def __init__(self, k):
        # サイズkの配列を用いてキューを実装する
        self.k = k
        self.q = [None] * k
        self.first = 0 # 要素の先頭を表すindex
        self.last = 0  # 要素の末尾を表すindex

    # キューの末尾にデータを追加する
    def enQueue(self, value):
        if self.isFull():
            return False
        else:
            # 剰余をindexとして返す
            idx = self.last % self.k
            self.q[idx] = value
            self.last += 1
            return True

    # キューの先頭からデータを取り出す
    def deQueue(self):
        if self.isEmpty():
            return None
        else:
            # 剰余をindexとして返す
            idx = self.first % self.k
            val = self.q[idx]
            self.q[idx] = None
            self.first += 1
            return val

    # キューの先頭のデータを参照する
    def front(self):
        idx = self.first % self.k
        return self.q[idx]

    # キューの末尾のデータを参照する
    def rear(self):
        idx = (self.last - 1) % self.k
        return self.q[idx]

    # キューが空かどうか判定する
    def isEmpty(self):
        return self.first == self.last

    # キューが一杯かどうか判定する
    def isFull(self):
        return self.last - self.first == self.k
```

## 注意点
本来はキューが一杯になったら配列の長さを拡張する等の対応を行うことが望ましいですが、本記事では簡略化のため省略しています。

## 参考
https://ja.wikipedia.org/wiki/キュー_(コンピュータ)
Pythonによるガントチャート生成ライブラリ

2024.5.25追記：このライブラリは別プロジェクトに引き継ぎましたので、こちらをご利用ください
https://github.com/usop4/elegantt/

似たようなのは探せばいくらでもありますが、こういうやつです。

```py
import genGanttChart

gchart = GanttChart( (720, 320),(255,255,255) )
gchart.draw_calendar()
gchart.draw_campain("2019-10-15","2019-10-18","こんにちは")
gchart.draw_campain("2019-10-20","2019-10-23","こんにちは")
gchart.draw_campain("2019-10-24","2019-10-30","こんにちは")
gchart.draw_campain("2019-10-28","2019-10-30","こんにちは")
gchart.draw_campain("2019-10-29","2019-10-30","こんにちは")
gchart.show()
gchart.save("test.png")
```

![tmp2f6nw42s.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33389/080d344b-c294-7574-5683-3a6bca4e0885.png)

[ポイント還元ポータルpokanpo](http://pokanpo.skr.jp/)という、キャッシュレスのポイント還元の開始時期と終了時期が見やすいサイトを作ろうと思って書き始めました。サイトのデザインに合わせて、こんな感じで色やサイズなども調整できます。

<img width="840" alt="スクリーンショット 2019-10-14 14.20.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33389/1da44f83-ee6c-284d-1912-439b9dee5b04.png">

PythonのPillowというライブラリとNoto Sansというフォントを使ってます。

詳しくはGithubで。

https://github.com/usop4/genGanttChart

2024.5.25追記：このライブラリは別プロジェクトに引き継ぎましたので、こちらをご利用ください

https://github.com/usop4/elegantt/
【初学者支援】RailTutorialで唯一暗記したほうがいいところ

どうも、くぼはるです。

僕は普段初学者にプログラミングを教えるときに、

「丸暗記は絶対するな！」と声を大にして言います。

ですが、今回はあえて言いましょう。

「ここだけは暗記してでも押さえておけ！」と。

ここってどこなんだって話ですよね。

それは、「MVCアーキテクチャの概念図」です。

![iOS の画像.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100459/df6084e8-3f26-c811-15a6-d891019200f1.jpeg)

うわーめっちゃ読み飛ばしたいわー横文字つらいわーって思ったそこのあなた！

まぁ否定はしません。僕も同じこと思いました。

ですが、RailsTutorialでここを読み飛ばして先に行ってしまうのと、

しっかりと暗記して、先へ進むのとでは、少なくとも１００倍以上理解度が違います。

なぜかと言うと、この先何100回と、この図を使うときがくるからです。

頭の中でこの図を思い浮かべながら、「今、僕は④の流れをコードで書いている」と思いながら書くのと、

「魔法の呪文だぁ」「なんか知らないけど動いたぁ」「次いこー」って感じでコード書くのとでは、理解度が段違いです。

これを機に「MVCアーキテクチャの概念図」を頭に叩き込んでソラでかけるようになっておいてください。

以下、具体的な使い方です。参考になれば幸いです。
ユーザーの一覧画面を表示する際の例です。

①リクエスト（ブラウザ）からルーティングへ情報が送られる

```routes.rb
# ルーティング
# リクエストから情報が詰まったカプセルが届きました
# どのコントローラーのどのアクションにそのボールを渡すかという情報がそこには入っています
# その情報を元にどこに仕事を渡すか、ルーティングが判断してカプセルを渡します
resources :users, only: :index
```
②ルーティングからコントローラーのアクションへ情報が送られる

```users_controller.rb
class UsersController < ApplicationController
  # この段階で、indexさんに仕事を任せた状態
  # これからindexおじさんは仕事をしていきます
  def index
    # ③ ページ表示に必要なユーザ一覧データの貰い方を知っているUserモデルにデータ提供を依頼します
    # ④ 依頼を受けたモデルはallメソッドを使ってデータベースに「ユーザ一覧データくれ」と命令します
    # ⑤ データベースはモデルからきた命令に応じてデータを渡します
    # ⑥ Userモデルは依頼を達成するべく、ユーザ一覧をコントローラーに渡します（結果が@usersの中身
    @users = User.all
  end
end
```

⑦Usersビューおばさんに必要なデータを全部渡して、「完成されたページをください」と依頼する

```views/users/index.html.erb
<%= @users.each do |user| %>
  <%= user.name %> | <%= user.email %>
<% end %>
```
⑧Users#indexビューおばさんはindex.html.erbテンプレートと渡されたデータを使って完成されたページを作成し、それをindexおじさんに渡します

⑨indexおじさんはそれをレスポンス（ブラウザに返すこと）しましたとさ。

ちゃんちゃん。
PythonでWebアプリ開発01（フレームワーク選定: Django vs Flask）

PythonでWebアプリケーションを開発するにあたってフレームワークを選定する必要がある。
自分の場合はまず王道でメジャーな物を使うことにしているが、PythonのWebアプリケーション開発で王道のフレームワークといえばDjangoとFlaskあたりだろう。

どのような特性の違いがあるかをよく説明された記事を探してみる。
下記記事が参考になる。

- https://www.superbusinessman.biz/flask-vs-django-for-python-web-framework/

記事の内容も参考に簡単にまとめると、

- Flask
    - とにかく軽量で無駄なものが含まれていなくて自由度が高い
- Django
    - 最初から色々なモジュールが含まれており、Flaskに比べ都度モジュールなど追加でインストールする必要がなさそう

ということで、自分も久しぶりの新規Web開発ということで、フレームワークそのものからも最近のフレームワークの設計概念を学びたいということでDjangoを選択することにする。
Pythonだけでなく色々な言語のフレームワークを使い倒していて、自由度高く設計を行いたい人にとってはFlaskも良い選択肢になりそう。

手順としてはとりあえずHello Worldをどこかのサーバに乗せて静的ページを公開することが最初のゴール設定。

次の記事: [PythonでWebアプリ開発（開発サーバ環境選定〜Django起動）](https://qiita.com/TechAngel/items/eadbcf784710839d7c00)
SEILでSSH接続エラーが出たときの回避方法

#概要
SEILから、SSHで他のホストにリモートログインしようとした際に、SSH接続エラー(REMOTE HOST IDENTIFICATION HAS CHANGED!)が発生した場合の対処方法です。
有名なエラーですのでLinuxでは対処方法がありますが、SEILの場合も対処可能です。
![SSHエラー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/476879/b518c47b-8d98-1345-4f2c-e37e7dce811a.png)

#原因
接続しようとしたIPアドレスのホストが、以前と変わってしまったのが原因。
SSHでは初回接続時に接続先ホストの公開鍵を記録しますが、次回接続時にも記録した鍵を比較します。そのためIPアドレスの振り直しやOS再インストールなどで公開鍵が変わってしまった場合はエラーになります。
安定した環境ではあまり起こらないですが、Raspberry PIなどで違うOSの入ったSDカードを複数差し替えて使っているような人は、遭遇します。

#対処
SEILの再起動をする事で、記録されている公開鍵情報は無くなります。
問題に遭遇したら躊躇なくSEILを再起動しましょう。
SEILのコンソールから **reboot** コマンドを実行するだけでOKです。

ご存じの通りLinux等のOSではknown_hostsなどに手を加えることで対応可能です。
ただしSEILはNetBSDベースではありますが、ルータ機能に特化しているため公開鍵記録を削除するにはSEILの再起動しかありません。
普段PCからSSHで接続する際には、公開鍵の確認を無視するターミナルソフトが多いのであまり気になりませんが、忘れた頃に遭遇する類のエラーですので対処方法を覚えておきましょう。

#その他
SEILが記録している公開鍵情報を消すコマンドは無いですが、見るコマンドは存在します。
**show status ssh known-hosts host-public-key** コマンドを実行すると公開鍵の一覧が表示されます。
![SSHエラー２.png.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/476879/9265ccf5-109d-af8b-b310-dc61c4fc278d.png)

以上
JDBC 基礎①(DBへの接続・切断)　まとめ　備忘録

##はじめに
社外研修でJDBCの内容に入ったので自分の備忘録にまとめます。
環境は以下です。


||説明|
|---|---|
|言語|Java8| 
|DB|OracleDB 11g| 
|APPサーバ|Tomcat| 
|JDBC|ojdbc7| 
|IDE|Eclipse Mars| 

##JDBCとは

DBのレコードとJavaのオブジェクトを紐づける標準API。

APIとは・・・
「ソフトウェアの機能を共有するためのプログラム」のこと。

JDBCにより、レコード内の各列の値をJavaのオブジェクトに格納して、Javaプログラム内で
利用できるようになる。

JDBC自体は、インターフェース。
JDBCの各機能を利用するには、RDBMSの種類に応じたJDBCドライバ(JDBC実装クラス)が別途必要！！

JDBCの構成は以下。

![jdbcmodel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362189/63327c2e-2d39-5104-40ee-5eae5e1a2311.png)




##DBへの接続・切断

###DBへの接続手順

DBへの接続は以下の手順で行う。

1.libフォルダにJDBCドライバの格納
2.ビルドパスへJDBCドライバの追加
3.JVMへJDBCドライバクラスの登録
4.DB接続処理の実行

※DBの接続、操作の処理を実装する際には、以下の処理もソースコードに記述する。

__・例外処理(SQLException)__
　JDBCでDB接続、SQL実行などを行うメソッドでエラーが発生した場合、SQLExceptionが送出される。

__・DBとの接続切断処理__
　DB接続やSQL操作が完了したら、必ず接続切断を実施する。
　システム停止など致命的なトラブルが発生する恐れがあるため。
　__Connection#close()メソッドで実行。__

1、2は割愛。
ただ、入れるだけなので。

####3.JVMへJDBCドライバクラスの登録
DB接続処理のメソッドを呼び出すためには、そのメソッドが実装されているJDBCドライバクラスを
JVMに登録する必要がある。

登録するには、Class#forName()メソッドを利用する

#####Class#forName()
引数にJDBCドライバクラス名を指定する。
引数に指定されたクラスをJVMへ登録する。
引数に指定されたクラスが存在しない場合、
ClassNotFoundExceptionを例外クラスで送出


オラクルであれば以下。
oracle.jdbc.driver.OracleDriver

登録は一度実行すれば、JVMが終了するまでは再登録不要。
例外処理を記述する必要あり。


####4.DB接続処理の実行
DBへ接続する際は、DriverManager#getConnection()メソッドを利用。

#####DriverManager#getConnection()
引数を3つ指定可能
第1引数：接続するDBのURL(ホスト名、ポート番号、DB名)
第2引数：接続するためのユーザ名
第3引数：接続するためのパスワード

接続成功でConnection型のオブジェクトが戻り値として返される。
Connection自体ｈインターフェースであり、その型の変数はConnectionインターフェースを実装した
クラスのオブジェクトを参照している。
__このオブジェクトは、DBとの接続情報を保管しており、DBにSQL操作を行う際に使用する。__

####接続処理の実装

```DBManager.java

/**
 *DBと接続
 *
 *@return DBコネクション
 *@throws ClassNotFundException
 *        ドライバクラスが見つからない場合
 *@throws SQLException
 *        DB接続に失敗した場合
 */

  public static Connection getConnection() throws ClassNotFoundException,
           SQLException {
    //JDBCドライバクラスをJVMに登録
    Class.forName("JDBCドライバクラス名");

    //DBに接続
    Connection connection = DriverManager.getConnection("URL", "ユーザ名", "パスワード");
   
    return connection;
  }

/**
 *DBの接続切断
 *
 *@param connection
 *       DBとの接続情報
 */

  public static void close(Connection connection) {
    if (connection != null) {
        try {
            //DB接続切断
            connection.close();
            } catch (SQLException e) {
               e.printStackTrace();
            }
        }
    }

```
macOS CatalinaにアップデートしてXAMPPが使えなくなった人へ

# はじめに

「macOS Catalina(ver.10.15)にアップデートしたらXAMPPが起動しない！」って人が周りに何人かいたので、
「<font color="red">これを機にXAMPPを卒業しよう！</font>」って事で記事を書きました。

## XAMPPの何が悪いの？

XAMPPは手軽にPHPのローカル開発環境が作れます。
ボタン一つでApacheサーバーを立ち上げ,
MYSQLとやりとり出来るでしょう。めっちゃ便利です。
でも<font color="red">ダサい！</font>
ターミナルを使ってコマンドで立ち上げた方がかっこいい！
特に悪いところは見つかりません。笑
強いて言えば実践的ではないところですかね？
( 御指南お願いします。 )

## 準備

- `macOS`をアップデートしましょう。 ( おそらくあなたは今ここです。 )
- `XCode`をアップデートしておきましょう。 ( ターミナルで`xcode-select --install`コマンドでインストールできます。 )
- `ターミナル`を開きましょう。 ( iterm2がおすすめです。 )

## Homebrewをインストールしよう

ターミナル上で、

```
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

こちらをコピーペーストで実行しましょう。
( 2019/10/14日現在のコマンドです。[公式サイト](https://brew.sh/index_ja)でインストール欄を確認することをおすすめします。 )

エンターキーを入力してくださいやらmacのパスワードを入力してくださいやら出てきますが指示に従ってください。

インストールが完了したら、

```
brew -v
```

を入力して実行です。 ( Homebrewのバージョンを確認するコマンドです。 )

<img width="566" alt="スクリーンショット 2019-10-14 12.41.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489303/8ecb66de-a4d6-dfc4-a416-24de7d8557cb.png">

こちらのように出れば成功です。

## Mysqlをインストールしよう

次にMYsqlをHomebrewを利用してインストールしていきます。 ( 今回使うのはMysql@5.7です。 )

ターミナル上で、

```
brew install mysql@5.7
```

と入力して実行してください。

## 実際に使ってみよう

まずは、

```
 echo 'export PATH="/usr/local/opt/mysql@5.7/bin:$PATH"' >> ~/.bash_profile
```

```
source ~/.bash_profile
```

```
mysql.server start
```

と順番に入力して実行してください。
( SUCCESSと出れば成功です。 )

次に、

```
mysql -u root -p
```

上のコマンドを実行してください。
( ユーザー=>ルート, パスワード=>無しという意味です。 )

その後に、`Enter password`と出てパスワードを入力するように促されますが、そのままエンターキーを押してください。 ( 今回はパスワードは無しにしたからです。 )

下の画像は実際の画面です。

<img width="650" alt="スクリーンショット 2019-10-14 12.51.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489303/c3c0aff3-98bf-123a-d168-e8c853d7161f.png">

## Mysqlを操作してみよう

`show databases;` => 今あるデータベースの一覧を表示します。
`create database {データベース名} default character set utf8mb4 collate utf8mb4_unicode_ci;` => データベースを作ります。
`use {データベース名};` => データベースを使います。
`show tables;` => テーブルの一覧を出します。
`select * from {テーブル名};` => テーブルの中身を確認します。

他のコマンドは適宜確認してみてください。

終了するときは、

```
exit
```

してから、

```
mysql.server stop
```

でサーバーを閉じてください。

### コマンドで操作するのめんどくさい！

`sequel pro`で検索すると幸せになれます。
AllenNLPチュートリアル

# [AllenNLPチュートリアル](https://allennlp.org/tutorials)やったのでまとめとく
### **[参考資料]**

- [An In-Depth Tutorial to AllenNLP (From Basics to ELMo and BERT)](https://mlexplained.com/2019/01/30/an-in-depth-tutorial-to-allennlp-from-basics-to-elmo-and-bert/)
    - Instance,Textfieldなどの説明がわかりやすく書かれている
- [AllenNLPで簡単にDeepな自然言語処理](https://qiita.com/itok_msi/items/d788155848be46e5407e)
    - 日本語でAllenNLPについて書いてる数少ない記事
- [kagglerのためのAllenNLPチュートリアル](https://speakerdeck.com/ryujitamaki/kagglerfalsetamefalseallennlptiyutoriaru?slide=9)  
    - AllenNLPの概要が端的にまとめられており短時間でAllenちゃんを理解できる

### **[NOTE]**

- 勉強やってる感を出す為に適当にまとめました
- 間違ってる部分あると思いますが、コメントくれると嬉しいです
- 自分用にスライドにまとめただけなのでかなり雑ですが、一応共有します（虐めないでください）
- jsonnetの書き方とかについてもまた追記していきたい所存でございます
- Qiita初投稿でどんな感じで投稿するのかの確認も含めています


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395267/bce28c12-78d7-ef9c-f0fd-33f48112db16.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395267/328828dd-f2d8-0a09-c08c-ddfd5b2f205b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395267/708e7ab7-b5f1-f826-09b4-9fb0fe600866.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395267/8e3b5679-844a-e539-7af0-2cb6c04e3838.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395267/be2483e9-cdc3-ceca-7e4e-1d27ce9f7a02.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395267/63314f17-5d34-8061-3d3f-7290d59219ac.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395267/613f2f66-f088-8cb4-1308-a665936031a2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395267/727783b2-4416-71ce-4661-c637839f5d0f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395267/c3f77e20-66f0-c57b-0cb5-23bc94dad649.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395267/876d22bc-0bcf-84f3-930c-99283828dfa6.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395267/3b3976e7-64d9-990e-27be-d15b8b996054.png)
PowerApps を使ってSharePointの新規投稿フォームで複数条件の入力チェックをする

# 概要

SharePoint の投稿フォームで複数条件の入力チェック（Validation）を行います。
ひとつでも条件を満たさない項目がある場合は、「保存」をクリックした際にエラーメッセージを表示します。

# 完成イメージ

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357828/1f15d9c8-da44-81fb-c2b1-d8a56f5b0970.png" width=50%>

# 「保存」をクリックしたときに処理を挟むには

フォーム保存時の処理を表す「SharePointIntegration」>「OnSave」プロパティにおいてIF文などの条件分岐をいれることで、条件を満たさない場合の処理を指定することができます。

例：メッセージを表示する、保存処理を行わない等
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357828/ad3bf38d-cbe7-22a1-0644-bf4514d5338c.png" width=80%>

# 実装

OnSave プロパティ で入力チェックの条件分岐を設定します。
この例で設定した条件は以下の通りです。

* 一行テキストは必須入力
* 数値は 10 ～ 20 の間で入力すること
* 「選択肢１」以外を指定すること

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357828/0bf67103-30f1-d3b8-fd56-e2b02597196f.png" width=60%>

```:「SharePointIntegration」>「OnSave」
Set(ValidationErrMsg, "");
If(IsBlank(DataCardValue2.Text),Set(ValidationErrMsg, "一行テキストは必須入力です。"));
If(Or(Value(DataCardValue3.Text) < 10,21 <= Value(DataCardValue3.Text)),Set(ValidationErrMsg, ValidationErrMsg&"数値は10から20の間で入力してください。"));
If(DataCardValue4.Selected.Value = "選択肢 1",Set(ValidationErrMsg, ValidationErrMsg&"選択肢1以外を選択してください。"));
If(IsBlank(ValidationErrMsg),SubmitForm(SharePointForm1),Notify(ValidationErrMsg,NotificationType.Error));
```

「保存」ボタンをクリックすると、条件に従っていないものがエラーメッセージとして表示されます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357828/1f15d9c8-da44-81fb-c2b1-d8a56f5b0970.png" width=50%>

条件に従っているものはエラーメッセージには表示されません。すべての入力項目が条件に従っていれば アイテムの保存処理（SubmitForm）が実行されます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357828/4e6d0bdb-28c6-9391-b10b-43b05720d813.png" width=50%>
【Python】print関数のendオプションの使い方

#endオプションとは？

簡単に言うと、print関数の最後に付け足すものを指定するにために使う

```Python:
print("りんご", "バナナ")
>> りんご バナナ
```

↓↓↓↓↓↓↓↓

```Python:
print("りんご", "バナナ", end=" が好きです")
>> りんご バナナ が好きです
```


#end=""は、何を表しているのか？

print関数は、関数終了時に自動的に改行を実行されるようになっているのだが、これを実行させないために用いられる

```Python:
print("りんご")  # 目には見えないが、ここで改行コードも実行されている
print("バナナ")
>> りんご
   バナナ
```
end= ""を指定することで、"何もしない"、を指定したことになり、改行されない

```Python:
print("りんご", end="") # endで、""を指定すると、"何もしない"を表す
print("バナナ")
>> りんごバナナ
```

りんご、と、バナナ、の間に空白も含まれない
指定したい場合は、endオプションで指定する必要がある

```Python:
print("りんご", end=" ")
print("バナナ")
>> りんご バナナ
```
Python＋seleniumを使ってtwitterにログインし、特定ユーザのツイートを抜き出す方法

Pythonを利用してtwitterにログインし、特定ユーザのツイートを抜き出すプログラムを書こうとしています。（下記のプログラムではツイートIDの抜き出しまで）
しかし、下記のプログラムを動かしてもツイートIDがcsvファイルに吐き出されません。
空のcsvファイルができます。

「ログインボタン要素の取得」と「ログインボタンを押下」のコマンド部分をコメントアウトするとなぜかcsvファイルの中にツイートIDが入るようになるのですが、なぜこのような動作になるのか理解できず困っています。
原因に心当たりの方がおられましたら、アドバイスいただけると助かります。
※最終的にtwitterの鍵垢の人のツイートを保存したいので、twitterへのログインは必須だと考えています。

#動作環境
Windows10
Python 3.7.4

```Python
import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys
from bs4 import BeautifulSoup
from time import sleep

driver=webdriver.Chrome("./driver/chromedriver.exe")

# 各種設定
# twitterアカウント
user_id = 'xxxxxxxxxx@test.com'
password = 'xxxxxxxxxx'

# ログインページを開く
driver.get('https://twitter.com/login/')
time.sleep(3)  # 動作止める

#ユーザーid入力フォーム要素の取得
user_box = driver.find_element_by_class_name('js-username-field')
#取得した要素へidを入力
user_box.send_keys(user_id)
sleep(1)
#パスワード入力フォーム要素の取得
password_box = driver.find_element_by_class_name('js-password-field')
#取得した要素へキー入力
password_box.send_keys(password)
sleep(1)
#ログインボタン要素の取得
login_btn = driver.find_element_by_css_selector('button.submit.EdgeButton.EdgeButton--primary.EdgeButtom--medium')
#ログインボタンを押下
login_btn.click()
sleep(1)

driver.get('https://twitter.com/TwitterJP')
soup = driver.page_source
text = BeautifulSoup(soup,'html.parser')

#IDを抜く部分
_id_list = []
for tweet in text.select("div.tweet"):
        _id_list.append(tweet['data-tweet-id'])
#リツイートによる重複を無くす
new_list = list(set(_id_list))


#ファイルに書き込み
f = open ('test_id.txt','a',encoding='utf-8')

for tweet in new_list:
        f.write(tweet+'\n')
f.close()
```
$_って何に使うの?

setの出力をぼんやり眺めていたら"_"が変数になっているのを見つけた。
意味はdashのmanには書いてないがbashのには書いてあり、多分同じ意味だと思われる。

> _
シェルの起動時には、環境または引き数リストで渡された、 実行するシェルまたはシェルスクリプトの絶対パス名が設定されます。 その後では、直前のコマンドに対する最後の引き数 (展開後のもの) に展開されます。 また、実行する各コマンドの完全なパス名が設定され、 そのコマンドの環境にエクスポートされます。 メールをチェックするときには、 このパラメータは現在チェックしているメールファイル名を保持します。

最後に実行したコマンドの最後の引数だと思っておく。

## 何に使うの?

端末上のコピペを減らせる、くらいしか見つからなかった。

```
$ mkdir tmp
$ cd $_
$ cp ../tmpfile ./tmpfile_cp
$ vim $_
```
微妙すぎる。

## readの参照しない変数名に使ってみる

どうせ参照しないのでなんでも良いのに、参照しないことが分からないとならず、
名前を与えると無意味に場所を取る。こういう変数は"_"にすると、スッキリするかもしれない。

```bash
... | while read dummy1 dummy2 field3 dummies ; do
# 読みづらい

... | while read _ _ field3 _ ; do
# スッキリ
```
参照しようとしてもできない。

```
$ echo a | { read _; echo $_; }
_
```


なお、bashのmanには以下の記載があるため、代入はしないほうが良いのかもしれない。

> シェルはいくつかのパラメータを特別扱いします。 このようなパラメータは参照されるだけであり、 値を代入することは許されません。
electron-vueボイラープレートで作成したプロジェクトでビルドができなかった

[Vue CLI + electron-vue でプロジェクト立ち上げ](https://qiita.com/y4shiro/items/d6813d6d6b1e6c9e158d)に沿って作成したプロジェクトでビルドができませんでした。

webpack.renderrer.config.jsの`babble-webpack-plugin`を読み込まないように設定したらビルドできるようになりました。
OpenWRTインストール中

#OpenWRT インストール中

初代Raspberry Pi君、Raspbian OSだとよく固まるのが悩みのたね。スマホ中毒の同居人専用のAPを立ち上げるか考えていたところでもあるので、導入してみた。

##インストール手順

簡単です。本家からダウンロードして、SDカードに焼くだけ。

###本体のダウンロード

https://openwrt.org/toh/views/toh_fwdownload?datasrt=model&dataflt%5BBrand%2A~%5D=raspberry

[ここから](https://openwrt.org/toh/views/toh_fwdownload?datasrt=model&dataflt%5BBrand%2A~%5D=raspberry)、初代のイメージをダウンロード

###SDカードへの書き込み

ダウンロードしたファイルをSDに書き込む

```
$ gunzip -c openwrt-xx.xx.x-brcm2708-bcm2708-rpi-ext4-factory.img.gz | sudo dd of=/dev/sdc bs=4M status=progress
```

##セットアップ

### ipアドレスの変更

デフォルトでは、192.168.1.1なので、お気に召さない場合は、変更が必要
また、入れたバージョン(18.04)では、gateway/dnsの設定が記載されていなかったので、それも追記

```/etc/config/network
- option ipaddr '192.168.1.1'
+ option ipaddr '192.168.0.10'
+ option gateway '192.168.0.1'
+ option dns'192.168.0.1'
```

### ドライバのインストール

うちのは、RL8192CUなので、kmod-rtl8192cuをインストール

```
# opkg update
# opkg install kmod-rtl8192cu
```

ifconfig -aで確認して、wlan0が出てくればOK


### wlan0の設定

https://openwrt.org/docs/guide-user/network/wifi/bridgedap
[公式](https://openwrt.org/docs/guide-user/network/wifi/bridgedap)におおよそ書いてあるので、それに従えばOK

```/etc/config/wireless
# diff wireless.org wireless
4c4
< 	option channel '11'
---
> 	option channel '1'
7,8c7,9
< 	option htmode 'HT20'
< 	option disabled '1'
---
> 	option htmode 'NOHT'
>       option txpower '1'    <--とある部屋のみ電波を飛ばしたいのでMin Power
> 	option disabled '0'   <--これ重要!! デフォルトは'1'。これだと動かない(disabled)
14,15c15,17
< 	option encryption 'none'
---
> 	option encryption 'psk2'
>       option key 'ABCD012345'
```

これで、rebootすれば、動いてます。


### luciアクセス

設定したipアドレスに、ブラウザでアクセス
id/pwは、cliアクセスと同じ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213097/0513ba0a-3e04-3103-daab-5cae1d752d48.png)
【vue.js】 モーダルウィンドウ(modal window)でspotifyの埋め込みプレーヤーを表示する

実装過程のメモ。

## やったこと

次のようなレコードのジャケットを表示する画面で、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339446/fd4ac3cc-7fb8-2fcc-784d-f9f9359889be.png)

ジャケット画像をクリックして、次の画像のようにモーダルウィンドウにspotify埋め込みプレーヤを表示した。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339446/36486b17-69e5-c719-2620-9dc032e3c857.png)


## ソース

htmlは次の通り設定。

インスタンス変数`@releases`をeachで回している。

`release.title`
→アルバムのタイトル
`release.image`
→ジャケ画像

`release.embed_link`とすると、次のようなspotifyの埋め込みタグを出力するよう設定している。
→`https://open.spotify.com/embed/album/6dURCAepMUP97AwHLnxdSu`

```erb:index.html.erb
    <div class="contents" id="app">
      <% @releases.each do |release| %>
        <div class="content">
          <img v-on:click="openModal" src="<%= release.image %>" alt="［写真］" class="content-image">
          <p><%= release.title %></p>
          <p><%= release.artists.first.name %><p>
          <div id="overlay" v-show="showContent" v-on:click="closeModal">
              <div id="show-player" >
                <iframe v-show="showContent" src="<%= release.embed_link %>" 
                width="310" height="200" frameborder="0" allowtransparency="true" allow="encrypted-media" class="content-player" ></iframe>
              </div>
          </div>
        </div>
      <% end %>
      <%= javascript_pack_tag 'index' %>
    </div>
```

vueの設定は次の通り

`v-show="showContent"`がtrueの場合に埋め込みプレーヤが表示されるように設定したいので、
初期状態では`showContent: false`としている。

`v-on:click="openModal"`でopenModalメソッドを実行する。

```js:index.js
import Vue from 'vue/dist/vue.esm'
import App from '../app.vue'

document.addEventListener('DOMContentLoaded', () => {
  const app = new Vue({
    el: '#app',
    data: {
      showContent: false
    },
    methods:{
      openModal: function(){
        this.showContent = true
      },
      closeModal: function(){
        this.showContent = false
      }
    }
  })
})
```

cssは次の通り

```css
#overlay{
    /*　要素を重ねた時の順番　*/
    z-index:1;
  
    /*　画面全体を覆う設定　*/
    position:fixed;
    top:0;
    left:0;
    width:100%;
    height:100%;
    background-color:rgba(0,0,0,0.5);
  
    /*　画面の中央に要素を表示させる設定　*/
    display: flex;
    align-items: center;
    justify-content: center;
  
  }

  #show-player{
    z-index:2;
    width:50%;
    padding: 1em;
    background:#fff;
  }
```

おわり
シェルスクリプトでフォルダ構造からhtml、css、jsファイル作成、git連携まで一発で作成する

## はじめに
シェルスクリプトはターミナルコマンド（Unixコマンド）をまとめたコマンドのこと。

## 【例】シェルスクリプトとはどんなものか？
そもそもは**ターミナルコマンド(Unixコマンド)**をまとめたプログラムです。
試しに以下に、非常にシンプルな文字を出力するだけのシェルスクリプトを書きます。

デスクトップに新規ファイル「**trial.sh**」を作成しましょう。

```powershell:trial.sh
#!/bin/sh
　　　
echo "Hello, CodeShip!"
```

`#!/bin/sh`はシェルスクリプトの冒頭に書く約束になっています。
`echo`は画面に文字を表示させるコマンドです。

作成した**trial.sh**ファイルを保存して、ターミナルで以下を入力します。
また**shファイルは初期状態では実行ができない**よう設定されているので、**chmodコマンドで実行許可**を与えます。

```terminal:設定変更
$ cd ~/Desktop/ #デスクトップに移動
$ chmod 755 trial.sh #実行許可を与える
$ ./trial.sh #実行
```
```terminal:結果
terminal
Hello, CodeShip!
```
という風になります。
<br>

## シェルスクリプトを使うとこんなことができる。一連のコマンド入力を一発入力。
例えば「**ちょっとWebサイトのソースを書きたいな**」と思った時に、

「*HTML, CSS, JavaScriptをしまうフォルダを作って、新しいindex.htmlを作って その中にCSS, JSフォルダを作って、それぞれ中にstyle.cssとmain.jsを作って、gitも使うことにして…*」

という決まり切ったファイル・フォルダ作成の手順をこなすことはよくあると思います。
これを一瞬で実装してくれるコマンドを実装します。

新規ファイル「**mkfiles.sh**」を作成します。
中身のコードはこんな感じです。

```powershell:mkfiles.sh
#!/bin/sh

mkdir $1
cd $1
touch index.html
mkdir css js
touch css/style.css js/main.js
code . 
git init 
git add .
git commit -m "最初のコミット"
```

### コマンドの解説

```powershell:コマンドの解説
mkdir $1
cd $1
# 省略
mkdir css js
```

`mkdir`は今いる場所に**ディレクトリ(フォルダ)を作成**するコマンドです。
`cd`が**ディレクトリに移動**するコマンドなので、作成したディレクトリの中に入ることになります。
`$1`には**コマンドライン引数**が入り、呼び出すときに与えた文字が代入されます。
あとで呼び出すときに確認しましょう。
さらにその中でもcss, jsフォルダを作成していますね。

```powershell:css,jsフォルダを作成
touch index.html
# 省略
touch css/style.css js/main.js
```
`touchは`ファイルの最終処理日時を更新するコマンドですが、存在しないファイル名を打つとファイルを新規作成できます。
コマンドから`index.html`を作成しました。
また`css/style.css`のように、フォルダの中にファイルを直接作成もできます。

```powershell
code . 
```

`code`でVSCodeをターミナルから直接開けます。
`code .`コマンドは今いるディレクトリをプロジェクトとしてVSCodeを開きます。
ただし事前にVSCodeを開いてこのコマンドをインストールしておく必要があります。

**1. Command + Shift + Pでコマンドパレットを開く**
**2. “Shell”で検索**
**3. Shell Command: Install ‘code’ command in PATHを選択した状態でEnterでインストール**

```powershell:gitも使えるように
git init 
git add .
git commit -m "最初のコミット"
```

ついでにディレクトリ内で`git`を使えるようにしておきました。
必須ではないですね。
先ほどと同様に実行してみましょう。

```powershell:実行する
$ chmod 755 mkfiles.sh
$ ./mkfiles.sh myapp
```

実行するとき、作るディレクトリ名に`myapp`が`$1`に代入されます。
`myapp`ディレクトリが`mkdir`され、そこに`cd`します。
以下のようなファイル構造が出来上がっていて、
VSCodeが`myapp`をプロジェクトとして起動していたら成功です！

```Desktop:デスクトップ
- myapp 
    - index.html
    - css
        - style.css
    - js 
          - main.js
```

シェルスクリプトはこのようの使うことができます！
ご参考までに！

## まとめ
ここまで書いておいて特に必須というわけではありませんが、普段よく使う操作コマンドだったりディレクトリやファイルの作成などの一連の作業を、このようにおシェルスクリプトで組んでおくと非常に楽です。

もし興味がある方はぜひ小さなライフハックを。

## 参考
この記事は「CodeShip」内での実際の質疑応答や指導・アドバイスの一部を基に作成しています。
Sprockets::Railtie::ManifestNeededError:　発生時の原因と対策

#Sprocketsエラー
Railsの学習中に、「Sprockets::Railtie::ManifestNeededError:」というエラーが発生してしまいました。
そこで、発生原因などを確認するとともに改善した方法を以下に記載します。

##発生原因
事象：Gemファイル内、「Sprockets」が正常に機能していない。
原因：先日、Sprocketsのverが「4.00」に更新されていたのに対して、当方が使用していたverは「3.7.2]。

###解決方法
-Rails Gemファイル内に以下を追記。

```:terminal
gem "sprockets", "3.7.2"
→bundle update "sprockets"
→bundle install
```
＊今回は強制的に過去の対応しているVerに変更したことで問題解決いたしました。

####そもそもsprocketsとは。。
-Rails 3.1 から導入された gem 。
 主な機能は以下の通りで、基本的にはアセットファイルを効率的に動かすためのものです。
 ・アセットファイルのパス管理
 ・アセットファイルの結合・圧縮
 ・アセットファイルの依存関係の解決
 ・アセットファイルのコンパイル
　＊あってもなくても問題はないそうですが、効率的に機能させるためには使用した方が良いようです。

以上となります。最後までご覧いただき、ありがとうございました！
今後も学習した事項に関してQiitaに投稿していきますので、よろしくお願いします！
記述に何か誤りなどございましたら、お手数ですが、ご連絡いただけますと幸いです。
仙台CTF2017 [ForX] FAT32フォーマット日時 300

#問題

http://sendaictf.ddns.net/2017/challenges

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/c1be25e9-3258-0550-2c0f-87bbebc872b4.png)

#解いてみた

問題のファイルにはディスクイメージが入っていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/87c97a7d-0675-e131-d619-f4faea17fed9.png)

FTK Imagerを使用してマウントしてみます。

たぶんフォーマットしたときにできる「System Volume Information」の作成日時を答えればいいと思うんですよね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/536cb63f-aee6-5468-dcfc-58008eddd7ac.png)

[仙台CTF2017 [For01] USBメモリの感染日時 100](https://qiita.com/CTFman/items/720ef8caa3e562e84d0e)
と同じ理由で日本時間で保存されているので、変換する必要はありません。
ということでそのまま表示されているものが正解。
password_verify() パスワード検証　ハッシュ化しないと検証できなかった

ログインフォームの制作時の検証について
送信したユーザ名とパスワードをデーターベースから取得し、password_verify()で比較検証したときに
var_dump()で中身を確認し$row['password'] と$submitted_passwordの中身はstring(6)"dog123"だったがtrueにならなかった

            
            //これはサブミットされたパスワードが一致した場合にのみtrueに設定される
            $password_ok = false;

            $input['username'] = $_POST['username'] ?? '';
            $submitted_password = $_POST['password'] ?? '';

            $stmt = $db->prepare('SELECT password FROM users WHERE username = ?');
            $stmt->bindValue(1, $input['username']);
            $stmt->execute();
            $row = $stmt->fetch();
            
            if ($row) {
                //password_verify()で比較する中身
                var_dump($submitted_password, $row['password']);
                //ハッシュ化しないとパスワードが検証できない；
                $password_ok = password_verify($submitted_password, $row['password']);
            }
            
            //passwordが検証の結果一致しなかった時errorsにメッセージを挿入
            if (!$password_ok) {
                $errors[] = 'Please enter a valid username and password.';
            }

            return array($errors, $input);
        }

ハッシュ化していないときのパスワードでログインしようとしたときの中身

![pass1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344367/ac6fa6ef-5243-db26-e082-2dd7e621f095.png)





ハッシュ化したときのコード






            //これはサブミットされたパスワードが一致した場合にのみtrueに設定される
            $password_ok = false;

            $input['username'] = $_POST['username'] ?? '';
            $submitted_password = $_POST['password'] ?? '';

            $stmt = $db->prepare('SELECT password FROM users WHERE username = ?');
            $stmt->bindValue(1, $input['username']);
            $stmt->execute();
            $row = $stmt->fetch();
            
            //passwordをここでハッシュ化してみた
            $data = password_hash($row['password'], PASSWORD_DEFAULT);

            //行がなければ、ユーザ名はどの行とも一致していない
            if ($data) {
                //password_verify()で比較する中身
                var_dump($submitted_password, $data);
                print '<br>';
                //ハッシュ化パスワードと送信されたパスワード検証
                $password_ok = password_verify($submitted_password, $data);
            }

            //passwordが検証の結果一致しなかった時errorsにメッセージを挿入
            if (!$password_ok) {
                $errors[] = 'Please enter a valid username and password.';
            }

            return array($errors, $input);
        }
ハッシュ化したパスワードでログインしたときの中身
![pass1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344367/fc7f35de-f6fe-dc77-fefc-5c4fcbcbe7fa.png)

ログイン機能が動作し"Welcom,alice"と表示された
https://www.php.net/manual/ja/function.password-verify.php
を確認するとpassword_verify — パスワードがハッシュにマッチするかどうかを調べるとなっていた
仙台CTF2017 [For03] 不審プログラムの起動日時 100

#問題

http://sendaictf.ddns.net/2017/challenges

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/5fadc14d-de93-4396-a066-1d560a259a2a.png)

#解いてみた

問題のファイルを見るとPrefetchがあったので、これを解析してみます。
WinPrefetchViewを使います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/10259b3c-f228-6232-575a-b09f39f5fe28.png)

9164.EXEが2か所から実行されていますが、時間の古い方が正解でした。
これを日本時間で回答する必要がありますが、
[仙台CTF2017 [For01] USBメモリの感染日時 100](https://qiita.com/CTFman/items/720ef8caa3e562e84d0e)
の問題と同様、日本時間のまま記録されているので変換は不要でした。
Pythonの返り値での "*_ " の意味

恥ずかしながら返り値を受け取るところでスターを使えることを知らなかったので…

```Python
*a, b = list(range(5))
print(a)
# -> [0, 1, 2, 3]
print(b)
# -> [4]
```

つまり，返り値（戻り値）を受け取る変数の冒頭に\*（star演算子，アスタリスク）をつけるとその変数はリストになり，可変長個の返り値を受け取れる．`*_` は捨てる返り値を可変長個受け取るという意味のことが多いだろう．
Sparkを学ぶのに参考にしたリンク集

## はじめに

最近Sparkについて勉強していて、その際にお世話になったリンクをまとめました。
まだまだ勉強中の身なので、「この記事・ブログ・動画もわかりやすいよ。」というものがございましたら、コメントにて教えていただけるとありがたいです。


## Qiitaの記事

**Apache Spark で分散処理入門**
**https://qiita.com/Hiroki11x/items/4f5129094da4c91955bc**

- Apache Sparkとは
- RDDの仕組み
- ライブラリについて
- 実際に動かしてみる


**Spark DataframeのSample Code集**
**https://qiita.com/taka4sato/items/4ab2cf9e941599f1c0ca**

Pythonを用いたDataFrameの作成から操作までがまとまっています。

- DataFrameの作成
- SQL文でQuery
- filter, selectで条件付き検索
- groupByで集計
- DataFrameの操作


## 公式ドキュメント

**Apache Spark Documentation**
**https://spark.apache.org/documentation.html**

今は全然読めていませんが、これから先はドキュメントを読んでいくことになるんだろうなと思っています。

**日本語版ドキュメント**
**http://mogile.web.fc2.com/spark/index.html**

一部ページは404になっています。


## YouTube動画

「Spark」で検索して、いくつか出てきた動画の中で参考にした動画です。
字幕機能が本当にありがたい。また、この字幕ですが**ドラッグで移動できる**(今まで知らなかった)ので、動画に応じて邪魔にならない場所に移動させて視聴できます。


### Learning Journal

字幕があって説明も比較的ゆっくりなので、英語が苦手な私でもどうにか全て視聴することができました。(全部理解したとはとても言えませんが)

**Apache Spark - 01 - Setup your environment**
**https://www.youtube.com/watch?v=AYZCpxYVxH4**

- LinuxマシンへApache Sparkをダウンロード・インストール
- Spark Shell(Scala)からSparkへのアクセス
- PySparkからSparkへのアクセス
- Jupyter NoteBookのインストール
- Apache Toreeのインストール・設定
- Jupyter Notebook(Scala, Python, Spark SQL)からSparkにアクセス


**Apache Spark - 02 - Introduction**
**https://www.youtube.com/watch?v=_piYXmAXHW8**

- What is Apache Spark？
- Apache Sparkエコシステムについて
- Why Spark?

**Apache Spark - 03 - Architecture - Part 1**
**https://www.youtube.com/watch?v=vJ0eUZxF80s**

- クラスター上でSparkはプログラムをどのように実行するか？
    - Driver
    - Executors
- Who executes Where？
    - Client Mode
    - Cluster Mode
- SparkはDriverとExecutorsのリソースをどのように取得するか？
    - Client Mode
    - Cluster Mode
    - Local Mode
- デモ

**Apache Spark - 04 - Architecture - Part 2**
**https://www.youtube.com/watch?v=fyTiJLKEzME**

- RDDについて
    - Transformations
    - Actions

**Spark Tutorial - Introduction to Dataframes**
**https://www.youtube.com/watch?v=REg1ACa47Q8**

- Apache Spark APIドキュメントについて
- Scala, PythonでのDataFrameの基本的な操作について

**Spark Tutorials - Spark Dataframe | Deep dive**
**https://www.youtube.com/watch?v=PUSuU2OrfCc**

- DataFrame Transformations
- Typed and Untyped Transformations
- Example Transformations(select, groupBy, agg)
- Spark UDF
- Spark Execution plans and the Optimizations

**Spark Tutorial - SQL over dataframes**
**https://www.youtube.com/watch?v=1IoMlAMOPzM**

- Spark DataFrame Schema
- Spark SQL over Spark DataFrame

### その他Youtube動画

**Intro to Apache Spark for Java and Scala Developers - Ted Malaska (Cloudera)**
**https://www.youtube.com/watch?v=x8xXXqvhZq8**

- OSCON 2016のセッションの一つ
    - https://conferences.oreilly.com/oscon/oscon-tx-2016/public/schedule/detail/47303
- 内容
    - Learning to Code
    - Distributed Programing
    - RDD
    - DAG
    - Flume Java
    - Long Lived Applications
    - Managing Parallelism