最新の投稿

postgreからmongodbへデータ移動
カテゴリー:未分類 作成日:2015年2月3日21:53

目的

f zugのbbsをmeteorで使う為にデータを移したい

方法

postgresql のデータを cvs形式で出力してmeteorで呼び込む

COPY テーブル名 TO '/tmp/output.csv' DELIMITER ','

この方法でCVSデータが取れそうだ。

実際の処理内容

database名 : chatbbs

table名 : chatmaintb、 chatsubtb

$> sudo su

#>su postgres

$>psql chatbbs

chatbbs=# COPY  chatmaintb TO '/tmp/chatmaintb.csv' DELIMITER ','

もう一個

chatbbs=# COPY  chatsubtb TO '/tmp/chatsubtb.csv' DELIMITER ','

これでCVSデータが取れた。

このデータを読み込んで、 split('\n')し、さらに split('\r\n')してmonogodbへインサートすれば完了するはず。

やってみる まず client側

bbsinport.html

<template name="bbs_inport">
    chatmaintb.cvsを選択します<input type="file" name="files[]" id="bbsmain_read" />
    chatsubtb.csvを選択します<input type="file" name="files[]" id="bbssub_read"  />
    {{> chatmain}}
    {{> chatsub}}
</template>

<!-- ここから保存が成功すれば即座に表示される為 表示して確認する -->

<template name="chatmain">
    <h3>Chatmaintb 10件分</h3>
    <ul>
    {{#each maindatas}}
      <li>mid: {{mid}} <br />
          maintitle: {{maintitle}} <br />
          subtitle: {{subtitle}}
      </li>
    {{/each}}
    </ul>
</template>

<template name="chatsub">
    <h3>Chatsubtb 10件分</h3>
    <ul>
        {{#each subdatas}}
          <li>mid: {{mid}} cid: {{ cid}}<br />
              date: {{createAt}} <br />
              name: {{name}}<br />
              email: {{email}}<br />
              comment: {{comment}} <br />
              delchk: {{delchk}}
          </li>
        {{/each}}
    </ul>
</template>

bbsinport.js

MainBbs = new Meteor.Collection('bbsmain');
CommentBbs = new Meteor.Collection('bbscomment');

Meteor.subscribe('allMainBbs');
Meteor.subscribe('allCommentBbs');


Template.bbs_inport.events({
    'change #bbsmain_read': function(event){
        var files = event.target.files;
        for (var i= 0, f; f = files[i]; i++ ){
            if(f.type.match('text.*')) {
                var reader = new FileReader();
                reader.onload = function(rfile) {
                    //var filesize = rfile.size;
                    var textfiles = reader.result;
                    Meteor.call('bbsmaintb_inport',textfiles,
                      function(error, result) {
                        if(error){
                            alert('bbsmaintbのインポートに失敗しました');
                        }
                      }
                    );
                }
                reader.readAsText(f, 'utf-8');

            }
        }
    },
    'change #bbssub_read': function(event){
        var files = event.target.files;
        for (var i= 0, f; f = files[i]; i++ ){
            if(f.type.match('text.*')) {
                var reader = new FileReader();
                reader.onload = function(rfile) {
                    //var filesize= rfile.size;
                    var textfiles = reader.result;
                    Meteor.call('bbssubtb_inport',textfiles,
                        function(error, result) {
                            if(error){
                                alert('bbssubtbのインポートに失敗しました');
                            }
                        }
                    );
                }
                reader.readAsText(f, 'utf-8');

            }
        }
    }

});

Template.chatmain.helpers({
    'maindatas': function(){
        return MainBbs.find({}, {limit: 10});
    }
});

Template.chatsub.helpers({
    'subdatas': function(){
        return CommentBbs.find({},{limit:10});
    }
});

ここから server側

publish.js

Meteor.publish('allMainBbs', function(){
    return MainBbs.find();
});

Meteor.publish('allCommentBbs',function(){
    return CommentBbs.find();
});

server.js

Meteor.methods({
    'bbsmaintb_inport': function(textfiles){
      var mdatas = textfiles.split('\n');

      for(var i=0; i<mdatas.length; i++){
          var dat = mdatas[i].split(',');
          MainBbs.insert({
              mid: dat[0],
              maintitle: dat[1],
              subtitle: dat[2]

          });
      }
    },
    'bbssubtb_inport': function(textfiles){
        CommentBbs.remove({});
        var nam,pas;
        var mdatas = textfiles.split('\n');

        for(var i=0; i<mdatas.length; i++){
            //元々文章に含まれたカンマは(\,)として保存されているようなので
            //split(',')で誤動作するのを防ぐため一旦'_Q_'に置き換える
            var tmdat = mdatas[i].split('\\,').join('_Q_');
            var dat = tmdat.split(',');
            //  _Q_を元に戻す
            dat[5] = dat[5].split('_Q_').join(',');
           //fzugbbs では、passwordを必要に迫られで後から name#passwordで保存していた為これを分離する 
            var pasdat = dat[3].split('#');
            if (pasdat.length === 1){
                nam = dat[3];
                pas = '';
            } else {
                nam = pasdat[0];
                pas = pasdat[1];
            }

            CommentBbs.insert({
                mid: dat[0],
                cid: dat[1],
                createAt: dat[2],
                name: nam,
                pass: pas,
                email: dat[4],
                comment: dat[5],
                delchk: dat[6]
            });
        }

    },
}

bbssubtbのインポートに失敗しました とalertがでたが、、、

データは格納されているようだ。 これでいいのか(オレ) ???


Nodejsのfsを使う
カテゴリー:Meteor 作成日:2015年2月3日21:53

Node.jsで使われているfsを使うには

サーバー側でしか動かないかも?

後で検証したい。

// collectionの宣言
Fsmdfiles = new Meteor.Collection('testdata');

//fsの宣言
var fs = Npm.require('fs');

//カレントディレクトリーの/public/data/から読み取る。
var filePath = process.env.PWD + '/public/data/';
// 読み取った複数のファイル
var file_list = fs.readdirSync(filePath);
for(var i= 0, file; file=file_list[i]; i++){
if(file != null){

      Fsmdfiles.insert({
        cdate: new Date(), // 今の日付
        filename: file,    // ファイルの名前
        textfile: fs.readFileSync(filePath + file, "utf-8") // 読み取ったデータ
      });

  }  
}

html5のFileReaderを使う場合

uploadtext.html

<head>
    <title>uploadtext<title>
<head>
<body>
    <h1>Welcome to Meteor!<h1>

     {{> upload</span}}
<body>

<template name="upload">
      <div>
          < input type="file" name="files[]" id="read_button" >
         {{#each mdtext}}
              <p><textarea id="textarea_id" rows="10" cols="70">{{textfile}}< /textarea><p>
              <p>{{#markdown}} {{textfile}} {{/markdown}}<p>
    // マークダウンを使った。 meteor add markdownでOK
        {{/each}}
    </div>
</template>

uploadtext.js テキストファイルの場合

MdFiles = new Meteor.Collection('mdfiles');


if (Meteor.isClient) {
  Meteor.subscribe('mdtext');

  Template.upload.helpers({
    mdtext: function(){
      return MdFiles.find({}, {sort: {cdate: -1}});
    }
  });

  Template.upload.events({
    'change #read_button': function (event) {
      var files = event.target.files;
      for (var i = 0, f; f = files[i]; i++) {
        if (f.type.match('text.*')) {
          var reader = new FileReader();
          reader.onload = function (efile) {
            var cdate = new Date();
            var filename = efile.name;
            var filesize = efile.size;
            var textfile = reader.result;
            Meteor.call('insertText',
                cdate, filename, filesize, textfile, function (error, result) {
                }
            );
          }
          reader.readAsText(f, 'utf-8');
        }
      }
    }
  });


}

if (Meteor.isServer) {
  Meteor.startup(function () {
    // code to run on server at startup
});

  Meteor.methods({
    insertText: function(cdate,filename,filesize,textfile) {
      return MdFiles.insert({
        cdate: cdate,
        filename: filename,
        filesize: filesize,
        textfile: textfile
      });
    }
  });

  Meteor.publish("mdtext", function () {
    return MdFiles.find({}, {sort: {cdate: -1}});
  });

}

イメージファイルの場合

uploadtext.html の<input type="file" name="files[]" id="read_button" />
を
<input type="file" name="files[]" id="read_button" multiple/>
へmultipleを追加
PhoteImg = new Meteor.Collection('photeimagesTest');

if (Meteor.isClient) {
  // counter starts at 0
  //Session.setDefault("counter", 0);

  Template.photeread.files = function(){
      return PhoteImg.find({},{sort: {cdate: -1}});
  }

  Template.photeinput.events({
      'change #files': function (evt) {
        var files = evt.target.files;
        for (var i=0, f; f=files[i]; i++){
            if (!f.type.match('image.*')) {
                continue;
            }

            var reader = new FileReader();
            reader.onload = (function(theFile){
                return function(e){
                  PhoteImg.insert(
                      { cdate: new Date(),
                        filename: theFile.name,
                        filetype: theFile.type,
                        filesize: theFile.size/1000,
                        filedate: theFile.lastModifiedDate.toLocaleDateString(),
                        fileimage: e.target.result,
                      }
                  )    
                }

            })(f);
            // Read in the image file as a data URL.
            reader.readAsDataURL(f);
        }
    }
  });
}

if (Meteor.isServer) {
    Meteor.startup(function () {
        // code to run on server at startup
    });
} 


meteor-cookieの使い方
カテゴリー:Meteor 作成日:2015年2月3日21:51

簡単にクッキーが使えそう

まずパッケージをインストール
meteor add chuangbo:cookie
ここを読めばほとんど説明はいらないけど、念の為
クッキーをセットするには、

Cookie.set( '_setcookie', 'value');
// Cookie.set('名前', '値');
保存期間を設定するやり方
Cookie.set('_setcookie', 'value', {
  path: '/',        //ホームすべてで有効
  exprires: 365     // 有効期限 一年
});

 

クッキーの読み出し

Cookie.get('_setcookie');
// Cookie.get ('名前');

 

クッキーの削除

Cookie.remove('_setcookie');

 

 


UbuntuServer
カテゴリー:ubuntu 14LTS 作成日:2015年2月3日21:50

UbuntuServer14.04 サーバ変更時の覚書

ubuntuserverインストール後使いにくいので、GUI(xubuntu)を入れる。

        $> sudo apt-get install xubuntu-desktop

gedit,geany,bluefish をインストール

         $> sudo apt-get install gedit geany bluefish

networkのポートを固定へ変更

$> sudo geany /etc/network/interfaces

#auto eth0
#iface eth0 inet dhcp
をコメントアウトし 設定マネージャのネットーワーク接続でIPv4の設定を追加

ufwでセキュリティー強化
$> sudo ufw default deny 最初はポートは全て無効にする。
$> sudo ufw enable ufwを有効にする。
有効にするのは 1。SSH 22番 2。www 80番 3。SSL 443番 $> sudo ufw allow 22/tcp $> sudo ufw allow 80/tcp $> sudo ufw allow 443/tcp 削除するには例えば tcp22 $> sudo ufw delete allow 22/tcp ローカルネットワークからポート22でのSSHアクセスを許可 sudo ufw allow proto tcp from 192.168.1.0/24 to any port 22

 

apache2.4の設定時の変更

<Directory /home/kotti>

# Order deny,allow
# Allow from all
Require all granted
AllowOverride All

</Directory>

  # Order deny,allow
  # Allow from all
は使用できなくなった。
かわりに Require を使う


ユーザアカウント
カテゴリー:Meteor 作成日:2015年2月3日21:49

ユーザアカウント accounts-password accounts-ui は スーパーユーザをサポートできるか調査

ユーザーアカウントを使うには、

$ meteor add accounts-password accounts-ui
hoge.html

{{> loginButtons}}

とすると「Sign in」と表示され

クリックすると


と表示され、Create account をクリックしてユーザを作成するようになっている。
この誰でもユーザを作成できるのが、怖いので権限の種類等が無いか調べてみた。
スーパーユーザのサポートは見つける事はできないかった が、公開前に 上記の Create account でユーザを先に作成し

hoge.js

if (Meteor.isClient) {
 Accounts.config({
     forbidClientAccountCreation: true 
         // trueにするとCreate account が表示されないので、スマートでは無いが目的は達成できる。 
  });
}

 

ps: superuser は Accounts.createUserを使うと可能のようだ

参考サイト: Meteorで非公開ツール用のログインフォームを作る(その4)