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

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

もしテレビ局が自社番組を動画放送したら、YOU TUBEの著作権侵害が減るのでは?

2006-10-17 21:23:55 | Weblog

 今回で終わらないと思うので、2回(以上)にわけて書くと思いますが、YOU TUBEの以下のニュースの話
[WSJ] 罰金は数十億ドル? メディア企業が対YouTubeで団結
http://www.itmedia.co.jp/news/articles/0610/16/news067.html

これ、訴訟を起こすほうが、メディア企業は、損するだろう。。。っていう話。

 まず、その第一段階として、
「もしテレビ局が自社番組を動画放送したら、YOU TUBEの著作権侵害が減るのでは?」
 という話。




 たしかに、今、YOU TUBEに、著作権違反のビデオが多くアップされているが、
 かりに、放送局が、たとえばNHKが、放送直後に、ビデオを自社サーバーにアップしてしまったとする。
 そして、URLを指定すれば、そのビデオが再現できるとする。
 この場合、果たして、テレビの番組をYOU TUBEにアップするだろうか?

 ブログから引用する場合、NHKの上記の動画サイトなら、消される心配はない。
 でも、YOU TUBEなら著作権違反で削除される可能性はある。

 としたら、わざわざYOU TUBEにおいて引用するより、テレビ局がサーバーにおいたほうを引用する気がする。みんなも、そっちを見る気がする。
 とくにYOU TUBEは、画像がかならずしもよくないが、本ネタを持っている放送局は、画像のクオリティをあげて流すことができる。




 つまり、今YOU TUBEが著作権違反しているのは、放送局やビデオメーカーが、「無料で」自社の番組をインターネットで配信するというようなサービスをしていないから。。
 ということになる。

 逆に言うと、放送局やビデオメーカーが、「無料で」自社の番組をインターネットで配信しはじめたら、YOU TUBEの著作権侵害は、なくなるかもしれない。放送局の配信している番組を直接引用したほうが、クオリティがいいから。。

 じゃあ、今、テレビで流しているように、テレビ局は、無料で、自社の番組をインターネット配信できるかという問題になる。
 今、CMを流していることによって、テレビ局はなりたっている。
 ということは、自社番組にCMを入れればいいが、下手な入れ方をすると、CMとばしされてしまう。




 次回のこのシリーズ?は、ということで、テレビ番組で、CMとばしされない方法について考察してみます。

 予告編:「CMの時間です」ではなく「CMの空間です」
 

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

業界初、レイアウト定義不要な非定型帳票の認識技術-富士通研究所

2006-10-17 16:39:08 | Weblog

ここのプレスリリース
業界初、レイアウト定義不要な非定型帳票の認識技術
http://pr.fujitsu.com/jp/news/2006/10/16.html


これは、帳票をレイアウトデータなしで、論理的に読み込む技術のようだ。

ただ、実際には、

古い新聞(実物やマイクロフィルムしかない)や、
レイアウトデータが、物理指定の新聞、雑誌など

を見出しや文章をDB化するためなどで、論理構造でタギング(XML化するためにタグを入れる)
するというケースのほうが、「レイアウト定義不要な非定型帳票の認識技術」の必要性は高いと思う。

で、この場合、見出しの論理構造は、文字列でなく、フォントや行間、飾り罫なんだけど、
それが、びみょーにかわる(基準より、行間を追い込みでかえちゃったりする)。

今回の技術は、(以下斜体はプレスリリースから引用)


まず、見積書や申込書などの帳票の種類に応じて、各論理要素(見出しやデータ)に対応する文字列の特徴と、論理要素間の関係を定義した論理構造パターンを知識として用意します。論理構造パターンは、見積書や請求書など帳票の種類ごとに用意すれば良く、従来と違って各帳票別のレイアウト定義は不要です。

論理構造パターンにおいて論理要素間の関係を確率ネットワークとして表現し、そのネットワーク上で確率を伝搬させることで、各論理要素に対応する最も確からしい文字列を認識します。これにより、以下が可能になりました。(図2。特許出願済み)


だから、これには直接応用できないけど
(論理構造をあらわす「文字列」はないので、「文字列の特徴」もない)、
たしかに、そういうフォント、行間、飾り罫などを、同じように、確率推論すれば。。
おおおお。。。おもしろいかも(^^)v

あ、でも、特許になってるか。。。

うん、でも確率推論使わなくっても、
ファジイ演算でできたりして(^^;)
もしかしたら、ニューラルネットでも??
そしたら、特許関係ないのかなあ。。

・・・よけいなことかいてる(^^;)??


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

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

2006-10-17 15:22:41 | ケータイ

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




■ヘッダファイル(gamen1.h)の追加箇所

これは、テキストコントロールが追加されるので、当然、

  ITextCtl *pText1; // 追加:テキスト

が、gamen1構造体の中に増えますが、逆に言うと、これだけです。
関数が増えるとか、そういうことはありません。




■ソースファイル(gamen1.c)の修正1:initAppData(初期化)

 ここは、以下のことを追加してやります。

・HTMLの大きさを設定します。
 →IHTMLCTL_SetRectという関数で範囲設定を行うのですが、この関数については
  次回の説明になります。

・テキストエリア設定作成、設定
 →ISHELL_CreateInstanceでテキストエリアをpMe->pText1 に設定して、
  ITEXTCTL_SetRectで大きさを指定、ITEXTCTL_SetPropertiesでフレーム、複数行指定
  をします。

 なお、この後行う再描画で、テキストの部分の追加とHTML部分の修正があるのですが、その内容については、後述するgamen1_DispAppDataで書きます。
 なお、テキストエリアとHTMLエリアは、重ならないようにしてください。




■ソースファイル(gamen1.c)の修正2:freeAppData(終了)

これは、pMe->pText1をITEXTCTL_Releaseで解放する部分が追加されただけです。
テキストエリアを追加したのだから、解放する部分も、当然追加されます。




■ソースファイル(gamen1.c)の修正3
:gamen1_HandleEvent(イベント処理)

ITEXTCTL_HandleEventでイベント処理する部分が追加されます。

テキストエリアを追加したのだから、イベント処理部分も、当然追加されます。

今回は、テキストエリアはデフォルトの処理しかしないので、TRUEが帰ってきたら、
そのまま抜けます
→じつは、これだと困ることがあるんですけど。。。それは、今回の最後に。。

そのほかは、かわってません。



■ソースファイル(gamen1.c)の修正4
:gamen1_DispAppData(再表示処理)


大きく変わるのは、ここです。

・IHTMLCTLについて
まず、HTMLをIHTMLCTL_Redrawっていうところは、同じなのですが、
カーソルに関しては、

 curnoに応じて、
  対象HTMLCtl内のある項目にカーソルがあれば、

    IHTMLCTL_DispData(pMe->phc,HTMLCTL内のカーソル番号,pMe->phc->scr);
    IHTMLCTL_SetActive(pMe->phc,TRUE);//フォーカスは、ここ

  を実行し、対象外であれば
    IHTMLCTL_SetActive(pMe->phc,FALSE);//フォーカス来るな!
  を実行します。

・ITEXTCTLについても、同様で、
まず、ITEXTCTL_Redrawして、テキストエリアを再描画
カーソルに関しては、

 curnoに応じて、
  対象ITextCtlにカーソルがあれば、
    ITEXTCTL_SetActive(pMe->phc,TRUE);//フォーカスは、ここ
  を実行し、対象外であれば
    ITEXTCTL_SetActive(pMe->phc,FALSE);//フォーカス来るな!
  を実行します。

なお、IHTMLCTL_SetActiveについては、次回説明します。




■ソースファイル(gamen1.c)の修正5
:その他

 gamen1_NextCurItemに関しては、カーソル移動については、変更ないので、かわっていません。
 gamen1_doJob2で、いままでIHTMLCtlの項目から値をとっていたのに、ITextCtlの値に代わってしまったので、その値を取得する部分(ITEXTCTL_GetTextをするところあたり)は、かわっています。




■注意事項
・なお、このとおりにやると、文字列入力に来ているときに、上キーは、たしかに「打ち終わったよ」ボタンに行くのですが、左、右、下キーは、そのまま、文字列の左、右、下にいってしまいます。

 これは、デフォルトの複数行のテキストエリアの動きがこうなので、こうなってしまいます。

 もしこうしたくなければ、gamen1_HandleEventのITEXTCTL_HandleEvenで、TRUEが帰ってきても、関数から抜けないで、下の処理をさせればいいわけですが、この場合、今度はデフォルトのような動きはしなくなりますので、それでいいかどうかは検討しないといけません。


Java版のDispAppData()では、文字列を再設定して表示しているのに、BREW版はそれをしなくていいのか?という話があると思います。
 今回の仕様では、再表示する必要が(仕様的に)ないので、していないだけで、もし、複雑に再表示するなら、同じようにしたほうがいいと思います。




 次回のこのシリーズでは、上記で何箇所か出てきた、IHtmlCtl.c,IHtmlCtl.hの話をしたいと思います。



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

Javaの画面表示-その6:マルチウィンドウと再描画その2

2006-10-17 09:08:17 | Weblog

 シリーズJavaの画面表示のつづきです。前回は、同時に2つ開き、さらに、内容の書き換えがあるケースについて考えてました。そこで、第一画面から、第二画面の部品を

String byo = (String)map.get("byo");
g2.l2.setText("正解率"+ seikai + "%" +"時間" + byo + "秒");

のように、直接書き換えていたのですが、こうやって書き換えてしまうと、第二画面で修正が入った、つまり、上記のケースだとl2がなくなるなどということがあると、第一画面からもl2を削除して、同時に入れないと、いけません。第二画面だけl2を削除しちゃったら、コンパイルエラーになってしまいます。

 今は第一画面と第二画面だからいいけど、それ以外にもいくつも修正があって、たとえば、
・第一画面に何か追加し、第二画面から書き換え(つまり、第一と第二画面相互書き換え)
・第3画面というのは、第二画面に追加してくれないと(l3というのを操作する場合)
 作業できない場合

 第三画面は、第二画面が修正されないと、コンパイルエラーになってしまうけど、第二画面は第一画面を。。。とかなんとかなってくると、複雑になって、結局、コンパイルは通らないけど、アップデートしないと。。とかなってしまうと、コンパイルできないので、テストできません(>_<!)って言うことになってしまいます。テストファーストとかになりません。。。(>_<!)

 どーしましょー。っていうところで終わってました。

 今回は、その問題への対応策です。
 なお、今回のプログラムの仕様は、前回のところに書いてあります。




■再描画のためのメソッドをつくり、それを呼び出す

 そこで、Brew版とおなじく、再描画のメソッド、DispAppDataというのを作ります。
 ここで、ハッシュマップから値をとってきて、再描画(画面部品.setText(文字列))します。

 そして、設定元では、ハッシュマップに値をセットします。
 こうすると、呼び出し側は、画面部品が増えても減っても変更ありません。
 たとえば、仮に、第二画面の正解率と秒数の表示をやめた場合、l2という画面部品が削除されますが、第一画面はべつにl2を削除しても、削除しなくても、リンクできますし、問題ありません(たしかにsei_rituを第一画面で設定している部分はムダですが、ムダというだけで、これで問題が起きるわけではありません)。

 このようにして、再描画メソッドをつくり、再描画部分をその中にカプセル化し、表示に必要なデータは共通領域に設定、取得するようにすれば、画面間での影響(による、リンクができなくなり、テストできない事態)は、避けられます。
 なお、BREW版同様、このときは、初期化画面でも、この再描画処理を呼び出します(そうしないと、テキスト部分が表示できないので)。

 また、画面によっては、再描画がいらないときもあるかと思います。
 しかし、その場合でも
public void DispAppData()
{
}
というかたちで、メソッドだけは作っておいたほうが、のちのち修正が入って必要な場合もあるので、べんりです。




■ソース
それら
・共通領域に画面のオブジェクトも設定し、
   その画面オブジェクトがあったら再描画
   なかったら生成して、共通領域に設定

・修正時は、共通領域の値を更新して
 再描画を呼ぶ
という修正をしたソースは、以下のとおりです。

●test.java(メイン部分)
import java.util.*;

public class test{


	/*
	 * 	メイン処理
	 */
	public static void main(String[] args) 
	{
		HashMap map= new HashMap();
		
		gamen1 g = new gamen1();

		//	画面1を設定
		map.put("gamen1",g);

		g.map	=	map;
		g.initAppData();
	}
	
}


●gamen1.java(第一画面)
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;
	/*
	 * 	表示
	 */
	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);
		f.add(t1);
		
		//	ボタン作成		
		b1 = new Button("挑戦する");
		b1.setLocation(120,70);
		b1.setSize(100,30);
		b1.addActionListener(al);
		f.add(b1);

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

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

	}

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

		//	画面表示
		if ( t1 != null )
		{
			t1.setText(rensyu);	
		}
	}
	
	/*
	 * 	終了
	 */
	public void freeAppData()
	{
		f.dispose();
	}
		
	/*
	 * 	イベントリスナー
	 */
	private class gamen1_HandleEvent 
			implements ActionListener
	{

		/*
		 * 	ボタンが押されたときの処理
		 */
		public void actionPerformed(ActionEvent e)
		{

			Object o = e.getSource();

			if ( o.equals(b1)== true)
			{	//	挑戦する
				System.out.println("挑戦する");
				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();	消さないで両方だす
			}
		}
	}
}


●gamen2.java(第二画面)
import java.awt.*;
import java.awt.event.*;
import java.util.*;


public class gamen2 {

	//	共通領域
	public HashMap	map = null;
	
	//	画面項目項目
	Frame 		f;
	Label 		l1;
	Label 		l2;
	Button		b1;
	Button		b2;

	/*
	 * 	表示
	 */
	public void initAppData()
	{


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

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

		//	ラベル
		l1 = new Label();
		l1.setLocation(10,30);
		l1.setSize(220,30);
		f.add(l1);

		l2 = new Label();
		l2.setLocation(10,120);
		l2.setSize(220,30);
		f.add(l2);

		//	ボタン作成		
		b1 = new Button("再挑戦する");
		b1.setLocation(10,250);
		b1.setSize(100,30);
		b1.addActionListener(al);
		f.add(b1);

		//	ボタン作成		
		b2 = new Button("終了");
		b2.setLocation(130,250);
		b2.setSize(100,30);
		b2.addActionListener(al);
		f.add(b2);

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

	}

	/*
	 * 	終了
	 */
	public void freeAppData()
	{
		f.dispose();
	}
		
	/*
	 * 	再描画
	 */
	public void DispAppData()
	{
		//	画面間引数を受け取る		
		String username = "";
		String sei_ritu = "";
		String byo = "";
		if ( map	!=	null )
		{
			username	= (String)map.get("username");
			if ( username	==	null )
				username	=	"";

			sei_ritu	= (String)map.get("sei_ritu");
			if ( sei_ritu ==	null )
				sei_ritu 	=	"";
				
			byo			= (String)map.get("byo");
			if ( byo ==	null )
				byo 	=	"";
		}

		//	画面表示		
		if ( l1	!=	null )
		{
			l1.setText(username + "さんの結果");
		}
		if ( l2	!=	null )
		{
			l2.setText("正解率"+ sei_ritu + "%" +"時間" + byo + "秒");
		}
	}
	
	/*
	 * 	イベントリスナー
	 */
	private class gamen2_HandleEvent 
			implements ActionListener
	{

		/*
		 * 	ボタンが押されたときの処理
		 */
		public void actionPerformed(ActionEvent e)
		{

			Object o = e.getSource();

			if ( o.equals(b1)== true)
			{	//	挑戦する
				System.out.println("再挑戦する");

				//	第一画面表示
				gamen1 g1 = (gamen1)map.get("gamen1");
				if ( g1 == null )
				{
					g1	=	new gamen1();
					map.put("gamen1",g1);
					g1.map	=	map;
					g1.initAppData();
				}
				else
				{
				}
				//	消す
//				freeAppData();	//	消さないで両方出す
				return;
			}

			if ( o.equals(b2)== true)	
			{	//	打ち終わった!
				System.exit(0);
			}
		}
	}
}





ちなみに、この画面情報を入れるというのが、BREW版のカオル姫方式2ndになります。
つまり、きのう書いた、カオル姫方式2ndは、Javaのシリーズをやっているのですが、そっちのほうで、カオル姫方式2ndと同じことをやると思うのでというのは、上記のことです。


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