Friday, February 27, 2015

昨夜没失眠

不知最近受了什么刺激,闲暇时间越来越喜欢自己一个人待着。独自玩玩游戏机,看看电影。

昨晚躺在床上,关着灯,听着秒针跳动的声音,心里不平静。

想到白天表哥发来姥爷过生日的照片,缺少移居上海的舅舅一家和我。看着照片中的姥爷,我好难过。曾经姥爷身体很好,但是一次大病,腿脚就不灵便了,情绪也容易激动,身边不能没人陪着,就算姥姥出去买菜,也要找人看着姥爷。可是姥姥的年龄也大了,耳朵不好,常常听不清我们在说什么。本来今年过年说要全家去海南玩,因为姥爷的身体不好,必须有医生的证明才能坐飞机,但哪个医生敢担保姥爷的身体能承受住气压变化和飞机的颠簸呢。大过年的,姥姥姥爷身边也就我爸妈和大舅一家人,我心里很不是滋味,下次全家团聚是什么时候呢?当哥哥发来全家福照片时,我忍不住留下了泪水。我真的希望他们远离病痛,健健康康的。

再说说其他的事情,这一周是第8周,离毕业还有两周。每天自己就一个人泡在图书馆做作业,享受在学校剩余的时光。最近听到一些别人的故事,有些讽刺却不乏感动。翻看几年前的日记,忆起自己那些年的故事,觉得自己毫无长进。时间能改变很多,却无法磨平一切。我一直不相信一见钟情也不相信天生一对,我只相信当时的感受。可是当热情褪去,剩下的是什么呢?责任么?我不敢想,我没有准备好。

想了那么多,幸好没失眠。生活中一定要有很多的无奈么?是我想的太多还是想要的太多?我感到深深的孤独,我希望别人能懂我,却连我自己都读不懂我自己。
read more ››

Thursday, February 26, 2015

PostgrSQL的backup和restore

今天做132的project有个小小的发现,

对当前以后的数据库备份有不少帮助。

以前总是用手动备份数据库,到另一台电脑上还要CREATE TABLE手动加数据。

project本身做起来颇为麻烦,若再因为备份和迁移伤神,岂不痛苦?

就找到了一个backup所有数据库信息和restore的方法。

看这里

backup的时候把后缀名改为.backup,在新机器中写好数据库名在tools中选restore刚才的.backup文件即可。
read more ››

Wednesday, February 25, 2015

CREATE VIEW

CREATE VIEW



今儿上课讲CREATE VIEW

PostgreSQL 8.1 中文文档

Schema

employee(ssn, name, salary, s_ssn, deptNo)
dept(dno, dname, address)

Naive SQL

[code language="sql"]
SELECT d.dname, max(e.salary) AS sal
FROM employee e, dept d
WHERE e.deptNo = d.dno
GROUP BY d.dno, d.dname
[/code]

Materialized View

[code language="sql"]
CREATE TABLE V (dno, sal)
populate table offline
INSERT INTO V (dno, sal)
SELECT e.depNo as dno, max(e.salary) as sal
FROM employee e
GROUP BY e.deptNo
[/code]

Get deptname

[code language="sql"]
SELECT d.dname, v.sal
FROM V v, dept d
WHERE v.dno = d.dno
[/code]

When update or delete...

If new employee has more salary that max salary?

Need to look into the base sql. second highest salary?

How to do better?

[code language="sql"]
CREATE TABLE V’(dno, maxSal, mSalCnt, secondSal, sSalCnt)
[/code]

To be continue..
read more ››

Monday, February 23, 2015

Precomputation and Materialized Views

今天132b上课讲DB的preocomputation。

Materialized Views



Wiki Page


 In computing, a materialized view is a database object that contains the results of a query. For example, it may be a local copy of data located remotely, or may be a subset of the rows and/or columns of a table or join result, or may be a summary based on aggregations of a table's data.The process of creating a materialized view is sometimes called materialization. It is sometimes described as a form of precomputation. As with other forms of precomputation, materialized views are typically created for performance reasons, i.e. as a form of optimization.

 In any database management system following the relational model, a view is a virtual table representing the result of a database query. Whenever a query or an update addresses an ordinary view's virtual table, the DBMS converts these into queries or updates against the underlying base tables. A materialized view takes a different approach in which the query result is cached as a concrete table that may be updated from the original base tables from time to time. This enables much more efficient access, at the cost of some data being potentially out-of-date.


What is the difference between Views and Materialized Views


 Materialized views are disk based and update periodically base upon the query definition.

Views are virtual only and run the query definition each time they are accessed.

 Also when you need performance on data that don't need to be up to date to the very second, materialized views are better, but your data will be older than in a standard view.


Precomputation



Precomputation是和Materialized View对应的。

[code language="sql"]

SELECT e.deptNo, max(salary) AS sal
FROM employee e, dept d
WHERE e.deptNo = d.dno
GROUP BY e.deptNo

[/code]

可先precompute

[code language="sql"]
CREATE TABLE Q’
INSERT INTO Q’
(
SELECT e.deptNo, max(salary) AS sal
FROM employee e, dept d
WHERE e.deptNo = d.dno
GROUP BY e.deptNo
)
[/code]

一些SQL巧用



text转时间



在数据库中我以text存储时间,但是这样不能直接比较时间大小,故寻得此法:

[code language="sql"]
SELECT *
FROM table
WHERE CAST(StartTime As Time) > CAST(EndTime As Time)
[/code]

感觉就是强制类型转换,将类似13:00的text转化为time。

SQL中的for循环



决定暂时不用for循环,for循环打算写在jsp里。我还有一些其他需求,基本也都找到了方法。

date BETWEEN



在数据库里我以text ‘YYYY-MM-DD’形式保存时间,但是遇到在两个时间区段取时间的问题。PostgreSQL可以照常使用BETWEEN来检查。

[code language="sql"]
SELECT *
FROM review
WHERE review_date BETWEEN '2014-01-01' AND '2014-03-01'
[/code]

get day of week



PostgreSQL内部也有取已知日期是星期几的功能。

[code language="sql"]

SELECT review_date, extract(dow from review_date::timestamp)
FROM review
WHERE review_date BETWEEN '2014-01-01' AND '2014-03-01'

[/code]

这么一来,我在review表里存的星期信息就多余了,还得改表。

Getting date list in a range in PostgreSQL



还有,给起点终点,我想取出一段连续的日期,如下。

[code language="sql"]

SELECT aval_date::date
FROM generate_series('2012-06-29',
'2012-07-03', '1 day'::interval) aval_date

[/code]

代码不难,我卡住了。我想把这个aval_date作为大SQL语句WHERE的一部分,结果愣是想不出怎么写。后来测试一下SELECT * 发现默认的attribute就是aval_date。这下直接去大SQL把WHERE中写成aval_date=...就行了。

这个review的available的date time的SQL算是写好了,可能对另一个题也有启发。继续!

Getting date list in a range in PostgreSQL

关于临时表



之前对TEMP TABLE的理解就是中间变量。后来Wizard告诉我,TEMP TABLE多用在建出来一个马上要访问很多次取结果的或者中间结果太大放不下内存的。看来需要改动一些,放在同一个query语句中会更好,就用nested query吧。

更新:目前nested query果然好用,不理temp table了!
read more ››

Thursday, February 19, 2015

PostgreSQL临时表(in progress)

以前上135时学过临时表,奈何忘了大半。现如今做132要用,现来回顾一下。


 临时表在会话结束时自动删除, 或者是(可选)在当前事务的结尾(参阅下面的 ON COMMIT)。 现有同名永久表在临时表存在期间在本会话过程中是不可见的, 除非它们是用模式修饰的名字引用的。 任何在临时表上创建的索引也都会自动删除。


PostgreSQL文档

PostgreSQL 8.1 中文文档

还在学习中,回头补充。

最近肯定要经常用temp table和trigger咯。

In Postgres, temporary tables are deleted when connection to the database is closed. Therefore, there is no need to drop the temporary table explicitly.

一直弄不清check
read more ››

Wednesday, February 18, 2015

CREATE TRIGGER

今天132B上学了点新东西,CREATE TRIGGER



[code language="sql"]CREATE [ CONSTRAINT ] TRIGGER name { BEFORE | AFTER |CREATE TRIGGER name { BEFORE | AFTER } { event [ OR ... ] }
ON table [ FOR [ EACH ] { ROW | STATEMENT } ]
EXECUTE PROCEDURE funcname ( arguments )
[/code]

name
赋予新触发器的名称。它必需和任何作用于同一表的触发器不同。

BEFORE
AFTER
决定该函数是在事件之前还是之后调用。

event
INSERT,DELETE 或 UPDATE 其中之一。 它声明击发触发器的事件。多个事件可以用 OR 声明。

table
触发器作用的表名称(可以用模式修饰)。

FOR EACH ROW
FOR EACH STATEMENT
这些选项声明触发器过程是否为触发器事件影响的每个行触发一次, 还是只为每条 SQL 语句触发一次。如果都没有声明, FOR EACH STATEMENT 是缺省。

funcname
一个用户提供的函数,它声明为不接受参数并且返回 trigger 类型。


 允许你为 "old" 和 "new" 行或者表定义别名,用于定义触发器的动作(也就是说, CREATE TRIGGER ... ON tablename REFERENCING OLD ROW AS somename NEW ROW AS othername ...)。


PostgeSQL触发器写法

> 一个触发器是一种声明,告诉数据库应该在执行特定的操作的时候执行特定的函数。触发器可以定义在一个 INSERT, UPDATE, DELETE 命令之前或者之后执行,要么是对每行执行一次,要么是对每条 SQL 语句执行一次。如果发生触发器事件,那么将在合适的时刻调用触发器函数以处理该事件。触发器函数必须在创建触发器之前,作为一个没有参数并且返回 trigger 类型的函数定义。触发器函数通过特殊的 TriggerData 结构接收其输入,而不是用普通的函数参数方式.


> PostgreSQL 提供按行按语句触发的触发器。按行触发的触发器函数为触发语句影响的每一行执行一次;按语句触发的触发器函数为每条触发语句执行一次,而不管影响的行数。特别是,一个影响零行的语句将仍然导致按语句触发的触发器执行。这两种类型的触发器有时候分别叫做行级触发器和语句级触发器。触发器还通常分成 before 触发器和 after 触发器。语句级别的"before"触发器通常在语句开始做任何事情之前触发,而语句级别的"after"触发器在语句结束时触发。行级别的"before"触发器在对特定行进行操作之前触发,而行级别的"after"触发器在语句结束的时候触发(但是在任何语句级别的"after"触发器之前)。


PS: 还是不是很明白,我再想想吧。

PPS: 今天project meeting让我也松懈不得啊。requirement一直在变,我除了想法子debug,还要满足需求。哎好累。

read more ››

Tuesday, February 17, 2015

MVVM和其他JS的学习笔记

MVC和MVVM





  • AngularJS与MVVM



  • 简单说来,view负责UI逻辑,viewModel负责表现逻辑和状态,model负责业务逻辑和数据。

    看图便知

    回调函数



    JS的callback一直弄不太清楚,选几个帖子看看吧。

    JavaScript - 回调函数

    知乎 - 回调函数(callback)是什么?


     回调函数并非是一种特殊类型的对象,其实就是普通的函数,但是被作为其他函数的参数传递,在某个时刻才会被选择性地使用。

     由于回调函数会在什么时候被执行,可能是不确定,甚至也可能永远不会被执行。而且在上面的这种情况下,这个回调函数甚至要在未来的某个时候才会执行,这就有了一个“异步”的感觉,也就是说代码不是从上到下依次执行,前面的代码执行完毕后面的才会执行。


    JSON to js object



    有两个eval()和JSON.parse()。

    [code language="javascript"]

    JSON.parse(text[, reviver]);

    [/code]

    js跳转页面方法



    js跳转页面方法

    我在用的是这个,

    [code language="javascript"]

    self.location='abc.html';

    [/code]

    感觉比较常用的是window.location.href()

    js的string里消除space或者hyphen



    remove hyphen

    比如消除hyphen(-), 用replace比较好。

    [code language="javascript"]
    var str="185-51-6 71";
    var newStr1 = str.replace(/-/g, ""); //hyphen
    var newStr2 = str.replace(/\s+/g, ''); //space
    [/code]

    "\s" is the regex for "whitespace", and "g" is the "global" flag, meaning match ALL \s (whitespaces)

    至于加号"+",这个会使转换更快。原因看这里difference between /\s/g and /\s+/g


     In the first regex, each space character is being replaced, character by character, with the empty string.

    In the second regex, each contiguous string of space characters is being replaced with the empty string because of the +.


    [code language="javascript"]
    var str = ' A B C D EF ';
    var a = new Date().getTime();
    console.log(str.replace(/\s/g, '#')); // ##A#B##C###D#EF#
    var b = new Date().getTime();
    console.log(str.replace(/\s+/g, '#')); // #A#B#C#D#EF#
    var c = new Date().getTime();
    console.log(b-a); // 8ms
    console.log(c-b); // 2ms
    [/code]

    Regex



    以上又引出了正则表达式,regex几天不看必忘。

    在这里简单复习下,




  • w3shool-JavaScript RegExp 对象



  • 用时再看吧。

    JS时间戳



    获取当前时间,

    [code language="javascript"]
    var a = new Date().getTime();
    [/code]

    好像没有直接从时间戳转到某个格式的日期时间,只能分别get到年,月这种。倒也无妨,自己写个function也可以。对于时间戳转换,w3school讲的比较清楚。
    read more ››

    Monday, February 16, 2015

    JS的事件监听

    事件监听

    setTimeout

    addEventListener vs onclick

    我想做一个点击某个按钮,变量开始每秒加一的事件。

    好多东西要学。
    read more ››

    Sunday, February 15, 2015

    毕业无望TAT

    又宅一下午图书馆,Project的要求好难啊。。求毕业!

    看到之前写的新学期任务清单,就差132B和毕设了。。好难好烦躁。

    每天宅着图书馆不知道能不能憋出来。132B的milestone3还没开始做。今晚开始做吧!

    AngularJS也好难。

    关于google chart,它的API比较强大。本来以为设置点击事件无望,看到google group有人提及一个方法,果然有效!


    • 问题描述:我想用getSelection()来获取点击的元素,不同于普通的geoChart,而是dashboard里的。结果单单用



    [code language="javascript"]geoChart.getSelection()[/code]

    不行,debug不出。


    • 解答 。因为在dashboard里,




     When using dashboards, you wrap the actual charts (the map, the table) in google.visualization.ChartWrapper instances.


    所以需要写成

    [code language="javascript"]geoChart.getChart().getSelection()[/code]



    Problem solved。我可以用它进行拓展了。

    接下来要把geochart的动态图实现了,搞了一天没弄成TAT。没有成就感!

    以后还需要学习AngularJS的$route。
    read more ››

    Saturday, February 14, 2015

    HTML5中的local storage

    最近做project发现一个非常神奇的东西 - local storage。


    HTML5 的local storage 是通过浏览器在本地存储的数据。


    这里讲解的比较清楚。

    [code language="javascript"]

    window.localStorage.name='yingyan'; // option1

    window.localStorage['name'] = 'yingyan'; //option2

    [/code]

    因为local storage有5M容量,而且没有保质期。基本能满足我们的大多数需求啦!

    这个Markdown网站DILLINGER  和快速学习mvc网站TodoMVC都用了local storage。

    用到了自己的project上真真省事不少。

    local storage搭配angularjs简直神器!

    顺带吐槽geo chart 对城市名的识别真是相当慢。还好有神队友帮我把城市名改成了经纬度,瞬间能刷出地址。不过看到地图上密密麻麻的点点,顿时食欲全无啊。
    read more ››

    Tuesday, February 10, 2015

    搞了一下午angularjs的date

    Date格式真是很讨厌的存在。

    在json里string要转成git。

    比如

    [code language="javascript"]

    string a = "2010-06-25T08:00:00.000Z";

    var milliseconds = Date.parse(a);

    var result =  new Date(milliseconds);

    [/code]

    这时result才是真正的date格式。

    搞了一下午,虽然进展太慢,好歹看出点成果。。
    read more ››

    Saturday, February 7, 2015

    驾照

    昨天驾照终于pass



    感谢



    第六次路考,终于在完全新路线+中途看到车祸堵车的情况下拿到了驾照。

    在此谢谢那个帅帅的华人考官,扣了5分,有一个是转向灯忘记复原。

    也谢谢liyang可爱的小车车助我一臂之力,超级好开。

    挂的经历



    之前每次挂都是critical error,每次都被考官提醒才知道不安全。虽然郁闷,不过长了不少经验教训。


    • 第一次路考,速度过低(40迈的地方我开到25迈)挂了。


    • 第二次路考,STOP SIGN停留过久(我跑神了),挂了。


    • 第三次路考,下坡忘记减速,挂了。


    • 第四次路考,变道没有看到盲点有车,挂了。


    • 第五次路考,右转入道在STOP SIGN处急着转弯没有看车,挂了。




    消费



    此次考驾照,共计消费


    37+37(笔试)+6+6(2,3次补考)+7+7(5,6次补考)+210(教练练车)=310刀


    还是比国内便宜一些。

    长舒一口气,终于不用练车,不用考笔试,不用在湾区考驾照了!
    read more ››

    Friday, February 6, 2015

    很烦!

    没有心思做作业。

    一天24个小时,我睡过去8小时,你睡过去8小时,

    还有几个小时你在吃饭出去玩,留给我几个小时?

    太自私了。
    read more ››