Atcorderに上がってたきもいRubyコード解読してみた

http://arc001.contest.atcoder.jp/submissions/4572

gets
gets
puts [*?1..?4].map{|c|$_.count c}.minmax.reverse*" "

問題は↓
http://arc001.contest.atcoder.jp/tasks/arc001_1

(irb)>>3
 => 3
>>?3
 => "3"
  • アスタリスクの後に配列を書くと配列が展開される。Rangeオブジェクトも展開される
(irb)>>a = [1,2,3]
 => [1, 2, 3]
>> [a]
 => [[1, 2, 3]]
>> [*a]
 => [1, 2, 3]
>> b = 1..3
 => 1..3
>> [*b]
 => [1, 2, 3]
>> b.to_a
 => [1, 2, 3]
  • getsの結果は自動的に$_に入る。perlのアレみたいなやつ
gets
puts $_
#省略しないで書くとこんな感じ?
input = STDIN.gets
puts input
  • String.count(arg)でargの文字を数える
(irb)>>"aaabbbbc".count(?b)
 => 4
  • Array#*はjoinみたいに使える
(irb)>>["つのだ","ひろ"]*"☆"
 => つのだ☆ひろ

仕事楽しいbot作った

heroku使う準備

  • herokuコマンドをインストール
gem install heroku
  • herokuに新規アプリを登録
gem create job-enjoy
  • 出来立てのアプリをcloneしてくる
 git clone git clone git@heroku.com:job-enjoy.git
cd job-enjoy

最低限動くやつを作る

  • app.rbを↓の内容で作成
#!/usr/bin/env ruby
# encoding: utf-8
require 'sinatra'
require 'slim'

get '/' do
    'しごとたのしー♪───O(≧∇≦)O────♪'
end
  • localでテスト
 ./app.rb

※しごとたのしー表示されたらおk

  • heroku用のファイルを作る

◯config.ru

require './app.rb'
run Sinatra::Application

◯Gemfile

source :rubygems
gem 'sinatra'
gem 'slim'
  • bundle installする
$ bundle install

※Gemfile.lockが出来たらおk

heroku上で動作テスト

git add .
git commit -m 'first commit'
git remote add heroku git@heroku.com:job-enjoy.git
git push heroku master

アプリの登録する

https://dev.twitter.com/

user_dirの下でmod_rewriteを使いたい時

user_dirはMacだったら$HOME/Siteの下みたいなところ、Linuxだとpublic_htmlみたいなやつ
この下でmod_rewriteすると変なことが起きる。
例えばこんな.htaccessをuser_dirの下に置くと

RewriteEngine on
RewriteRule ^(.*)$ index.php/$1 [L]

↓みたいなリクエストがきたら
hogehoge.com/fuga
↓みたいに書き換えることを期待してるんだけど
hogehoge.com/index.php/fuga
この状態でアクセスすると、↓みたいな感じのエラーが出る

The requested URL /Users/nab/Sites/index.php/fuga was not found on this server.

user_dirのモジュールがurlをlocalのパスに書き換えちゃうみたい。RewriteBaseを追加したら解決した。

RewriteEngine on
RewriteBase /~nab/
RewriteRule ^(.*)$ index.php/$1 [L]

既存の仮想マシンを複製する

  • コピー元のマシンをnobueコピー先のマシンをmihoshiとします。
  • コピー元の仮想マシンのディスク容量を確認
$ sudo lvs
  nobue-disk   john -wi-ao   9.00g
  nobue-swap   john -wi-ao 256.00m
  • 同じ容量のディスクを作成する
sudo lvcreate -L 9GB -n mihoshi-disk john
sudo lvcreate -L 256MB -n mohoshi-swap john
  • コピー元のマシンをシャットダウン
sudo xm shutdown nobue
  • ディスクをコピーする
sudo dd if=/dev/mapper/john-nobue--disk of=/dev/mapper/john-mihoshi--disk conv=noerror,sync
sudo mkswap -c /dev/mapper/john-mihoshi--swap
  • 設定ファイルをコピー
cp /etc/xen/nobue.cfg /etc/xen/mihoshi.cfg
  • 設定ファイルのディスクとnameとmacアドレスを書き換え
$ diff /etc/xen/nobue.cfg /etc/xen/mihoshi.cfg
20,21c20,23
<                   'phy:/dev/john/mihoshi-disk,xvda2,w',
<                   'phy:/dev/john/mihoshi-swap,xvda1,w',
    • -
> 'phy:/dev/john/nobue-disk,xvda2,w', > 'phy:/dev/john/nobue-swap,xvda1,w', 33c35 < name = 'mihoshi'
    • -
> name = 'nobue' 39c41 < vif = [ 'mac=00:16:3E:A7:6E:20' ]
    • -
> vif = [ 'mac=00:16:3E:A7:6E:1F' ]
sudo xm create mihoshi.cfg -c 
  • たぶんこれだとipがダブるのでipを再取得するといいかも
 sudo /etc/init.d/networking restart

xenでdomainUからdomain0に繋がってる物理HDDを直接マウント

仮想マシン上でファイルサーバーを動かしたくて、
e-SATAで繋がってる6TBの外付けディスクを
domainUからマウントしたい。
disk.imgみたいな6TBの仮想ディスク用の
ファイルを外付けディスクに
作ってそれをdomainUに割り当てるのがxen的な
解決方法だと思うんだけど、それだと
今までのファイルを全部仮想ディスクにコピーしないと
いけないし、なんかあった時にデータ取り出すのが面倒そう。
domain0でnfsとかsamba動かしてdomainUで読むことも
考えたけど、ベンチ取ったらスピード糞遅くなるし
そもそもdomain0でサーバーあんま動かしたくない

てことで、domainUから直接HDDをマウントしたい!
PCIパススルーとか使うと出来そうだったけど
カーネルコンパイルとかしないといけないらしく
あんまやりたくない。

domain0で以下のコマンド打つと、物理HDDをそのまま
domainUに割り当てられました。

sudo xm block-attach 1 phy:/dev/sdb1 /dev/xvdc w

書き方は

sudo xm block-attach 仮想マシンのID phy:マウントしたいデバイス名 マウント先のデバイス名 モード
  • 仮想マシンのID
    • xm listで調べる
  • マウントしたいデバイス
    • fdisk -lとかで見た時のデバイスの名前
  • マウント先のデバイス
    • xvd*の形式で*は適当なアルファベット1文字を入れる。
    • xvdc1とかやりたかったけど、それだとdomainUに認識されなかった。
  • モード
    • r
      • 読み込み専用
    • w
      • 読み書きおk

割り当てた仮想マシンに入って↓みたいにすると
仮想マシン上から物理HDDをマウント出来る

sudo mount -t ${ファイルシステム名} /dev/xvdc

今までは仮想化しないでファイル鯖立ててたんだけどその時とほとんど
変わらない速度が出てる。仮想マシン上でsamba立てて
windowsで読み書き両方試したけど40〜50MB/sくらい
あとはwindowsをdomainUで動かしたいなぁ・・・