2015年5月3日 星期日

AngularJS 在HTML一開始的引入問題

開始學習AngularJS 並在網頁上引入ng-app時遇到一個奇怪的問題:

首先建一個indexApp & its controller
var app = angular.module('indexApp', []);
app.controller('IndexController', ['$scope', function($scope){}]);


再來在網頁上使用ng-app並代入所創建的app值:

<html ng-app="indexApp">
  <body ng-controller="IndexController">
  </body>
</html>

>>>>> 無法作用

後來改為:

<html ng-app>
  <body ng-app="indexApp" ng-controller="IndexController">
  </body>
</html>

>>>>> 可以作用


之後再改回去第一個那樣的寫法,卻又可以使用了!!
不知是為何阿....第一次使用不能帶值嗎!?


// end

nodejs_定時排程

NODEJS的定時排程模組: node-schedule

遇到需要在特定時間點執行程式碼時使用:
  EX. 2014/11/07 17:00
或是沒有固定的時間間隔:
  EX. 每月1號(每月天數不一定)
固定時間間隔也可以(雖然也是固定時間間隔但比較重視時間的"點"):
  EX. 每個星期日下午5點

>> node-schedule 模組


每隔一段時間執行程式碼時使用:
  EX. 每隔5分鐘

>> setInterval()


setInterval()可以做的事情使用排程也可以做到,如果時間間隔較大或是需要精準的時間"點"那就會排程來做。



node-schedule 模組 (於 npm頁面)

Docs摘要:

  • 安裝方式 (Installation)
    • $npm install node-schedule
    • 並在.js檔內引入: var schedule = require('node-schedule');

  • 使用類Corn語法來排程工作 (Cron style Scheduling)
    • Cron
      • Cron Job 指的是定時去做的事情;例如每月1號凌晨都備份電腦;名稱由來是Linux裡的用來定時排程的工具名稱
    • 新增一個node-schedule
      • var job = schedule.scheduleJob('42 * * * *', function(){ //do job here });
      • 字串代表意思為每42分鐘;
      • 格式: [分鐘] [小時] [日期] [月份] [星期幾] [年(可不填)]

      • 使用Date來排程工作 (Date based Scheduling)
        • 建立Date物件
          • var date = new Date(2015, 5, 4, 22, 0, 0);
          • var job = schedule.scheduleJob(date, function(){ // job content here });
        • 刪除排程
          • job.cancel();
        • 在排程指定的時間使用現在的資料
          • var x = 'Tada!';
          • var job = schedule.scheduleJob(date, function(y){ console.log(y); }).bind(null, x);
          • x = 'Changing data';
          • 在排程事件發生時,會是印出 'Tada!'

      • 建立循環規則來排程 (Recurrence Rule Scheduling)
        • 建立規則
          • var rule = new schedule.RecurrenceRule();
          • // 設定 rule 物件屬性來指定時間點
          • rule.hour = 17; // 下午5點
          • rule.minute = 0; // 下午5點0分
          • // 也可以指定範圍
          • rule.dayOfWeek = [0, new schedule.Range(4, 6)]; // 每星期日.四~六的下午5點0分
          • var job = new schedule.scheduleJob(rule, function(){ // do jobs here });
        • 上述建立rule物件也可以直接用物件寫法取代
          • var job = new schedule.scheduleJob({hour: 17, minute: 0}, function(){ // do jobs here });


      *可以將建立的工作存在一個物件裡面,若是要刪除則直接刪除物件或指定為null即可取消排程工作。

      // end

      2015年1月8日 星期四

      MS SQL server 筆記#4 SQL-ADD IDENTITY

      / *
        * ADD AN IDENTITY TO EXISTING COLUMN
        * 在現有的欄位加入IDENTITY
        */

      無法透過ALTER COLUMN直接加入IDENTITY。
      解決方法:
      1. DROP TABLE 重新建立。
      2. DROP COLUMN 重新加入COLUMN。

      -- 方法1:
      DROP TABLE name
      GO
      CREATE TABLE name(
        [ID] [int] IDENTITY(1,1) NOT NULL,
        [name] [nvarchar](max) NULL
      )
      GO


      -- 方法2:
      ALTER TABLE name ADD ID_NEW [int] IDENTITY(1,1)
      GO
      ALTER TABLE name DROP COLUMN ID
      GO




      // end

      MS SQL server 筆記#3 SQL-ALTER CONSTRAINT

      / *
        * ALTER TABLE AND ADD A CONSTRAINT
        * 改變資料表結構:
        * * 改變欄位資料類型
        * * 加入限制(CONSTRAINT)

      */


      -- 變更一個欄位(COLUMN)的資料類型為 datetime

      ALTER TABLE [history_data] ALTER COLUMN [create_date] [datetime]

      -- 加入限制(CONSTRAINT)名為col_a_def

      -- Default在insert資料時,欄位create_date自動填入系統時間。
      ALTER TABLE [history_data] ADD CONSTRAINT col_a_def DEFAULT sysdatetime() for [create_date];

      DEFAULT@W3CDEFAULT@MSDN


      -- 刪除限制

      ALTER TABLE [history_data] DROP CONSTRAINT [col_a_def]




      // end

      2014年12月29日 星期一

      MS SQL server 筆記#2 SQL-trigger for insert

      / *
        * Trigger for history
        * 情況:
        * 大量資料須記錄做歷史紀錄,在sever端指定insert進某一張表後觸發trigger,
        * 能依照當前月份分配至該月份的表;或動態建立當月份的表。
        */


      先對一個table(叫table_name)建立trigger::

      -- begin sql
      use db_name
      go
      create trigger trigger_name on table_name
      instead of insert as
      -- instead of 代表有insert動作進入這張表時(table_name),做下面的動作取代掉insert。
      -- 也可使用 for/after 則本來那筆資料一樣會插入表內(table_name),並做下面的動作。
      -- 也可以針對其他如 delete/update 動作發生時寫個trigger。

      -- 宣告與給值::

      DECLARE @table_variable_name nvarchar(25);
      DECLARE @year nvarchar(4);
      DECLARE @mon nvarchar(2);
      DECLARE @equip_id int;
      DECLARE @string_variable nvarchar(13);
      SET @year = convert(nvarchar,DATEPART (year, GETDATE()));
      SET @mon = convert(nvarchar,DATEPART (month, GETDATE()));
      -- DATEPART 函數取得想要的時間單位,回傳的是整數,因為要做成字串再使用convert轉型別。
      SET @table_variable_name = concat('history',@year, '_', @mon);
      -- 組成字串 Eg: history2014_12 當做table的名稱(會隨著年份月份不同)。 concat

      select @equip_id = equip_id from inserted;

      select @string_variable = a_string from inserted;
      -- 從暫存的inserted表取得原先要插入table_name表的值,指定給兩個變數。 inserted & deleted

      -- 檢查201412月份的歷史資料表有沒有存在,沒有就建立。
      IF NOT EXISTS (select * from db_name.sys.objects where name = @table_variable_name)
      -- 使用Exec函數執行語法,可以解決直接使用語法時不能用字串變數做為table名稱(必須宣告table變數)
      begin
      Exec('CREATE TABLE ' + @table_variable_name +'( [ID] [int] IDENTITY(1,1) PRIMARY KEY,
      [col_1] [int] NULL,
      [col_2] [nvarchar](MAX) NULL,
      [create_time] [datetime] NOT NULL DEFAULT GETDATE() ) ')
      end
      -- 改插入資料到該月份的表也用exec函數執行
      Exec('insert into ' + @table_variable_name + '(col_1, col_2) values (' + @equip_id + ', ''' + @string_variable + ''')');
      -- 變數是字串的值要再加個單引號,要再用一個單引號加上本來要的那個單引號前;要加入 ' 要用> ''
      go
      -- end sql

      當在server端使用上面語法::

      insert equip_id, a_string into table_name values(1234, 'how are you');
      會觸發上面已建立的trigger,將原先要插入表table_name的值改插入目前年月份的別張表。

      當然在server端也可以做檢查該年月份表存不存在、建立、插入的動作;

      或乾脆一次建立好每個月的表,在server端判斷年月份就可以;
      使用這個方法是讓server端不做這件事,統一插入某張表後,就交給資料庫自己處理,也減少去access資料庫的時間。


      // note: delete trigger:: drop trigger trigger_name

      // end


      2014年11月3日 星期一

      jQuery筆記#2 元素的checked值

      * 筆記JQuery語法--------------------
      *
      * 取得元素checked的值轉為1或0
      *
      * --------------------------------------
      {

      $('element').prop("checked");  // true or false

      +$('element').prop("checked");  // 1 or 0

      // 在 $ 前加上 + 會將boolean值轉為1或0
      // true => 1,  false => 0




      }// end note

      2014年8月26日 星期二

      JavaScript #1 查用物件特性的值

      因為要存取物件的某個特性裡的值(某個屬性裡的值),
      但是物件是從DB查詢出來的, 不確定特性的名稱,
      為了要用裡面的值, 一直使用 點 . 後面接變數名稱都無法使用,
      後來查書才發現原來還有另一個存取特性的方法, (犀牛書果然是必讀的聖經)
      也適用在識別字是保留字的時候使用中括號[ ]方法。

      使用物件時, 不知道特性的識別字(不知道屬性名字)時, 特性是不固定時,

      可以使用中括號[ ]裡面再使用字串變數來查用特性的值。

      / *

        *  查用物件特性的兩個方法
        *  參考: JS聖經犀牛書 :: JavaScript大全 第六版, o'reilly
        */

      查用物件特性的值的方法有兩種: 

      A: 使用 . (點)
      物件.特性

      B: 使用 [ ] (中括號)
      物件["特性"]


      EX: -----------------------------------------------------------


      var O = {};  // new an object

      O.mon = 1;  // has its own property "mon"

      var week_name = "mon";  // new a string variable

      console.log(O.mon);  // output: 1
      console.log(O.week_name);  // output: undefined
      console.log(O[week_name]);  // output: 1

      ----------------------------------------------------------------


      使用 . 來存取物件特性就不能使用變數,

      但使用 [ ] 就可以在裡面使用字串型態的變數存取到物件的特性,
      是一個實用的小技巧~


      // end