C# 取得したDatatableから、SQLiteのDBテーブルに一括書き込み

残念ながらテーブルを直接書き込むうまい方法はない

SQLiteデータベースにインポートする大量のデータセットがありますが、Microsoft.Data.Sqliteに一括挿入APIが見つかりません 。ないからです!SQLiteには、データを一括挿入する特別な方法はありません。

Microsoft.Data.Sqliteへの一括挿入

Datatableあるのにな、そのまま一行書けばテーブルが出来ちゃえばいいのにと。

だけどそんなうまい方法はないらしいです。

2つのPrimaryKeyを持ったテーブル作成

using (var con = new SqliteConnection(connectionString))
{
    con.Open();
    using (SqliteCommand command = con.CreateCommand())
    {
        command.CommandText = "create table tm_product(ProductID INTEGER , AtributeCD INTEGER, AtrName TEXT,AtrJun INTEGER,PRIMARY KEY(ProductID,AtributeCD))";
        command.ExecuteNonQuery();
    }

    con.Close();
}

 

参考にしたサイトはこちら

書き込みサンプル

インサートを高速化するため、以下を留意する

  1. トランザクションを使用
  2. 同じINSERTコマンドを再利用
SqliteConnection con = new SqliteConnection(connectionString);
con.Open();
using (var transaction = con.BeginTransaction())
{
    var command = con.CreateCommand();
    command.CommandText =
    @"
        INSERT INTO tm_product (ProductID,AtributeCD,AtrName,AtrJun)
        VALUES ($ProductID,$AtributeCD,$AtrName,$AtrJun)
    ";


    var ProductIDParameter = command.CreateParameter();
    ProductIDParameter.ParameterName = "$ProductID";
    command.Parameters.Add(ProductIDParameter);

    var AtributeCDParameter = command.CreateParameter();
    AtributeCDParameter.ParameterName = "$AtributeCD";
    command.Parameters.Add(AtributeCDParameter);

    var AtrNameParameter = command.CreateParameter();
    AtrNameParameter.ParameterName = "$AtrName";
    command.Parameters.Add(AtrNameParameter);

    var AtrJunParameter = command.CreateParameter();
    AtrJunParameter.ParameterName = "$AtrJun";
    command.Parameters.Add(AtrJunParameter);


    // Insert a lot of data

    foreach(DataRow dr in dt.Rows)
    {
        ProductIDParameter.Value = dr["ProductID"];
        AtributeCDParameter.Value = dr["AtributeCD"];
        AtrNameParameter.Value = dr["AtrName"];
        AtrJunParameter.Value = dr["AtrJun"];
        command.ExecuteNonQuery();
    }

    transaction.Commit();
}
con.Close();

 

条件的には

dtは、他データベースから別で取得したdatatable

結論

620万件のデータをローカルSQLiteに書き込むのに18秒

ファイル容量は 24,824KBになった。

C# SQLiteでdbをパスワード保護したいだけです Microsoft.Data.Sqlite 使って簡単にできた

System.Data.SQLiteはパスワード暗号対応してない

SQLiteでできたDBにパスワードをつけたいと思ったのですが、System.Data.SQLiteでは対応していないようです。

パスワード文字列を入れるとエラーが

using (var con = new SQLiteConnection("Data Source=" + DBName + ";Version=3;Password=passwd;"))

 

Password構文が使えないらしく、暗号化libraryが組み込まれていないと怒られてしまう。

 

System.Data.SQLite.SQLiteException: 'SQL logic error
Cannot use "Password" connection string property: library was not built with encryption support, please see "https://www.sqlite.org/see" for more information'

https://www.sqlite.org/see

を見ると、SQLite Encryption Extension

ダウンロードしてコンパイルしないといけないの?なんかめんどくさそう。

Microsoft.Data.Sqliteを使う

ここがポイント!

dbファイルにパスワード暗号を利用したいのであれば、System.Data.SQLiteを使わないようにします。

Entity Framework Coreを利用

SQLiteEncryptionUsingEFCore

これは、Entity Framework Core(EFCore)を使用してSQLite暗号化データベースを使用する方法を示す実際の例です。

Visualstudio .NetアプリケーションでEntity Framework Coreを利用しSQLiteで暗号化できる事が記載してあります。

Microsoft.Data.Sqliteって何なの?

Entity Framework チームは、Brice のプロトタイプに基づいて Microsoft.Data.Sqlite を作成することを決定しました。 これにより、.NET Core の目標に沿った、軽量で最新の新たな実装を作成

System.Data.SQLite との比較

System.Data.Sqliteとの違い

  • DataSet API (DataTable と DataAdapter を含む) は含まれていない
  • データ型の処理方法がINTEGER、REAL、TEXT、および BLOB の 4 つだけ

もっと端的にいうなら

DataAdapter,DataTableが使えない(回避方法について後述)

DBType(データ型)が4種類しかない

って事です。

.net 4.7.2にてテスト

.NET framework 4.7.2にてテストを行います。新しいWPFプロジェクトを作成します。

EntityFrameworkCoreをNuGet

NuGetするもの

Microsoft.EntityFrameworkCore

Microsoft.EntityFrameworkCore.Design

Microsoft.EntityFrameworkCore.Sqlite.Core

SQLitePCLRaw.bundle_e_sqlcipher

の4つです。

NuGetパッケージの管理をクリック

Microsoft.EntityFrameworkCore 3.1.10をインストール

Microsoft.EntityFrameworkCore.Design 3.1.10をインストール

Microsoft.EntityFrameworkCore.Sqlite.Core 3.1.10をインストール

SQLitePCLRaw.bundle_e_sqlcipher 2.0.4をインストール

SQLiteDB パスワード暗号付きテストアプリ

DB作成 パスワード暗号付きでSQLiteDBを作成します

DB書込 パスワード暗号付きSQLiteDBへレコードを書き込みます

DB読込 パスワード暗号付きSQLiteDBからテーブルをDataAdapterで接続TableにFillします

パスワード暗号付きDBの作成

SqliteConnectionStringBuilder を使います

使用例

var connectionString = new SqliteConnectionStringBuilder(baseConnectionString)
{
    Mode = SqliteOpenMode.ReadWriteCreate,
    Password = password
}.ToString();

 

DB作成のコード

using System.Windows;
using System.Data;
using Microsoft.Data.Sqlite;

namespace sqliteMS
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        string connectionString = new SqliteConnectionStringBuilder("Data Source = test1.db ; Cache = Shared")
        {
            Mode = SqliteOpenMode.ReadWriteCreate,
            Password = "pass"
        }.ToString();

        private void B_MakeDB_Click(object sender, RoutedEventArgs e)
        {


            // コネクションを開いてテーブル作成して閉じる  
            using (var con = new SqliteConnection(connectionString))
            {
                con.Open();
                using (SqliteCommand command = con.CreateCommand())
                {
                    command.CommandText = "create table t_product(CD INTEGER  PRIMARY KEY AUTOINCREMENT, productname TEXT, price INTEGER)";
                    command.ExecuteNonQuery();
                }

                con.Close();
            }
        }

 

パスワード付きSQLite DBへの書き込み

private void V_DBWrite_Click(object sender, RoutedEventArgs e)
{

    using (var con = new SqliteConnection(connectionString))
    {
        con.Open();
        using (SqliteTransaction trans = con.BeginTransaction())
        {
            SqliteCommand cmd = con.CreateCommand();

            // インサート
            cmd.CommandText = "INSERT INTO t_product (productname, price) VALUES (@Product, @Price)";

            // パラメータセット
            cmd.Parameters.Add("Product", SqliteType.Text);
            cmd.Parameters.Add("Price", SqliteType.Integer);

            // データ追加
            cmd.Parameters["Product"].Value = t_Product.Text;
            cmd.Parameters["Price"].Value = int.Parse(t_Price.Text);
            cmd.ExecuteNonQuery();

            // コミット
            trans.Commit();
        }
    }
}

 

テーブル読込とDataAdapterを使いたい

Microsoft.Data.Sqliteを利用していると、DataAdapter,DataTableが使えないのですが、DataAdapter,DataTableを使う方法があります。

ここでSystem.Data.SQLiteを使ってDataAdapter,DataTableを拝借します。

System.Data.SQLiteをNuGETします。

private void B_DBRead_Click(object sender, RoutedEventArgs e)
{
    System.Data.Common.DbProviderFactory factory = System.Data.Common.DbProviderFactories.GetFactory("System.Data.SQLite");

    using (SqliteConnection con = new SqliteConnection(connectionString))
    {
        // DataTableを生成します。
        var dataTable = new DataTable();

        // コマンドを作る
        System.Data.Common.DbCommand command = con.CreateCommand();
        command.CommandText = "SELECT * FROM t_product";
        command.CommandType = CommandType.Text;
        command.Connection = con;

        // SQLの実行
        var adapter = factory.CreateDataAdapter();
        adapter.SelectCommand = command;
        adapter.Fill(dataTable);

        dataGrid.DataContext = dataTable;
    }
}

 

暗号化できてる?読込試験

A5:SQL Mk-2を使って作成したDBファイルが読込できるか確認してみました。

とりあえず、読込はできません。パスワードを指定しても読み込めません。

Visual Studio C#でSQLiteを使ってみる

環境

System.Data.Sqliteにて、VisualStudio2017 C# .NET framework4.6.1でSQLiteを使ってみます。

WPFアプリの作成

NuGetでSystem.Data.SQLiteを取得

NuGetパッケージの管理をクリック

検索テキストボックスにSystem.Data.SQLiteと入力

一番上に出てきたSystem.Data.SQLiteをインストールする

依存関係のあるパッケージも併せてインストールされます

DBとテーブルの作成

using System.Data.SQLite;

を加える

Xaml上にテーブル作成ボタンを配置

イベントに追加

private void B_MakeDB_Click(object sender, RoutedEventArgs e)
{
    // コネクションを開いてテーブル作成して閉じる  
    using (var con = new SQLiteConnection("Data Source=test.db"))
    {
        con.Open();
        using (SQLiteCommand command = con.CreateCommand())
        {
            command.CommandText = "create table t_product(CD INTEGER  PRIMARY KEY AUTOINCREMENT, productname TEXT, price INTEGER)";
            command.ExecuteNonQuery();
        }

        con.Close();
    }
}

 

実行すると、test.dbができている事を確認

DBへの接続

DB接続ボタンを設置

イベントに追加

private void B_Con_Click(object sender, RoutedEventArgs e)
{
    using (SQLiteConnection con = new SQLiteConnection("Data Source=test.db"))
    {
        try
        {
            con.Open();
            MessageBox.Show("接続に成功しました");
        }
        catch (Exception Ex)
        {
            MessageBox.Show(Ex.Message);
        }
    }
}

 

接続確認

データ書き込み

DB書き込み用のテキストボックス準備

using (SQLiteConnection con = new SQLiteConnection("Data Source=test.db"))
{
    con.Open();
    using (SQLiteTransaction trans = con.BeginTransaction())
    {
        SQLiteCommand cmd = con.CreateCommand();

        // インサート
        cmd.CommandText = "INSERT INTO t_product (productname, price) VALUES (@Product, @Price)";

        // パラメータセット
        cmd.Parameters.Add("Product", System.Data.DbType.String);
        cmd.Parameters.Add("Price", System.Data.DbType.Int64);

        // データ追加
        cmd.Parameters["Product"].Value = t_Product.Text;
        cmd.Parameters["Price"].Value = int.Parse(t_Price.Text);
        cmd.ExecuteNonQuery();

        // コミット
        trans.Commit();
    }
}

※めんどくさかったので、テキストボックスのinteger判断などはしてない

A5:SQL Mk-2を使って、テーブルが出来ているか、レコードができているか確認

ちゃんとできている

データ取得

dataGridを配置

<DataGrid x:Name="dataGrid" HorizontalAlignment="Left" Height="164" Margin="336,215,0,0" VerticalAlignment="Top" Width="348"  ItemsSource="{Binding}" AutoGenerateColumns="True" />

xamlにItemSource={Binding} AutoGenerateColumns=”True” を追記

using (SQLiteConnection con = new SQLiteConnection("Data Source=test.db"))
{
    // DataTableを生成します。
    var dataTable = new DataTable();

    // SQLの実行
    var adapter = new SQLiteDataAdapter("SELECT * FROM t_product",con);
    adapter.Fill(dataTable);

    dataGrid.DataContext = dataTable;
}

 

データを取得できたことを確認

パスワード暗号使えない

さて、DBをパスワード暗号化しようと思ったら使えませんでした。どうも、System.Data.Sqliteには標準で組みこまれていないようです。別途ソースコンパイルなどをしないといけないようでめんどくさそう。

そこで簡単に実装できる方法を試してみました。

6型蛍光灯の代わりになるLED照明器具

短い照明器具が欲しい

バーライト

棒状の照明器具で、LED点灯、AC電源で使えるものを探していたのですが、なかなかみつからなかったのです。やっと、希望の製品が見つかりました。

バーライトで検索すると、とっても横幅が長い製品が出てきて、なかなか希望とする20㎝くらいの製品が見つかりませんでした。

LEDエコスリム 長さ約20cm

220mmで、およそ6型蛍光灯と同じ大きさになります。

2,000時間の耐久性

外形はこんな感じ

付属品

●使用電源:AC100V 50/60Hz
●消費電力:4.0W
●全光束
昼光色:約265ルーメン
電球色:約240ルーメン
●直下照度(1mの場合)
昼光色:約90ルクス
電球色:約85ルクス
●平均演色評価数:Ra80
●定格寿命:約40,000時間(LEDは交換できません)
●本体寸法:幅27×高さ22×長さ220mm(本体のみ)
●パッケージ寸法:幅114×高さ23×長さ497mm
●本体質量:86g
●付属品
電源コード/約1.4m(1本)
固定用パーツAタイプ(2個)、Bタイプ(2個)
固定用ネジ(4本)、サイドキャップ(装着済み・1個)

PoE HUBをPoE HUBで動かしたい!その先の無線APも動く?

PoE 受電駆動パススルー

PoE HUBから、でたLANケーブルでHUBを動かす事はできます。

さらに、そのHUBからPoE給電したい

そのキーになるのが受電駆動の上パススルーできるPoEスイッチです。

NETGEAR 卓上型コンパクト アンマネージプラス スイッチングハブ GS105PE ギガビット5ポート PoEパススルータイプ (PoE 2ポート)電源アダプタ無し PoE給電必須

http://kb.netgear.com/app/answers/detail/a_id/25541/~/gs105pe%3A-poe-troubleshooting

PoE の規格には 802.3af と 802.3at がありますが、802.3af で本製品へ給電した場合、本製品からの給電ができるのは 802.3af Class 1/2 の製品のみとなります。一部のネットワークカメラや IP Phone など、ごく限られた製品です。

したがって 802.3at で本製品へ給電したいところですが、機種によっては 802.3at の互換性に問題があり、802.3at 対応のスイッチでも正常に 802.3at で給電できない場合があるようです。当方では現状 Meraki MS220-8P から 802.3at で給電できていますが、保証の限りではありません。

802.3at から802.3atへ給電できるという事だ

ただ、併せて機種によっても802.3atの互換性に問題ありとの記載が。ちょっと信頼しきるのは怖いかも。

802.3at給電HUB

NETGEAR 卓上型コンパクトアンマネージスイッチングハブ GS305PP ギガビット 5ポート (PoE+ 4ポート 83W) 静音ファンレス 省電力設計 3年保証

  • PoE+(802.3at)に対応したギガビット 10/100/1000Mbps 5ポート アンマネージスイッチ
  • 設定不要でPoE/PoE+での給電がすぐつかえる。
  • PoE+対応ポート x4(スイッチ全体で83Wまで給電可能)
  • 冷却用のファンなしで自身を冷却できる金属筐体を採用した静音設計
  • 無線LANアクセスポイントやIP監視カメラ、IP電話機に最適
  • 使用しないポートの消費電力を抑える、またLANケーブルの長さを検出して消費電力を最適化する省エネ機能搭載
  • 【安心の日本語サポートと3年保証】ネットギアのサポート窓口は365日年中無休で対応します。
  • ※購入後サポートには製品のユーザー登録が必要です(納品書など購入日がわかるものをご用意ください)

無線LAN装置

BUFFALO 法人向け無線LANアクセスポイント WAPM-1266R

PoE IEEE 802.3at 準拠製品

無線LANインターフェース:
・伝送方式 直接拡散型スペクトラム拡散(DS-SS方式)、直交波周波数分割多重変調(OFDM方式)、単信(半二重)
・周波数範囲(チャンネル)
 IEEE802.11a 5.18GHz~5.7GHz( 36 / 40 / 44 / 48 / 52 / 56 / 60 / 64 / 100 / 104 / 108 / 112 / 116 / 120 / 124 / 128 / 132 / 136 / 140ch )
 IEEE802.11g / IEEE802.11b 2.4GHz (1~13ch)
・セキュリティー
 WPA3 Personal、WPA2/WPA3 Personal、WPA3 Enterprise、WPA2/WPA3 Enterprise、WPA3 Enterprise 192-bit Security、WPA2 Personal(WPA2-PSK AES)、
 WPA/WPA2 Personal(WPA/WPA2 mixed mode-PSK AES/TKIP)、WPA2 Enterprise(WPA2-EAP AES)、WPA/WPA2 Enterprise(WPA/WPA2 mixed mode-EAP AES/TKIP)、
 Enhanced Open、Any接続拒否、プライバシーセパレーター、MACアドレスフィルター
・アンテナ 外部(External)、送受信(Tx / Rx) 2本、レーダー波監視用アンテナ×1(内蔵)
・アクセス方式 インフラストラクチャモード、WDSモード

しかし、動かない。

実際に購入して試してみました。

GS305PP → GS105PE までの受電駆動はうまくいきます。

GS105PEには電源不要です。

GS305PP → GS105PE → WAPM1266R という構成にすると

WAPM1266Rは、PowerランプがつくもDIAGが点滅。正常動作しません。

LANケーブル自作したいんだけどどれ買う?安くていいものを

自社にLANケーブル引く

工業系でLANケーブルを購入する時には関西通信電線を選んでいます

業務的ではないけど、信頼性は高いものでは?という基準で選んでみました。

LANカシメ工具

カシメ工具もピンキリです。

一応、口コミが良いものを選びましたが、この持ち手がグリーンのタイプ。

これが一番安くしかもセットにしても2,000円台で購入できるやつです。

LANケーブル

LANケーブルはちょっと迷いました。今までの経験上、LANケーブルと、RJ45コネクタ。同じメーカの方がいいです。違うメーカ制のものを利用した場合に、かしめた後、導通しないなどの不具合に遭遇してびっくり。

そこで、安心できる日本製。日本メーカのLANケーブルとコネクタを選定する事にしました。

日本製線

  • 製品名称:ギガビット伝送対応ケーブル(Cat.5e)
  • 適合・対応:1000BASE-T,100BASE-TX,10BASE-T
  • 製品構造:U/UTP 4対 / 導体:単線 AWG24 / 外被:PVC
  • 標準仕上外径:5.2mm
  • 標準梱包:300m/フリーコイル巻き

日本に本社を置くメーカです。特徴として安い!

高い評価をしている人も多いです。

特にケーブルに長さ表示があるので,複数を束ねて配管に通したとき,どちらがどちらのケーブルかすぐに分かりました。

それと,品質にも問題なし。防犯カメラの延長に利用しましたが,全く問題なかったです。

300m巻きが1万円です。これはお買い得。楽天では2万円で売っています。

日本製線

本社所在地 〒105-0004 東京都港区新橋2丁⽬20番15号 新橋駅前ビル1号館 5FTEL.03(3572)3471 FAX.03(3574)1198

日本メーカは、手放しで信じてしまう、安易な私(^-^;

LANコネクタ

もちろんLANコネクタは日本製線の物を選びます。

  • 【Cat5e】LANケーブル(ケーブルのみ)と合わせて、LANケーブルを現地成端する為の RJ45コネクタ(24AWG用)
  • 部品点数:1ピース
  • 単線・撚り線ともに使える共用プラグ
  • 適用ケーブル外径(太さ):4.8mm~5.9mm
  • 推奨LANケーブル:【Cat5e】当社製:0.5 – 4P NSEDT、推奨工具:NST88

爪が折れにくい事を評価している方と、書閉めた後LAN工具から抜けにくい事を不評としている人と2通りいらっしゃるようです。

ロリポップ モバイル4倍、PC2倍 驚くほど速いハイスピードプラン さくらのレンタルサーバーから引っ越しました

現在 契約期間1年分追加キャンペーン中

ロリポップのハイスピードプラン月額500円

ハイスピードプランが500円で利用できるようになりました。

超高速で評判です。わたしは、バックアップシステムが優れているさくらのレンタルサーバーを利用しておりましたが、最近アクセス数も多くなり、プランをアップグレードしなくてはいけないかなとおもっていたところでした。

そこでみかけたのが、以前は月額1,000円で提供していたハイスピードプランが3年契約で月額500円で利用できるとの事。

だけど本当にこのハイスピードプランは早いの?と疑問が沸き、試してみました。

結論 モバイル3.8倍速、PC1.95倍速

PageSpeed Insightsのスコアを比較した結果。まったく同じホームページを表示するのに

さくらのレンタルサーバー スタンダード

モバイル13、PC44

ロリポップレンタルサーバ ハイスピードプラン

モバイル50、PC86

というスコアをマークしました

モバイルで3.8倍、PC表示で1.95倍のスコアがをたたき出しています。これはすごい差です。

これだけ差があると、体感できます。ロリポップのハイスピードプランの方が断然表示する速度が速いし、編集していても、WordPressがサクサク動きます。

ロリポップ!

無料お試し10日間

無料お試しに申し込みました。

引っ越しは超簡単

引っ越し元のWordPRessユーザ名、パスワードを入力するだけで自動的に引っ越しが可能です。これは楽ちん。

データ元の容量は4GBほどあったのですが、あっという間に引っ越しが完了しました。5分もかからないようです。

引っ越しがうまくいかない場合

Microsoft Edge(マイクロソフト エッジ)で引っ越し試そうとしたらユーザ名、またはパスワードが違うとしてうまくいきませんでした。

Google Chromeに変更して引っ越ししたところ問題なく進みました。

ページを表示させてみる

すごい。これだけの操作で本当に引っ越しできてしまいました。この簡単な操作は圧巻です。これはGMO恐るべし。やっぱり勢いある会社はすごいな。ちょっと感動してしまいました。

ドメインの移行

ムームードメインを利用しているのでロリポップへ移行する

ムームードメインで取得したドメインをそのまま公開フォルダに設定します。

ムームードメインの設定をロリポップのネームサーバに変更後時間が経過していないためか、whoisに反映されておりませんという警告がでるが、無視して設定する。

ムームードメインにDNSを移行する

無料の独自SSLを利用する

無料の独自SSLを利用できるようになるまで少し時間がかかる。

前項で行った、ムームーDNSを利用し、利用先サービスを「ロリポップ!」にする必要があります。

Let’s Encryptが有効になるとこうなる

WordPressドメイン設定

引っ越し当初は、WordPressアドレス、サイトアドレスが引っ越し先のアドレスになっているので、設定した独自ドメインのアドレスに変更します。

1~2日間は、ドメイン情報が反映されるまで、引っ越し元のサーバ、今回設定したロリポップのサーバへのアクセス状態が不安定になります。

さくらのレンタル PageSpeed Insights

モバイル 13

PC 44

ロリポップ ハイスピード(ドメイン移行後)

モバイル 50

PC 86

早速契約19,800円

3年契約19,800円。月額税込み550円です。こんなに早くなるなら、移行して正解です。

まとめ

やっぱりロリポップのハイスピードプランの方がはやい!

ロリポップ!

2020Ubuntuにnginx+rtmp moduleで、RTMPエンコードして映像配信したいだけ

WebARENAの安いクラウド

349円/月額のLinuxサーバを配信基盤にして映像配信サービスを稼働させます。

nginx安定板をダウンロード

root@cloud01:/home/ubuntu# wget https://nginx.org/download/nginx-1.18.0.tar.gz
--2020-10-30 16:49:24--  https://nginx.org/download/nginx-1.18.0.tar.gz
Resolving nginx.org (nginx.org)... 3.125.197.172, 52.58.199.22, 2a05:d014:edb:5704::6, ...
Connecting to nginx.org (nginx.org)|3.125.197.172|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1039530 (1015K) [application/octet-stream]
Saving to: ‘nginx-1.18.0.tar.gz’

nginx-1.18.0.tar.gz            100%[===================================================>]   1015K   777KB/s    in 1.3s

2020-10-30 16:49:27 (777 KB/s) - ‘nginx-1.18.0.tar.gz’ saved [1039530/1039530]

root@cloud01:/home/ubuntu# tar xzvf nginx-1.18.0.tar.gz

gitを取得

root@cloud01:/home/ubuntu# apt-get install git
Reading package lists... Done
Building dependency tree
Reading state information... Done
git is already the newest version (1:2.17.1-1ubuntu0.7).
The following packages were automatically installed and are no longer required:
  grub-pc-bin libpython-stdlib libpython2.7-minimal libpython2.7-stdlib python python-argcomplete python-ipaddr
  python-minimal python2.7 python2.7-minimal
Use 'apt autoremove' to remove them.
0 upgraded, 0 newly installed, 0 to remove and 7 not upgraded.

 

nginx-rtmp-moduleを取得

git clone  https://github.com/arut/nginx-rtmp-module.git

 

コンパイル準備

apt-get install libpcre3-dev zlib1g-dev openssl libssl-dev make gcc

configureとmake

root@cloud01:/home/ubuntu# cd nginx-1.18.0
root@cloud01:/home/ubuntu/nginx-1.18.0#./configure --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --add-module=../nginx-rtmp-module --with-debug --prefix=/usr/local/nginx --with-http_secure_link_module --user=www-data --group=www-data
root@cloud01:/home/ubuntu/nginx-1.18.0#make
root@cloud01:/home/ubuntu/nginx-1.18.0#make install

PHPのインストール

apt-get install php php-cgi php-cli php-fpm

 

エンコード受付用パスワード

cd /usr/local/nginx/html/
mkdir publishauth
cd publishauth/
cat auth.php
// www.server.com/auth.php?user=felix&pass=felixpassword

//check if querystrings exist or not
if(empty($_GET['user']) || empty($_GET['pass']))
   {
    //no querystrings or wrong syntax
    echo "File not found.";
    header('HTTP/1.0 404 Not Found');
    exit(1);
   }

else
   {
    //querystring exist
    $username = $_GET['user'];
    $password = $_GET['pass'];
   }

$savedpassword =  livepass;
$saveduser = liveuser;


//check pass and user string
if (strcmp($password,$savedpassword)==0 &&  strcmp($username,$saveduser)==0 )
      {
        echo "Password and Username OK! ";

        }

else
      {
        echo "password or username wrong! ";
        header('HTTP/1.0 404 Not Found'); //kein stream
        }

?>

 

nginx.confの設定

grep -v '^\s*#' /etc/nginx/nginx.conf |grep -v '^\s*$'
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
        location ~ \.php$ {
             fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
             fastcgi_index index.php;
             fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
             include fastcgi_params;
        }
    }
}
rtmp {
      server {
      listen 1935;
      notify_method get;
      buflen 5s;
      drop_idle_publisher 5s;
      publish_notify on;
      wait_key on;
      wait_video on;
      sync 10ms;

      application translate {
         live on;
         on_publish http://localhost/publishauth/auth.php;

         #LANからの映像配信しか受け付けない
         allow publish 192.168.0.0/16;
         deny publish all;

      }
   }
}

 

apacheが動いているんで削除

root@webarena01:/home/ubuntu# apt-get remove --purge apache2
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages were automatically installed and are no longer required:
  apache2-data apache2-utils grub-pc-bin libpython-stdlib libpython2.7-minimal libpython2.7-stdlib python python-argcomplete python-ipaddr
  python-minimal python2.7 python2.7-minimal
Use 'apt autoremove' to remove them.
The following packages will be REMOVED:
  apache2*
0 upgraded, 0 newly installed, 1 to remove and 7 not upgraded.
After this operation, 536 kB disk space will be freed.
Do you want to continue? [Y/n]

 

nginxとPHPの起動確認

root@Cloudn01:/etc/nginx# /usr/sbin/nginx
root@Cloudn01:/etc/nginx# netstat -an |grep :80
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN
root@Cloudn01:/etc/nginx# netstat -an |grep :1935
tcp        0      0 0.0.0.0:1935            0.0.0.0:*               LISTEN
root@Cloudn01:/etc/nginx# ps aux |egrep 'www-data'
www-data   397  0.0  0.7  44744  3820 ?        S    17:04   0:00 nginx: worker process
www-data   398  0.0  0.7  44480  3940 ?        S    17:04   0:00 nginx: cache manager process
root       413  0.0  0.2  14428  1080 pts/0    S+   17:04   0:00 grep -E --color=auto www-data
www-data  9985  0.0  0.5 439996  2476 ?        S    Oct16   0:00 php-fpm: pool www
www-data  9986  0.0  0.4 439996  2132 ?        S    Oct16   0:00 php-fpm: pool www

 

phpinfo.phpを置いてみる

vi /usr/local/nginx/html/phpinfo.php
<?php
phpinfo();
?>

ダッシュボードの設置

root@webarena01:/usr/local/nginx/html# cp /home/ubuntu/nginx-rtmp-module/stat.xsl .

ダッシュボードへのアクセス

http://server

nginxの自動起動

### BEGIN INIT INFO
# Provides:   nginx
# Required-Start:    $local_fs $remote_fs $network $syslog $named
# Required-Stop:     $local_fs $remote_fs $network $syslog $named
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: starts the nginx web server
# Description:       starts nginx using start-stop-daemon
### END INIT INFO

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/sbin/nginx
NAME=nginx
DESC=nginx

test_nginx_config() {
  if $DAEMON -t $DAEMON_OPTS >/dev/null 2>&1; then
    return 0
  else
    $DAEMON -t $DAEMON_OPTS
    return $?
  fi
}
start() {
    test_nginx_config
    # Check if the ULIMIT is set in /etc/default/nginx
    if [ -n "$ULIMIT" ]; then
      # Set the ulimits
      ulimit $ULIMIT
    fi
    start-stop-daemon --start --quiet --pidfile /var/run/$NAME.pid \
      --retry 5 --exec $DAEMON -- $DAEMON_OPTS || true
}

stop() {
    start-stop-daemon --stop --quiet --pidfile /var/run/$NAME.pid \
      --retry 5 --exec $DAEMON || true
}

case "$1" in
  start)
    echo -n "Starting $DESC: "
    start
    echo "$NAME."
    ;;

  stop)
    echo -n "Stopping $DESC: "
    stop
    echo "$NAME."
    ;;
  restart|force-reload)
    echo -n "Restarting $DESC: "
    stop
    sleep 1
    echo "$NAME."
    start
    ;;

  reload)
    echo -n "Reloading $DESC configuration: "
    test_nginx_config
    start-stop-daemon --stop --signal HUP --quiet --pidfile /var/run/$NAME.pid \
      --exec $DAEMON || true
    echo "$NAME."
    ;;

  configtest|testconfig)
    echo -n "Testing $DESC configuration: "
    if test_nginx_config; then
      echo "$NAME."
    else
      exit $?
    fi
    ;;

  status)
    status_of_proc -p /var/run/$NAME.pid "$DAEMON" nginx && exit 0 || exit $?
    ;;

  *)
    echo "Usage: $NAME {start|stop|restart|reload|force-reload|status|configtest}" >&2
    exit 1
    ;;
esac

実行権限を与える

root@webarena01:/usr/local/nginx/html# chmod 755 /etc/init.d/nginx

登録して、rc2.dに反映されているか確認する

root@webarena01:/usr/local/nginx/html# update-rc.d nginx defaults
root@webarena01:/usr/local/nginx/html# ls /etc/rc2.d/
S01acpid   S01console-setup.sh  S01grub-common   S01lvm2-lvmpolld  S01mdadm  S01open-vm-tools  S01postgresql  S01ssh                  S01uuidd
S01apport  S01cron              S01irqbalance    S01lxcfs          S01nginx  S01php7.2-fpm     S01rsync       S01sysstat              S01vpnserver
S01atd     S01dbus              S01lvm2-lvmetad  S01lxd            S01ntp    S01plymouth       S01rsyslog     S01unattended-upgrades

 

エンコードしてみる

rtmp://サーバIP/live/streamkey?user= felix&pass= felixpassword

OBSでの設定はこんな感じになります

サーバIP 192.168.200.50

配信ポイント live

ストリーム名 translate

ユーザ名 liveuser

パスワード livepass

配信用パスワードつける

root@webarena01:/usr/local/nginx/passwd# htpasswd -c .htpasswd hanako
New password:
Re-type new password:
Adding password for user hanako

 

Debian ifup ifdownが使えない 簡単に使えるようになります

Debian Version

ubuntu@i-12100000138437:/etc/rc2.d$ cat /etc/debian_version
buster/sid

では、ifup , ifdownが使えません

簡単に使える方法がある

apt-get install ifupdown

ifup ifdownが使えない原因

Debian strechから ifup,ifdownコマンドがなくなりました

パッケージは準備されてる

最新のDebian バージョン Busterでも状況は変わっていませんが、

パッケージ: ifupdown (0.8.19)

DebianPackage

本パッケージは /etc/network/interfaces ファイルでのインターフェイス定義 に基づくネットワークインターフェイスを設定 (後者は設定解除) するために使用される ifup および ifdown ツールを供給します。

このパッケージだと /etc/network/interfacesに書いておけば、起動時もちゃんとIP Addressが割り当てられます。

単に ifup,ifdownが使いたいだけなら下記パッケージでもOKです。

パッケージ: ifupdown2 (1.2.5-1)

が準備されており、このパッケージを導入する事で、

/etc/network/interfaces format

が利用できるようになります。

ifupdownに似たネットワークインターフェース管理ツール
ifupdown2は、Pythonで書き直されたifupdownです。ifupdownを置き換え、ネットワークインターフェイス構成のifupdownと同じユーザーインターフェイスを提供します。ifupdownと同様に、ifupdown2は、/ etc / network / interfacesのインターフェース定義に基づいてネットワークインターフェースを構成(またはそれぞれ構成解除)するための高レベルのツールです。ネットワークインターフェイスの依存関係を検出することができ、ifup / ifdown / ifqueryコマンドの新しいコマンドオプションとして利用できるいくつかの新機能が付属しています。また、中断を最小限に抑えてインターフェイス設定をリロードするための新しいコマンドifreloadが付属しています。ほとんどのコマンドは、JSON形式での入力と出力も可能です。ifupdown / etc / network / interfaces形式との下位互換性があり、新しい簡略化された形式をサポートします。また、大規模なインターフェース展開のためにpython-makoを使用したインターフェーステンプレートもサポートしています。ifupdown2の詳細については、/ usr / share / doc / ifupdown2 /README.rstを参照してください。例は/ usr / share / doc / ifupdown2 / examplesにあります。

debian

超簡単 無料WOWZAでライブストリーミング配信してみる-OBSを利用する

WOWZA STREAMING CLOUDにトライアル申込

30日間無料で使えるので試してみます。

無料トライアルでは15分間のストリーム制限があります。

登録完了後に出てくるホームページで、簡単にOBSから映像配信を始めるまでの解説があるのでこれは必見。

https://www.wowza.com/pricing/cloud-free-trial-success

スタートガイド

英語が苦手な人は難しいのかな?

WOWZA STREAMING CLOUDへログイン

ライブストリーミングを追加する

Add Live Streamをクリック

配信元は日本を選択

Video Sourceの選択

今回はOBSを利用して配信したいので、Other RTMPを選択します。多彩な配信方法があるので、ここも素人向きではないところかな。

What billing mode do you want to use?

こちらから払い出した画像ソースで設定する

What type of live stream is this?

自動的に速度が可変になる Adaptive bitrateを選択

Do you want to push or pull your stream?

こちら側からソースを投げる(エンコードしてサーバにプッシュする)ので、Push directly を選択

Do you want to create a reduced-latency HLS stream?

低遅延HLSを利用するか?一応、そこまで遅延気にならないので、今回は低遅延にしない。

Do you want to create a VOD stream for this live stream?

オンデマンド用に映像を作るか?作ってみる

Do you want to record this live stream?

録画映像を作っておく

What type of closed captions does this stream have?

特に必要なさそうなのでNoneにする

Source Security

認証はしておいた方がいいので、チェック入れない

再生方法

再生方法は、HTML5で再生できるようにする。

ここも、素人では分かりにくいところかも。

WOWZAの中で映像を表示させるかどうか?

OBSの設定

WOWZA設定欄から

OBSの設定 →配信へ

Primary Server →サーバ

Stream Name →ストリームキー

Source Username →ユーザ名欄に記入

Source Password →パスワード欄に記入

ストリーミングを開始する

WOWZA設定画面から Start Live Streamにてストリーミングを開始する

開始には少し時間がかかる事がある

OBSのエンコードを開始する

配信開始ボタンを押す

映像配信がうまくできているか確認

ビデオサムネイルに映像が流れているか?

Inbound Bitrate に流量が表示され

Outbound Bitrateにも流量が表示されているのを確認

ホームページに表示させる

WOWZAストリーミング設定ページからPlayer Embed codeを取得

ホームページHTMLにそのまま貼り付ければOK

WordPressならカスタムHTMLブロックを作ってその中にPlayer Embed Codeを張り付ける

Wowza Streaming Cloud利用料金について(1か月プラン)

1か月利用上限

1か月のスポットプランの場合

イベントを開始して終了するまでの時間が20時間(Start Live Stream)

720p配信時、1000View時間→ 1000人の人が1時間みられる。500人なら2時間。

CDNなどトータル帯域幅 1,000GB(クラウドシステム上およびCDN上でライブストリームを開始してから終了するまでに転送された、ストリーミングのデータ転送量の合計)

Wowza Streaming Cloud利用料金について(年間プラン)

ストリーミングシステムおよびCDNの利用量

1か月の期間を単位期間とする「月間ピーク利用量」

1年間の期間を単位期間として集計される「年間利用量」

利用量は2種類

利用量は、「ストリームの持続時間」、「利用されたネットワーク帯域幅」、「消費されたディスクスペース」などの測定値が用いられる