2020/03/17(火)中華なオシロスコープを使いこなす(2)

さすがに最近のオシロスコープは、画像保存が出来るようになっている模様。
先日の記事と同じような画になってしまったのですが。。
20200317.png


ブラウン管オシロスコープな時代は、専用の道具を使いつつ、写真撮影していたものです。
USB端子が付いており、そこにUSBメモリを挿すと、オシロスコープ側で保存した画像をコピー&ペーストで取得できます。

ただ、ここからが中華らしい曲者で、、、orz
USBメモリにコピーしたはいいが、PC側で読み込みしようとすると、
「このドライブで問題が見つかりました。今すぐドライブをスキャンして修復してください。」
みたいなメッセージが出る。しかし、スキャンすると・・・「問題は見つかりませんでした。」
なんだこれ、、、更に、右端側のメニューが消えない。邪魔だ、、、

右端側のメニューがない状態で記録出来ないものか。。
ご存知のかた誰か教えてください・・。orz

2020/03/11(水)中華なオシロスコープを使いこなす(1)

最近のオシロスコープは、色々な機能が付随しています。
20200311.JPG


これは、プロトコルアナライザ。
今も昔も広く使われている RS-232C 信号線で、どういうデータが流れているかを解析した様子。
他にSPI だの I2C だのといったものが使える模様。見慣れないものもあります。

データを取得するときのトリガの掛け方(早い話、データを取得するタイミングをどう設定するか)が今ひとつ慣れていないが、こんなことができるという確認。
間違った解析をしていないのを確認。

あと、リアルタイムで電圧や周波数(周期)なんかも表示できます。
更に、ヒストグラムとFFT機能があるのですが、この2つは使う機会が出てくるのかどうか何とも・・です。
ただ、試作中の技術的評価には使えるかな、といったところ。

2020/03/09(月)中華製なオシロスコープを入手した

永年欲しくても買えずにいたオシロスコープを、やっとの思いで購入。
絶対額が安くはないんですが、業務を全うするのに必要なのです。(この機種でもどちらかといえば安いほう)
これ無いと、電子回路の設計・開発に大きな支障あるんですが、今までこれ無しでやってきたのです。
オシロスコープ使わずに電子回路の設計・開発が出来たのは奇跡以外の何物でもないのです。(本当に、、、)
当然のことながら、受注業務の技術的限界を感じていました。

でもこれ、中華メーカなんだよね。。ただ、評判はそれほど悪くはないようなので・・・
20200309_1.jpg

20200309_2.jpg


設置場所確保するだけで徹夜になってしまいました。orz
Amazon で購入したんですが、中華なところから成田空港経由の空輸で製造元にて二重梱包されていました。
梱包材破損のクレームが過去にあったからですかね。。

これからセットアップです。

2020/03/08(日)XML ファイルを解析する perl モジュール

現在の作業が落ち着いたところで、
2年近くずーっと延期していたWeb気象通報サイトの抜本的改築を行おうと考えています。

元データはXML形式のファイルで、技術的にこれを逐次解析処理する必要があります。
そこで作業準備にあたり、どのXMLライブラリを主力にするかの検討からなのです。

現状、Perl5 では下記のXMLライブラリがあり、依存する汎用ライブラリが異なります:

XML::Simple libexpat が必要
XML::Parser libexpat が必要
XML::DOM   libexpat が必要
XML::LibXML libxml2 が必要
XML::Feed  libxml2 と libexpat の両方必要
#他にもあるが、最終更新日時が古い・事例が殆ど無いなどの理由で最初から却下。

libexpat も libxml2 も XMLを処理するC言語ベースのライブラリで、
Perlで実現するXML処理は、単にこれらのライブラリとの仲介をしているだけに過ぎないです。

ですが、その処理手法が異なっており、libexpat を使うモジュールは、libexpat そのものの構造からして

・巨大なXMLをパース(解析)できない
・複雑なデータ構造のXMLをパースできない

という問題があるようで、これは今回のプロダクションには採用できない(しないほうが無難)模様。
また、XML::Feed は、複雑なデータ構造のXMLパースは機能しないという報告もあり、
昔から標準的で実績豊富とされている XML::LibXML というところに落ち着く形ですね。

ただ、ちょっと使いにくそうです。

2020/03/01(日)XBee のプログラマブルモジュールとノーマルタイプの違い《お勧めは「ノーマルタイプ」!!》

依頼元などは公表出来ませんが、
昨年からこの無線通信モジュールを使用するシステム開発に関わっています。
実際に関わってみると、何と言っても「これほど判りずらいモジュールはない!!」という印象が強いです。
日本語による情報が殆ど無い、説明書通りの挙動をしない、情報が古い、という現状も判りずらさを助長しています。
更に、名前の紛らわしさが判りずらさを更に助長しています。
XBee (「じぐびいぃ」と発音する模様)は、この無線モジュールの商標だが、ZigBee はXBee が採用している通信規格。発音が日本人に言わせると全く同じ。

更に XBee と書いて別の読み方をする日本メーカの小型乗用車なんかもあって、調べる際に結構な割合で検索結果に混同してきます。

そもそも、ノーマル版とPro版が先ず最初にあり、これは無線通信の電波の強さの違いのようです。
Pro 版の方が高出力で通信距離を稼げます。
要するに、「Pro版」はプログラマブルモジュールのことではなく、「高出力版」ということのようです。

次に、ノーマル版とプログラマブルモジュール版があります。
プログラマブルモジュールは、機能的にはMicrochip社のPIC16FシリーズとPIC18Fシリーズの中間的な機能を有するマイコンが内蔵され、こういうのに欲張りな当方は「値段が殆ど同じなら、プログラマブルモジュールを使う」という選択肢が自然と行くのですが、これは駄目です。全くお勧めできません。とても苦労する羽目になります。

先駆者諸氏のブログ等を拝見すると、当方と同じような思考で結果的に使用を断念してしまったり、間違って購入して苦労しているのを散見します。
両者はよくよく見ないと区別できないのもこの状況を助長しています。

ここで、「ノーマルタイプ」と「プログラマブルモジュール」を並べた様子です。
20200301_1.jpg


全く『違い』が判りませんね。実は、裏面を見ると辛うじて判ります:
20200301_2.jpg


型番の最後が
「003」になっているのが「プログラマブルモジュールなXBee」、
「004」になっているのが「ノーマルタイプの XBee」なのです。(赤枠で囲った部分)

こういうのは、表に大きな文字で型番を印刷するとか、色を変えるとかして区別できるようにするべきだと個人的には思います。

蛇足ですが、プログラマブルモジュールに内蔵しているマイコンは、Freescale社の MC9508QE32CFT という型番のマイコンのようです。
実は、XBee プログラマブルモジュール用のSDK(プログラム開発ツール)が無償提供されてはいるのですが、
全く使えないのです。どうもCコンパイラが吐き出す命令コードがおかしい。
サブルーチンの前後で引数が突然変わるんです。
何か回避できるトリックがあるのでしょうが、そういうのも見当たらず、一般人には使い物にならない。
これは想定外の大きな誤算でした。

どうりで XBee プログラマブルモジュールの応用事例が殆ど皆無なわけです。
メーカの方でもそういうのは判っていると思うのですが・・・ 現状は何も対策無しです。
なので、プログラマブルモジュールの XBee は、現状ではお勧めできないわけです。

2020/01/23(木)Raspberry Pi 3 Model B+ FreeBSD12.1 その他の情報

雑多な情報を、書き残しておきます。

・FreeBSD RaspBerry Pi 3 は FreeBSD/ARM 対応プロジェクトの一環で開発作業が続けられており、
 位置づけは、Tire 2 となっています。
 従って、Tire 1 サポート(i386、amd64 が該当)のみとなっている FreeBSD UPDATE は使えません。

・FreeBSD/ARM 対応プロジェクトは、Tire 1 に乗せる準備が進められている模様。
 FreeBSD が組み込み機器用途で使用できる最初のプラットフォームになれるかも。

・FreeBSD における GPIO 制御は、gpioctl コマンドが使用できます。
 Perl には、これと同じことを Perl スクリプトで行うための Device::BCM2835 なるモジュールや、
 RPi::Pin、WiringPi::API などありますが、FreeBSD12.1 ではどれも使えません。

 以下のような感じでピン情報を取得します(例):
  $result = qx(gpioctl -l) ;
  chomp ($result) ;
  my @iostat = split("\n",$result) ;

  foreach my $getpin (@iostat) {
    $getpin =~ /\Apin\s(\d+):\s+(\d)/ ;
    next if ($pinnum ne $1) ;
    $lvlstat = $2 ;
    last ;
  }
# $pinnum に文字列でピン番号を与え、$lvlstat に 0か1 が入ります。
# 0 がL、1 がHです。

2020/01/23(木)Raspberry Pi 3 Model B+ に FreeBSD12.1 をインストール (3)

次は、任意でユーザ環境の設定です。
.cshrc や .profile でお好みな環境をセットアップしますが、ここは個人の好みの部分なので、
説明省略。

筆者の環境では、基本的に Perl5 を使いたいので、
このあと、ports にてパッケージインストールを行います。
以下のような感じで root ユーザにて導入します:
# cd /usr
# mkdir ports
# portsnap fetch extract
# cd /usr/ports/editors/vim-console
# make install
# make clean

# cd /usr/ports/misc/lv
# make install
# make clean

# cd /usr/ports/ports-mgmt/portupgrade
# make install
# make clean
portupgrade のインストールにて、依存するパッケージとして、ruby や Perl がインストールされます。

途中、青地画面で、インストールオプションの選択画面が何度か出るが、適当にデフォルト値に任せずに、必ず内容を確認して作業しましょう。

2020/01/23(木)Raspberry Pi 3 Model B+ に FreeBSD12.1 をインストール (2)

起動ができるようになったら、次の段階として、設定を行います。
/etc/rc.conf に最初に記述されている、イーサネット関連のデフォルト設定値は、
ifconfig_DEFAULT="DHCP"
となっています。
この状態で起動すると、DHCPネゴシエーションで通知された参照用DNS設定ファイル /etc/resolv.conf が自動生成されています。
当然のことながら、LAN上にDHCPサーバが無い場合、このファイルは自動生成されません。

筆者の場合は以下のようになりました:
search deverop.basekernel.ne.jp
nameserver xxx.xxx.xxx.xxx
nameserver yyy.yyy.yyy.yyy
#セキュリティ対策上、IPアドレスは伏せてあります。

見てのとおり、IPv4 で機能しています。
適宜変更が必要かもしれません。

先ずは、ユーザ名 freebsd の削除・変更と、root パスワードの変更。
初期値は、ユーザ名 freebsd パスワード freebsd でログインでき、root のパスワードは、root なので、変更すべきです。(メンテナンスを簡単に始められるようにこうなっている)

先ず、ユーザ名 freebsd を削除して、新たに任意のユーザ名を追加、root のパスワードは変更しましょう。
更に、/etc/group の wheel 行に、root ユーザになれるように 新たに追加した任意のユーザ名を追加し、ユーザ名 freebsd は削除することを忘れないように。

次に /etc/rc.conf の変更。以下のようにします:
hostname="bypass_ctl"
defaultrouter="172.16.15.1"
ifconfig_ue0="inet 172.16.15.188 netmask 0xffffff00"

ntpd_enable="YES"
ntpd_sync_on_start="YES"

inetd_enable="YES"
sendmail_enable="NONE"
sendmail_submit_enable="NO"
sendmail_outbound_enable="NO"
sendmail_msp_queue_enable="NO"
growfs_enable="YES"

keymap="jp.kbd"
ホスト名、IPアドレスやネットマスク、デフォルトルータあたりの設定は、使用中のネットワークポリシーに合わせます。
/etc/ntp.conf はデフォルト値でも大丈夫ですが、ネットワーク内に公開NTPサーバがある場合や、指定されている場合は、そのサーバを設定します。

基本インストールの最後に、タイムゾーンの設定です。
日本時間の指定は、以下のコマンドを root ユーザにて実行します:
# tzsetup /usr/share/zoneinfo/Asia/Tokyo
一度設定すれば、次回の起動以後もこのタイムゾーンで動作します。
設定の最後に
# shutdown -r now
で、再起動します。

2020/01/23(木)Raspberry Pi 3 Model B+ に FreeBSD12.1 をインストール (1)

2020/01/23 3:55 電子工作
以前に比べれば、格段に対応精度は上がっている模様。
ですが、デバイスドライバの関係で無線インタフェースはサポート外です。
とはいえ、今のところはこれで充分だったりするんですが。。

20200123.jpg


今回、Raspberry Pi は、LANインタフェースとNTPによる時刻管理をする役目と、GPIO に接続するハードウェアの制御インタフェースに用います。
何のハードウェア制御かは、企業秘密事項に該当するのでお話することはできません。

ここではいつもの「自分メモ」用に FreeBSD 12.1 を Raspberry PI 3 Model B+ にインストールする手法を記録していきます。
因みに昨今では Raspberry Pi 4 が出現していますが、まだ FreeBSD は対応していない模様。

1)RaspBerry Pi 3 対応の FreeBSD インストールイメージファイル取得
https://download.freebsd.org/ftp/releases/arm64/aarch64/ISO-IMAGES/12.1/
Raspberry Pi 3 用の FreeBSD-12.1-RELEASE-arm64-aarch64-RPI3.img.xz をダウンロードしましょう。

2)取得したイメージを MicroSD カードへ書き込む
  Micro SD カードは、32GByte ものを強くお勧めです。
https://www.balena.io/etcher/ (balenaEtcher,Win版/Mac版有り)
  以前のように、別のFreeBSD マシン等で DD コマンドを使う必要性もなく、
  誤って MicroSD カード以外のドライブに書き込んでしまうことを防ぐ機能もあるようです。
  
  このソフトウェアをインストールして、起動してから MicroSDカードへ書き込みますが、
  使い方については説明不要なほど簡単に判るかなと思います。

3)RaspBerry Pi に USBキーボード、HDMIディスプレイ、LANケーブルを挿し込む。
  最後にMicroUSB 電源コードを差し込む。この時、電源は入れないこと。

4)作成した MicroSD ブートカードを RaspBerry Pi 3 のMicroSD カードスロットへ挿し込み、
  ここで電源ON。

5)1分~2分程度で、起動完了します。「Login:」プロンプトが表示されたら、起動完了です。
  以下のような感じで dmesg が表示されます:
−−−<<BOOT>>−−−
Copyright (c) 1992-2019 The FreeBSD Project.
Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994
The Regents of the University of California. All rights reserved.
FreeBSD is a registered trademark of The FreeBSD Foundation.
FreeBSD 12.1-RELEASE r354233 GENERIC arm64
FreeBSD clang version 8.0.1 (tags/RELEASE_801/final 366581) (based on LLVM 8.0.1)
VT(efifb): resolution 656x416
KLD file umodem.ko is missing dependencies
Starting CPU 1 (1)
Starting CPU 2 (2)
Starting CPU 3 (3)
FreeBSD/SMP: Multiprocessor System Detected: 4 CPUs
random: unblocking device.
random: entropy device external interface
MAP 39f4a000 mode 2 pages 1
MAP 39f4f000 mode 2 pages 1
MAP 3b350000 mode 2 pages 16
MAP 3f100000 mode 1 pages 1
kbd0 at kbdmux0
ofwbus0:
simplebus0: on ofwbus0
ofw_clkbus0: on ofwbus0
clk_fixed0: on ofw_clkbus0
clk_fixed1: on ofw_clkbus0
regfix0: on ofwbus0
regfix1: on ofwbus0
psci0: on ofwbus0
lintc0: mem 0x40000000-0x400000ff on simplebus0
intc0: mem 0x7e00b200-0x7e00b3ff irq 20 on simplebus0
gpio0: <BCM2708/2835 GPIO controller> mem 0x7e200000-0x7e2000b3 irq 23,24 on simplebus0
gpiobus0: on gpio0
generic_timer0: irq 0,1,2,3 on ofwbus0
Timecounter "ARM MPCore Timecounter" frequency 19200000 Hz quality 1000
Event timer "ARM MPCore Eventtimer" frequency 19200000 Hz quality 1000
usb_nop_xceiv0: on ofwbus0
bcm_dma0: mem 0x7e007000-0x7e007eff irq 4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19 o
n simplebus0
bcmwd0: <BCM2708/2835 Watchdog> mem 0x7e100000-0x7e100027 on simplebus0
bcmrng0: mem 0x7e104000-0x7e10400f irq 21 on simplebus0
mbox0: mem 0x7e00b880-0x7e00b8bf irq 22 on simplebus0
gpioc0: on gpio0
uart0: <PrimeCell UART (PL011)> mem 0x7e201000-0x7e201fff irq 25 on simplebus0
uart0: console (115200,n,8,1)
spi0: <BCM2708/2835 SPI controller> mem 0x7e204000-0x7e204fff irq 27 on simplebus0
spibus0: on spi0
spibus0: at cs 0 mode 0
spibus0: at cs 1 mode 0
iichb0: <BCM2708/2835 BSC controller> mem 0x7e804000-0x7e804fff irq 40 on simplebus0
bcm283x_dwcotg0: <DWC OTG 2.0 integrated USB controller (bcm283x)> mem 0x7e980000-0x7e98ffff,0x7e006000-0x7e
006fff irq 46,47 on simplebus0
usbus0 on bcm283x_dwcotg0
sdhci_bcm0: <Broadcom 2708 SDHCI controller> mem 0x7e300000-0x7e3000ff irq 49 on simplebus0
mmc0: <MMC/SD bus> on sdhci_bcm0
fb0: on simplebus0
fbd0 on fb0
VT: Replacing driver "efifb" with new "fb".
fb0: 656x416(656x416@0,0) 24bpp
fb0: fbswap: 1, pitch 1968, base 0x3eb33000, screen_size 818688
pmu0: irq 53 on simplebus0
cpulist0: on ofwbus0
cpu0: on cpulist0
bcm2835_cpufreq0: on cpu0
cpu1: on cpulist0
cpu2: on cpulist0
cpu3: on cpulist0
gpioled0: on ofwbus0
gpioled0: failed to map pin
cryptosoft0:
Timecounters tick every 1.000 msec
iicbus0: on iichb0
iic0: <I2C generic I/O> on iicbus0
usbus0: 480Mbps High Speed USB v2.0
ugen0.1: at usbus0
uhub0: <DWCOTG OTG Root HUB, class 9/0, rev 2.00/1.00, addr 1> on usbus0
mmcsd0: 32GB <SDHC USDU1 2.0 SN 401D09C1 MFG 04/2019 by 116 J`> at mmc0 50.0MHz/4bit/65535-block
bcm2835_cpufreq0: ARM 600MHz, Core 250MHz, SDRAM 400MHz, Turbo OFF
mbox0: mbox response error
bcm2835_cpufreq0: can't set clock rate (id=4)
Release APs...done
CPU 0: ARM Cortex-A53 r0p4 affinity: 0
Trying to mount root from ufs:/dev/ufs/rootfs [rw]...
Instruction Set Attributes 0 =
Instruction Set Attributes 1 = <>
Processor Features 0 = <AdvSIMD,Float,EL3 32,EL2 32,EL1 32,EL0 32>
Processor Features 1 = <0>
Memory Model Features 0 = <4k Granule,64k Granule,S/NS Mem,MixedEndian,16bit ASID,1TB PA>
Memory Model Features 1 = <>
Memory Model Features 2 = <32b CCIDX,48b VA>
Debug Features 0 = <2 CTX Breakpoints,4 Watchpoints,6 Breakpoints,PMUv3,Debug v8>
Debug Features 1 = <0>
Auxiliary Features 0 = <0>
Auxiliary Features 1 = <0>
CPU 1: ARM Cortex-A53 r0p4 affinity: 1
CPU 2: ARM Cortex-A53 r0p4 affinity: 2
CPU 3: ARM Cortex-A53 r0p4 affinity: 3
WARNING: / was not properly dismounted
Warning: no time-of-day clock registered, system time will not be set accurately
uhub0: 1 port with 1 removable, self powered
ugen0.2: <vendor 0x0424 product 0x2514> at usbus0
uhub1 on uhub0
uhub1: <vendor 0x0424 product 0x2514, class 9/0, rev 2.00/b.b3, addr 2> on usbus0
uhub1: MTT enabled
uhub1: 4 ports with 3 removable, self powered
ugen0.3: <vendor 0x0424 product 0x2514> at usbus0
uhub2 on uhub1
uhub2: <vendor 0x0424 product 0x2514, class 9/0, rev 2.00/b.b3, addr 3> on usbus0
uhub2: MTT enabled
uhub2: 3 ports with 2 removable, self powered
ugen0.4: <vendor 0x0424 product 0x7800> at usbus0
muge0 on uhub2
muge0: <vendor 0x0424 product 0x7800, rev 2.10/3.00, addr 4> on usbus0
muge0: Chip ID 0x7800 rev 0002
miibus0: on muge0
ukphy0: <Generic IEEE 802.3u media interface> PHY 1 on miibus0
ukphy0: none, 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, 1000baseT, 1000baseT-master, 1000baseT-FDX, 1
000baseT-FDX-master, auto
ue0: on muge0
ue0: Ethernet address: b8:27:eb:cd:66:49
lo0: link state changed to UP
muge0: Chip ID 0x7800 rev 0002
ue0: link state changed to DOWN
ue0: link state changed to UP
Security policy loaded: MAC/ntpd (mac_ntpd)

2019/08/16(金)少なくとも Passenger Ver 5 以降は、FreeBSD11.3 ではコンパイル不能

2019/08/16 21:57 サーバ運営・管理
発端は、ruby を2.4系から 2.5系にアップデートしたことに始まります。
redmime を一部のプロジェクトで運用していますが、これを Apache で動作させるために、Passenger という連携モジュールが必要。

今回はこれにハマりました。現状の最新版 Passenger-6.0.2 でも同様です。

先ず、 redmine の動作に必要な ruby ライブラリをインストール後、最後にこのモジュールのインストール作業を行います。
通常、redmine をインストールしたディレクトリにて、
# gem install passenger
# passenger-install-apache2-module
とやるんですが、これがどうも上手く行かない。調べると、上記手順を実施する前に、
# setenv APXS2 '/usr/local/apache2/bin/apxs'
# setenv PATH '/bin:/usr/local/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/pgsql/bin:/usr/local/apache2/bin'
といった、環境変数の設定が必要な模様。
ソースコードから Apache をインストールした場合、passenger インストーラがApache を確認できないらしい。
これで、
# gem install passenger
は、上手く行きます。しかし、
# passenger-install-apache2-module
は、途中でコンパイルエラーになります。こんな感じ:
/usr/include/c++/v1/string_view:771:37: note: 'Passenger::ApiAccountUtils::string_view' declared here
typedef basic_string_view string_view;
^
fatal error: too many errors emitted, stopping now [-ferror-limit=]
1 warning and 20 errors generated.
rake aborted!
Command failed with status (1): [c++ -o buildout/support-binaries/WatchdogMain.o -Isrc/agent -Isrc/cxx_supportlib -Isrc/cxx_supportlib/vendor-copy -Isrc/cxx_supportlib/vendor-modified -Isrc/cxx_supportlib/vendor-modified/libev -Wno-ambiguous-member-template -Isrc/cxx_supportlib/vendor-copy/libuv/include -Isrc/cxx_supportlib/vendor-copy/websocketpp -I/usr/local/include -DHAS_CURL_EASY_RESET -D_REENTRANT -I/usr/local/include -Wall -Wextra -Wno-unused-parameter -Wno-parentheses -Wpointer-arith -Wwrite-strings -Wno-long-long -Wno-missing-field-initializers -Wno-ambiguous-member-template -fvisibility=hidden -DVISIBILITY_ATTRIBUTE_SUPPORTED -DHAVE_ACCEPT4 -DHAS_SFENCE -DHAS_LFENCE -DPASSENGER_DEBUG -DBOOST_DISABLE_ASSERTS -g -fno-limit-debug-info -Wno-unused-local-typedefs -Wno-format-nonliteral -DHAS_UNORDERED_MAP -c src/agent/Watchdog/WatchdogMain.cpp]

Tasks: TOP => apache2 => buildout/support-binaries/PassengerAgent => buildout/support-binaries/WatchdogMain.o
調べると、どうも C++17 からでないと、サポートしていない構文を使っている模様。
C++17 をコンパイラに強制させて解決するには、こうします:
# setenv EXTRA_CXXFLAGS '-std=c++17'
要するに、上記の環境変数にて、追加のコンパイラオプションを設定し、再度
# passenger-install-apache2-module
と、するのです。ですが、これで解決するはずが、別の場所でエラーが出ました。こんな感じ:
pedefs -Wno-format-nonliteral -DHAS_UNORDERED_MAP -std=c++17 -c src/cxx_supportlib/IOTools/IOUtils.cpp
src/cxx_supportlib/IOTools/IOUtils.cpp:288:3: error: use of undeclared identifier 'random_shuffle'
random_shuffle(result.begin(), result.end());
^
1 error generated.
rake aborted!
Command failed with status (1): [c++ -o buildout/apache2/module_libpassenger_common/IOTools/IOUtils.o -Isrc/cxx_supportlib -Isrc/cxx_supportlib/vendor-copy -Isrc/cxx_supportlib/vendor-modified -Isrc/cxx_supportlib/vendor-modified/libev -Wno-ambiguous-member-template -Isrc/cxx_supportlib/vendor-copy/libuv/include -O -fPIC -I/usr/local/apache2/include -I/usr/local/apache2/include -I/usr/local/apache2/include -D_REENTRANT -I/usr/local/include -Wall -Wextra -Wno-unused-parameter -Wno-parentheses -Wpointer-arith -Wwrite-strings -Wno-long-long -Wno-missing-field-initializers -Wno-ambiguous-member-template -fvisibility=hidden -DVISIBILITY_ATTRIBUTE_SUPPORTED -DHAVE_ACCEPT4 -DHAS_SFENCE -DHAS_LFENCE -DPASSENGER_DEBUG -DBOOST_DISABLE_ASSERTS -g -fno-limit-debug-info -Wno-unused-local-typedefs -Wno-format-nonliteral -DHAS_UNORDERED_MAP -std=c++17 -c src/cxx_supportlib/IOTools/IOUtils.cpp]

Tasks: TOP => apache2 => buildout/apache2/mod_passenger.so => buildout/apache2/module_libpassenger_common/IOTools/IOUtils.o
ん~、、調べると、この random_shuffle という関数は C++17では「廃止」されたらしい。
なのでエラーになるのです。これには困った・・・というか、バグの類でしょう。。

結局、3箇所修正することで、コンパイルできます。
/usr/local/lib/ruby/gems/2.5/gems/passenger-6.0.2/src/cxx_supportlib/IOTools/IOUtils.cpp
   37 #include <algorithm>
   38 #include <string>
   39 #include <vector>
+  40 #include <random>
   41 #include <sys/socket.h>
   42 #include <sys/types.h>

  287         freeaddrinfo(res);
  288         if (shuffle) {
  289 //              random_shuffle(result.begin(), result.end());
+ 290                 std::shuffle(result.begin(), result.end(),std::mt19937());
  291         }
  292         return result;
  293 }
/usr/local/lib/ruby/gems/2.5/gems/passenger-6.0.2/src/cxx_supportlib/vendor-copy/websocketpp/websocketpp/common/memory.hpp
 65 #ifdef _WEBSOCKETPP_CPP11_MEMORY_
 66     using std::shared_ptr;
 67     using std::weak_ptr;
 68 //    using std::auto_ptr;
 69     using std::enable_shared_from_this;
 70     using std::static_pointer_cast;
 71     using std::make_shared;
 72     using std::unique_ptr;
ソースコード修正後、
# setenv EXTRA_CXXFLAGS '-std=c++17'
# passenger-install-apache2-module
とすることで、使用できるモジュールが出来上がるようです。
OK キャンセル 確認 その他