FUJITSU PRIMERGY TX100 S1 購入

この記事は2年以上前に書いたものです。
そのため情報が古い可能性があります。ご了承ください。m(_ _)m

DELL SC440が起動しなくなってしまったので、Amazonにて、¥9,980で購入。
SC440に挿していたXeon 3040、メモリ2GBx4(ECC有り)、HDDx4を載せ替えて起動できた。
POSTで、「no microcode update loaded for booting processor」と言われ止まってしまったたが、BIOSの設定で、スルー出来た。

「保証期間過ぎている保証書が付属されていますが、購入後1年保証になります。」とのこと。本当か!?
IMG_3737
IMG_3740IMG_3749IMG_3744

ケースを開けた時の裏に書いてあった簡易説明。
IMG_3754

HDDを簡単に取り付けられるようになっていた。
IMG_3758

なんと、HDD4台分のSATAケーブル(内1つは使用中)が付いていた。
IMG_3763
IMG_3766

緑のカバーとヒートシンクを外した後
IMG_3785

最初に付いていたCPU、メモリ、HDDは外してしまったので、ベアボーン相当として使っているが特に不満は無い。

カテゴリー: サーバ管理, ハードウェア | タグ: , , , , , , , | コメントする

ConnectBotの改造

この記事は2年以上前に書いたものです。
そのため情報が古い可能性があります。ご了承ください。m(_ _)m

Android端末(P-01D)+Bluetoothキーボード(BK-2000BTII)+BlueKeyboard JP+SSHクライアント(ConnectBot)で、サーバの再起動くらい出来るようにしようとしたけど、コントロール(ctrl)キーが効かなくて困ったのでConnectBotを改造してみた。

参考にしたサイトは↓

改造した点は、

  • ctrlキーを効くように
  • ‘/’キーが押しづらいので、右のshiftキーを’/’キーに

BK-2000BTIIは、↓

IMG_3709
もう売ってないっぽい。

ConnectBotのソースは、connectbot/connectbot · GitHub で公開されている。ライセンスは、Apache License 2.0とのこと。

ctrl、右側shift、’/’キーのキーコード、スキャンコードをログ出力させて、調査した所

  keyCode meta scanCode
ctrl 0 0 327
右側shift 0 129 54
‘/’ 76 0 53

だった。

改造したソースは、↓。


13-12-15 13:47% git diff | col -b
diff --git a/src/org/connectbot/service/TerminalKeyListener.java b/src/org/connectbot/service/TerminalKeyListener.java
index 3f82259..61858bd 100644
--- a/src/org/connectbot/service/TerminalKeyListener.java
+++ b/src/org/connectbot/service/TerminalKeyListener.java
@@ -79,6 +79,7 @@ public class TerminalKeyListener implements OnKeyListener, OnSharedPreferenceCha
        private boolean volumeKeysChangeFontSize;

        private int ourMetaState = 0;
+       private int ctrlFlag = 0;

        private int mDeadKey = 0;

@@ -133,6 +134,24 @@ public class TerminalKeyListener implements OnKeyListener, OnSharedPreferenceCha
                        final boolean controlNumbersAreFKeys = controlNumbersAreFKeysOnSoftKeyboard &&
                                        !interpretAsHardKeyboard;

+                       if (keyCode ==0
+                               && event.getScanCode() == 327
+                               && event.getAction() == KeyEvent.ACTION_UP) {
+                               ctrlFlag = 0;
+                               ourMetaState &= ~OUR_CTRL_ON;
+                               bridge.redraw();
+                               return true;
+                       }
+
+                       if (keyCode == 0
+                               && event.getScanCode() == 54){
+                               event = new KeyEvent(event.getDownTime(), event.getEventTime(),
+                                                                        event.getAction(), 76,
+                                                                        event.getRepeatCount(), 0,
+                                                                        event.getDeviceId(), 53,
+                                                                        event.getFlags());
+                       }
+
                        // Ignore all key-up events except for the special keys
                        if (event.getAction() == KeyEvent.ACTION_UP) {
                                if (rightModifiersAreSlashAndTab) {
@@ -258,6 +277,16 @@ public class TerminalKeyListener implements OnKeyListener, OnSharedPreferenceCha
                                return true;
                        }

+                       if(keyCode == 0){
+                               if(event.getScanCode() == 327
+                                  && event.getAction() == KeyEvent.ACTION_DOWN){
+                                       ctrlFlag = 1;
+                                       metaPress(OUR_CTRL_ON);
+                                       bridge.redraw();
+                                       return true;
+                               }
+                       }
+
                        int derivedMetaState = event.getMetaState();
                        if ((ourMetaState & OUR_SHIFT_MASK) != 0)
                                derivedMetaState |= KeyEvent.META_SHIFT_ON;
@@ -267,8 +296,11 @@ public class TerminalKeyListener implements OnKeyListener, OnSharedPreferenceCha
                                derivedMetaState |= HC_META_CTRL_ON;

                        if ((ourMetaState & OUR_TRANSIENT) != 0) {
-                               ourMetaState &= ~OUR_TRANSIENT;
-                               bridge.redraw();
+                               if(ctrlFlag != 0){
+                               } else{
+                                       ourMetaState &= ~OUR_TRANSIENT;
+                                       bridge.redraw();
+                               }
                        }

                        // Test for modified numbers becoming function keys
@@ -550,3 +582,4 @@ public class TerminalKeyListener implements OnKeyListener, OnSharedPreferenceCha
                this.encoding = encoding;
        }
 }

ctrlFlagを追加して使ってるのは、emacsライクなキーバインドを常用している関係で、連続でctrlキーを使えるように無理やり。

カテゴリー: プログラム, モバイル | タグ: , , , , , , , , , | コメントする

PowerShot SX50 HS用にストラップ購入

この記事は2年以上前に書いたものです。
そのため情報が古い可能性があります。ご了承ください。m(_ _)m

PowerShot SX50 HSに付属のストラップ(ネックストラップNS-DC11)の全長が約117cm。
たすき掛けにするには、腕の出し入れが窮屈。(元々たすき掛け用じゃないんだろうけど)
なので、長めで滑り止めが無いストラップをAmazonで購入。¥1,422。

全長 約150cmなので、2m近い長身の自分でも無理なくたすき掛けに出来る。

IMG_0067IMG_0069IMG_0070

カテゴリー: その他 | タグ: , , | コメントする

Canon PowerShot SX50 HSの画素欠けが見つかったので修理に出してみた

この記事は2年以上前に書いたものです。
そのため情報が古い可能性があります。ご了承ください。m(_ _)m

レンズキャップを付けた状態で液晶を見ると、1箇所、輝点が表示されるのを発見。
この輝点は、必ず表示されるわけではなく特定の条件で表示される。(マニュアルで、露出1秒、ISO1600くらいにすると表示される)
その条件で、撮影した場合の画像にもその場所の画素が欠けていたので、
液晶のドット欠けではないから、ピクセルマッピング(?)の調整をしてくれれば直るだろうと、Canonの修理センターに持ち込んで見た。

そこで言われた事は、うろ覚えだけど

  • レンズキャップを付けた状態で撮影した結果、画素が欠けていても正常な撮影状態(?)では無いため、画素欠けとして判断はしていない。
  • 夜景でもなんでも良いから、レンズキャップを外して、正常な撮影状態(?)で撮影した結果、画素欠けが見つかれば修理を受け付ける。
  • 画素欠けが疑わしい箇所を点検する場合は、保証期間内であっても有料。
  • どうしてもと言うなら、画素欠けとして修理センターに送ってやらなくも無いけど、直る保証はない。

で、保証期間も僅かだったので、直ることを祈って画素欠けとして修理に出してもらった。
2013/10/05に。

で、修理結果が、10/12に送られてきた。(実際は、10/11に不在票が入っていた)

PowerShot-SX50HS_0101

「お預かりの品につきまして、ご指摘の症状を確認いたしました。」
「関連箇所を点検、調整いたしました。※その他、各部点検・清掃をいたしました。」

実際に確認してみたところ、輝点が表示されなくなっていたので、ダメ元で修理に出してよかった。

カテゴリー: その他 | タグ: , , | コメントする

デジカメ(SX50 HS)を入れる用の小さいカバン購入

この記事は2年以上前に書いたものです。
そのため情報が古い可能性があります。ご了承ください。m(_ _)m

Amazonにて、\891。

DVWF1-BK_0001DVWF1-BK_0002DVWF1-BK_0003

ギリギリ。
DVWF1-BK_0004

高さもギリギリ。
DVWF1-BK_0005

カテゴリー: その他 | タグ: , , , | コメントする

Canon PowerShot SX50 HS 購入

この記事は2年以上前に書いたものです。
そのため情報が古い可能性があります。ご了承ください。m(_ _)m

中古で¥31,800。
Amazonだと¥35,979。

PowerShot-SX50HS_0001PowerShot-SX50HS_0002PowerShot-SX50HS_0003PowerShot-SX50HS_0004PowerShot-SX50HS_0005PowerShot-SX50HS_0006PowerShot-SX50HS_0007PowerShot-SX50HS_0008PowerShot-SX50HS_0009PowerShot-SX50HS_0010

試しに撮影してみてみる。


IMG_1470IMG_1471
なんかザラついている。

リス
IMG_1669IMG_1691IMG_1694IMG_1749

カテゴリー: その他 | タグ: , , , | コメントする

カードリーダ SD/USBポート搭載 GH-CRAD-SUAK購入

この記事は2年以上前に書いたものです。
そのため情報が古い可能性があります。ご了承ください。m(_ _)m

Nexus7で、SDカードを読み込みたくて購入。
Amazonにて、\1,762。

GH-CRAD-SUAK_0001GH-CRAD-SUAK_0002GH-CRAD-SUAK_0003GH-CRAD-SUAK_0004GH-CRAD-SUAK_0005

実際にNexus7(旧型)に挿して見た
GH-CRAD-SUAK_0006

Nexus7(旧型)からSDカードを読み込む場合、有料アプリの「Nexus Media Importer」を使うのを想定しているらしい。

Nexus 7 (Nexus Media Importer(Homesoft社)を使用した場合に限る)
(http://www.green-house.co.jp/products/pc/cardreader/multi/gh-crad-sua/ より引用)

無料で出来ないか試した所、root化してれば、USB OTG Helper [root]が使えた。

Nexus7_SS_0001

インストールして、開く。
Nexus7_SS_0003

その後、マウントするだけ。
Nexus7_SS_0004

/storage/UsbOtgDrive にマウントされた。
Nexus7_SS_0005

後は任意のアプリでそのパスを見に行くだけ。
ここでは、Photo Editorを使用してみた。ファイル検索を選択し、任意の画像を選択し、編集。
Nexus7_SS_0013Nexus7_SS_0006Nexus7_SS_0007Nexus7_SS_0008Nexus7_SS_0009Nexus7_SS_0010Nexus7_SS_0011

使い終わったら、アンマウント。
Nexus7_SS_0012

カテゴリー: ソフトウェア, モバイル | タグ: , , | コメントする

インテル PRO/1000 PT デュアルポート サーバ・アダプタ EXPI9402PT 購入

この記事は2年以上前に書いたものです。
そのため情報が古い可能性があります。ご了承ください。m(_ _)m

 

Amazon.co.jpにて、¥7,100。(実際に購入したのは2013/07/26)
VMwar ESXiなサーバに挿して、冗長構成にしようと思って購入。デュアルポートである必要は全くなかったけど、なんとなく。

 

EXPI9402PT_0001EXPI9402PT_0002EXPI9402PT_0003

NEC Express5800 S70 に挿して、VMware ESXi4で何の問題もなく認識。
VMware_ESXi_NIC

カテゴリー: サーバ管理, ハードウェア | タグ: , , , , | コメントする

NETGEAR GS108v3 8ポート ギガビットスイッチングハブ GS108-300JPS 購入

この記事は2年以上前に書いたものです。
そのため情報が古い可能性があります。ご了承ください。m(_ _)m

Amazon.co.jpで、¥3,880。

落雷の影響で、ADSLモデムのLANポートと、WR8700NのWAN側ポートが機能しなくなってしまった。
ADSLモデムはレンタル品だったので、交換してもらった。ADSLのLANポートと、WR8700NのLAN側ポートを接続すれば、インターネットには接続できるので暫くはそれで凌ごうと思ったけど、LANポートが不足してしまうので、8ポートのスイッチを購入。
中古のCiscoのCatalyst 3550-12T(ヤフオクで¥5,000くらい)を買っちゃおうかとも思ったけど、置く場所が無いので、コンパクトなこちらに決定。

NETGEAR-GS108_0001NETGEAR-GS108_0002NETGEAR-GS108_0003NETGEAR-GS108_0004NETGEAR-GS108_0005NETGEAR-GS108_0006NETGEAR-GS108_0007NETGEAR-GS108_0008NETGEAR-GS108_0009NETGEAR-GS108_0010NETGEAR-GS108_0011NETGEAR-GS108_0012

カテゴリー: ハードウェア | タグ: , | コメントする

Twitterの1日分のタイムラインをKindleで読む

この記事は2年以上前に書いたものです。
そのため情報が古い可能性があります。ご了承ください。m(_ _)m

時間かけて探せば良い感じのが有りそうだけど、すぐには見つからなかったのでperlで書いてみた。

仕様的なもの。

  • 常駐せずに、10分おきくらいにcronで動かす。
  • 1日分のtweetは、$timeline_fileに溜め込む。
  • 1日分の切り替えは、Log::Dispatch::FileRotateに任せる。
    (微妙にずれる場合もあるけど、細かいことは(゚ε゚)キニシナイ!!)
  • $timeline_fileへの出力は、Log::Log4perl の INFOで。
  • kindleへ送信するタイミングは、$timeline_fileのサイズが小さくなったら。
    (FileRotateで切り替わったらファイルサイズが小さくなるので、それ契機)
  • kindleへの送信するデータは、htmlファイル。
  • 送信先は、@kindle.com or @free.kindle.com。
    (自動的に変換して、端末へ配信してくれる)

gettimeline.pl(gettimeline.zip)


#!/usr/bin/perl

use 5.010;
use strict;
use warnings;
use Encode;
use DateTime;
use DateTime::TimeZone;
use DateTime::Format::DateParse;
use Data::Dumper;
use HTML::Entities;
use MIME::Lite;

use Net::Twitter;
use Log::Log4perl qw(:easy);

# Twitter key and token
my $consumer_key = 'xxxxxxxxxxxxxxxxxxxxx';
my $consumer_secret = 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy';
my $token = 'nnnnnnnnnn-zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz';
my $token_secret = 'sssssssssssssssssssssssssssssssssssssssssss';

# log
my $logfile = '/home/user/tool/twitter.log';
my $timeline_file = '/home/user/tool/timeline.log';

# mail
my $mailfrom = 'xxxx@xxx.xxx';
my $mailto = 'yyyyy@free.kindle.com';

# title
my $title_fmt = 'Twitter_Timeline_%Y-%m-%d(%a)';


my $tid_prefix = '__TID__:';
my $tz = DateTime::TimeZone->new(name => 'local');

&loginit;

&main;

exit;

sub main{
    my $filesize = -s $timeline_file;

    &gettl;

    if($filesize > -s $timeline_file){
	say 'send to kindle';
	&send2kindle;
    }
}

sub send2kindle{
    my $dt = DateTime->now(time_zone => $tz);
    $dt->subtract(days => 1);
    my $title = $dt->strftime($title_fmt);
    my $fname = $title . '.html';

    my $timeline_file1 = $timeline_file . '.1';
    open my $fh, '<', "$timeline_file1"
	or die "failed to open file: $!";
    my $rawdata = do { local $/; <$fh> };

    my @rawdata_array = grep(!/^$tid_prefix \d+$/, split(/\n/, $rawdata));


    my $htmldata = <<_HEADER_;
<html>
  <head>
    <title>$title</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
<body>
  <h3>$title</h3>
<pre>
_HEADER_

    $htmldata .= Encode::decode_utf8(join("\n", @rawdata_array));

    $htmldata .= <<_FOOTER_;
</pre>
</body>
</html>
_FOOTER_

    my $subject = $title;

    my $msg = MIME::Lite->new(
	From => "$mailfrom",
	To => "$mailto",
	Subject => "$subject",
	Type => 'multipart/mixed'
    );
    $msg->attach(
	Type => 'text/plain; charset="iso-2022-jp"',
	Data => "no body"
	);
    $msg->attach(
	Type => 'text/html',
	Data => "$htmldata",
	Filename => "$fname",
	Disposition => 'attachment'
	);
    $msg->attr('content-type.charset' => 'UTF-8');

#    WARN Dumper($msg);
#    WARN $htmldata;

    $msg->send();

}

sub gettl{
    my $nt = Net::Twitter->new(
	traits => [qw/OAuth API::REST/],
	consumer_key => $consumer_key,
	consumer_secret => $consumer_secret,
	access_token => $token,
	access_token_secret => $token_secret,
	);

#    WARN "TWEET: " . $tweet;

    my @tl = $nt->home_timeline({count => 200});

    my @rtl = reverse(@{$tl[0]});

    my $tail_cmd = "tail -2 $timeline_file";
    my $grep_cmd = "grep -e \"$tid_prefix [0-9]\\+\"";
    my $sed_cmd = "sed -r \"s/[^0-9]+([0-9]+)/\\1/\"";
    my $lastid = `$tail_cmd | $grep_cmd | $sed_cmd`;
    chomp $lastid;

    if($lastid){
	for my $i (0 .. $#rtl) {
	    if($lastid eq $rtl[$i]->{id}){
#say "0 -> " . $i . " ($#rtl)";
		splice(@rtl, 0, $i+1);
#say "  -> " . $#rtl;
		last;
	    }
	}
    }

    my $id = '';
    foreach my $t(@rtl){
	WARN $t->{id};
	$id = $t->{id};
	my $s = &mklinktag($t->{text});
	my $dt = DateTime::Format::DateParse->parse_datetime($t->{created_at});
	$dt->set_time_zone($tz);

	INFO encode_utf8($t->{user}{name}) .
	    ' (<a href="https://twitter.com/' . $t->{user}{screen_name} . '">' .
	    '@' . $t->{user}{screen_name} . '</a>)' . "\n" .
	    encode_utf8($s) . "\n" .
	    $dt->strftime('(%Y/%m/%d %H:%M:%S)') . "\n";
#	WARN Dumper($t);
	WARN Dumper($s);
    }
    INFO "$tid_prefix " . $id . "\n" if $id;
}

sub mklinktag{
    my ($s) = @_;

    $s = encode_entities($s, q{&<>"'});

    $s =~ s!(https?://)([0-9a-zA-Z/\.]+)!<a href="$1$2">$2</a>!go;

    $s =~ s!@([a-zA-Z0-9_]+)!<a href="https://twitter.com/$1">\@$1</a>!go;

    $s;
}

sub loginit{
  my $logsize = 10*1024*1024;
  Log::Log4perl->init(\ qq{
    log4perl.logger = INFO, AppError, Tweet

    # filter range
    log4perl.filter.MatchRange               = Log::Log4perl::Filter::LevelRange
    log4perl.filter.MatchRange.LevelMin      = WARN
    log4perl.filter.MatchRange.LevelMax      = ERROR
    log4perl.filter.MatchRange.AcceptOnMatch = true

    # Error appender
    log4perl.appender.AppError = Log::Dispatch::FileRotate
    log4perl.appender.AppError.filename   = $logfile
    log4perl.appender.AppError.max   = 10
    log4perl.appender.AppError.autoflush   = 1
    log4perl.appender.AppError.size   = $logsize
    log4perl.appender.AppError.mode = append
    log4perl.appender.AppError.layout   = Log::Log4perl::Layout::PatternLayout
    log4perl.appender.AppError.layout.ConversionPattern = %d %02X{client} %p %F{1} %L: %m %n
    log4perl.appender.AppError.Filter   = MatchRange

    # Filter to match level WARN
    log4perl.filter.MatchInfo  = Log::Log4perl::Filter::LevelMatch
    log4perl.filter.MatchInfo.LevelToMatch  = INFO
    log4perl.filter.MatchInfo.AcceptOnMatch = true

    # Error appender
    log4perl.appender.Tweet = Log::Dispatch::FileRotate
    log4perl.appender.Tweet.filename   = $timeline_file
    log4perl.appender.Tweet.max   = 10
    log4perl.appender.Tweet.autoflush   = 1
    log4perl.appender.Tweet.DatePattern = yyyy-MM-dd
    log4perl.appender.Tweet.TZ = JST
    log4perl.appender.Tweet.mode = append
    log4perl.appender.Tweet.layout   = Log::Log4perl::Layout::PatternLayout
    log4perl.appender.Tweet.layout.ConversionPattern = %m %n
    log4perl.appender.Tweet.Filter   = MatchInfo
 });
}

↑のコードで送信されたファイルのスクリーンショットが↓。

screenshot_2013_05_19T09_28_12 0900

アイコンとかも持って来たほうが見栄えが良いんだろうけど、とりあえずシンプルなこれで使ってみる。

カテゴリー: ソフトウェア, プログラム | タグ: , , , , | コメントする