總網頁瀏覽量

2013年1月31日 星期四

Quick Sort

Quick Sort

這排序法一時難理解他的原理,
據說他的精神是在一數列中選一個數字P為基準點(pivot)
然後將其他的數字分成兩邊
大於P的放左邊,小於P的放右邊

之後分別在左、右兩邊的數列有找一個數I(左)、J(右)當基準點
也一依照上一段作法。


步驟:

以第一個數為基準點



package lottery;

public class lottery {
static int  sum;
static long[] array=new long[42];
static long[] num = new long[42];
public static void random(){
   
for(long i=1;i<=100000L;i++)
{ sum =(int)(Math.random()*42)+1;
//System.out.println(sum);
array[sum-1]+=1;
}
    }
   
public static void print_array(){
   
System.out.println("number"+"\t"+"frequency");
for(int i=0;i<array.length;i++)
{
System.out.print((i+1)+"\t");
System.out.println(array[i]);
}
}
public static void selection_sort(){
for(int i=0;i<array.length;i++)
{
 for(int j=i+1;j<array.length;j++)
 {

 long temp;
  if(array[j]>array[i])
  {
  temp = array[i];
  array[i]=array[j];
  array[j]=temp;
  }
 }
}
}

   
public static void main(String[] args) {            
    random();
    print_array();
//    selection_sort();
//    System.out.println(array.length);
    Quick_sort(array,0,array.length-1);
   
   
    //int count =0;
System.out.println("\n"+"descend sort"+"\n");
for(int i=0;i<array.length;i++)
{
System.out.print((i+1)+"\t");
System.out.println(array[i]);
    }
    //Quit_sort(array,1,array.length);
}
public static void Quick_sort(long[] array,int left,int right)
{
   //large to small
  
int pivot = left;//pivot
int i=left+1;//index of left
int j= right;//index of right
long temp;
while(true)
{
    while((i< array.length) && (array[i]< array[pivot])){
     i++;   
   }
   
 while( (j>-1)&&(array[j] > array[pivot])  )
{
 j--;
}

if( j>= i)
{
temp = array[ j];
array[j]=array[pivot];
array[pivot] = temp;
break;
}
temp = array[ j];
array[ j]=array[ i];
array[ i]=temp;
}

Quick_sort(array,j+1,right);//right
Quick_sort(array,left,j-1 );//left
}
   
}

2013年1月30日 星期三

Java之Debug

遇到關於分號的bug,通常是少打分號
這種狀況容易debug

也有多打分號造成bug狀況。
這種狀況編譯器不會回報錯誤
因為程式語法沒有錯

下面則是一個例子
if後面多打分號
變成大括號裡面的程式碼與If無關

if(array[j][1]>array[i][1]);
  {
  temp = array[i][1];
 index = array[i][0];

  array[i][1]=array[j][1];
 array[i][0]=array[j][0];

 array[j][1]=temp;
  array[j][0]=index;
  }

ASP.net控制項以及事件

1.textbox

想要呈現輸入密碼功能去更改TextMode屬性。
想要讓textbox可以打更多行字也是去TextMode屬性更動。

VS2012的TextMode支援更多設定值。
不過必須要支援HTML5的瀏覽器才可看到正確成果
新功能可省下coding的力氣

我們可以藉由後置程式碼更動控制項的屬性。
比方說在button_onclick事件底下打上
Textbox1.TextMode = TextBoxMode.MultiLine;
Textbox1.BackColor = System.Drawing.Color.AliceBlue;

當點下button時
將textbox變成可以打多行的文字方塊
文字方塊底色變藍色

2.

2013年1月29日 星期二

gridview



事件:
GridView1_Load
只要開啟網頁就會觸發


GridView1_DataBound
只要對資料庫下指令都會觸發包括連到資料庫時也會。


判斷gridview有沒有搜尋出資料。
protected void GridView1_DataBound(object sender, EventArgs e)
        {
            if (GridView1.Rows.Count == 0 && (!(TextBox1.Text == "")))
//沒有搜尋到資料,表示row.count為零,textbox.text不為空字串。表示使用者有在此輸入字串或字元           
{
                Label2.Text = "抱歉沒有你要的資料";
            }
            else {
                Label2.Text = "";
            }
       
        }
















ASP.net雜記

程式要常碰,不碰很快就會忘掉


太多東西很難懂,描述不夠直觀與白話
一時根本看不懂先筆記下來:
命名空間是什麼?什麼叫做抽象的控制項?

什麼叫做執行個體?所謂執行個體就是一個軟體系統‧。


1.使用者看到的網頁都是編譯過後呈現的HTML程式碼
由IIS Server編譯ASP.net網頁


2.inline code:將程式碼跟HTML寫在同一檔案中
其中程式碼寫在<% %>裡面。

   <% Response.Write("<br>你好阿");
       Response.WriteFile("body.txt");
//將txt內容印在網頁上,注意編碼問題
       Response.Redirect("http://tw.yahoo.com");
//網頁重新導向,本例子將網頁導向雅虎。開啟本網頁立刻跳到yahoo,往後可以用onclick事件來做Response.Redirect();
       %>



3.寫好網頁程式打開瀏覽器沒有呈現新的結果,這是因為緩衝區的資料還是舊的版本程式碼,在browser重新整理即可。





4.使用者自行輸入東西給變數:
在asp.net用Request來接收使用者輸入的值
程式碼如下:
 int num = Convert.ToInt32(Request["number"]);
number是變數名稱,接收使用者輸入的值
Convert是類別庫
ToInt32是函式,將變數值轉成32bits的Int
在C#裡頭,必須將輸入的值轉成適當的格式,否則會編譯錯誤

輸入的方法:打開瀏覽器瀏覽網頁後,在網址最後面打上?number=10
web server透過URL擷取使用者的要求後,網頁就會呈現執行結果
這類傳遞變數值的方法稱為get method




5.
.cs檔案是寫程式碼的地方,程式碼與HTML分開不同檔案稱為code behind,中文翻譯是程式分離、後置程式

裡面有個void Page_Load()函式,相當於C語言的main函式。
網頁開啟後會自動執行此函式。
正確來說當網頁碰到"讀取網頁"的事件時
會觸發void Page_Load()


6.Web伺服器控制項跟HTML控制項是不同的東西。
Web控制項在伺服端執行,我們可以用程式設計方式控制這些項目,也可以透過控制項來執行程式
using System.Web.UI.Webcontrols


7.可以在web控制項加上"事件",執行程式。
web控制項跟HTML類似,每種標籤有屬性跟事件。所謂事件指的是"點滑鼠" "輸入文字" "滑鼠游標移動" "載入網頁"....。
 <asp:Button ID="Button1" runat="server" OnClick="fly" Text="Bomb" />
Onclick是事件,代表當滑鼠按button1時會去執行fly這個函式。可以由多個web控制項執行同個函式。

 protected void fly(object sender, EventArgs e)
    {
        Button btn = (Button)sender;//傳遞過來的物件,轉成button物件。
        Response.Write(btn.ID);//印出物件ID
        Response.Write("碰"+DateTime.Now.ToString());//印出現在時間
    }

8.時間
印出今天是禮拜幾:
DateTime.Now.DayOfWeek
DateTimey是struct資料型態
Now是static DateTime資料型態,系統跟我說這是物件。在我的理解,這是遞回式定義。有點像鏈結串列節點宣告
DayOfWeek是DateTime成員變數

按照過去C語言所學struct
應可以直接印出DateTime.DayOfWeek
但是在asp.net卻不行
系統跟我講CS0120: 需要有物件參考才能使用非靜態欄位、方法或屬性

這是因為DayOfWeek資料型態非靜態(static)
必須要建立(new)出物件才能使用
asp.net這邊用法直接用DateTime
要用Date必須透過屬於static的Now來存取Date

 Response.Write(DateTime.Now.Date.Date.Date.Date.Date.Date.Date + "<br>");
這句合法

Response.Write(DateTime.Now.Now);就不合法,browser告訴我"無法以執行個體參考存取; 請使用型別名稱代替"
意思是說DateTime.Now已經建立了物件????
這時再去呼叫static的型別就不合法。

心得:要了解static的本質


9.string.Format()格式化輸出字串:,如果嫌用加號串接字串麻煩,那麼用string.Format()來印出多個變數就很方便多了。

跟C語言的printf("%d %s",int1,string1);非常像。

  s = string.Format("i am {0},sum is {1}and {2} and {3}<br/>",i,sum,i,sum);
            Response.Write(s);
       
他的多載是去呼叫底下這個
public static string Format(string format, params object[] args);




10.每次按下按鈕之後,例如:button、imagebutton、linkbutton都會觸發一次Page_Load事件,會去執行Page_Load程式。
這就是所謂的PostBack。
即使有設定button_click每次按下按鈕都會先觸發page_load事件。
如果有程式只想在按下按紐才執行的話,那麼可以用Page.IsPostBack,判斷是否第一次執行網頁。Page.IsPostBack是布林值,false表示第一次執行網頁。



11.善用AutoPostBack屬性。textbox,checkbox,dropdownlist.....,這類控制項都有這個屬性,只要這類控制巷的內容有更動或選用,就會將資料提交給web server。然後啟動page_load事件以及使用者自訂事件。


12.一個.aspx裡面,只能有一個<form runat="server">

13.textbox接收使用者輸入的數字、字串一律當字串型態(String)處理,如果要進行數字加減乘除則必須使用Convert.ToInt32(TextBox1.Text)強制轉換成整數型態



14.EnableViewState屬性:讓web server忘掉控制項的上一動狀態。
若設定為true,web server會保留此控制項的上一動狀態或資料。若為false則web server不保留控制項的上一動資料,而是將控制項的狀態或資料回復到預設初始狀態。
例如:
將textbox的EnableViewState屬性關閉,且textbox的屬性text預設初始狀態是null(沒有任何字串)。如果打上文字KKK,sumit出去,那麼此時web server會知道textbox的text值從null變成KKK,而引發TextChanged事件。接著server會將extbox的text曾經變成KKK這件事給忘記,以為textbox屬性text的上一動狀態是null。因此即使我們一直用KKK字串sumit給server,對server來說textbox的text是不斷從null變成KKK,因此會一直觸發TextChanged事件。



15.

object sender:事件製造者

Label1.Text=sender.ToString();

innerHTML屬性

innerHTML屬性的意義。


<div id="report"></div>//宣告div物件
    <script>
        var result = "";
        var i = 1;
            for (i = 1; i <= 9; i++) {
                    result += i + "<br>";//字串銜接              
            }
 report.innerHTML = result;
 
程式碼解讀:
id 表示物件名稱。
result儲存字串的變數

跑完之後innerHTML裡面存的是
"1<br>2<br>3<br>4<br>5<br>6<br>7<br>8<br>9<br>"

以上程式碼等於下面的
<div id="report">1<br>2<br>3<br>4<br>5<br>6<br>7<br>8<br>9<br></div>





我們驗證一下,新開一個html檔案,在<body>標籤貼上
 <div id="report">1<br>2<br>3<br>4<br>5<br>6<br>7<br>8<br>9<br></div>
    <script>
document.write("YYP");
        document.write(report.innerHTML);

    </script>
可以看到網頁先列印一到九後,接著印YYP,接著再印一次一到九


所以innerHTML表示標籤所包住的字串內容,而這字串內容假如有HTML標籤,網頁會當作HTML標籤處理而不是單純的字串。

MySQL匯出與匯入

批次匯入資料(迅速):
c:\program\mysql\....\bin
打上mysql -u root -p < D:\....\XXX.sql


use northwind;
匯出產品類別資料
將categories表單匯出至lab.txt檔案
select categoryId, categoryName into outfile 'c:\\temp\\lab.txt' from categories;

-- 欄位預設以tab為間隔,打開文字檔案我們發現每筆記錄沒有換行,這樣看資料非常不方便。如果要匯出像資料表單那樣形式。則要打上lines terminated by '\r\n'

指令如下:
select categoryId, categoryName
  into outfile 'c:\\temp\\lab.txt'
  lines terminated by '\r\n'
  from categories;




-- 準備稍後練習匯入時會用到資料庫與資料表
create database LabIO;
use LabIO;
drop table categories;
create table categories
(
  CategoryID int(11) unique default 0,
  CategoryName varchar(15)
);
-- 以記事本開啟 c:\temp\lab.txt,
-- 多複製兩行, 故意製造一些重複的類別編號
-- 繼續執行下列指令,
-- 特別觀察匯入時的各項數據報告, 例如:
-- Records: 10  Deleted: 2  Skipped: 0  Warnings: 2
load data infile 'c:\\temp\\lab.txt'
  replace
  into table categories
  LINES TERMINATED BY '\r\n';
  -- ignore 2 lines;
select * from categories;



LOAD DATA INFILE "/home/web/www/a.txt" INTO TABLE custom FIELDS TERMINATED BY ',';

2013年1月27日 星期日

gridview(在網頁秀出資料庫表單)

第一步:連接資料庫
使用"資料來源控制元件":sqldatasource
新增連接設定伺服器名稱(即dbserver名稱)
win驗證表示用win使用者帳號連接dbserver
sql驗證表示用dbserver內部帳號連接dbserver
其中sql驗證有內建sa帳號


連接字串的設定可以去web.config看,連接資料庫的過程也都記錄在web.config,以下文字意思是,連接到(local)\sqlexpress的server,使用pubs料庫。
<add name="pubsConnectionString" connectionString="Data Source=(local)\sqlexpress;Initial Catalog=pubs;Integrated Security=True"
            providerName="System.Data.SqlClient" />

第二步:資料庫呈現
可以使用gridview或formview或datalist呈現資料。
gridview:用table顯示表單
formview:顯示表單每筆的詳細記錄
datalist:跟gridview一樣,but可以說是邊界為無色的table表單

首先說明gridview的用法

在gridview的"編輯資料行"可以讓使用者依自己喜好設定資料呈現的樣子。
例如:我們想在網頁上修改表單的欄位標題,可以在"HeaderText"這個屬性作設定。
又例如:資料庫表單裡面有個價格欄位,單純儲存數字,我們想在網頁上嗅出如:"NT$100元"使用者可以在dataformatstring這個屬性打上"{0:c3}元",
(回憶C#語法:printformat("{0}{1}",變數,);)
{0:c3}意思是小數點三位



編輯樣板:設定欄位title

鑲嵌上圖片:


default9的內容
拉gridview
hyperlinkfield
datanavigateurlfields:title_id
title_id是變數



datanavigateurlformatstring:default8.aspx?id={0}
id是qurerystring欄位

datatextfield:title


default8.aspx


where

title_id=Querystring
Querystring欄位設定是id


物件導向

物件導向是程式設計非常重要的觀念

物件導向是一種寫作風格

物件導向程式設計就是以物件導向的風格寫程式

以個人經驗需要理論跟實作並重才能理解

一邊將物件導向的定義搞懂,一邊寫程式實作

這樣才能記得久



類別:類別是建立物件所參考的藍圖(blueprint)或曰雛形,
多個相同屬性和行為的物件集合在一起,然後寫程式。
在java裡面,類別由欄位(field)與方法(method)所組成。欄位就是變數;方法就是函式(function)。
ps:個人覺得稱method為函式比較貼切,觀念就跟高中數學的f(x)一樣

例如:
假設要寫偵探相關的角色扮演遊戲,
這遊戲不只一個偵探角色,
那麼建立角色以前,我們要有個藍圖讓系統參考。
他才知道所謂的偵探大概有什麼特徵跟功能
首先宣告偵探這個類別告訴電腦偵探有什麼特徵跟功能。
在這遊戲中偵探都有名字、年紀、特殊能力、抓兇手等欄位與方法
宣告如下︰

class detective{

int age;
String name;
String skill;
public void catch_murderer(){

System.out.println("catch murderer");
}

}



物件:是類別的具體實作。
在java裡面,物件就是依照類別的欄位與方法,配置一塊記憶體。
使用類別的變數與方法皆要透過物件。

我們希望在遊戲裡面有叫柯南與平次的偵探
那麼宣告類別變數conan與piengchi
分別建立物件(new)並初始化(detective()),conan與pienchi皆指向detective類別的物件。

detective conan = new detective();
detective piengchi = new detective();

以上宣告,系統透過detective類別建立conan、piengchi物件。
conan與piengchi並非物件的本身,而是參考型態的變數,分別指向物件的記憶體位置。物件變數(conan、piengchi)與detective物件之間建立參照關係。

要使用類別筆須透過物件
透過物件使用類別的欄位與方法
conan.name="conan";
conan.skill="soccer";//conan的能力是足球
piengchi.name="piengchi";
piengchi.skill="kendo";//平次的能力是劍道
conan.catch_murderer();




物件導向的好處

讓程式碼可以重複利用,不用再製造一個輪子(make a wheel)。




三大特徵:

封裝(encapsulation):
設定權限保護資料,使用private來實行封裝。
將類別內部的變數(field)與函式(method)按照私有成員與公有成員劃分清楚,並且包裝在同一類別之中,讓私有成員資料受到保護。
避免直接存取類別的變數,給予不當的值或操作,造成困擾。
通常將變數設定為private
將函式設定為public
類別外部的程式藉由public去存取或設定private的變數




繼承:extends

改寫(overriding):翻譯成"覆載",實在很難懂。翻譯成"改寫"比較貼切。



多型



在java之中:

1.
不宣告名字也可以用類別的函式。
匿名物件(Anonymous):不宣告名字的物件。
new classname().method();
new 類別名稱().函式();
特徵:函式執行完畢即從記憶體中釋放。

2.
一個.java檔案同時有多個類別的話,原始檔案經過編譯之後,會根據原來的類別建立相同數目的類別檔(.class)

3.參數(parameter)與引數(argument):
在函式括號裡所定義的變數稱為參數。
呼叫函式時所傳遞的值或變數稱為引數。
void setAge(int age);//age是參數
setAge(17);//17是引數
setAge(num);//num是引數


4.建構子可以宣告成private,不過如此一來就無法利用new XXX()建立物件。錯誤訊息如下:
error: detective() has private access in detective
detective conan= new detective();


5.可以用陣列儲存物件,稱之為物件陣列。
首要宣告陣列變數,配置記憶體給陣列
宣告方式:
類別名稱[] 陣列名稱 = new 類別名稱[陣列大小];

接著針建立物件並讓每格陣列指向相對的物件
宣告方式:
陣列名稱[index]=new 類別名稱();

object class

object class是所有類別的superclass

String str1 = "hello";
//直接將hello的記憶體位置給str1,str1的位置=hello的位置。
String str2= new String("hello");
//先分配一個記憶體空間給str2,接著,內容值是存放






public class TestEquals
{
  public static void main(String[] args)
  {
    MyDate  date1 = new MyDate(14, 3, 1976);
    MyDate  date2 = new MyDate(14, 3, 1976);
    if ( date1 == date2 ) {
      System.out.println("date1 is identical to date2");
    } else {
      System.out.println("date1 is not identical to date2");
    }
    if ( date1.equals(date2) ) {
      System.out.println("date1 is equal to date2");
    } else {
      System.out.println("date1 is not equal to date2");
    }
    System.out.println("set date2 = date1;");
    date2 = date1;
    if ( date1 == date2 ) {
      System.out.println("date1 is identical to date2");
    } else {
      System.out.println("date1 is not identical to date2");
    }
  }
}

2013年1月26日 星期六

存取控制

我們寫程式當寫一個遊戲、系統,
避免對於類別裡面的變數不當設定
(ex:將遊戲角色的年紀設定為負的)
,為了避免這種狀況,通常將變數宣告為private
然後在類別裡面宣告一個public的函式來設定這個變數的值
並且在此函式設置防護措施
如此一來就無法對變數設定不適當的值了

private跟public是存取權限修飾詞

public、private、default、protected
都是存取權限修飾詞


private:
在類別之內,被宣告為private的變數與函式,只能在類別內呼叫與存取

default:(系統預設的存取權限)
在類別之內,被宣告為default的變數與函式,只能在他們宣告的套件(package)內被相關的程式存取。比方說一個套件內有game.java與oop.java檔案,在game裡面的類別宣告為default的變數與函式,可以在oop.java存取、設定值。


package game;
public class detective {
    public int a=1;
    protected int b=2;
    int money=3;
    private int age=4;

public void setAge(int num){

if(num>0 || num<130){
age=num;
System.out.println("角色年紀是"+age);
}
else{
System.out.println("人的年紀沒有負的,也不會超過一百三十歲");

}
}
}


因為age的存取權限修飾詞設定為private,detective類別外部無法直接存取age,如果在detective類別外面直接存取age會出現以下錯誤訊息
game.java:25: error: age has private access in detective
age稱之為私有成員(private member)

money只能被在game套件底下相關程式存取。
在套件之外的程式無法存取money。

實驗:
建立book套件並且在底下建立comic.java檔案
package book;
import game.* ;
public class comic{
public static void main(String[] args){
detective akai = new detective();
akai.money=100;
}

}

必須import game.*  表示引入game套件底下的.java檔案,
否則java會找不到detective這個public類別,無法建立detective物件
也因為detective是public類別所以我們可以在book建立detective物件
detective akai = new detective();//建立detective物件
然而當我們對default的money直接設定值時
akai.money=100;

結果出現
money is not public in detective; cannot be accessed from outside package

Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - money is not public in game.detective; cannot be accessed from outside package at book.comic..main

overriding(改寫、覆載)

overriding:一般都翻成覆載,不過我覺得翻成"改寫"會比較貼切

定義:
在繼承關係之下,子類別宣告與父類別相同的method名稱、相同的引數列、相同的method型態,子類別在呼叫method時候,會執行子類別的method。這就是所謂的overriding,子類別改寫父類別的方法



如果型態不同會compile error

如果引數列不同則是overloading多載



package inheritance;
class blueeyes {
   public int attack = 3000;
    int defense = 2500;
    public void attack() {
        System.out.println("attack is " + attack);
    }
    public void defense() {
        System.out.println("defense is " + defense);
    }
}
class whitestone extends blueeyes {
   public int attack = 100;
public void attack(){
super.attack();
System.out.println("attck is is "+ attack);
}
    public void effect() {
        System.out.println("special summon blue eyes white dragon");
    }
}
public class inheritance {
    public static void main(String[] args) {
        whitestone monster = new whitestone();
         System.out.println(monster.attack);
        monster.attack();//
        blueeyes monster2 = new blueeyes();
System.out.println(monster2.attack);

    }
}

繼承

定義:以既有的類別為基礎宣告另一個類別,新的類別有跟舊的類別同樣的成員變數、成員函數,新的類別可以額外自行宣告自己的成員函數與變數。宣告類別時,在類別名稱後面加上(extends 類別名稱)。



宣告類別時

若不宣告建構子

jdk會預設建構子

以及在建構子裡面附設不傳參數的super()值


package javaproject.oop.inheritance;
class Employee extends Object{//即使不寫,Jdk也會預設extends Object
    String name;
    String address;
    String tel;
    int salary=22000;
    int age;
   
    public Employee(){
        super();
    }//即使不寫建構子,jdk也會預設寫建構子,並且打上super
   
    public Employee(int age){
        this();//這個是呼叫不傳參數的建構子。this 與super王不見王
        this.age=age;
    }
   
    public void getDetails(){
        System.out.println("name=" + name);
        System.out.println("address=" + address);
        System.out.println("tel=" + tel);
    }
   
    public int getSalary(){
        return salary;
    }
}
class Engineer extends Employee{
    public Engineer(){
       super(6);//呼叫老爸的傳一個整數的建構子,
       /*如果沒有傳參數,寫成這樣super();
       而且老爸類別沒有不傳參數的建構子 
       public Employee(){
        super();
    }
       那麼就會編譯錯誤,系統找不到
      
       */
    }
   
    public void exec(){
        super.address="taichung";
        super.name="Louis";
        super.tel="04-24525773";
        int number=super.getSalary();
        super.getDetails();
        System.out.println("number=" + number);
    }
}
public class CallTestSuperInheritanceEx1 {
    public static void main(String[] args) {
       Engineer e1 = new Engineer();
       e1.exec();
    }
}

封裝之private

將建構子宣告成private
在code打上new時將無法在其他類別建立物件

那麼可以藉由兩種方式建立物件
其中一種是現在類別裡面自己建立物件
不過這種方法建立物件效能不好,因此有第二種

其二:在自己類別宣告static final

如此一來,建立物件時只會建立一次,讓效能提升

enhance forloop(foreach的用法)

java也有類似foreach的用法,用精簡語法列印陣列所有的元素。

本篇以二維陣列為例子。
int[][] array = {{1,2,3,4},{5,6,7,8}};

for (int values[]:array)//去二維陣列array抓所有的一維陣列給values承接取出來的一維陣列
{
for (int num : values)//去一維陣列values抓所有的值給num接收
{

System.out.println("num="+num);


}


}

break&coninue標籤用法:幫loop取名

當多重巣狀迴圈執行時,有時候我們想要跳至某個迴圈執行程式。
可以將loop取名,在continue或break後面加上loop名字就可以了。
有了這樣用法,可以控制要跳到哪個迴圈了


package breakcontinue;
public class breakcontinue {
    public static void main(String[] args) {
     int i,j;
     kkk://幫loop取名
        for(i=1;i<10;i++){           
for(j=1;j<10;j++){           
            if(i==2)
            {
               // break;//不加label名稱只會跳出當下loop
                //continue kkk;
                break kkk;       
            }
            System.out.println(i+""+j);
             }
                      
        }                     
    }
}

Pakage&import

Packge
表明本class會被放在哪個路徑
未來java 執行本程式時就去該路徑找

package必須寫在程式碼的第一行


javac -d "c:\java\classes" HelloWorld.java 
編譯HelloWorld,package放在c:java\classes
會根據code裏頭pakage的路徑,在classes底下自動建立資料夾

cd ..\..\classes  
 必須去package的根目錄,也就是classes執行hellowrld檔案

java tw.org.iii.mainproject.HelloWorld
執行程式碼必須打上package路徑


將class變成jar檔案後
放進以下資料夾,就不用去環境變數設定classpath了
C:\Program Files\Java\jdk1.7.0_11\jre\lib\ext
jdk會自動去這路徑載入使用者自訂的程式







import
有點類似C語言的include
差別是C在include之後在執行程式時不管include函式褲有沒有被用到
都會載入記憶體。
然而java在執行程式時只有用到的類別才會載入記憶體。



javac *.java  編譯所有.java檔案


在.java所在目錄打如下指令

javac -d "c:\java\classes" *.java
這行意思是將所有java編譯一次,並將packate或class放在C:javasource\classes底下資料夾
java -cp "c:\java\classes" test.good.CallTestPackageImportEx1
執行cp路徑底下程式碼 後頭是package路徑,不論在哪個地方皆可以打上這指令,有效。


javac -classpath "c:\javasource\classes" -d "c:\javasource\classes" CallTestPackageImportEx1.java
編譯.java並會參考到classpath其他的package,最後將.class放在-d裏頭

java -classpath "c:\javasource\classes"  test.good.CallTestPackageImportEx1

pause

2013年1月24日 星期四

ASP.net月曆

<%@ Page Language="C#" %>
<!DOCTYPE html>
<script runat="server">
    protected void Calendar1_SelectionChanged(object sender, EventArgs e)
    {
        Response.Write(Calendar1.SelectedDate.ToShortDateString());
    }
    protected void Calendar1_DayRender(object sender, DayRenderEventArgs e)
    {
        if (e.Day.Date == new DateTime(2013, 1, 1))
        {
            //Response.Write(e.Day.Date.ToShortDateString() + "<br/>");
            //e.Cell.Text = "元旦";
            HyperLink lbl = new HyperLink();
            lbl.Text = "<br/>元旦";
            lbl.NavigateUrl = "http://www.google.com";
            e.Cell.Controls.Add(lbl);
        }
    }
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
   
        <asp:Calendar ID="Calendar1" runat="server" OnSelectionChanged="Calendar1_SelectionChanged" OnDayRender="Calendar1_DayRender"></asp:Calendar>
   
    </div>
    </form>
</body>
</html>

HTML概論

w3school.com網站有豐富的資料參考,想找詳細資料,那邊很豐富


現在說的HTML大體上包含三大要素:"傳統的HTML"、"javascript語言"、"CSS"

傳統HTML語言是靜態標籤語言,利用標籤(tag),簡單顯示網頁的樣貌。
表格、文字、圖片。就好像將現實生活的廣告單、履歷表變成網頁形式,有表格有圖片有文字。

javascrip語言,由<script></script>標籤包住,是一種程式語言但是跟java無關係,語法比較有彈性(不嚴謹)例如:javascript不用宣告變數可直接使用變數。有了javascript使用者可以藉由滑鼠操作(ex:點滑鼠左鍵)或者操作鍵盤跟網頁互動。javascript是屬於瀏覽器端也就是client端的語言,程式碼由瀏覽器負責執行。

CSS是(Cascading Style Sheets)的縮寫,Cascading是串接的意思,style是樣式,sheets則是一頁紙張。好比是網頁的美容師,可以設定字體大小,將控制元件訂在網頁某一地方上,設定表單的顏色、框線長相。功能與HTML有重疊,不過CSS在網頁美化方面的功能比HTMLtag強大。
HTML5就已經將網頁美化方面全給CSS功能負責。


最近出現HTML5,本質上跟過去HTML一樣
看起來是因為這十年來多媒體在網路上的應用頻繁
網路需要處理大量媒體資料
HTML5訂定標準讓大家容易開發程式
並且新增或刪減標籤的屬性。
讓HTML負責網頁內容,CSS負責網頁的美觀

Mysql交易與鎖定


鎖定定義:當多個使用都同時使用資料庫時,為了資料的正確性,MySQL
會針對資料表加以鎖定,讓使用者不能同時存取同一張資料表,等到前一
個執行緒完成後,才能讓另一個使用者存取。


交易的定義:
用transation....begin包起來一連串的指令操作
交易符合ACID特性。














無法知道誰做lock

mysql帳號與權限

DB 放資料庫指令存取權限
可以看各個帳號存取權限

user
table_priv

2013年1月23日 星期三

javascript

javascript視為與java不同的一種語言


javascript
與java不同之處
可以不用宣告變數,給值



alert("C"+2);
將2視為字串
印出C2


alert("C"+(2+3));
計算2+3後
將5視為字串
印出C5

型態轉換parseint(blablabla)
java型態轉換是int(blablabla)

電腦如何處理數字

電腦處理數字皆以二進位進行運算
因此我們輸入十進位八進位十六進位
電腦運算時都會轉成二進位

(小數轉二進位方法:小數一直取小數部分乘以二,寫下個位數
,又只取小數部分乘以二)

0.3*2=0.6   取0
0.6*2=1.2   取1
0.2*2=0.4   取0

可以發現大多小數點轉成二進位,無法精確表示。
因此電腦進行浮點數運算時候,會有誤差。

用程式將0.0001累加一萬次後,結果不會等於一。
而是1.000......016

所以coding時型態轉換盡量用函式來做
SQL有convert
java有 (float)數字

2013年1月22日 星期二

資料庫正規化的觀念

第一正規化1NF:每個欄位只能有一個值,且要有主鍵
第二正規化2NF:選出多個主鍵能與每個欄位相依,
再依主鍵相依關係切出多張資料表。
踢掉redundant data欄位。另一說將與主鍵不相干的欄位踢掉

第三正規化3NF:將遞移關係的欄位,
再切出適當無遞移關係的資料表

第一正規化不難理解,table每個格子只能有一個值,且紀錄不可重複,所以用主鍵區別紀錄


但是第二正規化跟第三正規化
只看定義就很難理解阿.........
一直以來不懂相依的定義是什麼?何謂相依關係?
何謂遞移關係?什麼叫適當無遞移關係?
在我理解:相依就是"不獨立"的意思,遞移就是a>b且b>c則a>c
可是實在無法將資料表單與數學連接在一起......


看到BBS的database板網友Adonisy以下描述,讓我立刻明白正規化是幹嘛用的:

第二正規化為了避免屬性重複存在不同於實體,造成重複修改問題
例如顧客有地址屬性,訂單有地址屬性,如果這兩個是同個定義
你修改顧客地址就也要修改訂單

第三正規化為了避免資料刪除後,就把隱實體刪除
例如訂單中有顧客,如果顧客沒有獨立成一個實體,你刪訂單
刪著刪著,有一天顧客都會被你刪掉而找不到
所以才會有什麼遞移相依,間接相依有的沒有的名詞


正規化是一種"檢查",而非設計資料庫時以"設計正規化為主"
就是設計資料庫會先找一個方法論設計,像用 ER方法論設計
 設計完後,用正規化原理檢查是否還要再分出實體
 而非用正規化來設計資料庫
 換言之,我們 ER方法論一開始就開宗名義,實體屬性,用屬性描述實體
 在實體的眾多屬性中,找一個屬性為主鍵代表實體

SQL函數

本文章主要是MSSQL的函數
有些函數mysql裡面沒有
例如:NEWID()

SQL函數通常與select配合使用
官網部分將函數分成許多類別:
字串函數、時間函數、彙總函數


1.資料型態轉換:
convert(型態,欄位)
例如:select CONVERT(char(10),height) as total,* from student where height > 180 //int 轉成char

2.列出現在的年月日時分秒
語法:select/print GETDATE()
結果:01 23 2013 12:17AM
語法:select/print CONVERT(varchar(20),getdate())
結果:01 23 2013 12:17AM
語法:select/print CONVERT(varchar(20),getdate(),101)
結果:01/23/2013
語法:select/print CONVERT(varchar(20),getdate(),102)
結果:2013.01.23
語法:select/print CONVERT(varchar(20),getdate(),120)
結果:2013-01-23 00:17:06
3.
substring

4.
index

5.計算(符合某條件下的)紀錄筆數:count(欄位)
select count(employeeid) from table_name (where .....);
但是不會將null值算進去
如果要將null值也算進去則
select count(*) from table_name;

6.列出欄位的值域:distinct
例如:想看員工來自哪些國家
select distinct (country) from Employees;

7.隨機挑選n筆資料 :select top n ... from ... [where...] order by NEWID()
例如:從order details隨機挑選六筆資料
select top 6   * from [Order Details]  order by NEWID()
例如:樂透開獎機
select top 6 * from products where productid < 49 order by NEWID()
productid 最好是主鍵,否則會重複開獎

查詢結果會發現資料並非以任何欄位的順序排列。
那是因為NEWID()函數會產生uniqueidentifier型態的唯一資料,這種資料稱之為全域唯一識別碼(GUID),長度為十六位元組(16 bytes,32 bits)的二進位值,長相如:34D92DC7-7BEB-4825-8DF1-004B40F602C8,
因此select結果是以GUID排列。


每台電腦也有GUID值,全世界的電腦都不會產生重複的GUID

8.彙總函數
選定特定欄位,進行運算得出統計結果
max(欄位)、min(欄位)、sum(欄位)、avg(欄位)、算標準差的stdev(欄位)、算變異數的var(欄位)

2013年1月21日 星期一

MySQL基本指令

1.status:列出DB版本以及字元編碼設定
|character_set_client     | utf8
//以什麼樣的編碼接收client端的資料
| character_set_connection | utf8
| character_set_database   | utf8
//資料庫資料所用的編碼,這邊視使用的資料庫而定
| character_set_filesystem | binary
| character_set_results    | utf8
//從資料庫撈出資料以什麼編碼
| character_set_server     | utf8
//進入server端資料以什麼樣的編碼
| character_set_system     | utf8

流程:client→server→database→result

2.show variables ;
//列出DB環境變數、參數設定
show variables like 'character%';
//列出character參數設定。因為項目很多,所以可以用這語法列出想看的項目
show variables like 'data%'
//列出帶有data字串的環境變數,目前版本MySQL只會列出資料庫存放路徑,預設路徑是C:\programdata\MySQL

show create database 資料庫名稱;
//列出資料庫資料的預設編碼

set character_set_database= utf8;
set character_set_results = latin1;
//改變字元編碼,當select資料或者網頁秀出的資料為亂碼時,請愛用這個指令

SET NAMES utf8;
//同時將connect、client、server的字元編碼設定改變



ERROR 1229 (HY000): Variable 'max_connections' is a GLOBAL variable and should be set with SET GLOBAL
//有些變數是global 因此要在set之後打上global


3.use 資料庫名稱;
show databases;//列出資料庫清單
show tables;//列出table清單
select database();//看使用者目前所在的資料庫


4.建立資料表
create table changin(productid int primary key auto_increment,productname
 varchar(20),spec varchar(20),price int,remark varchar(20));

5.插入資料(注意許功蓋的問題)
use factory;
insert into changin (productname,spec,price) values('木蓋\','55*66','1');
指定table與欄位 在蓋之後加上\

6.刪除資料
delete from changin where productid <10;
delete from changin;//auto_increment繼續累加
truncate table changin;//讓auto_increment重算

7.





安裝mysql以及說明

這次安裝5.5.29版本
從oracle網站下載community server版本
需要註冊帳號跟填寫問卷(感覺很囉嗦)


安裝步驟:選擇完整安裝(complete)→一直下一步→選詳細設定組態(detailed configuration)→選developer machine(當server選server machine選項;電腦專門跑sql的話,選dedicated MySQL server machineg讓CPU資源幾乎給MySQL)→選multifunctional database採用myISAM、InnoDB這兩種資料庫引擎(myISAM效能極佳但不支援transaction,myISAM資料由儲存在硬碟上三個檔案組成
  1. .frm--儲存資料表定義,此檔案非MyISAM引擎的一部份。
  2. .MYD--存放真正的資料。
  3. .MYI--儲存索引資訊。
;InnoDB有支援ACID相容的transaction。目前只能理解到這樣...)→設定InnoDB資料存放空間,採用預設值→選擇這個資料庫會有多少人連線→
設定網路選項以及要對外連線的port,採用預設值→選擇資料庫字元編碼參數選utf8→將include bin directory in windows path打勾,這樣可以在cmd介面打mysql指令→設定密碼(看各人喜好設定允不允許匿名登入,只需要打帳號不需密碼也可登入資料庫)→execute。

完成。



(PS:如果重新安裝applying security set選項顯示打叉,那麼將program_file跟programdata底下的mysql檔案刪掉重裝一次就可以安裝成功)







USE test;
DROP TABLE Lab;
CREATE TABLE Lab
(
  id INT AUTO_INCREMENT PRIMARY KEY,
  DATA INT NOT NULL
 ) ENGINE = INNODB;
-- ) engine = MyISAM;
SHOW TABLES;
DESC lab;
INSERT INTO Lab (DATA) VALUES (100);
SELECT * FROM Lab;
START TRANSACTION;
UPDATE lab SET DATA = 200 WHERE id = 1;
 -- rollback transaction;
ROLLBACK;
SELECT * FROM Lab;

在innodb下,下rollback指令會恢復100
在myISAM則否

若不知道要用哪個引擎那麼就用InnoDB吧
ACID比較重要






sqlyog字元亂碼

原始資料:中文字表單
原本編碼是latin1
已經針對許功蓋的問題,處理過資料
將"功""蓋""許"等會與ascii code衝碼的字
在其後加上反斜線"\"

將資料庫丟在C:\programdata\...\MySQL server5.5資料夾底下
重啟mysql,匯入資料庫成功。
打上use charweb;,來到資料庫charweb底下
打上status;發現Db characterset的參數是latin1
其他的characterset參數皆為utf8
現在我們下指令
set character_set_results = latin1;
那麼select可以正常顯示中文


但是用sqlyog做如上設定之後做select也依然顯示亂碼
這是因為sqlyog的在select時候將資料以utf8呈現
因此才出現亂碼。
(我猜是應該是反斜線的問題)



當用mysql將資料dump出來時系統會預設儲存成utf8,這時用記事本打開這檔案會是亂碼。
因此我們要將dump時要儲存成latin1這時打開記事本,可以正常顯示中文,接著我們將latin1字眼設定成utf8

sqlyog備份預設也是utf8
SET character_set_results = latin1;

SET character_set_database = utf8;
//資料庫裡面資料的編碼

SET character_set_results = big5;
//mysqlserver輸出給client端的編碼




dump備份資料夾先將資料匯出來,以latin1編碼匯出,與原始資料的編碼一致性。這樣記事本打開才不會亂碼
C:\>mysqldump -u root -p123456 --default-character-set=latin1 charweb > charweb3.sql

接著打開.sql檔案,將latin1改成utf8
並且將反斜線去掉

之後source 路徑\xxx.sql 將資料庫重新匯入
finish


心得:cmd在繁體中文系統下只看得懂big5,只有cmd之下select資料庫有許功蓋的問題,因此只要將原始資料的反斜線去掉就可以在sqlyog顯示正常文字

2013年1月20日 星期日

寫程式開發工具

IDE:

eclipse:開發JSP跟Android分別用不同軟體,這樣比較不麻煩

linux安裝eclipse原則上抓下來之後解壓縮就可以用了
如果無法用那就是可能usr/bin/沒有java,javac,javaws給eclipse跑


netbeans:這是oracle官方發行的免費軟體,除錯功能不錯
開發JSP另外去官網抓javaEE版的netbean吧


記事本:
ultraedit:目前使用三十天試用版本,有字元轉碼的功能

nodpad:免費軟體。當初寫ns2還不錯用
HexEditor plug-in可以將文字以十六進位顯示

共用物件(兩物件變數參考到同一記憶體位置)


package javaoop;
class shirt
{
int price=2000;
char size='L';
    public void showDetails()
    {
    System.out.println(price);
    System.out.println(size);
    }
}

public class javaoop {
 public static void main(String[] args) {
  shirt myshirt = new shirt();
     shirt yourshirt = new shirt();
     myshirt.showDetails();
     myshirt = yourshirt;//myshirt與yourshirt參考到同一物件記憶體位置。
//myshirt的記憶體位址變成yourshirt記憶體位址一樣,此時myshirt與yourshirt共用物件,不是個別獨立物件。比喻:我家跟你家是同一棟房子
     yourshirt.price = 4000;//你家東西變動
     yourshirt.size='r';
     myshirt.showDetails();//因為你我兩家在同一地方,我家東西也跟著變動

 }
}

overloading多載

overloading中文稱作多載
定義:在相同類別下,宣告名稱相同的method或者建構子,但是參數的個數與參數的型態不同。呼叫method時候java根據串入的引數呼叫對應的method。

進行method多載時,參數的數量或參數型態其中一個項目一定要不同。
只有傳回值型態不同或存取權限修飾詞不一樣,java仍然無法判斷要呼叫哪個method執行。

public int setAge(int age){}
public void setAge(int age){}
setAge只有傳回值型態不同,java無法判斷要執行哪個setAge......

以下實作建構子的多載以及method的多載,
宣告一個類別名字是multipulator,建構子名稱必須跟類別名字一樣。


package overlaoding;
class multipulator{
 public multipulator(){//沒有引數的建構子
 System.out.println("Good bye world");
 }

 public multipulator(int x, int y){

//兩個整數引數的建構子
 System.out.println(x*y);
 System.out.println("int");
 }
 public multipulator(int x, int y,int z){

//三個整數引數的建構子
 System.out.println(x*y*z);
 System.out.println("there are three variable");
 }

 public multipulator(int... x){
//若超過三個引數的話會呼叫這個
 for(int i =0;i<x.length;i++){

//x被當作陣列,x存記憶體位止
 System.out.println(x[i]);
 }

 System.out.println("there are many variables you input");
 }


 public multipulator(double x,double y)
 //兩個雙倍精確浮點引數的建構子
 {
  System.out.println(x*y);
 System.out.println("double");
 }
  }
public class overloading {

    public  void Calculator(int x,int y)
//兩個整數引數的method
    {
    System.out.println(x+y);
    System.out.println("Calculator method int");
    }
    public  void Calculator(double x,double y){

//兩個double型態引數的method
        System.out.println(x+y);

    System.out.println("Calculator method double");
    }
   
    public static void main(String[] args) {
        overloading obj4 =new overloading();
       obj4.Calculator(11111,33333);

//印出44444 Calculator method int      
obj4.Calculator(118.22,11.88 );
//130.1印出Calculator method double    
multipulator ninenine = new multipulator(123,112,11,426);
//印出there are many variables you input   
  multipulator obj2 = new multipulator();
//印出Good bye world    
 multipulator obj3 = new multipulator(11.33,118.66);
//印出double
    }

}

物件之間的關西

public class MyDate {
  private int day;
  private int month;
  private int year;
  public MyDate(int day, int month, int year) {
    this.day   = day;
    this.month = month;
    this.year  = year;
  }
  public MyDate(MyDate date) {
    this.day   = date.day;
    this.month = date.month;
    this.year  = date.year;
  }
  public int getDay() {
    return day;
  }
  public void setDay(int day) {
    this.day = day;
  }
  public MyDate addDays(int more_days)
  {
    MyDate new_date = new MyDate(this);
    new_date.day = new_date.day + more_days;
    // Not Yet Implemented: wrap around code...
    return new_date;
  }
 
  public String toString() {
    return "" + day + "-" + month + "-" + year;
  }
}

this 的用法

之前一值無法了解this表示什麼意思,只知道在C++裏頭this是指向物件的指標。

當run程式時,執行到this這行時候,this指向現在正在執行的物件。

 
package this_use;

public class this_use {
    int day= 32;
    int month = 13;

    public void cal(int day,int month)
    {
        day=1003;
//day屬於cal的區域變數,main的地方會印出32
        month =2332222;
//在main的地方會印出13
  //  this.day =100;
//當跑程式時this表示obj1,代表外頭的那一個day(class 底下的那個day),main的地方會印出100。

   this.month= 22222;
//代表class底下的那個monty,main的地方會印出22222
        System.out.println(day);//印1003
    System.out.println(month);//印2332222
注意:this.month同等於this_use.this.month

    }
   
   
    public static void main(String[] args) {
      
 this_use obj1 = new this_use();
            obj1.cal(11,22);
    System.out.println(obj1.day);//印出32,this註解拿掉會印100
    System.out.println(obj1.month);//印出13,this註解拿掉會印22222

   
    }

}


2.當類別有兩個以上的建構式時,
我們可以在其中一個建構式裡用this()來呼叫其他的建構式。this()一定要寫在建構式內第一行位置。
據說這種好處是可以省下不少coding時間。

3.

2013年1月19日 星期六

全域變數vs區域變數

static 只能放在類別層級

package variableScope;//相當於folder/subfolder路徑,必須放在程式碼第一行


public class variableScope {
    int i =1; //instance,全域變數
    static int j=3;//static
    public static void kkk(int k)
    {
//    variableScope obj2 = new variableScope();
        int l=1;//local
    //System.out.println("j is "+j);
    //System.out.println(i);//error, must declare a object
   // System.out.println("k is"+k);
    }
   
   
   
    public static void main(String[] args) {
        //variableScope obj = new variableScope();
   //     System.out.println(i);//error, must declare object
        System.out.println(variableScope.j);
        System.out.println("no . class"+j);
      //   System.out.println(k);//error,can not find local variable k
       //   System.out.println(l);//as above
  //      kkk(3)
       
       
    }
}

2013年1月18日 星期五

M$SQL2008備份與還原

SQLsever完整備份時不會停止使用者交易紀錄

備份有三種類型

完整備份
會備份資料檔(.mdf)與交易記錄檔(.ldf)也就是log檔案
做差異備份或交易紀錄備份之前,一定要做一次完整備份


差異備份
只會備份資料檔.mdf,只會備份上次完整備份到現在這段時間所異動的資料
名稱典故:備份當下的資料檔與最近一次完整備份資料內容做差異比對而來

交易記錄檔備份
只會備份交易紀錄檔(.ldf)

若透過 (sql server management studio)SSMS 操作,在預設的情況下會自動截斷交易記錄
交易記錄備份的 紀錄序號 (LSN) 是從資料庫建立開始就一直連貫的

2013年1月17日 星期四

express版本無法啟動sql server agent

目前無解,去dream spark下載complete版本吧。
我原本想要用報表功能。
開啟組態管理員,裡面SQL server服務的項目顯示"遠端程序呼叫失敗",無法看到服務項目諸如SQL Server browser以及SQL Server Agent.......,那麼去windows的"服務",裡面就會有SQL server相關的服務項目。其中啟動sql server agent時候出現了"在本機電腦的SQL server Agent 服務已啟動又停止,有些服務如果並未由其他服務或程式使用,會自動停止"

查到的訊息是說express板不支援agent功能
為何不支援agent功能卻還有agent相關套件占硬碟空間呢?因為開發工程是團隊溝通的問題,發行express版本時手滑將agent一併附上去啦

HTML框架與表單

將網頁分割成好幾小塊,大致上有三種
<frameset>、<table>、<div>
現在比較流行的是<div>

framset以網頁為單位來做網頁分割。
組成要素:一個主要網頁裡面由多個網頁檔案所構成,比方說一個網頁分成左右兩半。乍看之下眼前是一個網頁被分兩半,其實眼前是有三個網頁。左右各一個網頁,還有一個網頁主要功能就是讓前面兩個網頁放置的

<table>:在網頁上以表格方式呈現資料
屬性有 border,0表示無邊,1表示有邊。
畫table的列用<tr>
畫table的格子用<td>或<th>,先有<tr>才有<td>或<th>
<th>通常放在第一個<tr></tr>標籤之中,作為table header。被<th>包住的文字預設置中與粗體




表單form:

MSSQL帳戶存取權限設定


設定權限有三個部分
第一部分設定使用者能否連線到DB server
可連線到DB server不代表可以存取資料庫
好比路人可以去某公司的大廳,但不能去任何一個部門
操作方法:打開sql server在伺服器(第一層)的"安全性"→登入→右健新增登入→一般→點搜尋,新增使用者帳號或某個群組。
(新增的帳號來源是由OS的控制台帳戶管理或者電腦管理裡面的帳號清單。)


第二部分設定使用者能否連到server裡面的database。
這階段設定好不代表使用者可以針對database作交易處理(select update ....等等),好比學生參觀企業可以進去企業某部門,但是不能動用部門裡的電腦。
操作方法:去某個資料庫(也就是想開放使用者連線的DB)底下的"安全性"→使用者→右健新增使用者(打上輸入名稱、設定登入名稱,其餘不用做啥)。


第三部分:設定rule,讓使用者可以針對資料庫進行交易指令,
做法:腳色→新增資料庫角色→打上角色名稱以及擁有者(我打detective,dbo)
→將conan加入→確定。
接著在detective右健→屬性→安全性實體→搜尋→下列類型所有物件→結構描述打勾→選取名稱為dbo的結構描述(我選錯結構描述,選到db_accessadmin的結構描述,難怪conan一直無法select)→權限那欄有很多項目分別表示針對資料庫各種操作,我在這裡把"選取"的"授與"打勾。如此一來conan可以針對此資料庫下select指令

用指令更改權限
語法是:grant/revoke select/update/alter/delete/drop on 物件 to user/group

以上當然可以在圖形化操作完之後叫MSSQL產生指令


ps:關於gusest目前還搞不清楚
伺服器底下"安全性"的"登入"項目沒有guest
但是各個資料庫底下安全性的登入卻有guest。
且啟動guest的權限好像只能用指令去啟動。
左上角有個下拉選單選取資料庫後
下grant connect to guest指令
卸除也是如此
revoke connect from guest

在M$官網找了一下寫道:
雖然您不能卸除 guest 使用者,但是可以在 master、tempdb 或 msdb 以外的任何資料庫中執行 REVOKE CONNECT FROM GUEST 來撤銷其 CONNECT 權限,以停用 guest 使用者。

兩台以上資料庫sever模擬環境

首先去SQL組態工具→SQL組態管理員→SQL server網路組態→MSSQL通訊協定→啟用TCP/IP(裡面有通訊埠號,其他電腦可藉由ip與埠號連接server DB,裡面有很多網卡將"已啟用"項目設定為是)。
接著SQL組態工具→SQL組態管理員→SQL server服務→重啟SQL server(MSSQL server)。
接著在SQL browser右健內容將啟動模式設定為自動,之後重啟
如此一來其他電腦想連到本資料庫不用輸入埠號也可以連到DB

(win7可以去控制台→系統管理工具→找到電腦管理,不過我win7版本不能使用群組原則管理,只採用新增使用者帳戶來練習權限了,新增一個conan的帳戶)


設定權限有三個部分
第一部分設定使用者能否連線到DB server
可連線到DB server不代表可以存取資料庫
好比路人可以去某公司的大廳,但不能去任何一個部門
操作方法:打開sql server在伺服器(第一層)的"安全性"→登入→右健新增登入→一般→點搜尋,新增使用者帳號或某個群組。
(新增的帳號來源是由OS的控制台帳戶管理或者電腦管理裡面的帳號清單。)


第二部分設定使用者能否連到server裡面的database。
這階段設定好不代表使用者可以針對database作交易處理(select update ....等等),好比學生參觀企業可以進去企業某部門,但是不能動用部門裡的電腦。
操作方法:去某個資料庫(也就是想開放使用者連線的DB)底下的"安全性"→使用者→右健新增使用者(打上輸入名稱、設定登入名稱,其餘不用做啥)。


第三部分:設定rule,讓使用者可以針對資料庫進行交易指令,
做法:腳色→新增資料庫角色→打上角色名稱以及擁有者(我打detective,dbo)
→將conan加入→確定。
接著在detective右健→屬性→安全性實體→搜尋→下列類型所有物件→結構描述打勾→選取名稱為dbo的結構描述→權限那欄有很多項目分別表示針對資料庫各種操作,我在這裡把"選取"的"授與"打勾。如此一來conan可以針對此資料庫下select指令

用指令更改權限
語法是:grant/revoke  select/update/alter/delete/drop on 物件 to user/group

以上當然可以在圖形化操作完之後叫MSSQL產生指令



2013年1月16日 星期三

列印數字金字塔?



create procedure number_triangle
@number int
AS

declare @num int =@number
declare @i int =1 --1st while index
declare @j int  --2nd while index
declare @k int  --3rd while index
declare @L int  --4rd while index
while @i<=@num
begin
 declare @result varchar(1000)= null
 set @j = 1
 set @L = @i
 set @k = 1
--印左邊數字
 while @j<=@i
 begin
  if @result is null
  set @result = (select CONVERT(varchar(20),@j))
  else
  set @result = @result+(select Convert(varchar(20), @j))

 set @j = @j +1
 end
--印中間空白字元
 if @i<10
 begin
  while @k <=(@num-@i+@num-9)*2
  begin
  set @result = @result+' '
  set @k = @k+1
  end
 end
 else
 begin
  while @k <=(@num-@i)*4
  begin
  set @result = @result+' '
  set @k = @k+1
  end
 end
--印右邊數字
 while @L >=1
 begin
  set @result = @result +(select Convert(varchar(20), @L))
  set @L = @L -1
 end

print @result
set @i = @i +1
end
GO
exec number_triangle 9
exec number_triangle 10
exec number_triangle 99

明牌出現頻率機

題目:將某段期間開出的號碼由最舊到最新的排列為原始資料
希望可以秀出開獎號碼由最近出現的排到更早出現的順序




declare @length int = (select LEN('277854130636666023097111131915'))
--計算近期開獎號碼字串長度
declare @i int = @length
declare @result varchar(10)
declare @char varchar(1)
--set @char = substring('277854130636666023097111131915',30,1)
--print @char
--select @result
while @i>0
begin
set @char = substring('277854130636666023097111131915',@i,1)
--print @char
if ((select charIndex(@char, @result)) is null )
begin
set @result = @char
--print @char
end
if ((select charIndex(@char, @result)) = 0 )
begin
set @result = @result+@char
--print @char
end
--print substring('277854130636666023097111131915',@i,1)
set @i = @i - 1
end
print @result

2013年1月15日 星期二

Java陣列

一維陣列: 用一個名稱表示多個相同型態的資料
語法:型態[] 陣列名稱 = new 型態[大小]

int[] num = new int[3];

語法跟用類別宣告物件一樣, human Jhon =  new human(175);
使用int[]這個類別,宣告num變數名稱稱之為陣列變數,new表示配置記憶體,int[3]有點像呼叫建構子初始化之。其實int[3]時候系統已經預設初始化了,int初始值為0

num是陣列變數,儲存記憶體位址指向陣列內容,

int[] num = new int[3]
這句話意思是在記憶體配置三個空間,這三個記憶體空間java會分別給預設值為零。我們稱為陣列內容,然後num參考到這陣列內容的起始位址。


既有的陣列資料指定給另一個陣列變數的真諦
int[] array;
array=num;
將陣列變數指定給另一個陣列變數,這時array跟num的陣列內容是一樣的

要注意的是,這不是表示同時存在兩個陣列,而是有兩個陣列變數參考到同一份陣列內容。因此其中一方的陣列內容改變,另一個陣列變數的陣列內容也會跟著改。


陣列變數是參照型的變數

陣列大小:陣列變數名稱.length。num.length

二為陣列:多個一維陣列集合在一起
int[][] data = new int[2][4];
表示有兩個大小為四的一陣列

在二維陣列裏
data.length代表一維陣列的個數(列數)
data[].length表示某列的資料個數

Select基本用法

本語法以MSSQL為主
select 基本功能:從資料表單截取使用者想要看的資料
一、基本語法
Select 想要的欄位(描述想要哪些欄位colunm資料) from 那個資料表單 where 篩選條件(描述哪些列row的資料)

例如: select * from studetnt_table where ID like "M99%"
從學生資料表單調出學號碼M99的學生資料

二、排序資料:order by
order by [欄位1,欄位2][Desc Asc]
Desc 由大到小(descend),英文字母由Z到A
Asc 由小到大(ascend),英文字母由A到Z
例如 order by Student_ID,height Desc
先以學號由大到小排序後接著再以身高由大到小排序


三、篩選條件:where子句
where 用法:
1.比較型:比較大小或比較字串。
比方抓出學號大於一百的學生資料
select studentID from student_table where StudentID>100
或者抓出住在台北的學生資料
select * from student_table where city ='Taipei'
//如果不加上單引號,會誤以為Taipei是欄位

2.樣式比較型:抓出某欄位含有XX字串的資料。
where 欄位 like '字串%'
例如:抓出姓曹的學生資料
select * from student_table where name like '曹%'
where 欄位 like '%字串%'
例如:抓出地址中住在中正路的學生資料
select * from student_table where address like'%中正路%'

例如:抓出名稱A或B開頭的顧客資料
select * from customers where customerid like '[AB]%';

例如:抓出名稱為A到D開頭的顧客資料
select * form customers where customerid like '[A-D]%'


3.區間型:指定一欄位,抓取某範圍的學生資料。
where 欄位 between 數字 and 數字2
例如:抓取身高介於165到175公分學生資料
select * from student_table where height between 165 and 175
(上述語法會抓出含身高165、175的學生資料)

4.列舉型:指定一欄位,列出多個項目,抓取欄位符合項目的學生資料
where 欄位 in (''值1,'值2','值3')
例如:抓出住在台北與台中的學生資料
select * from student_table where city in ('taipei','taichung')

抓取欄位值為null的資料
select * from student_table where tele is null
(null表示不知道的概念所以用is,用=表示指定一個value給DBsystem)



四、分組group by:
針對欄位值的種類,個別作函式運算:select 函式(欄位1) from table_name group by 欄位1[,欄位2];
例如:我想知道來自各縣市的學生有多少人
select COUNT(country) from students group by Country;


切記:select子句欄位列表必須是函數或者是group by後面的欄位

五、彙總函數篩選條件:having
我們常常會找平均大於某某數的資料,利用彙總函數avg()求算之後無法用"where function(欄位)>數值"來過濾。
彙總函數的條件篩選不能用where來達成。

因此必須用having function(欄位)>數值,過濾資料
不可寫在group by 之前
having常常跟彙總函數、group by其中之一或兩者搭配



欄位出現在group by後面,才可以出現在having 後面
select ProductName from Products group by ProductName having productname like 'A%'    ;

六、select一些眉角:



1.對於某一欄位,列出所有的值域(項目):distinct
例如我們想知道學生來自哪些城市
select distinct city from student_table
(上面語法會列出學生居住的城市,我們可以知道學生來自哪些城市)
(也可以用group by,select city from student_table group by city)


2.字串串接:字串相加之後另闢欄位名稱
select firstname,lastname,'identification number:' + convert(varchar(2),emplyeeid) as ID from employees

3.欄位之間可以運算後select成新欄位。
select (AwayScore+ HomeScore)as total,* from Game where (AwayScore+HomeScore)>10
注意的事情:指令運算期間必須參考原始屬性欄位名稱,例如以下指令:
select(AwayScore+ HomeScore)as total,* from Game where total >10
M$SQL表示....:無效的資料行名稱 'total'。

4.變數型態轉換:convert(資料型態,欄位)
以下例子將整數型態轉成money型態,select出的值有小數點
select (AwayScore/CONVERT(money,homescore)) as total,* from Game
where HomeScore > 0 and (AwayScore/HomeScore) > 10

亦或者在欄位後面*1.0也可以,但是最好不要用這個方式

5.
5.1
只列出前幾項的紀錄:top 數字
例如:列出訂購量前五大的訂單明細
先列出所有訂單明細後,以訂購量由大到小排列,最後打上top 5
select top 5  * from [Order Details] order by Quantity  desc

5.2
如果有同樣訂購量情況
那麼在top 5後面加上with ties就會列出所有第五多的訂單
稱之為回傳增列跟邊界值相同的紀錄
select top 5 with ties * from [order details] order by quantity desc

5.3
列出前n百分比的紀錄select top n percent * from table order by field
例如:列出訂購量前百分之十二的訂單明細
select  top 12 percent with ties * from [Order Details] order by Quantity;





泡沫排序法 java

java的類別庫有提供快速排序法的method
首先在程式碼第一行
import java.util.Arrays;
宣告陣列 int [] a = {2,4,6,8,1,3,5,7};
呼叫method
public static void sort(int[] a);


以泡沫排序法將n筆數字由大到小排列

思考:

將第一個數字拿來與後面的數字比較,如果後面的數字比第一個數字大
那麼就將這兩個數字對調。比到最後一筆資料為止。表示一回合結束。
這邊設立一個key指向第二筆資料以及一個loop去執行一個回合的比較。
每個回合可以確保最大的數字調到最前端
因此至多執行n個回合資料就會排序完畢
因此設立一個key指向第一筆資料,一個回合結束key指向下一筆資料
當key指到最後一筆資料時代表排序結束


public class selection_sort
{
public static void main(String args[])
{
int[] num = {11,3,6,2,20,16,9};

for(int i=0;i<num.length;i++)//第i回合
{
 for(int j=i+1;j<num.length;j++)//一回合的比較
 {
int temp;
  if(num[j]>num[i])
  {
  temp = num[i];
  num[i]=num[j];
  num[j]=temp;
  }
 }
}
for(int i =0;i<num.length;i++)
{
System.out.print(num[i]+" ");
}
}
}

2013年1月14日 星期一

3n+1 problem by Java

這是ACM上面比較簡單的題目
程式功力尚須加強


import java.io.* ;
public class nnn1
{
 public static void main(String args[]) throws IOException
 {
  System.out.println("Please input a number:");
  BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  String str2 = br.readLine();
  String str1 = br.readLine();
  int small_num = Integer.parseInt(str2);
  int num = Integer.parseInt(str1);
  System.out.println(small_num+" "+num);
  int temp;
 int max_count =0;//紀錄最大運算次數
 if(small_num > num)//輸入數字大小順序對調皆可
 {
  temp = small_num;
  small_num = num;
  num = temp;
 }
// System.out.println(small_num+" "+num);

 for(int j=small_num;j<=num;j++)//每個數字的計算過程以及次數
 {
  int count =1;
  int number = j;

  System.out.println(number);
     do
     {
      //System.out.println(num);
      if ( number== 1 )
       {break;}
      if(number%2==1)
      {
      number = 3*number+1;
      }
      else
      {
      number = number/2;
      }
      count++; 
     }while(true);
   
 
  System.out.println("count is "+count);
 
if(count > max_count)
{
max_count = count;
}
  }//是forloop的大括號
  System.out.println("Max count is "+max_count);
 }
}

2013年1月10日 星期四

Java 雜碎觀念

紀錄練習java的過程吧!!!


1.印字串,以雙引號
System.out.println("123");

印字元,單引號,只能一個字
System.out.println('f');

或者反斜線與數字代表字元的編號(跳脫字元)
只有八進位跟十六近位表示方法
System.out.println('\7');八進位,執行結果是 "督"一聲
System.out.println('\u001f);十六進位,執行結果是"←"符號
印數值,不用引號
System.out.println(123);



2.變數宣告
宣告字元陣列
char[] array={'a','g','v','b','e',};



3.
3-1.值域大的數字無法指派給值域小的變數
int num;//整數
num = 3.14;//double浮點數
System.out.println(num);
以上會編譯錯誤
必須強制轉換型態(casting type)


3-2.
java的小數如果不加上F或f,java預設為double型態。
java的整數預設為int 型態,如果是長整數那麼要在數字後面加上L

4.switch-case只支援byte、short、int、char四種類型,不支援boolean條件判斷,switch-case如果沒有加上break,程式會正常執行下去不會編譯失敗。


5.int整數範圍是約正負20億

6.寫在method裡的變數宣告不可寫上存取權限(public private default)

7.java編譯器在編譯運算式時,採由右而左編譯,會將運算子跟運算元湊對。
像這樣的式子k=I+++++j;
++j湊一對、++無法跟運算元湊對,會產生bug。


8.產生java技術文件
在cmd 裡面打上
javadoc -d "文件存放路徑" [-author] [-vesion] XXX.java

如果要文件嵌入author與version那麼要在.java檔案裡面打如下文字,註解務必用/**為開頭
/**
@author YYP
@version 20130201
*/

像下面這行,在cmd打上作者與版本資訊是無效的...
javadoc -d "文件存放路徑" -author YYP -vesion 20130201 XXX.java     


9.隨機亂數
程式碼打上Math.random();
便會產生大於等於零小於一的亂數
型態為double。
如果要產生1~42的亂數,作後要作型態轉換
要寫這樣(int)(Math.random()*42+1)

10.


int num1=100 , num2-123;
System.out.println(num1/num2);
結果會印出零

double sum;
sum = num1/num2;
System.out.println(sum);
會印出0.0

2013年1月9日 星期三

HTML標籤

HTML語法由一堆tag標籤與屬性所構成,tag標籤長相:<xxxxx>。
每個標籤都有屬性。屬性主要描述被標籤包住的內容要怎樣在網頁上呈現
以下舉<table>標籤的例子:
<table border="1" bgcolor="#00FF00" ></table>
table是標籤在網頁上畫一張表格,border、bgcolor是屬性,分別表示表格線條與表格的背景顏色。


學習HTML,死背也背不完。每種標籤有不同的屬性。
只要了解HTML標籤屬性有哪些就好,不要刻意去背這些屬性用在哪標籤
常用屬性有id 、class 、style 、onclick、 lang(language)、title

lang:設定預設國家文字。zh,jp,en,de(德文)

title:設定提示文字。如果在標籤的屬性打上title="hahaha",那麼將滑鼠游標移動到該文字或物件上面,就會顯示hahaha。




1.<body></body>:網頁主體
例如:<body bgcolor="#ff00ff" background  text="green">...</body>
bgcolor、text是屬性
bgcolor:網頁背景顏色
background設定網頁背景圖片,要跟網頁在同一資料夾
text:文字顏色

HTML5已經將body屬性拿掉,也就是說變成單純的標籤



2.文字格式(太多標籤了,寫一些比較常用的吧!!未來趨勢將由CSS取代之)
粗體:<B>bold,  用在聯絡資訊
斜體:Italic <i>或<address>,address會順便換行
刪除字:<strike>。應該這樣寫
寫化學式,可用下標標籤<sub>H2SO4
寫指數方程式,可以用上標標籤<sup>:210=1024


3.<div></div>(division):估且用物件(區塊)標籤理解他吧,被div包住的文字圖片表格皆會被HTML是為一個物件,可以用屬性style改變文字顏色、或者onclick讓使用者點一下文字圖片表格,與網頁產生互動。div包住的程式碼在網頁秀出時會將旁邊的東西擠到上一行或下一行去,自己獨立成一行。

定義:

The <div> tag defines a division or a section in an HTML document.
The <div> tag is used to group block-elements to format them with CSS.
<span>
Tip: The <div> element is very often used together with CSS, to layout a web page.
Note: By default, browsers always place a line break before and after the <div> element. However, this can be changed with CSS.


4.註解:<!-- 00xx0x0x0x0xx0x0x0x -->

5.<head></head>:放特定標籤的地方。w3school是寫描述網頁資訊標籤的地方ex:<title>、<meta>、<script>。
<meta>:描述資料的資料的標籤。例如:charset="編碼種類"。charset="utf-8"表示網頁的字元採用unicode


6.<p>:分段。讓文字行與行之間,間距寬一點:每行用<p></p>包住就可以做出效果,<p>是將文章分段的標籤。讓文章與文章之間有個間距。

7.<blockquote>左右縮排。詩詞專用標籤,我們常常在小說看到的詩詞,寫法是將詩詞自成一個區塊,且並非從第一個空格開始寫。HTML也可以用<blockquote>表現這手法,如下
大風起兮雲飛揚
威加海內兮歸故鄉
安得猛士兮守四方
8.在網頁畫水平線可以用horizontal<hr color=#00ff00 align="50%" size="10">,
意思是畫個顏色為亮綠色的、長度占網頁長度一半,線條粗細為10的水平線。HTML5已經不支援,這個交給CSS辦了


 9.描述項目以及項目定義專用的標籤,字典的標籤。
格是跟我們念書在寫名詞定義的筆記一樣。
<DL>:Data List
<DT>:Data Term,必須寫在<DL></DL>之間
<DD>:Data Describe,必須寫在<DL></DL>之間
CSS
Cascading Style Sheets的縮寫,主要定義網頁的編排顯示特殊效果

10.跳脫字元、特殊字元。
&nbsp:意思是non-breaking space(不間斷空格),在網頁上印出空白字元
&quot:在網頁上印雙引號


11.<pre>:預先格式化。我覺得有了這個標籤,跟文章格式相關的標籤感覺是多餘的(像是<DL><P><blockquote>)。
要打一篇文章秀在網頁上。打在<pre>標籤中,網頁會忠實呈現使用者在coding時打文章的格式。


12.<font>:文字設定。其中屬性face設定字型。這部分在HTML5也變成交給CSS處理了
這是楷書

13.項目符號與編號 <ul><ol><li>,想要在網頁上呈現項目清單、條列式的效果,用這個標籤就對了。
<ul>:unorder list。資料秀出項目符號
<ol>:order list。資料秀出項目編號
<li>:list。資料項目,被<ul>或<ol>標籤包住
例如
<ul><li>資料項目1</li><li>資料項目2</li></ul>


資料庫大綱

SQL語法

select

where
order by
group by
having
join
union
subselect

update

delete

insert

虛擬表單View

索引(index)

建立資料庫

建立資料表

資料型態

建立規則、條件約束、檔案群組

設定資料圖表(設定table之間的關連)

cursor

trigger

transaction

T-SQL

安全控管

新增使用者 新增群組 設定帳號的權限
開放查詢更新刪除 alter database 與table

 

全文檢索

 

利用索引輔助鎖定

 

MySQL

安裝
設定項目
字元編碼設定
檢視資料庫結構、狀態
DDL(data definition language)
DML(data manipulator language)
資料庫引擎種類,功能,優缺點








database Index

緣起:從散亂的資料找尋想看的數據,需要將整個資料表看完才能找到想要的資料。如果將資料某些欄位排序或者分門別類後建立索引,要尋找就容易多了。

Index在db是一個schema物件。目的是使用索引路徑快速定位資料,並減少硬碟I/O次數。
index描述資料存放架構。



索引結構:SQL server以B-tree(blanced tree)結構來放索引資料,每個葉節點都是一個資料頁(data page)存放多筆資料,除了葉子節點外每個節點都是一個索引頁(index page)。每個資料頁大小為8k。
這邊資料頁好比資料表(data table)一小部分。

分成:叢集索引、非叢集索引



叢集索引?HEAP?:重建索引並編摘要表的過程
create clustered index PK_student on students(id)

非叢集索引:從原來索引建立新的索引摘要表
create nonclustered index idx-tel on students(tel)


scan 在沒有建立索引之下,動用select句子,sql server採用此方式讀取table每筆資料之後撈出資料
seek 建立索引後,server依照索引架構尋找資料


看查詢效能
下指令:set statistics io on

掃描計數 1,邏輯讀取 2,實體讀取 0,讀取前讀取 0,LOB 邏輯讀取 0,LOB 實體讀取 0,LOB 讀取前讀取 0。
邏輯讀取越小表示效能越好
-----------------實作include columns------------
use AdventureWorks
go

-- 建立示範專用的 DemoStore 資料表
select * into dbo.DemoStore from Sales.Store
go

-- 在沒有索引的情況下, 檢視下列指令的執行計畫
-- Hint: 資料表掃描(Table Scan)
Select CustomerID, Name
  from dbo.DemoStore
  where CustomerID = 150

查看邏輯讀取
邏輯讀取是讀取記憶體中的資料頁page次數
次數越少代表效能越好

資料表 'DemoStore'。掃描計數 1,邏輯讀取 102,實體讀取 0,讀取前讀取 0,LOB 邏輯讀取 0,LOB 實體讀取 0,LOB 讀取前讀取 0。

另外以下指令的效能也跟上面一樣
select * from dbo.DemoStore
(查出701筆資料)



-- 建立非叢集索引
Create nonclustered index idx_DemoStore
  on dbo.DemoStore(CustomerID)
go
-- 再次檢視下列指令的執行計畫
-- Hint: 同時使用索引搜尋"Index Seek" 與 RID查閱 "bookmark seek"


Select CustomerID, Name
  from dbo.DemoStore
  where CustomerID = 150

 -- 資料表 'DemoStore'。掃描計數 1,邏輯讀取 3,實體讀取 0,讀取前讀取 0,LOB 邏輯讀取 0,LOB 實體讀取 0,LOB 讀取前讀取 0。


-- 重建一次索引, 這次我們加上 include 選項
drop index idx_DemoStore on dbo.DemoStore
go
Create nonclustered index idx_DemoStore
  on dbo.DemoStore(CustomerID)
  include (Name)
go


-- 再次檢視下列指令的執行計畫
-- Hint: 這次只需索引搜尋"Index Seek"
Select CustomerID, Name
  from dbo.DemoStore
  where CustomerID = 150
go

--資料表 'DemoStore'。掃描計數 1,邏輯讀取 2,實體讀取 0,讀取前讀取 0,LOB 邏輯讀取 0,LOB 實體讀取 0,LOB 讀取前讀取 0。

-- 清除/還原 Lab 環境
drop table dbo.DemoStore
go


索引使用時機:
1.欄位所包含的值太廣
2.欄位包含大量空值
3.一個或多個欄位常常一起被使用於where子句或join
4.表格龐大,且大多數的select只截取不到2~4的資料列


不建議使用索引狀況:
1.欄位不常被select
2.表格常常update
3.表格較小,且大多數的select

2013年1月8日 星期二

Linux學習主旨0109

設置虛擬網站

更改預設登入網頁(index)

設定網路黑名單白名單

設定網頁登入帳號密碼

Vanet劇本檔產生器

除了SUMO跟MOVE可以模擬車子移動模式、產生移動劇本檔案之外,還有一套軟體(嚴格來說是一支可讓使用者更改的小程式)可以快速產生移動劇本檔,也就是產生TCL檔案,TCL程式碼可以直接在NS2使用。

這軟體由由南加州大學研究生Fan Bai, Narayanan Sadagopan, Ahmed Helmy於2004年用C語言撰寫而成

 在搜尋引擎打上IMPORTANT  MOBILITY GENERATORS in ns-2 simulator
等關鍵字應該可以找到Source code。

這套軟體可以模擬高速公路移動模式、曼哈頓(Manhattan)移動模式
可以更改source code任意更改模擬時間、車子速度、車子加速度
道路長度、線道數目。
非常方便


當時用這軟體花十幾分鐘就產生了三十個TCL檔案

view

view的定義:
利用實體table依照使用者需求,創造虛擬table稱之為view

例如: 資料表儲存學生的姓名、住址、電話、修課成績、興趣、生日
對老闆來說指對學生姓名住址修課成績電話有興趣,因此利用學生姓名、住址、修課成績、電話,創造虛擬表格。
j對男女朋友來說需要知道對方姓名住址電話興趣生日,因此利用這些欄位創造虛擬表格。




下面指令無法創造view
create view watchunitprice as
 (select  * from Products
order by UnitPrice )

加上top之後即可
這是M$系統設定的規則

2013年1月7日 星期一

BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT

BEGIN TRANSACTION
GO

ALTER TABLE dbo.Customers
ADD CONSTRAINT
 PK_Customers PRIMARY KEY CLUSTERED
 (
 CustomerID
 )
 WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO


ALTER TABLE dbo.Customers SET (LOCK_ESCALATION = TABLE)
GO

COMMIT

BEGIN TRANSACTION
GO
ALTER TABLE dbo.Orders ADD CONSTRAINT
 PK_Orders PRIMARY KEY CLUSTERED
 (
 OrderID
 ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO

ALTER TABLE dbo.Orders ADD CONSTRAINT
 FK_Orders_Customers FOREIGN KEY
 (
 CustomerID
 ) REFERENCES dbo.Customers
 (
 CustomerID
 ) ON UPDATE  CASCADE
  ON DELETE  NO ACTION
GO



ALTER TABLE dbo.Orders SET (LOCK_ESCALATION = TABLE)
GO
COMMIT



更新規則


讓您使用下列選項更新規則:
NO ACTION、CASCADE、SET NULL、SET Default
如果您指定 NO ACTION,SQL Server Compact 就會傳回錯誤,也會回復對於父資料表中受參考資料列的更新動作。
如果您指定 CASCADE 選項,而且在父資料表中更新對應的受參考資料列,就會在參考資料表中更新此資料列。
例如,資料庫中可能有 A 和 B 兩個資料表。資料表 A 具有資料表 B 的參考關聯性:A.ItemID 外部索引鍵會參考 B.ItemID 主索引鍵。
如果在資料表 B 中的資料列執行 UPDATE 陳述式,並且針對 A.ItemID 指定 ON UPDATE CASCADE 動作,SQL Server Compact 會檢查資料表 A 中是否有一個或多個相依資料列。如果有,則資料表 A 中的相依資料列會更新,而且所參考之資料表 B 中的資料列也會更新。

刪除規則


讓您使用下列選項刪除規則:
NO ACTION、CASCADE、SET NULL、SET Default
如果您指定 NO ACTION,SQL Server Compact 就會傳回錯誤,也會回復對於父資料表中受參考資料列的刪除動作。
如果您指定 CASCADE 選項,而且在父資料表中刪除對應的受參考資料列,就會在參考資料表中刪除此資料列。
例如,資料庫中可能有 A 和 B 兩個資料表。資料表 A 具有資料表 B 的參考關聯性:A.ItemID 外部索引鍵會參考 B.ItemID 主索引鍵。
如果在資料表 B 中的資料列上執行 UPDATE 陳述式,並且針對 A.ItemID 指定 ON UPDATE CASCADE 動作,SQL Server Compact 會檢查資料表 A 中是否有一個或多個相依資料列。如果有,則資料表 A 中的相依資料列會被刪除,而所參考之資料表 B 中的資料列也會被刪除。

型態轉換應用

byte b2= 123;
byte b3= 123;

下面這行會出現compiler error
因為246放不進去b3。
b3 = b3 + b2;

要寫成下面這樣才會編譯過去
b3 = (byte)(b3 + b2);

因為JAVA中涉及、byte,short,char型態的運算會將這些值轉換成int類型,然後int類型進行運算最後得到int型態結果。
所以b3 + b2運算時,java將b3,b2轉為int運算得出int結果,丟給byte的b3。






char+int會印出int

JAVA文件製作




指令:javadoc -d "指定文件路徑"  -author  -version  .java檔案

將目錄下的所有程式碼製成文件指令
javadoc *.java

注意:註解要讓系統寫成文件
寫法務必要如下
/**
第二支程式
@author YYP
*/
如果只打一個星號,系統不會將註解鑲嵌進去文件
/*
..................
*/

@author YYP少打@的話 系統不會自動加上作者欄位

2013年1月6日 星期日

MS建立資料庫

CREATE DATABASE [YYPDB] ON  PRIMARY
( NAME = N'YYPDB'(這邊的N表示字串採用Unicode), FILENAME = N'c:\Program Files\Microsoft SQL Server\MSSQL10_50.SQLEXPRESS\MSSQL\DATA\YYPDB.mdf' , SIZE = 10240KB , FILEGROWTH = 1024KB )


 LOG ON
( NAME = N'YYPDB_log', FILENAME = N'c:\Program Files\Microsoft SQL Server\MSSQL10_50.SQLEXPRESS\MSSQL\DATA\YYPDB_log.ldf' , SIZE = 2048KB , FILEGROWTH = 10%)
GO
ALTER DATABASE [YYPDB] SET COMPATIBILITY_LEVEL = 100
GO
ALTER DATABASE [YYPDB] SET ANSI_NULL_DEFAULT OFF
GO
ALTER DATABASE [YYPDB] SET ANSI_NULLS OFF
GO
ALTER DATABASE [YYPDB] SET ANSI_PADDING OFF
GO
ALTER DATABASE [YYPDB] SET ANSI_WARNINGS OFF
GO
ALTER DATABASE [YYPDB] SET ARITHABORT OFF
GO
ALTER DATABASE [YYPDB] SET AUTO_CLOSE OFF
GO
ALTER DATABASE [YYPDB] SET AUTO_CREATE_STATISTICS ON
GO
ALTER DATABASE [YYPDB] SET AUTO_SHRINK OFF
GO
ALTER DATABASE [YYPDB] SET AUTO_UPDATE_STATISTICS ON
GO
ALTER DATABASE [YYPDB] SET CURSOR_CLOSE_ON_COMMIT OFF
GO
ALTER DATABASE [YYPDB] SET CURSOR_DEFAULT  GLOBAL
GO
ALTER DATABASE [YYPDB] SET CONCAT_NULL_YIELDS_NULL OFF
GO
ALTER DATABASE [YYPDB] SET NUMERIC_ROUNDABORT OFF
GO
ALTER DATABASE [YYPDB] SET QUOTED_IDENTIFIER OFF
GO
ALTER DATABASE [YYPDB] SET RECURSIVE_TRIGGERS OFF
GO
ALTER DATABASE [YYPDB] SET  DISABLE_BROKER
GO
ALTER DATABASE [YYPDB] SET AUTO_UPDATE_STATISTICS_ASYNC OFF
GO
ALTER DATABASE [YYPDB] SET DATE_CORRELATION_OPTIMIZATION OFF
GO
ALTER DATABASE [YYPDB] SET PARAMETERIZATION SIMPLE
GO
ALTER DATABASE [YYPDB] SET  READ_WRITE
GO
ALTER DATABASE [YYPDB] SET RECOVERY SIMPLE
GO
ALTER DATABASE [YYPDB] SET  MULTI_USER
GO
ALTER DATABASE [YYPDB] SET PAGE_VERIFY CHECKSUM 
GO
USE [YYPDB]
GO
IF NOT EXISTS (SELECT name FROM sys.filegroups WHERE is_default=1 AND name = N'PRIMARY') ALTER DATABASE [YYPDB] MODIFY FILEGROUP [PRIMARY] DEFAULT
GO

2013年1月5日 星期六

舊筆電安裝Lubuntu12.04

用了八年的筆電
不知道是用了多年的關係
一直很lag

今天將舊筆電裝成linux系統
作業系統是Lubuntu 12.04
跑起來不會lag了
開機速度比win7快


系統規格如下:

型號:acer extensa 2600
cpu: intel celerson
RAM: 256 MB
硬碟容量:40G


之後試試看安裝
ubuntu 10.10 netbook
系統運作很lag
netbook介面看起來像是給平板電腦用的