RickBlog

恩返し

VBAと100時間向き合って気づいたこと

VBAは、「Visual Basic for Applications」の略で、MicrosoftMS Office拡張機能として提供しているプログラミング言語

VBAでのツール作成に費やした100時間で、学んだことや思ったことについて書く。

  • Option Explicitを使うと、変数を必ず宣言しないといけなくなる
  • 処理の前に
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    Application.Calculation = xlCalculationManual
    処理の後に
    Application.ScreenUpdating = True
    Application.EnableEvents = True
    Application.Calculation = xlCalculationAutomatic
    を書けば処理が早くなることが多い
  • 処理を早くしたければselectを使わない
    (例)
    Range("A1").Copy Range("B1")
    A1をB1にコピー
  • Withを使うことによってコードを簡略化できる

  • フィルターの絞り込みを複数条件でやりたい場合は配列を使う

  • 文字の結合は「&」ではなくjoinを使ったほうが圧倒的に処理が早い
  • 他人のコードが読めない場合はデバッグで1行ずつ見てみる
  • 1から作ることができない場合は、「マクロの記録」でやりたいことをやってみて、生成されたコードをリファクタリングする

結論 

調べれば、作れる。

調べればだいたいのものがそこそこのクオリティで作れるという自信がついた。
0.5秒かかっている処理を0.1秒に縮める(そこそこではなく、極限まで処理を早くする)、みたいなことは難しいと思った。

動画のツイート情報の取得(Twitter gem)[m3u8&ts]

Twitter 6.2.0を使って、m3u8とtsの情報を取得する方法の備忘録。

VideoInfoVariantクラスを使う。

#(例)
client.user_timeline(params[:name],{count: 3}).each do |timeline|
  client.status(timeline.id).media[0].video_info.variants
end

(取得される情報)

[#<Twitter::Variant:0x00007f9a9298b488 @attrs={:bitrate=>432000, :content_type=>"video/mp4", :url=>"https://video.twimg.com/ext_tw_video/1093540366576275456/pu/vid/320x320/6Njwsfm5UWqO0oU-.mp4?tag=6"}>, #<Twitter::Variant:0x00007f9a9298b438 @attrs={:bitrate=>1280000, :content_type=>"video/mp4", :url=>"https://video.twimg.com/ext_tw_video/1093540366576275456/pu/vid/720x720/8XtxUTxm1tUG4ac_.mp4?tag=6"}>, #<Twitter::Variant:0x00007f9a9298b398 @attrs={:content_type=>"application/x-mpegURL", :url=>"https://video.twimg.com/ext_tw_video/1093540366576275456/pu/pl/QiuW1-iWLaygvK25.m3u8?tag=6"}>, #<Twitter::Variant:0x00007f9a9298b1b8 @attrs={:bitrate=>832000, :content_type=>"video/mp4", :url=>"https://video.twimg.com/ext_tw_video/1093540366576275456/pu/vid/480x480/pcsPrvRLvMExgib5.mp4?tag=6"}>]   


ドキュメントには書かれていないが、#bitrateや#content_typeと同じように#urlでURLを取得できる。

#(例)
client.user_timeline(params[:name],{count: 3}).each do |timeline|
  client.status(timeline.id).media[0].video_info.variants[0].url
end

(取得される情報)

https://video.twimg.com/ext_tw_video/1093540366576275456/pu/vid/320x320/6Njwsfm5UWqO0oU-.mp4?tag=6

content_typeがapplication/x-mpegURLのURLを使えばm3u8をダウンロードできる。

(m3u8の中身)

#EXTM3U
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=432000,RESOLUTION=320x320,CODECS="mp4a.40.2,avc1.4d001e"
/ext_tw_video/1093540366576275456/pu/pl/320x320/tfV38oY4Vgf57IDU.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=832000,RESOLUTION=480x480,CODECS="mp4a.40.2,avc1.4d001f"
/ext_tw_video/1093540366576275456/pu/pl/480x480/cP4EMl50LdmPmbDe.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1280000,RESOLUTION=720x720,CODECS="mp4a.40.2,avc1.640020"
/ext_tw_video/1093540366576275456/pu/pl/720x720/X3HUpbxApZP_9kO9.m3u8

末尾のURLを使って再度m3u8をダウンロード。
(m3u8の中身)

#EXTM3U
#EXT-X-VERSION:6
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-TARGETDURATION:3
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-ALLOW-CACHE:YES
#EXTINF:3.000,
/ext_tw_video/1093540366576275456/pu/vid/0/3000/720x720/fOF3nKjZy6cFCfG0.ts
#EXTINF:3.000,
/ext_tw_video/1093540366576275456/pu/vid/3000/6000/720x720/p_XXWwSLqZadr473.ts
#EXTINF:2.976,
/ext_tw_video/1093540366576275456/pu/vid/6000/8976/720x720/wFfB8JO78KQDVYTr.ts
#EXT-X-ENDLIST

tsファイルの情報を取得できる。

Debian + Nginx + Virtual Host

Virtual Host

  • Virtual Hostとは、1つのサーバで複数のドメインを運用する技術のことで、Webサーバ、メールサーバなどで利用される。
  • IPベースバーチャルホストは、利用するドメイン名ごとにIPアドレスを用意し、1つのサーバコンピュータに複数のIPアドレスを割り当てる。
  • 名前ベースバーチャルホストは、利用するドメイン名すべてに同じIPアドレスを使用し、1つのサーバコンピュータに必要なIPアドレスが1つで済む。

Debian + NginxでVirtual Host

include /etc/nginx/sites-enabled/*;

HTTPとtelnetについて

HTTP

  • HTTP=ハイパーテキストトランスファープロトコル
  • サーバとクライアントの間で、HTMLなどのコンテンツの送受信に用いられる通信プロトコル
  • 基本的にはテキストメッセージを交換することにより実現されている
  • ブラウザで Webページを開く際、ブラウザはサーバに要求メッセージを送信する。それに対してサーバは応答メッセージを返す。

メッセージ構文

1行目にリクエスト行またはレスポンス行があり、次にヘッダが数行あり、次に空行が1行あり、次にボディがある。

リクエスト行

メソッド パス名 HTTP/バージョン

レスポンス行

HTTP/バージョン ステータス番号 補足メッセージ

ヘッダ

追加情報を記載

ボディ

必要な時のみ記載

GETの例

スクリーンショット_2018-11-11_15_57_36.png

telnet

  • ネットワークを経由して他のコンピュータ(主にサーバ)に接続するときに使う
  • SSHではパスワード情報を含めて全てのデータが暗号化されて送信されるが、telnetの場合はパスワード情報を含め全てのデータが暗号化されずに送信される。

  • 使用方法

$ telnet (IPアドレスorドメイン名) (ポート番号)
  • 終了方法
Ctrl + ] 
telnet> q 

Linux コマンド

1. パーミッション(権限)について

パーミッションの確認
$ ls -l

スクリーンショット 2018-11-06 23.46.44.png

パーミッションの読み方

スクリーンショット 2018-11-06 23.42.56.png

1番左が「d」の場合 = ディレクトリ 1番左が「-」の場合 = ファイル

左(rwx) = そのファイルを所有している人の権限 真ん中(r-x) = そのファイルを所有しているグループの権限 右(r--) = その他の人の権限

r =ファイルを見る権利 w =ファイルに書き込む権利 x =ファイルを実行する権利

スクリーンショット 2018-11-06 23.59.52.png

左側のusernameがそのファイルの所有者名 右側のusernameがそのファイルの所有グループ名

パーミッションの変更
$ chmod u+x ファイル名[またはディレクトリ名](そのファイルを『所有ユーザー』が実行できるようにする)

所有ユーザーをu、所有グループをg、その他をoで表現する。 例えば、+rwや-rwxなどで一度に権限を変更することも出来る。 ファイルの権限を変えることが出来るのはそのファイルの所有者とrootユーザーのみ。

2. exprコマンド

シェル画面上で計算をするためのコマンド

$ expr 1 + 2
3

3. diffコマンド

2つのファイルを比べて、そのファイルに違いがあれば、違っている箇所を表示

$ diff ファイル1 ファイル2

4. lwp-requestコマンド

ウェブサーバーにリクエス

$ lwp-request 要求先のアドレス

(libwww-perl パッケージをインストールした)

4. リダイレクト(『>』)

あるコマンドの出力結果を別のファイルに書き込む

5. nslookupコマンド

DNSサーバーに問い合わせてドメイン名からIPアドレス、または逆にIPアドレスからドメイン名を検索

$ nslookup IPアドレスまたはドメイン名

(dnsutilsをインストールした)

6. whoisコマンド

whoisコマンドはドメイン名、またはIPアドレスからドメインの情報を取得

$ whois ドメイン名またはIPアドレス

(whoisをインストールした)

7. fileコマンド

ファイル形式を確認

$ file ファイル名

8. locateコマンド

ファイル検索

# updatedb
$ locate 検索キーワード

データベースからの検索なので、一般ユーザーからの使用で一般ユーザーが覗けない箇所のファイルも検索可能 (locateをインストールした)

参考 https://www.garunimo.com/program/linux/