Joomla!を3.2.1にアップしてから?phpmailerの様子か変なので、少し調べてみると以下のページがあったので、覚え書き。

http://docs.joomla.org/What_version_of_Joomla!_should_you_use%3F

Chatterの投稿を集めてgoogleのspreadsheetに集計する。

、といってもChatterは無料ユーザーなのでChatter APIの利用ができないため、Chatterが翌日にメール送信する前日の投稿まとめをgmailから抜き出してリスト化すると言った、ベタなやり方です。

function getMail(){

  var ss = SpreadsheetApp.openById(SpreadsheetApp.getActiveSpreadsheet().getId());
  var mySheet = ss.getSheetByName("Sheet1"); 
  var thds = GmailApp.getInboxThreads(1,30);
  var today = new Date();
  var row = 2;

  for(var n in thds){
    var thd = thds[n];
    var msgs = thd.getMessages();

        for(m in msgs){
          var msg = msgs[m];
          var from = msg.getFrom();
          var to = msg.getTo();
          var date = msg.getDate();
          var subject = msg.getSubject();
          var body = msg.getBody();               

          if(subject.indexOf("[更新情報]")!=-1 && date.getDay() == today.getDay()){ //今日だけ抽出
          //if(subject.indexOf("[更新情報]")!=-1){
            var sepBody = body.split("<tr>");
            var messageCount = sepBody.length; //分割配列数を取得
            mySheet.insertRowsBefore(2, messageCount);//メッセージ数分の行を先頭に挿入         
            mySheet.getRange(row,1).setValue(date);
             
              for(var i = 1 ;i < messageCount ; i++){
                var result = sepBody[i].replace(/<("[^"]*"|'[^']*'|[^'">])*>|[\n\r]/g,'');//タグ削除
                result = result.replace(/コメント/g,'');
                result = result.replace(/\D曜日,/g,' ');
                result = result.replace(/●/g," ●").replace(/■/g," ■").replace(/・/g," ・").replace(/\\\\/g," \\\\").replace(/※/g," ※");

                //人名処理
                //var name= "/|AAAA|BBBB|CCCC/g";
                var reName = result.match(|AAAA|BBBB|CCCC/g);
                mySheet.getRange(row,1).setValue(reName);
              //result = result.replace(name,'');
              result = result.replace(|AAAA|BBBB|CCCC/g,'');
              result = result.replace(/ さんがいいね! と言っています。/,'いいね! と言っています。');
                
                //時間処理
                var reDaate = result.match(/\d{4}\/\d{2}\/\d{2}\s\d{1,2}:\d{1,2}/g);
                result = result.replace(/\d{4}\/\d{2}\/\d{2}\s\d{1,2}:\d{1,2}/g,'');
                mySheet.getRange(row,2).setValue(reDaate);
              
                var cutPoint = result.indexOf('このメールは',0);
                if(cutPoint != -1){
                  result = result.substr(0,cutPoint);
               }              
                mySheet.getRange(row,3).setValue(result);
                row++;
              }              
              row++;
           }  
          Utilities.sleep(1000) ;
        }
    }
  }

 

 

最近タスク管理にgoogleDriveを利用している。
今まで、MicrosoftProjectなども試したがあまり実用的とも言えなかった。

昨今の脱ウォーターフロー開発モデルからアジャイル開発・・・などでは無いが、
所詮現場は何時でも混乱している。
必要な手法はプロジェクトの計画立案、実施、検証であるが、作業実施時に混乱したタスクとスケジュールの追跡は大変だ。
せめて、連絡だけはスムーズに行いたい。

実際googleDriveは共有環境構築も最も効率良く出来ている。
Google Apps Scriptを利用すれば、全てのgoogleサービスを自由に(効率良く)?操ることが可能だ。
プログラマでは無い私には無理だが、今回少しでもスタッフの手助けになればと、googleSpreadsheetに構築しているタスクシートから当日タスクを抜き出して、別シートにコピーし、メール送信するプログラムを組んでみた。

ループ内で直接getRangeなどしているために非常に処理は遅いが、夜中にトリガーを使って動かせばよいので、ここまで。

先ずは自身のために覚書です。

PS.しかし、googleはやってくれる。Javascriptをここまでフィーチャーしてくれるとは。
こんなに使えるサーバーサイドJavascript、勉強するなら今でしょ。

function copyTodaysTask(){ 

/*sheet1の期限に本日があればsheet2へコピーする。*/

  var sheetName ="シート名";
  var colrow = "A:H";
  var outputSheet1 = "today";
  var row=1;//行詰めでセットするためのカウンタ
  var limitDay;

  var deadlineCol = 7;  //終了日のある列
  var today =  Math.floor(new Date().getTime()/1000/24/60/60)-1;

  var resource =5;
  var exceptions =["除外1","除外2"];

  var ss = SpreadsheetApp.openById(SpreadsheetApp.getActiveSpreadsheet().getId());
  var sheet1 = ss.getSheetByName(sheetName); 
  var sheet2 = ss.getSheetByName(outputSheet1);

  var lastRow =sheet1.getLastRow();
  var resourceCheck ;

  //clear sheet
  sheet2.clear();

  //最終行までループ

  for (var i=1 ; i <= lastRow; i++){
    limitDay=Math.floor(sheet1.getRange(i,deadlineCol).getValue()/1000/24/60/60);
    esourceCheck=sheet1.getRange(i,resource).getValue();    

    if (limitDay == today){      

      if (exceptions.indexOf(resourceCheck)== -1 ){
        for (var ii = 1; ii <= 8; ii++){
          sheet2.getRange(row,ii).setValue(sheet1.getRange(i,ii).getValue());
        }
      }else{
        row--;
      }
      row++;   
    }

  }

}

 

 

function mail(){

  var outputSheet1 = "today";
  var ss = SpreadsheetApp.openById(SpreadsheetApp.getActiveSpreadsheet().getId());
  var sheet2 = ss.getSheetByName(outputSheet1);
  var cell = sheet2.getRange('A1');
  var today = Utilities.formatDate(new Date(), "Asia/Tokyo", "yyyy/MM/dd");

  // offset計算のため値を1減算
  var ticketName = 2;
  var period = 6;
  var worker = 4;

  //送信先
  var mailAdress = "This email address is being protected from spambots. You need JavaScript enabled to view it.";  // カンマ区切りで複数アドレス指定可

  var message="------------------------------------------------\n";

  if (lastRow==0){
    message+="本日の作業はありません。\n"
  }else{
    for (var i=1 ; i <= lastRow; i++){
      message+=cell.offset(i-1,0).getValue()+":"+
         "   作業者:"+cell.offset(i-1,worker).getValue()+  
        "   チケット名:"+cell.offset(i-1,ticketName).getValue()+"\n";
    }   
  }

  message+="------------------------------------------------\n";
  message+="Have a nice day!\n"; 

  MailApp.sendEmail(mailAdress, "件名", message); 

}

 

疑問点

  1. 以下シリアル値の末値が1日のうちで変わる(変わる)のは何故か?
    var today =  Math.floor(new Date().getTime()/1000/24/60/60); 
  2. googleSpreadsheet filterの操作
    SpreadsheetのフィルタをScriptでON/OFFするには?
  3. google apps scriptはタイムアウトがあるので要処理時間短縮

参考サイト


 

上記の方法ではループ内の処理が多く、終了までに時間がかかっていたため、シートデータをすべて配列に読み込む処理に変更。

多分1/100以下の処理時間になったはず・・・。

開始と終了を同時に別の1シートに書き出し、メールで送る処理に変更。

 
function getStartEnd() {

var masterSheet ="スケジュールマスタ";
var outputSheet2 = "本日開始&終了タスク";
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName(masterSheet);
var sheet2 = ss.getSheetByName(outputSheet2);
var lastRow =sheet.getLastRow();
var today = Math.floor(new Date().getTime()/1000/24/60/60)-1;
var exceptions =["除外1","除外2"];
var limitDay;
var row=1;//行詰めでセットするためのカウンタ


// 配列に全データ
var Values= sheet.getDataRange().getValues();

//clear sheet
sheet2.clear();


sheet2.getRange(row++,3).setValue("本日開始タスク").setBackgroundColor("#CEF");

//本日開始タスク抽出
for (var i=1 ; i <= lastRow; i++){

limitDay=Math.floor(Values[i-1][6]/1000/24/60/60);

if ((limitDay == today) && (exceptions.indexOf(Values[i-1][4])== -1 )){
for (var ii = 1; ii <= 8; ii++){
sheet2.getRange(row,ii).setValue(Values[i-1][ii-1]);
}
}else{
row--;
}
row++; 

} 

//行開け
row++;


sheet2.getRange(row++,3).setValue("本日終了タスク").setBackgroundColor("#CEF");

//本日終了タスク抽出
for (var i=1 ; i <= lastRow; i++){

limitDay=Math.floor(Values[i-1][5]/1000/24/60/60);

if ((limitDay == today) && (exceptions.indexOf(Values[i-1][4])== -1 )){
for (var ii = 1; ii <= 8; ii++){
sheet2.getRange(row,ii).setValue(Values[i-1][ii-1]);
}
}else{
row--;
}
row++; 

}

}

 

 

それに伴ってメール送信も少し変更

 

function mail2(){


var outputSheet1 = "本日開始&終了タスク"; 

var ss = SpreadsheetApp.openById(SpreadsheetApp.getActiveSpreadsheet().getId());
var sheet1 = ss.getSheetByName(outputSheet1);
var today = Utilities.formatDate(new Date(), "Asia/Tokyo", "yyyy/MM/dd");

// offset計算のため値を1減算
var ticketName = 2;
var worker = 4;

var mailAdress = "This email address is being protected from spambots. You need JavaScript enabled to view it."; //送信先
var lastRow1 =sheet1.getLastRow();

var Values= sheet1.getDataRange().getValues();

var message="お疲れ様です。本日予定のタスクリストを配信します。\n\n";

if (lastRow1==0){
message+="本日の作業はありません。\n"
}else{
for (var i=1 ; i <= lastRow1; i++){
if(Values[i-1][0] != ""){
message+=Values[i-1][0]+":"+" 作業者:"+Values[i-1][worker]+" チケット名:"+Values[i-1][ticketName]+"\n";
}else if(Values[i-1][2] == "本日開始タスク"){
 message+="● 以下のリストは"+today+" 開始タスクです。\n";
message+="------------------------------------------------\n";
}else if(Values[i-1][2] == "本日終了タスク"){
 message+="● 以下のリストは"+today+" 終了タスクです。\n";
message+="------------------------------------------------\n";
}else{
 message+="\n";
}
}
i++;
}

message+="------------------------------------------------\n";
message+="\n";
message+="Have a nice day!\n";

MailApp.sendEmail(mailAdress, "【" +today+ "】予定(開始&終了)タスク", message);

}

 

ちょっとJoomla!の覚書。
itemidを判断してCSSを読み分けする。これって良く使うくせに直ぐ忘れて作り直す。。。 

<?php

$itemA = array(101,116,118,139,140);
$itemB = array(103,117,124,125,136,137,138,141);
$app = JFactory::getApplication();
$itemid   = $app->input->getCmd('Itemid', '');

if (in_array($itemid, $itemA))  {
//style A
echo '<link rel="stylesheet" href="/css/diff_a.css" type="text/css" charset="utf-8" />' ;
}elseif(in_array($itemid, $itemB)){
//style B
echo '<link rel="stylesheet" href="/css/diff_b.css" type="text/css" charset="utf-8" />' ;
}else{
//style C
echo '<link rel="stylesheet" href="/css/diff_c.css" type="text/css" charset="utf-8" />' ;
}

?>

 

 

jQuery を使ったマウスオーバーエフェクトのリンク集へのリンク!

40 Top Free jQuery Mouseover Effect Tutorials

久々にJoomla3.1.1インストールで躓いたので覚書。

Joomla!3.1.1をファーストサーバーにインストール! かの有名なファーストサーバーである。
以前から何度が仕事の関係上、使用経験はあったが、Joomla!をインストールしたことは無かった。。

そこで今回、始めてインストールして手間取ったところを一先ず覚書。
今後何かの情報の糧になればと期待をこめて。

phpの動作モード

Joomla!インストールの環境調整のためにphpの設定を変える。php.iniは許可されていないので、.htaccessの設置を試みるが上手く行かない。Internal Server Errortが発生するのだ。

調べてみると、

htaccessでサーバの挙動を制御することは可能です。 
「.htaccess」での設定変更は、PHP(DSO版) でのみ有効です。

とあった。
初期設定はCGI版なので、設定変更が必要とのこと。

データベース

、、おぉぉいっ! MySQL のバージョンが 5.0じゃんかっ!!  終った。。。

事後報告-- ファーストサーバーの使用は諦めて、さくらに変更しました。。

 

I've got a latest version!

ついに手に入れたARtRage4!

バージョンアップなので価格は$24ほど。

現在最もアートスピリッツ溢れるドローイングソフトをこの価格で手に入るのだから素晴らしい。

前のバージョンでは水彩ブラシが加えられたが、今回のARTRage4の水彩ブラシはさらに進化した。

正しく言えば、何とか使える水彩ブラシへと進化したのである。

 

ArtRageカテゴリには他の記事もあります。

 

ちょっとメモ書き。

phpBBのアップデートが必要になって、3.0.5を3.0.11にアップデート。

アップデートのインストールパッケージをダウンロードしてアップロードを始めたが、データベースチェックの段階で、『データベースの種類 :: mysql4』と出て、エラーでストップ。。

おぃおぃ、また一日がつぶれるのかと思ってしまった。

多分以前にMySQLのDBを4から5にバージョンアップしたが、phpBBの3.0.5から3.0.11のアップデータではMySQL4から5への移行が考慮されていないか?

良く分からないが、installディレクトリ内にdatabase_update.phpがあったので、MySQL4の判断してそうなところを評価しないように無理やり変更。

以下のメッセージが出たが、『この失敗はおそらく心配するほどのことではありません。アップデートはうまくいくでしょう。』とのことなので、そのまま続行。

差分ファイルの確認の後、phpBBはめでたく3.0.11になりました。はず。。

 

データベースを最新安定版に更新しています

 データベースの種類 :: mysql4

アップデート前のバージョン :: 3.0.5
アップデート後のバージョン :: 3.0.11

データベーススキーマを更新中

 進行状況 :: . . . . . . . . . . . . . . . . . . . . . . . 完了

結果 :: クエリの実行に失敗しました。下に表示されているのは実行しようとしたクエリとそのエラーです。

  • エラー :: BLOB/TEXT column 'post_username' used in key specification without a key length
    SQL :: ALTER TABLE phpbb_posts ADD INDEX post_username(post_username)

この失敗はおそらく心配するほどのことではありません。アップデートはうまくいくでしょう。この失敗に関して理解したいなら公式サポートフォーラムで質問してかまいません。公式サポートフォーラムでアドバイスを得る方法に関しては README をご覧ください。

データを更新中

 進行状況 :: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 完了

結果 :: エラーなし

バージョンの更新とデータベースの最適化中

 進行状況 :: . . 完了

結果 :: エラーなし

 アップデートが完了しました

 データベースアップデートに成功しました。次のアップデートプロセスへ移行してください。


First of all,I found awesome app. It was JUpgrade.
It can migrate site from 1.5 to 2.6 only one click!
But jUpgrade does not start!
No, It started, but..Eventually, It stoped at message "Checking and cleaning...". 

My journey continued.

PS.

I got a following error message when turn on two debug buttons.

401: jupgrade_categories table not exist

http://wiki.redcomponent.com/index.php?title=jUpgrade:Troubleshooting

"401: jupgrade_categories table not exist"
"402: jupgrade_menus table not exist"
"403: jupgrade_modules table not exist"
"404: jupgrade_steps table not exist"

When jUpgrade gets installed, one of the things it does is create tables in the Joomla! 1.5 database that help move the migration through each step. This includes tables for:

  • converting sections into categories for Joomla! 2.5's category-only structure
  • converting menu and menu item references to accommodate 2.5's new menu ID organization
  • converting module and parameter references to accommodate 2.5's new module ID organization
  • checking that a step in the migration process has been completed before moving on to the next one

If these tables have not been created, jUpgrade cannot proceed with the migration. To fix this, simply uninstall and reinstall jUpgrade, and the script that makes the tables should run and resolve the issue. (Obviously to create these tables the administrator must have the relevant permissions, but if the site is on a shared host then the server host administrator should be contacted for further assistance.)

 

Kindleをはじめて使用したのは2年以上前のことだ。

その頃、第一次電子書籍ブームが舞い起こり日本も電子書籍元年と呼ばれた。
しかし、実際には日本国内のマーケットや既存の書籍流通が対応できず不発に終った。
米国は確実に離陸を果たしAmazonを始めとする幾つかの先行企業の力もあって、そのマーケットは順調に拡大している。

日本国内はと言えば、本当の意味での電子書籍元年は2012年の昨年である。
楽天がKoboをの力を借りて大々的に電子書籍サービスを始めた。
タイトル数に嘘があるとか、話はさて置いといて、新たなビジネスマーケットがようやく離陸を果たしたことも事実である。
楽天には遅れを取ったが、電子書籍販売で最も長いノウハウを持つAmazonが国内サービスを始めたのも2012年である。

そこで電子書籍リーダー(Kindle)を継続的に使っていて気が付いた事をニ三。

  • その昔Macintoshに感じたワクワク感を感じる数少ないデバイスだ。(今のApple製品には感じない)
  • タブレットよりも不便なのに、メールチェックもやってしまう
  • タブレットよりも不便なのに、ニュースチェックもやってしまう
  • タブレットの使用頻度が極端に減った
  • タブレットの理想の形が見えた(ような気がする)
  • 若干重い
  • 電子ペーパーはやはり近未来デバイスだ
  • 紙の本を読まなくなる → 読みたくなくなる
  • Kindleストアには本が少なく、それに高い
  • 本は少ないが、少ない中から本を選んで購入する傾向にある
  • 読書時間が増えた
  • 一度読んだ本を読み返し易い
  • デバイスが安いので無造作に扱える
  • 紙の本よりも相対的に利便性が高い
  • しおり機能とインターフェイスのカスタマイズ性は高めて欲しい
  • 就寝時に暗闇で読書ができる(これはもしかすれば革命的かもしれない)
  • 壁紙を変えたい(カレンダーとか時計とか電卓とか・・)
  • 色バリが欲しい(わが家には3台あってややこしい)
  • 本の実態は情報なので紙の必要性が無いことを再確認

などなどです。
継続使用してみます。^^

知らない間にJoomla!3.0.2がリリースされていた。
管理画面にある更新検出が上手く働いていない様子だ。
相変わらず『 Joomla!は最新です』表示が現れたままだが、意図的にリポジトリへの対応を止めているのかも知れない。

そうそう、何故Joomla!のアップデートに気が付いたかと言えば、昨年より引き続きJoomla!1.5ベースのサイトをアップグレードして行っているのだ。
以外と1.5ベースのサイトは多く、手間の掛かる詐欺要である。
手間だけの問題ならば、それ程気にならないが、データベースの構造も違っている1.5と3.0ではうかつな詐欺要はできない。
新調に移行手順を確認しながに進める他無いのだ。

ちなみにJoomla!のアップグレード情報はこちらのページでGET可能!