【VBA】入力された文字列でフィルタをかける

シンプルだけど使いそうだからメモ。

以下のような場合、B1セルに入れられた材料名に対してフィルタをかけたい。

f:id:saneeeatsu:20180417174057p:plain

Sub make_filter()
    Dim str_target As String
    Dim int_target As Integer
    
    str_target = Range("B1").Value
    Selection.AutoFilter
    
    int_target = Cells.Find(What:=str_target).Column - 1

    ActiveSheet.Range("$B$4:$E$9").AutoFilter Field:=int_target, Criteria1:="<>"
End Sub

「〇」をフィルタリングする方法がわからなかったけど、マクロを記録すると「Criteria1:="<>"」で取れるっぽい。

f:id:saneeeatsu:20180417174209p:plain

いろいろなツールでAWSにSSH接続する(WinSCP、MySQL Workbench、CloudBerry)

仕事でAWSを使う際にいろいろとDB周りの接続やらが必要だったけど、
用語に対する理解も曖昧だった部分もあったし、
調べながらやったのでメモしておく。

AWSについての基礎はここを読んでおく。超わかりやすかった。
(下準備編)世界一丁寧なAWS解説。EC2を利用して、RailsアプリをAWSにあげるまで - Qiita


固定IPの取得・設定

インターリンクで取得し、以下のヘルプサイトを見ながら設定を行った。
Windows 10の設定 ■マイIP ソフトイーサー版■

固定IPアドレスは英語でFixed IP Addressなのか。
Staticではないのかな?
固定IPアドレス ‐ 通信用語の基礎知識


ポート番号

よく出る番号は22、80、443、7000。それぞれ何が違うのかよくわかってなかったので調べた。
【3分で把握】ポート番号とは?と代表的なポート番号まとめ


AWS上で穴あけを行う

既にAWS上で動いているWebアプリケーションにアクセスしようにも、WinSCPMySQL WorkbenchやCloudBerry経由でDBアクセスしようにもまずAWS上で穴あけを行わなくてはならない。つまりセキュリティグループのインバウンドルールに対して固定IPを設定していく。

「EC2 > セキュリティグループ > グループ選択 > インバウンド > 編集 > ルールの追加」で設定しようと思いきや、「送信元は CIDR ブロックまたはセキュリティグループ ID にする必要があります。」とのエラー文が。
IPアドレスの後ろに「/32」をつけて解決!
参考:AWSのEC2のセキュリティのインバウンドのルールでIPを設定する場合は/32をつける - Qiita

インバウンドルール:どんな通信が来たら許可するのか
CIDRブロックVPCが使用できるIPの範囲のこと(10.0.0.0/28(16IPアドレス) ~ 10.0.0.0/16(65,536IPアドレス)まで選択可能)。


PuTTY

ここからダウンロード。
基本的に下の参考にしたサイトの方法で出来たけど、どうやらPCを再起動した後に接続しなおす場合は、ppkファイルをpageant.exeに再度ドラック&ドロップして秘密鍵を登録しなおす必要がある。

・確認方法
Windowsの右下のインジケータ(バッテリーのアイコンの横などにある上矢印のアイコン)をクリック
pageant.exeと同じアイコンを右クリック
→Views Keyをクリック

踏み台サーバを使ってサーバにアクセスする場合の設定方法は以下。

・カテゴリ > セッション > 接続先の指定

ホスト名 踏み台サーバーのElasticIP

他はデフォルトでOK。

・カテゴリ > 接続 > SSH

サーバに送られるデータ ssh 最終的な接続先のプライベートIP(ssh 170.20.20.20)

他はデフォルトでOK。


参考:PuTTYでプライベートなAmazon Linuxサーバへ多段ログインしてみた | Developers.IO


Cloud Berry

ここからダウンロード。

左上の「File > New Amazon S3 Account」を押下。

名前表示 任意の表示名
Access key AWS IAMでユーザを追加したときのアクセスキー
Secret key AWS IAMでユーザを追加したときのシークレットキー

OKを押下。
タブに「My Computer →(名前表示で設定した表示名)」となっていることを確認。
あとは「Source:」を切り替えて表示する内容を自由に変更させる。


WinSCPで多段接続

ここからダウンロード。

・Session

Host name 最終的な接続先のプライベートIP
User name ユーザー名

・Advanced...(Passwordの下) > Connection > Tunnel

Host name 踏み台サーバーのElasticIP
Port number 22
User name ユーザ名(Sessionと同じ)
Private key file 秘密鍵のファイル(.ppk)

OKを押下し、初めの画面に遷移しSaveを押してLogin。
新しく接続させる場合は「New Session」タブを押す。

参考:AWSの仮想マシンにWinSCPでの接続 - ts0818のブログ


MySQL Workbench

ここからダウンロード。

MySQL Connectionsの右側の+アイコンを押す。

Connection Name 任意の名前

・Connectionタブ

Connection Method Standard TCP/IP overSSH

・Parametersタブ

SSH Hostname Elastic IP:22 (13.100.100.100:22)
SSH Username ユーザー名
SSH Password -
SSH Key File 秘密鍵のファイル(.ppk)
MySQL Hostname ~~~.rds.amazonaws.com
MySQL Server Port 3306
Username ユーザー名

「:22」を付けてなくて嵌った。

参考:MySQL WorkbenchからRDSに接続する | ヤマムギ

コマンドプロンプトからファイルを開くWindowsのstartコマンド(=Macのopenコマンド)

最近、Win10をシャットダウンせずに何日か使用していると、エクスプローラーなどを立ち上げたときにファイル名などが全て白色になってしまい表示できなくなる。

解決策としては再起動するしかわからないけれど、どうしても今ファイルを見たいって時がある。
けど、ファイル名は見れない。
ってことでコマンドプロンプトから開くしかないかなと思ってコマンドを調べた。

MacのopenのようなコマンドがWindowsでもある。
コマンドプロンプトで、

> start hoge.pdf
> start /? 

これで関連付けられたアプリケーションで開いてくれる。
「start /?」は要するにhelpだけど、Powershellでは効かなかった。

sekika.github.io

Windowsでファイル内の文字を検索する

エクスプローラーの検索窓だとひっかからないものがあったりするのでコマンドプロンプトを使う。

「foldername」以下で「HOGE」という文字を探しして出力結果を「findhoge.txt」に吐き出す場合。

> findstr /s /i "HOGE" foldername/* > findhoge.txt
コマンド 説明
/s サブディレクトリを検索する
/i 検索文字列の大文字・小文字を区別しない(デフォルトは区別する)
/x 完全一致する文字のみ取得(デフォルトは部分一致)
/n 行番号を表示(デフォルトは非表示)

参考:
Windowsでファイルから文字列検索するコマンド、findstr - Qiita
findstrコマンドで覚えておきたい使い方8個 | 俺的備忘録 〜なんかいろいろ〜

言語処理100本ノック with Python【第3章】

No 日付 学んだこと
20 4/13 jsongzip
21 4/14 正規表現、re、raise
22 4/16 正規表現

www.cl.ecei.tohoku.ac.jp



第3章: 正規表現

Wikipediaのページのマークアップ記述に正規表現を適用することで,様々な情報・知識を取り出します.

20. JSONデータの読み込み

Wikipedia記事のJSONファイルを読み込み,「イギリス」に関する記事本文を表示せよ.問題21-29では,ここで抽出した記事本文に対して実行せよ.

1行に1記事の情報がJSON形式で格納されるので、2章のように1行読み込んでifで判定させる。

解法

import gzip
import json
fname = 'jawiki-country.json.gz'

with gzip.open(fname, 'rt', encoding="utf-8_sig") as jsonfile:
    for line in jsonfile:
        l = json.loads(line)
        if l['title'] == 'イギリス':
            print(l['text'])
            break

以下のように内包表記を使って書こうと思ったけどエラーが出てしまって無理だった。。
44行目を参考にifではなくwhileを使用してみた。
もしPythonの内包表記に終了条件が指定できたら · GitHub

result = [json.loads(line) for line in jsonfile while json.loads(line) != 'イギリス']
json
# 基本的な使い方
import json
fname = open('sample.json')

print (json.load(fname))

・ファイルの入出力(ファイル ⇔ Pythonオブジェクト)

load() JSON形式のファイルを読み込んでPythonオブジェクトへ
読み込んだJSONファイルは辞書型で保存される
dump() PythonオブジェクトをJSON形式でファイルに書き込み
こっちは文字列型で保存される

・オブジェクトの変換(文字列 ⇔ Pythonオブジェクト)

loads() JSON文字列からPythonオブジェクトへ変換(デコード)
dumps() PythonオブジェクトからJSON文字列へ変換(エンコード

19.2. json — JSON エンコーダおよびデコーダ — Python 3.6.5 ドキュメント

gzip
gzip.open(filename, mode='rb', compresslevel=9, encoding=None, errors=None, newline=None)

'rt'はread + text
13.2. gzip — gzip ファイルのサポート — Python 3.6.5 ドキュメント

gzという拡張子は見慣れなかったけど圧縮形式の一つで「GNU zip」の略らしい。
gunzipコマンドで解凍可能。




21. カテゴリ名を含む行を抽出

記事中でカテゴリ名を宣言している行を抽出せよ.

素人の言語処理100本ノック:21 - Qiita
参考のQiita記事ではraiseを使った処理を書いているけどtry-exceptとの違いがわかってないのでメモる。

import gzip
import json
import re
fname = 'jawiki-country.json.gz'

def get_UK_article():
    with gzip.open(fname, 'rt') as jsonfile:
        for line in jsonfile:
            line_json = json.loads(line)
            if line_json['title'] == 'イギリス':
                return line_json['text']

    raise ValueError('Not Found Article.')


# 正規表現のコンパイル
pattern = re.compile(r'^(.*\[\[Category:.*\]\].*)$', re.MULTILINE + re.VERBOSE)

# 抽出
result = pattern.findall(get_UK_article())

for line in result:
    print(line)

# [[Category:イギリス|*]]
# [[Category:英連邦王国|*]]
# [[Category:G8加盟国]]
# [[Category:欧州連合加盟国]]
# [[Category:海洋国家]]
# [[Category:君主国]]
# [[Category:島国|くれいとふりてん]]
# [[Category:1801年に設立された州・地域]]
正規表現
メタ文字 説明 使用例
. 任意の一文字 a.c
^ 文字列の先頭 ^abc
$ 文字列の末尾 abc$
* 0回以上の繰り返し ab*
+ 1回以上の繰り返し ab+
? 0回または1回 ab?
.* 任意の文字0文字以上
.*? 任意の文字0文字以上、非貪欲マッチ 貪欲だと後半の"l"で始まる装飾を巻き込んでしまう

Pythonの正規表現の基本的な使い方 | UX MILK

re
raise

22. カテゴリ名の抽出

記事のカテゴリ名を(行単位ではなく名前で)抽出せよ.

素人の言語処理100本ノック:22 - Qiita

import gzip
import json
import re
fname = 'jawiki-country.json.gz'

def get_UK_article():
    with gzip.open(fname, 'rt', encoding="utf-8_sig") as jsonfile:
        for line in jsonfile:
            line_json = json.loads(line)
            if line_json['title'] == 'イギリス':
                return line_json['text']

    raise ValueError('Not Found Article.')

pattern = re.compile(r'^.*\[\[Category:(.*?)(?:\|.*)?\]\].*$', re.MULTILINE + re.VERBOSE)

result = pattern.findall(get_UK_article())

for line in result:
    print(line)

# イギリス
# 英連邦王国
# G8加盟国
# 欧州連合加盟国
# 海洋国家
# 君主国
# 島国
# 1801年に設立された州・地域

23. セクション構造

記事中に含まれるセクション名とそのレベル(例えば"== セクション名 =="なら1)を表示せよ.

素人の言語処理100本ノック:23 - Qiita

# 23
import gzip
import json
import re
fname = 'jawiki-country.json.gz'

def get_UK_article():
    with gzip.open(fname, 'rt', encoding="utf-8_sig") as jsonfile:
        for line in jsonfile:
            line_json = json.loads(line)
            if line_json['title'] == 'イギリス':
                return line_json['text']

    raise ValueError('Not Found Article.')

pattern = re.compile(r'^(={2,})\s*(.+?)\s*\1.*$', re.MULTILINE + re.VERBOSE)

# 抽出
result = pattern.findall(get_UK_article())

# 結果表示
for line in result:
    level = len(line[0]) - 1
    print('{indent}{sect}({level})'.format(
        indent='\t' * (level - 1), sect=line[1], level=level))
    
# 国名(1)
# 歴史(1)
# 地理(1)
# 	気候(2)
# 政治(1)
# 外交と軍事(1)
# 地方行政区分(1)
# 	主要都市(2)
# :
# :

24. ファイル参照の抽出

記事から参照されているメディアファイルをすべて抜き出せ.

素人の言語処理100本ノック:24 - Qiita


SQL(Oracle)で「NOT IN」が効かないときの対処方法

NOT INを使っても期待した結果が返ってこない

久々にSQL書いたら軽くはまったのでメモ。


COLUMN_NAME列には基本的にはnull、HOGEの2つしか入っていない。
HOGE」が入っていない行を取り出したいので以下のようにした。

SELECT *
FROM TABEL_NAME
WHERE COLUMN_NAME NOT IN 'HOGE'
SELECT *
FROM TABEL_NAME
WHERE COLUMN_NAME <> 'HOGE'

これを実行すると本来COLUMN_NAME 列に「HOGE」がない(nullが入っている)行が出てきてほしいが、どちらも何も出てこない。
どうやら「COLUMN_NAME 」にnullがある場合、これは機能しないらしい(上司談)。


ということで逆にNULLだけを取り出してみる。

SELECT *
FROM TABEL_NAME
WHERE COLUMN_NAME IS NULL

まぁ、これはうまくいく。


う~ん。基本的にはnullとHOGEしか入らないはずだけど今後何かしらの変更があったら…と思って変えてみた。

SELECT *
FROM TABEL_NAME
WHERE (COLUMN_NAME IS NULL OR COLUMN_NAME <> 'HOGE')

これだとFUGAとかが入っていても「COLUMN_NAME <> 'HOGE'」の方で引っかかるのかな?




ところで、OracleではNULLと空白は同じ扱いだそうだ。
SQLの観点から「Oracle Database」「PostgreSQL」「MySQL」の特徴を整理しよう! | アシスト

Pythonではじめる機械学習【2章(2.1-2.2)】

Chapter 日付
2-1 4/5
2-2 4/6

2.1 クラス分類と回帰

・教師あり機械学習は以下の2つに大別できる
  ・クラス分類(classification)
     ・2クラス分類(binary classification)    →メールのスパム判定
     ・多クラス分類(multiclass classification)  →1章のアイリスの品種判定
  ・回帰(regression)  →連続地の予測。学歴、年齢、住所から年収を予測
      回帰は「量」を予測する。

 2つの差は出力に対して連続性があるかどうか


2.2 汎化、過剰適合、適合不足

汎化(generalize)
モデルが未見のデータに対して正確に予測出来ている場合、訓練セットを用いてテストセットに対して汎化できている、という。
訓練、テストセットに共通した性質を持っていても汎化できていない場合がある
→モデルが複雑すぎる場合、訓練データに大してはいくらでも正確な予測が出来るようになってしまう!(具体例は参考書で)


過剰適合(overfitting)
 持っている情報の量に比べて過度に複雑なモデルを作ってしまうこと。
 訓練セットの小尾kの特徴にモデルを手企業しすぎると発生する。汎化できないモデルになるので注意!
適合不足(underfitting)
 逆に単純すぎるモデルを作ってしまうこと。


適切なモデルの複雑さであるスイートスポットを見つけよう!


・モデルの複雑さは、訓練データセットのバリエーションに左右される。
・バリエーション豊富だと過剰適合を起こさずに複雑なモデルを作成出来る。
・単純にデータポイントが増えればバリエーションも増えるので、より複雑なモデルが出来るが似ているものを集めてもダメ。
・教師あり学習では、より多くのデータを用い、適度に複雑なモデルを用いると驚くほどにうまくいく場合があるので、場合によってはモデルをどうにかするよか、データを増やすことが大切だったりもする。