ウィリアムのいたずらの、まちあるき、たべあるき

ウィリアムのいたずらが、街歩き、食べ物、音楽等の個人的見解を主に書くブログです(たま~にコンピューター関係も)

ケータイ、ゲーム配信の次は、アンテナっすか。そのうち、ADSLのときみたいに。。

2006-10-18 23:51:09 | Weblog

以前、ケータイも、キラーコンテンツ(アプリ)の時代に入る?で、サービス面では差がつきにくくなったので、次はアプリか?と書いたので、

ここのニュース
<携帯電話新戦略>ゲーム配信に力入れる 料金収入増を狙う
http://headlines.yahoo.co.jp/hl?a=20061017-00000082-mai-bus_all


にある、ゲーム配信、アプリによる差別化は、想定の範囲内だけど(もっとも、ここのアンケートだと、ゲーム利用者は、半数弱だが。。)

ここのニュース
ソフトバンク「携帯」ホームアンテナ無償配布 圏外解消へ“奇策”
http://headlines.yahoo.co.jp/hl?a=20061018-00000007-san-bus_all

だと、ソフトバンクはアンテナを配るそうな。。。

おおお、ここまでいくか。。

なんか、YAHOO BBのADSLのとき、無料で配ってたように、そのうち、アンテナとケータイ端末を袋に入れて、3ヶ月間無料とか言って配る人とか。。。いくらなんでも、そこまでは、行かないか(^^;)


  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

特定の認証された人にしか、画像を見せないようにする方法って、こうするのでは?

2006-10-18 20:19:56 | Weblog

ここの話題
ミクシィ、画像に認可制御なしの欠陥を改修できず、ヘルプで弁解
http://slashdot.jp/security/06/10/17/1958219.shtml

なんですけど、みなさん、こーいうような「特定の認証された人にしか、画像を見せないようにする」っていう仕様がきたら、どうします?

 もちろん、mixiみたいに、認証サーバーとイメージサーバーが違う場合でもOKっていうようにするようなケースで。。。




この場合、前提知識として、

1.別にイメージは、CGIでもOKなので、
 <IMG SRC="http://cgi.localdomain/cgi-bin/image1.cgi?USER_ANGO_ID="yuiesuyh1743e94kl">
 とかやって、CGI側で、GDライブラリかなんか使ってイメージ読み込んで、
 それを"Content-type: image/png¥n¥n";なりjpegなりでおくればいいよねえ。。

2.認証サーバーとイメージサーバーと、イメージを読み込む権限があるかどうかの
  CGIサーバーが違う場合、たしかに、クッキーやセッションは、そのままでは使えない

  が、たとえば、
  (あ)この3つのサーバーから見えるファイルなりDBなりを用意して
    (たとえば、認証サーバーにあるディレクトリを作成し、
     イメージとCGIサーバーは認証サーバーのそのディレクトリに、
     サンバ*なりなんなりのファイル共有で、リンクを張ればいい)

  (い)認証したら、セッションIDと、セッションの内容をそのファイル
     (またはDB)に書き出し
     →ファイルならセッションIDをファイル名として中身をファイルに書き出す

  (う)ユーザーにはセッションIDを渡したり、それがだめならHiddenで
     暗号化して書き込めば、

  (え)みんな、その共有されたファイルを読み書きすることで、セッション内容を
     共有できる

  *サンバとは、出産するときに立ち会うオバサンでなく、浅草やブラジルで踊る踊りだ
   (うそ)

と、ここまでの前提知識をもとに考えると。。。




■考えられる方法

・負荷を高めるといけないので、CGIサーバーかなにかを新しく用意する

・認証したとき、セッションをスタートさせ、セッションIDを取得し、(まあ、
 セッションIDでなくても、一意になれば、なんでもいいんだけどさ)そのIDを
 ファイル名として、認証サーバーとCGIサーバーの共有ディレクトリに、
 ユーザーIDを書き出す。

・ユーザーには、セッションIDを返す。あるいはセッションIDを暗号化したのを
 Hiddenでソースに埋め込む。
 クッキーを食べてるなら、そいつを、食わせてもいい

・で、いままで、イメージは、http://image.localdomain/img/image1.jpgなど
 と、イメージを直接アクセスしていたのを
 http://cgi..localdomain/cgi_bin/disp.cgi?src=image1.jpg&usr=ase68104054
 のように、CGIサーバーの認証してイメージ表示プログラムを呼び出すようにし、
 こいつがimage.localdomainにあるイメージを返すようにする
 このとき
   SRC=表示したいいイメージ
   USER=上記で入っているセッションID

・CGI(disp.cgi)は、受け取ったセッションIDからユーザーIDを取得し、
 SRCで指定されたイメージファイル名をキーとして、
  DB、またはファイルに入っている許可情報を取得し、
 その許可情報とユーザーIDをチェックしてOKだったら、
 それを"Content-type: image/png¥n¥n";なりjpegなりでおくればいいよねえ。。

・で、このとき、イメージサーバーのイメージのあるディレクトリは
 CGIサーバーとと共有する代わり、
 もうイメージサーバーは外から見えなくていいから、見えないようにする
 こうすると、イメージをみるには、かならずCGIサーバーを通さねばならず、
 そうなると、認証しない限りアクセスできない

ってなるよねえ。。 




ま、ふつう、こういう風に修正すると思うんだけど。。
だから、クッキーがイメージサーバーで受け付けないとかはあんまり関係ないし、
CGIサーバは、いくつおいてもかまわないので、処理は分散できるし。。
うーん、できそうなんだけど。。

でも、こんなこと、mixiのひとだって、IPAの人だって、すぐに思いつくはずだよねえ。。業界の人なら。。

何か問題あるのかなあ。。。

ちょっと、問題が見えないから、プログラム書いて、確認してみようかな。。。
 

  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Javaの画面表示-その7:AWTのカーソル制御(フォーカスを当てる)

2006-10-18 16:49:48 | JavaとWeb

 シリーズJavaの画面表示のつづきです。前回まででJAVAのAWTとBREWが、似たような書き方(メソッド・関数)でかけるということを示しました。。

 が1つBREWでやっていて、こっちでやってないのがあります。
 カーソル制御です。なんで、今回あんまり意味ないけど、やります。

 なぜ、あんまり意味ないのか。。というと、これをやっても、マウスでクリックされてしまうと、そっちが優先されてしまうからです(マウスでクリックさせなくすることもできます。それは、広範に書きます)。ま、とにかく、フォーカスを当てる方法をかきます。




■フォーカスをあてるには
 フォーカスをあてるには、
・その部品が見えている状態で
・その部品.requestFocus();
を行います。

 したがって、BREWのときみたいに、
   エンターで、項目選択、
   上下キーで、項目移動させる
 には、以下のことが必要です。

1.カーソル番号と、フェーズ番号を持っているようにします
  →一般には、カーソル番号だけでいいです。

2.各部品について、addKeyListener(イベントリスナークラス)して、
  キーイベントを取得します。

3.表示のとき、まずf.setVisible(true);してから、
  再描画DispAppData();します
  →フォーカス処理は、再描画DispAppData();の中で行います

4.カーソル番号が、その項目の番号のとき
  その項目.requestFocus();
  を実行します

5.イベントリスナーgamen1_HandleEventではKeyListenerを追加し、
 keyTyped、keyPressed、keyReleasedメソッドを追加します。

6.keyReleasedで、KeyEvent.VK_ENTER(選択キー)がおされたときは、
 ボタンが押されたときと同じ処理をします。

 UPキー、Downキーが押されたときは、NextCurItemで、次のカーソル番号を
 求めて、再描画します
 →NextCurItemは、新しいメソッドで、後述します

7. NextCurItemメソッドを追加し、現在のカーソル番号と押されたキー、フェーズ番号から
 次のカーソル番号を求めます

8.freeAppDataでは、2度目に実行されるときのことを考え
 初期化しておきます。(今回は、消さないので)




■ソース
 ここまでのことをやった、ソースを以下にあげます。
 第一画面で上記の処理を行っています。

import java.awt.*;
import java.awt.event.*;
import java.util.*;

public class gamen1 {
	
	//	共通領域
	public HashMap	map = null;
	
	//	画面項目項目
	Frame 			f;
	Button		b1;
	Button		b2;
	TextArea		t1;
	
	int		seikai 	=	0;
	int		phaseNo	=	0;
	int		curno	=	0;
	/*
	 * 	表示
	 */
	public void initAppData()
	{

		//	フレームを作成する		
		f = new Frame("test");
		f.setSize(240,320);
		f.setLayout(null);

		//	アクションを作成する
		gamen1_HandleEvent al = new gamen1_HandleEvent();

		//	ラベル
		Label l1 = new Label("早うちの練習");
		l1.setLocation(10,30);
		l1.setSize(100,30);
		f.add(l1);

		Label l2 = new Label("これは、練習文です。");
		l2.setLocation(10,120);
		l2.setSize(150,30);
		f.add(l2);

		Label l3 = new Label("以下の文を打とう!");
		l3.setLocation(10,70);
		l3.setSize(100,30);
		f.add(l3);

		//	テキスト
		t1 = new TextArea();
		t1.setLocation(10,160);
		t1.setSize(150,80);
		t1.addKeyListener(al);
		f.add(t1);
		
		//	ボタン作成		
		b1 = new Button("挑戦する");
		b1.setLocation(120,70);
		b1.setSize(100,30);
		b1.addActionListener(al);
		b1.addKeyListener(al);
		f.add(b1);

		//	ボタン作成		
		b2 = new Button("打ち終わった!");
		b2.setLocation(10,250);
		b2.setSize(100,30);
		b2.addActionListener(al);
		b2.addKeyListener(al);
		f.add(b2);

		//	表示
		f.setVisible(true);
		DispAppData();

	}

	/*
	 * 	再描画
	 */
	public void DispAppData()
	{
		//	画面間引数を受け取る		
		String rensyu = "";
		if ( map	!=	null )
		{
			rensyu	= (String)map.get("rensyu");
			if (rensyu	==	null )
				rensyu = "";
		}

		//	画面表示
		if ( t1 != null )
		{
			t1.setText(rensyu);
			if ( curno	==	1 )
			{
				t1.requestFocus();
			}
		}

		if ( b1 != null )
		{
			if ( curno	==	0 )
			{
				b1.requestFocus();
			}
		}
		if ( b2 != null )
		{
			if ( curno	==	2 )
			{
				b2.requestFocus();
			}
		}

	}
	
	/*
	 * 	終了
	 */
	public void freeAppData()
	{
		//	2度目にもとってきたときのため、初期化
		map.remove("rensyu");
		phaseNo	=	0;
		curno	=	0;

//		f.dispose();	//	消さないことにする
	}
	
	/*
	 *	カーソル移動 
	 */
	public int NextCurItem(int curno,int flg,int phaseNo)
	{
		switch(flg)
		{
		case	KeyEvent.VK_DOWN:
			switch(phaseNo)
			{
			case	0:			//最初のとき
				return	0;		//どこにいても0

			case	1:			//入力したとき
				switch(curno)
				{
				case	1:		//入力のとき
					return	2;	//打ち終わったへ
				default	:		//それ以外は
					return	1;	//入力エリアへ
				}
			}
			break;

		case	KeyEvent.VK_UP:
			switch(phaseNo)
			{
			case	0:			//最初のとき
				return	0;		//どこにいても0
			case	1:			//入力したとき
				switch(curno)
				{
				case	1:		//入力のとき
					return	2;	//打ち終わったへ
				default	:		//それ以外も
					return	1;	//入力エリアへ
				}
			}
		}
	
		return	0;	//該当なし	
	}
		
	/*
	 * 	イベントリスナー
	 */
	private class gamen1_HandleEvent 
		implements ActionListener,KeyListener
	{
		/*
		 * 	キー処理
		 */
		public void keyTyped(KeyEvent e)
		{
		}

		public void keyPressed(KeyEvent e)
		{
		}
		
		public void keyReleased(KeyEvent e)
		{
			int	dirty_flg = 0;
			
			//	入力値を取ってきておく
			map.put("rensyu",t1.getText());
			
			//	次の処理
			switch(e.getKeyCode())
			{
			case	KeyEvent.VK_ENTER:
				Object o = e.getSource();
				if ( o.equals(b1)== true)
				{	//	挑戦する
					System.out.println("挑戦する");
					phaseNo		=	1;
					curno		=	1;
					dirty_flg 	=	1;
					break;
				}
				else if ( o.equals(b2)== true)
			         {	//	打ち終わった!

					//	共通領域への値設定
					map.put("username","ウィリアムのいたずら");
					seikai ++;
					map.put("sei_ritu",new Integer(seikai).toString());
					map.put("byo","20");
					
					//	第二画面表示
					gamen2 g2 = (gamen2)map.get("gamen2");
					if ( g2 == null )
					{
						g2	=	new gamen2();
						map.put("gamen2",g2);
						g2.map	=	map;
						g2.initAppData();
					}
					else
					{
						//	再描画
						g2.DispAppData();
					}
					//	消す
					freeAppData();	//	消さないで両方だす
				}
				break;		
			case	KeyEvent.VK_UP:
				System.out.println("UP");
				curno = NextCurItem(curno,KeyEvent.VK_UP,phaseNo);
				dirty_flg	=	1;
				break;
			case	KeyEvent.VK_DOWN:
				System.out.println("Down");
				curno = NextCurItem(curno,KeyEvent.VK_DOWN,phaseNo);
				dirty_flg	=	1;
				break;
			}

			//	書き換え必要なら再描画
			if ( dirty_flg	!=	0 )
			{
				DispAppData();
			}
		}
		
		/*
		 * 	ボタンが押されたときの処理
		 */
		public void actionPerformed(ActionEvent e)
		{

			Object o = e.getSource();

			if ( o.equals(b1)== true)
			{	//	挑戦する
				System.out.println("挑戦する");
				phaseNo	=	1;
				curno	=	1;
				DispAppData();
				return;
			}

			if ( o.equals(b2)== true)	
			{	//	打ち終わった!

				//	共通領域への値設定
				map.put("username","ウィリアムのいたずら");
				seikai ++;
				map.put("sei_ritu",new Integer(seikai).toString());
				map.put("byo","20");
				
				//	第二画面表示
				gamen2 g2 = (gamen2)map.get("gamen2");
				if ( g2 == null )
				{
					g2	=	new gamen2();
					map.put("gamen2",g2);
					g2.map	=	map;
					g2.initAppData();
				}
				else
				{
					//	再描画
					g2.DispAppData();
				}
				//	消す
				freeAppData();	//消さないで両方だす
			}
		}
	}
}

けっこうめんどくさいです。。。




■入力不可と、問題点

 ただ、上記のようにしても、クリックしてしまえば、その処理が実行してしまいます。
 じゃあ、入力不可にすれば。。。と思うかもしれません。

 入力不可にするには、
 部品の.setEnabled(false);

 テキストエリアで編集不可にするには
 部品.setEditable(false);

 です。ただし、これは、入力が不可、編集が不可にはなるのですが、テキストエリア入力しているとき、次にフォーカスを当てたところがボタンのようなケース(カーソルが必要ないケース)では、テキストエリアを入力不可、編集不可にしても、カーソルがのこってしまいます。

 そのため、そのあと、違う部品.requestFocus()しても、たしかに、その部品をマウスで操作する場合は、クリックできて、処理できるのですが、エンターをすると、その前にあったテキストエリアのところから、違う部品のほうにカーソルはきてくれないので、エンターキーは取れなくなってしまいます(ウィリアムのいたずらの書き方が悪いかもしれないけど、そう見える)

 っていうわけで、ちょっとうまくいかないケースがあったりします。




 で、これ以外にも、isFocusTraversableとrequestFocusを使って、マウス操作しない方法とかもあるのですが、そもそも、こーいう処理はしないでしょ。。ということで、今回はここまでとします。


  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

BREWで複数画面を開発する場合の方法論(その12:HTMLとコントロールの混在-その3)

2006-10-18 14:45:16 | ケータイ

 シリーズBREWで複数画面を開発する場合の方法論で、前回書いた、1画面中にHTMLとコントロールを混在させる方法について、今回は、IHTMLCtlで修正、追加したものです。




■IHTMLCTL(IHtmlCtl.cでの追加分1:IHTMLCTL_Redraw

 これは、IHTMLVIEWER_Redrawを呼び出すだけです。
 ここで、再描画します。




■IHTMLCTL(IHtmlCtl.cでの追加分2:IHTMLCTL_SetRect

 これは、IHTMLVIEWER_SetRectを呼び出すだけです。
 ここで、範囲を指定してします。
 この後再描画すれば、この大きさになります。

 なお、この範囲ですが、他のものと、重ならないようにしてください。
 他のものと重なった場合、あとに書いたとしても、IHTMLVIEWERによる再表示のようが、優先されるようです。

 つまり、
 ・IMenuCtlで書いたものの上にITextCtlで書くと。。
  →メニューの上に、テキストエリアが表示されます
 が、
 ・IHtmlViewerで書いたものの上にITextCtlで書くと。。
  →IHtmlViewerしか表示されません(IHtmlViewer)が隠れる
   当然逆に書いてもIHtmlViewerしか表示されません
 ってなった気がします(勘違いだったらごめんなさい)

 なので、重ねないでください。




■IHTMLCTL(IHtmlCtl.cでの追加分3:IHTMLCTL_SetActive

 これは、IHTMLCTL_SetActiveを呼び出すだけです。
 ここで、引数がTRUEなら、IHTMLCtlにフォーカスがきます。
 このとき、指定されたカーソル番号に行きます

 ここで、引数がFALSEなら、IHTMLCtlにフォーカスがきません。
 ほかのコントロールで、_SetActive、引数TRUEを発行しているものがあれば、
 そこにフォーカスが行くはずです。




 てなかんじです(説明しなくても良かった気が ^^;)

 で、次のこのシリーズは。。。次に、なにを片付けるか、考え中


  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

楽天ショップが残り賞味期限一ヵ月半のジャムを販売、指摘に逆ギレ

2006-10-18 14:18:31 | Weblog

本当は、本家ネタなんだけど、本家は楽天(日記)でかいているので、まずいかな?
とおもってこっちに書きます。

ここのお話。
楽天ショップが残り賞味期限一ヵ月半のジャムを販売、指摘に逆ギレ
http://blog.livedoor.jp/dqnplus/archives/829744.html


によると(以下斜体は上記ブログより引用)

楽天ショップのリ○レナチュラルが自サイトのオークションにジャムを1500個出品。
同じサイト内の商品説明には「賞味期限 製造後6ヶ月(未開封)」の記載。
ところが落札者に届いたジャムは賞味期限が一ヵ月半など短いものばかり。
大量の生ものに途方にくれた落札者が掲示板に「賞味期限が短いことを記載しておいて欲しい」と投稿。
ところが店長は「保存料なしにこだわって欲しい」と製造過程の薀蓄を並べ「期限にこだわる人のせいでだいなしになった、いやなものになってしまった」と悪質クレーマー扱い。


この論理だと、賞味期間が、明日切れるものでも、いや、切れているものでも、
「賞味期限 製造後6ヶ月(未開封)」
とかかけるっていうことだよね。。

今、ネット通販って利用してないんだけど、こんなおみせがあるってことは、
やっぱり利用できないな。。。

あ、ちなみに、上記のブログには、


162 名前:番組の途中ですが名無しです[] 投稿日:2006/10/17(火) 19:50:53 ID:MuRG+gJq0
ジャム製造メーカー判明!

なんてのも、書いてありますね。


  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

CM飛ばし対抗策とテレビとの差別化と、新たな広告の可能性。

2006-10-18 11:57:10 | Weblog

 昨日のもしテレビ局が自社番組を動画放送したら、YOU TUBEの著作権侵害が減るのでは?で、最後のほうに書いた、無料で、自社の番組をインターネット配信できるかという問題で、広告の入れ方の話。

 ここで、広告を入れるには、

・番組の前後に入れてしまうと、CM飛ばしされたり、YOU TUBEにCMなしのものをアップされてしまう。
・CMなしでは、無料で配信できない
・テレビとは差別化して、テレビをみてほしい
・テレビと同じCMでは、問題がある(いつでも見れるので、バーゲンセールのように日にちが
 きまっているものはX,一方、小口のCMでも、コンテンツはいっぱいあるのでOK)

という条件をみたさなければいけない。これを満たすCMとは。。。




 証券会社にいくと、ブルームバーグというテレビが流れていることがある。
 (東京MXテレビでは、6時代に、テレビ神奈川では、7時から15分間くらい流れる)

 この番組、上のほうは、普通にやっているんだけど、下のほうに、番組とは、まったく関係ない株価が流れている。
 これをCMに応用すれば。。。

 つまり、ハイビジョンみたいな16:7の画像(じゃなくってもいいけど、とにかく、横長の画像)にテレビ番組をして、

   下に、字幕みたいなかんじで、CMを入れる。

 そしてテレビ局からは、このCMと番組を1本の動画にして流す。

 そうすれば、わざわざ、上の部分だけ切り取るっていうのは結構めんどくさいと思うので、これが配信されても、わざわざ削除してYOU TUBEにアップしようとはおもわないんじゃないか。。

 で、テレビはふつうにCMが、流れるので、テレビでは下にCMを入れないようにする。
 こうすれば、見やすいので、テレビとインターネットの動画の差別かもできる。
 (有料の番組やDVDなども、このように下にCMは、入れないようにする。
  なお、以降、番組の下にCMを入れることを字幕CMと書く)

 CMを入稿する人は、したの字幕部分を15秒分とか、CMをいれる。

 インターネット配信のとき、もし、番組と字幕を合成して1つの動画として流すプログラム(あるいは、 番組と字幕を合成して、すばやく動画ファイルを作るプログラム)ができれば、番組とCMは別々に管理でき、CMと番組の組み合わせが自由にできる。

 こうなってくると、CM枠は、いままで、1時間の中に、せいぜい数分だったのに、CMは、(音声無し、場所は限られているとはいえ)1時間まるまるCMタイム(下の部分だけだけど)となるので、CM枠が増える=供給が増える=値段をもっと安くして、小口化してもいい
 っていうことになる。

 つまり、インターネット動画で、字幕CMの場合は、5千円15秒、1日に100回とか、でもCMが打てる(もう、ここまでくると、装置産業みたいなもんだから、値段はどーでもいいが)。そうなってくると、いままで大手しかCMが流せなかったのが、中小企業でもCMできる機会がふえる。。。




 ということで、この字幕CMができれば、広告枠が一挙に増えて、広告代理店は、大もうけなのだ。。。っていうことがいいたいんじゃなくって、無料で、番組を流して広告料金をとることができそうだ。CM飛ばしもされず、テレビとも差別化して。。。

 で、無料で番組を流せたとした場合なのだが。。。(次回のこのシリーズに続く)




  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする