2013年2月23日

PHPのextension追加時の注意点

自宅PCのPHPでxdebugを使おうとしたら、うまく読めなかったので原因と対応をメモ。
と言っても、原因は単純にphpizeのバージョン違いでした。

ちゃんとzend_exntesion=/path/to/xdebug.so
としてxdebugでvar_dumpをオーバーロードしてるのに表示が変わらなくて変だなーと思って原因を調べてみました。

phpinfoを見てみたら、xdebugの項目が無い・・!
ということでApacheのerror_logを見てみたら、こんなログが出ていました。
太字のところが大事な箇所です。

Failed loading /usr/lib/php/extensions/no-debug-non-zts-20090626/xdebug.so:  dlopen(/usr/lib/php/extensions/no-debug-non-zts-20090626/xdebug.so, 9): Symbol not found: _output_globals
  Referenced from: /usr/lib/php/extensions/no-debug-non-zts-20090626/xdebug.so
  Expected in: flat namespace
 in /usr/lib/php/extensions/no-debug-non-zts-20090626/xdebug.so
Xdebug requires Zend Engine API version 220090626.
The Zend Engine API version 220100525 which is installed, is newer.
Contact Derick Rethans at http://xdebug.org/docs/faq#api for a later version of Xdebug.

こちらを見てみたところ、peclでxdebugを再インストールすると動くよ!
っていうことだったので試しましたが結果は変わらず。

で、こういうときはオフィシャルに行ったらちゃんと書いてるんですよね・・

/full/path/to/php/bin/phpize
というところで、ん?と思い

$ which phpize
/usr/bin/phpize

$ locate phpize |grep bin |grep phpize$
/usr/bin/phpize
/usr/local/bin/phpize

おぉ、2ついる。
バージョンを見てみましょう。

$ /usr/bin/phpize --version
Configuring for:
PHP Api Version:         20090626
Zend Module Api No:      20090626
Zend Extension Api No:   220090626

$ /usr/local/bin/phpize --version
Configuring for:
PHP Api Version:         20100412
Zend Module Api No:      20100525
Zend Extension Api No:   220100525

あぁ、これだ。
単にphpizeしてただけなので、動いているPHPとZend Engine APIのバージョンが合ってなかったんですね。
ということで、

$ cd /path/to/xdebug
$ /usr/local/bin/phpize
$ ./configure --enable-xdebug --with-php-config=/path/to/php-config
$ make
$ sudo make install

と、再コンパイル後にphp.iniのxdebugのextensionのパスを直してApacheを再起動したら無事に動きました。

コマンドのpathには気をつけましょう、という話でした。

2012年12月26日

PHPStormのファイルタイプ

先日、マヤ暦で言うところの人類滅亡の日に、JetBrainsが75%オフという破格のセールをしてくれていましたので
気になっていたPhpStormを買ってみました。

元々WebStormは買っていて、使い勝手は大体掴めていたので問題ないだろうと思っていたのですが
PHPファイルの関連付けがおかしいことになっていました。
なぜかPHPファイルがHtmlファイルとして扱われている?

色などおかしいことになっていて見づらかったのですが、設定箇所がいまいち分からなかったので調べてみました。

PhpStormのDeveloper Communityにで見つけたのでメモっておきます。
http://devnet.jetbrains.net/thread/433638

[File] > [Settings] > [File Types]
を開き、PHP filesのパターンに *.php を追加するとphpファイルとして扱ってくれるようになりました。

ごくごく簡単な設定なのに見つけられないとなんかもやっとしますね。
*.hphp とか *.php4 とかは初めからあるのに、何で *.php が登録されてなかったんだろう?

Eclipseは重いしNetBeansは何となく馴染まないなーということで、ここ数カ月はEmacsの設定をいろいろ学んで使っていたのですが、その設定が無駄になりそうな気もするw

2012年9月13日

Androidアプリを公開しました

Androidアプリを公開しました。
Eventer という名前です。
Google play

どんなアプリかと言うと
■概要
 ATND beta、Zusaar、CONNAPASSで開催されているイベントを検索します
 もうそれ以上でもそれ以下でも無い感じ
 検索してお気に入りリスト的なものは作れます。

まだbeta版みたいな感じですが、とりあえず動くようになったのでリリースしました。

さてー、頑張ってアップデートしていこう。
とりあえず今後の目標は
  • UIをどうにかする
  • 気になったイベントをシェア出来るようにする
  • 全体的に挙動を安定させる
  • JSONのパースにJPPとか使ってみる

って感じかなぁ。 思いついたらまた足していこう。
気になったところとかあれば、コメントなど頂けるとありがたいです。

ではではよろしくお願いします。
https://play.google.com/store/apps/details?id=com.shmrkm.eventer

2012年8月16日

[eclipse]Eclipse Junoが起動しない問題

原因は分からないけどEclipseの起動時にエラーが起きるようになったので解決策をメモ。
環境は以下。Windowsでも起こるのかな?
-----------------------------------------
OS: Max OSX 10.7.4
Eclipse: 4.2
plugin: ADT r20.0.2
-----------------------------------------

自分の環境だと、どうもGoogle先生のioschedをインポートして再起動すると起こるっぽい。他のプロジェクトはインポートしてないから分かんない。
起動時にエラーダイアログが表示されて

YOUR_WORKSPACE/.metadata/.log にログ出したよ みたいなことを言われます。
ログの内容は最下部に。

解決策を探したところstackoverflowにあった。
http://stackoverflow.com/questions/11310970/eclipse-juno-doesnt-start

解決方法は

YOUR_WORKSPACE/.metadata/.plugins/org.eclipse.core.resources/.snap
っていうファイルを消せば起動するようになります。

起動時のエラーログはこんな感じ。あれなところは消してます。

!SESSION 2012-08-16 18:33:53.745 -----------------------------------------------
eclipse.buildId=I20120608-1400
java.version=1.6.0_33
java.vendor=Apple Inc.
BootLoader constants: OS=macosx, ARCH=x86, WS=cocoa, NL=ja_JP
Framework arguments:  -product org.eclipse.epp.package.java.product -keyring HOME/.eclipse_keyring -showlocation
Command-line arguments:  -os macosx -ws cocoa -arch x86 -product org.eclipse.epp.package.java.product -keyring HOME/.eclipse_keyring -showlocation

!ENTRY org.eclipse.core.resources 2 10035 2012-08-16 18:33:55.167
!MESSAGE The workspace exited with unsaved changes in the previous session; refreshing workspace to recover changes.

!ENTRY org.eclipse.equinox.preferences 4 2 2012-08-16 18:33:56.942
!MESSAGE Problems occurred when invoking code from plug-in: "org.eclipse.equinox.preferences".
!STACK 0
java.lang.ExceptionInInitializerError
at org.eclipse.wb.internal.core.preferences.PreferenceInitializer.initializeDefaultPreferences(PreferenceInitializer.java:50)
at org.eclipse.core.internal.preferences.PreferenceServiceRegistryHelper$1.run(PreferenceServiceRegistryHelper.java:300)
at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
at org.eclipse.core.internal.preferences.PreferenceServiceRegistryHelper.runInitializer(PreferenceServiceRegistryHelper.java:303)
at org.eclipse.core.internal.preferences.PreferenceServiceRegistryHelper.applyRuntimeDefaults(PreferenceServiceRegistryHelper.java:131)
at org.eclipse.core.internal.preferences.PreferencesService.applyRuntimeDefaults(PreferencesService.java:368)
at org.eclipse.core.internal.preferences.DefaultPreferences.applyRuntimeDefaults(DefaultPreferences.java:166)
at org.eclipse.core.internal.preferences.DefaultPreferences.load(DefaultPreferences.java:237)
at org.eclipse.core.internal.preferences.EclipsePreferences.create(EclipsePreferences.java:410)
at org.eclipse.core.internal.preferences.EclipsePreferences.internalNode(EclipsePreferences.java:663)
at org.eclipse.core.internal.preferences.EclipsePreferences.node(EclipsePreferences.java:805)
at org.eclipse.core.internal.preferences.AbstractScope.getNode(AbstractScope.java:38)
at org.eclipse.core.runtime.preferences.DefaultScope.getNode(DefaultScope.java:76)
at org.eclipse.ui.preferences.ScopedPreferenceStore.getDefaultPreferences(ScopedPreferenceStore.java:250)
at org.eclipse.ui.preferences.ScopedPreferenceStore.getPreferenceNodes(ScopedPreferenceStore.java:285)
at org.eclipse.ui.preferences.ScopedPreferenceStore.internalGet(ScopedPreferenceStore.java:475)
at org.eclipse.ui.preferences.ScopedPreferenceStore.getBoolean(ScopedPreferenceStore.java:387)
at org.eclipse.wb.internal.core.editor.describer.JavaSourceUiDescriber.isGUISource(JavaSourceUiDescriber.java:65)
at org.eclipse.wb.internal.core.editor.describer.JavaSourceUiDescriber.describe(JavaSourceUiDescriber.java:52)
at org.eclipse.core.internal.content.ContentTypeCatalog.describe(ContentTypeCatalog.java:218)
at org.eclipse.core.internal.content.ContentTypeCatalog.collectMatchingByContents(ContentTypeCatalog.java:190)
at org.eclipse.core.internal.content.ContentTypeCatalog.internalFindContentTypesFor(ContentTypeCatalog.java:403)
at org.eclipse.core.internal.content.ContentTypeCatalog.internalFindContentTypesFor(ContentTypeCatalog.java:450)
at org.eclipse.core.internal.content.ContentTypeCatalog.getDescriptionFor(ContentTypeCatalog.java:346)
at org.eclipse.core.internal.content.ContentTypeCatalog.getDescriptionFor(ContentTypeCatalog.java:360)
at org.eclipse.core.internal.content.ContentTypeMatcher.getDescriptionFor(ContentTypeMatcher.java:86)
at org.eclipse.core.internal.resources.ContentDescriptionManager.readDescription(ContentDescriptionManager.java:445)
at org.eclipse.core.internal.resources.ContentDescriptionManager.getDescriptionFor(ContentDescriptionManager.java:355)
at org.eclipse.core.internal.resources.File.internalGetCharset(File.java:246)
at org.eclipse.core.internal.resources.File.getCharset(File.java:207)
at org.eclipse.core.internal.resources.File.getCharset(File.java:194)
at org.eclipse.jdt.internal.core.util.Util.getResourceContentsAsCharArray(Util.java:1156)
at org.eclipse.jdt.internal.core.builder.SourceFile.getContents(SourceFile.java:79)
at org.eclipse.jdt.internal.compiler.ReadManager.run(ReadManager.java:173)
at java.lang.Thread.run(Thread.java:680)
Caused by: org.eclipse.swt.SWTException: Invalid thread access
at org.eclipse.swt.SWT.error(SWT.java:4361)
at org.eclipse.swt.SWT.error(SWT.java:4276)
at org.eclipse.swt.SWT.error(SWT.java:4247)
at org.eclipse.swt.widgets.Display.error(Display.java:1068)
at org.eclipse.swt.widgets.Display.checkDevice(Display.java:621)
at org.eclipse.swt.graphics.Device.getSystemFont(Device.java:476)
at org.eclipse.jface.preference.PreferenceConverter.<clinit>(PreferenceConverter.java:84)
... 35 more

!ENTRY org.eclipse.osgi 4 0 2012-08-16 18:33:58.307
!MESSAGE Application error
!STACK 1
java.lang.NoClassDefFoundError: Could not initialize class org.eclipse.jface.preference.PreferenceConverter
at org.eclipse.ui.internal.themes.ThemeElementHelper.installFont(ThemeElementHelper.java:103)
at org.eclipse.ui.internal.themes.ThemeElementHelper.populateRegistry(ThemeElementHelper.java:59)
at org.eclipse.ui.internal.Workbench$27.runWithException(Workbench.java:1550)
at org.eclipse.ui.internal.StartupThreading$StartupRunnable.run(StartupThreading.java:31)
at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35)
at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:135)
at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:3944)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3621)
at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2478)
at org.eclipse.ui.internal.Workbench.access$7(Workbench.java:2386)
at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:583)
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:540)
at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:124)
at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:353)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:180)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:629)
at org.eclipse.equinox.launcher.Main.basicRun(Main.java:584)
at org.eclipse.equinox.launcher.Main.run(Main.java:1438)

!ENTRY com.android.ide.eclipse.adt 4 0 2012-08-16 18:33:58.755
!MESSAGE parseSdkContent failed
!STACK 0
java.lang.NullPointerException
at com.android.ide.eclipse.adt.AdtPlugin.getDisplay(AdtPlugin.java:334)
at com.android.ide.eclipse.adt.AdtPlugin$7.run(AdtPlugin.java:1422)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:54)
!SESSION 2012-08-16 18:40:39.117 -----------------------------------------------
eclipse.buildId=I20120608-1400
java.version=1.6.0_33
java.vendor=Apple Inc.


2012年7月21日

[PHP]debug_backtrace() で処理を追いかける

便利なのによく忘れるのでメモ。

仕事でどこかの誰かが書いたか分からない、ドキュメントも無い俺俺フレームワークの面倒を見ることが多いのだけど
そういうものの処理を追いかける時に便利!

例えばこんな構造のコードがあったとします。
index.php にアクセスすると 
class A のインスタンスを作成して
class B のstatic hoge を呼び出し
class C のhuga() を実行します。

・index.php
<?php

require_once("./classA.php");
require_once("./classB.php");

// index.php
$a = new A();

・classA.php
<?php
class A
{
    public function A()
    {
        B::hoge();
    }
}

・classB.php
<?php
class B
{
static function hoge()
    {
        print "hoge() called.";
    }
}

・classC.php
<?php
class C
{
public function huga()
{
print "huga() called.";
}
}

この状態でindex.php にアクセスすると

huga() called.

とだけ表示されます。

もっと複雑に絡みあってくると、整備されていないととてもじゃないけど追いかけてられません。

そこで、hoge()メソッド内の
print "hoge() called."; の前に

var_dump(debug_backtrace());

を記述すると
実行結果がこうなります(配列を見やすいように整形してます)

array(3) {
[0]=> array(7) {
["file"]=> string(78) "DocumentRoot\classB.php"
["line"]=> int(7)
["function"]=> string(4) "huga"
["class"]=> string(1) "C"
["object"]=> object(C)#2 (0) { }
["type"]=> string(2) "->"
["args"]=> array(0) { }
}
[1]=> array(6) {
["file"]=> string(78) "DocumentRoot\classA.php"
["line"]=> int(7)
["function"]=> string(4) "hoge"
["class"]=> string(1) "B"
["type"]=> string(2) "::"
["args"]=> array(0) { }
}
[2]=> array(7) {
["file"]=> string(77) "DocumentRoot\index.php"
["line"]=> int(7)
["function"]=> string(1) "A"
["class"]=> string(1) "A"
["object"]=> object(A)#1 (0) { }
["type"]=> string(2) "->"
["args"]=> array(0) { }
}
}
huga() called.

添え字の大きい方から順に処理されていきます。
file => 呼ばれるファイル
line => ファイル内の処理行
function => 呼ばれるメソッド名
class => クラス名
object => 対象のオブジェクト
type => -> が オブジェクトからの呼び出し、 :: はstatic での呼び出し。関数呼び出しは何も表示されない模様
args => 引数


これがあるのを忘れて、ついコードを追いかけてしまいます。
なんていう時間の無駄をしないようにしよう。

2012年2月23日

Javascriptでformを作成してsubmitする方法

JavaScript内でformを動的に生成して、submitする方法のメモ
よく分からずにちょっとはまってしまいました。
書いてて思ったけど、このご時勢にわざわざページ遷移させる必要があるのか、とか
jsでformを作らないといけない理由は何だ?とか思ったけどどっかで需要もあるでしょう

ということで、たとえば
input id="submit" type="button" value="送信ボタン" />

なんていうのをHTML側に書いて、このボタンを押したら動的にJSでパラメータを作ってsubmitするとします。

JS側で
var frm = document.createElement("form");
var ipt1 = document.createElement("input");
frm.action = "js_submit2.php"; frm.method = "post";
ipt1.name = "val1"; ipt1.value = "111111"; frm.appendChild(ipt1); frm.submit();

なんていうコードを書いて実行したところ、Chromeさんでは上手くいきました。
ばんざい!おしまい!
としたかったのですが、どうもFirefoxで動いていない模様。

いろいろネットで情報を集めてるうちに
Firefoxはbody要素をきっちり指定してやらないと、formが効かないらしい
ということのようです

ということで、frmをsubmitする前に
document.body.appendChild(frm);
を追加してやります。

frm.appendChild(ipt1);
document.body.appendChild(frm);
frm.submit();

こうすると、Firefoxでもちゃんと動きました。
Chromeが賢いのか、Firefoxがきっちりしてるのか。
ちなみにIEや他のでは見ていません。あしからず。

2012年2月20日

htaccessでSSLのみアクセス許可を出す

.htaccessでSSLでのアクセスのみを許可する方法



最低限これだけ書けば出来る模様
SSLRequireSSL

これがある状態でhttpでアクセスすると、403 You don't have permission to accessのエラーになります。


localhostのSSL対応していないサーバにこれを仕込んでおいたのを忘れてて
SSL対応させたらhttpアクセスが全然効かなくてはまってしまった・・


ちなみに、Apacheのエラーログにはこんなのが出ます。
failed, reason: SSL connection required

2012年2月15日

HTMLメモ 動的に要素を削除する

さすが飽き性というところで、すぐブログ書かなくなるなー。
 さて、忘れそうなので個人メモ。

HTMLで動的なページを作っている時に
要素の作成、追加は
appendChild()で行えるが
要素の削除は
removeChild() で模様。

使い方は同様で()内にhtml Objectを入れてあげれば使えるみたい。
Titaniumでアプリ作る時にでも使いそうだから覚えておこう。

2012年1月17日

Eclipseでapkに署名する方法

忘れがちなのでメモ。

EclipseでAndroidのapkに署名する方法
・ファイル -> エクスポート
・Android -> Export Android Applicationを選択


・プロジェクト名を入力 or 右のBrowserボタンから選択
No errors found. Click Next.と表示されたら次へ。


・鍵を選択 or 作成 (画面は新規作成)