動かざることバグの如し

不景気で困ります(閉めます) ドアに注意

dockerでsquidプロキシサーバーを構築する

dockerでsquidを動かしたいのでDockerfile作った

使い方

git clone

git clone https://github.com/thr3a/squid-docker-compose/tree/master

で、実行するだけ

cd squid-docker-compose
docker-compose up

あとは

# squidのデフォルトのポートが3128
curl example.com --proxy localhost:3128

で確認できる。

カスタマイズ

設定をオレオレ仕様にしたいってのは当然あるはずで、カスタム性を高めた(つもり

手元にすでにsquid.confがある場合、デフォルトの設定は/etc/squid/conf.d/default.confに書かれているので、

volumes:
  - "./squid.conf:/etc/squid/conf.d/default.conf"

をdocker-compose.ymlに書いてあげればそれをロードしてsquidが起動する。

工夫した点

パーミッション

squidは仕様上squidユーザーで起動してしまうのでパーミッション周りがroot前提のalpineでやろうとするとちょいちょいPermission deniedで怒られる。

ので、

RUN install -d -o squid -g squid \
        /var/cache/squid \
        /var/log/squid \
        /var/run/squid && \
    chmod +x /usr/lib/squid/*

で作ってる。

設定の柔軟性

上記にもあったが、カスタマイズしやすいようにしている。squidはデフォルトで/etc/squid/squid.confをロードするので、/etc/squid/squid.confの中身を

echo 'include /etc/squid/conf.d/*.conf' > /etc/squid/squid.conf

にして、複数ファイルをロードできるようにした。squid-log.confではアクセスログを標準出力に流す設定にしたので基本いじらなくていいと思う。

RubyのREXML::Document でXMLをパースする

rubyXMLを扱いたい人生だった

環境

概要

RubyXMLをパースする手段はいろいろあるが、ここでは特にライブラリを追加インストールすることなく、標準ライブラリだけで実行可能なREXML::Documentを使うことにした。

で「ruby XML」でググると一番上に以下のサイトがヒットするのだが、

残念ながらはてなダイアリーが終了して見れなくなるので、自分用の備忘録も兼ねてメモ

読み込み

ここでは例としてニコニコ動画に使われているXMLを読むとする。

require "rexml/document"
require "open-uri"
url = "http://ext.nicovideo.jp/api/getthumbinfo/sm2959233"
doc = REXML::Document.new(open(url).read)
p doc

子要素の取得

doc.elements

子要素を指定して取得

先頭に「//」から始めることで明示的にrootから始まることを意味する。で[]の中でパスを書くだけ。で、textで文字列取得

doc.elements['//nicovideo_thumb_response/thumb/video_id'].text
> sm2959233

属性を取得

属性(<>内の値)はattributesでhashで取得できる。

doc.elements['//nicovideo_thumb_response'].attributes
> {"status"=>status='ok'}

子要素をeachで回して取得

elements.eachで可能

doc.elements.each('//nicovideo_thumb_response/thumb/tags/tag') do |elm|
  
  p elm.text
  p elm.attributes 
  
end

特定の属性を持つ子要素だけをeachで回して取得

doc.elements.each('//nicovideo_thumb_response/thumb/tags/tag[@lock="1"]') do |elm|
  p elm.text
end

蛇足

ActiveSupportのcore_extを使うとXMLをHashに変換することができる。

require "rexml/document"
require "open-uri"
url = "http://ext.nicovideo.jp/api/getthumbinfo/sm2959233"
doc = REXML::Document.new(open(url).read)
hash = Hash.from_xml(doc.to_s)
pp hash

以下のようなhashを得られる。一部の属性がカットされてしまっている点には注意が必要だが、せこせこパースするぐらいならこっちのほうが開発のスピードは早いかもしれない(

{"nicovideo_thumb_response"=>
  {"status"=>"ok",
   "thumb"=>
    {"video_id"=>"sm2959233",
     "title"=>"ニコニコ動画流星群",
     "description"=>
      "ニコニコ動画で人気のある名曲(極一部、趣味)を繋いでひとつの曲にしてみました(約4回目)。mylist/1535765user/145217",
     "thumbnail_url"=>"http://tn.smilevideo.jp/smile?i=2959233",
     "first_retrieve"=>"2008-04-11T05:05:52+09:00",
     "length"=>"14:05",
     "movie_type"=>"mp4",
     "size_high"=>"40265605",
     "size_low"=>"38847215",
     "view_counter"=>"6396448",
     "comment_num"=>"1450707",
     "mylist_counter"=>"108509",
     "last_res_body"=>
      "これ見ると平成最後が やっぱりニコニコ最高 いくぞ! 平成 ★=ー おっくせんまん!おっ おっくせんまん!おっ おっくせんまん!おっ おっくせんまん!おっ おっくせんまん 鈍痛☆鈍痛☆... ",
     "watch_url"=>"https://www.nicovideo.jp/watch/sm2959233",
     "thumb_type"=>"video",
     "embeddable"=>"1",
     "no_live_play"=>"0",
     "tags"=>
      {"domain"=>"jp",
       "tag"=>
        ["音楽",
         "アレンジ",
         "ニコニコ動画流星群",
         "空気の読めるWMP",
         "ニコニコメドレーシリーズ",
         "600万再生",
         "simoyuki",
         "SP1時代の奇才",
         "ありがとう",
         "原点にして頂点",
         "重要ニコニコ文化財"]},
     "genre"=>"音楽・サウンド",
     "user_id"=>"145217",
     "user_nickname"=>"しも",
     "user_icon_url"=>
      "https://secure-dcdn.cdn.nimg.jp/nicoaccount/usericon/defaults/blank_s.jpg"}}}

サンプルに使ったXML

<nicovideo_thumb_response status="ok">
  <thumb>
    <video_id>sm2959233</video_id>
    <title>ニコニコ動画流星群</title>
    <description>
ニコニコ動画で人気のある名曲(極一部、趣味)を繋いでひとつの曲にしてみました(約4回目)。mylist/1535765user/145217
</description>
    <thumbnail_url>http://tn.smilevideo.jp/smile?i=2959233</thumbnail_url>
    <first_retrieve>2008-04-11T05:05:52+09:00</first_retrieve>
    <length>14:05</length>
    <movie_type>mp4</movie_type>
    <size_high>40265605</size_high>
    <size_low>38847215</size_low>
    <view_counter>6396439</view_counter>
    <comment_num>1450707</comment_num>
    <mylist_counter>108509</mylist_counter>
    <last_res_body>
これ見ると平成最後が やっぱりニコニコ最高 いくぞ! 平成 ★=ー おっくせんまん!おっ おっくせんまん!おっ おっくせんまん!おっ おっくせんまん!おっ おっくせんまん 鈍痛☆鈍痛☆...
</last_res_body>
    <watch_url>https://www.nicovideo.jp/watch/sm2959233</watch_url>
    <thumb_type>video</thumb_type>
    <embeddable>1</embeddable>
    <no_live_play>0</no_live_play>
    <tags domain="jp">
      <tag category="1" lock="1">音楽</tag>
      <tag lock="1">アレンジ</tag>
      <tag lock="1">ニコニコ動画流星群</tag>
      <tag lock="1">空気の読めるWMP</tag>
      <tag>ニコニコメドレーシリーズ</tag>
      <tag>600万再生</tag>
      <tag>simoyuki</tag>
      <tag>SP1時代の奇才</tag>
      <tag>ありがとう</tag>
      <tag>原点にして頂点</tag>
      <tag>重要ニコニコ文化財</tag>
    </tags>
    <genre>音楽・サウンド</genre>
    <user_id>145217</user_id>
    <user_nickname>しも</user_nickname>
    <user_icon_url>
https://secure-dcdn.cdn.nimg.jp/nicoaccount/usericon/defaults/blank_s.jpg
</user_icon_url>
  </thumb>
</nicovideo_thumb_response>

jemallocを有効化したRubyをビルドしてRailsで使う

環境

概要

Ruby、特にRailsだとけっこうメモリ大食いマンになる傾向がある。(Chromeのことを笑えないぐらいには

で、いろいろググってたらjemallocを有効にしらRubyだとメモリの消費が減るらしい。ってことで試してみた。

ただしRubyの再ビルドが必要なので現行で動いているアプリケーションに対して適応するには検証が必要

手順

依存ライブラリのインストール

apt install libjemalloc-dev

Macの場合(未検証

brew install jemalloc

rbenvを使ってインストール RUBY_CONFIGURE_OPTSをつけるのがポイント

RUBY_CONFIGURE_OPTS=--with-jemalloc rbenv install 2.6.2

で、終わり。特に小難しい設定とかいらないので楽である。

確認

本当にjemallocが有効かどうかを確認するには以下

Rubyのバージョンが 2.5までの場合

$ irb
irb(main):002:0> RbConfig::CONFIG['LIBS']
=> "-lpthread -ljemalloc -lgmp -ldl -lcrypt -lm "

Rubyのバージョンが 2.6以上の場合

$ irb
irb(main):002:0> RbConfig::CONFIG['MAINLIBS']
> "-lz -lpthread -lrt -lrt -ljemalloc -lgmp -ldl -lcrypt -lm"

どっちにしても、実行したときに「ljemalloc」が入っていれば有効になっている。なければ何らかビルドがおかしい

あとはすでにインストールしてある場合はbundle削除して再デプロイすればおk

参考リンク

ffmpegでm3u8ファイル(HLS)から動画をダウンロードして保存するコマンド

環境

$ffmpeg -h|head
ffmpeg version git-2019-03-08-147ef1d Copyright (c) 2000-2019 the FFmpeg developers
  built with Apple LLVM version 10.0.0 (clang-1000.10.44.4)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/HEAD-147ef1d --enable-shared --enable-pthreads --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags='-I/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/include -I/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/include/darwin' --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libmp3lame --enable-libopus --enable-librubberband --enable-libsnappy --enable-libtesseract --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librtmp --enable-libspeex --enable-videotoolbox --disable-libjack --disable-indev=jack --enable-libaom --enable-libsoxr
  libavutil      56. 26.100 / 56. 26.100
  libavcodec     58. 47.103 / 58. 47.103
  libavformat    58. 26.101 / 58. 26.101
  libavdevice    58.  6.101 / 58.  6.101
  libavfilter     7. 48.100 /  7. 48.100
  libavresample   4.  0.  0 /  4.  0.  0
  libswscale      5.  4.100 /  5.  4.100
  libswresample   3.  4.100 /  3.  4.100
  libpostproc    55.  4.100 / 55.  4.100

コマンド

ネットから落としてきたm3u8ファイルの中に動画が分割された.tsファイルのリストが入っている。

で、それをwgetで落として結合しようかな、と思っていたのだが、どうやらffmpeg自体にダウンロード機能があった。

以下ダウンロードするコマンド

ffmpeg -protocol_whitelist file,http,https,tcp,tls,crypto -loglevel debug -i hoge.m3u8 -movflags faststart -c copy movie.mp4
  • protocol_whitelist ローカルのm3u8ファイルを指定する場合はこのオプションをつけないとエラーになる
  • loglevel 任意
  • i 保存したいm3u8ファイルの場所
  • movflags faststart 録画終了後にメタデータをmp4ファイルの先頭部分に移動します。再生開始までの時間が短縮されます つまりおまじない
  • c copy コーデックはエンコードすることなくコピーするだけ 動画変換が今回の目的ではないので

でいける。

蛇足

m3u8ファイルのダウンロードは以下が一番使いやすかった。監視してくれるChrome拡張機能

chrome.google.com