Microsoft Azureでラズベリーパイから cloud live streamingする方法
Microsoft AzureのMedia Servicesを使ってラズベリーパイからストリーミングを行う方法です
背景的なもの
現在パブリッククラウドサービスはAWS, Azure, GCP等があり、それぞれストリーミングに関しては以下のようなサービスを提供しています
(IBMはプライベートクラウドに力をいれているらしく今回は調査対象外)
Cloud Growth Rate Increases; Amazon, Microsoft & Google all Gain Market Share | Synergy Research Group
AWS(wowza)
メディアストリーミングチュートリアル - Amazon CloudFront | AWS
Install Wowza Streaming Engine on Raspberry Pi
Azure Media Services
今回はAzureを利用してみます
Media Services : azure.microsoft.com
構成
- チャネル、プログラム、StreamingEndpointsからなる
- 各Media Servicesアカウントには、複数のチャネル、複数のプログラム、複数のStereamingEndpointsを含めることができる
- 帯域幅とセキュリティのニーズに応じて、StreamingEndpointサービスを一つまたは複数のチャネル専用にすることができる
- StreamingEndpointはどのチャネルからでもプルできる
channel
- Media Servicesにおいてライブストリーミングコンテンツの処理を担う
- ライブストリーミングコンテンツを処理するためのパイプラインを表す
- 入力エンドポイントであり、その取り込みURLをライブトランスコーダーに対して指定する
- チャネルはライブトランスコーダからライブ入力ストリームを受け取り、1つまたは複数のStreaming Endpointを介してストリーミングできる状態にする
- ストリームはあらかじめプレビューし、確認した上で処理、配信するが、チャネルはその際にしようするプレビューエンドポイントも提供する
- チャネル作成時に取り込みようURLとプレビューURLを取得できる
- チャネルが開始済み状態である必要はない
- ライブトランスコーダーからチャネルへのデータのプッシュを開始する準備ができたら、チャネルを開始する必要がある
- ライブトランスコーダーがデータの取り込みを開始した後、ストリームをプレビューできる
- チャネルの状態
- 停止済み:初期状態。ストリーミングの許可はされていない
- 開始中:チャネルを開始している。更新やストリーミングはできない。
- 実行中:ライブストリームを処理できる
- 停止中:チャネルを停止している
- 削除中:チャネルを削除している
Azureの設定
流れとしては以下のようになります
1. Azure Media Servicesのアカウント作成
2. StreamingEndpointsの開始
3. チャネルの作成
4. live eventの作成
5. channel とlive eventのstart
1. Create Azure Media Services Account
Media Servicesを選択
Addを選択
データを入力していきます
- Account Name
- Subscription
- Resource Group
- Location
- Storage Account
作成が完了すると、Media Servicesの一覧に新しい項目が追加されます
2. Start Streaming Endpoint
1で作成したMedia Serviceのアカウントを選択しOverview BladeからStreaming Endpointを選択します
そのまま以下の通りEndpointを開始します
3. Start Channel
Live Streaming BladeからCustom Createを選択します
- Setting
- Endoding type: Pass Through
- Pass Throughはsingle bit encoding
- クライアント側の通信速度に応じて画質を変更するmulti bit encodingも可能だが、その分遅延が発生するので今回はやらない
- Encoding UnitもPass Throughの際は関係ない(Reserved Unit0でよい)
- Name:なんでも
- Description: なんでも
- Automatically start the channel after creation: チェック外す
- Endoding type: Pass Through
- Ingest
- Streaming protocol: RTMP
- Preview
- 変更の必要なし
- Create
channelが作成されるとLive Streaming Bladeに作成されたChannelが表示されます
作成されたChannelを選択し、INGEST URL(Primary)をメモしておきます
4. Create Live Event
ChannelのメニューからLive Eventを選択します
Live Eventのデータを入力します
- Name
- asset name
- archive window
- 最小設定可能時間は5分
- archive自体は項目にDayもあるしStorageに余裕がある限り保存できそう
- ただし一回のストリーミングに関しては連続して8時間以下が推奨とのこと
Live Eventが作成されたら、Streaming URLをメモしておきます
5. Start Channel & Live Event
最後にChannelとLive Eventを開始します
Raspberry Piの設定
設定
# カメラの確認 $ modprobe bcm2835-v4l2 # ラズパイカメラを利用する場合 $ v4l2-ctl --list-device mmal service 16.1 (platform:bcm2835-v4l2): /dev/video0 # 音声入力デバイスの確認 $ arecord -l **** List of CAPTURE Hardware Devices **** ### 今回はマイク機能なしのカメラを利用 # 映像フォーマット、解像度、フレームレートの組み合わせの確認 $ v4l2-ctl -d /dev/video0 --list-formats-ext ioctl: VIDIOC_ENUM_FMT Index : 0 Type : Video Capture Pixel Format: 'YU12' Name : Planar YUV 4:2:0 Size: Stepwise 16x16 - 3280x2464 with step 2/2 Index : 1 Type : Video Capture Pixel Format: 'YUYV' Name : YUYV 4:2:2 Size: Stepwise 16x16 - 3280x2464 with step 2/2 Index : 2 Type : Video Capture Pixel Format: 'RGB3' Name : 24-bit RGB 8-8-8 Size: Stepwise 16x16 - 3280x2464 with step 2/2 Index : 3 Type : Video Capture Pixel Format: 'JPEG' (compressed) Name : JFIF JPEG Size: Stepwise 16x16 - 3280x2464 with step 2/2 Index : 4 Type : Video Capture Pixel Format: 'H264' (compressed) Name : H.264 Size: Stepwise 16x16 - 3280x2464 with step 2/2 Index : 5 Type : Video Capture Pixel Format: 'MJPG' (compressed) Name : Motion-JPEG Size: Stepwise 16x16 - 3280x2464 with step 2/2 Index : 6 Type : Video Capture Pixel Format: 'YVYU' Name : YVYU 4:2:2 Size: Stepwise 16x16 - 3280x2464 with step 2/2 Index : 7 Type : Video Capture Pixel Format: 'VYUY' Name : VYUY 4:2:2 Size: Stepwise 16x16 - 3280x2464 with step 2/2 Index : 8 Type : Video Capture Pixel Format: 'UYVY' Name : UYVY 4:2:2 Size: Stepwise 16x16 - 3280x2464 with step 2/2 Index : 9 Type : Video Capture Pixel Format: 'NV12' Name : Y/CbCr 4:2:0 Size: Stepwise 16x16 - 3280x2464 with step 2/2 Index : 10 Type : Video Capture Pixel Format: 'BGR3' Name : 24-bit BGR 8-8-8 Size: Stepwise 16x16 - 3280x2464 with step 2/2 Index : 11 Type : Video Capture Pixel Format: 'YV12' Name : Planar YVU 4:2:0 Size: Stepwise 16x16 - 3280x2464 with step 2/2 Index : 12 Type : Video Capture Pixel Format: 'NV21' Name : Y/CrCb 4:2:0 Size: Stepwise 16x16 - 3280x2464 with step 2/2 Index : 13 Type : Video Capture Pixel Format: 'BGR4' Name : 32-bit BGRA/X 8-8-8-8 Size: Stepwise 16x16 - 3280x2464 with step 2/2 # 映像フォーマット一覧の確認 $ ffmpeg -f v4l2 -list_formats all -i /dev/video0 ffmpeg version N-89701-gb2be76c Copyright (c) 2000-2018 the FFmpeg developers built with gcc 4.9.2 (Raspbian 4.9.2-10) configuration: --arch=armel --target-os=linux --enable-gpl --enable-libx264 --enable-nonfree libavutil 56. 7.100 / 56. 7.100 libavcodec 58. 9.100 / 58. 9.100 libavformat 58. 3.100 / 58. 3.100 libavdevice 58. 0.100 / 58. 0.100 libavfilter 7. 10.100 / 7. 10.100 libswscale 5. 0.101 / 5. 0.101 libswresample 3. 0.101 / 3. 0.101 libpostproc 55. 0.100 / 55. 0.100 [video4linux2,v4l2 @ 0x2f3d1b0] Raw : yuv420p : Planar YUV 4:2:0 : {16-3280, 2}x{16-2464, 2} [video4linux2,v4l2 @ 0x2f3d1b0] Raw : yuyv422 : YUYV 4:2:2 : {16-3280, 2}x{16-2464, 2} [video4linux2,v4l2 @ 0x2f3d1b0] Raw : rgb24 : 24-bit RGB 8-8-8 : {16-3280, 2}x{16-2464, 2} [video4linux2,v4l2 @ 0x2f3d1b0] Compressed: mjpeg : JFIF JPEG : {16-3280, 2}x{16-2464, 2} [video4linux2,v4l2 @ 0x2f3d1b0] Compressed: h264 : H.264 : {16-3280, 2}x{16-2464, 2} [video4linux2,v4l2 @ 0x2f3d1b0] Compressed: mjpeg : Motion-JPEG : {16-3280, 2}x{16-2464, 2} [video4linux2,v4l2 @ 0x2f3d1b0] Raw : Unsupported : YVYU 4:2:2 : {16-3280, 2}x{16-2464, 2} [video4linux2,v4l2 @ 0x2f3d1b0] Raw : Unsupported : VYUY 4:2:2 : {16-3280, 2}x{16-2464, 2} [video4linux2,v4l2 @ 0x2f3d1b0] Raw : uyvy422 : UYVY 4:2:2 : {16-3280, 2}x{16-2464, 2} [video4linux2,v4l2 @ 0x2f3d1b0] Raw : nv12 : Y/CbCr 4:2:0 : {16-3280, 2}x{16-2464, 2} [video4linux2,v4l2 @ 0x2f3d1b0] Raw : bgr24 : 24-bit BGR 8-8-8 : {16-3280, 2}x{16-2464, 2} [video4linux2,v4l2 @ 0x2f3d1b0] Raw : yuv420p : Planar YVU 4:2:0 : {16-3280, 2}x{16-2464, 2} [video4linux2,v4l2 @ 0x2f3d1b0] Raw : Unsupported : Y/CrCb 4:2:0 : {16-3280, 2}x{16-2464, 2} [video4linux2,v4l2 @ 0x2f3d1b0] Raw : bgr0 : 32-bit BGRA/X 8-8-8-8 : {16-3280, 2}x{16-2464, 2} /dev/video0: Immediate exit requested
撮影
Azure Media Servicesは、音声データと音声コーデックを指定して送信しないとエラーになり受け付けてもらえません
- 無音(音声データなし)はNG
- 無音(音声データあり)はOK
ラズパイカメラやUSBカメラのみでマイクがない場合は、ffmpeg側で無音の音声データを付加してAzure Media Services側に送信する必要があります
# ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}... $ ffmpeg -vsync passthrough -f v4l2 -vcodec h264 -framerate 30 -video_size 320x180 -i /dev/video0 -f lavfi -i aevalsrc=0 -shortest -strict -2 -c:a aac -b:a 7350 -ar 7350 -g 60 -keyint_min 60 -c:v copy -preset ultrafast -b:v 150k -maxrate 150k -bufsize 150k -f flv $INGESTURI/mystream
- $INGESTURLはAzure側でチャネルを設定した際にメモしたものです
- さらに注意点として、ffmpegで送信する場合にはINGEST_URIの後ろにmystream等の名前をつけないとエラーになります
- mystreamに特に意味はなく、なんでもOKです
ffmpegのオプションに関しては
- f fmt: force format
- V4l2: Video for linux
- alsa: audio
- hw: 1,0 audioのinput の指定
- c:v videoのcodec
- c:a audioのcodec
- framerate / フレームレート
- r / set frame rate
- s / size,set frame size(WxH)
- i / input deviceの指定
- /dev/video0 / 接続されているvideoデバイスの一つ
- vcodec / force video codec
- ultrafast /
- acodec / audio codec
- libfaac / 同上
- ab / audio bitrate(pleas use -b:a)
- b / video bitrate(please use -b:v)
- sc_thresold / シーンチェンジ検出の閾値(0でdefault, -1 でシーンチェンジ検出無効)
たまに落ちる場合は以下みたくして対応
#!/bin/bash modprobe bcm2835-v4l2 INGESTURI="rtmp://*****************************************************" # primary while : do ffmpeg -vsync passthrough -f v4l2 -vcodec h264 -framerate 30 -video_size 320x180 -i /dev/video0 -f lavfi -i aevalsrc=0 -shortest -strict -2 -c:a aac -b:a 7350 -ar 7350 -g 60 -keyint_min 60 -c:v copy -preset ultrafast -b:v 150k -maxrate 150k -bufsize 150k -f flv $INGESTURI/mystream sleep 10 done
遅延に関して
だいたい色々チューニングをした結果、16,7秒くらいの遅延が発生します。
Azure側の処理の都合上、最短で15-20秒は遅延が発生するらしいです。
Azure Media Player RTMP Latency
現在Microsoft側でも低レイテンシ版の開発をしているとのことですが、あまり優先度は高くないとのこと。
Azure Media Services: Top (187 ideas) – Customer Feedback for Microsoft Azure
ちなみにGCPの中の人とも話す機会があったのですが、大体おんなじくらいの遅延は発生しますとのこと。
これは現在のクラウドストリーミングのサービスや技術が、大人数にむけて配信することをターゲットとしており、秒単位で遅延を減らす方向にはシフトしていないとのこと。
ブラウザでの表示
AzureのUI上で確認できますが、ストリーミングをWebブラウザに表示する方法です
HTML
<head> <link href="//amp.azure.net/libs/amp/2.1.5/skins/amp-default/azuremediaplayer.min.css" rel="stylesheet"> <script src="//amp.azure.net/libs/amp/2.1.5/azuremediaplayer.min.js"></script> </head> <body> <video id="azuremediaplayer" class="azuremediaplayer amp-default-skin amp-big-play-centered" tabindex="0"></video> </body>
$(function() { var myOptions = { "nativeControlsForTouch": false, controls: true, autoplay: true, width: "640", height: "400", } myPlayer = amp("azuremediaplayer", myOptions); myPlayer.src([ { "src": "$Streaming URL without protocol", "type": "application/vnd.ms-sstr+xml" } ]); });
tips
windowsからの配信
配信がうまくいかずに、まずは問題の切り分けとしてWindowsから配信テストを行う方法
### 接続したUSBカメラ等が認識しているか確認 $ ffmpeg -f dshow -list_devices true -i dummy [dshow @ 0000000000150980] DirectShow video devices (some may be both video and audio devices) [dshow @ 0000000000150980] "MS-M103HU USB Camera" [dshow @ 0000000000150980] Alternative name "@device_pnp_******************23196}\global" [dshow @ 0000000000150980] DirectShow audio devices [dshow @ 0000000000150980] Could not enumerate audio only devices (or none found). dummy: Immediate exit requested ## 2行目のMS-M103HU USB Cameraが今回接続したUSBカメラ(以降はこの名前をオプションとして指定する) ## Alternative nameも利用することができる。同じ種類のカメラを複数接続したときに利用するっぽい ### 検出されたカメラの仕様を確認する $ ffmpeg -f dshow -list_options true -i video="MS-M103HU USB Camera" [dshow @ 00000000003a09c0] DirectShow video device options (from video devices) [dshow @ 00000000003a09c0] Pin "Capture" (alternative pin name "0") [dshow @ 00000000003a09c0] pixel_format=yuyv422 min s=1280x720 fps=12 max s=1280x720 fps=12 [dshow @ 00000000003a09c0] pixel_format=yuyv422 min s=1280x720 fps=12 max s=1280x720 fps=12 [dshow @ 00000000003a09c0] vcodec=mjpeg min s=1280x720 fps=30 max s=1280x720 fps=30 [dshow @ 00000000003a09c0] vcodec=mjpeg min s=1280x720 fps=30 max s=1280x720 fps=30 ## このカメラだと2パターンの録画しか出来ない
テスト撮影
# ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}... # -f fmt: force format # V4l2: Video for linux # alsa: 音声 # hw: 1,0 音声の入力指定 # -c:v videoのcodec # -c:a audioのcodec ### infile options ## input optionはカメラが対応していないものを指定してもエラーが返って来る # このカメラは1280x720しか対応していないので他の解像度を指定してもダメ > ffmpeg -f dshow -video_size 640x480 -i video="MS-M103HU USB Camera" [dshow @ 00000000003b0a00] Could not set video options video=MS-M103HU USB Camera: I/O error # このカメラは12FPS(yuvj)か30FPS(mjpeg)しか対応していないので他のFPSを指定してもダメ > ffmpeg -f dshow -framerate 24 -i video="MS-M103HU USB Camera" [dshow @ 00000000006809c0] Could not set video options video=MS-M103HU USB Camera: I/O error # 選択可能なFPSの場合は適したコーデックが自動で選択される > ffmpeg -f dshow -framerate 30 -i video="MS-M103HU USB Camera" Stream #0:0: Video: mjpeg (MJPG / 0x47504A4D), yuvj422p(pc, bt470bg/unknown/unknown), 1280x720 [SAR 96:96 DAR 16:9], 30 fps, 30 tbr, 10000k tbn, 10000k tbc > ffmpeg -f dshow -framerate 12 -i video="MS-M103HU USB Camera" Stream #0:0: Video: rawvideo (YUY2 / 0x32595559), yuyv422, 1280x720, 12 fps, 12 tbr, 10000k tbn, 10000k tbc # コーデックを指定する場合は対応したFPSじゃないとダメ > ffmpeg -f dshow -vcodec mjpeg -framerate 12 -i video="MS-M103HU USB Camera" [dshow @ 00000000005c0c00] Could not set video options video=MS-M103HU USB Camera: I/O error ### output option # mp4ファイルで出力したいとき(yuv420p) > ffmpeg -f dshow -vcodec mjpeg -framerate 30 -video_size 1280x720 -i video="MS-M103HU USB Camera" -pix_fmt yuv420p rec.mp4 # 出力動画のFPSを落としたいとき(-r 3) > ffmpeg -f dshow -vcodec mjpeg -framerate 30 -video_size 1280x720 -i video="MS-M103HU USB Camera" -pix_fmt yuv420p -r 3 rec.mp4
実際にWindowsからストリーミング
ffmpeg \ -rtbufsize 100M \ -vsync passthrough \ -f dshow \ -vcodec mjpeg -framerate 30 \ -video_size 1280x720 \ -i video="MS-M103HU USB Camera" \ -f lavfi \ -i aevalsrc=0 -shortest \ -strict -2 \ -c:a aac \ -b:a 128k \ -ar 44100 \ -r 30 \ -g 60 \ -keyint_min 60 \ -b:v 400000 \ -c:v libx264 \ -preset ultrafast \ -bufsize 400k \ -maxrate 400k \ -f flv rtmp://<your channel>/mystream
これでもうまくいかない場合はWirecastがAzure media servicesに対応しているので、まずはWirecast経由でストリーミングできるか確認
最新動向
この投稿を書いてる途中にlow latency modeが実装されたとのこと
ポストによると8-10秒まで落とすことが出来るらしく、更に2秒以下のultra low latency modeの開発がはじまったらしい
Reduce live streaming latency for Azure Media Services live streaming – Customer Feedback for Microsoft Azure
azure.microsoft.com
さらにRTSPのサポートの開発もはじまったとのこと
Directly ingesting RTSP – Customer Feedback for Microsoft Azure
RasperryPiでリアルタイムクロック(RTC-8564NB)を使ってアラームを設定する
ラズベリーパイで以下のRTCを使う方法です
akizukidenshi.com
事前準備
RTC-8564NBはラズベリーパイとi2cという通信方式で通信を行います
事前にraspi-configでi2c通信を有効にしておきます
接続&認識
上記の秋月の製品はソケット等もついているのでそのままブレッドボード等でラズベリーパイに接続します
接続したらまずはラズベリーパイがRTCをきちんと認識しているか、されていたらアサインされたアドレスの確認をします
$ sudo i2cdetect -y 1 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- 51 -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- --
次にRTC用のドライバを適用させます
$ sudo sh -c "echo pcf8563 0x51 > /sys/class/i2c-adapter/i2c-1/new_device" $ sudo i2cdetect -y 1 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- UU -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- --
- 8564ではなく8563になっていますが、8563はラズパイにデフォルトで入っていて、かつ8564互換になっています
- UUは認識しているだけではなく、実際にOSが利用している状態です
時刻あわせ
初期状態のRTCは時刻が正確ではない可能性があるので、まずはシステム側の時間を使って時刻をあわせます
# (念のために)システム側の時刻を最新にupdate(要ネットワーク) $ sudo ntpdate -v ntp.nict.jp $ date Wed 16 Oct 22:08:02 JST 2018 # 次に実際にRTCにシステムの時刻を反映させます $ sudo hwclock -w # (逆にRTCの時刻にシステム側を合わせたい場合はsオプションを使います) $ sudo hwclock -s # 実際に一致しているかはcオプションで確認します $ sudo hwclock -c hw-time system-time freq-offset-ppm tick 1539694800 1539694800.003842 1539694811 1539694811.004140 25 0 1539694822 1539694821.004745 39 0
Alarm機能設定
このRTCは設定した時間で割り込みを行うAlarm機能があります
端子はオープンドレインなのでAlarmがオンになるとLOWになります
AF/AIEの設定
割り込みのタイミングとして、決まった時間で割り込みを行うAIE(Alarm Interrupt Enable)と、決まった周期で割り込みを行うTIE(Time Interrupt Enable)という設定があります
そして、割り込みが発生した時点でそれぞれAF(Alarm Flag)、もしくはTF(Timer Flag)がセットされます
これが1になっていると割り込みが発生しないので、都度フラグクリアをしないといけません
# OSがRTCを掴んでいるので一時的に外します $ sudo modprobe -r rtc_pcf8563 # AIEをセットし、AFをクリアします(TF/TIEも今回利用しないのでクリアします) $ sudo i2cset -y 1 0x51 0x01 0x02 b # 確認 $ sudo i2cget -y 1 0x51 0x01 0x02
今回はAFをクリアして、かつAIEをセットしたいので、上記のレジスタのAddress01(0x01)のbit1だけ1であとは0にします
00000010b(2進数)は16進数で0x02になのでそれをvalueとして送ります
Alarm時刻の設定
次に実際にAlarmの時刻を設定します
レジスタのAddress 09~0Cがそれぞれ以下のように対応しています
- 0x09: Minute Alarm
- 0x0A: Hour Alarm
- 0x0B: Day Alarm
- 0x0C: Weekday Alarm
例えば毎日10:30にAlarmが発生するように設定します
(RTCにはUTCで時間が入っているのでUTC基準で入力します)
# Minutes Alarm(30分) sudo i2cset -y 1 0x51 0x09 0x30 # Hour Alarm(10時) sudo i2cset -y 1 0x51 0x0A 0x10 # Day Alarm(0x80: AE) sudo i2cset -y 1 0x51 0x0B 0x80 # Weekday Alarm(0x80: AE) sudo i2cset -y 1 0x51 0x0C 0x80
注意したいのが単純に30分なら16進数に変更して30 -> 0x1Eとすればよいのではなく、レジスタテーブルに記載してある通りに入力する必要があります
30分の場合は00110000bになり、16進数にすると0x30になります
(このRTCでは仕様上直感的に10進数ライクに数字を入れられるように設計されています)
0x80とはAE(アラーム制御ビット)で、これをセットすると値に関わらずにそのAddressはAlarm状態になります
今回はDayとWeekDayのAEを設定しているので、日にちや週に関わらず毎日毎週10:30になるとAlarmが発生することになります
以上で設定は完了です
設定した時間になると/INTピンがLOWになります
Hiveのselect文でカラム名を一緒に表示させる方法
hive.cli.print.header
hive> set hive.cli.print.header=true; hive> use ${db名}; hive> select * from ${table名};
もしくはeオプションで
./hive -e "set hive.cli.print.header=true;select * from ${db名}.${table名}" > result.tsv
raspbian stretchインストール方法
raspbianの最新OSのStrechのインストール方法です
versionは4.14, release dateは2018-04-18です
install
イメージのダウンロード
www.raspberrypi.org
まずは上のサイトからイメージをダウンロードします
raspbianにはGUI付きのRASPBIAN STRETCH WITH DESKTOPと、CUIのみのRASPBIAN STRETCH LITEがありますが、今回はRASPBIAN STRETCH WITH DESKTOPを使います
SDカードへイメージの書き込み
DD for Windowsを利用してダウンロードしてきたイメージをSDカードに焼きます
Target DiskをSDカードに、Target FileをダウンロードしたイメージにしてRestoreを選択すると以下のように書き込みがはじまります
起動
raspbianを書き込んだSDをラズベリーパイに差し込み、HDMIディスプレイとUSBマウス・キーボードも差し込んでmicro USB電源ケーブルをさせばラズベリーパイが起動します
(マウスやキーボードは電源をいれた後でも構いませんが、ディスプレイだけは電源接続時に接続していないと、後で接続しても認識しません)
しばらく待っていると以下のような画面が表示されます
確認
ちゃんとstrechがinstallされているか確認します
$ lsb_release -a No LSB modules are available. Distributor ID: Raspbian Description: Raspbian GNU/Linux 9.4 (stretch) Release: 9.4 Codename: stretch
その他
local IPの固定
$ sudo cp -ip /etc/dhcpcd.conf{,.org} $ sudo vi /etc/dhcpcd.conf # uncomment and change below lines 50 static ip_address=192.168.179.101/24 51 static routers=192.168.179.1 52 static domain_name_servers=192.168.179.1
ユーザー名変更
デフォルトのpi/raspberryから変更する方法
### login as pi user # create temporary user $ sudo useradd -M tmp $ sudo gpasswd -a tmp sudo $ sudo passwd tmp ## すぐ消すので適当につける ### reboot and login as tmp user $ sudo usermod -l nouziru pi $ sudo usermod -d /home/nouziru -m nouziru $ sudo groupmod -n nouziru pi $ sudo passwd nouziru ### reboot and login as nouziru user $ sudo userdel tmp
raspi-config設定
$ sudo raspi-config # 自動ログイン無効 3. Boot Options > Desktop / CLI > B3 Desktop Desktop GUI, requiring user to loginを選択 # TimeZone変更 4. Internatinalization Option > Timezon > Azia > Tokyoを選択 # カメラ・SSH・I2C・Serial有効化 5. Interfacing Options > Camera => Yes > SSH => Yes > I2C => Yes > Serial > Serial Login => No > Serail Interface => Yes # setting後に再起動するか確認されるので再起動
sshのポート変更
$ sudo cp -ip /etc/ssh/sshd_config{,.org} $ sudo vi /etc/ssh/sshd_config ### uncomment and change below line 13 Port 10022
音声テスト
### confirm audio output system $ speaker-test -t sine -f 1000
Eagle Tips
Eagleのtipsです
versionは6.6.0で確認しています
よく使うlibrary
ベタGND(Polygon)
Polygonを選択してLayerを選択(通常TopかBottom)して基板を囲む
ratnestを選択すると実際の塗りパターンが確認できる
戻したいときはRipupで先ほどひいたPolygonを選択すれば戻せる
変なところに塗られていやな場合はtRestrict/bRestrict LayerでPolygonを配置してやるとそこをさけて塗るようになる
- 自分が使ってる設定
- Width: 0.4064mm
- cap: round
- Polygon Pour : solid
- Spacing: 1.27
- Isolate: 0.3048
- Orphans: no
- Thermals: yes
配線確認(Show)
Showで配線上を選択すると、つながっている線が全てハイライトされる
回路図の方でも対応した線がハイライトされる
Layer選択(Layer)
Layersを選択
デフォルトでは以下のようになっている
青く選択されているlayerが現在ボードの画面に表示されている
マスク部分を確認したいときはtStop, bStopを選択してApply
p版.comなどではvalueは印刷されないのでボードから外して確認するにはtvalue, bvalueを外してApply
パーツ移動(Move/Group)
1つずつ移動したいときはMove
まとめて移動したいときはgroupで対象を囲ってから右クリックでMoveを選択
パーツコピー(copy)
パーツのコピーはcopy
1度コピーすれば他の回路図(ファイル)へのコピーも可能
パーツ反転(Mirror)
パーツを裏側に移動させたいときはMirror
パーツ追加(Add)
addしてライブラリからパーツを選択して配置
このとき表示されるライブラリはEagleを開いたときに最初に表示されるControl PanelのLibraryの項目で緑丸がついているものだけなので注意
パーツ変更(Replace)
少し大きいパーツに変更したい時とかReplaceを使うとわざわざ配線しなおさなくてすむ
NameとValueの位置を変更したい(Smash)
パーツの位置はそのままでNameとValueの位置だけ変更したい場合はSmash
Smashを選択してパーツ中心の十字マークを選択すると、NameとValueの右上にも十字マークが表示される
Moveでそのマークを選択するとNameのみ, Valueのみ移動することが出来る
配線(Route/Ripup)
配線する際にはRoute
このとき配線は直角に曲げるのはよくないとされ、45度ずつ曲げるようにする
うまくパーツの中心にこないときは、一度途中で配線を止めてもう一つのパーツからひいて繋げるとうまくいくことが多い
一度配線したものを取り消すのはRipup
Deleteではできないので注意
表面(Top)から裏面(Bottom)への配線をする場合は途中でviaをうつ必要があるが、Routeコマンドで配線している途中でlayerを変更することで自動でviaをうってくれる
回路図ではシングルクリックではどこまでも線が続くが、ダブルクリックで終了となる
Wire
こちらも線を引くツールだが、こちらでは回路図の方で指定していない線も自由にボードに引くことができる
線をひいた後にNameをGNDと変更することでベタGNDで塗られていない部位も追加することができる
テキストボックス(Text)
文字を入力することが出来る
通常p版.comではパーツのvalueは印刷されないが、それを個別に入力することで印刷したり、ボードの名前や簡単な説明を入力することができる
Grid
ボードに表示されるGridを指定できる
- 自分が使ってる設定
- Size: 1.27mm
- Multiple: 1
- Alt: 0.0125inch
パッド間レジスト開口クリアランス
以下の画像のtStop(緑の斜線エリア)を広くしたい or せまくしたい場合
DRCから以下のMasksのパラメータで調整
今回は2milから5milに広げてみた
SANs対応済みでワイルドカードオレオレ証明書の作り方
過去の投稿はこちら
portaltan.hatenablog.com
portaltan.hatenablog.com
### 1. setting $ export name=server ### 2. create private key $ openssl genrsa 2048 > ${name}.key ### 3. create csr $ openssl req -new -key ${name}.key > ${name}.csr . . Common Name (eg, your name or your servers hostname) []:*.domain.com # 適宜修正 . . ### 4. create crt ## create extension file $ echo subjectAltName=DNS:*.domain.com > san.ext #適宜修正 ## generate crt $ openssl x509 -days 3650 -req -signkey ${name}.key < ${name}.csr > ${name}.crt -extfile san.ext ### 5. confirm ### confirm(csrファイル) $ openssl req -text -noout -in ${name}.csr ### confirm(crtファイル) $ openssl x509 -text -noout -in ${name}.crt (### convert der file) $ openssl x509 -in ${name}.crt -outform DER -out ${name}.der
秋月のコイル(SMD Power Inductor) NR10050T100Mのライブラリを作った
以下の秋月のコイルのEagleのライブラリが見つからなかったので作成しました
akizukidenshi.com
データシート
http://akizukidenshi.com/download/ds/taiyouyuden/NR10050T100M.pdf
ライブラリ作成の開始
File > New > Libraryを選択すると新規ライブラリ作成画面が表示される
まずはこの時点でライブラリ名を決めて保存してしまう
今回は『smd-power-inductor.lbr』とした
基本的にライブラリ名は英小文字と数字とハイフンで作られているので、それに従ったほうがよさそう
次から実際のライブラリ作成を進めていく。大きな流れは以下のようになる
1. Packageの作成 : パターン図に表示される
2. Symbolの作成 : 回路図に表示される
3. Deviceの作成 : 作成したPackageとSymbolを連携させる
Packageの作成
Packageアイコンを選択して、名前を決める
(今回はNR10050とした)
以下のようなパターン図作成のような画面が表示される
Gridの設定
まずはGridの設定を行う
今回は部品が小さいので、Sizeを0.1mm、Altを0.05mmにした
Smdの設置
次にSmdの設置を行う
smdは表面実装用のpadで、pinはその名の通りピン用のホールを作成する
今回のコイルは表面実装コイルなのでsmdを選択する
まずボード上に配置したら、Propertiesから調整をする
- Name:1へ変更
- position: 0,0へ変更
- Smd Size: 2.6 x 4.5
Smd SizeはデータシートのRecommeded Land Patterns通りにした
つぎに見やすいようにスケーラをつける
スケーラ自体もデフォルトは太すぎて見にくいので細く小さくする
- Size: 0.3048へ変更
- Layer: 47 Measuresに変更
- Line Width: 0.01へ変更
もしMeasuresのLayerを非表示にしている場合は見えなくなってしまうので、その場合はLayer Settingから47番を表示にする
同じく高さ(データシートのC)もスケーラをつけた
次に作成したsmdをコピーしてもう一つ作成する
smd間の距離はデータシートの通り5.4mmにする
外形の作成
今回はコイルが丸型なので外形として円を書きます
大きさ等はデータシートを参考にします。ちょっと楕円になっていますが、ほぼ変わらないので半径は5mmとします。
Circleを選んで適当に配置したら、Propertiesで調整します
- Position: 4,0へ変更
- Layer: 21 tPlaceへ変更
- Radius: 5へ変更
Descriptionの追加
下部のDescriptionというリンクをクリックして説明文を追加します
Packageの完成
以上でPackageの完成です、保存をして次のSymbolの作成に移ります
Symbolの作成
まずはSymbolアイコンをクリックして名前をつけます
そうすると回路図の画面が表示されます
ここで実際に回路図に表示される記号を作成していきます
コイル記号の作成
Arcアイコンを利用してコイルの記号を作成します
pinのアタッチ
pinアイコンを選択して、以下のように配置します
これもPropertiesで調整します
- Length: shortへ変更
- Visible: offへ変更
Symbolの完成
以上でSymbolの作成は完了です。保存してDeviceの作成にすすみます
Deviceの作成
Deviceアイコンをクリックして名前をつけます
以下のような画面が表示されます
Symbolの追加
Addアイコンから今作ったNR10050 Symbolをaddします
Packageの追加
次に右下のNewボタンからNR10050 Packageをaddします
Connect
まだPackageとSymbolは別のものとして関係がないので、Packageのsmdとsymbolのpinをconnectします
右下のConnectボタンを選択し、接続したいpinとpadを選択してConnectをクリックします
Prefixの追加
右下のPrefixを選択し、Lと1文字いれてOKを押します
これで、同じ部品が呼び出されたときにL1, L2・・・と名前が自動で付加されていきます
(PackageとSymbolで名前を付け忘れていたのでつけています)
Desciptionの追加
左下のDescriptionアイコンをクリックして説明文を入力します
Deviceの完成
以上でDevideの完成です。これが最後の工程なのでライブラリの完成となります。
確認
実際にライブラリを呼び出して確認してみましょう
Libraries一覧で確認をして、
新規プロジェクトで呼び出すと以下のように先ほど作成したコイルが表示されるのが確認できます
メモ
今回はやっていないんですが、パッケージ作成時の最後に中心点をパーツの真ん中にしておくと、実際にライブラリを使う際に便利です
(中心じゃないとrotate時に位置がずれてしまうので)