2019年8月30日金曜日

Openwrtでオレオレなパッケージ

Openwrtでオレオレなパッケージ

温度差と仕事が忙しすぎて、やる気が1/10くらいになっている。
睡眠不足だし、悪循環だよね。
今回は、オレオレなパッケージを作ってみる。
ドライバーの作り方も整理したかったけど、また後で。

オレオレなパッケージ

この手順通りでやってみる
https://openwrt.org/docs/guide-developer/helloworld/start

クロスコンパイルツールチェーンの準備

make toolchain/install

HelloWorldをやってみる

ソースの準備

https://openwrt.org/docs/guide-developer/helloworld/chapter2
まずはこの手順に従い、対象となるHelloWorldを作成する。
[myapp/helloworld/helloworld.c]
#include <stdio.h>
int main(void)
{
    printf("\nHello, world!\n\n");
        return 0;
}
https://openwrt.org/docs/guide-developer/helloworld/chapter3

Makefileの準備

Makefileは上記サンプルからパスのみ変更
[mypackages/examples/helloworld/Makefile]
include $(TOPDIR)/rules.mk

# Name, version and release number
# The name and version of your package are used to define the variable to point to the build directory of your package: $(PKG_BUILD_DIR)
PKG_NAME:=helloworld
PKG_VERSION:=1.0
PKG_RELEASE:=1

# Source settings (i.e. where to find the source codes)
# This is a custom variable, used below
SOURCE_DIR:=/******/myapp/helloworld

include $(INCLUDE_DIR)/package.mk

# Package definition; instructs on how and where our package will appear in the overall configuration menu ('make menuconfig')
define Package/helloworld
 SECTION:=examples
 CATEGORY:=Examples
 TITLE:=Hello, World!
endef

# Package description; a more verbose description on what our package does
define Package/helloworld/description
 A simple "Hello, world!" -application.
endef

# Package preparation instructions; create the build directory and copy the source code. 
# The last command is necessary to ensure our preparation instructions remain compatible with the patching system.
define Build/Prepare
 mkdir -p $(PKG_BUILD_DIR)
 cp $(SOURCE_DIR)/* $(PKG_BUILD_DIR)
 $(Build/Patch)
endef

# Package build instructions; invoke the target-specific compiler to first compile the source file, and then to link the file into the final executable
define Build/Compile
 $(TARGET_CC) $(TARGET_CFLAGS) -o $(PKG_BUILD_DIR)/helloworld.o -c $(PKG_BUILD_DIR)/helloworld.c
 $(TARGET_CC) $(TARGET_LDFLAGS) -o $(PKG_BUILD_DIR)/$1 $(PKG_BUILD_DIR)/helloworld.o
endef

# Package install instructions; create a directory inside the package to hold our executable, and then copy the executable we built previously into the folder
define Package/helloworld/install
 $(INSTALL_DIR) $(1)/usr/bin
 $(INSTALL_BIN) $(PKG_BUILD_DIR)/helloworld $(1)/usr/bin
endef

# This command is always the last, it uses the definitions and variables we give above in order to get the job done
$(eval $(call BuildPackage,helloworld))
結構たくさんやることあるね
https://openwrt.org/docs/guide-developer/helloworld/chapter4

feedとして登場させるための準備

[feeds.conf]
src-link mypackages /******/mypackages
ソースはmyapp、Makefileはmypackagesという設定のようだ。
このあたりは、パラメータで自由に出来るところ。

パッケージの生成

./scripts/feeds update mypackages
./scripts/feeds install -a -p mypackages
これで、
[bin/packages/aarch64_cortex-a53/mypackages]に
Packages
Packages.gz
Packages.manifest
Packages.sig
helloworld_1.0-1_aarch64_cortex-a53.ipk
が生成された!
memuconfigで組み込んだり、単独でコンパイルすることも出来そうだ。
make package/helloworld/compile



やったー。

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

ここまでくれば、いつものパッケージと同じ
opkg install helloworld_1.0-1_aarch64_cortex-a53.ipk

2019年8月18日日曜日

Openwrtでオレオレなレポジトリ

暑くてやる気が1/3くらいになっている。
そんなんで、いろいろミスするよね・・・。
今回は、fon2405e改にasterisk入れようと思ったけど、フラッシュメモリ8MBじゃあ到底入らなかった。
事前に検証しておけばよかったね。
ということで、タイトルがこんな感じになっている。

久しぶりのソースからビルド

基本的には、前回と同じだけど。
https://continue-to-challenge.blogspot.com/2019/01/fon2405eopenwrt.html
fon2405e用にいくつか変えないといけない。

Openwrtのソース取得→生成

git clone https://git.openwrt.org/openwrt/openwrt.git
cd openwrt
./scripts/feeds update -a
./scripts/feeds install -a

ベースとなる変更

変更点は以下の3ファイル
ファイル名だったりが前回と違うみたい。
grep -lri fon2405e target/
target/linux/ramips/image/rt305x.mk
target/linux/ramips/dts/rt3050_fon_fon2405ekai.dts
target/linux/ramips/base-files/etc/board.d/01_leds

rt305x.mk

前回と記載内容がちょっと異なる。
@@ -527,6 +527,16 @@ define Device/fon_fonera-20n
 endef
 TARGET_DEVICES += fon_fonera-20n
 
 +define Device/fon_fon2405ekai
+  MTK_SOC := rt3050
+  IMAGE_SIZE := 7872k
+  IMAGES += factory.bin
+  DEVICE_VENDOR := Fon
+  DEVICE_MODEL := Fon2405ekai
+  SUPPORTED_DEVICES += fon_fon2405ekai
+endef
+TARGET_DEVICES += fon_fon2405ekai
+
 define Device/hame_mpr-a1
   MTK_SOC := rt5350
   BLOCKSIZE := 4k

rt3050_fon_fon2405ekai.dts

[partition@20000]に「compatible = “denx,uimage”;」を追加した。
これがないとoverlayが出来ないみたい。
@@ -0,0 +1,104 @@
+/dts-v1/;
+
+#include "rt3050.dtsi"
+
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+
+/ {
+ compatible = "fon,fon2405ekai", "ralink,rt3050-soc";
+ model = "FON2405E Kai";
+
+ aliases {
+  led-boot = &led_power_green;
+  led-failsafe = &led_power_green;
+  led-running = &led_power_green;
+  led-upgrade = &led_power_green;
+ };
+
+ gpio-keys-polled {
+  compatible = "gpio-keys-polled";
+  poll-interval = <20>;
+
+  reset {
+   label = "reset";
+   gpios = <&gpio0 10 GPIO_ACTIVE_LOW>;
+   linux,code = <KEY_RESTART>;
+  };
+
+  wps {
+   label = "wps";
+   gpios = <&gpio0 0 GPIO_ACTIVE_LOW>;
+   linux,code = <KEY_WPS_BUTTON>;
+  };
+ };
+ gpio-leds {
+  compatible = "gpio-leds";
+  wan {
+   label = "fon2405ekai:green:wan";
+   gpios = <&gpio0 12 GPIO_ACTIVE_LOW>;
+  };
+  led_power_green: lan {
+   label = "fon2405ekai:green:lan";
+   gpios = <&gpio0 11 GPIO_ACTIVE_LOW>;
+  };
+  wps {
+   label = "fon2405ekai:green:wps";
+   gpios = <&gpio0 14 GPIO_ACTIVE_LOW>;
+  };
+ };
+};
+
+&spi0 {
+ status = "okay";
+
+ m25p80@0 {
+  compatible = "jedec,spi-nor";
+  reg = <0>;
+  spi-max-frequency = <10000000>;
+
+  partitions {
+   compatible = "fixed-partitions";
+   #address-cells = <1>;
+   #size-cells = <1>;
+
+            partition@0 {
+                label = "u-boot";
+                reg = <0x0 0x10000>;
+                read-only;
+            };
+
+            devconf: partition@10000 {
+                label = "devconf";
+                reg = <0x10000 0x10000>;
+                read-only;
+            };
+
+            firmware: partition@20000 {
+                compatible = "denx,uimage";
+                label = "firmware";
+                reg = <0x20000 0x7b0000>;
+            };
+        };
+ };
+};
+
+&pinctrl {
+ state_default: pinctrl0 {
+  gpio {
+   ralink,group = "i2c", "jtag", "rgmii", "mdio", "uartf";
+   ralink,function = "gpio";
+  };
+ };
+};
+
+&ethernet {
+ mtd-mac-address = <&devconf 0x4>;
+};
+
+&esw {
+ mediatek,portmap = <0x2f>;
+};
+
+&wmac {
+ ralink,mtd-eeprom = <&devconf 0>;
+};

01_leds

@@ -170,6 +170,7 @@ dlink,dwr-922-e2)
  ucidef_set_led_netdev "4g" "4g" "$boardname:green:4g" "wwan0" "tx rx"
  ;;
 dovado,tiny-ac|\
+fon,fon2405ekai|\
 fon,fonera-20n)
  set_wifi_led "$boardname:orange:wifi"
  ;;

ビルド

make -j4 V=99
ls -l bin/targets/ramips/rt305x/
合計 9972
-rw-r--r-- 1 adeno adeno    2505  8月 18 16:36 config.buildinfo
-rw-r--r-- 1 adeno adeno     263  8月 18 16:36 feeds.buildinfo
-rw-r--r-- 1 adeno adeno    3099  8月 18 16:39 openwrt-ramips-rt305x-fon-fon2405ekai.manifest
-rw-r--r-- 1 adeno adeno 3361462  8月 18 16:39 openwrt-ramips-rt305x-fon_fon2405ekai-initramfs-kernel.bin
-rw-r--r-- 1 adeno adeno 3407898  8月 18 16:39 openwrt-ramips-rt305x-fon_fon2405ekai-squashfs-factory.bin
-rw-r--r-- 1 adeno adeno 3408666  8月 18 16:39 openwrt-ramips-rt305x-fon_fon2405ekai-squashfs-sysupgrade.bin
drwxr-xr-x 2 adeno adeno    4096  8月 18 16:37 packages
-rw-r--r-- 1 adeno adeno     740  8月 18 16:39 sha256sums
-rw-r--r-- 1 adeno adeno      17  8月 18 16:36 version.buildinfo
これの[openwrt-ramips-rt305x-fon_fon2405ekai-initramfs-kernel.bin]を使って書き換えを行う

Luciアクセス

Web(Lcui)にアクセスしてみる


(OpenWrt SNAPSHOT, r0+10779-51fec85)

[openwrt-ramips-rt305x-fon_fon2405ekai-squashfs-sysupgrade.bin]にてファームアップを行う。これで、overlayされる。
#df -h
Filesystem                Size      Used Available Use% Mounted on
/dev/root                 3.0M      3.0M         0 100% /rom
tmpfs                    13.9M    432.0K     13.5M   3% /tmp
tmpfs                    13.9M     68.0K     13.8M   0% /tmp/root
tmpfs                   512.0K         0    512.0K   0% /dev
/dev/mtdblock5            4.5M    248.0K      4.2M   5% /overlay
overlayfs:/overlay        4.5M    248.0K      4.2M   5% /
これで準備できた

オレオレなリポジトリ

https://qiita.com/hnw/items/17f3a63dbc153f8a5c34
を参考にオレオレのリポジトリを追加する

サーバー側の準備

ls -l bin/packages/mipsel_24kc/
合計 20
drwxr-xr-x 2 adeno adeno 4096  8月 18 16:37 base
drwxr-xr-x 2 adeno adeno 4096  8月 18 02:10 luci
drwxr-xr-x 2 adeno adeno 4096  8月 18 02:11 packages
drwxr-xr-x 2 adeno adeno 4096  8月 18 01:30 routing
drwxr-xr-x 2 adeno adeno 4096  8月 18 16:38 telephony
このデイレクトリをルートにhttpサーバーを構築する。
今回は一時的に欲しいだけなのでphpを用いて
php -S 192.168.2.10:8000
これでOK

デバイス側の準備

/etc/opkg/customfeeds.conf
# add your custom package feeds here
#
# src/gz example_feed_name http://www.example.com/path/to/files
src/gz my_feed_base http://192.168.2.10:8000/base
src/gz my_feed_luci http://192.168.2.10:8000/luci
src/gz my_feed_packages http://192.168.2.10:8000/packages
src/gz my_feed_routing http://192.168.2.10:8000/routing
src/gz my_feed_telephony http://192.168.2.10:8000/telephony
これでOK
opkg updateとかやってみて、ちゃんとオレオレから取得出るかを確認する

asteriskのインストール(容量不足で失敗)

opkg install asterisk16 asterisk16-cdr asterisk16-chan-sip \
asterisk16-codec-gsm asterisk16-codec-ulaw asterisk16-format-gsm \
asterisk16-format-pcm asterisk16-res-agi asterisk16-res-rtp-asterisk
途中まではうまく行ったけど、容量不足で失敗…。
こうなったらeMMCとかMMCカードか?
今日はここまで。

中古ルーターにAsteriskを入れてみる

Buffalo WZR-HP-AG300Hをハードオフで300円でゲットした。
最初は昔買ったfonとかnanopiに入れようかと思ったけど、
複数のVoIPゲートウェイを接続して見たかったからHUBがあるルーターって選択肢として結構ありかも。

OpenWrtインストール

分解してUARTまで接続したけど、実はそんなことしなくても大丈夫だった。
https://openwrt.org/toh/buffalo/wzr-hp-ag300h
  1. 初期化する
  2. 192.168.11.1にアクセスすると管理画面が開く(root/パス無しで)
  3. ファームアップにて[openwrt-18.06.4-ar71xx-generic-wzr-hp-ag300h-squashfs-factory.bin]を書き込む
  4. 192.168.1.1にアクセスすると管理画面が開く
  5. ファームアップにて[openwrt-18.06.4-ar71xx-generic-wzr-hp-ag300h-squashfs-sysupgrade.bin]を書き込む
これで、OpenWrt化完了
@import “中古ルーターにAsteriskを入れてみる\openwrt.png”
その他の設定は良きに計らう

asteriskをインストール

root@OpenWrt:~# opkg install asterisk15 asterisk15-cdr \
asterisk15-chan-sip asterisk15-codec-ulaw asterisk15-res-rtp-asterisk \
asterisk15-format-gsm asterisk15-codec-gsm asterisk15-format-pcm asterisk15-res-agi
GUIからでも良いけど、なんとなく

まずは相互通話

/etc/asterisk/sip.conf
[general]
context=default
port=5060
bindaddr=0.0.0.0
language=ja
;nat=yes
allowguest=no
allow=ulaw
allow=alaw
allow=gsm

[user1]
type=friend
defaultuser=user1
secret=password1
host=dynamic
canreinvite=no

[user2]
type=friend
defaultuser=user2
secret=password2
host=dynamic
canreinvite=no
/etc/asterisk/extensions.conf
[default]
exten => 1,1,Dial(SIP/user1,30,r)
same  => n,Hangup()

exten => 2,1,Dial(SIP/user2,30,r)
same  => n,Hangup()
/etc/init.d/asterisk restart
通話できた!

USBメモリを使えるようにする

何かと使えるようにしておくと便利か
https://openwrt.org/docs/guide-user/storage/usb-drives-quickstart
https://rc30-popo.hatenablog.com/entry/20160103/1451829248
/etc/asterisk/extensions.conf
exten => 5,1,Goto(my-ivr,s,1)

[my-ivr]
exten => s,1,Set(dir=/mnt/sda1/)
exten => s,n,Ringing()
exten => s,n,Wait(3)
exten => s,n,Answer()
exten => s,n,Playback(${dir}music)
みたいな

USBシリアル変換を使えるようにする

これもついでに
https://qiita.com/hnw/items/9b5c99fa73e3716f67d2
今回は確かこれのはず
http://www.aitendo.com/product/13039
opkg install kmod-usb-serial-pl2303
これで/dev/ttyUSB0みたいに認識できた。
やっはりUSBがあるルーターは便利だ。夢が広がる。
(死ぬほどあるFON2405Eの出番がますます無くなる・・・)

PHPインストール

opkg install php7 php7-cli zoneinfo-asia

phpagi

PCでやった時と同じように
phpagi.php - The main phpagi class.
を/usr/share/asterisk/agi-binに保存する。改行コードとかに注意する。
あとはdtmf.phpを少し変更して
#!/usr/bin/php-cli -q
<?php
    /**************************************************
     *  dtmf.php
     **************************************************/

    set_time_limit(30);
    require_once('phpagi.php');
    error_reporting(E_ALL);
    //die("Syntax ok\n"); // line A: uncomment for syntax test

    define('ANS_TONE', '/usr/share/asterisk/sounds/dtmf');
    define('LOG_PATH', '/tmp/dtmf.log');
    define('TIMEOUT', 1000);

    /* log用 */
    $fp = fopen(LOG_PATH, "w");
    fwrite($fp, date("Y/m/d H:i:s")."\t"."Log File.\n");

    /* AGI */
    $agi = new AGI();
    $agi->answer();

  do
  {
    $result = $agi->get_data('/usr/share/asterisk/sounds/beep', 3000, 20);
    $keys = $result['result'];
    fwrite($fp, date("Y/m/d H:i:s")."\tDTMF=".$keys."\n");
  } while($keys != '111');
  $agi->hangup();

?>

も一緒に保存した。
あとは、
/etc/asterisk/extensions.conf
exten => 6,1,agi(dtmf.php)
これで出来た。

2019年8月11日日曜日

VoIPで遊ぶ

興味半分・仕事1/4、なんとなく1/4くらいの感じ。
アナログ電話をいい感じに制御して遊びたくなった。
今頃っ!? 意外としぶとく残っているよ。
こんなのとかいつかは欲しいね
https://www.amazon.co.jp/Asterisk用-TDM410P-Issabel-Freepbx-asterisknow/dp/B01L5MGR9E/ref=lp_4443506051_1_16?srs=4443506051&ie=UTF8&qid=1565275361&sr=8-16
今回は、お試しとして「LINKSYS PAP2T VoIPアダブタ」を入手してみた
https://www.amazon.co.jp/VoIPアダプタ-VBESTLIFE-VoIPゲートウェイ-アナログ電話アダプタ-V2プロトコル/dp/B07KS2P9G4/ref=sr_1_3?__mk_ja_JP=カタカナ&keywords=VoIPアダプタ+VBESTLIFE+VoIPゲートウェイ+IP電話&qid=1565019126&s=electronics&sr=1-3
https://www.voip-info.jp/index.php/Linksys_PAP2T
コール音を日本風に
https://shin.4-u.jp/blog/kaden/135/



外線につなぐつもりも無いし、契約していないので、
PAP2Tと古いスマホで内線電話構築して遊んでみる。

Asteriskインストール

この手順で、とりあえず開発PCに入れてみた。
https://qiita.com/sgrowd/items/dd1fc682718a2a623e4c

まずは相互通話

/etc/asterisk/sip.conf
[general]
context=default
port=5060
bindaddr=0.0.0.0
language=ja
;nat=yes
allowguest=no
allow=ulaw
allow=alaw
allow=gsm

[user1]
type=friend
defaultuser=user1
secret=password1
host=dynamic
canreinvite=no

[user2]
type=friend
defaultuser=user2
secret=password2
host=dynamic
canreinvite=no
/etc/asterisk/extensions.conf
[default]
exten => 1,1,Dial(SIP/user1,30,r)
same  => n,Hangup()

exten => 2,1,Dial(SIP/user2,30,r)
same  => n,Hangup()
Dialの説明はここ
https://www.voip-info.org/asterisk-cmd-dial/

PAP2T




[Proxy]のところにAstersik SIPサーバーのIPを設定した。

スマホ

MIZUDROIDとZoiperを試してみた。
ともに音が小さいなぜだろう。
ZoiperではSetting→Audio→SpeakerGainを0dBから10dBにしてみたら多少良くなった。

自動応答

電話かけたら自動応答をやってみる。
https://scc.kokushin-u.jp/2019/01/19/asterisk-ivr/

音声ファイルの準備

どうやらgsm形式とかulaw形式のファイルを準備する必要があるみたい
https://p--q.blogspot.com/2015/04/soxsound-exchangemp3.html
 sudo apt-get install sox libsox-fmt-all
 どっちか
 sox src.mp3 -r 8000 -c 1 dst.gsm
 sox src.mp3 -r 8000 -c 1 -e u-law -t wav dst.ulaw

設定ファイル

/etc/asterisk/extensions.conf
exten => 3,1,Goto(my-ivr,s,1)
[my-ivr]
exten => s,1,Set(dir=/home/asterisk/)
exten => s,n,Ringing()
exten => s,n,Wait(3)
exten => s,n,Answer()
exten => s,n,Playback(${dir}dst)
https://www.voip-info.org/asterisk-cmd-playback/
https://www.voip-info.org/convert-wav-audio-files-for-use-in-asterisk/

自動応答の実験

3にコールするとdst.gsm/ulawが再生される。
いいね! 音質はお察しくださいって感じ。

AGIで遊んでみる

AGIとはAsterisk Gateway Interfaceという、外部との連携するしくみ
https://www.voip-info.org/asterisk-agi
https://my-scribble.net/raspberrypiでスマートホーム-〜asteriskで家庭内電話-その3-agiでシ/
いろいろな言語で使えるみたい。
Pythonとかちょっと気になるけど、インターネットから遮断されている環境でも使うかもしれないので、使い慣れたPHPで…

phpagi

http://phpagi.sourceforge.net/
https://sourceforge.net/projects/phpagi/files/
これの[phpagi-2.20.tgz]と[phpagi-examples-2.20.tgz]をダウンロード。
phpagi.php - The main phpagi class.
phpagi-asmanager.php - The Asterisk Manager class.
を/usr/share/asterisk/agi-binに保存する。
改行コードとかに注意する。
サンプルとして
dtmf.php
も一緒に保存した。
あとは、
/etc/asterisk/extensions.conf
exten => 5,1,agi(dtmf.php)
いざ電話をかけてみると、喋らないOrz
AGIのデバック方法をいろいろ調べた。
https://www.linux.com/news/debugging-asterisk-agi-phpagi-and-festival
http://www.ne.jp/asahi/davinci/code/asterisk/install/index2.html
どうやらtxt2wavでつまずいている。
https://github.com/leoburd/asterisk/blob/master/phpagi.conf
text2waveってなにさ
http://manpages.ubuntu.com/manpages/bionic/man1/text2wave.1.html
なるほど、テキストを喋ってくれるのね。
せっかくなら日本語が良いなー。
google TTSの例はあったけど、陸の孤島環境でも使いたいので
そんな迷える僕の強い味方OpenJTalkを使わせてもらう。

OpenJTalkの準備

昔苦労してインストールしたような気がするけど、便利になったね。
http://open-jtalk.sp.nitech.ac.jp/
http://thr3a.hatenablog.com/entry/20180223/1519360909
https://qiita.com/lutecia16v/items/8d220885082e40ace252
sudo apt-get install open-jtalk open-jtalk-mecab-naist-jdic hts-voice-nitech-jp-atr503-m001
meiさんもダウンロード
https://sourceforge.net/projects/mmdagent/files/MMDAgent_Example/
テスト
https://qiita.com/sukesuke/items/be2a4562bd809ccc0fab
echo "こんにちは" | open_jtalk -x /var/lib/mecab/dic/open-jtalk/naist-jdic/  \
-m /usr/share/hts-voice/mei/mei_normal.htsvoice -ow /dev/stdout | aplay --quiet
8kbpsにしようとしてサンプリング周波数設定したらとんでもないことになった
echo "こんにちは" | open_jtalk -x /var/lib/mecab/dic/open-jtalk/naist-jdic/ \
-m /usr/share/hts-voice/mei2/mei_normal.htsvoice -s 8000 -ow /dev/stdout | aplay --quiet
なので、sox使って変更することにした。

phpagiから呼び出す

といってもちょっと書き換えただけ

phpagi.conf

/etc/asterisk/phpagi.conf
[OpenJTalk]
open_jtalk=/usr/bin/open_jtalk
dic=/var/lib/mecab/dic/open-jtalk/naist-jdic/
htsvoice=/usr/share/hts-voice/mei2/mei_happy.htsvoice
other_option='-r 1.1'

phpagi.php

/usr/share/asterisk/agi-bin/phpagi.php
166行目あたり
        // swift TTS config
        if(!isset($this->config['cepstral']['swift'])) $this->config['cepstral']['swift'] = $this->which('swift');

        // Open JTalk
        if(!isset($this->config['OpenJTalk']['open_jtalk'])) $this->config['OpenJTalk']['open_jtalk'] = $this->OpenJTalk('OpenJTalk');
        if(!isset($this->config['OpenJTalk']['dic'])) $this->config['OpenJTalk']['dic'] = $this->OpenJTalk('dic');
        if(!isset($this->config['OpenJTalk']['htsvoice'])) $this->config['OpenJTalk']['htsvoice'] = $this->OpenJTalk('htsvoice');
        if(!isset($this->config['OpenJTalk']['other_option'])) $this->config['OpenJTalk']['other_option'] = $this->OpenJTalk('other_option');

1334行目あたり
    function text2wav($text, $escape_digits='', $frequency=8000)
    {
        省略
    }

    function open_jtalk($text, $escape_digits='', $frequency=8000)
    {
        $text = trim($text);
        if($text == '') return true;

        $hash = md5($text);
        $fname = $this->config['phpagi']['tempdir'] . DIRECTORY_SEPARATOR;
        $fname .= 'open_jtalk' . $hash;

        // create wave file
        if(!file_exists("$fname.wav"))
        {
          // write text file
          if(!file_exists("$fname.txt"))
          {
            $fp = fopen("$fname.txt", 'w');
            fputs($fp, $text);
            fclose($fp);
          }

          shell_exec("cat $fname.txt | {$this->config['OpenJTalk']['open_jtalk']} -x {$this->config['OpenJTalk']['dic']} -m {$this->config['OpenJTalk']['htsvoice']}  {$this->config['OpenJTalk']['other_option']} -ow $fname.wav.wk");
          shell_exec("sox $fname.wav.wk -r 8000 $fname.wav");
        }
        else
        {
          touch("$fname.txt");
          touch("$fname.wav.wk");
          touch("$fname.wav");
        }

        // stream it
        $ret = $this->stream_file($fname, $escape_digits);

        // clean up old files
        $delete = time() - 2592000; // 1 month
        foreach(glob($this->config['phpagi']['tempdir'] . DIRECTORY_SEPARATOR . 'open_jtalk*') as $file)
          if(filemtime($file) < $delete)
            unlink($file);

        return $ret;
    }

dtmf.php

/usr/share/asterisk/agi-bin/dtmf.php
日本語だぜー

#!/usr/bin/php -q
<?php
  set_time_limit(30);
  require('phpagi.php');
  error_reporting(E_ALL);
  //die("Syntax ok\n"); // line A: uncomment for syntax test

  $agi = new AGI();
  $agi->answer();

  $agi->open_jtalk("こんにちわ。今日も暑いですね。");
  do
  {
  //  $agi->text2wav('Enter some numbers and then press the pound key. Press 1 1 1 followed by the pound key to q$
    $agi->open_jtalk("ボタンを押して何か数字を入力してください。終了する場合は、111と入力してください。");
    $result = $agi->get_data('/var/lib/asterisk/sounds/beep', 3000, 20);
    $keys = $result['result'];
    $agi->open_jtalk("あなたが入力したのは $keys です。");
  } while($keys != '111');
  $agi->open_jtalk('さようなら!');
  $agi->hangup();
?>
とりあえず今日はここまで。

2019年8月2日金曜日

バックアップについて

12月頃にHOMEサーバーの環境を移行してから、バックアップが手薄になっていた。
https://continue-to-challenge.blogspot.com/2018/10/nextcloud.html
https://continue-to-challenge.blogspot.com/2018/12/gogs.html
今回はせめて再構築が用意になるように外付けHDDにバックアップを行うことにした。
対象
  • nextcloud
  • gogs
  • redmine
nextcloudには、家族の写真とかがあるので特に大事。

バックアップ

nextcloud

ほぼ先人と同じ
https://docs.nextcloud.com/server/15/admin_manual/maintenance/backup.html
https://denor.jp/nextcloudサーバのデータ自動バックアップ設定-snap版
https://takuya-1st.hatenablog.jp/entry/2018/11/20/020000
#!/bin/bash
NCPATH="/mnt/***/www/html/nextcloud"
NCDATA_PATH="/mnt/***/nextcloud/data"
TARGET="/mnt/usbhdd/nextcloud_backup"

echo start at `date`

echo "(STEP1)HDD spin-up"
sdparm -r --command=start /dev/sdd

echo "(STEP2)Maintenance Mode [ ON ]"
sudo -u www-data php ${NCPATH}/occ maintenance:mode --on

echo "(STEP3)Backup Config"
rsync -vAax ${NCPATH} ${TARGET}

echo "(STEP4)Backup Data"
rsync -vAax ${NCDATA_PATH} ${TARGET}

echo "(STEP5)Backup Database"
mysqldump --single-transaction -h localhost -u nextcloud -p****** nextcloud > ${TARGET}/nextcloud-sqlbkp.bak

echo "(STEP6)Maintenance Mode [ OFF ]"
sudo -u www-data php ${NCPATH}/occ maintenance:mode --off

echo "(STEP7)HDD spin-down"
sdparm -r --command=stop /dev/sdd

echo end at `date`

省電力化のためにスピンダウン入れてみたけど、効果は未知数。
smartで起動しちゃうみたいだし・・・。

gogs

大体ここの内容と同じ
https://gogs.io/docs/upgrade/upgrade_from_binary
#!/bin/bash
GGSPATH="/***/git/gogs"
GGSRPPATH="/***/git/gogs-repositories"
TARGET="/mnt/usbhdd/gogs_backup"

echo start at `date`

echo "(STEP1)gogs [ STOP ]"
systemctl stop gogs

echo "(STEP2)Backup Custom"
rsync -vAax ${GGSPATH}/custom ${TARGET}

echo "(STEP3)Backup Data"
rsync -vAax ${GGSPATH}/data ${TARGET}

echo "(STEP4)Backup Log"
rsync -vAax ${GGSPATH}/log ${TARGET}

echo "(STEP5)Backup Database"
mysqldump --single-transaction -h localhost -u gogs -p****** gogs_git  > ${TARGET}/gogs-sqlbkp.bak

echo "(STEP6)Backup Repository"
rsync -vAax ${GGSRPPATH} ${TARGET}

echo "(STEP7)gogs [ START ]"
systemctl start gogs

#echo "(STEP7)HDD spin-down"
#sdparm -r --command=stop /dev/sdd
echo end at `date`

redmine

本体はdocker、データベースはローカルのMariaDBを使用している。
https://continue-to-challenge.blogspot.com/2019/07/redmine.html
バックアップの方法
https://qiita.com/mikoski01/items/7d71ef7d167a6b78219a
http://redmine.jp/faq/system_management/backup/
#!/bin/bash
RMPATH="/srv/docker/redmine/redmine/files"
TARGET="/mnt/usbhdd/redmine_backup"

echo start at `date`

echo "(STEP1)redmine [ STOP ]"
docker stop redmine

echo "(STEP2)Backup Data"
rsync -vAax ${RMPATH} ${TARGET}

echo "(STEP3)Backup Database"
mysqldump --single-transaction -h localhost -u redmine -p****** redmine  > ${TARGET}/redmine-sqlbkp.bak

echo "(STEP4)redmine [ START ]"
docker start redmine

リストア

gogsの復元

ほぼ、この前の環境構築と同じ
https://continue-to-challenge.blogspot.com/2018/12/gogs.html
今回はテストとしてNanoPiに環境構築してみた。
  1. gogsインストールして
  2. MariaDBにデータベース作成
  3. バックアップからデータリストア
  4. 起動
の簡単4ステップ

redmineの復元

環境構築は、この前の手順で
https://continue-to-challenge.blogspot.com/2019/07/redmine.html
復元手順は
http://redmine.jp/faq/system_management/backup/
すいすい行くと思いきや
standard_init_linux.go:211: exec user process caused "exec format error"
なんだと!
どうやらNanoPiではARM用のイメージを使わないといけないらしい。
https://matatsuna.hatenablog.com/entry/2017/08/16/223039
公式のものがARM64対応していたのでそれにしてみる。
https://hub.docker.com/_/redmine
docker run --name=redmine -it --rm \
-e REDMINE_DB_USERNAME=redmine -e REDMINE_DB_PASSWORD=****** \
-e REDMINE_DB_DATABASE=redmine \
-e REDMINE_DB_MYSQL=192.168.1.13 -e REDMINE_DB_PORT=3306 \
-p 3000:3000 \
-v /srv/docker/files:/usr/src/redmine/files \
library/redmine:4.0.4
初期状態で起動が確認できたら、
  1. /srv/docker/redmineにfilesの中身を展開する
  2. データベースの復元
を行う。
できた!

nextcloudの復元

nextcloudには30GBくらいのデータが保存されているため、NanoPIのSDカードでは到底復元の環境に出来ない。
そこで、NanoPIに外付けHDDを装着した。 段々とNASキットが欲しくなる。
http://wiki.friendlyarm.com/wiki/index.php/1-bay_NAS_Dock_v1.2_for_NanoPi_NEO/NEO2#Hardware_Spec
https://www.friendlyarm.com/index.php?route=product/product&path=93&product_id=222
http://akizukidenshi.com/catalog/g/gM-12591/
ま、我慢だけどね。
ルートを外付けHDDに変更するには
nand-sata-install
https://lubtech.geo.jp/2017-09-10/?p=3048
環境構築はこの前の手順で
https://continue-to-challenge.blogspot.com/2018/10/nextcloud.html
こちらは特にARM/X86_64で違いはなく、当時の方法を思い出して行けば大丈夫。
ただし、復旧までの暫定・データ取り出しを目的としているためSSLは除外した。
うーん。眠い。

2019年7月23日火曜日

Redmineインストール

いまさらだけど、やっぱりタスク管理をやってみたくて
超メジャーにすることにした。
https://propagandes.info/redmine-install/
動作環境
http://guide.redmine.jp/RedmineInstall/#Requirements
あれ、MariaDBだめなの??
じゃあ、新たにPostgreSQLを入れるか、Dcoker使って環境作るか・・・。
まずはお試しなので、Docker使ってみようかな。
https://qiita.com/bezeklik/items/b9d75ee74e0ae4c6d42c
悩む・・。
https://www.untrustedconnection.com/2018/01/redmine-passenger-and-nginx-on-ubuntu.html
悩んだ時は巨人の肩に乗る!
https://github.com/sameersbn/docker-redmine

MariaDBのデータディレクトリ移動

よくよく見たら、データがraid環境下に保管されていなかった。あちゃー
cat /etc/mysql/mariadb.conf.d/50-server.cnf
-------------------------------------------
(略)
#
# * Basic Settings
#
user  = mysql
pid-file = /var/run/mysqld/mysqld.pid
socket  = /var/run/mysqld/mysqld.sock
port  = 3306
basedir  = /usr
datadir  = /var/lib/mysql
tmpdir  = /tmp
lc-messages-dir = /usr/share/mysql
skip-external-locking
(略)
のdatadirを"/mnt/4Traid1/dbdata"に変更したい
systemctl stop mariadb.service
50-server.cnfのdatadb書き換え
データ移動
systemctl start mariadb.service
これで少し安心。

いざRedmine

http://www.makcraft.com/blog/meditation/2019/01/19/running-redmine-on-docker-containers/

Dockerの準備

https://docs.docker.com/install/linux/docker-ce/ubuntu/
基本的にはこの手順。だけど、Ubuntuじゃないので、注意。
$ lsb_release -cs
tara
「tara」は「Ubuntu 18.04 LTS」をベースにしているらしい。
で、これのコードネームは「bionic」らしい。
https://ja.wikipedia.org/wiki/Linux_Mint
https://www.ubuntulinux.jp/News/ubuntu1804
なので、「$(lsb_release -cs)」の部分を書き換える。

まずはクイックスタートを試してみる

https://github.com/sameersbn/docker-redmine#installation
docker pull sameersbn/redmine:latest
docker run --name=postgresql-redmine -d --env='DB_NAME=redmine_production'   --env='DB_USER=redmine' --env='DB_PASS=password' --volume=/srv/docker/redmine/postgresql:/var/lib/postgresql sameersbn/postgresql:9.6-4
docker run --name=redmine -d --link=postgresql-redmine:postgresql --publish=5080:80 --publish=50443:443 --env='REDMINE_PORT=5080' --volume=/srv/docker/redmine/redmine:/home/redmine/data sameersbn/redmine:4.0.4
https://サーバー:5080にアクセスすると


おぉ!

外部SQLサーバーを使ってみる

せっかく母艦のほうにMariaDBがあるのでPostgreからこっちに切り替えてみる
Redmineのコンテナからアクセスできるようにする。振られたIPはなんだろうか?
https://qiita.com/miyatahirotaka/items/a44e2ae0bac53a4a5feb
https://qiita.com/suin/items/50033dc60bfba8553395
http://docs.docker.jp/engine/userguide/networking/dockernetworks.html
docker exec -i -t redmine bash
root@57a:/home/redmine/redmine# hostname -i
172.17.0.3

MariaDBの設定変更

外部からアクセス出来るようにする。
https://qiita.com/tocomi/items/0c009d7299584df49378
vi /etc/mysql/mariadb.conf.d/50-server.cnf
-----------
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
# bind-address            = 127.0.0.1
-----------
service mariadb restart

MariaDBにDBとユーザー作成

CREATE USER 'redmine'@'172.17.%' IDENTIFIED BY 'password';
CREATE DATABASE IF NOT EXISTS `redmine_production` DEFAULT CHARACTER SET `utf8` COLLATE `utf8_unicode_ci`;
GRANT ALL PRIVILEGES ON redmine.* TO 'redmine'@'172.17.%'
試しに、コンテナの中からアクセス出来るか確認してみる
docker exec -i -t redmine bash
root@57a:/home/redmine/redmine# mysql -u redmine -p --host==サーバーIP

起動中のRedmineとPostgreを停止する

プロセスの確認と停止
docker ps -a
CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS                     PORTS               NAMES
57aee49d39b6        sameersbn/redmine:4.0.4      "/sbin/entrypoint.sh…"   5 days ago          Exited (0) 5 seconds ago                       redmine
78b9389d7745        sameersbn/postgresql:9.6-4   "/sbin/entrypoint.sh"    5 days ago          Up 5 days                  5432/tcp            postgresql-redmine

docker stop redmine
docker stop postgresql-redmine
コンテナの削除
docker rm redmine
docker rm postgresql-redmine
http://www.risewill.co.jp/blog/archives/6793

外部SQLサーバーを指定して起動してみる

docker run --name=redmine -it --rm \
--env='DB_ADAPTER=mysql2' \
--env='DB_HOST=192.168.1.25' --env='DB_NAME=redmine_production' \
--env='DB_USER=redmine' --env='DB_PASS=password' \
--env='REDMINE_HTTPS=false' \
--publish=5080:80 --publish=50443:443 --env='REDMINE_PORT=5080' \
--volume=/srv/docker/redmine/redmine:/home/redmine/data \
sameersbn/redmine::4.0.4
さぁ



わぉOrz
ログを確認してみる。
docker exec -i -t redmine bash
tail -f /var/log/redmine/redmine/production.log
----
Started GET "/" for 127.0.0.1 at 2019-07-09 22:40:27 +0000
Processing by WelcomeController#index as HTML
Completed 500 Internal Server Error in 8ms (ActiveRecord: 3.8ms)
  
ActiveRecord::StatementInvalid (Mysql2::Error: Table 'redmine.settings' doesn't exist: SHOW FULL FIELDS FROM `settings`):
  
app/models/setting.rb:235:in `check_cache'
app/controllers/application_controller.rb:90:in `user_setup'
----
DBを見てみると、空っぽだった。なぜ?
http://guide.redmine.jp/RedmineInstall/#step-6-
https://qiita.com/bezeklik/items/b9d75ee74e0ae4c6d42c
初期設定が必要なのか??
docker exec redmine bundle exec rake db:migrate RAILS_ENV=production
docker exec redmine bundle exec rake redmine:load_default_data RAILS_ENV=production REDMINE_LANG=ja
これで再度アクセスしてみると



やったー
admin/adminで入ろう
よしよし、良さそう!

スマホアプリを使ってみる

宅内では使えそうなので、外出先での使用を考えてスマホアプリを導入してみる。
http://redminepm.com/ja
あまり、外部からアクセスできるポートを何個も開けるのは気分的に嫌だったので、
さらに当面は自分しか使わないので、sshポートフォアードを使用した。
使う時だけlocalhost:5080とサーバーの5080をつなげる。



タスクを眺めるにはアプリが見やすいと思う



チケットを割り当てたり、ガントチャート見たりはブラウザと使い分けると幸せになれそう。
しばらくはこれでやってみようと思う。

2019年7月9日火曜日

Restyaboard導入→やめた

タスク管理とかスケジュール管理とかしてみたくなった。
当分は個人使用だけど、もし良かったら社内展開するかも・・・。
という理由から、クラウド型ではなくオンプレミスで
かつ意識高い低いにかかわらず簡単に使えるものを探したいと思った。

Restyaboardとはどんなもの

まずは触ってみるべし
https://restya.com/board/demo
説明はmoongiftさんから
https://www.moongift.jp/2018/01/restyaboard-trello風のカンバンシステム/

インストール

GET STARTED を選択すると以下のページ飛んで、ユーザー登録のようなことをする
https://restya.com/board/install
インストール方法は直に?行うパターンとDockerを利用するものがあるみたい
必要な環境として
Required software: nginx, php-fpm (with mbstring, ImageMagick and IMAP), PostgreSQL, GeoIP and jq
あれ、PostgreSQLがいるのか
お試しで入れるのにはちょっとめんどくさい気がしてきたので、もっとめんどくさいかもしれなけど、Dockerを使うパターンで試してみようと思う。
https://hub.docker.com/r/restyaplatform/restyaboard/

Dockerのインストール

入れたい環境はMintだけど、Ubuntuの情報でもいいよね!ってあとで躓くけどね。
https://qiita.com/tkyonezu/items/0f6da57eb2d823d2611d
https://docs.docker.com/install/linux/docker-ce/ubuntu/
最初qiitaの方だけで進めていたら、リポジトリが見つからなかった。
docker公式見たら、Mintの場合は注意せよと書いてあったOrz
$ lsb_release -cs
sylvia
「sylvia」は「Ubuntu 16.04 LTS」をベースにしているらしい。
で、これのコードネームは「xenial」らしい。
https://ja.wikipedia.org/wiki/Linux_Mint
https://www.ubuntulinux.jp/News/ubuntu1604
なので、「$(lsb_release -cs)」の部分を書き換える。
sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   xenial \
   stable"
あとは手順通り進めていき、hello-worldを実行してみる
sudo docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete 
Digest: sha256:41a65640635299bab090f783209c1e3a3f11934cf7756b09cb2f1e02147c6ed8
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

あとは、docker-composeのインストールを行う

Restyaboardのインストール

Readmeとか他のインストール事例を参考にした
sudo git clone 指定されたURL
cd board/
sudo docker-compose up --build
docker-scripts/docker-entrypoint.shを修正する?
参考
https://hub.docker.com/r/restyaplatform/restyaboard/
https://github.com/RestyaPlatform/board/wiki/Docker:-Build-and-Install
https://github.com/RestyaPlatform/board
https://qiita.com/jakelizzI/items/07888636e28ce3a186f4

起動

localhost:1234にアクセスすると
初期はadmin - restya
言語の変更は、以下の通り。


適当にカンバンボードを作成したら、、、

ド派手な背景と、大音量の音楽が・・・Orz
ちょっと使っていく自信がなくなった。
ぼにーえむって誰??

初期設定

ポートとか
sudo docker ps
CONTAINER ID        IMAGE                            COMMAND                  CREATED             STATUS              PORTS                  NAMES
c1f801aac2e2        board_restyaboard                "/docker-entrypoint.…"   2 days ago          Up 46 hours         0.0.0.0:1234->80/tcp   board_restyaboard_1
63aea7bb5e9c        postgres:9-alpine                "docker-entrypoint.s…"   2 days ago          Up 46 hours         5432/tcp               board_postgres_1
fb74fd78bc39        restyaplatform/restyaboard:dev   "/docker-entrypoint.…"   2 days ago          Up 2 days           0.0.0.0:8081->80/tcp   restyaboard
1234は以下で変えれそう
cat docker-compose.yml
version: '2'
services:
  restyaboard:
    build: .
    ports:
      - 1234:80
    environment:
      - POSTGRES_HOST=postgres
      - POSTGRES_PORT=5432
      - POSTGRES_USER=admin
      - POSTGRES_PASSWORD=admin
      - POSTGRES_DB=restyaboard
      - SMTP_DOMAIN=domain
      - SMTP_USERNAME=user
      - SMTP_PASSWORD=pass
      - SMTP_SERVER=server
      - SMTP_PORT=465
      - TZ=Etc/UTC
    depends_on:
      - postgres
    restart: always

  postgres:
    image: postgres:9-alpine
    environment:
      - POSTGRES_HOST=postgres
      - POSTGRES_USER=admin
      - POSTGRES_PASSWORD=admin
      - POSTGRES_DB=restyaboard
    restart: always

壁紙と音楽とか

https://restya.com/board/apps/r_codenames
のようにコードネームとしてBoneyMを使っているみたい。
コミュ障の僕にはこの壁紙・音楽は派手すぎるので、申し訳ないが使用しないようにしたい。
BoneyMの壁紙・音楽の消し方は以下にコメントしてあった。
https://groups.google.com/forum/#!topic/restya/x4S2xabpUtI
So, with our Codename App, all new boards will get Boney M wallpaper and productivity beat automatically. If you want to disable this behavior, please disabled Codename App.
ということで、CodenameAppを無効化してみる


非表示になったー!!

ガントチャートが欲しい

デフォルトでは入っていないみたい
https://restya.com/board/apps/r_gantt_view

インストール方法

docker環境でどうやって入れていいか・・・
とりあえず、コンテナの中に入ってみる
sudo docker exec -i -t restyaboard bash
root@fb74fd78bc39:/usr/share/nginx/html# ls
api_explorer  client  diagnose.php  ejabberd.yml  index.html  media  restyaboard-ssl.conf  restyaboard.conf  server  sql
入れたのか・・?
https://qiita.com/__cooper/items/4740c24666299c366044
あとは、手順どおりにやってみる
cd /tmp
wget https://downloads.ioncube.com/loader_downloads/ioncube_loaders_lin_x86-64.zip
unzip ioncube_loaders_lin_x86-64.zip
php -v
PHP 7.2.19-1+0~20190531112637.22+stretch~1.gbp75765b (cli) (built: May 31 2019 11:26:38) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.2.19-1+0~20190531112637.22+stretch~1.gbp75765b, Copyright (c) 1999-2018, by Zend Technologies
php -i | grep extension_dir
extension_dir => /usr/lib/php/20170718 => /usr/lib/php/20170718
cp ioncube/ioncube_loader_lin_7.2.so /usr/lib/php/20170718/
vi /etc/php/7.2/fpm/php.ini
zend_extension = /usr/lib/php/20170718/ioncube_loader_lin_7.2.so
あと、viが入っていなかったので、インストールした。
https://qiita.com/YumaInaura/items/3432cc3f8a8553e05a6e

肝心のgantt_viewが入手できない

アプリの説明を見ても入手方法がよくわからないが、多分有料なのだろう。
でも価格がわからない。(BUY)押してもコンタクトフォームに飛んでしまう。
https://restya.com/board/apps/r_gantt_view
デモサイトではいい感じだったのだけど、ちょっと心が離れた。
docker触れたし、いい勉強になったはず。

2019年6月18日火曜日

IPoE導入

IIJからIPoE月額オプション無料の連絡が来た。
https://www.iijmio.jp/imh/ipoe/
2020/6/30までらしい。
最近、ビデオ電話とかYoutubeにお世話になる機会が多くなったことと
夜間帯のスピードが遅いように思えてきたので、IPoE導入してみようと思う。
IIJmioひかりで提供してくれるのはDS-Liteというもの。
http://techlog.iij.ad.jp/archives/1254

現状

スピードテスト
サイト 機器 下り 上り レイテンシ
Google PC Giga有線LAN 229.6Mbps 290.4Mbps 3ms
Google スマホ1 無線LAN 2.4G 11n 9.78Mbps 23.6Mbps 5ms
Google スマホ2 無線LAN 2.4G 11n 42.3Mbps 54.5Mbps 4ms
Google PC 無線LAN 5G 11n 95.7Mbps 11.4Mbps 5ms
fast.com PC 有線LAN 220Mbps 280Mbps 3ms
fast.com スマホ1 無線LAN 2.4G 11n 26Mbps 28Mbps 8ms
fast.com スマホ2 無線LAN 2.4G 11n 68Mbps 200Mbps 4ms
fast.com PC 無線LAN 5G 11n 150Mbps 87Mbps 5ms
2019/06/02 21時ごろ
あれ、、、遅いのはスマホ1のせい?
どうしよう、ギガビットHUBとか買っちゃったよ。
よく調べてからやろうと思ったのに、つい先走ってしまった。。。

構成

現状の構成は以下の通り

自宅サーバーのためにポートフォファードしている。
DS-Lite使うとこれができなくなってしまうらしい。

いざIPoEオプション加入へ

https://www.iijmio.jp/imh/ipoe/
から申し込みを行う。設定完了までに最大3日かかるみたい。
すぐじゃなかったー。よく読んでおけばよかった。

新しい構成を考える

高性能なルーターでPPPoEとDS-Liteを同居ささる方法がシンプルだけど、そんなに設備投資できない。
今ある環境を利用しつつだと2つの案がありそう。
■案1



■案2



自宅サーバーにPPPoEはらせるのは、なんとなく怖い?ので、案1で考えてみたいとおもう。

DS-Lite設定

https://www.iijmio.jp/service/detail/imh/setup.jsp
を参考に設定を行う。









ゲートアドレスに[gw.transix.jp]を設定して、あとはNDプロキシーを使用するようにする。
NDプロキシーとは…
IPv6のパケットを、ルータを介して通信する機能です。
https://qiita.com/sumomoneko/items/fa56737f97beff3566f3
これで終わりらしい。
気になる速度は・・。
スピードテスト
サイト 機器 下り 上り レイテンシ
Google PC Giga有線LAN 312.8Mbps 318.6Mbps 3ms
Google スマホ1 無線LAN 2.4G 11n 7.61Mbps 36.4Mbps 5ms
Google スマホ2 無線LAN 2.4G 11n 33.3Mbps 38.9Mbps 4ms
fast.com PC 有線LAN 390Mbps 450Mbps 4ms
fast.com スマホ1 無線LAN 2.4G 11n 130Mbps 130Mbps 5ms
fast.com スマホ2 無線LAN 2.4G 11n 49Mbps 41Mbps 5ms
2019/06/18 1時ごろなので、一概に比較は出来ないけど。。

自宅サーバー側の設定

複数ネットワーク接続となるので、デフォルトの通信経路などの設定が必要になる。
Router2は今までどおり192.168.1.0/24、Router1は192.168.2.0/24を使用しようと思う。

webminのアクセス制限

miniserv.confに追記
allow=127.0.0.1 192.168.1.0/24 192.168.2.0/24

NextCloudのアクセス制限

config.phpに追記
  array (
    0 => 'localhost',
    1 => '192.168.1.*',
    2 => '192.168.2.*',
    3 => '##########.mydns.jp',
  )

デフォルトゲートウェイの変更1

Router1(192.168.2.0/24)をデフォルトになるように変更したい。
root@blackcube:~# route -n
カーネルIP経路テーブル
受信先サイト    ゲートウェイ    ネットマスク   フラグ Metric Ref 使用数 インタフェース
0.0.0.0         192.168.1.1     0.0.0.0         UG    100    0        0 enp2s0
0.0.0.0         192.168.2.1     0.0.0.0         UG    101    0        0 enx04ab1822fc5e
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 enp2s0
192.168.1.0     0.0.0.0         255.255.255.0   U     100    0        0 enp2s0
192.168.2.0     0.0.0.0         255.255.255.0   U     101    0        0 enx04ab1822fc5e
root@blackcube:~# route del default gw 192.168.1.1
root@blackcube:~# route -n
カーネルIP経路テーブル
受信先サイト    ゲートウェイ    ネットマスク   フラグ Metric Ref 使用数 インタフェース
0.0.0.0         192.168.2.1     0.0.0.0         UG    101    0        0 enx04ab1822fc5e
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 enp2s0
192.168.1.0     0.0.0.0         255.255.255.0   U     100    0        0 enp2s0
192.168.2.0     0.0.0.0         255.255.255.0   U     101    0        0 enx04ab1822fc5e
https://asmsuechan.hatenablog.com/entry/2018/07/20/181359
https://qiita.com/devzooiiooz/items/256e41c9cfccd00fd593
https://qiita.com/devzooiiooz/items/4e2e1c5264d8960eb412

デフォルトゲートウェイの変更2

さっきのでOKと思ったら、MyServerがRouter1側のグローバルIPを見失ってRouter2側のIPをmydnsに通知している。なぜだ・・・。 その時にroute -nしてみたら192.168.1.1が復活している、しかもMetricが192.168.2.1よりも若いから、そうなるか。
更に調べると、片側のNICのデフォルトゲートウェイを無視する設定が必要みたい さっきの手順は一時的な方法のようだ

nmcli connection modify 有線接続\ 1 ipv4.never-default yes
nmcli connection modify 有線接続\ 1 ipv4.ignore-auto-routes yes
nmcli connection modify 有線接続\ 2 ipv4.never-default no
nmcli connection modify 有線接続\ 2 ipv4.ignore-auto-routes no
service network-manager restart
「有線接続」じゃなくてIF名で指定するのはどうすれば良いのかな? これで様子を見てみるか
 https://torutk.hatenablog.jp/entry/20160506/p1
http://iwsttty.hatenablog.com/entry/2015/03/01/152541
https://qiita.com/kooohei/items/b0931ae210911cc52adc
https://qiita.com/atomyah/items/1989138730f3385844dd

mydnsの更新対応

グローバルIP通知先をhttps://www.mydns.jp/login.htmlからhttps://ipv4.mydns.jp/login.htmlに変更

最終的な構成

Router1にVLAN入れて2ポートWAN側に割り当てた。



あんまり効果が無いような気がしないでもないけど、しばらく使ってみる。

参考

https://www.marbacka.net/blog/ipv4_pppoe_ds-lite_simultaneously/
https://internet.watch.impress.co.jp/docs/column/shimizu/1131132.html
https://qiita.com/nbhr/items/2850ccaa3456a8553bbf

2019年4月2日火曜日

中華CNCで切削-FreeCad その2

前回チャレンジしたbCNCでdxfファイルからG-Codeを生成する方法で
ちゃんとエンドミル形状など設定して実際に切削してみたいと思う。

エンドミル

手持ちのもの

iModeraの時に入手したものや中華CNCに付属していたものがある。
No 名称 入手 スペック URL
1 切削用ストレートカッター iModera付属品 刃先径 1.6mm シャンク径 2.34mm
2 ハッチング3.0mm ENHT-030 PCB Milling シャンク径 3.175 mm、全長 36mm http://www.pcbmilling.biz/?pid=38343208
3 エンドミル45°ZrN PCB Milling ZrNコーティング シャンク径 3.175 mm、全長 36mm スピンドル回転数が低いマシン(13,000rpm以下)にはむいていません。 http://www.pcbmilling.biz/?pid=48601804
4 エンドミル90°+0.8mmドリル PCB Milling 折ってしまったので無い
5 ルーター 1.0mm PCB Milling シャンク径3.175 mm、全長 38.1mm 外形加工用 (リング付き) http://www.pcbmilling.biz/?pid=35600995
6 Vカッター NJ3.3001 AliExpress シャンク径3.175 mm 30°TIP0.1mm 全長33mm タングステン 超硬 https://www.aliexpress.com/item/10Pcs-3-175mm-Tungsten-Bit-V-Shape-Carbide-PCB-Engraving-Bits-CNC-Router-Tool-Choose-size/32757380196.html
とりあえず、10本持っている[6]のVカッターを使用する想定で設定してみる。

エンドミルの設定

[CAM] → [EndMill]を選択する。



設定パラメータ多すぎOrz
試行錯誤でこのように設定してみた。
  • Type
    • Centercutting : センターカット[3]
    • Combination :
    • Down-cutting :
    • Engraving : 彫刻? [6]
    • Non Centercutting :
    • Spiral :
    • Straight :
    • Up-Cutting : [2]
  • Shape
    • Ball End :
    • Radiused :
    • Square End :スクエアエンド[2]
    • V-cutting : Vカット[3][6]
    • Disc :
  • Material
    • Carbide-tipped : 超硬ビット [2][3][6]
    • Cobalt : コバルト
    • High Speed Steel (HSS) : ハイス鋼
    • Powdered Metal (PM) Cobalt : 粉末金属コバルト
    • Solid Carbide : 超硬ソリッド
    • Titane : チタン
  • Coating
    • None
    • AlCrTiN
    • AlTiCrN
    • PCD : ダイヤモンド焼結体
    • TiAlCrN
    • TiAlN : 窒化チタンアルミ
    • TiCN : 炭窒化チタン
    • TiN : 窒化チタン
      うーんZrN(窒化ジルコニア)が無い・・・。 コーティング無しで良いか(汗
  • Diameter : 直径 3.175 mm
  • Mount Axis : マウント軸??
  • Flutes : フルート? 刃の数
    • 1枚刃[6]
    • 2枚刃[2][3]
  • Length
    • 33mm [6]
    • 36mm [2][3]
  • Angle
    • 30°[6]
    • 45°[3]
    • 180°[2] でいいのかな?
  • Stepover
    • とりあえず40%で
https://forums.autodesk.com/t5/fusion-360-computer-aided/2d-pocket-pre-drill-location-question/td-p/6656338?profile.language=ja
http://www.mmc-hitachitool.co.jp/technical/tech-info/pdf/c22.pdf
https://makezine.jp/blog/2014/04/cnc-routing-basics-toolpaths-and-feeds-n-speeds.html

いざ切削!

エンドミル以外の設定を行う

材料の設定

次は[CAM] → [Material]を選択



MDFという名称で作成
  • Feed : 送り速度 600 mm/min
  • Plunge Feed : 進入速度 500 mm/min
  • Depth Increment : 切り込み深さ 0.5mm
ちょっと速いような印象を受けたので、もしかしたら、速度を落とすか深さを浅くしても良いかもしれない。

エンドミルと材料の組み合わせを設定

[CAM] → [ストック]にて



エンドミルと材料そして切削の深さを設定保存する。
この場合は1.5mm、[Material]のDepth Incrementが0.5mmなので、3回に分けて彫り込むことになる。

データ読み出し

前回作った「春」データを読み込み、[プロファイル]と[カット]を行う



いざ!実行

エンドミル折れたり、モーター暴走したりしないで!とお願いしつつ
実行する。



3分くらい切削だったけど、手に汗握る感じ。
iModelaだとケースに入っていたし、小さくてなんとなく安心感があったけど
こっちは裸だし、大きいし、中国だしで、本当に怖かった。ビビリだね。
いつか折れたり、固定が緩んで材料が吹き飛んだり、レーザー・・・と考えると
早めにケースに入れたくなってきた。
削りカスを取り除くと



こんな感じで、「春」が訪れました。
厚さ2.5mmのMDFに1.5mmで彫ったはず。まだカスが埋まっているので堀が浅く見えるけど、いちおう1.5mm付近のようだ。
MDFの場合はこれくらいの設定で良いのかもしれない。
次は、他の方法でGcode作ってみるか、オートレベルやるか、他のエンドミルで試すか、それとも本題のPCB切削に進むか…悩む。