2021年12月20日月曜日

やるぞ!青色申告2021で印刷できない

パソコンにあまり詳しくない方からの連絡で、『やるぞ!青色申告』というアプリで印刷ができない!
という相談を受けまして、出張サービスに行ってきました
環境は Windows 10 64bit、『やるぞ!青色申告2021』がインストールされているパソコンです。
身内からのご相談なので、無償対応ですw

『やるぞ!青色申告』ってのは市販の申告用アプリで、こういっちゃなんだけどw使い勝手は良くないと感じますがw
値段が安いので使っている方も多いようですね。

さっそく起動して、「印刷」メニューから「元帳」を選んで、一部だけ印刷しようとすると

Acrobat Reader がインストールされていません

というエラーで、たしかに印刷できない。

ん? Acrobat Reader ならインストールされてるぞ・・・デスクトップにアイコンもあるしちゃんと起動もする。
おかしいな・・・
念のため、もう一回インストールしてみるか
ということで Adobe サイトから Acrobat Reader を再度ダウンロードしてインストーラを起動してみた。

すでにインストールされています。

なぜじゃ?
ということで、いろいろググッてみたところ、どうやら Acrobat Reader の 32bit版でなければならないらしいことをキャッチ。
Acrobat Reader を変える必要があるので、まず、インストールされている 64bit版の Acrobat Reader をアンインストールします。
Windows10 の「設定」メニューを開き、「アプリと機能」で「Adobe Acrobat Reader DC」をアンインストールします。


さて、32bit版のインストールです。
さっそく Acrobat Reader のダウンロードページを開きます。
https://get.adobe.com/jp/reader/
このページですね。


毎度インストールしてこようとする McAfee は不要なのでチェックボックスをOFFにしておきます。
しかーし。このままダウンロードすると、64bit Windows10 環境なので、64bit版がインストールされてしまいます。

32bit版をインストールするには、下のほうにある『別の言語版または別のオペレーティングシステムをお持ちですか?』のリンクをクリックします。
でもって、
手順1で「Windows 10」を選択
手順2で「Japanese」(日本語)を選択
手順3で「Reader DC xxxxxxxxxxx_xxxxxxxx Japanese for Windows」の64bitと書かれていない方を選択
不要な「McAfee」のチェックを外して「Acrobat Reader をダウンロード」を選択します。

あとは、インストールして再起動です。
『やるぞ!青色申告2021』を起動して、「印刷」メニューから「元帳」を選んで印刷してみました。
無事 Acrobat Reader に元帳が表示されて印刷できるようになりました
めでたしめでたし。

出張先の環境では、実際には最初は空白のページが Acrobat Reader に表示されていました。
何度か別の元帳を印刷しようとしたりしていたら、表示されるようになりました。
この回避策、パソコンにそれほど詳しくない人には対応できそうにないなーと思います。
開発元が対応すべきですよね!w

2021年12月6日月曜日

郵便番号から自動的に住所入力させる

cakePHP3 + bootstrap5 プロジェクトで郵便番号入力から自動的に住所欄を入力できるようにしてみました。

ふだん、css/jsはバージョンによって動きが変わったりしないよう、サーバ上にコピーして利用するようにしてますが 市区町村合併などで郵便番号が変化する場合があるので、こちらはgithubのサイトを参照するようにしてます。

[slip.ctp]

≤?php

$this->Html->script("//yubinbango.github.io/yubinbango/yubinbango.js", ['block' => true]);

?>

≤div class="col-md-6 h-adr">
    ≤span class="p-country-name" style="display:none;">Japan≤/span>
    ≤table class="table_client_info as_bd_cl">
        ≤tr>
            ≤th>≤input type="button" class="form-control as_button" value="着住所">≤/th>
            ≤th style="text-align: right;">郵便番号≤/th>
            ≤td>
                ≤input type="text" class="form-control p-postal-code" placeholder="郵便番号を入力" />
            ≤/td>
        ≤/tr>
        ≤tr>
            ≤th>住所1≤/th>
            ≤td colspan="2">
                ≤input type="text" class="form-control p-region p-locality p-street-address" placeholder="住所を入力" />
            ≤/td>
        ≤/tr>
        ≤tr>
            ≤th>住所2≤/th>
            ≤td colspan="2">
                ≤input type="text" class="form-control p-extended-address" placeholder="建物名、部屋番号を入力" />
            ≤/td>
        ≤/tr>

cssクラス部分は、サイズとか罫線を設定してます。
いやー。しかし、こりゃ便利だw
めでたしめでたし。

【追記】
最近になって、郵便番号での住所入力が必要になって、自分のブログを参照にしてみたら、なかなか動いてくれなかった(笑)
原因は、class="h-adr" を付加してなかったからでした。
上記の例では上部の div タグに設定してますね。
ここ、忘れないようにしてくださいw

cakePHP3:javascript 3桁単位でカンマを表示する数字入力

cakePHP3.9 + bootstrap5 の環境で金額入力のために3桁単位で自動で数字を入力できるようにしようとしたんですね。

cleave.js ってのが便利そうだったので使ってみました。

参考
フォームのinput要素に電話番号・日付・時間・金額など、数字のフォーマットを定義できるスクリプト -Cleave.js
https://coliss.com/articles/build-websites/operation/javascript/format-input-text-content-cleave.html

cleave.js
https://github.com/nosir/cleave.js

上記のサイトなどを参考にして、次のようなコードを javascript に記述してました。
[project.js]

    var cleave = new Cleave('.input-decimal', {
      numeral: true,
      numeralThousandsGroupStyle: 'thousand'
    });

[project.css]

    .input-numeral {
        text-align: right;
    }

[slip.ctp]

    ≤div class="row">
        ≤h6 class="col-4 d-flex align-items-center">小計≤/h6>
        ≤div class="col-8">≤input type="text" class="form-control input-numeral input-decimal" value="10,000" />≤/div>
    ≤/div>
    ≤div class="row">
        ≤h6 class="col-4 d-flex align-items-center">消費税≤/h6>
        ≤div class="col-8">≤input type="text" class="form-control input-numeral input-decimal" value="1,000" />≤/div>
    ≤/div>
    ≤div class="row">
        ≤h6 class="col-4 d-flex align-items-center">合計≤/h6>
        ≤div class="col-8">≤input type="text" class="form-control input-numeral input-decimal" value="11,000" />≤/div>
    ≤/div>

困ったことに、数字入力のinputタグが複数あると、上手く動いてくれなかったんです。
chrome の開発者ツールでは、以下のようなメッセージが出てしまいました。

cleave.min.js:8 [cleave.js] Multiple input fields matched, cleave.js will only take the first one.

いやいや、伝票入力画面に数値入力が一か所しかないなんてありえないでしょ!
ということで調べた結果、javascript を次のように変更しました。

[project.js]

    $('.input-decimal').toArray().forEach(function(field){
      new Cleave(field, {
        numeral: true,
        numeralThousandsGroupStyle: 'thousand'
      });
    });

伝票用のフォーム画面では、金額入力フィールドを動的に追加できるようにしましたが、追加の都度 new Cleaveするようにして、ちゃんと動いてくれました。
めでたしめでたし。

PHP ip2longの罠(2) ローカルIPアドレスが '::1'

XAMPPを使った cakePHP3のローカルな開発環境でブラウザ表示させる際に、$_SERVER['REMOTE_ADDR']を使ってIPアドレスを取得すると、localhostでは '::1' という値が返されてきた。

プログラムでは ip2long()関数を使って数値化されたIPアドレス値をデータベースに照合しているので、これじゃ使えない。

  $ip_address = $_SERVER['REMOTE_ADDR'];
  $ip_value = ip2long($ip_address);

実際、$ip_address='::1' の場合に $ip_value=ip2long('::1');を実行すると false が返ってきてしまっている。

WEBを検索すると、次の情報があったのでやってみた。(コントローラ内での呼び出し)

  $ip_address = $this->request->clientIp();

これでも、値は '::1' となる。こまったぞ・・・

よくよく考えると、自分のIPを返せばいいわけで。
次のコードでうまくいくようになった。

if($_SERVER["HTTP_HOST"] == "localhost")
{
	$ip_address = getHostByName(getHostName());
}
$ip_value = ip2long($ip_address);

無事取得できました。
めでたしめでたし。