Excel 方眼紙を作る方法他

Tips と言いますか、メモ書き。時々忘れるので。
画像の編集とかの場合には、「Excel 方眼紙」を作ると便利です。特に Excel 2010 にもなると、ワードアートなんかを使って綺麗なロゴが作れます。ここのロゴや トニー電の.NETプログラミング講座 のロゴは Excel 2010 で作っています。

■背景が白の方眼紙を作る

1.Excel 2010 を起動して、列を CZ ぐらいまで適当に選択
2.そのまま右クリックして、「列の幅」をクリックする。

3.列の幅を「2」に設定
4.方眼紙っぽくなります。

5.リボンで「ファイル」→「オプション」をクリック
6.「詳細設定」のタブで、「枠線を表示する」のチェックを外す。

あるいは、リボンの「ページレイアウト」→「枠線」→「表示」

7.これで、背景が白の Excel シートができます。

■複数のオブジェクトを選択

貼りつけたオブジェクトを選択したい場合は、ひとつひとつ選択してもよいのですが、以前のようにマウスで囲みたいですよね。Excel 2010 の場合は、リボンの「ホーム」→「検索」の▼ボタンを押して「オブジェクトの選択」でできます。

こんな風に範囲で選択できます。

■オブジェクトをグリッドに合わせる

方眼紙なのですから、グリッドにぴったりに合わせることもできます。
何かのオブジェクトを選択した状態で、リボンの「書式」→「配置」の「枠線にあわせる」をチェックします。

こうすると、枠線(グリッド)に合わせることができるので、図形を綺麗にそろえることができます。

微妙な位置合わせは、図形を選択した状態で、カーソルキー(↑↓など)でドット単位(多分)動かせるので、これを使うとよいかも。

■図形から画像ファイルを作る、クリップボードへコピーする

Excel には面白い機能があって、セルを選択した状態にして、Ctrl+C すると、画像がコピーされます。

この状態で、Ctrl+C でコピーします。クリップボードに転送されるので、ペイントに貼りつければ、画像ファイルに保存できます。

こんなところが、私の編集スタイルですね。高価な画像ソフトを持っていないのですが、まあ最近はこれで十分かと。

カテゴリー: 雑談 | 2件のコメント

PC から iPhone 専用サイトを覗く方法(User-Agentの偽装)

端的に言えば「User-Agent」を偽装します、ということです。
User-Agent というのは、HTTP プロトコルのヘッダ部に設定してある「今、私はこのブラウザを使っています」という印ですね。サーバーのほうで、携帯電話からなのか、PC からなのか、iPhone/iPad からなのか、Android からなのか、ということが分かります。

と、云いますか、当然これは「印(ルール)」でしかなくって、WebClinet クラスなり、Firefox のプラグインを利用するすれば、簡単に自分が何者かを偽装するこができます(「詐称」という言葉を使っているところもあるけど、技術的にすり替えるだけなので「偽装」のほうがよいかなと)。

さて、なぜ iphone 専用のサイトを pc から覗く必要があるかというと、hon.jp の api を利用して amazon 風のブログパーツを作りたいからなのです。amazon ブログパーツは、書籍の画像を返してくれるのですが、hon.jp api は、画像を返してくれません。hon.jp の場合、タイトル検索などのテキスト検索が主なので、電子書籍の画像は各社のサイトの中にしかありません。pc 用の電子書籍がある場合は、pc からキャッシュ的に取得すればよいのですが、iphone 用しかない場合には、iphone 用のページにアクセスする必要があります。なので、画像を取得するためには iphone であると偽装して画像用の url を取得しないと駄目なのです。

と前置きはそれくらいにして、ざっとこんな感じ。

private void button2_Click(object sender, EventArgs e)
{
	// url を取得
	string url = textBox1.Text;
	WebClientEx client = new WebClientEx();
	// cookie を設定
	client.Cookie = new CookieContainer();
	client.Headers.Add("User-Agent", "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_4 like Mac OS X; ja-jp) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8K2 Safari/6533.18.5");
	// sjis で全て読み込み
	StreamReader sr = new StreamReader(client.OpenRead(url), Encoding.GetEncoding("shift_jis"));
	string content = sr.ReadToEnd();
	sr.Close();
	// ファイルに出力
	StreamWriter sw = new StreamWriter("temp.html", false, Encoding.GetEncoding("shift_jis"));
	sw.Write(content);
	sw.Close();

	// ブラウザコントロールで表示
	webBrowser1.Navigate("file://" + @"D:\work\blog\src\SampleUserAgent\SampleUserAgent\bin\Debug\"+ "temp.html");
	// テキストボックスでも表示
	textBox2.Text = content;

}

文字コードが sjis になっているのは、電子文庫パブが sjis で返すからです。本来は charset を見てコードを判別しないと駄目ですね。また、電子文庫パブの場合は、cookie が必要になるのでこれも設定してます。
Cookie 自体は、内部の HttpWebRequest を弄る必要があるので、こんな風に継承したクラスを作ります(という例があった)。

class WebClientEx : WebClient
{
	public CookieContainer Cookie { get; set; }
	protected override WebRequest GetWebRequest(Uri address)
	{
		HttpWebRequest wreq = base.GetWebRequest(address) as HttpWebRequest;
		wreq.CookieContainer = this.Cookie;
		return wreq;
	}
}

実行するとこんな感じで取得できます。

画像が表示されないのは、img タグの src 相対パスになっているからです。
保存した html ファイルを開いて を追加すると、こんな感じで表示できます。

これで画像の url が分かるので、ブログパーツを表示する時に画像が表示できますね。
画像 url が変わる可能性もあるのでキャッシュしてもいいのですが、まぁ、amazon と同じで画像ファイル名はほとんど変わらないのではないかなと。これは、いくつかの電子書籍の会社を探ってから考えましょう。

■参考
userAgent一覧/ユーザーエージェント一覧
http://www.openspc2.org/userAgent/

カテゴリー: C# | コメントをどうぞ

UILabelやUIImageViewのタッチイベントを取得する

iPhone プログラミングの中で、ボタンのクリックイベントは簡単に取れるのですが、ラベルや画像のクリックイベントが手軽に取れません。いくつか調べると、UITapGestureRecognizer を使うか、touchesEnded メソッドをオーバーライドするか、という方法があるのですが手軽でもないので。

iphone - How can I determine if a UILabel was touched? - Stack Overflow
http://stackoverflow.com/questions/2539380/how-can-i-determine-if-a-uilabel-was-touched
UILabelのタッチイベントを検出する方法 ? 拡張現実ライフ
http://akio0911.net/archives/3419

どうやら、tag を使うと一番手軽そうなので紹介しておきます。

最初に、viewDidLoad の中で tag を設定しておきます。userInteractionEnabled プロパティの値を YES にしておかないとイベントが発生しなくなるので注意してください(何故イベントが発生しないのかは不明)

- (void)viewDidLoad
{
    [super viewDidLoad];
	// Do any additional setup after loading the view, typically from a nib.
    labelCommand.userInteractionEnabled = YES;
    labelCommand.tag = 100;
    imageLogo.userInteractionEnabled = YES;
    imageLogo.tag = 101;
}

「100」とか「101」とかは、適当な値で十分です(0は初期値なので駄目)。
#define しても良いのですが、使い捨てなのでそのまま。

touchesBegan イベントをオーバーライドします。ViewController 上にあるイベントをタッチイベントを全てフックするので、これから目的のオブジェクトを探し出します。

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [[event allTouches] anyObject];
    if ( touch.view.tag == labelCommand.tag )
        [self clickCommand:labelCommand];
    else if ( touch.view.tag == imageLogo.tag )
        [self clickLogo:imageLogo];
}

ここで、touch.view.tag と、ラベルの tag の値とを比較します。本来は switch で比較するのが良いのでしょうが、面倒なので(苦笑)そのまま tag の値と比較しています。実は、こうすると #define が必要なくなるのです。

イベントは、ボタンのクリックイベントのように書きたいため、ViewController 上で定義した clickCommand を呼び出します。一応、sender はラベルや画像オブジェクトそのもの渡します。

-(IBAction)clickCommand:(id)sender
{
    NSLog(@"in clickCommand");

}
-(IBAction)clickLogo:(id)sender
{
    NSLog(@"in clickLogo");
}

こんな風に、あたかもボタンと同じようにしておきます。こうすると、クリックイベントみたいで分かり易いですよね。

実行すると、普通のボタンと同じようにログが出力されます。

カテゴリー: Objective-C | コメントをどうぞ

LinqToTwitter を使う

ツイートキャッチ★★★を LINQ to Twitter を使うように書き換え中...と言いますか、なんか、LINQ to Twitter って、内部で Invoke をしているらしく、サーバーエラー時の挙動がおかしいんですよね。なので、Twitter が不安定な時の対処が難しい、というのが前置きなのですが。

とは云え、使い方は結構簡単です。LINQ を使って検索するので、検索系はOKかと。更新系はどうなのかいまいち確認してないのでツイート専用のほうは、TwiLib を使ったままなんですが。

例えば、ログインしている人のツイート数を取得するのは、こんなに簡単に書けます。twitter が返してくる xml の要素名と、linq to twitter で定義しているプロパティ名との「ずれ」が、いまいち分かりづらいのですが、慣れればなんとか。

// ツイート数を取得
var ctx = new TwitterContext(this.auth);
var user = (from t in ctx.User
			where t.Type == UserType.Show &&
			t.ScreenName == username
			select t).First();
this.profile_image_url = user.ProfileImageUrl;
this.tweet_count = user.StatusesCount;

で、具体的に oauth 認証をどうするかというと、ツイートキャッチでは次のようにしています。

if (accessToken == "")
{
	auth = new PinAuthorizer();
	auth.Credentials = new InMemoryCredentials {
		ConsumerKey = this.consumerKey,
		ConsumerSecret = this.consumerSecret
	};
	auth.UseCompression = false;
	auth.GoToTwitterAuthorization = link => {
		Process.Start(link);
	};
	auth.GetPin = () =>
	{
		FormAuth frm = new FormAuth();
		frm.ShowDialog();
		return frm.PinCode;
	};
	auth.Authorize();
	this.SavaAuth();
	return;
}
auth = new PinAuthorizer();
auth.Credentials = new InMemoryCredentials
{
	ConsumerKey = this.consumerKey,
	ConsumerSecret = this.consumerSecret
};
auth.OAuthTwitter.OAuthToken = this.accessToken;
auth.OAuthTwitter.OAuthTokenSecret = this.accessSecret;

oauth 認証を使う時のキーワードとして、

  • アプリケーションが使う consumerKey
  • アプリケーションが使う consumerSecret

のセットと

  • 認証後に使う accessToken
  • 認証後に使う accessSecret

の4つのキーワードがあります。

手順としては、

  1. アプリケーションを作るときに consumerKey と consumerSecret を取得(アプリに書き込む、app.configとか)
  2. ユーザーが初回実行時に consumerKey と consumerSecret を使って pincode を得る。
  3. pincode を使って、accessToken と accessSecret のセットを得る。
  4. web ならば、ユーザー名と紐づけて保持、winodws アプリならばレジストリとかに保存

  5. 次回以降は、consumerKey, consumerSecret, accessToken, accessSecret の 4つがあれば ok

という具合です。

なので、ワンクッションだけユーザーに pincode を入力して貰う必要があるのです。まぁ、これが認証ということです。勿論、内部ブラウザで表示させたりして、pincode を自動入力させることも可能ですが、手入力でも対して手間じゃないのでそのまま。

で、linq to twitter はこの pincode を入力するとこがややこしくて、下記のように GetPin にコールバックを登録させます。

	auth.GetPin = () =>
	{
		FormAuth frm = new FormAuth();
		frm.ShowDialog();
		return frm.PinCode;
	};

どうしようかと悩んだのですが、ツイートキャッチ★★★では、別のダイアログを出して対処をするようにしました。

linq は検索のほうを得意とするので、直近のツイートを取得なんてのは、こんな風に書けます。

/// <summary>
/// ツイートを取得
/// </summary>
/// <param name="sname"></param>
/// <param name="max_id"></param>
/// <returns></returns>
private List<Status> GetTweets(string sname, string max_id = "")
{
	var ctx = new TwitterContext(this.auth);
	var items = from t in ctx.Status
				where t.Type == StatusType.User
				&& t.ScreenName == username
				&& t.Count == MAX_TWEET
				&& t.MaxID == max_id
				select t;
	var lst = items.ToList<Status>();
	return lst;
}

# MaxID はクローリングのために使っているのですが、元のソースは int 型になっているのでエラーになります。ソースを string 型に適当に直しています。現在、twitter id は intの範囲を超えてしまっているので、string で保持するのがよいでしょう。

実は、最大の難関がサーバーエラーの対処なのですが、そのままではうまく動かないので諦めました。
なので、試しに oauth 認証の部分だけ linq to twitter のコードを使って、戻されてきた xml データは自前で解析するというのを試してみました。この話しは別の記事で。

カテゴリー: C# | コメントをどうぞ

inline php を使う

WordPress ? Inline PHP ≪ WordPress Plugins
http://wordpress.org/extend/plugins/inline-php/

先日 wordpres 上で javascript が動作するプラグインを入れたのですが、php のコードを直接動かすことも可能なのですね。
公開する場合には、うかつな php コードを入れるとセキュリティ上危ないのでお勧めできませんが、まぁ、試しにいれるのも良いかなと。

 [ exec]
 echo "テスト表示";
 [ /exec]

のように簡単に書けますということで。

で、プログインのソースコードを見ていたのですが、実は大したことはやってないのですね。数行だけなのです。なるほど、こういう風に拡張するのかという。

カテゴリー: Wordpress, 開発 | コメントをどうぞ