sudo service openvpn startがコケる時に設定ファイルのどこが間違ってるのか確認する方法。 openvpn --config /etc/openvpn/server.conf で文法チェックができます。こういうの各サービスで個別にあるんじゃなくて統一の方法欲しいなあ。

続きを読む

iptables覚書

よく忘れるので *filter :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT ACCEPT [0:0] ## 確立済みの通信はOK -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT ## Ping を通す -A INPUT -p icmp -j ACCEPT ## 自ホストからの通信はOK -A INPUT -i lo -j ACCEPT ## SSH -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT ## HTTP, HTTPS -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT COMMIT

続きを読む

複数カラムの値が重複してるオブジェクトの情報を取るために posts = Post.select(:title, :user_id, :date).group(:title, :user_id, :date).having("count(*) > 1").all とするとこんな感じのidがnilの配列が返ってくるので :id => nil, :user_id => 1345, :title => 'foo', :date => Tue, 01 Sep 2015 posts.each do |post| duplicated_posts = Post.where(user_id: post.user_id, title: post.title, date: post.date) # なんか処理する end な感じで適当に処理しましょう。 追記 こちらのほうがスッキリ書けますね。 posts.each do |post| duplicated_posts = Post.where(post.attributes.except('id')) # なんか処理する end

続きを読む

File.write(filename, text)でファイルに書き込みできるの便利ですよね。 でも、File.appendは用意されてないのでFile.open(filename, 'a'){|f| f.write(text)}のように書かなきゃいけません。めんどくさい。 なのでめんどくさくないように定義しましょう。やっぱり既存クラスのメソッド拡張ができるRubyはいいですね。 class File def self.append(filename, text) File.open(filename, 'a'){|f| f.write(text)} end end

続きを読む

Hashのキーをリネームする

Hashのキーをリネームしたかったけどデフォルトのメソッドはないようなので書いた class Hash def rename_key(old:, new:) return unless has_key?(old) return if has_key?(new) self[new] = self.delete(old) self end end 使い方 h = {a: 1, b: 2} { :a => 1, :b => 2 } [92] pry(main)> h.rename_key(old: :a, new: :c) { :b => 2, :c => 1 } 変更前のキーが存在しない時と、変更後のキーが存在する時は何もしない。 実際の入れ替え処理はself[new] = self.delete(old)だけで終わってます。 参考 http://kmckelvin.com/blog/2014/06/renaming-items-in-a-ruby-hash

続きを読む

音声つき単語帳の単語と例文とかを切り出してランダム出題する形にしたかったのでまずsoxを使って無音部分で音声を分割しました。 $ sox in.wav out.wav silence 1 0.3 0.1% 1 0.3 0.1% : newfile : restart これでout001.wavなどのように連番でファイルが保存されます。初めの0.3が音声の前の部分の無音の長さで、後ろの0.3が音声の後に続く無音部分の長さです。 参考 [sox fails to split files – Stack Overflow][1]

続きを読む

Chefの動きを確認する時に毎回全部のレシピを当ててると時間がかかってめんどくさいことこの上ないので単体で走らせる方法を探してみました。 試してみてダメだったこと chef-applyとかsandwichとか色々あるようなんですが、依存関係などの読み込み周りを同一にするのが出来ないようでよくわからなかったので使わないことにしました。 やりたいのはrun_listで走らせる対象を一つだけにしたかったので、nodes/postgresql.jsonなど試したいレシピだけを指定したノードファイルを作ってみたんですが、これはファイル名がhostと一致しないため完全に間違った試行だったようです。 成功した方法 run_listを特定のレシピだけ対象にすればいいので--override-runlistオプションを使えばやりたいことができました。 $ knife solo cook my_host --override-runlist "recipe[user]" run_listのデフォルトでrecipeは省略可能なので $ knife solo cook my_host --override-runlist "user" でOKです。 参考 [Specifying which cookbooks to run with Chef Solo – Stack Overflow][1]

続きを読む

昔録った動画のアスペクト比を間違えて設定してしまってたので一括で16:9にしたかったのでやり方を調べました。 方法 $ ffmpeg -i movie.mp4 -c copy -aspect 16:9 movie_out.mp4 とこんな感じで出来ます。ちなみにある程度新しいffmpegじゃないとちゃんと動かないので新しいのを入れましょう。あとコンテナがアスペクト比の設定に対応してないともちろんダメです。 ちなみに私はWindowsで動かしました。

続きを読む

ffmpegを使って複数の音声と字幕から一つの動画を作成する方法。 ffmpeg.exe -i video.mp4 -i de.mp4 -i de_sw.mp4 -i fr.mp4 -i ru.mp4 -i de_co.mp4 -i de.srt -i en.srt -map 0:0 -metadata:s:v:0:0 language=ger -map 2:0 -metadata:s:a:1:0 language=ger -map 1:0 -metadata:s:a:0:0 language=ger -map 3:0 -metadata:s:a:2:0 language=fre -map 4:0 -metadata:s:a:3:0 language=rus -map 5:0 -metadata:s:a:4:0 language=ger -map 6:0 -metadata:s:s:0:0 language=ger -map 7:0 -metadata:s:s:1:0 language=eng -c copy -scodec mov_text out.mp4 コマンドの解説 まず入力ソースに使う動画は一つ一つに-iオプションを付けて呼び出します。 そして-map の横についてる数字は何個目の引数として呼び込まれたか:その動画や音声のどのストリームかを表しています。そして-metadataを使って音声や字幕の言語を指定するのですがこの時に映像・音声・字幕でそれぞれ別のストリームとして言語を設定しないといけません。これがわからずにかなりの時間を費やしてしまいました…。 ちなみに-acodec copy -vcodec copyという使い方をされてる人が多いですが-c copyで一括指定できます。 知っとくと便利なこと -t 数値で出力する長さを選べるのでちゃんと合成で来てるか確認したいだけの時は-t 180などして簡単に動画の確認だけすると良いでしょう。 ffmpegはなんでもできるし、どのOSでも使えるのに引数がめんどくさすぎるせいであまり情報がないのがもったいないですよね。

続きを読む

プロフィール画像

ironsand

語学好きのプログラマーです

Railsエンジニア

Yokohama