koboriakira.com

あらすじ

前回同様、下のサイトでゲーム作り。インベーダーゲームが完成した。 Javaでゲーム作りますが何か? -人工知能に関する断創録

引数にthisを使うことについて

今回のプログラミング作業の中で、ひとつ明確になったことがあった。それが「this」の使い方だ。

インスタンスを作成するとき、因数にthisを使うときがあった。たとえば、

Sample.java

class Sample {int x = 1;int y = 2;public static void main(String arg[]) {Hoge hoge = new Hoge( this );}}みたいなものだ。 このときのthisは、クラスSampleを指していて、より正確には「Sampleをインスタンス化したもの」らしい。

とりあえず、thisを因数として使うことで、“x”や”y”をインスタンスhogeでも使うことができる、と考えておけば良いように感じた。

コンストラクタのthisと勘違い(?)しないように

thisを使うので、まず思い出すのが、コンストラクタ内にあるthisだ。さきほどの例を引き継いだとすると、

Hoge.java

class Hoge {Sample sample;public Hoge(Sample sample) {super();this.sample = sample;}}というコードが書かれるはずだ。

ここで使われているthisは、さっきのthis(クラスSample)を表しているのではなく、クラスHogeを指している。つまり、上で定義した変数sampleに引数を代入している、ということだ。わかりやすいように色をつけて表そう。

Javaのとっつきにくい点として、上のような文章だと「Sampleとかsampleばかりで、何を言ってるのかサッパリ」みたいなところがある。でも、オブジェクトについて理解してくると、なるほど理にかなった言語なのかもしれない。

ただ、こういった記述をすることによる利点はまだよくわからない。普通に「Sample.x」とかでも良さそうなものだが…。もう少しコードを書くなかで理解できるのかな。


あらすじ

少しJavaのことが分かってきたので、下のサイトを参考にゲーム作りにも取り組んでみた。 Javaでゲーム作りますが何か? -人工知能に関する断創録

このサイトはかなりわかりやすく、とくにインスタンス化については一応の理解はできたような気がする。ブロック崩しは作れるようになった。

またその中で、一つ目の目標であった「キーパンチによって音が鳴る仕組み」をやっと作ることができた。いわゆる 簡易MPC だ。

最終的には、シーケンスみたいなのを組むことで、「Madeon’s Adventure Machine」みたいななアプリも作れるかもしれない。自作曲の宣伝にもなるし。

サンプルコード

SoundTest.java

import java.awt.Container;import javax.swing.JFrame;public class SoundTest extends JFrame {public SoundTest() {setTitle(“簡易MPC”);MainPanel panel = new MainPanel();Container contatePane = getContentPane();contatePane.add(panel);pack();}public static void main(String[] args) {SoundTest frame = new SoundTest();frame.setDefaultCloseOperation(EXIT_ON_CLOSE);frame.setVisible(true);}}#### MainPanel.java

import java.applet.Applet;import java.applet.AudioClip;import java.awt.Dimension;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;import javax.swing.JPanel;public class MainPanel extends JPanel implements KeyListener {private static final int WIDTH = 240;private static final int HEIGHT = 240;//インスタンスの発生Sound kick = new Sound(“kick.wav”, true);Sound snare = new Sound(“snare.wav”, true);Sound hihat = new Sound(“hihat.wav”, true);public MainPanel() {setPreferredSize(new Dimension(WIDTH, HEIGHT));setSize(WIDTH, HEIGHT);this.setFocusable(true);addKeyListener(this);}@Override public void keyPressed(KeyEvent e) {int key = e.getKeyCode();switch (key) {case KeyEvent.VK_S:kick.play();break;case KeyEvent.VK_D:snare.play();break;case KeyEvent.VK_L:hihat.play();break;default:break;}}@Override public void keyTyped(KeyEvent e) {}@Override public void keyReleased(KeyEvent e) {int key = e.getKeyCode();switch (key) {case KeyEvent.VK_S:kick.stop();break;case KeyEvent.VK_D:snare.stop();break;case KeyEvent.VK_L:hihat.stop();break;default:break;}}}#### Sound.java

import java.applet.Applet;import java.applet.AudioClip;public class Sound {private String filename;private boolean attempt;private AudioClip audioClip;public Sound (String filename, boolean attempt) {this.filename = filename;this.attempt = attempt;audioClip = Applet.newAudioClip(getClass().getResource(filename));}public void play() {if (attempt) {audioClip.play();attempt = false;}}public void stop() {audioClip.stop();attempt = true;}}## 工夫したこと

「キーを押している間は音が鳴り、キーを話すと止まる」ようにすること。そして、「キーを押して音が鳴るのは1度(押していると、連続的にタイプしてると判断される?)」となるようにするのに苦労した。

自分の解答は、booleanをつくって処理するようにした。Soundクラスのplayメソッドとstopメソッドがそれ。


はじめに

ボタンを押したら、テキストが変わるプログラム。こちらからの操作に対して反応してくれる初めてのサンプル。

これを応用すれば、ボタンを押すと音が鳴ったりするプログラムが作れるわけか。ちょっと楽しくなってきた。

サンプルコード

import javax.swing.;import java.awt.;import java.awt.event.*;public class Sample extends JApplet {private JButton bt;private JLabel lb;public void init() {bt = new JButton(“購入”);lb = new JLabel(“いらっしゃいませ”);add(bt, BorderLayout.NORTH);add(lb, BorderLayout.SOUTH);bt.addActionListener(new SampleActionListener());}class SampleActionListener implements ActionListener {public void actionPerformed(ActionEvent e) {lb.setText(“ご購入ありがとうございます。”);}}}

分かったこと

  • イベント、ソース(イベントソース)、リスナ

[…]ユーザーの操作を、イベント(event)という概念で扱うことになっています。[…]
イベントの発生元となるコンポーネントは、イベントソース(event source)、またはソース(source)と呼ばれています。[…]
発生したイベントは、リスナ(listener)と呼ばれる部分で処理することになります。
(『やさしいJava活用編(第4版)』、ソフトバンククリエイティブ、2013年、40-41頁。)

  • ActionListenerインターフェイス

  • addActionListener()メソッドで、アクションリスナーを追加することができ、actionPerformed()メソッドで、アクションが発生したときの処理を始めることができる。addActionListener()メソッドは、ボタン以外でも使えるものがある。

  • リスナは、インターフェイスとメソッドの両方が無いといけないんだろうな。

疑問点

  • 「actionPerformed(ActionEvent e)」の「ActionEvent e」は、とりあえず書いておけばいいのかな。

あらすじ

Swingが楽しくて、『やさしいJava活用編(第4版)』を3分の1ほど進めることができた。やった。

ということで、メールフォームとかに必要な部品(ラジオボタンとか)が作れることはわかったのだが、肝心のコードの意味はわからないままだ。

クラスとかオブジェクトとかインスタンスとかコンストラクタとか

結局のところ、クラスとかオブジェクトとかインスタンスとかコンストラクタとかが分からないのだ。 ということで、dot installの「JAVA入門」を見てみる。すると、なんとなくイメージは掴めてきた。誤りがあることを承知で書けば、

  • クラス:設計図らしい。あるインスタンスたちが持つ特徴をまとめて書いておくようなものか。

  • インスタンス:クラスをもとに作られた個別具体的なもの。

  • オブジェクト:「インスタンス」の抽象化されたような言い方か?

  • コンストラクタ:上2つとは全く異なる種類の用語。単純にインスタンス化したときに呼ばれる初期処理のこと。

という感じだろうか。オブジェクトがかなりあやふやだ(苦笑)。

クラスだからといって「new Hoge();」しないものもある

という感じで理解したのだが、少し進めているうちに、次なる関門にぶつかった。 それは、APIを利用する際に思った。たとえばCalendarを使いたいとき、

public class Sample {public static void main(String arg[]) {Calendar cal = Calendar.getInstance();System.out.println(cal.get(Calendar.DATE));}}と書くのだが、Calendarクラスを利用するのだから、

Calendar cal = new Calendar();cal = Calendar.getInstance();のように、「インスタンス化しないといけないのでは?」と思ったのだ。調べてみると解答が出た。

abstractはクラス・メソッド宣言時に付与し、クラス・メソッドを抽象クラス(abstractクラス)・抽象メソッド(abstractメソッド)として宣言します。
抽象クラスはそのクラス自身のオブジェクトを生成することはできません。
通常抽象クラスは実装のないいくつかの抽象メソッドを持っています。抽象クラスをサブクラスで継承し、そのサブクラス内で抽象クラスで実装されていない抽象メソッドを実装(オーバーライド)しオブジェクトを生成する形をとります。
Javaの道:クラス(13.abstract)

ということで、Calendarは抽象クラスなのだ。つまり、Calendarを継承したサブクラスがあるということだろうか(それが何かわからない)。

ただ、このことは理解できても、実感としてはいまいちピンときていない。少し考えてみよう。

クラス型変数calは宣言されただけで、オブジェクトは作られていない。オブジェクトじゃないということは、つまり変数calは、私が値を入れたりして新しく作り出すものではない。

変数calは宣言されただけで、そこにはCalendarクラスのgetInstanceメソッドを使って作られた値が代入される。

わかりづらいが、これを一応の結論としておくかー。 みたいに進めていたら、dot installの講習は全て終わってしまった。うーん、この後が本当によくわからないんだよな…。

プログラムの順番がだんだん分かってきた

このノートを書きながら、だんだんと分かってきたことだが、処理の順番として、まずmainメソッドですぐあとに使うクラスやメソッドを宣言し、あとは数珠つなぎ的にクラスやメソッドが繋がっているのだろう。

そういったことが掴めてきたので、ためしにコードを書いてみた。今日から1週間の日付と曜日を表すコードだ。

Sample.java

import java.util.Calendar;public class Sample {public static void main(String arg[]) {SampleCalendar sc = new SampleCalendar();sc.testCalendar();}}#### SampleCalendar.java

import java.util.Calendar;public class SampleCalendar {public void testCalendar() {Calendar cal;cal = Calendar.getInstance();for (int i = 0; i < 7; i++) {dispCalendar(cal);addCalendar(cal);}}public static void dispCalendar(Calendar cal) {String[] day = {“日”, “月”, “火”, “水”, “木”, “金”, “土”};int date = cal.get(Calendar.DATE);int daynum = cal.get(Calendar.DAY_OF_WEEK);System.out.println(date + “日は” + day[daynum-1] + “曜日。”);}public static Calendar addCalendar(Calendar cal) {cal.add(Calendar.DAY_OF_WEEK, 1);return cal;}}なんか「それっぽい」コードになってきたぞ。ITを知らない人になら「エンジニアです」と名乗れるようなコードかもしれない(笑)。ブレークスルーなるか。


マツコと2人のオバサン

時刻は22時。 平和島の商店街を歩くマツコ。そこに、どうやら一杯ひっかけて機嫌の良いオバサン(マツコ曰く「おかあさん」、「ババァ」)2人が絡んできました。

以下、自分の記憶のためにもメモっておきます。

オバサンA「マツコ…さん、握手してください…!」 マツコ「お母さんたち、テレビ映ってもいい? (ずっと握手するので、)映りすぎよお母さん。
お母さんたち、結構映ったよいま」 オバサンA「なんのテレビこれ?」 マツコ「これは誰も見てないの! 夜の、真夜中から始まる番組よ。真夜中見てる?」
オバサンB「見てるよ! (近くの居酒屋を見つけて)行こう行こう!」 マツコ「え!? オススメ? 知らないでしょ本当は」
(店に入るかどうか悩んでるマツコ。その後ろで、オバサンたちが店に入ろうとする) マツコ「雨も降ってきたし、入る? ん? お母さんたちレギュラー?(笑)
お母さんたち演者さんになっちゃってるよ」 オバサンA,B「さっき飲んできたのよ…(音声拾えず)」
マツコ「お母さんたち、あのねー、出ることには問題ないんだけど、何言ってるのかわかんないんだよね(笑) お母さんたち、一緒に行くの!?」 (取材交渉中)
マツコ「お母さんたちは、いいから入りなよ。(オバサンたちを店に入れたあとで、スタッフに)あの人たちの家族とかはどうなってんのかな。こんな時間にいい感じになってる…」
マツコ「お母さんたちが交渉してる!?」 オバサンB「(店員に)マツコと喋りなさいよ」 マツコ「(スタッフに)お前より頼りになるな(笑)」

という感じです。この雰囲気は動画じゃないと伝わらないかもしれませんが、なんとなく想像できますでしょうか。コボリはこれを見てジーンとしてしまいました(笑)。

実際は、 もう1組のオバサンたちがカメラを覗きこむ場面もジーンと来る んですが(笑)、えー、話を戻しましょう。

『夜の町を徘徊する』がこれほど素晴らしいとは.

『夜の町を徘徊する』 は、今月放送が開始された、マツコ・デラックスによる「町ブラ」の番組です。あてもなく歩き回るところが番組の特徴です。

__夜の巷を徘徊する|テレビ朝日


さて、さきほどのシーンの続きですが、マツコはオバサンたちに促されるまま、その場に居合わせたサラリーマンたちと合流して飲み始めます。

マツコに山崎のハイボールまで奢ってもらって上機嫌のまま過ごすオバサンたち(すこし引くサラリーマンが本当に印象的)。そして、何杯か飲んでからマツコはオバサンたちを残して店を出ます。

個人的にものすごいジーンと来た場面なので、これも書き残しておきましょう。マツコが店を出る前です。

オバサンB「あの…テレビ見てますから」 マツコ「そこに戻るの、お母さん?」 オバサンA「もう幸せねえ…! もう、マツコに会ったんだから」

これらのシーンは、多分2015年を振り返るときでもまだ新鮮であり続ける予感がします。番組の開始前は「 マツコもついに町ブラかよ〜 」なんて思っていた自分が、ものすごい衝撃と感動を受けて一瞬泣きそうになったぐらいです(苦笑)。

“受け入れる”マツコ

このシーンを観ていて自分が考えたのがひとつあります。それは、マツコがオバサン2人の側に立って話をしていたことです。言い換えれば、マツコの “受け入れる” 姿勢に、あらためてビックリしました。

マツコの性質がら、「マイノリティ・弱者の味方に立つ」というような言い方もできないこともないのですが、それよりも「共感性」という言葉のほうが適切でしょうか。。

『夜の町を徘徊する』のマツコは、2人のオバサンに共感しながら、ときに笑いどころもつくっています(共感といっても同化している訳ではないんです。家の玄関口まで入ってきて会話するぐらい。わかりづらいか・笑)。

この映像を見た視聴者は、空間的・精神的に遠い地平にいるオバサンたちにさまざまな感情を感じつつも、 どこかマツコとオバサンと同じような立ち位置にもいた のではないかと思います。

「タップおばさん」はどうだったのか

この放送を見て、パッと思い出した番組のあるシーンがあります。それは、同じ町ブラ番組としてもはや大人気となっている 『モヤモヤさまぁ〜ず』 の名シーン、

「タップおばさん」 です。

---舞台は月島の商店街。あるネコについて、おばあさんから話を聞くさまぁ〜ず。しかし、だんだんとおばあさんのトークはヒートアップして、いわゆる「面倒」な雰囲気になってきます。 以降、他のブログを引用させていただきますが、

本来の目的であるネコのことなど忘れてしまって、老婆のマシンガントークから逃れるためにその現場から帰ろうとしたら、老婆がなぜか追いかけてきて「タップができる」と衝撃の発言。
そしてカメラの前でタップ?を踊り出す。昔テレビでやっていたタップを見よう見まねで覚えたという。
87歳とは思えない動き、タップ?(いや、あれはタップです!)。タップを踊る老婆にさまぁ~ずも興奮ぎみで、終いには三村さんも一緒にタップ?を踊り出す始末。
ハイテンションでタップを踊る老婆に「もう1回見せて」とリクエストするさまぁ~ず。2回のリクエストに応えてタップを踊る老婆。更に踊り続ける老婆のハイテンションっぷりに心配したのか、「血圧上がるから」とドクターストップをかける友達のおじさん。
正に『伝説のタップ』でした。 __[伝説のタップ @ モヤモヤさまぁ~ず2 - アメーバブログ](http://ameblo.jp/banp-
nank/entry-10793267432.html)

このときのさまぁ〜ずと自分の立ち位置は、「 こんな人いるのかよ! おもしれー! 」だったと思います。

言い換えれば、タップおばさんを外側から観察し、その面白さを観ていました。

“笑う”しかない芸人

この『モヤさま』のさまぁ〜ずは、タップおばさんを“笑う”ことで番組を成立させています。

たとえば、ひとつ距離を置いて泳がせてみたり。無理矢理同化して、もっとヒートアップさせてみたり。スベり芸を扱うかのように「了解で〜す」みたいにしてみたり。

この場合の視聴者は、タップおばさんの共感するというよりかは、タップおばさんの愛らしさに魅了されて好きになるような感覚だったことでしょう。

---こうして考えてみると、芸人はやはり芸人。変人やクセのある素人に対して、方法はいろいろあれど、そのゴールは“笑う”なのかもしれません。 その一方で、素人をありのままに“受け入れる”タレントはマツコぐらいなのではないか。そのあたりが、マツコの人気ぶりや、人気を支える魅力になっているのではないか、と感じました。

※本エントリの誤解されやすいところだと思いますが、決して「笑う」姿勢は悪かった、反省しようという訳ではありません。普通であれば、というかテレビであれば、変人は「見世物」として扱われるのが普通でしょう。

※本エントリと微妙に関係することですが、松本人志の「働くおっさん劇場」は、なんというか“笑う”と“受け入れる”が入り混じった番組だったかもしれませんね。というか、そこが松本人志の独特な感じなのかも。

すべての素人は私である。マツコという「新宿」

最後に。『夜の町を徘徊する』を見てなぜか泣きそうになったことは上述しましたが、このエントリを書きながらその理由もなんとなく思い当たるところが出てきました。

それは、オバサンを受け入れるマツコを見ながら、自身もマツコ(あるいは誰か)に受け入れられているシーンを想像していたのではないか。ということです。

マツコと話すオバサン2人は、なんというか、 自分とは全く異なる人間であるのにも関わらず、どこか自分のように思えました。 アホみたいな結論ですが、

『夜の町を徘徊する』に出てくる素人は、すべて自分なのかもしれません。 ---あと、もうひとつだけ。“受け入れる”ことについて、マツコ自身もコメントしている場面がありました。

VTR後、番組がスタジオトークに移ると、マツコは「新宿は一生カオスです。あんな混沌とした街はない」と断言。さらに、新宿を知ると他の町が物足りないとこぼし、その魅力について「拒まれないのよ、あの町は。すべての人間を受け入れてくれる」と指摘している。
マツコが語る新宿の魅力 他の街ではもう物足りない? - ライブドアニュース
http://news.livedoor.com/article/detail/9770161/

「拒まれないのよ、あの町は。すべての人間を受け入れてくれる」とは、新宿のことであり、マツコ自身かもしれません。


4月20日、『しくじり先生』がゴールデンタイムに進出しました。ゴールデン進出前の 「お任せください!」 と、

__杉村太蔵の「うるせぇ」がいまだに脳裏から離れません。

番組でもネタとして取り上げていたように、『しくじり先生』がゴールデンに上がることについては、ネットでも「内容が丸くなる」、「もっと深夜でやってほしかった」、「視聴者層が違う」、「オワタ」と言われていたようです。

かくいう私も、似たような感想を持っていたことは否定できません。しかし、実際の放送を見たあとは、「ゴールデン進出は良いチョイスだったんじゃないか。むしろゴールデンで放送すべきなのかも 」と思っています。

『しくじり先生』は「21世紀型の哲学番組」

そもそも、『しくじり先生』は失敗談をストックする番組

まず、『しくじり先生』は、下のようなコンセプトをもとに放送されています。

「人生を盛大にしくじった人から「しくじりの回避法」を学ぼう!」をコンセプトに、「しくじり先生」が自らと同じ失敗を犯す人たちが増えないよう、番組オリジナルの教科書を使いながら授業を行う番組。
__しくじり先生 俺みたいになるな!! –
Wikipedia

つまり、「失敗談のストックを増やす」と言いますか、「 失敗パターンを知ることで、いつか訪れるその時に備えよう 」というのが、番組本来のコンセプトかと思います。

もう少しライトに観るなら、「こんなヤツいるのか!」とか「悲惨だなあ」みたいな見方もあるでしょう。あるいは、オリラジ中田の語るように「観た後にホッとする。“しくじってもいいんだ”と安心できる」という見方もOKです。

「私的な問題」がコネクトされると、『しくじり先生』は哲学になる

そんな中で私は、『しくじり先生』の視聴の仕方がもうひとつあることに、やっと気づきました。そがゴールデンタイムで成功する理由になるかもしれない、と思ったのですが…。

それは、 放送内容を補助線に「私的な問題」を考える 、ということです。「先生」の話す内容を客観的に聞いてオシマイ、ではなく、自分が抱える“闇”のようなものと対峙するためのツールとする。

ただハウツーをインストールして終わるのではない。ハウツーなぞ覚えなくていいから、自分はどのように生きるべきなのか。

カタいような事柄ですが、それを最大限やわらかく始めることができるのが、『しくじり先生』の魅力だと感じました(主にDaiGoの回を見ながら・笑)。

哲学者は大統領でもローマ法王でもなく、論説委員でも批評家でもないのですから、「二一世紀の人類」や「民族の将来」を憂える必要はない。「現代の混沌とした価値観」について悩む必要はないのです。そうではなく、与えられた「今ここ」に立脚して自分の「私的な問題」から眼を逸らさず、ごまかさずにそれと格闘すること、それがすべてです。
(中島義道『人生を「半分」降りる―哲学的生き方のすすめ』、ちくま文庫、2008年、189頁)

「無理矢理明るく終わらせない」ことが『しくじり先生』のアキレス腱

というわけで。もちろんバラエティ番組なので、番組の中に「笑い」が無くなるのは当然問題ですが(笑)、『しくじり先生』はその中にヌルッと「哲学するチャンス」みたいなのが滑りこんでくる、面白い番組なのではないか、と思いました。

そこで、ひとつ気になるのは、各先生の終わらせ方です。タレント自身のイメージもあるので仕方ないですが、「昔しくじったけれど、今は〜に気付いて、幸せになりました 」的な感じばかりだと、ちょっとまあ、フェイク臭さが漂ってきますよね(笑)。

まだ放送が始まったばかりなので断定的なことは言えません。しかし、このようなことを考えながら、『しくじり先生』がゴールデンタイムに進出した意義のようなものがちょっと分かった気がします。

『しくじり先生』は、単なる「見世物小屋」じゃなかったんだ。