2010/05/13

Sony TypeP (VGN-P70H) / Ubuntu 10.04LTS インストール覚書

インストール用USBイメージの作成



多分、ISOとddで作れるけど、手軽に。


  1. Unetbootinをダウンロード

  2. Unetbootinで、Ubuntu 10.04 ISOイメージを選択して、USBメモリに展開

  3. TypePをUSBブート



ディスプレイドライバの設定



HardwareSupportComponentsVideoCardsPoulsboの指示に従う。

具体的には、ここのスクリプトを使わせていただく。以下を端末上で実行。aptは前準備。


$ sudo apt-get install dkms fakeroot build-essential
$ wget http://dl.dropbox.com/u/1338581/Gma500/scripts/poulsbo_lucid.sh && bash ./poulsbo_lucid.sh


これで運が良ければそのまま動くけど、メモリマップの関係で使用メモリに制限をかけないと動けない場合がある。
その場合は、PC起動時にshift を押しっぱなしにして、grub2のメニューを呼び出して、RecoveryモードでOSを起動する。

その後、/etc/default/grubの GRUB_CMDLINE_LINUX_DEFAULT を以下のようにする。


GRUB_CMDLINE_LINUX_DEFAULT="quiet splash mem=2000mb"


この場合、2000mbにしているけど、正確にはメモリマップを確認してユーザーが使用可能な領域サイズを指定する。
一番お手軽な方法は、/proc/mtrr を見てMemoryTypeRangeRegisterを見るとか。


$ cat /proc/mtrr
reg01: base=0x00000000 ( 0MB), size= 2048MB, count=1: write-back
reg02: base=0x07f80000 ( 2048MB), size= 8MB, count=1: uncachable
(以下略)


uncachableな領域は、MMIO レジスタ領域なのでユーザー領域としては使えない。write-backな前半のreg01が使える領域になる。ただし、前半10MB程度はBIOS、ACPI BIOSが使うのでそこも使えないから、2048MBから10MBとか引く(メモリマップを見れば、どのくらい引くかわかります)。

内蔵マイクを使えるようにする



そのままでは、何故か内蔵マイクは有効にならない(alsa上にはそれっぽく見えるけど、音が拾えない)。
こちらに参考情報あり。

[ubuntu] Microphone not working on VAIO VGN-SR19VN - Ubuntu Forums

alsaの設定ファイル /etc/modprobe.d/alsa-base.conf に以下を追記すると、何故かマイクが使えるようになります。


options snd-hda-intel model=toshiba-s06


非常に気持ち悪い対処方法ですが....

2009/10/16

Plagger / ニコ動をlibx264でエンコ(プリセット使用)

Plaggerでニコニコ動画のplaylistをひっぱってきて、iTunesまで登録する、という事をやっていたのだけれども、h.264を指定していたつもりが、mp4に変換されてしまっていた。Plagger::Plugin::Filter::FFmpegがどうも原因のような気がしてきた。

[現象]
yamlの module: Filter::FFmpeg内の config:で、video_codec: libx264 を指定しても、mp4で変換されてしまう。

[原因]
FFmpeg.pm 内で device: を指定しない場合、無条件に device: ipod を指定した事になる為。

device: ipod は、mp4で変換するプリセットになるので、deviceを指定しないと、自動的にmp4で変換されてしまう。deviceに ipod / psp 以外を指定すると、hashエラーになる。なので、とりあえず、plagger/lib/Plagger/Plugin/Filter/FFmpeg.pm を以下のように変更。

--- plagger/lib/Plagger/Plugin/Filter/FFmpeg.pm.orig 2007-10-30 15:01:02.000000000 +0900
+++ plagger/lib/Plagger/Plugin/Filter/FFmpeg.pm 2009-10-15 05:12:25.000000000 +0900
@@ -51,7 +51,7 @@
my $output_file = File::Spec->catfile($self->conf->{dir}, "$file");
my $output_options = {
file => $self->convert($output_file),
- device => $self->conf->{device} || 'ipod',
+ device => $self->conf->{device},
title => $self->convert($entry->title),
author => $self->convert($entry->author),
comment => $self->convert($entry->summary),

本題。
最近のffmpeg で libx264 でエンコードする場合、プリセットが用意されているのであまり考えなくても高画質にh.264に変換してくれる(拘る人は拘りそうだ...)
現時点で私が使っているのは macports 最新の version 0.5

こちらの iPod Video Encoding Guide を参考に、-vpre を使った変換用yamlは以下みたいな感じに。


global:
plugin_path:
- /Plagger/Plugin/Path
log:
level: debug

plugins:

- module: Subscription::Config
config:
feed:
- url: http://www.nicovideo.jp/mylist/_YOURID_?rss=atom

- module: Filter::FetchNicoVideo
config:
mail: _YOURMAIL@ADDRESS_
password: _YOUROUTPUT_
dir: /output/path
id_as_filename: 1

- module: Filter::FLVInfo
rule:
expression: $args->{entry}->enclosure->type eq 'video/x-flv'
expression: "not -e File::Spec->catfile('/output/path', $args->{entry}->enclosure->filename . '.mp4')"

- module: Filter::FFmpeg
config:
command: /opt/local/bin/ffmpeg
ext: m4v
dir: /output/path
encoding: utf8
options:
format: ipod
video_codec: libx264
audio_codec: libfaac
audio_sampling_rate: 44100
audio_bit_rate: 128k
extra_options: -vpre libx264-hq -vpre libx264-ipod320 -threads 0


- module: Filter::RewriteEnclosureURL
config:
rewrite:
- local: /output/path
url: http://_YOURWEBSERVER_

- module: Publish::Feed
config:
format: RSS
dir: /output/path
filename: nicopla.xml


/output/pathや_HOGEHOGE_は便宜書き換えてくだはい。

2009/07/29

Prowl / iPhone に C#でPush する

Prowlサーバーに対してのメッセージ通知は、実際のところ httpのPOST/GETで通信します。なので、Prowlサーバーに対して、適切にデータを投げれば簡単にPush通知が実現できます。
以下は C# / .Net での送信例です。エラー処理をちゃんとしてないので注意。

using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using System.Net;
using System.Collections.Specialized;

namespace ProwlTest
{
class Program
{
static void Main(string[] args)
{
Encoding enc = Encoding.UTF8;
string url = "https://prowl.weks.net/publicapi/";

try
{
WebClient wc = new WebClient();
NameValueCollection nvc = new NameValueCollection();
wc.Headers.Add("User-Agent",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows XP)");

// API Key の設定
nvc.Add("apikey", "ここに40文字のAPI Keyを記述");

wc.QueryString = nvc;

// API Key が有効か確認
byte[] resData = wc.DownloadData(url + "verify");

// 結果がXML形式で返ってきます
string resText = enc.GetString(resData);

Console.WriteLine(resText);

/* !! ここで返ってきた結果を見てエラー処理すべき !! */


// 実際のメッセージ投稿
// 各データは文字長が決まってるので注意

// priority: An integer value ranging [-2, 2]: Very Low, Moderate, Normal, High, Emergency.
nvc.Add("priority", "0");

// application [256]:The name of your application or the application generating the event.
nvc.Add("application", HttpUtility.UrlEncode("アプリケーション名", enc));

// event [1024]:The name of the event or subject of the event.
nvc.Add("event", "notify");

// description [10000]: A description of the event, generally terse.
nvc.Add("description", HttpUtility.UrlEncode("日本語メッセージはUTF8をUrlエンコードしてやれば通ります。" +
"URLも記述すると、勝手にリンクをはってくれます。" +
"http://prowl.weks.net/", enc));

wc.QueryString = nvc;
resData = wc.DownloadData(url + "add");
resText = enc.GetString(resData);

Console.WriteLine(resText);
}
catch (Exception err)
{
Console.WriteLine(err.Message);
}
finally{
wc.Dispose();
}
}
}
}

Prowlサーバーからの結果は、XML形式で返ってきます。
詳細は、API Return format を参照の事。

Prowl / iPhone に PerlでPush する

iPhoneにProwlを導入してみた。


Growlという OSXでは結構お馴染みのポップアップ通知アプリケーションの仕組みがあって、Growlに対応したアプリケーションは共通の通知領域に、色々なお知らせ情報を表示する事ができます。例えばメッセンジャーでのメッセージや、iTunesの曲変更情報、などなど。
最近では、Windows版もあります。

Growl自体にはネットワーク越しにメッセージを通知しあったり、フォワードする機能があって、他のマシンでの情報を、もうひとつ別のマシン上にポップアップするとか、できる訳ですね。

Prowlはその仕組みにのっかって、メッセージをiPhoneにフォワードして、Push通知をやろうとするアプリケーション。動作としては、
Growl(送信側) → Prowlサーバー → iPhone
という流れになるんだけど、実際のところ Prowlサーバー自体は Web経由でもアクセスできるし、ProwlサーバーのAPIも公開されてるので、Growlがなくても正しい手順を踏めば、iPhoneに対するPush通知が可能になる。

つまり、汎用的な Push通信手段として利用できる訳です。
という訳で、PerlとC#から ProwlをつかってPush通知する方法。

前準備

ProwlサーバーのAPIを使うには、Prowlにレジストした後にAPI Keyを取得する必要があります。
取得方法は、Settings のページで generate key ボタンで生成するだけです。
40文字のランダムな文字列が取得できると思いますが、それがAPI Keyになります。

perl

perlでは、CPANに WebService::Prowl というモジュールがあるので、これで簡単に使えます。メンテナは日本の方ですね。
使い方はサンプルそのままですが、以下のような感じです。


#!/usr/bin/perl

use WebService::Prowl;

my $apikey = "ここに取得した40文字のAPI Keyを記述";

my $ws = WebService::Prowl‐>new(apikey => $apikey);
$ws‐>verify ⎪⎪ die $ws‐>error();
$ws‐>add(application => "Sample App",
event => "notify",
description => "This is sample notification.");