2012年2月5日日曜日

ダイレクトメールだけのアプリ

我が家では嫁さんがSoftbank版iphoneを使っているのに対して、僕はAUのIS12Tを使ってます。IS12Tはつい先日までsmsが送信できないというどうしようもない仕様だったので、ちょっとしたメッセージを送るのにTwitterのDirectMessageを使っていました。
DMだとキャリアやOSを超えて無料で使えるし、iphoneだとほぼリアルタイムでメッセージの通知が届くのでsmsの代用としては十分つかえます。

キャリアのSMSを置き換えるサービスは海外ではかなり普及しているらしい(よく知らないけど)ので、そういったサービスを使うという手もありますが、既に利用中のTwitterを使うのが手っ取り早いのでそうしてました。


さて、最近ようやくIS12TでもSMSの送信が出来るようになりましたが、キャリア間のSMSは有料という問題が残るので相変わらずダイレクトメッセージを使っています
IS12TでのTwitterのダイレクトメッセージの使い勝手はどうかと言うと、今一つかなと思います。
WindowsPhone7ではOSレベルでTwitterやFaceBookに対応していて、ピープルhubからつぶやいたり、MessageHubからFacebookのチャットが出来たりしますが、ダイレクトメッセージは使用できません。DMするにはtwitterアプリを使いますが、ちょっとひと手間あるかんじです


Twitterをあんまり活用できていない(友達少ない)僕としては、Twitterあぷりはあんまり使わないで、Peopleハブからつぶやきを見たり、開発関係のつぶやきを”ついさち”で確認したりしてます。
なのでダイレクトメールだけできるアプリがあれば良いんじゃないのと思って作りました

1月30日夜にAppHubにアプリの申請をしたら、2月2日の朝にはリジェクトの通知が来てました。公開地域をすべてにして申請したのですが、国別の条件にあっていないとの理由でした。
どうやらTwitterが禁止されている国があるので(中国とか)公開対象から外して再申請したら2月4日の昼に審査通過のメールが来ました


Messa_tw


facebookのメッセージだけのアプリMessa_fbを作って、twとfbを統合してMessaハブというアプリを作ろうと計画しましたが、もう別の事に気がイっているのでMessa_twだけになるでしょう。

ちょっとしたやり取りだけの用途なので、過去のメッセージをすべて管理とかはしません。受信するのは直近の20件程度のメッセージだけです

認証画面
初回の起動時やログアウト後は認証ページでアプリの認証をします。Usernameとパスワードを入力して認証するとパスコードが表示されるので、テキストボックスにコードを入力してEnterボタンを押します。
(パスコード入力のところは省略したいのですが、やりかたがわからなかったのです。認証の処理とかサーバーとの通信部分はReactiveOAuthライブラリを使わせてもらいました)


メイン画面
メッセージの受信はプッシュ配信やインターバルで受信とかには対応していないので、まずは更新ボタンを押します。
受信したメッセージに含まれる相手はメイン画面に登録されます。登録された相手を選ぶか、追加ボタンでフォローされているリストから相手を選んでメッセージをやり取りします。
(追加ボタンを押してもフォロワーが1000人以上いるような場合は相手を探すのはまず無理なので諦めてください)



メッセージ画面
メッセージ画面です。標準のMessagingアプリと同じ感じです
ただプッシュ配信されないので、Messageの受信はEmailへの通知とかと併用する事をお勧めします。

プッシュで通知ってどうやって実現するのだろう?












2012年1月14日土曜日

あけましておめでとうございます

いまさらですが、

あけましておめでとうございます

WindowsMobileのアプリ開発等について書いてきたこのブログですが、
去年は、8月末に 日本発のWindowsPhone7 IS12TがAUより発売される等色々ありました。

私も9月に縁があってIS12Tを開発用に頂く事ができました、実はそのとき、”月に1本MarketPlaceにアプリを申請する事”を目標としてしたのですが、実際は達成できませんでした。

9月 GuGUReader
10月 StickyIt!
11月 2011年11月11日...

と公開して

12月 バスナビ

を公開する予定でした。
バスナビアプリは完成したのですが、権利的な問題を含めて思うところがあって、公開する計画は頓挫しています。少しアプリの構成を作り直してから、公開できればなーと思っています。


2012年ですが、改めて目標は”月に1本アプリを申請するぞ!”です。
既に半年分の作りたいアプリのネタはあるので、週末プログラミングの時間とやる気さえあれば達成できるはず?



2012年1月5日木曜日

スキー旅行

年末に奥志賀高原にスキー旅行に行きました。子供たちは初スキーで、お父さんとお母さんは20年ぶりぐらいのスキーでした。

前日に雪が降ってサラサラのパウダースノー、天気もいい塩梅でスキー日和といった感じでした。

カメラはLUMIX DMC-FT1とWindowsPhone携帯電話IS12Tを持っていきました。どちらも防水仕様ですが、LUMIXはスキー手袋をした状態では電源ボタンが押せなくていちいち手袋を外さなければならなかったけど、IS12Tはシャッターボタン長押しで起動するので扱いやすかったです。さすがにツイートするのは手袋外さないとむりでした

というわけで以下IS12Tでの写真



第1リフト?で上がったゲレンデ。初心者向きの緩い傾斜。子供たちはココでスキースクールのレッスンを受けました。

手袋したままでもカメラが使えると言っても、リフトに乗っているときぐらいしか写真を撮る余裕は無いです

カンカン照りでもなく、良い天気でした

世間が本格的に休みに入る前だったので、結構すいてました。初心者には最高の環境だったと思います

樹氷。ホテルの方の先導で上の方のゲレンデまで行きました。初心者でいきなり頂上を目指すのは普通できませんが、先導があったので安心してついて行けました。

いきなり、全てのゲレンデを回れました。これも先導のおかげです。案内だけでなく、スキーのアドバイスまでしてくれました

気持ちえー

お昼ごはん、漆黒の醤油ラーメン

晩御飯 贅沢だ


贅沢すぎる~

デザート

デザートはラウンジにて頂くことにしました。窓の外は吹雪

次の日、良い天気ーと思ったらだんだん天気が崩れてきました。この日は神奈川まで帰らなきゃならないので、昼過ぎに切り上げて帰りました

2011年11月28日月曜日

バスナビ

先月から作っているバスナビアプリをβテスト登録してみました
http://www.sakasama.com/wp7beta/index.php

今のところ東急バスにしか対応していません。一応他のバス会社にも対応できるようにと考えていますが、バス情報はバス会社がそれぞれ独自に公開しているので、まとまったデータを取得する事ができなそうです。
バス会社毎にアプリで対応させていくのは大変なので、今後対応バス会社が増やせるかどうか???です。誰か手伝ってくれるといいなと思って、外部データを登録できるようにしています





















最終的には東急バスのバス運行情報ページを表示するのですが、モバイル向けに最適化されたページでは無いのを何とかしたいなと思ってますが、今のところ解決できていません。



ヘッダのメタタグでmeta name="viewport" content="width=device-width"を設定するとこんな感じになるのですが、よそ様のページにタグを突っ込むなんてどうやればいいのやら...
上の画像はiframeで東急バスのページを埋め込んでます、これだとスクロール動作がぎこちなくなって操作性が悪くなってしまう




2011年11月20日日曜日

アラームとカメラを使うアプリ

「2011年11月11日11時11分11秒を見逃すな」というアプリを公開しました。

http://windowsphone.com/s?appid=d8719221-93e1-4cc0-be2f-efcf5b85c727

指定した時間にアラームが鳴る機能と日付の焼きこんだ写真が撮れる機能を合わせたアプリです。

参考にしたページ

高橋 忍のブログ : アプリケーション自身のスクリーンキャプチャ機能の実装ブリリアントなWP7 : カメラで撮影した画像を保存する 画像ファイルを端末内に保存する
CH3COOH(酢酸)の実験室 : 静止画撮影を行う
です。特に高橋忍さんのページはコードをほぼコピーしている箇所があって、シャッターを押した後のメッセージ内容がまったく同じままにしてしまっていました。ごめんなさい。見る人が見れば、コピペしただけだろーと突っ込まれるかもしれないので、ここで白状しておきます

時計の表示を更新する部分も誰かの記述を参考にしましたが、どこだったか思い出せません




起動画面、アラームの設定と、カメラの撮影ページへの移行ができます

撮影した写真。画像サイズや撮影モードを切り替えたりとかはできません!ただシャッターボタンを押すだけです

時計部分のコードとXAMLをのっけておきます。
時計はタイマーで更新してます。文字の縁取りをするために数ピクセルずらした黒文字を4方向分の4回レンダリングしてます。(こんなんでいいのか?)
カメラの撮影は参考にしたコードをほぼそのままで、普通に撮影します。
撮影完了したら、写真の画像をlayoytrootの背景に描き出して、スクリーンキャプチャします

ほんとにこんなんで良いのか?って気もしますが、以上です。ここまでは数時間でできました。

一番時間がかかったのは、日時設定画面を作る事とアイコン作る事です。アイコンはちょっと画像がデカすぎたようです...


public partial class ClockPage : PhoneApplicationPage
    {
        bool nowCapturering = false;
        PhotoCamera camera = null;
        public ClockPage()
        {
            InitializeComponent();


            CameraButtons.ShutterKeyPressed += new EventHandler(CameraButtons_ShutterKeyPressed);
            DispatcherTimer tmr = new DispatcherTimer();
            tmr.Interval = TimeSpan.FromSeconds(1);
            tmr.Tick += new EventHandler(tmr_Tick);
            tmr.Start();
        }

        void camera_CaptureThumbnailAvailable(object sender, ContentReadyEventArgs e)
        {
            System.Diagnostics.Debug.WriteLine("camera_CaptureThumbnailAvailable");
        }

        void camera_CaptureImageAvailable(object sender, ContentReadyEventArgs e)
        {
            System.Diagnostics.Debug.WriteLine("camera_CaptureImageAvailable");
            this.Dispatcher.BeginInvoke(delegate()
            {
                BitmapImage bmp = new BitmapImage();
                bmp.SetSource(e.ImageStream);
                CaptureBrush.ImageSource = bmp;
                TakeCapture();
                nowCapturering = false;
            });
        }

        void camera_CaptureCompleted(object sender, CameraOperationCompletedEventArgs e)
        {
            System.Diagnostics.Debug.WriteLine("camera_CaptureCompleted");
        }

        void CameraButtons_ShutterKeyPressed(object sender, EventArgs e)
        {
            nowCapturering = true;
            camera.CaptureImage();
        }

        protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
        {
            camera = new PhotoCamera(CameraType.Primary);
            //camera.CaptureThumbnailAvailable += new EventHandler<contentreadyeventargs&rt;(camera_CaptureThumbnailAvailable);
            camera.CaptureImageAvailable += new EventHandler<contentreadyeventargs&rt;(camera_CaptureImageAvailable);
            camera.CaptureCompleted += new EventHandler<cameraoperationcompletedeventargs&rt;(camera_CaptureCompleted);
            nowCapturering = false;
            PreviewBrush.SetSource(camera);
            base.OnNavigatedTo(e);
        }

        protected override void OnNavigatingFrom(System.Windows.Navigation.NavigatingCancelEventArgs e)
        {
            if (camera != null)
            {
                camera.Dispose();
                camera.CaptureImageAvailable -= camera_CaptureImageAvailable;
                camera.CaptureCompleted -= camera_CaptureCompleted;
                camera = null;
            }
            base.OnNavigatingFrom(e);
        }

        void tmr_Tick(object sender, EventArgs e)
        {
            if (!nowCapturering)
            {
                textBlock1.Text = DateTime.Now.ToString("yyyy/MM/dd hh:mm:ss");
            }
        }

        private void TakeCapture()
        {
            WriteableBitmap bitmap = new WriteableBitmap(this.LayoutRoot, null);
            MemoryStream stream = new MemoryStream();

            bitmap.SaveJpeg(stream, bitmap.PixelWidth, bitmap.PixelHeight, 0, 80);

            using (MediaLibrary medialib = new MediaLibrary())
            {
                Picture pic = medialib.SavePictureToCameraRoll(DateTime.Now.ToString("yyMMddHHmmss"), stream.ToArray());
            }
            
            MessageBox.Show("Saved");
        }


xaml
<phone:PhoneApplicationPage 
    x:Class="Serial11.ClockPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    SupportedOrientations="Landscape" Orientation="Landscape"
    mc:Ignorable="d" d:DesignHeight="480" d:DesignWidth="728"
    Language="ja-JP"
    shell:SystemTray.IsVisible="True">

    <!--LayoutRoot は、すべてのページ コンテンツが配置されるルート グリッドです-->
    <Grid x:Name="LayoutRoot">
        <Grid.Background>
            <ImageBrush x:Name="CaptureBrush"/>
        </Grid.Background>
        <Grid x:Name="ContentPanel">
            <Rectangle x:Name="PreviewRectangle">
                <Rectangle.Fill>
                    <VideoBrush x:Name="PreviewBrush"/>
                </Rectangle.Fill>
            </Rectangle>
            <StackPanel HorizontalAlignment="Right" VerticalAlignment="Bottom" Orientation="Horizontal">
                <Grid Margin="0,0,10,0">
                    <TextBlock x:Name="textBlock3" Text="{Binding Text, ElementName=textBlock1}" VerticalAlignment="Top" FontFamily="Segoe WP Black" FontSize="48" Margin="0" HorizontalAlignment="Right" RenderTransformOrigin="0.5,0.5" Foreground="Black">
                        <TextBlock.RenderTransform>
                            <CompositeTransform TranslateX="3" TranslateY="3"/>
                        </TextBlock.RenderTransform>
                    </TextBlock>
                    <TextBlock x:Name="textBlock4" Text="{Binding Text, ElementName=textBlock1}" VerticalAlignment="Top" FontFamily="Segoe WP Black" FontSize="48" Margin="0" Foreground="Black" HorizontalAlignment="Right" RenderTransformOrigin="0.5,0.5" >
                        <TextBlock.RenderTransform>
                            <CompositeTransform TranslateX="-3" TranslateY="3"/>
                        </TextBlock.RenderTransform>
                    </TextBlock>
                    <TextBlock x:Name="textBlock5" Text="{Binding Text, ElementName=textBlock1}" VerticalAlignment="Top" FontFamily="Segoe WP Black" FontSize="48" Margin="0" Foreground="Black" HorizontalAlignment="Right" RenderTransformOrigin="0.5,0.5" >
                        <TextBlock.RenderTransform>
                            <CompositeTransform TranslateX="-3" TranslateY="-3"/>
                        </TextBlock.RenderTransform>
                    </TextBlock>
                    <TextBlock x:Name="textBlock6" Text="{Binding Text, ElementName=textBlock1}" VerticalAlignment="Top" FontFamily="Segoe WP Black" FontSize="48" Margin="0" Foreground="Black" HorizontalAlignment="Right" RenderTransformOrigin="0.5,0.5" >
                        <TextBlock.RenderTransform>
                            <CompositeTransform TranslateX="3" TranslateY="-3"/>
                        </TextBlock.RenderTransform>
                    </TextBlock>
                    <TextBlock x:Name="textBlock1" Text="----/--/-- --:--:--" VerticalAlignment="Top" FontFamily="Segoe WP Black" FontSize="48" Margin="0" Foreground="Yellow" HorizontalAlignment="Right" />
                </Grid>
            </StackPanel>
        </Grid>
    </Grid>
 
    <!--ApplicationBar の使用法を示すサンプル コード-->
    <!--<phone:PhoneApplicationPage.ApplicationBar>
        <shell:ApplicationBar IsVisible="True" IsMenuEnabled="True">
            <shell:ApplicationBarIconButton IconUri="/Images/appbar_button1.png" Text="Button 1"/>
            <shell:ApplicationBarIconButton IconUri="/Images/appbar_button2.png" Text="Button 2"/>
            <shell:ApplicationBar.MenuItems>
                <shell:ApplicationBarMenuItem Text="MenuItem 1"/>
                <shell:ApplicationBarMenuItem Text="MenuItem 2"/>
            </shell:ApplicationBar.MenuItems>
        </shell:ApplicationBar>
    </phone:PhoneApplicationPage.ApplicationBar>-->

</phone:PhoneApplicationPage>

2011年11月11日金曜日

2011年11月11日11時11分11秒を見逃すな

serial11.xap

windows phon7 用に"2011年11月11日11時11分11秒を見逃すな"というアプリを思いつきで作りました。

思いついたのが11月10日の朝だったので、マーケットへの審査に提出は全然間に合わないので、xapファイルだけアップしてみます。

これを書いてる時間も既に11月11日を回っているので、ちょーーと遅すぎですが.....


ベータ版なので不具合があったらごめんなさい、といってもダウンロードする人がいるか?という気もします



アプリを起動して、2011年11月11日11時11分11秒の5分前にアラームを登録することができて、日付と時間入りの決定的瞬間の写真を撮ることが出来るアプリです。

IS12Tでしか試してないです

当然11時11分の5分前を過ぎるとアラーム登録できないです。たぶん例外吐いて落ちると思います。



2011年11月8日火曜日

コマンドラインで配置配線のススメ

XILINXのFPGA合成ツールの話です。

ここではise12を使う事を前提に記事を書いてます。
すでにise13.3がリリースされている今なぜise12なの?と思うかもしれませんが、諸事情でise12を使い続けているから仕方がないのです。

これから書く内容はise13ではPlanAhedが使えるツールに進化していて、もう必要ないよって事かもしれませんが、僕の個人的な予想ではise13でもまだコマンドラインを使い続ける必要があるかなと思ってます