思い出のラーメン屋

実家の近くのラーメン屋で、十何年ぶりに食べてきた。

当時と全然変わらないゴチャゴチャした店内。懐かしい。
店主は頑固オヤジだった気がするけど、今は人当たりのいい爺さんだった。
味はというと、思ってたより普通だった。思い出補正が入ってたかも。

自分しか客がいなかったので、少し話させてもらった。
40年くらい続けてるらしいけど、今年で閉店を決めたそうだ。あと10日くらいとか。
最後に食べに行けてよかった。

記念に写真を何枚か撮らせてもらった。おっちゃんと一緒に撮ればよかったかな。


Windows 7のリモートメディアストリーミング

Windows 7Windows Media Playerでは、自宅のPCの動画や音楽をネット経由でストリーミングできる。

例えば、実家に帰っててもノートで動画を見たりできる。実際この記事も実家で試して書いている。
ポートを空けたりとか面倒なことをしなくていいので便利。

けど、設定にけっこう癖がある。

基本手順はこちら。
http://ascii.jp/elem/000/000/422/422541/

ハマりやすい点としては、

  • 両方のPCで同じWindows Live IDにリンクする
  • 両方のPCで「ストリーム」→「ホームメディアへのインターネットアクセスを許可」にチェックを入れる

加えて、以下の設定が必要らしい。

  • サーバ側で、
    • 「ストリーム」→「その他のストリーミング オプション」→「次の場所にあるデバイスを表示」で、「すべてのネットワーク」を選択
    • リストからクライアント側PCを探し、「カスタマイズ」を開く
    • 「既定の設定を使用する」のチェックを外す
    • 「ライブラリ内のすべてのメディアをこのデバイスで使用できるようにする」のチェックを入れる

以上で、メイン画面の「その他のライブラリ」の下にサーバが現れるはず。

出かける前にモバイル回線で接続テストしたり、リモートデスクトップの用意をしておくと安全。

Galaxy S II LTEのGPU性能

Android 4.0にアップグレードされたときに、
Galaxy Nexusと同等のサクサク感が得られるか気になるので調べてみた。

搭載GPUは、S2 LTEはおそらくARM Mali-400 MP。
確定情報はないけど、S2と解像度同じだから変更なしと予想。
Samsung Galaxy S II - Wikipedia

Nexusは、PowerVR SGX540。
Galaxy Nexus - Wikipedia

で、ベンチマーク結果。
「Galaxy Nexus」のベンチマーク結果。GPU性能でGalaxySIIに負ける | リンゲルブルーメン

これを見る限りS2のほうが性能が上で、かつ解像度も低いから
おそらく4.0はサクサク動くはず。

PowerVRのほうが実績ありそうなので、OpenGLのドライバのチューニングで負けてる可能性はあるけど、
Android 2.3の時点でNexusを上回ってるから大丈夫かな。

ちなみに、CPUは1.5GHz(S2) vs 1.2GHz(Nexus)なので、たぶん問題ない。
NexusのOMAP4460の方が後発っぽいからアーキテクチャの差があるかもだけど、
あったとしてもS2のほうがクロック高いので同クラスの性能になるだろう。
Qualcomm Snapdragon - Wikipedia
OMAP - Wikipedia

ケータイ購入時のノウハウ

まとめ

支払総額 = 端末代金 + 頭金
端末代金はどの店でも同じ。頭金の差のみ。

頭金とは業界用語で、要するにショップの販売手数料。
一般的な分割払いの頭金とは違い、端末代金に充当されるわけではないので注意。
一括払いにしても同じ額取られる。

頭金0で買うのが基本。
店が指定するサービスやサイトに加入することで、頭金が0になる店が多い。
どちらにせよ1ヶ月だけ加入してすぐやめればいい。

端末代金は、一括でも分割でも総額は変わらない(金利ゼロ)
ただし、量販店で端末代金を一括払いすると、ポイントが付く場合がある。これが結構でかい。
ヨドバシやビックは付きやすく、ヤマダなどは付かないらしい

量販店は発売ギリギリまで金額の詳細を明かさなかったりする。
ドコモショップは比較的早い段階で情報が出てくる。
なので、予約するときは条件のいいドコモショップと量販店でダブルブッキングするといい(予約時に前金を取られないなら)

問い合わせ内容

  • 総額
    • 新規か機種変か伝える。MNPなら安くなる場合が多い
    • 頭金込みか、税抜か税込かも確認
  • 頭金はいくらか
  • 頭金が安くなる条件はあるか
    • サービス加入・サイト加入など
    • サービス・サイト名も聞き出しておき、1ヶ月分の料金を後で調べる
  • 発売日当日の受け取りはできるか
  • 予約時に前金は必要か
  • 月々サポートの金額
    • どの店も同じはずだけど、念のため

はてなダイアリーでサイドバーの幅を調節する

デザイン編集 > 詳細 > スタイルシート に以下を書く。この例では250px幅。
ついでに背景色や角丸をTwitterウィジェットのデザインに合わせてみた。そのへんはお使いのテーマに合わせて。

.hatena-module {
    width: 250px;
    background: #444444;
    border-radius: 5px 5px 5px 5px;
}

.hatena-moduletitle {
    background: none;
}

background: none; は、角丸が背景画像で実現されてて幅が固定なので、それを無効化するため。

はてなダイアリーでTwitterのブログパーツの表示が化ける問題

Twitterウィジェット貼ったら、blog側からスタイルが継承されて表示の一部がおかしくなった。

デザイン編集 > 詳細 > スタイルシート に以下を書いたら解決。さすがかゆいところに手が届く

#twtr-widget-1 em {
    background-color: black;
    display: block;
}

.twtr-widget h4 {
    border-left: medium none;
    font-size: 16px !important;
}

使用テーマはNimbus。他のテーマでは対処法が変わるかも。

Google Code Jam Japan 2011 予選

公式

B-largeのみ不正解。196位。決勝もこれならTシャツギリギリラインだ。
公式ハッシュタグは #gcjjp (自分用メモ)

A. カードシャッフル

シャッフル回数がたかだか100回だから、ほとんどのカードが最後まで連番で並んでる。
なので、[ [最初のカード番号, 枚数], ... ] のように区間リストで持ってシミュレーションした。
カット範囲が複数の区間にまたがるので書きにくく、1時間くらいかかってAC。

模範解答は知りたいカードの位置だけ考えて、逆順にシャッフルして最初にどこにあるか求めればいいらしい。がっかり。

require 'pp'

# http://0xcc.net/ruby-bsearch/index.html.ja
# require './bsearch'

# https://github.com/kanwei/algorithms
# require 'rubygems'
# require 'algorithms'
# include Containers

def ppd(*arg)
  if $DEBUG
    pp(*arg)
  end
end

def putsd(*arg)
  if $DEBUG
    puts(*arg)
  end
end

def read_ints()
  readline().split.map{|e| e.to_i }
end

def read_floats()
  readline().split.map{|e| e.to_f }
end

def read_words(count)
  words = []
  for i in 1 .. count
    words << readline().chomp
  end
  words
end

# main
t_start = Time.now

# ここから問題に応じて
cases = readline().to_i

(1 .. cases).each do |case_index|
  m, c, w = read_ints
  
  cuts = Array.new
  for i in 1 .. c
    cuts << read_ints
  end

  cards = Array.new
  cards << [ 1, m ]

  cuts.each do |cut|
    cut_start = cut[0]
    cut_count = cut[1]

    index = 1

    new_cards = Array.new
    cutted = Array.new

    cards.each_with_index do |seq, cards_index|
      index_range_start = index
      index_range_end = index + seq[1]

      if cut_count > 0 && index_range_start <= cut_start && cut_start < index_range_end
        # この連番の一部をカットする
        start_in_seq = seq[0] + cut_start - index_range_start
        max_cut_count = seq[1] - (cut_start - index_range_start)
        count = [cut_count, max_cut_count].min

        cutted << [start_in_seq, count]

        new_seq_1 = [seq[0], start_in_seq - seq[0]]
        new_seq_2 = [start_in_seq + count, seq[1] - (cut_start - index_range_start) - count]

        new_cards << new_seq_1 if new_seq_1[1] > 0
        new_cards << new_seq_2 if new_seq_2[1] > 0

        cut_start += count
        cut_count -= count
        if cut_count < 0
          cut_count = 0
        end
      else
        new_cards << seq
      end

      index += seq[1]
    end

    cutted.reverse.each do |e|
      new_cards.unshift(e)
    end

    raise if cut_count != 0

    cards = new_cards
  end

  # W番目のカードを求める
  index = w
  answer = -1
  cards.each do |seq|
    if index <= seq[1] && answer == -1
      answer = seq[0] + (index - 1)
    end
    index -= seq[1]
  end

  puts "Case ##{case_index}: #{answer}"

  # progress
  trigger = 
    if cases >= 10
      case_index % (cases / 10) == 0
    else
      true
    end

  if trigger
    STDERR.puts("case #{case_index} / #{cases}, time: #{Time.now - t_start} s")
  end
end

B. 最高のコーヒー

全探索でSmallのみAC。Largeは思いつかず。
最終日から逆順にGreedyでいいらしい。言われてみればそうかも。
序盤の問題だからDPはないだろう、たぶんGreedyだよなー。と思いつつもたどり着けなかった。

#include <cstdio>
#include <cmath>
#include <ctime>
#include <memory.h>
#include <vector>
#include <set>
#include <map>
#include <algorithm>
#include <assert.h>
#include <string>
#include <limits.h>

using namespace std;

#define FOR(i, e) for(int i = 0; i < (e); i++)
#define FORS(i, s, e) for(int i = (s); i < (e); i++)
#define ALL(c) c.begin(), c.end()

typedef long long ll;
typedef vector<int> vi;
typedef vector<double> vd;
typedef vector<string> vs;

int ri(){ int value; scanf("%d", &value); return value; }
ll rl(){ ll value; scanf("%lld", &value); return value; }
double rd(){ double value; scanf("%lf", &value); return value; }
string rs(){ char buf[10000]; scanf("%s", buf); return buf; }
template<class T> void sort(T& c){ sort(c.begin(), c.end()); }
template<class T> void rsort(T& c){ sort(c.begin(), c.end()); reverse(c.begin(), c.end()); }

#ifdef LOCAL
	#define ppd(...) printf(__VA_ARGS__)
#else
	#define ppd(...)
#endif

int N, K;
int c[8];
int t[8];
int s[8];
int max_score = 0;

int select[8];

void solve(int day, int score)
{
	if(day > K)
		return;

	FOR(i, N)
	{
		if(t[i] >= day && c[i] >= 1)
		{
			select[day - 1] = i;
			int current_score = score + s[i];
			if(max_score < current_score)
			{
				max_score = current_score;
				
				printf("%d : ", max_score);
				FOR(j, day)
				{
					printf("%d ", select[j]);
				}
				printf("\n");
			}

			c[i]--;
			solve(day + 1, current_score);
			c[i]++;
		}
	}
}

int main()
{
#ifdef LOCAL
	time_t start;
	time(&start);
#endif
	// 本文 --------------------------------------
	int probs = ri();
	FOR(prob_index, probs)
	{
		N = ri();
		K = ri();
		FOR(i, N)
		{
			c[i] = ri();
			t[i] = ri();
			s[i] = ri();
			ppd("[%d] c, t, s = %d, %d, %d\n", i, c[i], t[i], s[i]);
		}

		max_score = 0;
		solve(1, 0);
		printf("Case #%d: %d\n", prob_index + 1, max_score);
	}

	// 本文終わり --------------------------------
#ifdef LOCAL
	time_t end;
	time(&end);
	printf("%ld sec.\n", end - start);
#endif
	return 0;
}

C. ビット数

N = 1から順に手で解いたら、a, bの片方は全ビットが立つみたい。
よくわかんないけどそれで書いてAC。

require 'pp'

# http://0xcc.net/ruby-bsearch/index.html.ja
# require './bsearch'

# https://github.com/kanwei/algorithms
# require 'rubygems'
# require 'algorithms'
# include Containers

def ppd(*arg)
  if $DEBUG
    pp(*arg)
  end
end

def putsd(*arg)
  if $DEBUG
    puts(*arg)
  end
end

def read_ints()
  readline().split.map{|e| e.to_i }
end

def read_floats()
  readline().split.map{|e| e.to_f }
end

def read_words(count)
  words = []
  for i in 1 .. count
    words << readline().chomp
  end
  words
end

def bit_count(value)
  byte = value

  count = 0
  count += byte & 1 and byte >>= 1 until byte == 0

  count
end


# main
t_start = Time.now

# ここから問題に応じて
cases = readline().to_i

(1 .. cases).each do |case_index|
  n = read_ints[0]

  a_max = 0

  if n == 2
    a_max = 1
  elsif (n & 1) != 0
    a_max = n / 2 + 1
  else
    a_max = n / 2
  end

  leftmost = 0
  for i in 0 .. 64
    if (a_max & (1 << i)) != 0
      leftmost = i
    end
  end

  all_one = (1 << leftmost) | ((1 << leftmost) - 1)

  raise if all_one > n

  case_1 = bit_count(all_one) + bit_count(n - all_one)

  cut_one_bit = all_one >> 1
  case_2 = bit_count(cut_one_bit) + bit_count(n - cut_one_bit)

  puts "Case ##{case_index}: #{[case_1, case_2].max}"

  # progress
  trigger = 
    if cases >= 10
      case_index % (cases / 10) == 0
    else
      true
    end

  if trigger
    STDERR.puts("case #{case_index} / #{cases}, time: #{Time.now - t_start} s")
  end
end

お引っ越し

自前サーバでMovableType立ててたけど、記事の編集がレスポンス悪すぎなのでお引っ越し。
はてなユーザーの技術屋さん多いから使い勝手に期待。
うん。細かい修正もAjaxでできて快適。

はてブでのフィードバックでモチベーション上がるかも、ってとこにも期待。

外部の画像もインラインで貼れた
http://a.yfrog.com/img861/1299/3xnuj.jpg

ポイントプログラムを利用解除したらAdSenseも消えた。すばらしい。