コンテンツへスキップ

やりたいこと

指定した条件を判定し、処理を分岐したい。
指定する条件が複数あり、これらを配列で指定する。
配列内容を確認し、条件にマッチするか判定する。

具体的には、日付と数字の組み合わせで判定を行う。
日付+数字(じゃんけん何戦目か)

これは、2020年3月30日週の第3戦目のめざましじゃんけんが、ポイント2倍になったので、この機能を作りこむことにした。

実装方法

条件を配列に登録する。

  • 日付:条件となる日付を配列で指定
    define('DOUBLE_DATE',['2020-03-30','2020-03-31','2020-04-01','2020-04-02','2020-04-03'])
  • 数字:条件となる数字を配列で指定 define('DOUBLE_TIMES',[3])

配列内に存在する値かを「in_array」関数で判定する。
似た関数で「array_search」関数がありますが、array_searchは指定する値が配列の何番目かを検索します。
in_arrayは、単純に指定する値がある・ないを判定します。

実装サンプルソースコード

 

 

コロナウィルス関連向けTwitterハッシュタグによる話題追跡

何か、出来ないかと考え、このプラットフォームを準備しました。
偶然、バズったり話題となった内容は、メディアや公的機関も対処してくれる時代。

まずは、2つのハッシュタグを準備し、これらハッシュタグのツイートとRT数をウォッチします。
ツイートの一覧ページも公開するので、利用されれば、それなりに情報も整理しやすくなると思います。

ハッシュタグ #必要な情報コロナ新しいウィンドウで開きます  #困ってるコロナ新しいウィンドウで開きます のツイートより話題ツイートを一覧化しています。

  • #必要な情報コロナ 必要としている情報をtweetするときに用います
  • #困ってるコロナ 困っている情報をtweetするときに用います

試行段階なので、利用状況を見て更新して行きます。

話題のツイートを纏めたページはこちら
コロナ関連(必要な情報や困ってる情報)の話題ツイート(tweet)

必要なタグ、プラットフォームを利用したいなどは、お気軽にご連絡下さい。

他の用途でも有用な利用方法があると思います。

絵文字は大変

絵文字関連記事:UTF-8 のEmoji利用について

結論は、DBへの文字列入力時にエラーで失敗します。
文字列としてでなく、DBへ登録(バイナリなど)もできると思いますが、文字列は文字列として登録し、検索なり文字列としての処理ができる形で保存したほうが良いと思います。
やはり、文字列は削除して、DBの文字列登録は行います。

以下が、PHPで文字列を登録しようとした際に出力された、エラーコードです。

そして、以下が失敗したtweetです。失敗したtweet

本来したかったtweet

めざましじゃんけんの対戦相手は、めざましてれび公式のtweet

PHPを利用した Emoji 絵文字を削除するコード

絵文字を削除するPHPコードとなります。

PHP で PEAR を用いてメール送信

プログラム言語により、お作法も異なり、文字コードなど、
未だに気にすることの多い、メール送信。
今回は、PHPのPEARライブラリを用いてメール送信するコードを紹介します。

別の環境では、ローカルサーバーにSSMTPを導入し、PHPからのメール送信を実現しました。
参考URL:PHPからSSMTP経由でメール送信

PHP PEAR および Mailパッケージの導入

以下のコマンドで、php-pearとMailパッケージの導入が行なえます。

以前にRaspberry Piへ導入時の記事を公開しているので、必要に応じて参考にして下さい。
Raspberry Pi にPHP PEARライブラリー導入

PHPコードのサンプル

以下、PHPコードのサンプルとなります。

 

Twitter 日本語投稿時の文字数・バイト数チェック

何度か、最大文字数を超えて、投稿エラーとなりました。
Twitterの文字数制限は、欧米のアルファベットユーザー対象に140文字から280文字となった経緯があります。
ただし、マルチバイト文字(日本など)向けのユーザーは、140文字の文字数制限のままでした。
実際には、半角文字と全角文字を組み合わせると、140文字以上の文字数が投稿出来たりできておりました。とりあえず、バイト数を数えて、280文字で投稿していたのですが、上手く行かないケースが多々ありました。

以下サイトを見て、最大文字数の確認方法を変更しました。

Twitterの最大文字数と最大バイト数の関係を調べてみた

  • 利用したいハッシュタグを配列登録 (ランダムで選択)
  • 280文字対応 (以前は、280バイト前後で考えていた)
    $max_char = 280 + $url_char - 11.5;
    URLは一律11.5文字でカウント
    投稿文全体で、280としておけば間違いないと思います。
    mb_strwidth($tweet_text) < $max_char
  • ハッシュタグの「ー(ハイフン)」を「_(アンダースコアー)」へ
  • URL1件投稿時の最大文字数対応(必要に応じてハッシュタグ部分を削減で対応)

文字数のカウントは、mb_strwidthを利用します。
mb_strwidth:半角文字は 1 として、 全角文字は 2 として数えます。

strlen  関数は単純にバイト数、mb_strlen  関数は半角・全角関わらず1文字とカウント、Twitterの特殊ルールに合わせるなら、 mb_strwidth  を使うのが確実です。

Twitterへアプリ登録

(PHPから実行時に必要となる、API Key、API Secret Key、Access Token、Access Token Secretの取得を行います

PHPからTwitterへの操作は、TwitterOAuthというライブラリを用います。

  1. Twitterへの開発者登録とApp登録
  2. TwitterOAuth導入

Twitterへの開発者登録とApp登録

Twitterの以下のURLへアクセスし、登録をすすめます。

上のURLよりサービスにログインします。

ログイン後の画面です。右上の「Create an app」をクリックします。

「Create an app」を押すと、最初に開発者アカウントへの登録へ誘導されます。

一番の開発理由を聞かれます。「Professional」これは通常ビジネス目的、「Hobbyist」趣味なので、個人利用は通常このカテゴリとおもいます。
今回は、API経由でTweet・Postを行いたいので、Making a botを選択しました。BOTの作成。

アカウント情報の確認をされました。通常問題ないと思います。

1,居住国、2.呼び名を聞かれました。それぞれ、Japanと「(適当に)mikiie」と登録しました。

アプリの説明をフリーフォーマットで記載しました。
WEB翻訳などで準備した内容を貼り付ければOKです。

追加の質問事項に回答します。
Twitter情報を分析Analyzeするか? Tweet,Retweet, Like, Followなどを実施するか?
また、フリーフォーマットで、開発対象の機能内容の記載が必要でした。

これまでに記載や選択した内容のサマリ画面が表示され、間違いがないか確認を行い、「Looks good!」を選択します。

最後に利用規約に同意し、Submit Application(申請を送信)すると、利用申請の結果がメールで届きます。

利用申請後に着信した利用申請結果メールのリンクよりアクセスすると、Welcome画面が表示されます。

開発登録者完了後に、Create an appを実施するとアプリの作成が行えます。
コールバックURLを登録する必要がありまうが、PHPが動作するサーバで問題ないとおもますので、http://127.0.0.1/と登録しておけば問題ないです。

最後に、Keys and TokensでアプリのAPI Keysを取得します。
(API Key、API Secret Key、Access Token、Access Token Secretの取得を行います

PHPからTwitterに投稿 TwitterOAuth導入

TwitterOAuth

GitHub-twitteroauth

V1.1 Source code (tar.gz)

TwitterOAuthをダウンロードし、PHPを利用したいサーバに配置します。

  1. ライブラリのダウンロード
  2. tar.gzの解凍
  3. フォルダ名の変更

以下、一番簡単なサンプルPHPです。

Jetson Nanoからのメール送信

NVIDIA Jetson Nanoの利用を開始すると、Jetson Nanoの各種モジュールへ通知先のメールアドレスを設定することがあります。
パッケージのアップデートやログのローテーション処理時のエラーなどもメール通知することが可能です。

今回は、SSMTPをJetson Nanoに導入し、PHP経由で以前に構築したSynology SMTPを経由し、e-mailを送信できる環境の構築を行います。
SynologyでSMTP(メールサーバ)構築

ssmtpインストール

ssmtp.confを編集。

PHP構成定義ファイル(php.ini)変更

php.iniのファイルパス確認

PHPの利用するコンフィグファイルを確かめます。
コマンドラインで実行する場合は、WEBサーバで利用するコンフィグファイルは、通常異なります。

コマンドライン向けPHP構成ファイルphp.iniのsendmail_pathを変更

PHPのメール送信サンプルスクリプト

メールヘッダーにマルチバイト文字を利用する際は、mb_encode_mimeheaderを用いて、エンコーディングを行います。

php-mbstringをインストール

php-mbstringを導入していないと、エラーとなります。

PHP Fatal error: Uncaught Error: Call to undefined function mb_encode_mimeheader()

created by Rinker
NVIDIA
¥15,600 (2020/09/27 22:26:45時点 Amazon調べ-詳細)

Rapberry PiからPHPでメール送信(SSMTP経由)

PHPの利用するコンフィグファイルを確かめます。
コマンドラインで実行する場合は、WEBサーバで利用するコンフィグファイルは、通常異なります。

コマンドライン向けPHP構成ファイルphp.iniのsendmail_pathを変更

PHPのメール送信サンプルスクリプト

メールヘッダーにマルチバイト文字を利用する際は、mb_encode_mimeheaderを用いて、エンコーディングを行います。

SSMTP利用時のFromアドレス

SSMTPの設定によって、メールを送付するプログラムで指定したFromアドレスが無効化されます。プログラムで指定したFromアドレスを有効化するために、ssmtp.confの設定を確認します。

テレビの電源オンオフ

他のリモコン操作の家電も同様ですが、現在の状態把握が難しいです。NatureRemoで電源オンとスケジュールしていても、実際は、電源ボタンを押すのみで、電源が消えていれば、電源ボタン操作で電源がオンとなりますが、電源オン状態であれば、電源操作により電源オフ状態と期待通りになりません。

HDMI接続によるCEC(Consumer Electronics Control)

結構盲点でした、物理的にテレビに接続し、制御可能なデバイスが既に導入されていたとは。Raspberry PiのHDMI端子を活用し、テレビのON/OFF(STANDBY)変更操作となります。電源のON/OFF(STANDBY)状況を確認することも可能です。

HDMIのCEC(Consumer Electronics Control)は、機器間を制御するリンク機能となり、SONYだとブラビアリンク、東芝だとレグザリンク、パナソニックだとビエラリンク、SHARPだとAQUOSファミリンクとなります。

cec-utilsインストール

Raspberry Piの電源起動時に、TVの入力が切り替わったり、TVの電源が入らないよいうに、boot/config.txthdmi_ignore_cec_init=1を追記します。

cec-utilsコマンド実行

状態確認:sudo cec-client -l

HDMIケーブル未接続時

HDMIケーブル接続時

TV電源ON:echo 'on 0' | cec-client -s

アクセス権によりコマンド失敗

アクセス権を変更変更

tvserviceが起動していてコマンド失敗

tvservice --offが必要

TV電源OFF:echo 'standby 0' | cec-client -s

PHPから実行

参考にさせて頂いたサイト

Raspberry PiとテレビをHDMI接続してテレビのON/OFFを確認する

RaspberryPi コマンドでテレビ電源をオンオフする(cec制御)echo 'on 0' | cec-client -s

SynologyのphpMyAdminセッションタイムアウト変更

phpMyAdminの設定ファイル「config.inc.php」を変更します。
具体的には、「config.inc.php」の最終行に、設定したいタイムアウト値を秒指定で登録します。
$cfg['LoginCookieValidity'] = 86400; //タイムアウト24時間と設定する場合

電源状態確認(PING実行)

システム起動前に各機器の電源状況を確認します。
PING以外も考えられましたが、やはり枯れている定石なやり方が一番でした。
ちなみに、システム稼働後の電源OFF時にも電源状態確認後に、電源OFFを実施しています。

対象機器は、TVとWindowsのメインPCとなります。

PHPによるPING実行

以下ソースコードです。
PHPコマンドオプション「-c」「-n」の繰り返し回数指定がOSにより異なるので、実行環境に合ったコマンドオプションに変更。

参考にさせて頂いたサイト