• 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

友人のisanoくんが「Rubyわかんねー」と言いながら頑張って解いたみたいなので、僕もRubyで書いてみる。

問題内容を引用。

1~512の数の書かれたカードが1枚ずつ、左から小さい順に、「1,2,3,4,・・・,511,512」と並んでいます。いま、次のような作業を行うことにします。

ア. 前から奇数番目のカードをすべて取り除く

イ. 前から偶数番目のカードをすべて取り除く

 まず、この作業を、ア→イ→ア→イ→・・・の順に、カードが残り1枚になるまで繰り返して行うことにします。

 このとき、最後に残るカードに書かれた数字を答えてください。

isanoくんが後で見てもわかるように、丁寧にコメントまでつけちゃうぜ。

以下、僕の書いたコード

   1  #/usr/bin/env ruby
   2  
   3  # Integerクラスを拡張する
   4  class Integer
   5   
   6    # 値が偶数かどうかを調べる
   7    # 偶数 -> true
   8    # 奇数 -> false
   9    def even?
  10      return (self % 2).zero?
  11    end
  12  
  13  end
  14  
  15  numbers = (1..512).to_a  
  16  
  17  # 以下, 指定された通りにカードを取り除いていくコード
  18  # (ア) 奇数番目のカードを抜く = 添え字が偶数のカードを抜く
  19  # (イ) 偶数番目のカードを抜く = 添え字が奇数のカードを抜く
  20  
  21  flag = true    # (ア)のときtrue, (イ)のときfalse. 最初は(ア)
  22  
  23  # カードが1枚になるまで続ける
  24  while numbers.size > 1 do
  25  
  26    # Arrayで何かを取り除く操作をするのは、rejectが簡単
  27    # ここではrejectの破壊的メソッドreject!を使う
  28    numbers.reject!{|i| numbers.index(i).even? == flag }
  29  
  30    flag = !flag # (ア)/(イ)の入れ替え
  31  
  32  end
  33  
  34  puts numbers
  35  #=> 342

こんなもんでどうや!!

追記 (2008/12/02 16:35) 気づけばいろんな人がやってた。

Ritsなはてなーばっかで困る。

posted by Png y_tsuda on Fri 28 Nov 2008 at 17:51

先日、lchinさんがブログで紹介していたシェル fish をCentOSにインストールしてみます。

「fish」(Friendly Interactive SHell)を使ってみる - レオメモ - s21g

yumのレポジトリの追加

fishをインストールするには、dagレポジトリを追加する必要があります。

fishをインストール

レポジトリの追加が完了すると、普通にyumでインストールできます。

   1  # yum install fish

fishを使ってみる

fishを使用している様子は、Ichinさんの記事公式のスクリーンショットを参考に。

10分くらい触った感想を箇条書きで...

  • ものすごくカラフル
  • 補完機能が便利(manのあととか、サブコマンドとか、オプションとか軽い説明つきで候補が表示される)
  • いちいちカラフル

これからしばらくfishを使ってみようと思います。

以上、fishの速攻レビューでした。

参考になりそうなページ

fishが紹介されているページを適当に探してみたので、あとで参考にしよう。

posted by Png y_tsuda on Thu 27 Nov 2008 at 11:22

C言語では、 #ifdef #ifndef を使うことによって、条件付きのコンパイルが可能となる。

#ifdefの使い方と意味

#ifdefは、次のようにして使う。

   1  #ifdef MACRO
   2   ・
   3   ・
   4   ・
   5  #endif

これは、「MACROが定義されている場合は、#ifdef~#endifの中を有効にする」という意味である。

#ifndefの使い方と意味

次に、#ifndefは、逆の意味で、以下のように使う。

   1  #ifndef MACRO
   2   ・
   3   ・
   4   ・
   5  #endif

これは、「MACROが定義されていない場合は、#ifndef~#endifの中を有効にする」という意味である。

C言語でヘッダーを書くときの定石

この#ifndefを使ってヘッダーを書く、C言語の定石(?)がある。

以下のような、ヘッダーファイル my.h を定義する。

   1  #ifndef MY_H    /* ヘッダーの最初 */
   2  #define MY_H
   3   ・
   4   ・
   5   ・
   6  #endif          /* ヘッダーの最後  */

こうすることによって、複数のソースから my.h がインクルードされていたとしても、 確実に1度だけ my.h の中身を有効にすることができる。

これで、ヘッダーファイルの管理も楽になりますね!!

posted by Png y_tsuda on Fri 21 Nov 2008 at 10:14

今日、11月11日はポッキー&プリッツの日!!

じゃなくて

バイナリデーですね!!!!

(参照: スラッシュドット・ジャパン|Happy Binary Day!

バイナリデーにちなんでバイナリ時計をRuby書いてみました。

ネタでチャチャチャと書いたので、超適当です。 たぶん、できてます。

左からHH:MM:SSです。

   1  #/usr/bin/env ruby
   2  
   3  require 'curses'
   4  
   5  class BinaryClock
   6  
   7    def initialize
   8      @clock = {}
   9      @clock[:hour] = Array.new(2)
  10      @clock[:min] = Array.new(2) 
  11      @clock[:sec] = Array.new(2)
  12    end
  13  
  14    def run
  15      curses_screen = Curses.init_screen
  16      
  17      loop do
  18        Curses.clear
  19        get_time
  20        curses_screen.addstr(bin_clock_str)
  21        Curses.refresh
  22        sleep(1)
  23      end
  24  
  25    end
  26  
  27    private
  28    def get_time
  29      time = Time.now
  30      hour = split_integer(time.hour, 2)
  31      min = split_integer(time.min, 2)    
  32      sec = split_integer(time.sec, 2)
  33  
  34      0.upto(1) do |i|
  35        @clock[:hour][i] = to_bin_array(hour[i])
  36        @clock[:min][i] = to_bin_array(min[i])
  37        @clock[:sec][i] = to_bin_array(sec[i])
  38      end
  39  
  40    end
  41  
  42    def split_integer(n, k=0)
  43      int_array = n.to_s.split(//).map{|i| i.to_i}.reverse
  44      int_array_size = int_array.size
  45      int_array += Array.new(k - int_array_size){0} if int_array_size < k
  46      return int_array
  47    end
  48  
  49    def to_bin_array(n)
  50      binary = []
  51  
  52      3.downto(0) do |i|
  53        if n >= 2**i
  54          binary[i] = '*'
  55          n -= 2**i
  56        else 
  57          binary[i] = '-'
  58        end
  59      end
  60  
  61      return binary
  62    end
  63  
  64    def bin_clock_str
  65      str = ""
  66  
  67      3.downto(0) do |i|
  68        str << "#{@clock[:hour][1][i]}\t" + 
  69               "#{@clock[:hour][0][i]}\t" + 
  70               "#{@clock[:min][1][i]}\t" +
  71               "#{@clock[:min][0][i]}\t" + 
  72               "#{@clock[:sec][1][i]}\t" +
  73               "#{@clock[:sec][0][i]}\n"
  74      end
  75  
  76      return str
  77    end
  78  
  79  end
  80  
  81  bin_clock = BinaryClock.new
  82  bin_clock.run

追記: 2008/11/11 17:30

今気づいたら、URLが http://blog.s21g.com/articles/1024 でした。 バイナリ的にきれいな数字ですね!

追記: 2008/11/26 00:25

Githubにおいてみました。

posted by Png y_tsuda on Tue 11 Nov 2008 at 17:07

前回の中規模ネットワーク構築メモ(パッチパネル作成編)の続きです。

記事全体の目次は中規模ネットワーク構築メモを参照してください。

前回はパッチパネルを作成したので、今回はパッチパネルとハブを繋げていきます。

これで快適インターネットライフを満喫できます!

必要なもの

パッチパネル・ハブ接続では、このようなものが必要になってきます。

装置など

  • (前回設置した)パッチパネル
  • UTPケーブル
  • RJ45コネクタ
  • スイッチングハブ

工具

  • かしめ工具
  • ニッパ
  • ケーブルテスタ(あれば)

ではでは、さっそく作業に移っていきましょう。

ハブの購入

「CiscoのCatalystが欲しい!」とおねだりしたところ、「お金ない!ダメ!」と即答で却下されたので、しぶしぶ別のメーカのものを買うことに。

今回の購入のポイントは、

  • 安い
  • ある程度高機能

でした。

そこで先生にお勧めされたのが、以下の2点

そして、結局上に示したものを買うことになりました・・・。 Cisco触りたかったなぁ・・・。

好みの長さのLANケーブルを作成する。

パッチパネルとハブを接続するためのケーブルを作成していきます。

ケーブルの作り方は、LANケーブル作成(ストレートケーブル編)を参照のこと。

今回は、50cmのケーブルを作ってみました。

ゾーンボックスが6個、ポートが6個ずつということもあり、6色のケーブルを6本ずつ作製してみました。

特に深い意味はなくて、「『この色のケーブルは、○番のボックスに繋がってるんやったなぁ』ってのを直感的にわかるようになるかな?」程度です。

こんな感じ。

IMG_1456_R.jpg

この工程ではひたすらケーブルを作ります。

今回は、36本ということもあり、地味にしんどい作業でした。

ハブの設置&パッチパネルとハブを接続

ハブをラックに設置します。 場所は、パッチパネルの上くらいで。

NETGEARのGS724TSは、付属のHDMIケーブルで機器同士を接続することで、最大6台までスタックでき、ポートを増やすことができます。

この機能があれば、将来ネットワークに接続するマシン数が増えても、フレキシブルに対応できますね。

設置が終われば、ケーブルをパチパチと差していきます。

IMG_1457_R.jpg

カラフルすぎる(笑)

最後に

以上で、基本的な中規模ネットワーク構築の終了です。

これで、快適インターネットライフを満喫できるようになりました。

ここから、ルータを置いたり、サーバ置いたり、VLAN構築したり・・・と数えればキリがない作業があるはず・・・

今回の作業を通してわかったことは、頭より「体力勝負」ですね。

ネットワーク構築をしたいみなさんは、筋トレ・ジョギングなど体力づくりに励みましょう。

posted by Png y_tsuda on Mon 10 Nov 2008 at 13:11

UNIX系のOSに付属しているlookコマンドを使うと、/usr/share/dict/wordsのうち引数で受け取った文字列で始まっている行を出力してくれます。

こんな感じ。

   1  $ look look
   2  look
   3  lookahead
   4  look-alike
   5  
   6    (中略)
   7  
   8  lookup
   9  lookups
  10  looky

これを使ってスペルチェックっぽいものをRubyで。

   1  def spellcheck(word)
   2    return `look #{word}`.split("\n").include?(word)
   3  end
   4  
   5  spellcheck("look")
   6  #=> true
   7  spellcheck("loook")
   8  #=> false

ただlookコマンドを呼びだしただけですが・・・。

はたして、使うことはあるのだろうか・・・

posted by Png y_tsuda on Mon 10 Nov 2008 at 01:06

ちょっと私用でZIP圧縮をする機会があったので、メモ。

RubyでZIP圧縮するにはいろいろと方法があるようです。

  1. 拡張ライブラリのZlibを使う(GZip形式になる?)
    URL: http://www.ruby-lang.org/ja/man/html/Zlib.html
  2. Gemパッケージのrubyzipを使う
    URL: http://rubyforge.org/projects/rubyzip/
  3. Gemパッケージのziprubyを使う
    URL: http://rubyforge.org/projects/zipruby/

Rubyforgeをみた感じだとziprubyのほうが新しいようだったので、今回はziprubyを使うことにしました。

まず、ziprubyをインストールします。

   1  # gem install zipruby

実際にコードを書くとこのような感じになります。

   1  #/usr/bin/env ruby
   2   
   3  require 'rubygems'
   4  require 'zipruby'
   5  
   6  zipfile = 'test.zip'  # 圧縮されたファイル名
   7  passwd = 'password'   # パスワード
   8  
   9  # 圧縮するファイルたち
  10  # ファイル名を文字列で
  11  files = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"]
  12  
  13  # filesを圧縮して, test.zipを作成
  14  Zip::Archive.open(zipfile, Zip::CREATE) do |arc|
  15    files.each{|f| arc.add_file(f) }
  16  end
  17  
  18  # パスワードつきのZIPファイルにする
  19  Zip::Archive.encrypt(zipfile, passwd)

今回は圧縮と暗号化でしたが、解凍と復号もできるようです。

それにしても、rubyzipとか、ziprubyとか、Gemパッケージって名前の付け方が煩雑ですね・・・。

posted by Png y_tsuda on Thu 6 Nov 2008 at 15:10

昨晩は、n桁の16進数を生成しました。

今晩は、n文字のランダムな半角英数文字列を生成するRubyスクリプトを書いてみました。

ただ文字列を生成するだけだとあまり面白くないので、optparseを使ってオプションを取るようにしました。

以下、コード。

   1  #/usr/bin/env ruby
   2   
   3  require 'optparse'
   4   
   5  def main(argv)
   6    options = {}
   7   
   8    option_parser = OptionParser.new {|opt|
   9      opt.on('-l LENGTH', '--len LENGTH', 'Set password length'){|v| options[:l] = v}
  10      opt.on('-a [OPTIONAL_CHARS]', '--add [OPTIONAL_CHARS]', 'Add optional characters'){|v| options[:a] = v}
  11      opt.parse!(argv)
  12    }
  13   
  14    if options[:l]
  15      puts mkpasswd(options[:l].to_i, (options[:a] || "").split(//))
  16    else
  17      puts option_parser
  18    end
  19  end
  20   
  21  def mkpasswd(n, optional_chars)
  22    passwd = ""
  23   
  24    lower_chars = ("a".."z").to_a
  25    upper_chars = ("A".."Z").to_a
  26    numbers = ("0".."9").to_a
  27   
  28    passwd_chars = (lower_chars + upper_chars + numbers + optional_chars).uniq
  29    passwd_chars_size = passwd_chars.size
  30   
  31    passwd = Array.new(n){ passwd_chars[rand(passwd_chars_size)] }.join
  32   
  33    return passwd
  34  end
  35   
  36  main(ARGV)

使い方は、

   1  $ ruby mkpasswd.rb           
   2  Usage: mkpasswd [options]
   3      -l, --len LENGTH                 Set password length
   4      -a, --add [OPTIONAL_CHARS]       Add optional characters
で確認できます。

実際に使ってみます。

63文字の文字列を生成する

   1  $ ruby mkpasswd.rb -l 63     
   2  qyXsKDICRoyweiA3MPVkC1Q2xXdY5uh00cxgWGrhj1b7HKvMwUNkpmSOG1QJTuk

-aオプションを使って, 記号を入れる

   1  $ ruby mkpasswd.rb -l 63 -a _@!
   2  My!n1WEYoc1R94JJW3X6JtmPKCJOjseWuubhH8R_bRo6bYnwAoKgSNzfyskv@RD

とまぁ、こんな感じです。

細かいところは気にせず自分用に書いたので、まだまだ改良する必要があります。

なんとなく、GitHub に置いてみました。

もしよければ使ってみてくださいm(_ _)m

posted by Png y_tsuda on Tue 4 Nov 2008 at 22:20

WPA-PSKのために64桁の16進数を作成したくて、ちゃちゃっと書いてみた。

   1  def mkhex(n)
   2    hex_str = ""
   3  
   4    n.times do 
   5      hex_str << "%x" % rand(16)
   6    end
   7  
   8    return hex_str
   9  end

実行してみるとこんな感じ。

   1  mkhex(64)
   2   #=> "98979206f86479fe2c17a987b23ba787c41afd405d7f7efbe2d61484f065d413"

WPA-PSKは、64桁の16進数の他に、8~63文字の半角英数字(ASCII)も受け付けているので、今度はそっちを生成するコードを書いてみようかな。

posted by Png y_tsuda on Tue 4 Nov 2008 at 01:40
Contents
算数にチャレンジ!! 第624回問題 をRubyで解く
CentOS 5.2 に fish (Friendly Interactive Shell) をインストール
#ifdef と #ifndef と ヘッダーを書くときの定石
バイナリ時計
中規模ネットワーク構築メモ(パッチパネル・ハブ接続編)
英単語のスペルチェック
RubyでZIP圧縮
n文字の半角英数文字列を生成する
n桁の16進数を生成する
Comments
Aleksey: The uname check is only due to a somewhat slopp... '11-2
Yu Tsuda: あぁ、そうですね、、syncすると戻ってしまいますね・・・。 ご指摘ありがとうございます!! '09-7
ursm: /usr/portage 以下のファイルは更新のたび元に戻ってしまうので、/etc/porta... '09-7
Yu Tsuda: 見た目だけでも、わざわざGentooをこういうリストに入れてるのがすごいなぁと思ったりしたので... '09-3
Leonard Chin (レオ): ただし、VirtualBoxで「Gentoo」などを選択しても、別にどのOSを入れても大丈夫だ... '09-3
Services from s21g
twpro(ツイプロ)
Twitterプロフィールを快適検索
地価2009
土地の値段を調べてみよう
MyRestaurant
自分だけのレストラン手帳
Formula
ブログに数式を埋め込める数式コミュニティ