phpのバージョンを5.6から7.4に更新

WordPressの管理画面で、phpのバージョンが古く、SyntaxHighlighter が更新できない状態となっていましたが、しばらく対応できていませんでした。やっと時間ができたので下記のサイトを参考に対応しました。
https://qiita.com/heimaru1231/items/84d0beca81ca5fdcffd0

サイトの手順を参考に、php7.4にバージョンアップを行いましたが、wordpressが起動しなくなりました。
下記のような画面になります。

httpdのerror_log を確認すると下記の場所でエラーになっていることがわかりました。

wp-content/plugins/statpress-reloaded/statpress.php on line 1719

Statpress というプラグインが問題のようなので、一旦 phpのバージョンを5.6に戻し
wordpressの設定コンソールから、Statpressを無効化しました。

$ sudo systemctl stop httpd
$ sudo yum remove php-*
$ sudo yum install --disablerepo=* --enablerepo=epel,remi,remi-safe,remi-php74 php php-cli php-common php-gd php-imap php-mbstring php-mysql php-pdo php-pear php-process php-xml
$ sudo  systemctl restart httpd

再度、phpのバージョンを5.6から7.4に更新し、Wordpressが無事に起動しました。
phpのバージョンが古いことで、SyntaxHighlighter が更新できなかったのですが、これで課題が解決しました。 

StatPress自体は、すでに提供が停止されてしまったプラグインのようです。
https://wordpress.org/plugins/statpress-reloaded/



ラズパイからAmbientにCPU負荷と温度、湿度を送信する

ラスパイから、AmbientにCPU温度、CPU負荷、室温、湿度のデータをアップロードして可視化してみました。

Ambientサービスのチャンネル作成

下記のサイトでアカウントを作成し、データをアップロードするチャンネルを作成します。
https://ambidata.io/

今回は、Raspberry Pi というチャンネルを作成しました。チャンネル一覧に表示される、チャンネルID、リードキー、ライトキーは、データのアップロードに必要となります。

チャンネル一覧

チャンネルの設定は、下記のようにしました。データは8個まで送信でき、今回は、データ1~4までを使用して、CPU温度、CPU負荷、室温、湿度を割り当てました。

チャンネル設定

ラズパイへの温度センサー接続ラズパイへの温度センサー接

ラズパイで、室温、湿度を計測するための温湿度センサーを接続します。今回は、DHT22を使用しました。
使用するラズパイは、Raspberry Pi 3B+で、 ラズパイとDHT22を右のように接続しました。Raspberry Pi 4Bでも同様の接続になるかと思います。
使用するDHT22は、抵抗含めてモジュール化された3PIN接続のものです。使用するセンサーによっては抵抗の追加などが必要になるかと思います。

DHT22接続
PINGPIODHT22
25V Power+ (プラス)
35Ground– (マイナス)
36GPIOOUT

GPIOアクセスのパーミッション設定

DHT22を使用するには、GPIOの制御が必要になります。下記のサイトを参考に、GPIO制御のパーミッションを設定しました。
https://askubuntu.com/questions/1247005/controlling-gpio-on-ubuntu-20-04-64-bit-arm-raspberry-pi

今回使用する環境のOSは、Ubuntu 20.04 です。Raspbian 等のOSを使用している場合は、 設定が異なる可能性があるので参考程度にご覧ください。
lsb_releaseコマンドの出力結果は下記のとおりです。

$ lsb_release -d
Description:    Ubuntu 20.04.2 LTS

rpi.gpio-common のパッケージをインストールします。

$ sudo apt install rpi.gpio-common

デバイス接続時のルール作成。viで、/etc/udev/rules.d/60-rpi.gpio-common.rules を作成しました。

$ sudo vi /etc/udev/rules.d/60-rpi.gpio-common.rules

設定ファイルの内容は下記の通り。

SUBSYSTEM=="bcm2835-gpiomem", KERNEL=="gpiomem", GROUP="dialout", MODE="0660"
SUBSYSTEM=="gpio", KERNEL=="gpiochip*", ACTION=="add", PROGRAM="/bin/sh -c 'chown root:dialout /sys/class/gpio/export /sys/class/gpio/unexport ; chmod 220 /sys/class/gpio/export /sys/class/gpio/unexport'"
SUBSYSTEM=="gpio", KERNEL=="gpio*", ACTION=="add", PROGRAM="/bin/sh -c 'chown root:dialout /sys%p/active_low /sys%p/direction /sys%p/edge /sys%p/value ; chmod 660 /sys%p/active_low /sys%p/direction /sys%p/edge /sys%p/value'"

ユーザーをdialoutグループに追加して再起動します。

$ sudo adduser $USER dialout
$ sudo reboot

データ送信のスクリプト作成

次に、Ambientへのデータ送信用スクリプトを作成します。
ラズパイのCPU温度取得に、vcgencmd を使用するので、下記のパッケージをインストールしました。

$ sudo apt-get install libraspberrypi-bin

$ sudo -H pip3 install psutil
$ sudo -H pip3 install Adafruit_DHT
$ sudo -H pip3 install git+https://github.com/AmbientDataInc/ambient-python-lib.git

スクリプトは、どこに作成してもよいのですが、今回は、$HOME/bin/bin/ambi_pi_temp.py というファイル名で保存しています。
チャンネルID、リードキー、ライトキーは、ご自身の環境に合わせて修正してください。

#!/usr/bin/python3

import datetime
import psutil
import subprocess
import time

import ambient
import Adafruit_DHT as DHT

AmbiChannelID=<チャンネルID>
AmbientReadKey="<リードキー>"
AmbiWriteKey="<ライトキー>"
			
# read data using pin 16
pin=16

def is_float(s):
  try:
    float(s)
  except ValueError:
    return False
  else:
    return True
              
def res_cmd(cmd):
  return subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True).communicate()[0]

def get_raspi_temp():
  cmd = ("vcgencmd measure_temp | sed -e 's/temp=//g' -e \"s/'C//g\" | tr -d '\n'")
  return res_cmd(cmd).decode('utf-8')

def get_room_temp():
  for num in range(30):
    humidity, temperature = DHT.read(DHT.DHT22, pin)
    if is_float(temperature) and (-40.0 < temperature < 80.0) and is_float(temperature) and (0.0 < humidity < 100.0):
      break
    time.sleep(0.5)
  return humidity, temperature
    
if __name__ == '__main__':
  ambi = ambient.Ambient(AmbiChannelID, AmbiWriteKey)
  pi_temp = get_raspi_temp()
  pi_load = psutil.cpu_percent(interval=1, percpu=False)
  humidity, temperature = get_room_temp()
  dt_now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
  print("[%s] Raspi temp:%5s'C CPU: %5s%%"  % (dt_now, pi_temp, pi_load))
  print("[%s] Room  temp: %3.1f'C humidity: %3.1f%%" % (dt_now, temperature, humidity))
  r = ambi.send({"d1":pi_temp, "d2":pi_load,
                "d3":temperature, "d4":humidity})

スクリプトに権限を付与します。

$ chmod 777 ~/bin/ambi_pi_temp.py

単体でスクリプト実行してエラーが発生しなければ、データがアップロードできていると思います。

$ ./ambi_pi_temp.py
[2021-07-18 11:34:45] Raspi temp: 39.2'C CPU:   0.0%
[2021-07-18 11:34:45] Room  temp: 30.0'C humidity: 52.2


cronで5分周期でデータを送信するようにします。

$ crontab -e

エディタが起動したら、下記の一行を追加します。これで、5分周期でコマンドが実行されます。

*/5    *       *       *       *       ~/bin/ambi_pi_temp.py > /dev/null 2>&1

Ambientのサイトでアップロードの内容を確認

Ambientのサイトに戻り、チャンネル一覧から今回作成したチャンネルを設定します。
今回は、下記のようなチャンネル設定にしています。

設定画面を閉じるとグラフが表示されます。

これでラズパイからの温度データアップロードは終了です。次回は、MQTTコマンドでデータ送信がアップロードできるようにしたいと考えています。

Giteaバージョンアップ

Gitea のバージョンアップを行いました。備忘録として手順を残しておきます。Giteaをインストールしているのは、GitLabを導入しようとしたのですが、非力なPCでは重たくて動作しなかったため軽量なGitサーバとしてGiteaを選択しています。初回インストール時のt手順は、残せていなかったのでバージョンアップ手順とります。

Giteaをインストールしているサーバは、CentOS 7で、更新前のバージョンは下記のとおり。

$ gitea --version
Gitea version 1.9.3 built with GNU Make 3.82, go1.11.5 : bindata, sqlite, sqlite_unlock_notify

Giteaのサイト(https://docs.gitea.io/)にインストール手順が記載されていますので、それに従いインストールを行います。バイナリからのインストール手順が記載されていますが、下記のエラーが出力され実行できません。

$ ./gitea-1.9.3-linux-amd64
FATAL: kernel too old
Aborted

OpneVZ系のVPSサーバではカーネルのバージョンアップができないため、ソースコードからのインストールを実行します。

ビルド前準備

対応時点では、ソースコードのビルド環境の条件は、下記の通りでした。

  • go 1.14 以上
  • node 12.17 以上
  • make

下記の通り、node のバージョン以外は、条件を満たせていたので、nodeだけバージョンアップしました。

$ go version
go version go1.15.5 linux/amd64
$ node --version
v0.10.21
$ make --version
GNU Make 3.82
Built for x86_64-redhat-linux-gnu
Copyright (C) 2010  Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

node は、 nvm で管理している。

https://github.com/nvm-sh/nvm を参考にバージョンアップします。一応、nvmのインストール手順も含めて記載しておきます。

  1. nvmのインストール
$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash

2. nvmコマンドのPATHを通す

.bashrc に下記の内容を追記し、読み込みます。

export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # This loads nvm bash_completion

再ログインするか、sourceコマンド(source $HOME/.bashrc)で、PATH設定を反映します。

3. LTSバージョンのnodeをインストール

$ nvm install --lts
$ nvm alias default "lts/*"
$ node --version
v14.17.0

Giteaのビルド

Giteaのソースコードを取得し、ビルドを行います。

$ git clone https://github.com/go-gitea/gitea
$ cd gitea
$ git checkout -b v1.14.2 v1.14.2
$ TAGS="bindata sqlite sqlite_unlock_notify" make build

ビルド中下記のエラーが発生してNGとなりました。

<--- Last few GCs --->

[19126:0x5e3f270]   853596 ms: Mark-sweep (reduce) 509.4 (513.7) -> 509.0 (515.2) MB, 3292.9 / 0.0 ms  (average mu = 0.130, current mu = 0.022) allocation failure scavenge might not succeed


<--- JS stacktrace --->

FATAL ERROR: MarkCompactCollector: young object promotion failed Allocation failed - JavaScript heap out of memory
 1: 0xa222f0 node::Abort() [webpack]
 2: 0x96411f node::FatalError(char const*, char const*) [webpack]
 3: 0xb97f1e v8::Utils::ReportOOMFailure(v8::internal::Isolate*, char const*, bool) [webpack]
 4: 0xb98297 v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, bool) [webpack]
 5: 0xd52fd5  [webpack]
 6: 0xd83bbe v8::internal::EvacuateNewSpaceVisitor::Visit(v8::internal::HeapObject, int) [webpack]
 7: 0xd8fbf6 v8::internal::FullEvacuator::RawEvacuatePage(v8::internal::MemoryChunk*, long*) [webpack]
 8: 0xd7bd8f v8::internal::Evacuator::EvacuatePage(v8::internal::MemoryChunk*) [webpack]
 9: 0xd7c008 v8::internal::PageEvacuationTask::RunInParallel(v8::internal::ItemParallelJob::Task::Runner) [webpack]
10: 0xd6e8e9 v8::internal::ItemParallelJob::Run() [webpack]

heapのサイズを環境変数で設定して再ビルドします。

$ export NODE_OPTIONS="--max-old-space-size=2048"
$ TAGS="bindata sqlite sqlite_unlock_notify" make build

今回は、アップデートのため、ビルドが成功したら、giteaのバイナリを差し替えて終了です。

$ ./gitea --version
Gitea version 1.14.2 built with GNU Make 3.82, go1.15.5 : bindata, sqlite, sqlite_unlock_notify
$ sudo systemctl stop gitea.service
$ sudo mv /usr/locak/bin/gitea /usr/local/bin/gitea.v1.9.3
$ sudo cp gitea /usr/local/bin
$ sudo systemctl restart gitea.service

ブラウザで、Giteaのサイトを表示して、サイト一番下にあるバージョン表記が下記のように更新されていれば完了です。

外部リポジトリの追加(EPEL)

VPSにgitをインストールしようとすると、gitがNo packageでインストールできませんでした。

$ sudo yum install git 
Loaded plugins: downloadonly, fastestmirror
Loading mirror speeds from cached hostfile
Setting up Install Process
No package git available.

以前も同様のことがあったのですが、外部リポジトリの追加を忘れていました。
備忘録として手順を記載しておきます。
下記の手順で、リポジトリ(EPEL)を追加します。

$ wget http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/5/x86_64/epel-release-5-4.noarch.rpm
$ sudo rpm -ivh epel-release-5-4.noarch.rpm 

以上

pkgngのproxy設定

pkgngのプロキシ設定の方法
sudoを使用すると、環境変数の設定が引き継がれないため、設定ファイルにプロキシサーバの設定を追加しました。

/usr/local/etc/pkg.conf に下記の内容を追記します。

PKG_ENV:
  HTTP_PROXY: http://192.168.1.1:8080

2行目のサーバのIPアドレスとポートは、任意のものに変更してください。
また、HTTP_PROXYの左側の空白は、タブではなくスペースなので注意してください。
PKG_ENV以降の設定については、pkg コマンド実行時に、環境変数として設定されるようになっています。

以上です。

PKGngを使ってみる

FreeSBD9.1で、PKGngの設定を行ったときのメモです。
FreeBSD9.1リリース向けのPKGngリポジトリ提供が4月から開始されています。
下記のURLを参考に設定ししました。
http://gihyo.jp/admin/clip/01/fdt/201304/10

まず、ports correctionとの連動のために、make.confの編集と、データベースの更新を行います。

$ echo 'WITH_PKGNG=yes' >> /etc/make.conf
$ pkg2ng

あとは、上記URL通りに、/usr/local/etc/pkg.confファイルの設定と
公開鍵のダウンロードを行って設定完了です。

簡単なpkgの使い方です、
・パッケージのアップグレード

$ pkg upgrade -fy

・パッケージの検索

$ pkg search <検索したいパッケージ名>

・パッケージのインストール

$ pkg install <インストールしたいパッケージ名> 

Macbook MB404に、64bit版のWin7をインストールする

Macbook MB404に、64bit版のWindows7をインストールするときの設定です。
公式には、32bit版しかサポートされていません。

Bootcampの設定と、OSのインストールについては、いろいろなサイトで紹介されていますので、Windowsインストール後のドライバインストールのみ記載します。

Appleのサイトから、bootcampのサポートソフトウェアをダウンロードします。
http://www.apple.com/jp/support/bootcamp/downloads/
MB404(Early 2008)に対応している最新は、Boot Camp Support Software 4.0.4033 になります。

そのまま実行してしまうと64bit版は、エラーになってしまいます。

Cドライブの直下に展開したデータを保存しているとして記載します。
[スタート]→[すべてのプログラム]→[アクセサリ]→[コマンドプロンプト]で右クリックを行い、管理者で実行を選択します。

コマンドプロンプトで、展開した不ディレクトリに移動して、BootCamp64.msiを実行します。

cd C:\BootCamp\Drivers\Apple
BootCamp64.msi


あとは、メッセージにしたがってインストールすれば完了です。

FreeBSDのFirefoxツールバー日本語化

久々にportsを更新していたら、Firefoxのツール「バーが日本語ではないことに気づきました。
firefox-i18nをインストールしただけでは、日本語化されなかったので備忘録として記録しておきます。

1. portsのインストール

/usr/ports/www/firefox-i18nをインストールします。

2. localeの設定

  • firefoxを起動し、URL入力部分に about:config を入力
    「I’ll be careful, I promise!」をクリックしてください。
  • general.useragent.locale の値をjaに変更
    search から、general.useragent.locale を入力
    en-US から ja に変更

3. add-onの有効化

  • [Tools] -> [add-ons] を選択
    Languages の項目を選択
  • Japanese Language Pack 18.0 (disable)の項目
    EnableのボタンをクリックしていEnableに変更

4. firefoxを再起動
ツールバーが日本語化されています。

ports更新時の依存関係の修復

chromium のバージョンをあげようとおもって、portsnap でportsを最新にしてみたら
下記のエラーがでて、gtk20 のところでコンパイルでエラーになってしまいました。

      Shared object "libpcre.so.0" not found

どうも、libpcre のバージョンが上がっても、依存しているパッケージが再コンパイルされない
ことが原因みたいです。emacsも下記のエラーがでて起動しなくなっていました。

Shared object "libpcre.so.0" not found, required by "libgtk-x11-2.0.so.0"

この場合の対策方法は、2つだと思います。
1)/etc/libmap.conf を使って動的リンクを変更する
2)依存関係のあるパッケージを、全てコンパイルする

1) /etc/libmap.conf を作成し、下記のように記載する

    sudo vi /etc/libmap.conf
    libpcre.so.0    libpcre.so.1

emacs は起動するようになりました。

2)依存関係のあるパッケージを、全てコンパイルする

依存関係のあるライブラリを洗い出します

    grep -n -e "libpcre.so.0" /usr/local/lib/*

多すぎる。。。

Binary file /usr/local/lib/libIDL-2.so matches
Binary file /usr/local/lib/libIDL-2.so.0 matches
Binary file /usr/local/lib/libORBit-2.so matches
Binary file /usr/local/lib/libORBit-2.so.0 matches
(中略)
Binary file /usr/local/lib/libwnck-1.so.22 matches
Binary file /usr/local/lib/libxklavier.so matches
Binary file /usr/local/lib/libxklavier.so.12 matches
Binary file /usr/local/lib/libxml++-2.6.so matches
Binary file /usr/local/lib/libxml++-2.6.so.2 matches

すごい数ですが…
とりあえず、x11-toolkits/gtk20 に依存関係のあるライブラリをコンパイルしてみます。

  > sudo portmaster -fR x11-toolkits/gtk20

-fR をつけることで、強制的に依存関係のあるportsも再コンパイルされます。

コンパイル完了後、依存関係のあるパッケージをみるt、gtkに依存関係のあるパッケージはなくなりましたがまだたくさんのこっていたので結局全コンパイルしました。

どのパッケージでインストールされたかは、以下のようにして確認できます。

> pkg_info -W /usr/local/lib/libxml++-2.6.so
/usr/local/lib/libxml++-2.6.so was installed by package libxml++-2.34.2

以上です。

distfileのダウンロードサイト設定

portsをmakeする際に、distfileをダウンロードするサイトを日本国内優先にするために、下記の設定をmake.confに記載しました。

MASTER_SITE_OVERRIDE=http://ftp.riken.jp/FreeBSD/distfiles/${DIST_SUBDIR}/

これで、ダウンロードの時間がかなり短縮できるとおもいます。