イナヅマTVログ

2011.07.13
16:41
author: taikiken
1件のコメント

Safariでファイルをダウンロード

Safariでファイルをダウンロードするの巻

【ダウンロード・ウインドウ】
1.ダウンロードファイルのURLをコピーする
command+c

2.ダウンロード・ウインドウを開く
command+option+l

3.ダウンロード・ウインドウにペースト
command+v

【Web インスペクタ】
*環境設定->詳細 「メニューバーに”開発”メニューを表示」にチェック
1.Web インスペクタを開く
command+option+i

2.リソース
ダウンロードファイル選択->ファイルを保存したいフォルダへドラッグ&ドロップ

update
Safari 6になったら【ダウンロード・ウインドウ】がなくなっちゃいました。

「Web インスペクタ」を使うしかありません。
上記の方法だとファイル名が別の名前に変わってしまいます。

リソースでファイル名をダブルクリックするとSafariでファイルを開くので[保存(command + s)]でファイルを保存できます。
これならファイル名を維持したまま保存可能です。

2011.07.12
00:23
author: taikiken
0件のコメント

AIR for iOS, 加速度センサー Accelerometerインスタンスはローカル変数にしちゃダメ

AIR for iOS で加速度センサーを作ろうとしてハマった時のメモ。

加速度センサー作成はflash.sensors.Accelerometerで作成可能です。
マニュアルによれば以下のコードで実現可能です。
http://help.adobe.com/ja_JP/FlashPlatform/reference/actionscript/3/flash/sensors/Accelerometer.html

var acc1:Accelerometer = new Accelerometer();
acc1.addEventListener(AccelerometerEvent.UPDATE, updateHandler);
function updateHandler(evt:AccelerometerEvent):void {
    trace(evt);
}

とても単純なコードのはずなのにupdateHandlerがプロジェクトによって反応したり反応しなかったりで違いが分からずかなりハマってしまいました。

よくよく見るとAccelerometerインスタンスをローカル変数としているプロジェクトのイベントハンドラが反応していないことが分かりました。

Accelerometerインスタンスはprivateでも構わないのでクラス変数にしないといけないようです。

なんでなんだろう?

【環境】Flash Builder 4.5 + Flex SDK 4.5.1 + AIR 2.7

2011.07.11
11:43
author: taikiken
0件のコメント

福岡ひよこの会 (第1回) レポート「イベントと仲良く付き合いたい」

2011-07-02 に開催された福岡ひよこの会「イベントと仲良く付き合いたい」で発表した資料を公開します。

Robert Penner氏のSignalsを使うとEvent処理が楽になるよ、という趣旨のことを話しました。

【サンプルファイル】
2011-07-02 福岡ひよこの会「Signalsで Event処理を簡単に」.fla, .as

2011.06.28
16:51
author: taikiken
0件のコメント

AIR for iOS, 画面の向きの変更を検出

AIR for iOS で Objective-C の shouldAutorotateToInterfaceOrientation をどう検知する。

簡単なスクリプトで試してみました。

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
			   xmlns:s="library://ns.adobe.com/flex/spark"
			   applicationComplete="didLaunch();">
	<fx:Declarations>
		<!-- Place non-visual elements (e.g., services, value objects) here -->
	</fx:Declarations>
	<fx:Script>
		<![CDATA[
			import mx.core.UIComponent;
			private var _bg:Shape;
			private var _circle:Shape;
			private function didLaunch():void
			{
				addEventListener(Event.RESIZE, onResize);
				this.stage.addEventListener(StageOrientationEvent.ORIENTATION_CHANGE, onResize);
				this.stage.addEventListener(StageOrientationEvent.ORIENTATION_CHANGING, onResize);
			}
			private function onResize(e:Event):void
			{
				trace(e, stage.stageWidth, stage.stageHeight);
			}
		]]>
	</fx:Script>
</s:Application>

イベントの通知順序は以下のとおり

[Event type="resize" bubbles=false cancelable=false eventPhase=2] 640 960
[StageOrientationEvent type="orientationChanging" bubbles=false cancelable=true beforeOrientation="default" afterOrientation="rotatedRight"] 640 960
[StageOrientationEvent type="orientationChange" bubbles=false cancelable=false beforeOrientation="default" afterOrientation="rotatedRight"] 960 640
  1. Event.RESIZE
  2. StageOrientationEvent.ORIENTATION_CHANGING
  3. StageOrientationEvent.ORIENTATION_CHANGE

StageOrientationEvent.ORIENTATION_CHANGE が最後に通知されました。

向き変更後のステージ幅・高さ(stage.stageWidth, stage.stageHeight)は最後の StageOrientationEvent.ORIENTATION_CHANGE でないと取得することができませんでした。

StageOrientationEvent.ORIENTATION_CHANGING は今まさに向きを変えようとしているときのイベントなので理解できます。

Event.RESIZEStageOrientationEvent.ORIENTATION_CHANGING よりも先に通知されるので、まだ向きを変えた状態にはなってないということなんでしょう。

向きの変更検知はStageOrientationEvent.ORIENTATION_CHANGE

向きの検知後に再配置スクリプトを書きたいときは StageOrientationEvent.ORIENTATION_CHANGE を使うのが吉なようです。

StageOrientationEventstageaddEventListener しないといけません。
名称に “Stage” って入っているからなんでしょう。

iPhone 4 simulator で試してます。

-app.xmlはこんな感じ。

	<initialWindow>
	<autoOrients>true</autoOrients>
        <fullScreen>true</fullScreen>
        <visible>true</visible>
        <softKeyboardBehavior>none</softKeyboardBehavior>
    </initialWindow>
 
    <iPhone>
        <InfoAdditions><![CDATA[
			<key>UIDeviceFamily</key>
			<array>
				<string>1</string>
				<string>2</string>
			</array>
		]]></InfoAdditions>
        <requestedDisplayResolution>high</requestedDisplayResolution>
    </iPhone>

2011.06.24
18:10
author: taikiken
2件のコメント

AIR for iOS の ActionScript Mobile Project はステージサイズがおかしい、と思ったのはまちがいでした

Flash Builder 4.5.1, Flex 4.5.1 + AIR 2.7 でのお話。
*Flex 4.5.1 SDK に AIR 2.7 を別途ダウンロードし上書きしています。

4.5.1 アップデートでコマンドラインを使わなくてもGUIで AIR for iOS のデバックとリリースビルドの制作ができるようになったので早速ためしに使いはじめたけど、さっそく地雷を踏んでしまいました。

ActionScript Mobile Project だとステージサイズがおかしい

ActionScript Mobile Projectで作成するとstageサイズがどうも取得できないみたい。
550 x 370 としか取得できない。
(0, 0)ポイントにShapeを置いても位置が変だし、座標系もおかしくなっている様子。
あれま!
今日試してみたら座標は正常だった???

iPhone3GS simulate

iPhone3GS simulate

iPhone4 simulate

iPhone4 simulate

ステージサイズが550 x 370なのでこんなになっちゃいます。

試したコードはこちら。

package
{
	import flash.display.Shape;
	import flash.display.Sprite;
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;
 
	public class AIR27TestStageSize extends Sprite
	{
		public function AIR27TestStageSize()
		{
			super();
 
			// support autoOrients
			stage.align = StageAlign.TOP_LEFT;
			stage.scaleMode = StageScaleMode.NO_SCALE;
 
			init();
		}
 
		private function init():void
		{
			var bg:Shape = new Shape();
			bg.graphics.clear();
			bg.graphics.beginFill(0xffff00);
			bg.graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight);
			bg.graphics.endFill();
 
			addChild(bg);
 
			var circle:Shape = new Shape();
			circle.graphics.clear();
			circle.graphics.beginFill(0x333333);
			circle.graphics.drawCircle(stage.stageWidth * 0.5, stage.stageHeight * 0.5, 16);
			circle.graphics.endFill();
 
			addChild(circle);
 
			trace(stage.stageWidth, stage.stageHeight);
		}
	}
}

でもこれって誰でも同じようになるなら世界中で大問題になりそうだけどhttp://bugs.adobe.com/jira/にもないし、なんか設定しくじってんだろうなぁ。
お初なのでコチラが間違っているとかあるかもかもかもです。

Flex Mobile Projectだとステージサイズは正確

原因が分かるまではFlex Mobile Projectで作成することにします。

update 2011-08-17
コメントいただいた393さんのご指摘により解決することができました。
http://memo.393.bz/archives/1585

stage.displayState = StageDisplayState.FULL_SCREEN_INTERACTIVE;

stage.displayStateStageDisplayState.FULL_SCREEN_INTERACTIVEを設定すると正しいstageサイズを取得できました。

Adobe : フルスクリーンウィンドウの表示

stage.displayState = StageDisplayState.FULL_SCREEN;

StageDisplayState.FULL_SCREENでもstageサイズは取得できるけど「このモードでは、キーボード操作は無効になります」なのでまずいんだろな。

2011.06.22
17:51
author: taikiken
0件のコメント

Flash Builder 4.5 for PHPは”AIR for Apple iOS Support”を自動インストールしません

Flash Builder 4.5.1とFlex 4.5.1アップデートがリリースされ、これでいよいよiOSアプリの開発が作れると喜んでたら…

デバイスでテストしようとすると”AIR for Apple iOS Support”が無いよって怒られる。

Adobeのサイトに記事があった。
Error when you run, debug, or deploy applications on an Apple iOS device | Flash Builder 4.5

Note: For Flash Builder PHP version, you cannot install AIR for Apple iOS Support by rerunning the Flash Builder installer. It’s necessary to install the components manually.

持ってるFlash Builderが今回から登場した for PHP だったのが災いした。
手動でSDKからファイルをコピーしないといけないそうな。
Adobeのアップデータに表示されてなかった訳が分かった。

AIR SDKをダウンロード。
www.adobe.com/products/air/sdk/
(現在のAIR SDKは2.7)

[Adobe AIR SDK]
AdobeAIRSDK/lib/aot フォルダ内に以下のフォルダがあります。

/lib/aot/lib/gcc
/lib/aot/bin/as
/lib/aot/bin/strip

それを Adobe Flash Builder 4.5 内の sdks/4.5.1 の同一階層に上書きコピーですって。

Flash Builder 4.5 for PHP は英語版しか無いし、高い金出したのにしくじった気がし始めた。

あと、locale が en_US だったので ja_JP に変えておいた。
localeの場所は
Properties > Actionscript Compiler にあります。

それにしても。Adobe ひどすぎ!

Flash Builder for PHP だとアップデート通知にFlash Builderだと表示されるAIR for Apple iOS Supportが表示されない。

2011.06.20
19:04
author: taikiken
ActionScript, Matrix3Dのお勉強 – 2「Matrix3Dを使って2D回転」 はコメントを受け付けていません

ActionScript, Matrix3Dのお勉強 – 2「Matrix3Dを使って2D回転」

2D回転なら DisplayObjcect.rotate を使えば簡単に実行できます。

わざわざ Matrix3D を使うのは、任意の点を中心に2D回転させたいという野望(ちょっと大げさ願望位かな)があるからです。

DisplayObjcect.rotate では基準点を中心に回転します。
任意の点を中心にするには rotate プロパティを使わずに Matrix をゴニョゴニョゴニョしないといけません。
これってかなり面倒くさそう。

Matrix3D では appendRotation という関数が使用でき第三引数で回転の中心が設定できます。

Matrix3D.appendRotation

public function appendRotation(degrees:Number, axis:Vector3D, pivotPoint:Vector3D = null):void

パラメーター

degrees:Number — 回転の角度です。

axis:Vector3D — 回転の軸または方向です。通常の軸は、X_AXIS(Vector3D(1,0,0))、Y_AXIS(Vector3D(0,1,0))および Z_AXIS(Vector3D(0,0,1))です。

pivotPoint:Vector3D (default = null) — オブジェクトの回転の中心を決定するポイントです。オブジェクトのデフォルトの回転軸は基準点です。

pivotPoint:Vector3D のデフォルトは null でこの場合は基準点を中心に回転します。

2D回転させるためには Vector3D.Z_AXIS を使います。

Demo : Rotate any point
クリックしたポイントが中心点になります。
回転する対象と中心点の距離はクリックした時点のものになります。
そのため回転対象が画面外に消えてしまうことがあります、その時は慌てず(?)対象が近くにきたところでクリックしてあげるとその内画面内に戻ってきます。
作り込みが甘いのはお許しください。

import flash.display.MovieClip;
import flash.display.Shape;
import flash.display.Sprite;
import flash.geom.Matrix3D;
import flash.geom.Vector3D;
import flash.events.Event;
import flash.events.MouseEvent;
 
// ステージの真ん中
var stageCenterX:Number = stage.stageWidth * .5;
var stageCenterY:Number = stage.stageHeight * .5;
 
// 回転対象
var target:Sprite = new Sprite();
target.graphics.clear();
target.graphics.beginFill(0xffcc00);
target.graphics.drawRect(0, 0, 80, 40);
target.graphics.endFill();
 
target.x = stageCenterX;
target.y = stageCenterY;
target.z = 1;
 
// 基準点用のマーク
var ellipse:Shape = new Shape();
ellipse.graphics.clear();
ellipse.graphics.beginFill(0xff0000);
ellipse.graphics.drawEllipse(3,3,8,8);
ellipse.graphics.endFill();
 
target.addChild(ellipse);
addChild(target);
 
var matrix3d:Matrix3D = target.transform.matrix3D;
 
// 中心転用のマーク
var circle:Shape = new Shape();
circle.graphics.clear();
circle.graphics.beginFill(0x000000);
circle.graphics.drawCircle(0, 0, 6);
circle.graphics.endFill();
 
circle.x = stageCenterX;
circle.y = stageCenterY;
 
addChild(circle);
 
// 中心点と回転対象の間のライン
var line:Shape = new Shape();
addChild(line);
 
// ループ
addEventListener(Event.EXIT_FRAME, onLoop);
function onLoop (e:Event):void {
	matrix3d.appendRotation(7, Vector3D.Z_AXIS, new Vector3D(circle.x, circle.y,0,0));
	line.graphics.clear();
	line.graphics.lineStyle(0.5, 0xff6633);
	line.graphics.moveTo(circle.x, circle.y);
	line.graphics.lineTo(target.x, target.y);
}	
 
// Clickで中心点が移動
stage.addEventListener(MouseEvent.CLICK, onStageClicked);
function onStageClicked (e:MouseEvent):void {
	circle.x = e.stageX;
	circle.y = e.stageY;
}

targetz 値を設定することで Matrix3D を有効化しています。
targetMatrix3D 参照を変数 matrix3d へ。
matrix3d.appendRotation を使うことで回転させています。

Matrix3D は Flash Player 10, AIR 1.5 から。

今回はココまで。
もうちょっとブラッシュアップしたいことがあれやこれや..

2011.06.20
17:40
author: taikiken
0件のコメント

ActionScript, Matrix3Dのお勉強 – 1「transform.matrix3Dをnull以外へ」

DisplayObjectMatirx3D を有効化する

DisplayObjectMatirx3D 初期値は null でした。

var target:Sprite = new Sprite();
trace(target.transform.matrix3D);
// null

Matirx3Dnull 以外にするために z 値を設定しました。

var target:Sprite = new Sprite();
target.z = 1;
trace(target.transform.matrix3D);
// [object Matrix3D]

ヘルプには次のように書かれています。

Transform.matrix
http://help.adobe.com/ja_JP/FlashPlatform/reference/actionscript/3/flash/geom/Transform.html#matrix

matrix プロパティが null 以外の値に設定されていると、matrix3D プロパティは null になります。また、matrix3D プロパティが null 以外の値に設定されていると、matrix プロパティは null になります。

Transform.matrix3D
http://help.adobe.com/ja_JP/FlashPlatform/reference/actionscript/3/flash/geom/Transform.html#matrix3D

matrix プロパティが null 以外の値に設定されていると、matrix3D プロパティは null になります。また、matrix3D プロパティが null 以外の値に設定されていると、matrix プロパティは null になります。

全く同じ文章です。

matrixが有効だとmatrix3Dが使えず、matrix3Dが有効だとmatrixが使えない、ってことなのでしょう。

z 値を設定することで matrix3D が有効化され自動的に matrixnull になる、と思われます。

DisplayObject の初期値では matrix が設定されているので matrix3Dnull だと考えられます。

2011.06.15
10:26
author: taikiken
0件のコメント

Adobe AIR 2.7 関連リンク・メモ

Download Adobe Flex 4.5 SDK
http://www.adobe.com/cfusion/entitlement/index.cfm?e=flexsdk

Download Adobe AIR SDK
http://www.adobe.com/products/air/sdk/

How to Overlay the AIR SDK for Use With the Flex SDK
http://kb2.adobe.com/cps/495/cpsid_49532.html

Adobe AIR
http://get.adobe.com/jp/air/

【Document】

AIR 2.7 Runtimes and SDK are now available
http://blogs.adobe.com/flashruntimereleases/2011/06/14/air-2-7-runtimes-and-sdk-are-now-available/

Adobe AIR 2.7 Developer Release Notes
http://kb2.adobe.com/cps/906/cpsid_90612.html

Adobe AIR and Adobe Flash Player Team Blog /
June 14, 2011
Adobe AIR 2.7 Now Available:iOS apps 4x Faster!
http://blogs.adobe.com/flashplayer/2011/06/adobe-air-2-7-now-available-ios-apps-4x-faster.html

Adobe AIR 2.7: Built for Speed
http://www.paultrani.com/blog/index.php/2011/06/adobe-air-2-7-for-ios-built-for-speed/

akihiro kamijo
Adobe AIR 2.7 公開
http://cuaoar.jp/2011/06/adobe-air-27-1.html

akihiro kamijo氏のブログによればiOSに関してはコマンドラインでコンパイルしなければいけないとのこと。

adt -package -target ipa-test-interpreter -storetype pkcs12 
-keystore  <mycert.p12> -provisioning-profile <my.mobileprovision>
<my.ipa> <myapplication.xml> <my.swf>  <myassets>

ツール(Flash Builder…)を使った開発はサポート外、自己責任。

Flash Builder 4.5 でSDKを上書きしたのにモバイル選択肢にiOSがないはず。
早くアップデートが出て正式サポートしてくれないかなぁ。

Adobe Help
モバイルアプリケーションプロパティの設定
http://help.adobe.com/ja_JP/air/build/WSfffb011ac560372f-5d0f4f25128cc9cd0cb-7ffe.html

Android の設定
http://help.adobe.com/ja_JP/air/build/WSfffb011ac560372f-5d0f4f25128cc9cd0cb-7ffe.html#WSfffb011ac560372f-5d0f4f25128cc9cd0cb-7ffc

iOS の設定
http://help.adobe.com/ja_JP/air/build/WSfffb011ac560372f-5d0f4f25128cc9cd0cb-7ffe.html#WSfffb011ac560372f7e64a7f12cd2dd1867-8000

Flexデベロッパーセンター
Flex 4.5 SDK と Flash Builder 4.5を使用したモバイルアプリケーション開発
http://www.adobe.com/jp/devnet/flex/articles/mobile-development-flex-flashbuilder.html

Flash Magazine
Adobe AIR 2.7 available
http://www.flashmagazine.com/news/detail/adobe_air_2.7_available/

追加
Adobe : Apple iOS

2011.06.13
15:01
author: taikiken
1件のコメント

AS3, EventサブクラスのtoStringとformatToString

ActionScript 3 で Event サブクラスを作りカスタム・イベントを作成するときのメモ。

イベントを複製する clone メソッド作成は必須になります。
サブクラスでoverrideして作らなければいけません。
作らなくともエラーにはなりませんが…

toString メッソドは作っても作らなくても良いような記述がヘルプに書いてあって、長い間釈然としていなかったのですがやっと理解できたような気がします。

オンラインヘルプには以下のように書かれています。
http://help.adobe.com/ja_JP/FlashPlatform/reference/actionscript/3/flash/events/Event.html#formatToString()
formatToStringの説明。

カスタム ActionScript 3.0 Event クラスに toString() メソッドを実装するためのユーティリティ関数です。toString() メソッドをオーバーライドすることは、推奨されますが必須ではありません。

Eventコンストラクタの引数。

Event(type:String, bubbles:Boolean = false, cancelable:Boolean = false)

パラメーター
type:String — Event.type としてアクセス可能なイベントタイプです。

bubbles:Boolean (default = false) — Event オブジェクトがイベントフローのバブリング段階で処理されるかどうかを判断します。デフォルト値は false です。

cancelable:Boolean (default = false) — Event オブジェクトがキャンセル可能かどうかを判断します。デフォルト値は false です

toStringをoverrideする必要ない場合
カスタムイベント・クラスでtype(イベント名称)だけを作りたい場合。

【例】
スピードを変更を通知するイベント・クラス

package {
 
import flash.events.Event;
public class AccelerateEvent extends Event {
	public static const SPEED_UP:String = "speedUp";
	public static const SPEED_DOWN:String = "speedDown";
 
	public function AccelerateEvent( type:String, bubbles:Boolean=true, cancelable:Boolean=false)
	{
		super(type, bubbles, cancelable);
	}
 
	override public function clone():Event
	{
		return new AccelerateEvent(type, bubbles, cancelable);
	}
}
 
}

使い方

addEventListener(AccelerateEvent.SPEED_UP, onSpeedUp);
dispatchEvent(new AccelerateEvent(AccelerateEvent.SPEED_UP));
 
function onSpeedUp (e:AccelerateEvent):void {
	trace(e);
	// [AccelerateEvent type="speedUp" bubbles=true cancelable=false eventPhase=2]
}

toStringメソッドはイベント・インスタンスをtraceするときに使われています。
ここに表示される以上の情報が無い場合は親クラス(Event)のtoStringメソッドで事足りるためわざわざoverrideする必要はありません。

toStringをoverrideする必要がある場合
MouseEventやProgressEventなどのようにEventクラスtoString以上の情報が必要な場合はtoStringをoverrideしなければなりません。

上記例ではスピードをアップするかダウンするかを通知するだけでした。
これに「どれ位」アップするかダウンするかを通知できるように変更します。

package {
 
import flash.events.Event;
public class AccelerateEvent extends Event {
	public static const SPEED_UP:String = "speedUp";
	public static const SPEED_DOWN:String = "speedDown";
 
	private var _speed:Number;
 
	public function AccelerateEvent(speed:Number, type:String, bubbles:Boolean=true, cancelable:Boolean=false)
	{
		_speed = speed;
		super(type, bubbles, cancelable);
	}
 
	override public function clone():Event
	{
		return new AccelerateEvent(_speed, type, bubbles, cancelable);
	}
}
 
}

AccelerateEventは引数にスピードが追加されました。
これに合わせてcloneメソッドも変更しています。

traceした時にspeedの値も出力されると便利です。
toStringメソッドにspeedの値を追加します。

toStringで使用する変数はpublicに読み取りできなくてはいけません。
今回はpublicな読み取り専用(read only)変数にしています。

	public function get speed():Number
	{
		return _speed;
	}

次にtoStringをoverrideします。

	override public function toString():String
	{
		return formatToString("AccelerateEvent", "speed", "type", "bubbles", "cancelable", "eventPhase")
	}

【完成形】

package {
 
import flash.events.Event;
public class AccelerateEvent extends Event {
	public static const SPEED_UP:String = "speedUp";
	public static const SPEED_DOWN:String = "speedDown";
 
	private var _speed:Number;
 
	public function AccelerateEvent(speed:Number, type:String, bubbles:Boolean=true, cancelable:Boolean=false)
	{
		_speed = speed;
		super(type, bubbles, cancelable);
	}
 
	override public function clone():Event
	{
		return new AccelerateEvent(speed, type, bubbles, cancelable);
	}
 
	override public function toString():String
	{
		return formatToString("AccelerateEvent", "speed", "type", "bubbles", "cancelable", "eventPhase")
	}
 
	public function get speed():Number
	{
		return _speed;
	}
}
 
}

使い方

addEventListener(AccelerateEvent.SPEED_UP, onSpeedUp);
dispatchEvent(new AccelerateEvent(1, AccelerateEvent.SPEED_UP));
 
function onSpeedUp (e:AccelerateEvent):void {
	trace(e);
	// [AccelerateEvent speed=1, type="speedUp" bubbles=true cancelable=false eventPhase=2]
	trace(e.speed);// 1
}

formatToStringが出力を整形してくれるのでここに出力させたいプロパティを列挙する。

今回のようにプロパティを追加しそれを出力させたい時にはtoStringoverrideは必須になります。

update

2011-07-13
野中先生が詳細な記事を書かれています。
特にcloneメソッドをoverrideしない時の問題について詳細に解説されています。

Macromedia Flash非公式テクニカルノート
Eventのサブクラスでclone()とtoString()メソッドをオーバーライドする