ブログ

割とコンピュータよりの情報をお届けします。

2019/10

Basercmsのアップデート後 ログイン画面が表示されなくなった

今日の朝Bsercmsをアップデートした後,管理画面が表示されないことに気が付いた.厳密には表示はされているが,入力する項目がなにも表示されない.

小一時間悩んでしまったが,Androidスマートフォンからはログインできることを確認したことで一気に話が進んだ.
ChromeのデベロッパーツールでMore toolsのNetwork conditionsを表示して一度Disable cacheを選択してから,再読み込みすると普通の状態に戻った.
今回は,サーバ側の問題ではなくてクライアント側の問題だったようだ.

まったく,余計なところで悩んでしまった.

≫ 続きを読む

2019/10/27 日記   TakeMe

Windows Embedded でのMessageBoxの扱いの注意

Windows Embedded Standard向けのアプリを開発していたら,.NETで64bitでも32bitでもどちらでもアプリが動かしるようにしていたところ,32bitでの動作では普通にMessageBoxが開くのに...

組み込み用のWindowsではWindows標準のMessageBoxの動作を変更することができる.すべてOKを応答させてダイアログを表示させないようにするのだ.

.NET Frameworkで開発したアプリで特に64bitで動かしたときにできるらしい.
この機能は開発時にMessageBoxを出させておいて,展開時にはMessageBoxを抑制するというという使い方になる.
知らなかったのでダイアログが出ない理由を一週間かけて探した.

≫ 続きを読む

2019/10/19 コンピュータ   TakeMe

WinPython 3.7.4はVSCode付もあるVol. 2

WinPython 3.7.4はVSCode付きもあるのでUSBメモリに搭載して環境を移動することも可能である.
ということで調子に乗ってPythonの開発環境をSDカードに設けていたら,2週間でデータが吹っ飛んだ.

VSCodeを使うPythonの開発環境は,安全な取り外しができない(ことが多い).
最初は問題ないと思っていたが,

使用開始2週間たつと異常に気付く.新しいフォルダを作ると作ったつもりのないファイルが現れる.最初は新種のウイルスかと思ったが,どうもFATのファイルを管理している領域がまず破壊されたようだ.(安全な取り外しができないときに起きることがある典型的な症状)

新品SDカード32GBを失った.

悔しいのでEaseUS Data Recovery Wizard Freeを使ってデータだけでも復旧を試みるが,WinPythonのたくさんのファイルが邪魔をして一回目はうまくいかなかった(復旧ファイルを間違えた).この時点でFree版の制限容量を使い切ってしまった.
まだ悔しいので,EaseUS Data Recovery Wizard Professionalを購入してどうしても欲しいものだけ復旧(結局4時間かかった).(9割以上復旧に成功)

間違って消したファイルの復旧系はフリーソフトでもできることがあるが,読み取り可能な状態でファイルシステムが消失したSDカードはこのソフトがいいらしい.(このソフトでも認識さえしなくなったSDカードの場合には無理)

≫ 続きを読む

2019/10/16 コンピュータ   TakeMe

どこでもセンサーを購入

プラネックスコミュニケーションズのどこでもセンサーを購入した.
どこでも環境センサーとどこでも人感センサーをひとつづつ.

まず,どこでもセンサーはセンサーの取得した値をクラウドに上げている.しかも利用料は今のところ無料である。クラウドに上げてチャートを見られるサービスはほかの商品でも見られるが,この商品の違うところはAPIを使うと自分のアプリケーションでデータを使用できること.

しかし,人感センサーは使い物にならないかな(と思う).人がいないのに数百カウントしてしまう.感度の問題と思っていたが感度を下げても改善されない.

環境センサーの方はいったん接続が途切れた時にすぐに復帰を試みるのだが,その際に温度計の取得する値が上昇する.しばらくすると値が落ちていくことからすると,自分の制御処理系の発熱も感じているとみえる。

気を付けないと使えないかも.しかもAPIもレスポンスに503ばかりがかえってくる.これは,改善を目指しているようだが作りが荒い。といっても,クラウドサービスを無料にしている関係でやむを得ないのか

var request = require('request');
var fs = require('fs')
var mongodb = require("mongodb");
var client = mongodb.MongoClient;
var url = "mongodb://username:password@localhost:27017/dbname";
var dbName = 'dbname';
var colName = 'dokodemosensors';

var getDatum = function(uri, mac, token) {
  var options = {
    url: uri,
    method: 'GET'
  }

  //リクエスト送信
  request(options, function (error, response, body) {
    //コールバックで色々な処理
    console.log(body);
    console.log(mac);
    
    var json = null;
    try {
      if (response.statusCode == 200) {
        json = JSON.parse(body);
        writeDataSafe(json, mac);
      } else {
      }
    }
    catch (e)
    {
      console.log('error');
    }

  });
};

var CheckIn = function(mac, token) {
  client.connect(url, (error, db) => {
    var col = db.db(dbName).collection(colName);
    col.find({'mac': mac}, { sort: { date: -1 }, skip: 0, limit: 1 })
      .toArray()
      .then((docs) => {
        var date = new Date();
        date.setDate(date.getDate() - 31);
        if (docs.length > 0) {
          date = docs[0].date;
        }
        date.setHours(date.getHours() - 9);
        dateto = new Date(date)
        dateto.setDate(dateto.getDate() + 31);
        var dateStr = date.getFullYear() + "-"
          + ('0' + (date.getMonth() + 1)).slice(-2) + "-"
          + ('0' + date.getDate()).slice(-2) + " "
          + ('0' + date.getHours()).slice(-2) + ":" 
          + ('0' + date.getMinutes()).slice(-2) + ":" 
          + ('0' + date.getSeconds()).slice(-2);
        var dateStrTo = dateto.getFullYear() + "-"
          + ('0' + (dateto.getMonth() + 1)).slice(-2) + "-"
          + ('0' + dateto.getDate()).slice(-2) + " "
          + ('0' + dateto.getHours()).slice(-2) + ":" 
          + ('0' + dateto.getMinutes()).slice(-2) + ":" 
          + ('0' + dateto.getSeconds()).slice(-2);
          
        var uri = 'api' + '?type="WS-USB01-THP"&mac="' + mac + '"&from="'
          + dateStr
          + '"&to="'
          + dateStrTo
          + '"&token="' + token + '"'
        console.log(uri);
        getDatum(uri, mac, token)
      })
      .catch((err) => {
        console.log(err);
        console.log('error');
      })
      .then(() => {
        db.close();
      });
  });
}

var writeDataSafe = function(json, mac) {
  for (var i = 0; i < json.length; i++) {
    var dt = new Date(Date.parse(json[i][0] + ' GMT'));
    json[i][0] = dt;
    json[i][1] = parseFloat(json[i][1])
    json[i][2] = parseFloat(json[i][2])
    json[i][3] = parseFloat(json[i][3])
  }
  var jsons = [];
  for (var i = 0; i < json.length; i++) {
    item = {'date': json[i][0], 'temperature': json[i][1], 'humidity': json[i][2], 'atomospheric pressure': json[i][3], 'mac': mac};
    jsons.push(item);
  }
  
  client.connect(url, (error, db) => {
    var col = db.db(dbName).collection(colName);
    if (jsons.length > 0) {
      
      for (var i = 0; i < jsons.length; i++) {
        col.update({"date": jsons[i].date, 'mac': jsons[i].mac},
          jsons[i],
          {'upsert': true}, function(error, result) {
          this.db.close();
        }.bind({'db': db}));
      }
      setTimeout(function() {
        this.db.close();
        console.log('timeout');
      }.bind({'db': db}), 30000);
    }
  });
}

CheckIn('mac', 'token')

setInterval(function () {
  CheckIn('mac', 'token')
}, 210000);

≫ 続きを読む

2019/10/15 コンピュータ   TakeMe