スポンサーサイト

    上記の広告は1ヶ月以上更新のないブログに表示されています。
    新しい記事を書く事で広告が消せます。

    【Java】Arrays.asListは固定サイズ!

    とうとうJavaについての記事を書いてしまった。
    いや、まあ、だからどうということではないですが・・。

    Javaといいつつ作っているのはandroid。でもこれはJavaの問題だから、Javaってことで。

    Javaで配列をコレクションに変換するには、Arrays.asListを使うと楽ちん。
    で、ある配列から、ランダムに選んだ重複しない任意の数の要素を取り出したくていかのようなコードを組んだ。
    
    int count=7;//ほしい要素の数
    List<integer> baseList=Arrays.asList(baseArray);
     List<integer> newList= new ArrayList<integer>(count);
      Random r=new Random();
     for(int i=0;i<count;i++){
    int index= r.nextInt(baseList.size());
    newList.add(baseList.get(index));
    baseList.remove(index);
    }
    
    しかし、これを実行すると、baseList.remove(index);で落ちる・・・。
    最初は、ListにIntegerを使っているから、indexが要素のインデックスじゃなくて、値として認識されたか?
    とおもったけど、
    呼び出しの履歴を見れば、ちゃんとList<>.remove(int index)が呼ばれている。
    (List<>.remove(Object obj)ではなく)
    そりゃそうか、intとIntegerは同じようで違うもの。コンパイラが勝手にボクシング&アンボクシングして、
    相互変換しているだけだし・・・。

    では、なぜ?

    それは、ドキュメントヘルプに書いてあった。
    JDKのArrays.asListの項目
        指定された配列に連動する固定サイズのリストを返します。
        返されたリストへの変更は、そのまま配列に書き込まれます。
        (以下省略)

    ん? 固定サイズ?

    固定サイズ!

    コレクションなのに固定サイズ・・。
    だから、そもそも要素の削除ができないんだ・・。
    値書き換えたら配列の値も変わるって書いてあるし・・。

    すげ~。ある意味すげ~。
    .net Frameworkにこんなコレクションないよ~。

    JavaのList<>は、そもそもインターフェイスなんだよね。
    .net Frameworkだと、クラスだから、インスタンスによって挙動が違うとかないと思ってた・・。
    いや、そりゃ、List<>のインスタンス作る時、他のクラスの(ArrayListとか)インスタンス作って突っ込んでたから、
    知ってはいたよ。
    でも、実装されないメソッドがあるなんて・・。

    これのおかげでどんだけ時間食ったことか・・。
    C#とJava、コードが近いせいで、ついC#の先入観が邪魔をする・・。

    関係ないけど、Javaの規約のメソッド名は小文字からって、なれね~・・。


    スポンサーサイト

    テーマ : プログラミング
    ジャンル : コンピュータ

    YouTubePlayer 「YouTube Nagara」 作ってみました。

    ここ最近は、android をいじっていたんですが、
    気が付いたらWPFいじってました・・。

    いや、その、息抜きのつもりで、WPFいじってたらもう止められなくて・・・。
    いや~、XAML楽しいっすね\(-o-)/
    androidなんていじるより・・ねぇ いやいや、androidも楽しいっすよ。うん。)

    で、何作ってたかというと、YouTubeを連続で再生するツールです。

    私はPGしながら音楽聴くんですが、(え?音楽聞きながらPGしてるんじゃないの?って突っ込みはなしで・・)
    最近は、Youtubeを連続再生することを覚えまして。
    最初は、Webアプリ探して、ノンストップチューブ とかをブラウザで聞いてたんですが
    動画だし、チラミしたいじゃないすか。
    でもブラウザじゃ、他のページ見てたら見えない。
    で、Windowsガジェットなり、ツールなり探したんですが、
    64bitのマシン使ってるんで、どれも映らない。
    (それらのツールは内部でブラウザコンポーネント(つまりIE)使ってるんですが、
    64bit版IEってフラッシュ対応してないので、見れないんス)

    というわけで、んじゃ気晴らしに作っか!となったわけです。ハイ。

    もう今更、WindowsFormsでツールとか作る気なかったんで、最初からWPFで作りました。

    せっかくなので、ここで公開とかしてみます。
    【YouTube Nagara】
     Downloadはこちら⇒ Download 

     画面イメージ↓
    YouTubeNagara1
    ↑の赤枠のところは、クリックできます(わかりにくいけど・・)
     ①最大化、 ②最前面表示、 ③コメント表示 (後述)

    使い方:検索キー入れて、検索ボタンを押すと結果リストが左側に出てきます。で右側に動画が。
     ↓検索したところ。
    YouTubeNagara3

    あとは勝手に再生し続けます。
    ちなみに、①最大化 を押すと↓のように、検索エリアと再生リストが隠れます。
    YouTubeNagara4
    そして、②最前面表示 を押すと最前面に残るので
    画面の右下端をつまんで、画面を小さくして、ディスプレイの隅っこに追いやって、
    時々、チラミしてください・・。

    ちなみに、③コメントの表示 を押すと、動画の下にコメントパネルが出ます。
    (コメントパネルは、閉じることができますが、デフォルトで閉じています。そのときは探してください。)
    YouTubeNagara5 

    ま、こんな感じです。
    ちなみに、WPF使ってるんで、.netFramework3.5必須です。
    Windows7はもちろん、XPでも、動作します。
    が、XPの場合、背景のガラスっぽい効果が出せないので、背景真っ白です。
    (気が向いたら、XPの時の背景もなんか工夫します・・・。)

    これ作ってて知りましたが、WPFって、M-V-VMパターンを推奨しているんですね。
    WPFの強力なバインド機能を前提にしたデザインパターンみたいで、なかなか面白いです。
    自分でも知らないうちに、それっぽい作りになってました・・。

    M-V-VMは、今までと、だいぶ世界が違いますね。
    しかし、まだ徹底できてないです。Viewにコードビハインドがいます・・。

    今回は、ちょっと時間切れなので、また近いうちにM-V-VMを習得して、記事にしたいです。
    つうか、フルWPFで業務系アプリやってみたいです・・。(とくに基盤を・・・)
    誰か仕事ください<m(_ _)m>

    (あ、ちなみに、私フリーですので・・。)

    そうだ、提案できる機会あったらしてみようかな・・。

    しかし、いや~慣れているせいか、C# &XAMLは楽しいですね♪ 
    修行中のandroidもそれくらい、楽しく組めるようになるといいのに・・。

    【android】Android AppWidget 3分メイキング(続)

     前回の続きです。
    というか補足です。

    前回の記載内容で、Widgetをホーム画面に表示するところまでできました。
    では、そのWidgetをタップ(クリック)した時に、動作をするようにするにはどうするか。

    手順は以下の通り
     1.ViewにIntentを関連付ける
     2.そのIntentを受け取れるようにする。
     3.受け取ったIntentを処理する。

    1.ViewにIntentを関連付ける
     AppWidgetProvider継承のクラスにて
     a) RemoteViewsクラスを使って、WidgetのレイアウトからViewを取得します。
     b) Intentクラスを生成し、setActionで任意の名前のアクションを関連付けます。
     c) PendingIntentクラスを生成し、取得したRemoteViewsのsetOnClickPendingIntent
         メソッドでPendingIntentを設定する。
     d) 最後にappWidgetManager.updateAppWidgetを呼んでWidgetを更新する。
     (これらの処理は、onUpdateで書くこと。onEnabledは複数Widget起動しても
      1回しか呼ばれないことに注意)

    2.Intentを受け取れるようにする。
     AndroidManifest.xmlのApplication>Application Nodesにて
     Intent Filterに、1で使用する自作のアクションを追加する。

    3.受け取ったIntentを処理する。
     AppWidgetProvider継承のクラスにて
     onReceiveメソッドをオーバーライドし、引数のintent.getAction()を使って
     Intentごとに処理を書く。

    今回は、コードは特に載せてませんが、まあ、書けばわかるかなと。

    わかるかな~。わかったら 拍手!
     

    【android】Android AppWidget 3分メイキング

    タイトルの通り、androidのWidgetの作り方です。

    下記サイトを参考にさせていただきました。詳細は下記サイトへどうぞ。
    【参考】 http://www.techfirm.co.jp/lab/android/widget.html

    というわけで、ここでは、あとから自分が見たときにサクっと思いだせるよう要所のみを記載します。

    ■Widgetを作成するのに必要な事
     AppWidgetを作成するためには次の工程が必要になります。
     1.レイアウト作成
     2.設定ファイル作成
     3.処理の記述
     4.AndroidManifest.xmlへの登録

    1.レイアウト作成
     res/layout配下に、レイアウトxmlを作成する。
     (Eclipseならパッケージエクスプローラー⇒右クリ⇒新規⇒Android XML File から Layoutを選択して作成)
    New Android XML File

    2.設定ファイル作成
     res/xml配下に、アップフィジットプロバイダーXMLを作成する。
     (1と同様右クリ新規のAndroid Xml File から AppWidget Provider を選択して作成する)
     設定内容は作成したxmlを開いて出てくる画面のStructureタブを見れはだいたいわかるとして、
     注意点が2つ。
      その1:サイズ(Min width,Min height )について
        ウィジェットサイズは、自由には決められず、画面を4×4に分割したセル単位で指定します。
        指定には、DIP(density-independent pixels)という単位を用い、これにより画面サイズ
        の違う端末でも同じ様に表示することができます。
        分割された1セルのサイズは74dipです。
        ただし、実サイズ計算時に丸め誤差が発生するため、実際には次の計算式でdipを
        算出します。
          dip = (セル数 * 74dip) - 2dip
        今回は1×1セルのサイズで作成するため、72dipを指定します。
       だそうです(参照サイトからの引用)
       というわけで1サイズなら72dipと記載します。(単位まで含めて文字列で設定する)

      その2:更新間隔について
        AndroidSDK 1.6よりウィジェットの更新間隔に制限が掛かり、
        30分以下は30分として扱われる様になりました。
       だそうです(参照サイトからの引用)
       表示するだけなら0でおっけ。

    3.処理の記述
      AppWidgetProviderを継承したクラスを作成する。
      AppWidgetProviderクラスの以下のメソッドをオーバーライドして好きな処理を書く。
      ・onEnable   :AppWidget作成時に1度だけ呼ばれる。
                  複数Widgetを張っても最初の1回だけしか呼ばれない
      ・onUpdate   :AppWidgetを更新するときに呼ばれる。起動時にも呼ばれる。
                 あとはupdatePeriodMillisで設定した間隔で呼ばれる。
      ・onDeleted     :AppWidgetが削除されたときに呼ばれる。
      ・onDisabled :AppWidgetがすべて削除されたときに呼ばれる。
      ・onReceive   :アクションを受け取ったときに呼ばれる。
                 ここにタップしたときにメイン処理を書くことになる。

    4.AndroidManifest.xmlへの登録
     a) EclipseでAndroidManifest.xmlを開き、Applicationタブを開く。
     b) Application NodesでReceiverを追加し、任意の名前を設定。
       c) 追加したReceiverにIntent FilterとMetaDataを追加する。
       MetaDataのNameは android.appwidget.provider にする。
       そしてResourceに2.で作成した設定ファイルを指定する。
       d) Intent FilterにActionを追加する。
       ActionのNameは、 android.appwidget.action.APPWIDGET_UPDATE にする。

    5.実行
     ここまでで作成は完了。あとは実行するだけ。
     AppWidgetなので、実行したらHomeScreen上で長押しして、Widgetsの追加から作成したWidgetを選んで追加する。

    以上、Android AppWidget 3分メイキングでした。



    3分でできた人は拍手!

    テーマ : プログラミング
    ジャンル : コンピュータ

    【.net Framework】SqlExceptionのエラー番号

     .net Frameworkの SqlExceptionについて
    ネットワークエラーとその他のエラーを識別したかったので
    エラー番号を調べてみました。

    [参考]tomoyan.net - ともやん どっと ねっと

    (↑とっても参考になりました。)
    SqlExceptionのエラーコードは100までがSqlServer接続前のエラーだそうです。

    そして、21と101以降のエラーはなんとSQLServer内にあるのだとか。
    実際、

    というクエリを流すと取得できる。(1041は日本語を示す)

    とりあえず、ネットワークエラーとその他のエラーの区別は
     Number<=100
    で区別できそう。
    (自分の場合は接続した後は正常に動く想定なので。要は無線LANが届かない場合だけ例外処理したいのです)

    しかし、.net Framework2.0のライブラリの中身を除くと、1.1ではあるというEnumがなく、
    ざっくばらんな定数クラスにエラー値が散乱していた・・。
    こういうエラー情報の番号っててっきりEnumとかにしているものかと思っていたからちょっと意外・・・。
    きっといろんな歴史が遭ったんだろうと想像する・・。

    テーマ : プログラミング
    ジャンル : コンピュータ

    プロフィール

    ざっち

    Author:ざっち
    ざっちのーと
    ♪自由なSEのメモ帳です♪

    ざっちのスキル一覧
    ----------------
    上級(手足も同然!)
    ・.net FrameWork
    ・C#
    ・SqlServer
    ・VisualBasic6.0
    ----------------
    中級(だいたいOK!)
    ・WPF(XAML)
    ・Android
    ・WindowsMobile6.5
    ・HTML
    ----------------
    下級(や、やればできるさ!)
    ・PHP
    ・JavaScript
    ・SilverLight
    ・SQLite
    ・Python(だってjetCreaterが・・・)
    ・C++(OpenCVいじってみたくて・・・)
    ----------------
    最近のお気に入り
    ・WPF(XAML)
    ・Android
    ・GoogleAPI
    ----------------

    最近の記事
    月別アーカイブ
    カテゴリー
    夢見る羊さん
    地球の名言Ⅱ

    presented by 地球の名言

    Twitter...A

    Twitter < > Reload

    ブロとも申請フォーム

    この人とブロともになる

    ブログ内検索
    RSSフィード
    リンク
    上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。