2013 年 12 月の履歴(もしくは日誌)


2013 年 12 月

12 月 31 日

rbenv install -l でずらずら長いリストが出て困る

Ruby 2.1.0 が出ましたね.ところで rbenv install で簡単にインストールできるにしても,rbenv install -l の長いリストで新しいバージョンが加わったかどうか確認するのは面倒では無いですか? で rbenv install -l で 1.8 系や 1.9 系の最新だけをリストして,さらに rbenv versions の結果と比較してインストールされているかどうか表示するとか,そんな感じのものを ruby で書いてみました.

$ rbversion
1.8.7-p375                               
1.9.3-p484           installed           
2.0.0-p353           installed           
2.1.0                installed           
jruby-1.7.9          installed           
maglev-1.0.0         maglev-2.0.0-dev    
rbx-2.2.1            installed           
ree-1.8.7-2012.02               

最初に動けば良いって感じで書いたら,こうなりました.

#!/usr/bin/env ruby
# rbenv versions でインストールされている ruby を確認し
# rbenv install -l でインストール可能なものと比較する.-dev とか -rc とか -preview は無視する
installed = Hash.new
`rbenv versions`.split("\n").each do |line| 
       line.sub!(/^\s*\*?\s*/,'')
       line.sub!(/\s*\(.*\)$/,'')
       if line =~ /([^-]*)-(.*)/
              #
  else
    line =~ /^(2\.\d+)\.(.*)/
       end
       if $1
              installed[$1] = $2
       else 
              installed[line] = ''
       end
end
rb = nil
v = nil
pline = nil
`rbenv install -l`.split("\n").map {|line| line.sub!(/^\s*\*?\s*/,''); line}.push('').each do |line|
       next if line == "Available versions:"
       if line =~ /([^-]*)-(.*)/
              #
       else
    line =~ /^(2\.\d+)\.(.*)/
  end
       vr = $2
       if $1
              l = $1
       else
              l = line
  end
  #p [line,l,vr]
       next if vr =~ /rc|dev|preview/
       if l != rb
              if v
                     print pline
      print "    " if pline !~ /-/
                     if installed[rb]
        #p [:test,v.to_f ,installed[rb].to_f ,v.to_f > installed[rb].to_f ]
                            case
                            when v.to_f > installed[rb].to_f 
                                   print " *new* (#{installed[rb]})"
                            when v == installed[rb]
                                   print "\tinstalled"
                            else
                                   print "\t(#{installed[rb]})"
                            end
                     end
                     print "\n"
              elsif rb 
                     print "#{rb}\n"
              end
              rb = l
       end
       v = vr
  pline = line
end

いろいろ駄目だなと自分でも思います.

そしてある記事を見ました.

これをみて Enumerable#chunk って便利そう.これを使って書き直したら良くなるかも! って思ったので書き直しました.

#!/usr/bin/env ruby
# rbenv versions でインストールされている ruby を確認し
# rbenv install -l でインストール可能なものと比較する.-dev とか -rc とか -preview は無視する
pr = lambda{|line| line=~/^((\d+\.\d)|(\w+))/;$1 }
installed = `rbenv versions`.each_line.
  map {|line| line.gsub(/(^\s*\*?\s*|\s*\(.*\)$)/,'').chomp}.
  compact.chunk(&pr).to_h
available = `rbenv install -l`.each_line.
  map {|line| next if line=~/(Available versions|-dev|-rc|-preview)/; line.strip}.
  compact.chunk(&pr).to_a
available.each {|a|
  i = installed[a.first] ? installed[a.first].last : ''
  puts "%-20s %-20s" % [a.last.last, i == a.last.last ? "installed" : i]
}

これが良いのかどうか分からないけど,短くなった.

ついでに Perl でも書いてみた.Perl で Enumerable#chunk みたいなのって何かあるのかなって調べてみたけど良くわからりませんでした.

#!/usr/bin/perl
use strict;
use warnings;
my %installed;
foreach my $line (split m/\n/, `plenv versions`) {
       next if $line =~ m/^system/;
       my $test = q{};
       $line =~ s/^\s*\*?\s*//g;
       $line =~ s/\([^\)]+\)//g;
       if ($line =~ m/((^\d+\.\d+)|(^[A-Za-z]+))/ ) {
              $test = "$1";
       }
       else {
              $test = 'unknown';
       }
       if (exists $installed{$test}) {
              push($installed{$test}, $line);
       }
       else {
              $installed{$test} = [$line];
       } 
}
my %available;
my @keys = ();
foreach my $line (split m/\n/, `plenv install -l`) {
       next if $line =~ m/(Available|-RC|-TRIAL)/;
       my $test = 'unknown';
       $line =~ s/^\s*\*?\s*//g;
       if ($line =~ m/((^\d+\.\d+)|(^[A-Za-z]+))/ ) {
              $test = "$1";
       }
       if (exists $available{$test}) {
              push($available{$test}, $line);
       }
       else {
              $available{$test} = [$line];
              push @keys, $test;
       } 
}
foreach my $k (@keys) {
       my $i = exists($installed{$k}) ? $installed{$k}[-1] : q{};
       $i = $i eq $available{$k}[-1] ? "installed" : $i;
       printf("%-10s %-20s\n", $available{$k}[-1],$i);
}

http://onohiroki.cycling.jp/tb/tb.cgi/weblog_d20131231n1 TrackBack

12 月 30 日

Eye-Fi が AirMac Time Capsule に接続できなくなった

いつの間にか Eye-Fi が家の無線 LAN に接続できなくなった.家では Apple Time Capsule を使っていて,これの無線 LAN を利用している.いろいろ設定をいじってみたがどうにもならないので Eye-Fi のサポートにメールで相談してみた.iMac や MacBook Air は無線 LAN につながるのに Eye-Fi がつながらないという相談.

設定でおかしいところが無いので,念のためって事で Eye-Fi から新しい Eye-Fi カードが送られて来た.それで試せば問題を切り分けられるという事.

新しいカードでも駄目だった.また Eye-Fi のサポート側では Time Capsule との相性の問題とかは聞いた事が無いという事だし,同じ機器でテストして問題ないって話だった.と,いうわけで,次は Apple のサポートに電話.

この時点では iMac や MacBook Air は 5GHz と 2.4GHz の両方に接続できるが 2.4GHz はやや不安定.iPhone 4 などの古い 2.4GHz しかつながらない機器は,全くつながらないか,たまにつながってもすぐ切れるほど不安定という認識.5GHz では問題のに,2.4GHz はなんかおかしい.

Apple サポートとの数時間の電話でのやり取りの後,やはり Time Capsule を交換するという事になった.今日,交換用の Time Capsule を受け取った.本来は受け取りのときに今まで使っていたものを引き取るのだが,今回はバックアップデータが入ったまま持って行かれても困るので,後日返送するという事にした.で,試してみたらちゃんとつながった.やはりぼくの Time Capsule がどこかおかしかったようだ.

MacBook G4 と MacBook Air,MacBook Pro のバックアップが新しい Time Capsule でとれたら,古い Time Capsule のハードディスクのデータをきれいに消して返送しよう.Eye-Fi も返送しなくちゃ.

Eye-Fi のサポートも Apple のサポートもとても良い対応だった.

http://onohiroki.cycling.jp/tb/tb.cgi/weblog_d20131230n1 TrackBack

12 月 2 日

Ruby のインストールで ld: warning directory not found for option とか出て失敗した

新しいバージョンの Ruby を rbenv install でインストールしてみました.

$ rbenv install 2.0.0-p353

したらワーニングメッセージが沢山出てビルド失敗.

ld: warning: directory not found for option '-L/Users/username/.rbenv/versions/2.0.0-p353/lib'

上のメッセージで検索しても情報無し.warning だしね.

Results logged to /var/folders/ ... /ruby-build.201312 ... .log みたいなログができていて,見ても良く分かりませんでした.

Inspect or clean up the working tree at /var/folders/ ,,, ってところにビルドに失敗したソースがあるらしいので,そこに cd して make してみたら次のエラーメッセージが出て止まりました.

/usr/include/tk.h:23:3: error: Tk 8.5 must be compiled with tcl.h from Tcl 8.5
#       error Tk 8.5 must be compiled with tcl.h from Tcl 8.5
        ^
/usr/include/tk.h:75:11: fatal error: 'X11/Xlib.h' file not found
#       include <X11/Xlib.h>

つまり,Tcl/Tk 関連でうまくビルドできないようです.

そういえば rbenv install するときに Tcl/Tk を切り離してビルドするっていう例をどっかで見かけたなぁって思って検索してみたらありました.

まぁ Tcl/Tk は使わないかなぁって思ってこれを試してみる事にしました.

$ CONFIGURE_OPTS="--without-tcl --without-tk" rbenv install 2.0.0-p353

これでとりあえず 2.0.0-p353 がインストールできました.1.9.3-p484 も同様.

しかし,複数の Mac で 2.0.0-p353 インストールして,問題が出ているのは一台だけ.なんでだろう?

Tcl のバージョンが古い? Tcl は Homebrew でインストールしたわけではないし.

http://onohiroki.cycling.jp/tb/tb.cgi/weblog_d20131202n1 TrackBack

[ 上に戻る]