MySQL8.0.16のCHECK属性をつかってみた

MySQL8.0.16から待望のCHECK属性が入ったため、実際に動作を確かめてみました。

CREATE TABLE user (
`id` bigint UNSIGNED NOT NULL AUTO_INCREMENT,
`user_id` varchar(20) CHARACTER SET ascii NOT NULL,
`name` varchar(20) NOT NULL,
`status` varchar(15) NOT NULL,
`create_time` DATETIME NOT NULL,
INDEX (`name`),
PRIMARY KEY (`id`),
UNIQUE (`user_id`),
CHECK(`user_id` REGEXP '^[\-0-9A-Z_a-z]{4,}$'),
CHECK(`name` != ''),
CHECK(`status` != '')
);

不正な文字列をINSERTしようとすると

ERROR 3819 (HY000): Check constraint 'user_chk_1' is violated.

と弾かれます。よさそう

CHARACTER SET asciiには罠があって、sql_modeをどんなに上げてもASCII範囲外(0x80など)がErrorではなくWarningで入れられてしまいます。やはりCHECK属性がいいですね。

どのくらい時間がかかるのか気になって、以下のテーブル定義で15文字のbodyを10000回挿入するテストを行ってみました。

CREATE TABLE post (
    `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT,
    `author_id` bigint UNSIGNED NOT NULL,
    `body` varchar(300) NOT NULL,
    `post_time` DATETIME NOT NULL,
    INDEX (`author_id`),
    PRIMARY KEY (`id`),
    CHECK(`body` != '')
);

CHECK属性あり: 106.94秒 なし: 106.49秒

なぜか時間がかかりすぎて困惑ですが、同条件では大して変わらないことが確認できました。

広告
カテゴリー: コンピュータ | コメントをどうぞ

鉄道サイバネ・シンポジウム論文集の勝手目録をつくった

要約

鉄道サイバネ・シンポジウム論文集は、鉄道電気技術の論文誌ですが、目録が普通の方法では手に入らないという問題がありました。そこで、うまいこと集めたので、勝手に公開します。

https://mipsparc.github.io/railway_cybernetics/cyber.html

手法

JDreamIII(論文データベース)の検索結果を「テキスト形式でダウンロード」を1年分ごとに実施、CSVっぽい形式なのを読み込んで整形するやつをPythonで書いて、実行。

表題と著者情報には権利が発生しないため法的には問題がないと考えられますが、どうしてもやめてほしければご連絡ください。

この手法はあらゆる論文誌に採用できるので、もし要望があればぱっと作ります。

 

カテゴリー: コンピュータ, Python | コメントをどうぞ

MINI NVR(hi3515)を軽くハックした話

imag1487

一年ほど前に無料でネットワークビデオレコーダを手に入れてちょっとだけハックしてたのですが、最近また再開した話です。

ネットワークビデオレコーダというのは、ネットワークカメラを録画したりモニタするのに使われるSTBのようなものです。国内ではあまり知られていませんが、Aliexpressではメジャーな製品で、$20程度でたくさん見つけることが出来ます。

構成としてはこんな感じです

  • SoC: Hi3515 (ARM Cortex A9, H.264 encoding/decoding)
  • RAM: 142MB
  • SPI Flash: 32MB (MX25L25635E/735E/635F)
  • U-boot 2010.06
  • Linux 3.0
  • 有線LAN、USB2.0x2、RTC、HDMI、eSATA

まずはシリアル=UARTピンをはんだ付けします。UARTは3.3Vレベルと5Vレベルがありますが、常時どちらかが印加されていて、起動時に電圧が振れるピンがあれば、TX(送信)の可能性があります。UART-USBはAmazonで数百円で買えます。TX,RX,GNDの3ピンのランドがあれば正解なので、ピンをはんだ付けしてしまいましょう。

U-Boot 2010.06 (Dec 05 2013 - 16:53:16)

Check spi flash controller v350... Found
Spi(cs1) ID: 0xC2 0x20 0x19 0xC2 0x20 0x19
Spi(cs1): Block:64KB Chip:32MB Name:"MX25L25635E/735E/635F"
*** Warning - bad CRC, using default environment

In:    serial
Out:   serial
Err:   serial
32768 KiB hi_sfc at 0:0 is now current device

mmu_enable

のように出てきたら当たりです。そのままLinuxのシェルに入りましょう。今回はたしかシリアルにはパスワードが設定されていなかったのでヌルゲーです。設定されていた場合は、別のrootfsを使用するなど一気にハードルが上がります。

次に調査をします。u-bootでprintenvをします。これで色々な情報が得られます

hisilicon # printenv
bootargs=mem=142M console=ttyAMA0,115200 root=/dev/mtdblock2 rootfstype=squashfs mtdparts=hi_sfc:320K(uboot),1536K(kernel),4M(rfs),25792K(app),768K(config),256K(logo)
bootcmd=sf probe 0;sf read 0x82000000 0x50000 0x180000;bootm 0x82000000
bootdelay=1
baudrate=115200
ethaddr=00:00:23:34:45:66
uboot_postfix=.bin.3520d
kernel_postfix=.img.3520d
rfs_postfix=.squashfs.3520d
cfg_postfix=.jffs2.3520d
logo_postfix=.jpeg.3520d
ipaddr=192.168.1.10
serverip=192.168.1.2
netmask=255.255.254.0
bootfile="uImage"
stdin=serial
stdout=serial
stderr=serial
verify=n
jpeg_addr=809ce458
jpeg_size=0x40000
vobuf=80838200
ver=U-Boot 2010.06 (Dec 05 2013 - 16:53:16)

Environment size: 649/65532 bytes
# cat /proc/mtd            
dev:    size   erasesize  name
mtd0: 00050000 00010000 "uboot"
mtd1: 00180000 00010000 "kernel"
mtd2: 00400000 00010000 "rfs"
mtd3: 01930000 00010000 "app"
mtd4: 000c0000 00010000 "config"
mtd5: 00040000 00010000 "logo"
#cat /etc/init.d/S03ants
#!/bin/sh
/usr/sbin/hotplug &

#insmod /ko_hi3521/extdrv/mtdram.ko total_size=15360  erase_size=64
#dd if=/dev/mtdblock3 of=/dev/mtdblock6
#mount -o loop -t cramfs /dev/mtdblock6 /root/
mount -t jffs2 /dev/mtdblock3 /root/
mount -t jffs2 /dev/mtdblock3 /update

cd /ko
./load3520D -i

cd /root/ko_app
insmod usb_wwan.ko
insmod option.ko
#insmod sd_mod.ko
insmod jbd.ko
insmod mbcache.ko
insmod ext3.ko
insmod gpioi2c.ko
insmod rt5370sta.ko
insmod slhc.ko
insmod ppp_generic.ko
insmod ppp_synctty.ko
insmod ppp_async.ko

mount -t jffs2 /dev/mtdblock4 /usr/etc
updateclear
mkdir /usr/etc/tmp
mkdir /usr/etc/var
mkdir /usr/etc/var/run
mkdir /usr/etc/var/lock
mkdir /usr/etc/ppp
mkdir /usr/etc/ppp/peers
rm /usr/etc/tmp/qtembedded-0/fonts/fontdb

ln -s /root/web /usr/etc/web


cp /usr/sbin/ppp-off                            /etc/ppp/peers/
cp /usr/sbin/wcdma-chat-disconnect              /etc/ppp/peers/

ifconfig eth0 192.168.1.188
hwclock -s
telnetd &
mount -t usbfs usbfs /proc/bus/usb/
export LD_LIBRARY_PATH="/usr/local/lib:/usr/lib:/root:/root/host_libs:/root/ipc_libs:/mnt"
export TERMINFO=/usr/local/share/terminfo
export QWS_KEYBOARD=tty:/dev/ttyS2
export QWS_KEYBOARD_TYPE=3520chpd
export QWS_MOUSE_PROTO=auto:/dev/mouse0

sysinit &
sleep 1
cd /root
/etc/startusb
./ants_dvr -qws &




# cat /etc/init.d/rcS
#! /bin/sh

/bin/mount -a

echo "
            _ _ _ _ _ _ _ _ _ _ _ _
            \  _  _   _  _ _ ___
            / /__/ \ |_/
           / __   /  -  _ ___
          / /  / /  / /
  _ _ _ _/ /  /  \_/  \_ ______
___________\___\__________________
"
for initscript in /etc/init.d/S[0-9][0-9]*
do
        if [ -x $initscript ] ;
        then
                echo "[RCS]: $initscript"
                $initscript
        fi
done


# cat /etc/init.d/S80network 
#!/bin/sh

ifconfig lo 127.0.0.1

echo "1048576" > /proc/sys/net/core/rmem_default
echo "4048576" > /proc/sys/net/core/rmem_max
echo "2048576" > /proc/sys/net/core/wmem_max
#echo 2000 > /proc/sys/vm/min_free_kbytes
# mount
rootfs on / type rootfs (rw)
/dev/root on / type squashfs (ro,relatime)
proc on /proc type proc (rw,relatime)
sysfs on /sys type sysfs (rw,relatime)
tmpfs on /dev type tmpfs (rw,relatime)
tmpfs on /tmp type tmpfs (rw,relatime)
devpts on /dev/pts type devpts (rw,relatime,mode=600,ptmxmode=000)
/dev/mtdblock3 on /root type jffs2 (rw,relatime)
/dev/mtdblock3 on /update type jffs2 (rw,relatime)
/dev/mtdblock4 on /usr/etc type jffs2 (rw,relatime)
usbfs on /proc/bus/usb type usbfs (rw,relatime)

こんな感じです。このあと、なぜかrootfsをふっ飛ばしてしまい、1年ほど放置してました。

久々に触ろうと思ったのは、会社に組み込みに強い方が入ってきたので雑談したところ、rootfsを簡単に作れるBuildrootというソフトウェアを教えてもらったのがきっかけでした。これはとても強力なツールで、menuconfigで設定するだけで開発環境の構築からrootfsの構築、イメージ化まですべてをやってくれます。

buildrootで作ったsquashfsのrootfsイメージをu-bootでSPI Flashに書き込みます。

fatload usb 0:1 0x80000000 rootfs.squashfs
sf erase 0x1d0000 0x1f0000
sf write 0x80000000 0x1d0000 0x1f0000
sf read 0x80000000 0x1d0000 0xf0
md 0x80000000

最後のreadとmdは確認用です。0x80000000からが自由に使える領域なので、そこにUSBメモリからファイルを読み込み、Flashの該当領域を消して(必須)、書き込みました。アラインメントが64KiBなので領域はぴったりにalignしないと怒られるので注意が必要です。電卓で計算しました。

これで無事boot成功…とはいかず、複数の穴にハマりました。ここまでもはまってますが、省略しています。

JFFS2はkernel versionが古い(Linux 3.0)せいかjffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00270000: 0x1105 insteadというのが大量に出るので、元と同じsquashfsにしました。

getty: can’t open ‘/dev/null’: No such file or directory
というのが定期的に出る上、ttyにもアクセスできない状態でしたが、/devをstatic device tableにしたところ、正常に動作するようになりました。これはkernelのコンパイルオプションが原因のようですが、今回はカーネルは触らないつもりなのでどうしようもありません。

これでログインプロンプトに入れました。

Welcome to Buildroot
buildroot login: root
# 

まずはネットワーク設定をします。

ip a
ip link set dev eth0 up
ip a 192.168.1.123/24 dev eth0
ip route add 192.168.1.0/24 dev eth0

これでpingも通るようになりました。今度はX.orgを使えるようにします。

カテゴリー: コンピュータ | コメントをどうぞ

新刊「鉄道車両内ネットワークの基礎 ―列車内伝送系と列車制御管理システム―」

 

最近の鉄道車両は、「列車内伝送系」と呼ばれるネットワークが車内に構築されており、運転士の操作や機器からの情報はネットワークを介して全体に伝達されます。これまで注目されてこなかったこの分野について解説したのが本書です。

最新の列車内伝送系はEthernetベースであることもあり、産業用Ethernetとしての観点からもトポロジなど参考になるかと思います。国際規格「ECN/ETB」(IEC61375)についても解説しています。

また、TIMS、INTEROS、Synaptra、TEBusなどを網羅した、世界初の本です。また、誤解の多い「TRDP」についても、何なのかを正しく理解できます。

コミックマーケットC95 2日目 東ト47b 「Cpaw」にて頒布します。

訂正、追加情報などは本ページに記述します。

BOOTHにて通販もしております。ぜひ読んでみてください。

https://cpaw.booth.pm/items/1141447

目次

はじめに
列車でのネットワークの必要性
列車内伝送系とTCMSの歴史
主要なトポロジ
三菱電機 TIMS
JR東日本向けTIMSの種類
統一国際規格としての列車内伝送系
Ethernetの列車への適用
ECNの共通仕様
オープンソースプロトコルTRDP
ECNに準拠した鉄道車両
ECN準拠のTCMS INTEROS
無線通信による列車内伝送系
次世代の列車内伝送系を特許から探る
あとがき
参考文献

訂正

  • (P.3) 「MON3のCPUには8085を使用」→MON3のメインCPUはMC68020
    • Intel 8085は使用されてはいるので間違ってはいませんが、伝送制御用のようです。
  • (P.7) 「TIMSの物理層には基幹・支線ともにRS485を採用」→基幹の物理層はARCNETのツイストペア、支線はRS485
    • ARCNETの物理層は、ARCNETで規定されたものかRS485を採用可能です。ほぼ同じものだと思っていましたが、仕様書をみたところ全く異なるものでした。
  • (P.9) 「E233系向け(IMS6型)」→ 「E233系0-5000番代向け(IMS8型)」
    • TIM6箱とか書いてあるのがそのままIMS6とかなのかと思っていたら、どうも違うようです。あちゃー…
  • (P.10) 「E353系向け(IMS10型)」→「E353系向け」
    • 同上
  • (P.10)「E259系向け(IMS8型)」→「E259系向け(IMS11型)」
    • 同上

2019年1月3日時点でわかっているのは以上です。

第二版 訂正

  • (P.12)「S-AIMSと称する東芝が開発したEthernet伝送系(T-Ethernet)」→「S-AIMSと称するEthernet伝送系」
    • 良かれと思ってしっかりと調べないで書き足してしまったのですが、入稿後にS-AIMSについての論文の筆者を調べたら三菱電機の人でした。これは完全に裏とり不足で、反省しています。ACトレインのAIMSは東芝製、S-AIMSは三菱電機製のようです。INTEROS-CとINTEROS-Aみたいな関係なんですね。。。この辺は情報がなくて不明です

追加でわかった情報は夏にでも第3版として出します。

カテゴリー: 通信, 鉄道 | コメントをどうぞ

本物DL運転台によるフルサウンドNゲージコントローラの開発

冬コミに出す薄い本にしようかと思ったのですが、1冊にするほどの内容でもない気がしたので、ここで供養します。

IMAG1011.jpg

この度、所属している鉄道研究会で学園祭に出すため、本物のディーゼル機関車(DE15/DE10)の部品を使用したフルサウンドNゲージ鉄道模型コントローラを製作した。本記事では鉄道に関する知識がない方にも分かるように配慮しつつ、その技術解説を行う。

システムを構成するコンポーネント

  • PWMコントローラとソフトウェア : コンピュータから指令されたレベルの電気を出力し、レールに接続する
  • マスコンユニットとソフトウェア : 自動車のアクセルに相当する「マスコン」から現在のレベルを読み出し、コンピュータにシリアル伝送で間欠的に送信する
  • ブレーキ統合ユニットとソフトウェア : ブレーキハンドルの角度と、その他のボタン操作やペダル操作をコンピュータに間欠送信し、同時に速度をコンピュータから取得して、速度計に表示する
  • スピーカーとウーファー振動モジュール: コンピュータのアナログオーディオ端子から出力してスピーカーから音を出しつつ、椅子の裏に固定されたウーファーモジュールで運転士にリアルな振動を与える
  • DE10クラス : マスコンレベルとブレーキレベルから、DE10形液体式ディーゼル機関車の0.1秒ごとの加速度を計算することで、現在の車両の速度を求めるソフトウェア
  • Sounderクラス : そのタイミングに応じた音を呼び出し、Pygame(SDLのPythonラッパー)でALSA Audioに渡すソフトウェア
  • NControllerクラス : 以上のコンポーネントを呼ぶ、中心となるソフトウェア

ソフトウェア群は著者のGitHub (https://github.com/mipsparc/NController) で公開されている。

PWMコントローラ

IMAG0916.jpg

2018年の4月ごろ、PICマイコンに入門することを主目的として、コンピュータからレベルをシリアル伝送(UART)で指示すると、PWM信号が出力されるファームウェアと基板を製作した。

PIC開発の入門に当たっては「C言語による PICプログラミング大全(後閑 哲也)」を参考とした。この書籍にはPIC16F1シリーズで現代的なCプログラミングをする方法が丁寧に書かれており、C言語をしっかりと触れたことがあれば楽に組み込みプログラミングができるようになっている。もっとも「大全」というには情報量が少々足りないような気もするが。

新世代PICは安価で十分な機能が備えられており、MCCやHarmonyを使えば、今からでも選択するのは正解だと思うが、なぜオワコン扱いされるのか不思議である。
今回は16bitPWMを複数備えており、扱いやすいPIC16F1579をコントローラに採用した。1つ140円なので、たくさん買っておくと大抵のことはこれで済んで便利。

PIC16F1579 8bit PICアーキテクチャ、最大動作周波数:32MHz、駆動電圧:1.8V-5.5V、プログラムメモリ:14KB、SRAM:1KB、10bitADC:12ch、16bitPWM:4ch、UART

コンピュータからのレベル指示は、0x21(ASCIIコード通常文字で一番小さい「!」)を0として、1文字で行われる。0x0から0x20までの任意のコードを送信すると、方向が転換する。これは、特別なソフトウェアなしにターミナルエミュレータのみで制御することを第一目標としたため。1回の受信だけで出力してしまうとノイズ耐性に問題があったので、2回連続同値受信で実行されるようにし、送信側では3回連続で送信する仕組みにした。

コンピュータとPICとの通信は、UARTで行われる。これは3.3Vまたは5Vによるシリアル通信で、RS232Cをレベルシフトしたものだ。USB-UART変換ケーブルというのがAmazonで200円程度で売っているので、極めて扱いやすい。ただし、3.3Vと5Vが混在しているのが罠で、これを同じにしないと文字化けを起こす。

PWM変調周波数は50kHzとかなり高く設定した。その結果、超低速での走行もできるようになったが、レールにスパークが原因と思われる汚れが多く付着するようになり、速度が低下する問題が発生した。いろいろと定数が変わってしまうので今回はこのままで運用したが、機械的反応速度は全く追いついていないと思われるので、メリットがなく、推奨はされない。

今回、出力レベルが上がるときに0.02秒間最大出力を出す仕組みを入れてある。これは超低速駆動するための仕掛けで、停止状態から動き出すための勢いをつけるのに有用である。

コントローラ装置はDCDCコンバータ・PICの乗っている制御基板と、トランジスタ・リレーの乗ったスイッチング基板の2つで構成されている。本当はHブリッジにより方向転換もフルデジタルにしたかったのだが、万が一プログラムにミスがあった時に短絡してしまうので、安全性を優先してリレーでの切り替えとした。FETでなくトランジスタを採用したのは、単純に制御電圧と動力電圧の橋渡しをする回路をつくるのが面倒だったからだ。消費電力を気にしなければ、高速トランジスタを使用することで回路をシンプルにするのは1つの策だろう。しかし、結果的に条件によっては素子の温度が高くなってしまったのは、反省である。製作に当たってはブレッドボードに試作して、プログラムを書き、回路図に起こし、実体配線図を書き、実装するという手順を踏んだ。

試作時、リレーが駆動する方向転換時にコントローラがリセットしてしまう不具合があった。これはリレーのL成分により電圧が不安定になるのが原因だったため、パスコン(積層セラミックコンデンサ)を電源ラインへ挿入することで解決した。ノイズは常に意識して設計しないといけないことを学んだ。

シリアルとPythonの受け渡しにはPySerialを使用する。このとき、まれに壊れたデータが送られてくるのを前提にしてtimeoutとwrite_timeoutを設定して、不正なレスポンスは読み飛ばすプログラムを書く必要がある。実際、直前の動作テストで、数十分に一回異常データが送られてきたときに落ちるバグが発覚して原因究明に焦ることになった。

マスコン

そもそも運転台を作ることになったきっかけは、ヤフオク巡りでDE15形ディーゼル機関車のマスコンを見つけたことであった。25000円程度で落札することができた。届いてみるとだいぶ大きく、一人では持ち上げるのも困難なほどの重量があった。後になって、実はディーゼル機関車そのもののマスコンではなく、除雪モジュールであるラッセルヘッドのマスコンであることに気がついた。そのため目標としていたDE10形ディーゼル機関車のものとは左右は逆になってしまったが、気にしないことで解決した。実は、マスコンが左にある機関車は、小移動を繰り返す入換(駅構内で客車や貨車を繋ぎ変えること)機に限られ少数派である。

ノッチ(出力レベル)位置を検出する仕組みはシンプルだ。レバー操作に従って下にある切り欠きのある銅板が貼られたドラムが回転し、固定された接点が銅板に触れて、接点への加圧・非加圧で2値となる。接点は6個あり、0から14までが区別できる。

IMAG0219.jpg

これをまたPIC16F1579で読み出し、0.1秒ごとにPICへシリアル伝送をする基板を製作し、Pythonで受信するプログラムを書いた。

IMAG0884.jpg

マスコンは単体では自立しない不安定な形状をしているので、机の天板をピッタリのサイズにくり抜いたものが必要となる。電動工具のジグソーとドリルで木工をすることで、単体で自立する机状のマスコンユニットが完成した。

ブレーキ統合ユニット

右手が用意できたら、次は左手のブレーキが欲しくなる。
残念ながら、ブレーキはレバーのみしか本物を入手できなかった。そのため、アルミケースにポテンショメータを固定して、そこにブレーキハンドルを取り付けることで実現した。

ブレーキハンドルの軸穴にネジを通して、ナットでネジと固定、ネジをカップリングに取り付けて、反対側にポテンショメータの軸を固定することで締結をした。しかし、ここが構造上の弱点となってしまい、本番中に何度か緩まることがあったのが残念だった。改善方法としては、ネジロック剤の塗布、旋盤でカップリング接続部のネジ山を削るなどが考えられる。

ブレーキハンドルの実物はだいぶ回転トルクが高い(回すのに力を要す)が、ポテンショメータと直結しているので、回転は相当に軽くなってしまう。メーカーは小ロットでも特注で回転トルクの高いものを作れると言ってくれたが、納期が全く間に合わない。苦肉の策で高張力バネで紙やすりを押し付けることである程度の向上はできたが、ギヤなどで重くするのが正解と思われる。

スピーカーと振動ユニットとSounderクラス

IMAG0878.jpg

フルサウンドNゲージ鉄道模型コントローラということで、操作に応じた音がアナログ出力される。アナログ出力を直接分岐して、運転士座席の裏に固定されたウーファーが振動しつつ、音がスピーカ+ウーファーから出力される。

音は、主に小坂レールパークで録音したDD13液体式ディーゼル機関車のものとなっている。

DSC06053

コンピュータからの出力はSounderクラスを使用する。PygameでALSAから出しており、これを呼び出すことで音が出る。

DE10クラス

知恵袋に記載されていたDE10の加速度を参考にして、ノッチとブレーキハンドル角度から0.1秒ごとに速度を計算する。もっともこれは単機のときのものなので、適当な係数を掛けた。

将来的には、元空気溜めの空気量を管理すると、コンプレッサの作動も制御できるかもしれない。

NControllerクラス

シリアル通信との送受信は非同期に実施したいため、threadingによりマルチプロセスを起動することで管理する。共有メモリによりシリアル送受信プロセスと通信する。

カテゴリー: コンピュータ, 鉄道, 電気電子, Python | コメントをどうぞ

Linux(Xubuntu18.04)からNATを通してL2TP/IPsecクライアント接続する

network-manager-l2tp-gnome とかでやろうとしたのですが接続の確立に失敗します。

原因を探るのにはjournalctl -e でログを見ました。INVALID_ID_INFORMATION hash n(inval_id) と怒られていて、理由はNAT環境のせいで送信元IPアドレスと伝えているIPアドレス(192.168.x.x)が異なるからでした。

ワークアラウンドとしてはIPsecのコンフィグでleftidとしてNAT外側のIPアドレスを指定するのがよさそう(しかし、これは可変する環境ではめちゃくちゃ面倒。0.0.0.0とかで効かないかな?)なのですが、NetworkManagerを挟んだ状態でleftid(実際の送信元IPアドレス)を書き換える方法が不明だったので、コンソールベースで行いました。

方法はこちらを参考にしました。

Linux上でのL2TP/IPSecのクライアント設定 – Qiita

投入したコマンドは以下

sudo vim /etc/ipsec.conf
sudo vim /etc/ipsec.secrets 
sudo systemctl restart ipsec
sudo ipsec status
sudo vim /etc/xl2tpd/xl2tpd.conf 
sudo vim /etc/ppp/options.l2tpd.client
sudo systemctl restart xl2tpd.service
sudo vim /etc/xl2tpd/l2tp-secrets
ip link
xl2tpd-control connect l2tp-nat
journalctl -e
sudo ip route add 10.200.0.0/24 via 10.200.0.101 dev ppp0
カテゴリー: コンピュータ, 通信 | コメントをどうぞ

OpenResty(nginx)とLuaとRedisでデモWebサービスをつくった

スクリーンショット_2018-11-18_14-32-34

Luaは速いことで有名ですね。実はnginxにはLuaを埋め込めるのですが、これでWebサービスを作ったらかっこよさそうなので、技術デモとして作ってみました。

今回は素のnginxではなく、Luaを便利に使えるようにしたOpenRestyを使用しました。自宅サーバでやってもいいのですが、デモ後に環境を綺麗にするのが手間なので、Google Compute Engineを使いました。

configurationに直接書くのもできますが、100行弱まで長くなったので分離しました。

worker_processes 24
location / {
  default_type text/html;
  content_by_lua_file /home/mipsparc/luachat/main.lua;
}

https://github.com/mipsparc/luachat/blob/master/main.lua

Luaプログラミングは初めてです。ライブラリに基本的なものしかない上に、Webプログラミングなんて前提にされていないので、自分で1から作る感覚が面白かったです。

しばらくはここでホストしておくので、試してみてください。
http://35.243.116.247/

測定結果

条件: GCE(vCPU x 8、メモリ 9.25 GB)のlocalからApacheBenchでテスト

参考: 404静的ページ 23589req/s, 2ms(95%) 下記と同じ

GET / (CookieのセッションIDが正規かRedisで確認、Redisから投稿一覧を取得して表示)

$ ab -c 32 -n 10000 -C 'sess=IQHUKNJXEfb5XzBXa72SfsOi4xfmZpJB' http://35.243.116.247/

14375req/s, 3ms(95%)

POST / (CookieのセッションIDがPOST内容と同じで正規かRedisで確認、Redisに投稿を追加してリダイレクト)

$ ab -c 32 -n 10000 -C 'sess=IQHUKNJXEfb5XzBXa72SfsOi4xfmZpJB' -p postfile http://35.243.116.247/

12747req/s, 4ms(95%)

割と高速にレスポンスを返せているかと思います。Webサービスを作るのにはプリミティブすぎてあまりおすすめはできないかもしれないですが、複雑なルーティングや認証基盤としては手軽で高速なのでありかもしれないです。

実際には一番重いのがRedisだろうとおもうので、コネクションプールなどの工夫をすれば更に高速にできそうです。

カテゴリー: コンピュータ | コメントをどうぞ