最新の投稿
目的
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がでたが、、、
データは格納されているようだ。 これでいいのか(オレ) ???
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 add chuangbo:cookie
ここを読めばほとんど説明はいらないけど、念の為
クッキーをセットするには、
Cookie.set( '_setcookie', 'value');
// Cookie.set('名前', '値');
保存期間を設定するやり方
Cookie.set('_setcookie', 'value', {
path: '/', //ホームすべてで有効
exprires: 365 // 有効期限 一年
});
クッキーの読み出し
Cookie.get('_setcookie');
// Cookie.get ('名前');
クッキーの削除
Cookie.remove('_setcookie');
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 を使う
ユーザアカウント 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)