コンピュータ」カテゴリーアーカイブ

2024年のGCCでH8300-elfの開発環境を整える on FreeBSD

とある件でAVRからMMCカードに書き込みしたくなったので、AmazonでマイクロSDカード用のモジュールを買ったのですが、動作確認のためにH8を使おうと思い立ったのがドツボでした。gccのビルドでハマり、gdbのビルドでハマり、まともに動くようになるまでかなり時間を使いました。無駄にした時間は帰ってきませんが、記事にして消化することにしました。

その昔(15年ぐらい前?)AKI-H8/3069FのLAN付きのものを買って持ってまして、その当時はGCC4.2とか、gdb6.8とかビルドして使ってました。H8300はまだメジャーな石で雑誌などにも色々取り上げられて需要があったようです。私の仕事でもH8Sを使ってましたし。portsにh8用のgccもあったような。野良ビルドする人は当時からあんまりいないですね。

時は過ぎ去り2024年、AVRやARM、RISCVが花盛りな今、すでにディスコンなH8ですよ。野良ビルドしたのは以下のものです。ちなみにFreeBSD-14.0R上です。

  • binutils-2.42
  • gcc-13.2.0
  • gdb-14.2
  • newlib.4.4.0-20231231

gccのビルドに必要なgmp, mpfr, mpc, texinfo, gnu makeはpkgで入れます。また、新し目のNative gccも入れといてください。私はgcc12を使いました。

すでに複数gccが入っている場合は名前でソートしたときに一番前に来るものを使ったほうが良いです。ビルドするgdbがlibstdc++.so.6を要求するのですが、それぞれのgccが自分のlibstdc++.so.6を入れてくれているので、使ったgccとリンクされるlibstdc++.so.6の組み合わせが壊れて動かない、という現象が発生します(ハマりポイント)。ld.soが共有ライブラリを探す順番に影響されるのでldconfig -r で一覧を見て、一番最初にlibstdc++.so.6を提供しているgccを使う、というのが正しいです。

binutilsのconfigureです。お作法として展開したフォルダ内にビルド用のフォルダを掘ってそこでconfigureを動かします。インストール先はhomeのdev/h8300になります。

../configure --disable-nls \
 --target=h8300-elf --prefix=$HOME/dev/h8300

次にgccのconfigure。対象の言語はCのみです。CCとCXXは自身の環境のgccを入れてください。

../configure \
 --target=h8300-elf --prefix=$HOME/dev/h8300 --with-newlib \
 --disable-nls --enable-languages=c \
 --with-gmp=/usr/local --with-mpfr=/usr/local --with-mpc=/usr/local \
 --disable-gcov --disable-bootstrap --disable-libsanitizer --disable-libssp \
 --disable-libgomp --disable-libvtv \
 CC=gcc12 CXX=g++12

次にnewlibのconfigure。ここ( https://blueeyes.sakura.ne.jp/2019/05/22/2363/ )を参考にしました。非常にためになりました。

../configure \
 --target=h8300-elf --prefix=$HOME/dev/h8300 \      
 --disable-nls --disable-werror --disable-bootstrap \
 --disable-newlib-supplied-syscalls \  
 --enable-newlib-reent-small --disable-newlib-wide-orient \
 --enable-newlib-nano-malloc --enable-lite-exit \
 --enable-newlib-global-atexit  --enable-target-optspace

次にgdbの configure。MONIX用にgdb/h8300-tdep.c内にある h8300_break_insn[] をSleep命令からTRAPA #3 { 0x57, 0x30 } に書き換えてます。

../configure --disable-nls \
 --target=h8300-elf --prefix=$HOME/dev/h8300 \
 --disable-werror --disable-bootstrap \
 CC=gcc12 CXX=g++12 

無事にgmake; gmake installが完了すると自分のhomeの下、dev/h8300/bin/h8300-elf-gccが動くと思います。あ、gdbのsimはうまく動きませんでした。

動かしてる環境ですが、MONIX ( http://kuwa.s256.xrea.com/monix/index.html )のgdb-stub(udp)でデバッグ出来てます。break張って止めるだけですが。MMCカードからの読み込み、書き込みにも成功しました。AKI-H8/3069F LAN付きは16MbitのDRAMが乗ってて、書き込み回数を気にせず Try & Errorが出来るのでお試しには重宝します。

ただ、当初の目的であるところのAVRでSDカードの読み書きが、まだできてない

WordPress サイトを CloudFront で配信すると compress オプションを設定していても圧縮転送されない…

タイトルで言い切ってますが

CloudFront の「Compress Objects Automatically」ってオプションを有効にすると、対応しているブラウザに対しては圧縮転送をしてくれるはずなんですが、オリジンサーバが WordPress の場合、これが有効になりません。
css とか js なんかの静的ファイルはちゃんと圧縮してくれてるんですが

調べたところ、CloudFront で compress オプションが有効になるには、以下の条件があるようです。

  • The file must be of a type that CloudFront compresses.
  • The file size must be between 1,000 and 10,000,000 bytes.
  • The response must include a Content-Length header so CloudFront can determine whether the size of the file is in the range that CloudFront compresses. If the Content-Length header is missing, CloudFront won't compress the file.
  • The response must not include a Content-Encoding header.

Serving Compressed Files – Amazon CloudFront

これの「The response must include a Content-Length header so CloudFront can determine」が引っかかってるんですね
続きを読む

WordPress にバックドア仕掛けられないように…

いくら気をつけていても、不幸にして WordPress にバックドアを仕掛けられることは往々にしてあるものです。
重要なのは日々のアップデートと監視なのですが、間に合わずにやられちゃってバックドア仕掛けられることもあるでしょう。
先日リリースされた WordPress 4.5.2 でも結構重めの XSS 脆弱性の報告と修正が行われましたね。
WordPress 4.5.2 セキュリティリリース

そんなわけで、ひさ~しぶりのブログはバックドア仕掛けられないようにする防衛策とソースが改変された時の対応策です。
続きを読む

自作プラグインに追加した wp-cli コマンドの出力結果を整形しよう ( WP-CLI Advent Calendar 2014 18日目 )

WP-CLIアドベントカレンダーの18日目です。
昨日は @tecking さんの「ひっくり返るくらい超絶便利な wp media regenerate」でした。
今回は前回の続きです。

前回 wp-cli 対応させる方法について説明しましたが、一点出力フォーマットについて触れていませんでした。
てことで、今回はそのへんについて

続きを読む

自作のプラグインに wp-cli コマンドを追加しよう ( WP-CLI Advent Calendar 2014 11日目 )

WP-CLIアドベントカレンダーの11日目です。
昨日は @tecking さんの「bashかわいいよbash-さくらのレンタルサーバでも『WP-CLI』の入力補完機能を」でした。
今回は、自作のプラグインに wp-cli 用のコマンドを追加する方法についてです。
最近、Theme Check プラグインを wp-cli 対応させるコードを書いてプルリクした(まだ、マージされてない)ので、それを元に解説します。
wokamoto/theme-check

実際に追加したのは theme-check.php の下3行と、wp-cli.php です。
続きを読む

Chef で wp-cli を管理するためのレシピ ( WP-CLI Advent Calendar 2014 4日目 )

WP-CLIアドベントカレンダーの4日目です。
昨日は @tecking さんの「レンタルサーバに『WP-CLI』をサクっと入れるシェルスクリプト作ってみたよ」でした。
てわけで、今回の僕の記事はインフラ自動化フレームワーク Chef用の wp-cli レシピについて解説します。
Chef ってなんなの?って人はおググりください。
要するにインフラの構成管理を自動化するためのツールです。

wp-cli のインストールは通常公式サイトにもあるように github で公開されているリポジトリから wp-cli.phar を取ってきて実行権限を与え、パスが通っているところに置いてあげます。

$ curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
$ chmod +x wp-cli.phar
$ sudo mv wp-cli.phar /usr/local/bin/wp

ただ、これだと wp-cli のアップデートがあった時に再度手動でダウンロードして置き換えてあげないといけません。
めんどくせーですよね。
そんなわけで Chef の登場です。この github リポジトリを clone して適切にアップデートできるようにレシピを書いてあげましょう。
続きを読む

WordPress JSON REST API に独自の endpoint を追加する

先日、参加してきた WordCamp San Francisco 2014 でも話題になってた WP JSON REST API に独自の endpoint を追加する方法です。
# WordCamp San Francisco とか WordCamp Kansai とかのイベントにも参加してるんですけど、ブログ書いてないすいません

まず WP REST API とは、なんぞやって話ですが
これは、WordPress Ver.4.1 もしくはそれ以降のバージョンで本体に組み込まれる予定の機能です。
現在はプラグインとして提供されていますので、これをインストールすることで利用できるようになります。
WordPress › JSON REST API (WP API) « WordPress Plugins
この API を使うことで、WordPress に関するありとあらゆる操作が REST API 化され、結果が JSON で返ってきます。
例えば、この投稿に関する情報は以下の URL から取得できます。
https://dogmap.jp/wp-json/posts/3136

この API に対して独自の endpoint を追加する方法について解説します。
詳しいことは、以下の URL を参照してください。
Extending the API – WP REST API Documentation
続きを読む

WordPress プロフェッショナル養成読本

WordPress プロフェッショナル養成読本」という本を、@naokomcさん、@428designさん、@masatoshisomeyaさんとかと一緒に書きました。
と言っても、例のごとく出版社の人とは一度も会ったこと無いんですけどね。
もっぱら、やりとりはメールか Facebook だけ。現行の入稿も技評さんの GitLab サーバへの push で送るというリモートワークっぷり。
まったく良い時代になったもんです。
WordCamp Tokyo 2014 の会場内で先行販売されるようですので、そちらに行く予定のある人はぜひー

さて、僕が書いたのは第6章「WordPress ユーザのための Nginx 入門」って所です。
仕事でよく使う Nginx をネタにしてインストールから設定まで、はじめて Nginx 触る人でもなんとか WordPress を動かせるようにするところまではサポートしてるはずです。
(若干、駆け足気味ですが)

以下、僕の章の目次

  • Nginx とは? – Nginx のサーバ構成や特徴
  • Nginx で WordPress を利用するには – インストールと設定
  • Nginx の設定(基本編) – WordPress の運用に役立つ
  • Nginx の設定(応用編) – リバースプロキシ、ロードバランサ

続きを読む

WordPress プラグインで使う定数値はヘッダ部分で管理して get_file_data() で取得すると良いと思うけど、どんなもんでしょう

えー、タイトルの通りなんですが WordPress でプラグイン開発している時に非常に便利な関数として get_file_data() ってのがあります。
いま、久しぶりに Codex みたら、ほとんど説明を放棄してますね。
最近出た WordPressプラグイン開発のバイブルっていう本でちらっと触れておいたので、そこから引用します。

$plugin_data = get_file_data( __FILE__, array( 'version' => 'Version'));
$plugin_version = $plugin_data['version'];

プラグインやテーマのヘッダー情報を取得するには get_file_data() 関数を使用します。
プラグインの冒頭にはコメント形式でプラグイン名やバージョン、テキストドメインがヘッダー情報として書かれています。
たとえば、プラグインのバージョン情報をこちらから読み出し、wp_enqueue_script() 関数で JavaScript のバージョン情報を変更したり、翻訳ファイルのテキストドメインやドメインパスなどを取得して load_textdomain() 関数で翻訳ファイルを読み込むときに使用できると思います。
プラグインのヘッダー情報を使って一元管理ができるため、ソース中にハードコードする必要がなくなります。
また、他のプラグインやテーマのバージョンに依存するような処理を書きたい場合にも使えるでしょう。

WordPress に最初からついてくるプラグイン Hello Dolly のメタ情報を取得した結果は以下の通りです。

$data = get_file_data( ABSPATH.'wp-content/plugins/hello.php',
	array( 'name' => 'Plugin Name',
		'version' => 'Version',
		'uri' => 'Plugin URI',
		'description' => 'Description',
		'author' => 'Author',
		'author_uri' => 'Author URI',
		'textdomain' => 'Text Domain',
		'textdomain_path' => 'Domain Path',
	));
var_dump($data);
array(8) {
  ["name"]=>
  string(11) "Hello Dolly"
  ["version"]=>
  string(3) "1.6"
  ["uri"]=>
  string(41) "http://wordpress.org/plugins/hello-dolly/"
  ["description"]=>
  string(295) "This is not just a plugin, it symbolizes the hope and enthusiasm of an entire generation summed up in two words sung most famously by Louis Armstrong: Hello, Dolly. When activated you will randomly see a lyric from <cite>Hello, Dolly</cite> in the upper right of your admin screen on every page."
  ["author"]=>
  string(14) "Matt Mullenweg"
  ["author_uri"]=>
  string(13) "http://ma.tt/"
  ["textdomain"]=>
  string(0) ""
  ["textdomain_path"]=>
  string(0) ""
}

実は、この get_file_data() 関数なんですが、WordPress プラグインの規定のヘッダ情報だけでなく、独自にセットした情報も取ってくることができるんです。
続きを読む

WordPress でデータ連係するときのスニペット

実は、今夏にSBクリエイティブさんから発売される予定の「WordPress Plugin 本(タイトル仮)」を宮さん西川さん三好さん達と書いてました。
宮さんはすでにリーク済みですね。
管理画面におけるエラーメッセージの表示 | firegoby

僕が担当したのは、17章目の「プラグインクックブック」がメインになります。
ここでは WordPress プラグイン作成時に使ってるコードをサンプルコードとして提示して、それを説明するって感じで書いてます。
編集の人にも「一部公開しても良いよー」って言われたので、一部を公開しますね。

続きを読む