WordpressからHUGOに移行する時にTwitterやFacebookなどのソーシャルボタンが本文にハードコーディングされてたので強引に削除しました。 特定の行以降を全て削除するという力技なので間違って想定外のものが消えないか気をつけましょう。 # pry > require 'nokogiri' Pathname.glob('posts/*.md').each{|f| text = f.read.gsub(/<div class='wp_social_bookmarking_light'>.*/m,''); f.write(text)}

続きを読む

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]

続きを読む

プロフィール画像

ironsand

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

Railsエンジニア

Yokohama