複数のメタセコイイアファイルからデータを読み込んで
表示する機能を追加してみた。
2010年4月20日火曜日
2010年4月17日土曜日
3Dモデル表示アプレットの機能追加予定メモ
3Dモデル表示Javaアプレットの機能追加予定
1.フォンシェーデイングでも表示できるようにする
2.バンプマッピングの対応
3.複数のメタセコイイアファイルでのモデル表示
4.3Dモデルをそれらしく動作させる(歩いたりできるようにする)
1と3は、たぶん問題なく実装できると思う。(3が一番簡単)
2.は1ができてないと実装できない。
4.は結構難しいかもしれない。
(動かせることは動かせるけどロボットのような動きになってしまうような・・・)
1.フォンシェーデイングでも表示できるようにする
2.バンプマッピングの対応
3.複数のメタセコイイアファイルでのモデル表示
4.3Dモデルをそれらしく動作させる(歩いたりできるようにする)
1と3は、たぶん問題なく実装できると思う。(3が一番簡単)
2.は1ができてないと実装できない。
4.は結構難しいかもしれない。
(動かせることは動かせるけどロボットのような動きになってしまうような・・・)
2010年4月16日金曜日
3Dモデル表示アプレット(メタセコイアファイル)
(現在、機能強化したバージョンを基本フリーソフトとして公開しています。)
以前、作成した3Dモデル表示のJavaアプレットに
メタセコイアファイルを読み込み表示する機能を追加してみた。
はじめは、おそらく2~3週間ぐらいかかるかもしれないと考えていたが
それらしきモデルの表示は、これまで自分が作成したプログラムを
流用して、あっさり1日で作成できた。
いくつかネット上で公開されていたメタセコイアでのファイルを試しに、いろいろと読み込んでみて
不具合があったら、その都度プログラム修正を行った。
アルファテクスチャから物体を透過させる対応ができていなかったので
いろいろと試行錯誤して、
(完全な対応はできていないものの)なんとかそれらしく表示できるようにしてみた。
(グローシェーディングでの表示)
自分が作成した3Dモデルを表示させることができれば、一番ベターだが、
3Dモデル自体の作成が下手糞(これまでは、ほとんど作成したことがない)なので、
現在、3Dモデルは、テストとして書籍ローポリスーパーテクニックにあったものを使用しています。
<内容>
メタセコイアファイルデータをグローシェーディングで表示するアプレット
Java3D、JOGLは、使用していません。自作の3D表示用クラスで表示させています。
<操作方法>
[マウス左ドラッグ]:オブジェクトの回転
[マウス右ドラッグ]:オブジェクトの移動
[ホイール]:オブジェクトの拡大・縮小
以前、作成した3Dモデル表示のJavaアプレットに
メタセコイアファイルを読み込み表示する機能を追加してみた。
はじめは、おそらく2~3週間ぐらいかかるかもしれないと考えていたが
それらしきモデルの表示は、これまで自分が作成したプログラムを
流用して、あっさり1日で作成できた。
いくつかネット上で公開されていたメタセコイアでのファイルを試しに、いろいろと読み込んでみて
不具合があったら、その都度プログラム修正を行った。
アルファテクスチャから物体を透過させる対応ができていなかったので
いろいろと試行錯誤して、
(完全な対応はできていないものの)なんとかそれらしく表示できるようにしてみた。
(グローシェーディングでの表示)
自分が作成した3Dモデルを表示させることができれば、一番ベターだが、
3Dモデル自体の作成が下手糞(これまでは、ほとんど作成したことがない)なので、
現在、3Dモデルは、テストとして書籍ローポリスーパーテクニックにあったものを使用しています。
<内容>
メタセコイアファイルデータをグローシェーディングで表示するアプレット
Java3D、JOGLは、使用していません。自作の3D表示用クラスで表示させています。
<操作方法>
[マウス左ドラッグ]:オブジェクトの回転
[マウス右ドラッグ]:オブジェクトの移動
[ホイール]:オブジェクトの拡大・縮小
2010年4月7日水曜日
サイト上にあるサウンドデータをSourceDataLineで再生2
【機能概要】
jar内のサウンドデータをSourceDataLineで2回再生
(オーディオデータをリアルタイムにストリーミングしながら再生する)
1回目の再生は、読み込みながら
2回目の再生は、データを溜め込んでから
【補足】
jar内のファイルへのアクセスは、以下のように指定すれば、java.net.URLで読み込むことができる。
jar:http://localhost:8888/SoundTest03.jar!/TESTDATA01.data
【ソース】
・
・
・
省略
・
・
・
public void case010() {
printf("PLAY SOUND \n");
DataInputStream dis = null;
byte[] buffer = new byte[8000];
int off, len, l=0;
AudioFormat.Encoding enc = new AudioFormat.Encoding("PCM_SIGNED");
AudioFormat format2 = new AudioFormat(
enc,
22050.0F,
16,
2,
4,
22050.0F,
false
);
SourceDataLine line = null;
BytePool bp = new BytePool();
String DEF_SRCDATA = "SoundTest03.jar!/sound/TESTDATA01.data";
String srcdata = DEF_SRCDATA;
printf("0.srcdata >>>%s\n", srcdata);
try {
try{
printf("getDocumentBase() >>>%s\n", getDocumentBase().toString());
printf("getCodeBase() >>>%s\n", getCodeBase().toString());
srcdata = getParameter( "DATA_SRC" );
printf("1.srcdata >>>%s\n", srcdata);
printf("getParameter( 'DATA_SRC' ) >>>%s\n",srcdata );
if(srcdata == null){
printf("chk01 \n");
srcdata = "jar:" + getCodeBase().toString() + DEF_SRCDATA;
}
else{
printf("chk02 \n");
}
}
catch(Exception e){
printf("chk03 \n");
}
printf("2.srcdata >>>%s\n", srcdata);
URL url = new URL(srcdata);
dis = new DataInputStream(
url.openStream()
);
// DataLine.Info lineInfo = new DataLine.Info(SourceDataLine.class,format);
DataLine.Info lineInfo = new DataLine.Info(SourceDataLine.class,format2);
line = (SourceDataLine) AudioSystem.getLine(lineInfo);
// line.open(format);
line.open(format2);
line.start();
while ((len = dis.read(buffer)) > 0) {
printf("len >>%d \n",len);
bp.add(buffer,len);
for (off = 0; len > 0; off += l, len -= l) {
try{
// 書き込まれるバイト数] % [フレームサイズのバイト数] == 0
// System.out.printf("[書き込まれるバイト数] % [フレームサイズのバイト数] == 0 \n");
printf("[%d] % [%d] == %d \n",len,4,len % 4);
// System.out.printf("before len >>%d off >>>%d l >>>%d\n",len,off,l);
l = line.write(buffer, off, len);
// System.out.printf("after len >>%d off >>>%d l >>>%d\n",len,off,l);
}
catch(IllegalArgumentException e){
printf("%s\n", e.toString());
}
}
}
printf("all size >>>%d bytes \n",bp.getSize());
byte[] data = bp.getData();
line.write(data, 0, data.length);
} catch (Exception e) {
printf("%s\n", e.toString());
} finally {
if (line != null)line.close();
if (dis != null){
try{ dis.close(); }catch(Exception e){}
}
// System.exit(0);
}
}
public static void main(String[] args) {
SoundTest03 t01 = new SoundTest03();
// t01.case001();
// t01.case002();
// t01.case003();
// t01.case004();
// t01.case005();
// t01.case006();
// t01.case007();
// t01.case008();
// t01.case009();
t01.case010();
}
class BytePool{
// ArrayList<byte []> datalist = new ArrayList<byte []>();
//LinkedList<byte []> datalist = new LinkedList<byte []>();
LinkedList<ByteBuffer> datalist = new LinkedList<ByteBuffer>();
public void add(byte[] b,int len){
ByteBuffer buffer = ByteBuffer.allocate(len);
buffer.put(b,0,len);
datalist.add(buffer);
// printf("%d bytes \n",b.length);
}
public int getSize(){
int size = 0;
for (int i = 0; i < datalist.size(); i++) {
size += datalist.get(i).capacity();
}
return size;
}
public byte[] getData(){
byte[] data = new byte[getSize()];
try{
int off = 0;
int len = 0;
// int ind = 0;
for (int i = 0; i < datalist.size(); i++) {
ByteBuffer buffer = datalist.get(i);
len = buffer.capacity();
buffer.position(0);
buffer.get(data,off,len);
// for(int j=0;j<len;j++){
// data[ind++] = buffer.get();
// }
off += len;
}
}
catch(Exception e){
printf("%s\n", e.toString());
}
return data;
}
}
【実行結果】
別ウィンドウで表示
jar内のサウンドデータをSourceDataLineで2回再生
(オーディオデータをリアルタイムにストリーミングしながら再生する)
1回目の再生は、読み込みながら
2回目の再生は、データを溜め込んでから
【補足】
jar内のファイルへのアクセスは、以下のように指定すれば、java.net.URLで読み込むことができる。
jar:http://localhost:8888/SoundTest03.jar!/TESTDATA01.data
【ソース】
・
・
・
省略
・
・
・
public void case010() {
printf("PLAY SOUND \n");
DataInputStream dis = null;
byte[] buffer = new byte[8000];
int off, len, l=0;
AudioFormat.Encoding enc = new AudioFormat.Encoding("PCM_SIGNED");
AudioFormat format2 = new AudioFormat(
enc,
22050.0F,
16,
2,
4,
22050.0F,
false
);
SourceDataLine line = null;
BytePool bp = new BytePool();
String DEF_SRCDATA = "SoundTest03.jar!/sound/TESTDATA01.data";
String srcdata = DEF_SRCDATA;
printf("0.srcdata >>>%s\n", srcdata);
try {
try{
printf("getDocumentBase() >>>%s\n", getDocumentBase().toString());
printf("getCodeBase() >>>%s\n", getCodeBase().toString());
srcdata = getParameter( "DATA_SRC" );
printf("1.srcdata >>>%s\n", srcdata);
printf("getParameter( 'DATA_SRC' ) >>>%s\n",srcdata );
if(srcdata == null){
printf("chk01 \n");
srcdata = "jar:" + getCodeBase().toString() + DEF_SRCDATA;
}
else{
printf("chk02 \n");
}
}
catch(Exception e){
printf("chk03 \n");
}
printf("2.srcdata >>>%s\n", srcdata);
URL url = new URL(srcdata);
dis = new DataInputStream(
url.openStream()
);
// DataLine.Info lineInfo = new DataLine.Info(SourceDataLine.class,format);
DataLine.Info lineInfo = new DataLine.Info(SourceDataLine.class,format2);
line = (SourceDataLine) AudioSystem.getLine(lineInfo);
// line.open(format);
line.open(format2);
line.start();
while ((len = dis.read(buffer)) > 0) {
printf("len >>%d \n",len);
bp.add(buffer,len);
for (off = 0; len > 0; off += l, len -= l) {
try{
// 書き込まれるバイト数] % [フレームサイズのバイト数] == 0
// System.out.printf("[書き込まれるバイト数] % [フレームサイズのバイト数] == 0 \n");
printf("[%d] % [%d] == %d \n",len,4,len % 4);
// System.out.printf("before len >>%d off >>>%d l >>>%d\n",len,off,l);
l = line.write(buffer, off, len);
// System.out.printf("after len >>%d off >>>%d l >>>%d\n",len,off,l);
}
catch(IllegalArgumentException e){
printf("%s\n", e.toString());
}
}
}
printf("all size >>>%d bytes \n",bp.getSize());
byte[] data = bp.getData();
line.write(data, 0, data.length);
} catch (Exception e) {
printf("%s\n", e.toString());
} finally {
if (line != null)line.close();
if (dis != null){
try{ dis.close(); }catch(Exception e){}
}
// System.exit(0);
}
}
public static void main(String[] args) {
SoundTest03 t01 = new SoundTest03();
// t01.case001();
// t01.case002();
// t01.case003();
// t01.case004();
// t01.case005();
// t01.case006();
// t01.case007();
// t01.case008();
// t01.case009();
t01.case010();
}
class BytePool{
// ArrayList<byte []> datalist = new ArrayList<byte []>();
//LinkedList<byte []> datalist = new LinkedList<byte []>();
LinkedList<ByteBuffer> datalist = new LinkedList<ByteBuffer>();
public void add(byte[] b,int len){
ByteBuffer buffer = ByteBuffer.allocate(len);
buffer.put(b,0,len);
datalist.add(buffer);
// printf("%d bytes \n",b.length);
}
public int getSize(){
int size = 0;
for (int i = 0; i < datalist.size(); i++) {
size += datalist.get(i).capacity();
}
return size;
}
public byte[] getData(){
byte[] data = new byte[getSize()];
try{
int off = 0;
int len = 0;
// int ind = 0;
for (int i = 0; i < datalist.size(); i++) {
ByteBuffer buffer = datalist.get(i);
len = buffer.capacity();
buffer.position(0);
buffer.get(data,off,len);
// for(int j=0;j<len;j++){
// data[ind++] = buffer.get();
// }
off += len;
}
}
catch(Exception e){
printf("%s\n", e.toString());
}
return data;
}
}
【実行結果】
別ウィンドウで表示
2010年4月5日月曜日
サイト上にあるサウンドデータをSourceDataLineで再生
【機能概要】
サイト上にあるサウンドファイルをSourceDataLineで再生
(オーディオデータをリアルタイムにストリーミングしながら再生する)
【ソース】
package com.naozary.test.sound;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.io.DataInputStream;
import java.io.FileOutputStream;
import java.net.URL;
import java.util.Formatter;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.SourceDataLine;
import javax.swing.JApplet;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
public class SoundTest02 extends JApplet implements ActionListener, Runnable {
// JPanel jPanel1 = new JPanel();
JScrollPane jPanel1 = null;
JTextArea tArea = new JTextArea();
Dimension dim = null;
Thread thread = null;
public void init() {
addComponentListener(new ComponentAdapter() {
public void componentResized(ComponentEvent e) {
updateLayout();
}
});
dim = getSize();
// System.out.printf("%d , %d",dim.width,dim.height );
tArea.setEditable(false);
// this.setSize(new Dimension(550,300));
this.setSize(dim);
// jPanel1.setLayout(null);
tArea.setBounds(new Rectangle(0, 0, this.getWidth(), this.getHeight()));
// tArea.setText("AAAAA"); //デフォルトのテキストを表示
// tArea.setFont(new Font("Serif",Font.PLAIN,16));
tArea.setFont(new Font("Monospaced", Font.PLAIN, 16));
tArea.setTabSize(4); // タブサイズを設定
tArea.setForeground(Color.white);
tArea.setBackground(Color.black);
tArea.setLineWrap(true); // 右辺で自動折り返しにする
tArea.setSelectionColor(Color.lightGray); // 反転選択範囲の背景色
tArea.setSelectedTextColor(Color.blue); // 反転選択範囲の文字色
// jPanel1.add(tArea);
jPanel1 = new JScrollPane(tArea);
this.getContentPane().add(jPanel1, BorderLayout.CENTER);
AppletOn = true;
thread = new Thread(this);
thread.start();
}
public void run() {
// case001();
case009();
}
public void actionPerformed(ActionEvent e) {
}
public void updateLayout() {
// System.out.printf("*** enter updateLayout() ***\n" );
dim = getSize();
this.setSize(dim);
tArea.setBounds(new Rectangle(0, 0, this.getWidth(), this.getHeight()));
}
StringBuilder builder = new StringBuilder();
Formatter formatter = new Formatter(builder);
boolean AppletOn = false;
public void printf(String arg0, Object... args) {
formatter.format(arg0, args);
if (AppletOn) {
tArea.append(formatter.out().toString()); // デフォルトのテキストを表示
} else {
System.out.print(formatter.out());
}
// System.out.println("builder.length() >>>" + builder.length());
builder.delete(0, builder.length());
}
public void case009() {
printf("PLAY SOUND \n");
FileOutputStream fos = null;
DataInputStream dis = null;
byte[] buffer = new byte[8000];
int off, len, l;
AudioFormat.Encoding enc = new AudioFormat.Encoding("PCM_SIGNED");
AudioFormat format2 = new AudioFormat(
enc,
22050.0F,
16,
2,
4,
22050.0F,
false
);
SourceDataLine line = null;
try {
// DataLine.Info lineInfo = new DataLine.Info(SourceDataLine.class,format);
DataLine.Info lineInfo = new DataLine.Info(SourceDataLine.class,format2);
line = (SourceDataLine) AudioSystem.getLine(lineInfo);
// line.open(format);
line.open(format2);
line.start();
URL url = new URL("http://www.naozary.com/download?registerno=20100405193321564");
dis = new DataInputStream(
url.openStream()
);
while ((len = dis.read(buffer)) > 0) {
for (off = 0; len > 0; off += l, len -= l) {
l = line.write(buffer, off, len);
}
}
} catch (Exception e) {
printf("%s\n", e.toString());
} finally {
if (line != null)line.close();
if (dis != null){
try{ dis.close(); }catch(Exception e){}
}
// System.exit(0);
}
}
public static void main(String[] args) {
SoundTest02 t01 = new SoundTest02();
// t01.case001();
// t01.case002();
// t01.case003();
// t01.case004();
// t01.case005();
// t01.case006();
// t01.case007();
// t01.case008();
t01.case009();
}
}
【実行結果】
別ウィンドウで表示
サイト上にあるサウンドファイルをSourceDataLineで再生
(オーディオデータをリアルタイムにストリーミングしながら再生する)
【ソース】
package com.naozary.test.sound;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.io.DataInputStream;
import java.io.FileOutputStream;
import java.net.URL;
import java.util.Formatter;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.SourceDataLine;
import javax.swing.JApplet;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
public class SoundTest02 extends JApplet implements ActionListener, Runnable {
// JPanel jPanel1 = new JPanel();
JScrollPane jPanel1 = null;
JTextArea tArea = new JTextArea();
Dimension dim = null;
Thread thread = null;
public void init() {
addComponentListener(new ComponentAdapter() {
public void componentResized(ComponentEvent e) {
updateLayout();
}
});
dim = getSize();
// System.out.printf("%d , %d",dim.width,dim.height );
tArea.setEditable(false);
// this.setSize(new Dimension(550,300));
this.setSize(dim);
// jPanel1.setLayout(null);
tArea.setBounds(new Rectangle(0, 0, this.getWidth(), this.getHeight()));
// tArea.setText("AAAAA"); //デフォルトのテキストを表示
// tArea.setFont(new Font("Serif",Font.PLAIN,16));
tArea.setFont(new Font("Monospaced", Font.PLAIN, 16));
tArea.setTabSize(4); // タブサイズを設定
tArea.setForeground(Color.white);
tArea.setBackground(Color.black);
tArea.setLineWrap(true); // 右辺で自動折り返しにする
tArea.setSelectionColor(Color.lightGray); // 反転選択範囲の背景色
tArea.setSelectedTextColor(Color.blue); // 反転選択範囲の文字色
// jPanel1.add(tArea);
jPanel1 = new JScrollPane(tArea);
this.getContentPane().add(jPanel1, BorderLayout.CENTER);
AppletOn = true;
thread = new Thread(this);
thread.start();
}
public void run() {
// case001();
case009();
}
public void actionPerformed(ActionEvent e) {
}
public void updateLayout() {
// System.out.printf("*** enter updateLayout() ***\n" );
dim = getSize();
this.setSize(dim);
tArea.setBounds(new Rectangle(0, 0, this.getWidth(), this.getHeight()));
}
StringBuilder builder = new StringBuilder();
Formatter formatter = new Formatter(builder);
boolean AppletOn = false;
public void printf(String arg0, Object... args) {
formatter.format(arg0, args);
if (AppletOn) {
tArea.append(formatter.out().toString()); // デフォルトのテキストを表示
} else {
System.out.print(formatter.out());
}
// System.out.println("builder.length() >>>" + builder.length());
builder.delete(0, builder.length());
}
public void case009() {
printf("PLAY SOUND \n");
FileOutputStream fos = null;
DataInputStream dis = null;
byte[] buffer = new byte[8000];
int off, len, l;
AudioFormat.Encoding enc = new AudioFormat.Encoding("PCM_SIGNED");
AudioFormat format2 = new AudioFormat(
enc,
22050.0F,
16,
2,
4,
22050.0F,
false
);
SourceDataLine line = null;
try {
// DataLine.Info lineInfo = new DataLine.Info(SourceDataLine.class,format);
DataLine.Info lineInfo = new DataLine.Info(SourceDataLine.class,format2);
line = (SourceDataLine) AudioSystem.getLine(lineInfo);
// line.open(format);
line.open(format2);
line.start();
URL url = new URL("http://www.naozary.com/download?registerno=20100405193321564");
dis = new DataInputStream(
url.openStream()
);
while ((len = dis.read(buffer)) > 0) {
for (off = 0; len > 0; off += l, len -= l) {
l = line.write(buffer, off, len);
}
}
} catch (Exception e) {
printf("%s\n", e.toString());
} finally {
if (line != null)line.close();
if (dis != null){
try{ dis.close(); }catch(Exception e){}
}
// System.exit(0);
}
}
public static void main(String[] args) {
SoundTest02 t01 = new SoundTest02();
// t01.case001();
// t01.case002();
// t01.case003();
// t01.case004();
// t01.case005();
// t01.case006();
// t01.case007();
// t01.case008();
t01.case009();
}
}
【実行結果】
別ウィンドウで表示
2010年4月4日日曜日
サイト上にあるサウンドファイルをClipで再生
【機能概要】
サイト上にあるサウンドファイルをClipで再生
(オーディオデータを全部プリロードして再生する)
【ソース】
package com.naozary.test.sound;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.net.URL;
import java.util.Formatter;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.Line;
import javax.swing.JApplet;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
public class SoundTest01 extends JApplet implements ActionListener ,Runnable{
// JPanel jPanel1 = new JPanel();
JScrollPane jPanel1 = null;
JTextArea tArea = new JTextArea();
Dimension dim = null;
Thread thread = null;
public void init() {
addComponentListener(new ComponentAdapter() {
public void componentResized(ComponentEvent e) {
updateLayout();
}
});
dim = getSize();
// System.out.printf("%d , %d",dim.width,dim.height );
tArea.setEditable(false);
// this.setSize(new Dimension(550,300));
this.setSize(dim);
// jPanel1.setLayout(null);
tArea.setBounds(new Rectangle(0, 0,this.getWidth(),this.getHeight()));
// tArea.setText("AAAAA"); //デフォルトのテキストを表示
// tArea.setFont(new Font("Serif",Font.PLAIN,16));
tArea.setFont(new Font("Monospaced",Font.PLAIN,16));
tArea.setTabSize(4); //タブサイズを設定
tArea.setForeground(Color.white);
tArea.setBackground(Color.black);
tArea.setLineWrap(true); //右辺で自動折り返しにする
tArea.setSelectionColor(Color.lightGray); //反転選択範囲の背景色
tArea.setSelectedTextColor(Color.blue); //反転選択範囲の文字色
// jPanel1.add(tArea);
jPanel1 = new JScrollPane(tArea);
this.getContentPane().add(jPanel1, BorderLayout.CENTER);
AppletOn = true;
thread = new Thread(this);
thread.start();
}
public void run(){
// case001();
case004();
}
public void actionPerformed(ActionEvent e){}
public void updateLayout(){
// System.out.printf("*** enter updateLayout() ***\n" );
dim = getSize();
this.setSize(dim);
tArea.setBounds(new Rectangle(0, 0,this.getWidth(),this.getHeight()));
}
StringBuilder builder = new StringBuilder();
Formatter formatter = new Formatter(builder);
boolean AppletOn = false;
public void printf(String arg0,Object... args){
formatter.format(arg0,args);
if(AppletOn){
tArea.append(formatter.out().toString()); //デフォルトのテキストを表示
}
else{
System.out.print(formatter.out());
}
// System.out.println("builder.length() >>>" + builder.length());
builder.delete(0, builder.length());
}
public void case004(){
printf("PLAY SOUND \n");
Clip clip = null;
try{
URL url = new URL(
"http://www.naozary.com/download?registerno=20100404181152490"
);
AudioInputStream as
= AudioSystem.getAudioInputStream(url.openStream());
clip = (Clip)AudioSystem.getLine(
new Line.Info(Clip.class));
clip.open(as);
clip.start();
do{
Thread.sleep(1000);
}while(clip.isRunning());
}
catch(Exception e){
}
finally
{
if(clip != null) clip.close();
}
}
public static void main(String[] args) {
SoundTest01 t01 = new SoundTest01();
t01.case004();
}
}
【実行結果】
別ウィンドウで実行
サイト上にあるサウンドファイルをClipで再生
(オーディオデータを全部プリロードして再生する)
【ソース】
package com.naozary.test.sound;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.net.URL;
import java.util.Formatter;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.Line;
import javax.swing.JApplet;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
public class SoundTest01 extends JApplet implements ActionListener ,Runnable{
// JPanel jPanel1 = new JPanel();
JScrollPane jPanel1 = null;
JTextArea tArea = new JTextArea();
Dimension dim = null;
Thread thread = null;
public void init() {
addComponentListener(new ComponentAdapter() {
public void componentResized(ComponentEvent e) {
updateLayout();
}
});
dim = getSize();
// System.out.printf("%d , %d",dim.width,dim.height );
tArea.setEditable(false);
// this.setSize(new Dimension(550,300));
this.setSize(dim);
// jPanel1.setLayout(null);
tArea.setBounds(new Rectangle(0, 0,this.getWidth(),this.getHeight()));
// tArea.setText("AAAAA"); //デフォルトのテキストを表示
// tArea.setFont(new Font("Serif",Font.PLAIN,16));
tArea.setFont(new Font("Monospaced",Font.PLAIN,16));
tArea.setTabSize(4); //タブサイズを設定
tArea.setForeground(Color.white);
tArea.setBackground(Color.black);
tArea.setLineWrap(true); //右辺で自動折り返しにする
tArea.setSelectionColor(Color.lightGray); //反転選択範囲の背景色
tArea.setSelectedTextColor(Color.blue); //反転選択範囲の文字色
// jPanel1.add(tArea);
jPanel1 = new JScrollPane(tArea);
this.getContentPane().add(jPanel1, BorderLayout.CENTER);
AppletOn = true;
thread = new Thread(this);
thread.start();
}
public void run(){
// case001();
case004();
}
public void actionPerformed(ActionEvent e){}
public void updateLayout(){
// System.out.printf("*** enter updateLayout() ***\n" );
dim = getSize();
this.setSize(dim);
tArea.setBounds(new Rectangle(0, 0,this.getWidth(),this.getHeight()));
}
StringBuilder builder = new StringBuilder();
Formatter formatter = new Formatter(builder);
boolean AppletOn = false;
public void printf(String arg0,Object... args){
formatter.format(arg0,args);
if(AppletOn){
tArea.append(formatter.out().toString()); //デフォルトのテキストを表示
}
else{
System.out.print(formatter.out());
}
// System.out.println("builder.length() >>>" + builder.length());
builder.delete(0, builder.length());
}
public void case004(){
printf("PLAY SOUND \n");
Clip clip = null;
try{
URL url = new URL(
"http://www.naozary.com/download?registerno=20100404181152490"
);
AudioInputStream as
= AudioSystem.getAudioInputStream(url.openStream());
clip = (Clip)AudioSystem.getLine(
new Line.Info(Clip.class));
clip.open(as);
clip.start();
do{
Thread.sleep(1000);
}while(clip.isRunning());
}
catch(Exception e){
}
finally
{
if(clip != null) clip.close();
}
}
public static void main(String[] args) {
SoundTest01 t01 = new SoundTest01();
t01.case004();
}
}
【実行結果】
別ウィンドウで実行
2010年4月3日土曜日
企画書作成メモ
■企画書のポイント
1.内容がきちんと伝わる
自分が思い描いていることを、相手に100%伝える。
2.相手に納得してもらう
3.必要度に応じて、等身大で作る
こちらの伝えたいことが完璧に伝わる企画書を最短の時間と労力で作る。
1と2は同じような気がするが・・・
企画とは提案である
・相手のメリットを明確にする。(これを実行することでどんなメリットがあるのか?)
・顧客の立場になって具体的な数値を盛り込んでいく。
(例)新規事業の企画書
収益の予測、成功の確率、かかるコスト、スタッフ、スケジュール
・相手が求めている情報を相手自身が気づいてないときでも、それを探りだして明記した企画書は優れている。
・企画の真髄は、『提案』と『ベネフィット(利益、恩恵)』
ベネフィットが予測であるなら、予測を裏付ける情報が必要
・ベネフィットが100%伝われば、企画書としては合格(ベネフィット以外の部分が多少伝わらないのはかまわない)
・究極は相手に考えさせる企画書
真実をしっかり書いてこそ、相手は考えてくれる。下手に良いを連発すると、疑いをもたれてしまう。
・最悪な企画書は嘘やだまし
自社製品に劣っている点があることを、あえて比較表で明確にする。新規事業のプロジェクトを提案するなら、
失敗する可能性やその予測を明確にする。
・どれほど苦労しても企画書は自分で作成する。
第3者に作成させて、思い通りにできあがるケースは稀である。
・企画書の目的を明確にする
・裏づけをどう用意するか。どう収集するか
・ターゲットを明確にする
商談であれば、ターゲットは決定権者となる。商談で話している相手は、単なる窓口で、決定権者は別にいることも多い。
・目的とベネフィットを決める
・理解度を把握する
・必要な資料やビジュアルを揃える
・構成を考える
・締め切り
・コンペの有無
■情報を集めるテクニック
・情報には常にアンテナを張っておく
・政府の統計や白書を利用する
■企画書構成の黄金則
企画書に最も重要なのは『ベネフィットのある内容』
次に大事なのは『構成』
・構成の基本
説明型:説明を重ねていき、結論としてキラーインフォメーションを見せる
インパクト型:相手がうなずいてしまうキラーインフォメーションを見せる
キラーインフォメーションは具体的に提示する。(抽象的にしないようにする)
・長い企画書の構成
<例>
0.タイトル
1.企画趣旨(キラーインフォメーション)
2.根拠
3.製品情報
4.ユーザ事例
5.価格等
6.付加資料
・相手の求めているポイントを突く
・相手が望むのは基本的に利益
・自分のアイディアを明確にする
・アイデアが浮かばない場合、組み合わせなどを考える。
■問題点を見せてしまう
・問題点は思いつく限り書いておく
・比較表には自社のマイナス点も盛り込む
・欠点の理由を明確にする
■『ライバルに負ける』と思うことから始める
・ベストな企画書を提示し続ける
■表示を見た瞬間、ページをめくった瞬間が重要
・最初に見る場所をよく考える
・読んでもらえそうもない企画書こそ、タイトルが命だ。
・ベネフィットを明確にする
・人づてに渡るなら必ず表紙を付ける
・目次を付ける
・読んで理解できることが大事
・裏付けを明確に(企画書が上に回ったときには、必ず反対者がいるもの)
■読まれる文字数の法則
・タイトルは16文字程度で
・本文は短いほどいい
・1行は25文字程度に
・下手な装飾はしない
・フォントは1種類で十分
・用紙を横に使うのも意外と効果的
■ポイントは三つにまとめ、優先順位を明確にする
■結論を『結論』と明記する(結論でなく目標、目的でもよい)
例「結論 御社の利益150%確保をお約束します」
例「目標 御社の利益150%確保をお約束します」
例「目的 御社の利益150%確保をお約束します」
■常に「なぜ」を明示する
・相手のなぜに先回りする。
・明確な理由がないならそれを書く
■提出のタイミングを推し量る
・説明が終わるまで渡さない
・先に渡すか、渡さないか
・書類の出し方は常識で
・企画の目的・思いは企画書を渡す前に伝える
・企画書を作るスピード
・読んでいただいたらお礼をいう
相手が企画書を読んでくれたなら、まずお礼を言おう。
■誰よりも早く大量の企画を出す
・企画を次々に提示する
・大量の企画を出し続ける
・あきらめるまで商談は生きている
・読んでくれない相手こそ根負けする
・企画書を断られたなら
キラーインフォメーションを明確にひとことで伝えるべき
例「必ず御社の経費を節約いたしますので、企画書を読んでいただけませんか?」
・企画がNGだった理由は(こちらから無理に)聞かない
提案とは、常にベストでなければならない。ベストな提案を提示して通らなかったなら、
もう理由などいらない。さらに良い提案を作り上げるべき。企画書を通すための条件や
情報を知りたいなら、それは、企画がNGだったときに聞き出すのではない。
"企画を出す前"の段階で完璧に聞いておかなければならない。
■社内と社外の企画書は大きく違う
社外に出す企画書:業務効率化の提案、広告企画、新製品の提案・・・何かを提案・提示して取引をしていただくものが主。営業が中心
社内の企画書:新製品企画書、新規事業計画書、販促のアイデア・・・自分の意見を提示する書類
・相手の読みたさが違う
社内の企画書:相手が読みたがっているケースが多い。
社外に出す企画書:相手が読みたがらないケースが多い→読む気になる企画書を作成しなければならない
・時間が違う
社内の企画書:じっくりと時間をかけて検討してもらえる可能性が高い。
社外に出す企画書:パラパラめくって終わりというケースが多い。
→パラパラめくった段階で相手のベネフィットが明確になれば、もっと読みたくなるはずだ。
・ニーズが違う
社内:企画書の提示を持っている。
自分の意思で何かを企画して上司に提示したのに「忙しい」と読んでもらえないなら、
それは、会社のベネフィットしか提案していないから。
会社と上司のベネフィットを同時に見せれば、読む気になってくれる。
社外:相手は読みたがっていないことが多い。読みたくない相手に読ませることを前提にしなければならない
・ライバルに関する情報が違う
社内:多くのケースでライバルの有無がわかる。内容を検討したり、ボリューム調整ができることがある。
社外:ライバルの有無がわからない。だから全力をあげて作成せねばならない。
・読み手に関する情報が違う
社内:最終的に誰が読むかがわかる。
社外:決定権者がわからない。誰が読むか不明
社内外とも企画書の読み手が増えるほど、反対者が出てくる可能性が高まる。
■見積もりと企画は必ず同時に提出する
・見積もりがあってこそ検討できる
「ビジネスの企画は、必ずコスト込みで判断される」
「値引きは、最も簡単でわかりやすく、非常に効果的だが、最も価値のない交渉手段だ」
値引きで勝負するなら、果たして企画書に力をいれる必要があるのだろうか?
企画書に力を入れるのは、適正な利益を上げたいからである。
企画を判断する内容がコストを含めて明確になっていることが求められる。
・値引き以外を明確にする
値引きは数字なのでわかりやすく比較しやすい。
値引き以外の付加価値はなかなか伝わりにくい。そこにを明確にする。
例)以下のような見出しをつけてポイントを明確にする。
「値引き以外の当社のサービス」
「価格以外のメリットはこれだけあります」
「価格ではかないませんが○×はお任せください」
・具体的に比較のできない言葉を使わない
■会議では、手抜きは必ず伝わる。
・怖いほど検証される
・適当に企画書を通さない
大事なのは、企画を通すことではなく、ビジネスを成功させて利益を上げること
もし、疑問や質問が出たならば、その疑念をクリアするための答えを用意しなくてはならない。
自分も同じ疑いの視点を持って、客観的に打ち消せるかどうかを考える。
■会議出席者の理解度をチェックする
・企画書が上にあがった場合
企画書は、すべて作り直さねければならないことがある
理由:役員の理解度が低いケースが多い
(役員の仕事は会社の経営であり、会社全体に目線を振り分けている。
また役職が上にいくほど投資と利益に敏感になる)
必要な情報は、面倒がらずにすべて盛り込む
・「任せたよ」は最も怖い
企画書の内容が完璧でなければならない。
実際のビジネスでは企画書通りにいくことはごく稀
万が一、ダメだったときの見極めまでも書いておくべき
<例>
例えば、新製品が発売後三ヶ月あまり売れなかったとする。
しかし、あなたの戦略では、プロモーションが効いてっくるのは
半年後だったとしよう。ところが、決定権者は我慢しきれずに
「売れないならうやめろ」と言ってくるかもしれない。
そんなときこそ、「当初の企画書に書いてある通り、6ヶ月経たないと効果が表れません」
と明言できるのだ。
当初の段階から予測していたことならば、それを読んでいなかった上司は
黙ってうなずくだろう。企画書とは、そんなビジネスの指針を示す資料でもあるのだ。
■会議こそ図解が命。説明するなら文章は書かない
企画書とプレゼンのスライドを二種類作ることも検討したい。
・会議を通すにはプレゼンが有効
・スライドを印刷して渡すのは愚の骨頂
■人の企画書を使いまわすのは危険につき、注意する
・人の作った企画書で説明ができない
内容を完全に理解していれば、何の問題もない。
例:
上司は「すみません、部下に作らせましたが、つまり、○×ということです」
・修正ミスが生じる
・最良の使い回しとは
■企画書作りほど楽しい作業はない
・無理をしなければ企画書作りは楽しくなる
嘘偽りや粉飾がない企画書は一番力を持っている。自分の考えが正しく伝わる。
参考書籍:
すごい人のすごい企画書 一発で決まる!勝てる!本物の極意 戸田覚
1.内容がきちんと伝わる
自分が思い描いていることを、相手に100%伝える。
2.相手に納得してもらう
3.必要度に応じて、等身大で作る
こちらの伝えたいことが完璧に伝わる企画書を最短の時間と労力で作る。
1と2は同じような気がするが・・・
企画とは提案である
・相手のメリットを明確にする。(これを実行することでどんなメリットがあるのか?)
・顧客の立場になって具体的な数値を盛り込んでいく。
(例)新規事業の企画書
収益の予測、成功の確率、かかるコスト、スタッフ、スケジュール
・相手が求めている情報を相手自身が気づいてないときでも、それを探りだして明記した企画書は優れている。
・企画の真髄は、『提案』と『ベネフィット(利益、恩恵)』
ベネフィットが予測であるなら、予測を裏付ける情報が必要
・ベネフィットが100%伝われば、企画書としては合格(ベネフィット以外の部分が多少伝わらないのはかまわない)
・究極は相手に考えさせる企画書
真実をしっかり書いてこそ、相手は考えてくれる。下手に良いを連発すると、疑いをもたれてしまう。
・最悪な企画書は嘘やだまし
自社製品に劣っている点があることを、あえて比較表で明確にする。新規事業のプロジェクトを提案するなら、
失敗する可能性やその予測を明確にする。
・どれほど苦労しても企画書は自分で作成する。
第3者に作成させて、思い通りにできあがるケースは稀である。
・企画書の目的を明確にする
・裏づけをどう用意するか。どう収集するか
・ターゲットを明確にする
商談であれば、ターゲットは決定権者となる。商談で話している相手は、単なる窓口で、決定権者は別にいることも多い。
・目的とベネフィットを決める
・理解度を把握する
・必要な資料やビジュアルを揃える
・構成を考える
・締め切り
・コンペの有無
■情報を集めるテクニック
・情報には常にアンテナを張っておく
・政府の統計や白書を利用する
■企画書構成の黄金則
企画書に最も重要なのは『ベネフィットのある内容』
次に大事なのは『構成』
・構成の基本
説明型:説明を重ねていき、結論としてキラーインフォメーションを見せる
インパクト型:相手がうなずいてしまうキラーインフォメーションを見せる
キラーインフォメーションは具体的に提示する。(抽象的にしないようにする)
・長い企画書の構成
<例>
0.タイトル
1.企画趣旨(キラーインフォメーション)
2.根拠
3.製品情報
4.ユーザ事例
5.価格等
6.付加資料
・相手の求めているポイントを突く
・相手が望むのは基本的に利益
・自分のアイディアを明確にする
・アイデアが浮かばない場合、組み合わせなどを考える。
■問題点を見せてしまう
・問題点は思いつく限り書いておく
・比較表には自社のマイナス点も盛り込む
・欠点の理由を明確にする
■『ライバルに負ける』と思うことから始める
・ベストな企画書を提示し続ける
■表示を見た瞬間、ページをめくった瞬間が重要
・最初に見る場所をよく考える
・読んでもらえそうもない企画書こそ、タイトルが命だ。
・ベネフィットを明確にする
・人づてに渡るなら必ず表紙を付ける
・目次を付ける
・読んで理解できることが大事
・裏付けを明確に(企画書が上に回ったときには、必ず反対者がいるもの)
■読まれる文字数の法則
・タイトルは16文字程度で
・本文は短いほどいい
・1行は25文字程度に
・下手な装飾はしない
・フォントは1種類で十分
・用紙を横に使うのも意外と効果的
■ポイントは三つにまとめ、優先順位を明確にする
■結論を『結論』と明記する(結論でなく目標、目的でもよい)
例「結論 御社の利益150%確保をお約束します」
例「目標 御社の利益150%確保をお約束します」
例「目的 御社の利益150%確保をお約束します」
■常に「なぜ」を明示する
・相手のなぜに先回りする。
・明確な理由がないならそれを書く
■提出のタイミングを推し量る
・説明が終わるまで渡さない
・先に渡すか、渡さないか
・書類の出し方は常識で
・企画の目的・思いは企画書を渡す前に伝える
・企画書を作るスピード
・読んでいただいたらお礼をいう
相手が企画書を読んでくれたなら、まずお礼を言おう。
■誰よりも早く大量の企画を出す
・企画を次々に提示する
・大量の企画を出し続ける
・あきらめるまで商談は生きている
・読んでくれない相手こそ根負けする
・企画書を断られたなら
キラーインフォメーションを明確にひとことで伝えるべき
例「必ず御社の経費を節約いたしますので、企画書を読んでいただけませんか?」
・企画がNGだった理由は(こちらから無理に)聞かない
提案とは、常にベストでなければならない。ベストな提案を提示して通らなかったなら、
もう理由などいらない。さらに良い提案を作り上げるべき。企画書を通すための条件や
情報を知りたいなら、それは、企画がNGだったときに聞き出すのではない。
"企画を出す前"の段階で完璧に聞いておかなければならない。
■社内と社外の企画書は大きく違う
社外に出す企画書:業務効率化の提案、広告企画、新製品の提案・・・何かを提案・提示して取引をしていただくものが主。営業が中心
社内の企画書:新製品企画書、新規事業計画書、販促のアイデア・・・自分の意見を提示する書類
・相手の読みたさが違う
社内の企画書:相手が読みたがっているケースが多い。
社外に出す企画書:相手が読みたがらないケースが多い→読む気になる企画書を作成しなければならない
・時間が違う
社内の企画書:じっくりと時間をかけて検討してもらえる可能性が高い。
社外に出す企画書:パラパラめくって終わりというケースが多い。
→パラパラめくった段階で相手のベネフィットが明確になれば、もっと読みたくなるはずだ。
・ニーズが違う
社内:企画書の提示を持っている。
自分の意思で何かを企画して上司に提示したのに「忙しい」と読んでもらえないなら、
それは、会社のベネフィットしか提案していないから。
会社と上司のベネフィットを同時に見せれば、読む気になってくれる。
社外:相手は読みたがっていないことが多い。読みたくない相手に読ませることを前提にしなければならない
・ライバルに関する情報が違う
社内:多くのケースでライバルの有無がわかる。内容を検討したり、ボリューム調整ができることがある。
社外:ライバルの有無がわからない。だから全力をあげて作成せねばならない。
・読み手に関する情報が違う
社内:最終的に誰が読むかがわかる。
社外:決定権者がわからない。誰が読むか不明
社内外とも企画書の読み手が増えるほど、反対者が出てくる可能性が高まる。
■見積もりと企画は必ず同時に提出する
・見積もりがあってこそ検討できる
「ビジネスの企画は、必ずコスト込みで判断される」
「値引きは、最も簡単でわかりやすく、非常に効果的だが、最も価値のない交渉手段だ」
値引きで勝負するなら、果たして企画書に力をいれる必要があるのだろうか?
企画書に力を入れるのは、適正な利益を上げたいからである。
企画を判断する内容がコストを含めて明確になっていることが求められる。
・値引き以外を明確にする
値引きは数字なのでわかりやすく比較しやすい。
値引き以外の付加価値はなかなか伝わりにくい。そこにを明確にする。
例)以下のような見出しをつけてポイントを明確にする。
「値引き以外の当社のサービス」
「価格以外のメリットはこれだけあります」
「価格ではかないませんが○×はお任せください」
・具体的に比較のできない言葉を使わない
■会議では、手抜きは必ず伝わる。
・怖いほど検証される
・適当に企画書を通さない
大事なのは、企画を通すことではなく、ビジネスを成功させて利益を上げること
もし、疑問や質問が出たならば、その疑念をクリアするための答えを用意しなくてはならない。
自分も同じ疑いの視点を持って、客観的に打ち消せるかどうかを考える。
■会議出席者の理解度をチェックする
・企画書が上にあがった場合
企画書は、すべて作り直さねければならないことがある
理由:役員の理解度が低いケースが多い
(役員の仕事は会社の経営であり、会社全体に目線を振り分けている。
また役職が上にいくほど投資と利益に敏感になる)
必要な情報は、面倒がらずにすべて盛り込む
・「任せたよ」は最も怖い
企画書の内容が完璧でなければならない。
実際のビジネスでは企画書通りにいくことはごく稀
万が一、ダメだったときの見極めまでも書いておくべき
<例>
例えば、新製品が発売後三ヶ月あまり売れなかったとする。
しかし、あなたの戦略では、プロモーションが効いてっくるのは
半年後だったとしよう。ところが、決定権者は我慢しきれずに
「売れないならうやめろ」と言ってくるかもしれない。
そんなときこそ、「当初の企画書に書いてある通り、6ヶ月経たないと効果が表れません」
と明言できるのだ。
当初の段階から予測していたことならば、それを読んでいなかった上司は
黙ってうなずくだろう。企画書とは、そんなビジネスの指針を示す資料でもあるのだ。
■会議こそ図解が命。説明するなら文章は書かない
企画書とプレゼンのスライドを二種類作ることも検討したい。
・会議を通すにはプレゼンが有効
・スライドを印刷して渡すのは愚の骨頂
■人の企画書を使いまわすのは危険につき、注意する
・人の作った企画書で説明ができない
内容を完全に理解していれば、何の問題もない。
例:
上司は「すみません、部下に作らせましたが、つまり、○×ということです」
・修正ミスが生じる
・最良の使い回しとは
■企画書作りほど楽しい作業はない
・無理をしなければ企画書作りは楽しくなる
嘘偽りや粉飾がない企画書は一番力を持っている。自分の考えが正しく伝わる。
参考書籍:
すごい人のすごい企画書 一発で決まる!勝てる!本物の極意 戸田覚
2010年4月1日木曜日
アプリやろうぜにエントリーしてみた。
昨日、アプリやろうぜにエントリーしてみた。
もう少し早く対応して出すべきだったかもしれない。
(昨日、ネットゲーをやった時間がもったいなかった。)
先ほど返信があり、今日(2010年4月1日(木) 21時)までに
詳細な企画書がほしいとのこと。というわけで、
この時間まで企画書を書くための準備メモを書いているのだが
納得させる内容と根拠を示すには、ちょっと時間的に厳しいかな ・・・・・
とりあえずなんとか間に合わせようと思っている。
熊谷氏のtwitterには、
「アプリやろうぜ!byGMO」エントリー合計550件のやる気とアイデア満載の企画を頂きました。一つで も多くのアプリを世に送り出したいと思っています。真剣に検討させて頂きます。有り難うございました!
とつぶやかれていた。
もう少し早く対応して出すべきだったかもしれない。
(昨日、ネットゲーをやった時間がもったいなかった。)
先ほど返信があり、今日(2010年4月1日(木) 21時)までに
詳細な企画書がほしいとのこと。というわけで、
この時間まで企画書を書くための準備メモを書いているのだが
納得させる内容と根拠を示すには、ちょっと時間的に厳しいかな ・・・・・
とりあえずなんとか間に合わせようと思っている。
熊谷氏のtwitterには、
「アプリやろうぜ!byGMO」エントリー合計550件のやる気とアイデア満載の企画を頂きました。一つで も多くのアプリを世に送り出したいと思っています。真剣に検討させて頂きます。有り難うございました!
とつぶやかれていた。
登録:
投稿 (Atom)