サブノート

技術的なトピックが中心の備忘録

[Python][PsychoPy]パラメータチェック

課題開始時に使うパラメータチェック。
実験情報ダイアログに入力された値を取得し、空文字でないことを確認する。

Codeコンポーネントの[Begin Experiment]タブに記述する。

inputId = expInfo["id"]

if "" == inputId:
  logging.log(level=logging.WARN, msg="Invalid Parameter for id")
  core.quit()

#
#処理
#

[PHP]配列取得後のインデックス指定でエラー

PHP 5.1.6 の場合、配列取得後に続けてインデックス指定をするとエラーになる。

<?php

echo getVal()[0];  //←エラー発生

function getVal()
{
  $ret = array();
  $ret[0] = 'zero';
  return $ret;
}

?>
Parse error: syntax error, unexpected '[', expecting ',' or ';' in /var/www/html/〜〜〜


この場合、一度変数に格納してからアクセスする必要がある。

<?php

$ar = getVal();
echo $ar[0];  //←これはOK

function getVal()
{
  $ret = array();
  $ret[0] = 'zero';
  return $ret;
}
                                
?>

なお、PHP 5.3.28 では前者の方法もOK。

[JavaScript][jQuery]非同期処理の処理順を担保する

JavaScriptにおいて、非同期処理の処理順を担保したい場合。

例えば以下の処理では、タイトル文字列を取得することができない。
(HTMLの内容を取得する非同期処理完了前に、$('title').text() がコールされる)

<script type="text/javascript">

$(function(){
  loadPage();
  getTitle();
});

function loadPage() {
  $('body').load(
    ''http://www6.plala.or.jp/private-hp/samuraidamasii/''
  );
}

function getTitle() {
  console.log($('title').text());  //←タイトル表示できない

  setTimeout(function() {
    console.log($('title').text());  //←(内容取得後であれば)タイトル表示できる
  }, 3000);
}

</script>


非同期処理においても、完了後に次の処理を開始するよう Deferred を使用する。

<script type="text/javascript">

$(function(){
//loadPage();
//getTitle();

  loadPage().done(getTitle);
});

function loadPage() {
//$('body').load(
//  ''http://www6.plala.or.jp/private-hp/samuraidamasii/''
//);

  var d = $.Deferred();
  $('body').load(
    'http://www6.plala.or.jp/private-hp/samuraidamasii/',
    null,
    d.resolve  //コールバック関数
  );
  return d.promise();
}

function getTitle() {
  console.log($('title').text());
}

</script>


$('body').load() 時に

XMLHttpRequest cannot load 〜〜〜

のエラーが発生する場合は、こちらの記事を参照。
[JavaScript][Chrome]ローカルホストから他ドメインにアクセスできない時の対処法 - サブノート

[PHP][CakePHP]発行したSQLを確認する

実際に発行された生のSQL文を見たい場合。

SQL実行後に

<?php
//Model内
debug($this->getDataSource()->getLog());

//以外
debug($this->[Model名]->getDataSource()->getLog());
?>

を埋める。


SQL文のみ表示。

<?php
debug('QUERY => ' . $this->getDataSource()->getLog()['log'][2]['query']);
?>

[Java][Eclipse]Windowsで作成したプロジェクトをMacで動かす

Windows で作成した JavaProject を Dropbox で共有して Mac 動かそうと思ったら。

コマンド行の実行中に例外が発生しました。
Cannot run program "/System/Library/~~~/bin/java" (in directory "/Users/~~~~"): error=2, No such file or directory

フォルダ名に日本語が混じっていたため。

フォルダ名変更

Eclipse 上で再インポート

で解決

[PHP][CakePHP]テーブルのカラム変更が反映されない

テーブルのカラムを追加したが、Insertできない事態が発生した。
原因は app/tmp/cache/models 内の cake_models_xxx_yyy が残っていたため。
ファイルを削除すればキャッシュが消えて、変更が無事反映された

[PHP]メモリ不足の回避

メモリ不足時に発生する

PHP Fatal error:  Allowed memory size of 〜〜〜 bytes exhausted (〜〜〜〜

のエラー。

php.ini に

memory_limit = 512MB

としてapacheを再起動するか、
変更権限ない場合は該当箇所を暫定的に

<?php
ini_set('memory_limit', '512M');
?>

とすることで回避する。

[PHP]ファイルオープン時はエラーチェックを行う

ファイル読み書きの際は fopen() を使う。
「ファイルがない」「権限がない」等のエラー時に FALSE を返すので、チェックをしていないとその後の処理で

Warning: fgetcsv() expects parameter 1 to be resource, boolean given in [ファイルパス] on line [行数]

等々のエラーが発生する。
下記のようなエラーチェックは必須。

<?php
/** CSVファイルの内容を取得 **/
public function loadData($filename)
{
  $fp = fopen($filename, "r");
  if($fp === FALSE) {
    //エラー
    throw new Exception('Error: Failed to open file (' . filename . ')');
  }

  //CSVの内容を取得
  while (($data = fgetcsv($fp, 0, ",")) !== FALSE) {
    $ret[] = $data;
  }

  fclose($fp);

  return $ret;
}
?>

[iOS][Xcode]iOSシミュレータの初期表示デバイスを変更する

iOS Simulator で初期表示がiPhone6だが、iPhone5sにしようと Hardware->Devices で指定すると、製造中のアプリアイコンが消えて起動できなくなった。
初期表示を指定する方法がわからなかったので、以下の方法で対応した。

  1. Hardware->Devices->Manage Devices... を開く
  2. iPhone6 を選択する
  3. 設定画面を開く
  4. Show in Run Destinations Menu のチェックを外す

Xcode のバージョンは 6.1.1。