Category Archives: プログラミング

WordPress プログラミング

WordPressテーマフレームワーク「Beans」の日本語翻訳ファイル作成方法

Published by:

WordPressテーマを作ろうと思ってテーマテンプレートを探していたら、「Beans」というテーマフレームワークのことを知りました。

beans-logo-contrast

さっそく試してみたらかなり良さげだったので、そのままページを作っていたところ、パンくずリスト(ページ階層を表示する部分)の先頭が「Home」になってる。
ここを日本語で「ホーム」にしたいなと設定してみました。

ビフォー

ビフォー

アフター

アフター

インストールするのは「Loco Translate」という翻訳サポートプラグインで、名前は知っていましたが使うのは今回初めてです。
使ってみて分かりましたがすごい便利です。potファイル(テンプレート)からpoファイル(言語別翻訳ファイル)、moファイル(言語別翻訳ファイルをコンパイルしたもの)を作ってくれるし、全部WordPressの管理画面の中で作業ができてしまいます。
やっぱりWordPressすごいなあ・・・

プラグインの新規追加で「Loco Translate」を検索&インストール&有効化して、管理メニューの「Loco Translate > Themes」を開きます。
Beansテーマフレームワークを使うときは子テーマを作って作業しますが、翻訳は親テーマの方を直接行いました。

loco1

Beansのpotファイルが通常の「<テーマディレクトリ>/languages/tm-beans.pot」ではなかったのでpotファイルが見つからないというエラーが出ています。
Advancedタブの「Template file」を「lib/languages/tm-beans.pot」と設定してあげたら読み込んでくれるようになりました。

loco4

Overviewタブで「(+) New language」をクリックして、「WordPress language」の方の「Japanese」を選択します。
location(保存先)は Otherの中の「languages/themes/tm-beans-.po」を選択しました。

loco2

そうするとpoファイル編集画面が表示されますので、Source Textから「Home」を選択してJapanese translationに「ホーム」と入力し、Saveボタンをクリックします。

loco3

な、なんと、これだけでpoファイルとmoファイルが同時に生成されて、画面上のパンくずリストにも表示されてしまいます!すごい!便利!
これまで Poedit 使って po 開いて mo 書き出して ftp でアップして・・・という面倒なことはいらないんですね。
ありがとう、Loco Translate!ありがとう、Beans!

ハードウェア ビットコイン プログラミング

ビットコインを普通のお財布に入れてみた

Published by:

Ledger Nano(レジャー・ナノ)
ハードウェアウォレット Ledger Nano

ハードウェアウォレット Ledger Nano

ビットコインを買ってみたい、でも以前ハックされたMt.Gox(マウント・ゴックス)のことを思うとオンラインウォレットに購入したビットコインを置いておくのは怖い。

投資目的ではなく、単に買ってみたい、持ってみたい、使ってみたいというだけなので、Ledger Nanoというハードウェア・ウォレットを購入してみました。

2014年2月にMt.Goxがハック&破綻する数週間前にもビットコインを買ってみようと思い、まさにそのMt.Goxにアカウントを作ったところでしたが、結局買えずじまいで2年以上経ってしまいました。

そのころは1BTC=8万円くらいで2015年は2~3万円、2016年9月の今は5万円~6万円くらいと大きく変動するビットコインですが、今回はcoincheck(コインチェック)という日本の取引所でごく少額を購入してみました。

coincheckで、0.1ビットコインを購入するところ

coincheckで、0.1ビットコインを購入するところ

購入したビットコインをそのままcoincheck(コインチェック)のオンライン・ウォレットに保管しておいても問題ない(はず)ですが、手元のLedger Nanoに移しておくことでオンライン上でハックされる恐れがなくなります。

スマホアプリやPCアプリにもウォレットはありますし、そちらの方が使い勝手は良いと思いますが、仮想通貨がリアルに手に持てるというのはちょっと面白い感覚ですよね。

ハードウェア・ウォレットへのビットコインの出し入れは、PCのUSBポートにさして専用アプリを経由して行います。
その際は4桁のPINコードとセキュリティカードが必要です。
(ハードウェアを紛失したりコードがわからなくなった時や、新しいハードウェアへ移すときなどにもリカバリーできるそうです)

Ledger Wallet Nanoのセキュリティーカード。 裏に換字コードが書かれています。

Ledger Wallet Nanoのセキュリティーカード。
裏に換字コードが書かれています。

実際のビットコインのやり取りにかかる時間ですが、最初の一回だけ4~5分待った気がします。
その後は数十秒で終わりましたので、思っていたよりずっとスピーディに出し入れできるんですね。

これまでオンライン決済には、クレジットカードや銀行振込を使っていて、最近はそれほど手間に感じることなく買い物出来ていましたが、銀行やクレジットカード会社のサーバーを一切介さず、これだけスマートに直接お互いやり取りできるというのは、とてつもない進化です。

ほんのわずかのビットコインを買ってみただけですが、この技術の桁違いの新規性に冷や汗をかきました。
正直ブロックチェーン技術についてはまだまだプログラマーとして無知な状態ですが、今後理解を深めておかないとまずいよなあ。

coincheck(コインチェック)はこちら ↓。画面の作りが使いやすいです。

日本で一番簡単にビットコインが買える取引所 coincheck bitcoin

Java プログラミング

PDF内のすべての画像に、一気に透かし文字(ウォーターマーク)を入れる

Published by:

あまりなさそうな状況ではありますが、せっかくプログラムを作ったので公開しておきます。
実装言語はJavaです。

必要なライブラリ

※slf4jとlogbackはログ出力に使っているだけなので、なくても良い。

コード

あーつかれた。

プログラミング

Eclipseの検索結果(検索ビュー)を複数表示

Published by:

検索ビュー

ガーン・・・・こんなことが出来たなんて知らんかったよ。

検索ビュー

単に、検索ビューの右上に表示される「検索ビューをピン止め」をクリックしておくだけ。
知ってた?みんな知ってたの???(涙)

検索結果一こずつにつき、検索をかけたいとき(たとえばメソッドの参照元検索:Ctrl+G)なんかに便利ですよね。。。

10年前から知っておきたかったなあ、これは。

プログラミング

chromeTouchをGitHubに放流

Published by:

長年気にしながらも完全放置していたchromeTouchを、GitHubへアップしました。

chromeTouch @ GitHub
https://github.com/smilkobuta/chromeTouch

アップしたのは現在リリースされているVer2.9ではなく、スクロールの方式を見直したVer3.0です。
最新版を試したいという手間を惜しまない方は、↑から試してみてくださいませ。。

いつかはオープンソースにしようと、開発当初からコメントも英語でつけていたのですが、こんなにほったらかしになるとは・・・(汗)

フリーで公開していましたので、何十万件ダウンロードされても1円にもならず、ついつい更新も二の次三の次になりがちで、タブレットが一般的に使われるようになった今となっては、もはやナンセンスなソフトウェアになってしまったかもしれません。

でも、PCでGoogle Chromeを使うときはやっぱり便利なので、私自身は使い続けています。
今後どなたかがバージョンアップして下さったりフォークして下さったりしてくれちゃったりしたら、ぜひ使ってみたいです。

プログラミング 学習

JavaScript絵かき歌

Published by:

1.かっこが2つあったとさ~♪
()()

2.後ろにセミコロンもついてきて♪
()();

3.jQueryかな?
()(jQuery);

4.functionだよ♪
(function(){})(jQuery);

5.コインを入れたら♪
(function($){})(jQuery);

6.あっという間にかわいいお財布(容れモノ)のできあがり~♪
(function($){ 
    
})(jQuery);

JavaScriptでグローバル変数を使わない方法で紹介した、正しいJavaScriptコードの書き方を覚えるための絵かき歌(コードかき歌?)です。
こういう順番で書くことを覚えると、いちいちコピペしなくても済みますよ♪

プログラミング

JavaScriptでグローバル変数を使わない方法

Published by:

JavaScriptでグローバル変数を減らす方法という記事がTwitterでリツイートされてきたので、ツッコんでおきます。

↓正しくはこうです。

(function(){
    var x = 1;
    var y = "こぶたのラッパ";
    
    function my_func() {
        alert(y);
    }
    
    my_func();
})();

↓jQueryを使う場合は、こう。

(function($){
    var x = 1;
    var y = "こぶたのラッパ";
    
    $(function(){
        my_func();
    });
    
    function my_func() {
        alert(y);
    }
})(jQuery);

グローバル変数はJavaScript実行環境が提供してくれている window とかを参照するためのもので、自分で定義するものではありません。
JavaScriptコードはコピペしてなんぼのものが多いので、グローバル変数を使わずコピペされやすいコードを書きましょう!

Android プログラミング

Nexus7用エミュレータが起動しない、「Unfortunately, Launcher has stopped.」の直し方

Published by:

Android爆速エミュレータ環境の作り方」を参考にして、Intel CPU版の快速Nexus7用エミュレータ環境を作れたのですが、たまにエミュレータが起動しなかったり、ランチャー(アプリ一覧)を開くと「Unfortunately, Launcher has stopped.」のメッセージが出て操作できなくなることがあります。

そんな時は、「C:/Users/<ユーザー名>/.android/avd/<AVD名>.avd/config.ini」を次のように修正すると直りますよ!

config.ini

hw.ramSize=1024MB ← 「hw.ramSize=1024」に「MB」をつける。
vm.heapSize=64MB ← 「vm.heapSize=32」とかになってたら増やしてあげる。

プログラミング

PHPExcelでセルの入力規則に名前定義を使う方法

Published by:

PHPExcelとはPHPでExcelを読み書きするための便利ツールですが、一度はまると泥沼に陥りやすいので、取り扱いに非常~に注意が必要です。

そんな泥沼の一つからやっと生還したので、ブログに書き残しておこうと思います。

上手のようなものをPHPExcelで動的に行おうと思ったのですが、ニッチもサッチもいかない。
「Excel2007」のWriterだと $validation->setFormula1(‘=野菜’); で簡単に出来るのですが、要件的にExcel2003への対応が必須だったため、どうしても「Excel5」のWriterで吐き出される必要がある。

最終的にうまくいったのですが、PHPExcelのコードの修正が必要です。

■PHPExcel/Writer/Excel5/Worksheet.php(PHPExcel 1.7.7)
2844:                // formula 1
2845:                try {
2846:                    $formula1 = $dataValidation->getFormula1();
2847:                    // >>> Added by S.Sakai
2848://                    if ($type == 0x03) { // list type
2849:                    if ($type == 0x03 && preg_match('/^\".*\"$/', $formula1)) { // list type
2850:                    // <<< Added by S.Sakai

2851:                        $formula1 = str_replace(',', chr(0), $formula1);
2852:                    }
2853:                    $this->_parser->parse($formula1);
2854:                    // >>> Added by S.Sakai
2855:                    if (is_array($this->_parser->_parse_tree)
2856:                            && strtoupper($this->_parser->_parse_tree['value']) == 'INDIRECT') {
2857:                        $this->_parser->_parse_tree['force_reference'] = true;
2858:                    }
2859:                    // <<< Added by S.Sakai

2860:                    $formula1 = $this->_parser->toReversePolish();
2861:                    $sz1 = strlen($formula1);
2862: 
2863:                } catch(Exception $e) {
2864:                    $sz1 = 0;
2865:                    $formula1 = '';
2866:                }

■PHPExcel/Writer/Excel5/Parser.php(PHPExcel 1.7.7)
616:    // >>> Added by S.Sakai
617://    function _convertFunction($token, $num_args)
618:    function _convertFunction($token, $num_args, $force_reference)
619:    // <<< Added by S.Sakai

620:    {
621:        $args = $this->_functions[$token][1];
622://        $volatile = $this->_functions[$token][3];
623:
624:        // Fixed number of args eg. TIME($i,$j,$k).
625:        if ($args >= 0) {
626:            return pack("Cv", $this->ptg['ptgFuncV'], $this->_functions[$token][0]);
627:        }
628:        // Variable number of args eg. SUM($i,$j,$k, ..).
629:        if ($args == -1) {
630:            // >>> Added by S.Sakai
631://            return pack("CCv", $this->ptg['ptgFuncVarV'], $num_args, $this->_functions[$token][0]);
632:            if ($force_reference) {
633:                return pack("CCv", $this->ptg['ptgFuncVar'], $num_args, $this->_functions[$token][0]);
634:            } else {
635:                return pack("CCv", $this->ptg['ptgFuncVarV'], $num_args, $this->_functions[$token][0]);
636:            }
637:            // <<< Added by S.Sakai

638:        }
639:    }


1571:        // if it's a function convert it here (so we can set it's arguments)
1572:        if (preg_match("/^[A-Z0-9\xc0-\xdc\.]+$/",$tree['value']) and
1573:            !preg_match('/^([A-Ia-i]?[A-Za-z])(\d+)$/',$tree['value']) and
1574:            !preg_match("/^[A-Ia-i]?[A-Za-z](\d+)\.\.[A-Ia-i]?[A-Za-z](\d+)$/",$tree['value']) and
1575:            !is_numeric($tree['value']) and
1576:            !isset($this->ptg[$tree['value']]))
1577:        {
1578:            // left subtree for a function is always an array.
1579:            if ($tree['left'] != '') {
1580:                $left_tree = $this->toReversePolish($tree['left']);
1581:            } else {
1582:                $left_tree = '';
1583:            }
1584:            // add it's left subtree and return.
1585:            // >>> Added by S.Sakai
1586://            return $left_tree.$this->_convertFunction($tree['value'], $tree['right']);
1587:            return $left_tree.$this->_convertFunction($tree['value'], $tree['right'], $tree['force_reference']);
1588:            // <<< Added by S.Sakai

1589:        } else {
1590:            $converted_tree = $this->_convert($tree['value']);
1591:        }

CONCATENATE(“野菜”)の部分をCONCATENATE(“野菜_”,A2)のように変えれば、ほかのセルの入力値を使ってさらに動的な入力規則を設定できるようになりますよ。

今日は丸一日これにドはまりでした。
PHPExcelには、このページをそのまま通知しようかな。。

あ、あとPHPExcelで困っている人にお勧めなのが、下の2つです。

それではお休みなさい (つ_-*)。οΟ ゜

プログラミング 学習 発表、ニュース

Ajaxプログラミング講座と「団話」

Published by:

リアルタイムチャットシステムの団話(だんわ)っていうのをリリースしました。
今年の春頃に、必要があってちょっと作ったものですが、数あるリアルタイムチャットと比べて、これがすごい!!というのは今のところありません。
ただ、来週から開催予定の「Ajaxプログラミング講座」で活用できないかと、公開サーバー上に上げてみたというところです。

で、「Ajaxプログラミング講座」ですが、要するに今どきのWebアプリを作るときにはマスト技術であるJavaScriptをみっちり学ぼうという趣旨のものです。

夜19時から21時半までの2時間半×4回の日程で(場所は四谷三丁目)、まだまだまだ空きがありますので、気になる方はご参加をご検討くださいませ。

参加できないよ~という方も、団話でもしかしたら感触を見られるかもしれませんので、乞うご期待!
ちっとも団話に上がってこない可能性もありますので、そこのところはご容赦を~。

団話の今後の展開としては、API化して、いくつか検討中の仕組みに組み込もうかと思っています。