ソフトバックロボット・Pepper(ペッパー)の開発環境構築実行とスマホから操作してみる

Pepperが愛媛県松山市の河原学園グループ・河原電子ビジネス専門学校に置いてあると言う事で、触らせてもらいに行きました。

まずは、そのままのPepper君をご覧ください。
会話になっているような、なっていないような。会話は話しかけるタイミングにコツが必要なようです。

続きを読む

さくらレンタルサーバのWordPressでユーザ情報更新時にInternalServerError(500)

WordPressのマルチサイトでユーザー追加時に500エラー』まさにこの症状がでたのですが、メール周りでもなさそうだったので、以下のように継続調査しました。

タイトルのように、『Internal Server Error 500』が表示されたときは、以下箇所を疑ってみます。

.htaccess の書き方の間違い

htaccess内のBasic認証やAccess denyなどの設定、Permanentなどの記述方法ミス、不要な全角スペースがある、などを疑います。

PHP のプログラムミス

プログラム記載ミスや処理の記述がないか疑います。

php.ini の記述ミス

さくらレンタルサーバの場合、php.ini はコントロールパネルから提供されています。この中に記載ミスがないか調査します。

それでも原因不明な時は・・・

コントロールパネルから提供されているエラーログを確認します。

今回、私の環境でエラーログには、『malformed header from script. Bad header=/home/hoge/dead.letter… S:』が表示されていました。

それと合わせて、php.iniのエラー表示もありphp.iniを見てみました。結果、原因はphp.iniの記載ミスでした。

 

BuddyPressをカスタマイズ

BuddyPressプロフィール一覧上部に、カスタム文章を表示する。さらに、表示・編集で切り替える。


add_action('bp_before_profile_field_content', 'account_details_display_howto' ); // 登録画面文章表示
add_action('bp_before_account_details_fields', 'account_details_display_howto' ); // 登録画面文章表示
// 新規アカウント登録時のタイトル設定
function zam_before_register_page() {
echo "<h2>" . get_the_title(6) . "</h2>";
return "";
}

登録メンバー一覧のサムネイルや、掲載情報を修正する場合は

/home/ippin-dou/www/test/wp-content/plugins/buddypress/bp-templates/bp-legacy/buddypress/members/members-loop.php を直接修正するか、add_action(bp_directory_members_item, functionxxxx) を追加すればよい。

プロフィールの一覧上部に任意の文章を追記する

Buddypressでプロフィール表示画面の、一覧表となる上部にBuddyPressのプロフィール拡張プラグイン『Buddypress xProfile Rich Text Field』で追加・追記した文章を表示させます。
以下のコードでは、プロフィール項目A,B,Cの項目を表示させる処理です。add_action() でアクションフックに登録し、プロフィール情報をecho させるのみです。

$count_loop = FALSE; // 同一画面で複数回CallBackされたカウント
add_action( 'bp_before_profile_field_content', 'bp_before_profile_func');
function bp_before_profile_func(){
    global $count_loop;
    global $bp;
    
    // 初回のみ表示させる
    if($count_loop) return ;
    else $count_loop = TRUE;
    // echo bp_displayed_user_id();
    $profile_title="タイトル";
    $corp_name = xprofile_get_field_data('[プロフィール項目A]', bp_displayed_user_id());  
    $corp_picture = xprofile_get_field_data('プロフィール項目B', bp_displayed_user_id());  
    $catchecopy = xprofile_get_field_data('プロフィール項目C', bp_displayed_user_id());  
    if($catchecopy != "")  $profile_title = $catchecopy;

    $profile_descript= xprofile_get_field_data('プロフィール項目D' ,bp_get_member_user_id());
    $profile_text = nl2br($profile_descript);
    echo <<<_PROFILE_INF_
	<h2>{$corp_name}</h2>
	{$corp_picture}
        <strong id="bf_profile_title">{$profile_title}</strong>
        <p id="bf_profile_desc">{$profile_text}</p>
_PROFILE_INF_;
}

EclipseLink JPA テーブルをEntityへ読込む際に初期化する

JPAのEntityManagerでレコード読み込み時、Nullだったら空文字に勝手にしたい場合の対処法を記載します。


/**
 * The persistent class for the database table.
 * 
 */
@Entity
@Table(name="sample_table")
@NamedQuery(name="sample_table.findAll", query="SELECT o FROM sample_table o")
public class sample_table implements Serializable {
 private static final long serialVersionUID = 1L;

@EmbeddedId
 private sample_tablePK&amp;nbsp;id;

@Column(name="Id")
 private String id;
 
 @Column(name="col1")
 private String col1;

・・・

・・・

/**
 * PostLoadアノテーションは、EntityManagerでem.setResultListやNamedQuery/NativeQueryなどでレコードアクセスし、
 * Entityへロードする際にフックされる。
 */
 @PostLoad
 private void whenLoadEntity(){
 // System.out.println("================== POST LOAD ====================");
 if(this.col1 == null) this.col1 = "";

・・・(その他レコードロード時の初期化処理を行う)
}

  • @PostLoad
  • private void whenLoadEntity()

上記2行がポイントです。PostLoadアノテーションは、EntityManagerでem.setResultListやNamedQuery/NativeQueryなどでレコードアクセスし、Entityへロードする際にフックされます。

Entityに値が入る前に設定してしまえばNullPointerExceptionの会費になります。但し、Entityを読込のみとして利用する場合に限定する必要がありそうです。(ここら辺はもう少し調べる必要があるかも)

JPA(EclipseLnk)のEntitiyをPostgresqlデータベースから自動生成してValidationまで

JPA(EclipseLnk)のEntitiyをPostgresqlデータベースから自動生成してValidationまでの実装(?)について記載します。

EclipseLinkのJPAはものすごく簡単に便利な機能を提供してくれてます。テーブルの定義がしっかりしていたらその定義のままにEntitiy(Bean)を作成してくれます。

Entity作成手順

Java Persistence API (JPA) を導入します。最初のEclipse自体のセットアップとJPAプロジェクト作成については以下が参考になりました。

DBにあるテーブルへの接続設定

予めDBとテーブルを作成しておきます。JPAパースペクティブを開き、DBへの接続設定を登録します。

ウィザードを使ってEntityを自動作成

プロジェクトを右クリック「JPA TOOL」-「Generate Entities From Table…」を選択するとEntity作成ウィザードが立ち上がります。

「Always generate optional JPA annotations and DDL parameters」にチェックを入れておくとカラム長、ユニークキー、NULL許可などの設定も@column アノテーションに自動付与してくれるので便利です。

@Idはプライマリキーに対して設定されます。

プライマリキーにシーケンスを使っている場合は、@GenaratedValue と @Sequence を使って@Idに自動付与してくれるようにします。

Entityに対してのSQL設定について

SQLはJQLという形式でEntityManager.CreateNamedQueryで定義できたり、SQLそのまま書けるEntityManager.CreateNativeQueryと、動的にソースの中で作成していけるCriteriaBuilderを利用する3つの方法があります。

SQLをそのまま利用したい場合はCreateNativeQueryでよいですし、単純なレコード取得・更新・作成が多ければNamedQueries({NamedQuery(…)[…]})といった形式でEntityに直に書いていった方が楽かもしれません。

また抽出条件が動的に変わるならCriteriaBuilderをお勧めしますが、やはりJOIN等でテーブル関係が複雑になるようだったらデータベース側でViewを作ってしまった方がよいでしょう。

JPAでの挿入・更新・参照

明らかに新規データの時は、EntityManager.persistを使った方がよさそうです。更新挿入(Update or Insert)をする場合は、EntityManager.mergeを利用します。その際に注意点が1つ。

更新時は更新対象のレコードをEntityManager.findや上記NamedQueryなどを利用して、Entityへデータを読み込んでおく必要があります。おそらく、プライマリキーが設定されていたらUpdateして、未設定ならInsertしてくれるんだと思います。あたりまえですが、その際にユニークキーが他のレコードなどと被っているとInsert時にエラーとなったりしてしまいます。

Entityに対してのカラムチェック等・・・Validation

JPA Bean Validation

前述したInsert/Update 時のJPAのEntityに対してValidationをする場合の参考となるソースが上記記載されています。単純にできて便利です。

上級?JPAでメタモデル

後日記載。

eclipseでJPAのメタモデルを自動生成する設定

 

 

EclipseLink JPA『is mapped to a primary key column in the database. Updates are not allowed.』

JPAの開発で『is mapped to a primary key column in the database. Updates are not allowed.』というエラーが出る場合、おそらく原因はいろいろあるのだろうけど、自己解決したのでメモ。

既に存在しているレコードに対して、EntityManager.find で atache したのちプライマリキーを上書きした状態で、merge / flush を行うとなるようです。

find して存在するレコードに更新かける場合はプライマリキーを書き換えないようにしましょう。

2016/4/26追記:

上記記載内容でも解決できずまだエラーログが掃かれていたので調査した結果を記載。EntityManagerを使いまわしでいろんなEntityを入れてmerge/flushしてました。emTransaction.commit / rollback 後は使用しなくなったEntitiyはキャッシュクリアを明示的にしないとずっと保持し続けるようで、これが悪さをしていました。

処理が遅くなるけど、 1テーブル処理が終わったらcommit/rollbackと同時に毎回em.clear();するようにしたらタイトルのエラーが出なくなりました。

またEntityのキャッシュについては、アノテーションによるキャッシュとpersistence.xmlによる設定ができるようです。前者の方がEntity毎に管理できるのでよさそうですね。

キャッシュいついての記事。