BUFFALOのWi-Fiルーター WXR-1901DHP3 でNAT-Loopback機能をセットする方法

BUFFALOのWi-Fiルーター WXR-1901DHP3でNAT-Loopback機能(LAN側からの通信でも外部からの通信でも、同じWAN側IPアドレスで通信することができるようにする機能)を下のようにセットしました。


エアステーション設定ページから[詳細設定]をクリックします。

左のメニューから[セキュリティー]->[ポート変換]を選択します。
[ポート変換の新規追加]画面が表示されます。
TCP/UDPポート番号毎に指定もできますが、今回はすべてのポートを指定します。
グループ: 新規追加
Internet側IPアドレス: エアステーションのInternet側IPアドレス
プロトコル: すべて
LAN側IPアドレス: DMZで設定したホストのIPアドレス
以上のパラメータをセットして、[新規追加]をクリックします。
グループ名を自動的に付加して、[ポート変換登録情報]リストに[ON]の状態で表示されれば設定完了です。

[Debian] Python3にmatplotlibをインストール

pip3を使ってMatplotlibをインストールする際に下のようなエラーがでて失敗したときの対処方法です。

* The following required packages can not be built:
          * freetype

libfreetype6-devとpkg-configというパッケージをapを使ってインストールします。

# apt install libfreetype6-dev
# apt install pkg-config

そのあとに、pip3を使ってMatplotlibをインストールします。

# pip3 install matplotlib

これでMatplotlibを使えるようになったが、plot時に下のようなエラーがでてplotできないとき

NotImplementedError: Surface.create_for_data: Not Implemented yet.

下のようにcairocffiをインストールするとplotできるようになりました。

# apt install libffi-dev
# pip3 install cairocffi

 

[Debian] rootでsshリモートログインをさせない (/etc/ssh/sshd_config)

sshでrootでリモートログインをできないようにしておきます。
/etc/ssh/sshd_config ファイルを編集して、PermitRootLoginの行を下のようにnoに書き換えます。

PermitRootLogin  no

[Debian] GUIでファイアーウォール設定

GUIでファイアーウォールの設定を行えるようにパッケージgufwをインストールします。

# apt install gufw

パッケージをインストールしたら、管理者権限でコマンドgufwを実行します。

# gufw

[Unlock]ボタンをクリックします。

Statusをオンにします。


[+]ボタンをクリックしてルールを追加します。

[詳細]のタブをクリックするとIPアドレスごとにアクセス制限指定を行えます。
この例ではsshのルールを指定しています。

[追加]ボタンをクリックするとルールが追加されます。

最後に、「編集(E)」メニューの「Reload Rules」を選択して、編集したルールを読みなおして有効にします。

このGUIで編集したルールは /lib/ufw/user.rules および、 /lib/ufw/user6.rules というファイルに保存されますので、このファイルをテキストエディタで開いて内容を確認してください。

[Debian] リポジトリからDVDを抜く(/etc/apt/sources.list)

DVDを使ってDebianをインストールすると、パッケージのリポジトリとしてDVDが追加される。普段、パッケージの追加、更新にはDVDを使用せず、公式のベースリポジトリを使用するので、DVDを削除しておく。
そのためには、 /etc/apt/sources.list ファイルを編集して、DVDをコメントアウトしておけばよい。

# deb cdrom:[Debian GNU/Linux 8.7.1 _Jessie_ - Official amd64 DVD Binary-1 20170116-11:01]/ jessie contrib main

#deb cdrom:[Debian GNU/Linux 8.7.1 _Jessie_ - Official amd64 DVD Binary-1 20170116-11:01]/ jessie contrib main

deb http://ftp.jp.debian.org/debian/ jessie main
deb-src http://ftp.jp.debian.org/debian/ jessie main

deb http://security.debian.org/ jessie/updates main contrib
deb-src http://security.debian.org/ jessie/updates main contrib

# jessie-updates, previously known as 'volatile'
deb http://ftp.jp.debian.org/debian/ jessie-updates main contrib
deb-src http://ftp.jp.debian.org/debian/ jessie-updates main contrib

参照:Debian 管理者ハンドブック「第 6 章 メンテナンスと更新、APT ツール」

[Drupal 8] サイトをサブディレクトリに配置したときの設定

Druplaサイトをトップの
http://www.example.com/
ではなく
http://www.exsample.com/drupal8/
のようにサブディレクトリに配置したときには、素のインストールのままではちゃんと動作しません。
インストール時にDrupalを設置したルートディレクトリにつくられた .htaccessファイルに下の一行を追加する必要があります。

RewriteBase /drupal8

この drupal8は実際のディレクトリ名を指定します。
これでDrupalサイトにアクセスできるようになります。

[Debian] Apache2で.htaccessファイルを有効にするには

Debian8のApache2で.htaccessファイルを有効にするには次のようにします。

1. Apache2のモジュール mod_rewrite.soを有効にします。

# a2enmod rewrite

モジュールが組み込まれたのを確認します。

# apache2ctl -M

とコマンドを入力して

rewrite_module (shared)

と表示されればOKです。

2. Apache2コンフィグレーションファイルの編集
ここでは、デフォルトのサイトで.htaccessを有効にするものとします。
その場合はファイル:
/etc/apache2/sites-available/000-default.conf
に以下の行を追加してください。

<Directory /var/www/>
    Options Indexes FollowSymLinks MultiViews
    AllowOverride All
    Order allow,deny
    allow from all
</Directory>

3. Apache2の再起動

# systemctl restart apache2

[SlickGrid]行の移動 (Slick.RowMoveManagerの組み込み)

SlickGridでセルのドラッグ&ドロップで行を移動できるようにするにはslick.rowmovemanager機能を組み込むことで実現できる。次のような手順を踏むことになる。
1. slick.rowselectionmodel.js, slick.rowmovemanager.js を読み込むようにする。
2. ドラッグできるようにするセルのカラム・オプション(Column option)
        behavior“selectAndMove” にする。
3. Slick.RowSelectionModelオブジェクトを生成してgridにセットする。
4. Slick.RowMoveManagerオブジェクトを生成してgridのプラグインとして認識させる。
Slick.RowMoveManagerオブジェクトのメソッドonBeforeMoveRows.subscribe, onMoveRows.subscribe をインプリメントする。
Javascriptコード記述例

<header>
<script src="slick.core.js"></script>
<script src="slick.grid.js"></script>
<script src="slick.rowselectionmodel.js"></script>
<script src="slick.rowmovemanager.js"></script>
</header>
<body>
<script>
  var options = {
    enableCellNavigation: true,
    enableColumnReorder: true
  };

  var grid;
  var columns = [
    {id: "title", name: "Title", field: "title", behavior: "selectAndMove" },
    {id: "param1", name: "Data1", field: "param1"},
    {id: "param2", name: "Data2", field: "param2"}
  ];
  var data = {
    {title: "Item1", param1: "123", param2: "abc"},
    {title: "Item2", param1: "345", param2: "def"},
    {title: "Item3", param1: "678", param2: "ghi"},
    {title: "Item4", param1: "098", param2: "jkl"},
  };

  $(function () {
    grid = new Slick.Grid("#myGrid", data, columns, options);

    grid.setSelectionModel(new Slick.RowSelectionModel());

    var moveRowsPlugin = new Slick.RowMoveManager({
      cancelEditOnDrag: true
    });

    moveRowsPlugin.onBeforeMoveRows.subscribe(function (e, data) {
      for (var i = 0; i < data.rows.length; i++) {
        // no point in moving before or after itself
        if (data.rows[i] == data.insertBefore || data.rows[i] == data.insertBefore - 1) {
          e.stopPropagation();
          return false;
        }
      }
      return true;
    });

    moveRowsPlugin.onMoveRows.subscribe(function (e, args) {
      var extractedRows = [], left, right;
      var rows = args.rows;
      var insertBefore = args.insertBefore;
      left = data.slice(0, insertBefore);
      right = data.slice(insertBefore, data.length);

      rows.sort(function(a,b) { return a-b; });

      for (var i = 0; i < rows.length; i++) {
        extractedRows.push(data[rows[i]]);
      }

      rows.reverse();

      for (var i = 0; i < rows.length; i++) {
        var row = rows[i];
        if (row < insertBefore) {
          left.splice(row, 1);
        } else {
          right.splice(row - insertBefore, 1);
        }
      }

      data = left.concat(extractedRows.concat(right));

      var selectedRows = [];
      for (var i = 0; i < rows.length; i++)
        selectedRows.push(left.length + i);

      grid.resetActiveCell();
      grid.setData(data);
      grid.setSelectedRows(selectedRows);
      grid.render();
    });

    grid.registerPlugin(moveRowsPlugin);
  });
</script>
      <div id="myGrid" style="width:100%;height:500px;"></div>
</body>

[SlickGrid] カラムの移動設定(グリッド・オプション: enableColumnReorder )

ヘッダー行のカラムを(左)ボタンでドラッグ&ドロップしてカラムを入れ替えできるようにするには、グリッド・オプション(grid option)の設定を行えばよい。

grid optionの enableColumnReorder true にするとカラムの入れ替えが可能になる。
falseにすると(左)ボタンのドラッグ自体ができなくなり、カラムの入れ替えはできない。

Javascriptコード記述例
1. グリッド生成時に一括オプションとして指定する場合

<body>
<script>
  var options = {
    enableCellNavigation: true,
    enableColumnReorder: true
  };

  var grid;
  var columns = [
    {id: "title", name: "Title", field: "title"},
    {id: "param1", name: "Data1", field: "param1"},
    {id: "param2", name: "Data2", field: "param2"}
  ];
  var data = {
    {title: "Item1", param1: "123", param2: "abc"},
    {title: "Item2", param1: "345", param2: "def"},
    {title: "Item3", param1: "678", param2: "ghi"},
    {title: "Item4", param1: "098", param2: "jkl"},
  };

  $(function () {
    grid = new Slick.Grid("#myGrid", data, columns, options);
  });

</script>
      <div id="myGrid" style="width:100%;height:500px;"></div>
</body>

2. グリッド生成後、あとからオプションを変更する場合

  var grid;

  function enableColumnsReorder() {
        var options = grid.getOptions();
        options["enableColumnReorder"] = true;
        grid.setOptions(options);
  }

(javascript内で、カラム定義の配列を入れ替えて、gridのrender()を世呼び出せば、もちろん入れ替えはできます。)