2月
19

[ruby]pryでソースコードを表示

pry-docを入れると、C実装の部分も表示できる。

$ gem install pry
$ gem install pry-doc
$ pry
$ show-source Array#sample
From: array.c (C Method):
Owner: Array
Visibility: public
Number of lines: 106
 
static VALUE
rb_ary_sample(int argc, VALUE *argv, VALUE ary)
{
    VALUE nv, result, *ptr;
    VALUE opts, randgen = rb_cRandom;
    long n, len, i, j, k, idx[10];
    long rnds[numberof(idx)];

9月
08

メモ[wpf][mvvm][livet]LivetのInteractionMessageAction#InvokeActionが実行されない時

「うーむ。なんでInvokeされないんだろう???」と思っていたら、
こちらのコメントに助けられました。

InteractionMessageActionのInvokeActionOnlyWhenWindowIsActive 依存関係プロパティを “False”

規定値はTrueとなっているのでウインドウの表示非表示など扱っている場合は注意。

7月
20

[xaml]マークアップ拡張の波括弧のエスケープ

xamlでは波括弧 {curly brace} はマークアップ拡張の開始・終了を意味する特別な文字なので、属性に対して波括弧の入った文字列をそのまま使うことができません。

例えば文字列書式を属性の値として設定したい場合、波括弧を使うことになりますが、このままでは{}内がマークアップ拡張として評価されてしまいエラーとなります。

        <Setter Property="StringFormat" Value="{0:0.##}" />

このような場合には、{}を先頭につけるとエスケープしてくれます。

        <Setter Property="StringFormat" Value="{}{0:0.##}" />

{} Escape Sequence / Markup Extension
http://msdn.microsoft.com/en-us/library/ms744986.aspx

7月
10

[wpf]WPFコントローラのXAMLを調査する方法

WPFをベースとしたexeファイルやdllファイルにはリソースとしてxamlのコンパイル済みバイナリデータ(baml形式)が埋め込まれています。

各種ライブラリや標準のコントローラのデザインや機能をカスタマイズしたい時は、WPF Inspectorsnoopなどでビジュアルツリーを探って調査したりしますが、一部分だけカスタマイズしたいのにも関わらず、ある程度まとまった階層まで遡及してテンプレートを修正しなければならない場合など、手っ取り早くXAML形式そのものを取得したくなります。

このような場合は、baml形式のデータをxaml形式に変換できるソフトを仕様すると便利なようです。フリーで有用なものをさがしてみたところ、ILSpyというデコンパイラが良さそうでした。

ILSpy
http://ilspy.net/

例えば、WPFの標準のボタンのXAMLを取得したい場合は、
PresentationFramework.Aero.dll(テーマ毎にDLLがある。この場合はAero)
を開きます。 ファイル名.g.resources の形式でリソースがありますので、その配下のbamlを開きます。

すると、右ペインのテキストビューにXAMLが表示されるので、任意のリソースを利用する事ができます。

5月
08

[wpf]MenuをResourceDictionaryに移動する

xamlファイルが数百行に及ぶと何らかの機能別にファイルを分割し見通しを良くしたくなります。

その時の選択肢として考えられるのが、

  1. UserControl化する
  2. ResourceDictionaryに登録する

です。今回は構造的な変更を求めず、リソースディクショナリとしてMenuをxamlファイルに外出ししてみます。

menuDictionary.xaml

<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
	<Menu x:Key="menu">
		<MenuItem Header="ファイル">
	()

本体のxamlでリソースディクショナリを読み込むようにし、Panelの子要素としてStaticResourceとしてキーを指定します。
MainWindow.xaml

 <Window.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="menuDictionary.xaml"/>
()
 
  <DockPanel>
        <!-- メニュー -->
        <Grid DockPanel.Dock="Top">
            <StaticResource ResourceKey="menu"/>
        </Grid>
	<!-- 本体 -->
()

4月
02

[IDE][VisualStudio]拡張機能

すっかりIDEはeclipseに馴らされてしまったためか、古巣のVisual Studioに戻ってきたら不便で仕方ない。
少し触ってみて入れた拡張機能などメモしておく。

Productivity Power Tools 拡張機能
http://visualstudiogallery.msdn.microsoft.com/d0d33361-18e2-46c0-8ff2-4adea1e34fef

eclipseから移民してきて真っ先にムッキーとなるのが、ctrlキーを押しながらクラス名をクリックすると定義に移動っていうのができない事なのだが、これを入れるとそれができるようになる。それはごく一部の機能でしかなく、いろんな機能がてんこ盛り。これはマストじゃないだろうか。(唯一気に入らないのはタブの色が砂漠と青空のグラデーションがかけられてアメリカナイズされるところ。)

VSColorOutput | Blue Onion Software
http://blueonionsoftware.com/vscoloroutput.aspx

これはデバッグ時に出力ウィンドウの文字色をルールベースで変更してくれるツール。
ツール>オプション>環境>フォントおよび色の表示項目に
VSColorOutputという項目が複数追加されるのでこれを任意の設定に変更する。
(私の環境ではこれを入れた副作用でテキストエディタの現在行の表示が変更されてしまったので、”Current Line”系の設定を直す必要があった。)

Snippet Designer – Home
http://snippetdesigner.codeplex.com/

eclipseでいうコードテンプレートはVSではスニペットというらしいが、標準ではユーザー定義のスニペットを入れるのがXMLを書いたりしなければならないメンドクサイものらしいのだが、これを入れるとその煩わしさから解放される。

他、
NuGet Package Manager
Git Source Control Provider
VsVim
など。

まだまだいっぱいありそう。

4月
02

[c#]typedefのようにつかえるusing alias ディレクティブ

C#のusingキーワードはまずステートメントとディレクティブの2通りに分けられ、
さらにディレクティブに2通りあるので3通りの機能がある。

最も頻繁に使うのは、ディレクティブとして

using System.Collections.Generic;
class A { List<string> a; }

といったような完全修飾名を省略する場合など、使用用途としてはjavaのimportに対応するもの。

対して、ステートメントとしては

string line;
using (StreamReader reader = new StreamReader("file.txt"))
{
  line = reader.ReadLine();
}
Console.WriteLine(line);

こういうファイナライズが必要なオブジェクトに対してDisposeメソッド(IDispose実装クラス)を実行してくれる機能がある。

この2つがよく使う有用な機能だと思われるが、さらにCのtypedefのような別名としての使い方がある。
(これをusing alias ディレクティブと呼ぶらしい)

using Hoges = List<Hoge>; // 型や名前空間を指定できる

この場合のスコープが気になったが、using ディレクティブのスコープは、ディレクティブが記述されているファイルに限定される。また、using aliasディレクティブの右辺は直前のusingディレクティブとは関係なしに完全修飾する必要がある、とのことだがそれは同一スコープの場合っぽい。

usingディレクティブ
usingディレクティブ
usingディレクティブ
usingエイリアスディレクティブ←ここだと直前のusingとは無関係に完全修飾する必要がある。
namespace A{
  usingエイリアスディレクティブ←ここだと省略できる。
  class A{}
}

4月
01

WPF勉強中。。。

Windowsプログラミングを10年ぶりくらいにするので、C#,WPF,MVVMについて調べている。

C#はJAVAと同じようなものだと聞いていたが5秒で触れてわかるほど全く違うじゃないか(笑)
JAVAより言語仕様が大きいし、JAVAより関数言語的。

WPFは確かにすごいが深淵な森すぎて迷子になる。でもこれは素晴らしいのでぜひとも習得したいところ。

MVVMは昔でいうDocument-ViewスタイルのViewの部分を2層に分けたものと考えた方が分かりやすい気がする。広義のMVCと考えるよりこっちの方がしっくり来る。WebのMVCを連想してしまうとWebだとMがステートレスなのでVMにMの部分を書いてしまうといった誤解が生まれる。

VC++とMFCの頃から比べると随分と表現力が高くなった印象。
MFCでまともなデザインにしようと思うと普通に血反吐はけたもんねー。

3月
22

[C#][Java]classのアクセス修飾子について

メソッドに対してのアクセス修飾子ではなく、クラスに対してつけるアクセス修飾子についてC#とJAVAを比較してみた。

アクセス修飾子C#Java
public制限なし。制限なし。
internal同アセンブリ内から参照可能。当該の修飾子なし(言語レベルでの同機能はない)。
無印internalをつけた場合と同様。同じパッケージ内から参照可能。
protectedトップレベルでは修飾できない。アウタークラスもしくはアウタークラスの継承クラスから参照可能。
internal protectedprotectedと同様だが同アセンブリ内でのみ参照可能。当該の修飾子なし。
privateトップレベルでは修飾できない。アウタークラスから参照可能。

インナークラスはC#の場合、Javaでいうstaticなインナークラスになる。
さらに紛らわしいのはc#ではstaticはモノステートパターンのようなインスタンスを持たないクラスを宣言するときの修飾子として使われる。

7月
24

[RoR]rest-clientでpaperclipに対応した画像フォーム送信を再現してみる

in a state of ease: Herokuに画像をアップロードする Rails 3 + Paperclip + Amazon S3 http://wine4u.seesaa.net/article/170193214.html
こちらの記事を参考に、Rails3にPaperclipを導入して画像をアップロードするrailsプロジェクトを作ってみたので、その時の健忘録。

ひとまず今回はAWS S3は割愛する事にしてシンプルにrails3にPaperclipのみを導入してみる。

Gemfileに追記。

gem 'paperclip'

bundle installの実行。

$ bundle install

なお、ruby1.9.2以上でないと次の通りエラーメッセージが出てしまい最新版(3.0〜)は導入できない。

Gem::InstallError: paperclip requires Ruby version >= 1.9.2.
An error occured while installing paperclip (3.1.4), and Bundler cannot continue.
Make sure that `gem install paperclip -v '3.1.4'` succeeds before bundling.

このような場合(ruby1.8系等)は ~>2.7を指定する。

gem 'paperclip', '~> 2.7'

bundle installし直すと無事インストールできる。

そして、記事の通りproductというモデルとそのコントローラーをscaffoldで自動生成し、
migration、modelやpartial view、等いくつかの変更を加える。

変更が済んだら、$rails s で起動して新規登録画面をブラウザで確認する。

名称と画像を登録すると、添付画像が指定のサイズ通り加工されサーバサイドに保存される。

なお、開発環境をクライアント・サーバとする場合は、ImageMagickが事前にインストールされている必要がある。OSXではHomebrewやMacPortsで導入する。Winは試していない。

このようにPaperclipを使うと非常に簡単に添付画像の保存、DBへの登録ができるようだ。

rest-clientで新規登録時のPOST送信を再現してみる

この新規登録フォームからのPOST送信をブラウザ経由でなくrest-clientで送信した場合、
どのように記述すれば同様の事ができるか試してみた。

なお、Rails側のモデルのクラス、およびテーブルは次のようになっている。

project.rb

class Product < ActiveRecord::Base
  has_attached_file :photo,
    :styles => {
      :thumb  => "100x100",
      :medium => "200x200",
      :large => "600x400"
    }
end

モデル: product
添付ファイル: photo

schema.rb

  create_table "products", :force => true do |t|
    t.string   "name"
    t.datetime "created_at",         :null => false
    t.datetime "updated_at",         :null => false
    t.string   "photo_file_name"
    t.string   "photo_content_type"
    t.integer  "photo_file_size"
    t.datetime "photo_updated_at"
  end

テーブル: products
カラム(画像メタ情報関連): photo_*
カラム(テキスト関連): name

次にscaffoldで作成した登録フォームのHTMLを確認する。

scaffoldで生成したproductsの登録フォーム部分( http://127.0.0.1:3000/products/new 等)

<h1>New product</h1>
<form accept-charset="UTF-8" action="/products" class="new_product" enctype="multipart/form-data" id="new_product" method="post"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="&#x2713;" /></div>
 
  <div class="field">
    <label for="product_name">Name</label><br />
    <input id="product_name" name="product[name]" size="30" type="text" /><br />
    <input id="product_photo" name="product[photo]" type="file" /><br />
  </div>
  <div class="actions">
    <input name="commit" type="submit" value="Create Product" />
  </div>
</form>

HTMLの内容から、
メソッド:POST
MIMEタイプ:multipart/form-data
プロジェクト名:product[name]
添付ファイル:product[photo]
という構造であれば、シミュレートできそうである事がわかる。

試行錯誤した結果、次のような記述にすれば、再現できる模様。

これに対応するrest-clientでの送信例(functionalテストでの記述例)

  test "create a project via rest-client" do
 
    request = RestClient::Request.new(
      :method => :post,
      :url => "http://127.0.0.1:3000/products/",
      :payload => {
        :multipart => true,
        :product => {
          :name => "test_via_restclient",
          :photo => File.new("test/image/test.png")
        }
      })
    response = request.execute
 
  end

なお、CSRF検証は外して実施している。

class ProductsController < ApplicationController
  skip_before_filter :verify_authenticity_token # allow CSRF

参考

http – Ruby rest-client file upload as multipart form data with basic authenticaion – Stack Overflow http://stackoverflow.com/questions/11388090/ruby-rest-client-file-upload-as-multipart-form-data-with-basic-authenticaion

古い記事へ «

» 新しい記事へ