MacでPHP開発環境4 - myblog

| コメント(0) | トラックバック(0)
CakePHPを使っていて疑問に思ったこともマトメ。

あれれ?

CakePHPのテンプレートのデザインを変えても変更が反映されない?
以下の設定に秘密がありました。

hoge_controller.phpファイル

↓システムで用意されているレイアウトを使う

public $autoLayout = true;


こいつをコメントして、こんな感じにすると


# 独自のレイアウトを使う

public $layout = "hoge";

# システムのレイアウトを使う

# public $autoLayout = true;



あれれ?

XAMPP以外から起動したMySqlに接続できないぞー。
以下の設定に秘密がありました。

環境設定.jpg










もちろんmysqlを起動しておきます。

そしてdatabase.phpに以下の設定。


var $default = array(

'driver' => 'mysql',

'persistent' => false,

'host' => 'localhost',

'login' => 'root',

'password' => 'password',

'database' => 'hoge',

'prefix' => '',

'port' => '/tmp/mysql.sock', << ここがポイント

);


あれれ


せっかくDB接続できるようになったのに、テーブルにアクセスできなぞー。

以下の設定変更でアクセスできました。


テーブル名って名称に依存してしまうのですが、以下のようにすると特定のテーブルを指定できるようです。

models/以下のphpファイルに$useTableを設定します。


<?php


class Hoge extends AppModel

{

    var $name = 'Hoge';

    var $useTable = 'kokoni_tbl';

}


?>













subversion - myblog

| コメント(0) | トラックバック(0)
1-1.jpg












1-2.jpg












1-3.jpg












1-4.jpg

AudioRecord 「OnRecordPositionUpdateListener」インターフェースを使ってみた。

イマイチうまく動かない。



package sakura.jp;


import java.util.Arrays;


import android.app.Activity;

import android.media.AudioFormat;

import android.media.AudioRecord;

import android.media.MediaRecorder;

import android.media.AudioRecord.OnRecordPositionUpdateListener;

import android.os.Bundle;

import android.os.Handler;

import android.util.Log;

import android.view.Gravity;

import android.view.ViewGroup.LayoutParams;

import android.widget.LinearLayout;

import android.widget.TextView;


public class MicTest extends Activity {


private static final int AUDIO_SAMPLE_FREQ = 8000;

private static final int AUDIO_BUFFER_SIZE = AudioRecord.getMinBufferSize(

AUDIO_SAMPLE_FREQ, AudioFormat.CHANNEL_CONFIGURATION_MONO,

AudioFormat.CHANNEL_CONFIGURATION_MONO) * 2;


short[] BUFFER = new short[AUDIO_BUFFER_SIZE];


AudioRecord record;

Notification mNotification;

TextView mTextView;

Handler mHandler = new Handler();


/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {


super.onCreate(savedInstanceState);


LinearLayout linearLayout = new LinearLayout(this);

linearLayout.setOrientation(LinearLayout.VERTICAL);

linearLayout.setGravity(Gravity.CENTER);

setContentView(linearLayout);


record = new AudioRecord(MediaRecorder.AudioSource.MIC,

AUDIO_SAMPLE_FREQ, AudioFormat.CHANNEL_CONFIGURATION_MONO,

AudioFormat.ENCODING_PCM_16BIT, AUDIO_BUFFER_SIZE);


mNotification = new Notification();


record.setRecordPositionUpdateListener(mNotification);

record.setPositionNotificationPeriod(128);

record.setNotificationMarkerPosition(AUDIO_BUFFER_SIZE / 2);


record.startRecording();


mNotification.onPeriodicNotification(record);


mTextView = new TextView(this);

linearLayout.addView(mTextView, LayoutParams.WRAP_CONTENT);


mTextView.setText("test start");


}


public class Notification implements OnRecordPositionUpdateListener {


public void onMarkerReached(AudioRecord recorder) {

// TODO 自動生成されたメソッド・スタブ


}


public void onPeriodicNotification(AudioRecord recorder) {

// TODO 自動生成されたメソッド・スタブ


record.read(BUFFER, 0, AUDIO_BUFFER_SIZE);


Arrays.sort(BUFFER);

short volts = BUFFER[BUFFER.length - 1];


final String msg = String.valueOf(volts);

Log.d("TEST", "onPeridic : " + msg);


mHandler.post(new Runnable() {


public void run() {


mTextView.setText("onPeridic : " + msg);


try {

Thread.sleep(1000);

} catch (InterruptedException e) {

// TODO 自動生成された catch ブロック

e.printStackTrace();

}


}

});


}

}


}

java class interface - myblog

| コメント(0) | トラックバック(0)

自分用メモ。


別のクラスファイルにスレッドを作り、その戻り値をメインのjavaで受信する。

androidに挑戦中2で使っている方法。



■ MeterAnima.java

package jp.sakura;


import jp.sakura.SoundSwitch.OnReachedVolumeListener;


public class MeterAnima {

static SoundSwitch mSoundSwitch;

public static void main(String[] args) {

// TODO 自動生成されたメソッド・スタブ

mSoundSwitch = new SoundSwitch();


// SoundSwitchクラスのsetOnVolumeReachedListenerメソッドを実行

mSoundSwitch.setOnVolumeReachedListener(

// SoundSwitch interface 実装

new OnReachedVolumeListener() {

// OnReachedVolumeListenerのOnReachedVolumeメソッドを実装

public void OnReachedVolume( final short volume ) {

System.out.println("volume" + volume);

}

}

);

new Thread(mSoundSwitch).start();

}


}


■ SoundSwitch.java

package jp.sakura;



public class SoundSwitch implements Runnable {

// mListenerをOnReachedVolumeListener型で宣言

private OnReachedVolumeListener mListener;

// メソッドに引数を指定する場合は型が必要なので「OnReachedVolumeListener listener」となる。

public void setOnVolumeReachedListener( OnReachedVolumeListener listener ) {

mListener = listener;

}

// OnReachedVolumeListenerメソッドを宣言

public interface OnReachedVolumeListener {

// 抽象メソッド

void OnReachedVolume( short volume );

}


// Runnableのrunメソッドを実装

@Override

public void run() {

short max = 0;

mListener.OnReachedVolume(max);

}


}


針を回すアニメーションです。

メモとしてtimerTaskを使った定期実行と、sleepを使った場合を掲載。

■TimerTask

package sakura.jp;


import java.util.Timer;

import java.util.TimerTask;


import android.app.Activity;

import android.content.Context;

import android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.Paint;

import android.graphics.Path;

import android.os.Bundle;

import android.os.Handler;

import android.util.Log;

import android.view.View;


public class Meter extends Activity {

/** Called when the activity is first created. */


int rote = 0;

Timer timer;

Handler handler;

MeterView myView;


@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);


myView = new MeterView(getApplication());

setContentView(myView);

timer = new Timer();

handler = new Handler();

timer.schedule(new TimerTask() {


public void run() {


handler.post(new Runnable() {


public void run() {


rote = rote + 1;

myView.invalidate();

}


});


}


}, 0, 1000);


}


class MeterView extends View {


Paint paint = new Paint();

Path path = new Path();


public MeterView(Context context) {


super(context);


}


protected void onDraw(Canvas canvas) {


path.moveTo(-100, -0);

path.lineTo(0, -3);

path.lineTo(0, 0);

path.lineTo(0, 3);

path.close();


int w = canvas.getWidth();

int h = canvas.getHeight();

int cx = w / 2;

int cy = h / 2;


Log.d("TEST", "ondraw:" + rote);


canvas.drawColor(Color.WHITE);


paint.setAntiAlias(true);

paint.setColor(Color.BLACK);

paint.setStyle(Paint.Style.FILL);

canvas.drawCircle(cx, cy, 5, paint);


canvas.translate(cx, cy);

canvas.rotate(rote);

canvas.drawPath(path, paint);


}


}


}


■sleep

package sakura.jp;


import java.util.Timer;


import android.app.Activity;

import android.content.Context;

import android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.Paint;

import android.graphics.Path;

import android.os.Bundle;

import android.os.Handler;

import android.util.Log;

import android.view.View;


public class Meter extends Activity implements Runnable {

/** Called when the activity is first created. */


int rote = 0;

Timer timer;

Handler handler;

MeterView myView;


@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);


myView = new MeterView(getApplication());

setContentView(myView);


handler = new Handler();

Thread thread = new Thread(this);

thread.start();


}


public void run() {


for (rote = 0; rote < 360; rote++) {


Log.d("TEST", "rote 1:" + rote);


handler.post(new Runnable() {


public void run() {


Log.d("TEST", "rote 2:" + rote);


myView.invalidate();


}

});


try {


Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}


}


}


class MeterView extends View {


Paint paint = new Paint();

Path path = new Path();


public MeterView(Context context) {


super(context);


}


protected void onDraw(Canvas canvas) {


path.moveTo(-100, -0);

path.lineTo(0, -3);

path.lineTo(0, 0);

path.lineTo(0, 3);

path.close();


int w = canvas.getWidth();

int h = canvas.getHeight();

int cx = w / 2;

int cy = h / 2;


Log.d("TEST", "ondraw:" + rote);


canvas.drawColor(Color.WHITE);


paint.setAntiAlias(true);

paint.setColor(Color.BLACK);

paint.setStyle(Paint.Style.FILL);

canvas.drawCircle(cx, cy, 5, paint);


canvas.translate(cx, cy);

canvas.rotate(rote);

canvas.drawPath(path, paint);


}


}


}



androidに挑戦中3 - myblog

| コメント(0) | トラックバック(0)
「androidに挑戦中2」のソースをAudioメーターぽい感じにしてみました。

android audiorecord vu meter


参考にした書籍。

 
html5を試すためにInkscapeからcanvasに変換するライブラリーをインストールしてみる。

1、以下のURLからInkscapeをダウンロードしてインストール


inkscape1.jpg












2、gitでInk2canvasをインストール

git clone https://github.com/karlisson/Ink2canvas.git

Ink2canvasディレクトリに移動。
cd Ink2canvas

git pull

3、ink2canvas.inx、ink2canvas.py、libディレクトリを「extensions」にコピー

inkscape2.jpg












Contl + クリックでサブウィンドウを表示し、「パッケージ内容を表示」を選択。

inkscape3.jpg












ファイルディレクトリをコピー

inkscape4.jpg












4、Inkscapeを起動し、作成したイメージを「html5」で保存

inkscape5.jpg












以下がcanvasで作成したイメージです。



サイトをスマートフォンに合わせてみました。
スマートフォン用にCSSを作って、javascriptで切り替えています。


function is_mobile ({
  var useragents [
    'iPhone',         // Apple iPhone
    'iPod',           // Apple iPod touch
    'Android',        // 1.5+ Android
    'dream',          // Pre 1.5 Android
    'CUPCAKE',        // 1.5+ Android
    'blackberry9500'// Storm
    'blackberry9530'// Storm
    'blackberry9520'// Storm v2
    'blackberry9550'// Storm v2
    'blackberry9800'// Torch
    'webOS',          // Palm Pre Experimental
    'incognito',      // Other iPhone browser
    'webmate'         // Other iPhone browser
  ];
  var pattern new RegExp(useragents.join('|')'i');
  return pattern.test(navigator.userAgent);
}

$(function ({
  if (is_mobile(){
    document.getElementById('mystyle').href "http://big-band.sakura.ne.jp/super_bombers/s-styles.css";
  }
});

詳しくはこちらサイトを参照して下さい。
http://terkel.jp/archives/2010/08/optimizing-websites-for-smartphones-with-ua-detection/

MacでPHP開発環境3 - myblog

| コメント(0) | トラックバック(0)
早速、以下のサイトを参考にしてCakePHPを試してみました。

http://libro99.appspot.com/index2?id=8002

げーすげー簡単。

Scaffold.tif















あっという間にDBアプリケーションが出来てしまった!
Railsの時は環境まわりにも苦労したけど、PHPはラクチン。

MacでPHP開発環境2 - myblog

| コメント(0) | トラックバック(0)

フレームワークを試してみる。

PHPのフレームワークは幾つか存在しているので、今回、どれを試してみるか決定することから始めます。
googleで調べてみると「cakephp」が人気が高いようなので、cakephpを試してみることにしました。

1、CakePHPのサイト(http://cakephp.jp/)からソースをダウンロード
今回ダウンロードしたのは、最新安定版の「cakephp-cakephp-1.3.8-0-g33afe21.zip」です。
2、ダウンロードしたファイルを解凍し、前回インストールしたXAMPPディレクトリのhtdocsディレクトリにコピーする。フォルダ名を「cakesample」に変更。
htdocsフォルダ.tifのサムネール画像










3、XAMPPのWEBサーバを起動し、動作を確認する。
「XAMPP Control』をクリックしApacheをスタートする。

apache起動.tif















4、ブラウザよりアクセス
http://localhost/cakesample/」にブラウザにてアクセス

ブラウザアクセス.tif















5、「Warning(512)」を解決する。

cacheディレクトリに書き込みパーミッションが無いので警告が出ているようなので、パーミッションを変更します。

「/Applications/XAMPP/xamppfiles/htdocs/cakesample/app/tmp/cache/」まで移動して各ディレクトリのパーミッションを変更します。

パーミッション変更.tif
1)該当するディレクトリを選択。
2)コマンド+Iで情報を開く
3)共有とアクセス件を全て読み/書きに変更する。











6、ブラウザを更新して警告が出ないことを確認する。

警告無し確認.tif















7、eclipseに「aptana php」がインストールされていればeclipse環境で開発できる。

ワークスペースを「Applications/XAMPP/xamppfiles/htdocs」に変更。
インポート→その他→新規プロジェクトとして既存フォルダーを使用を選択。
「cakesample」を指定。

eclipse.tif

ブログ

ウェブページ

Powered by Movable Type 5.0