以下内容为个人配置笔记,仅供参考,请勿用于生产环境

mysql服务可以利用apt系统自动安装,不过由于后面的应用服务中定制化需求比较多在此还是选择手动下载源码安装。
1.下载源码
http://dev.mysql.com/downloads/mysql/#downloads去下载目前的稳定版本的source源码,我用的是5.1的版本,据说5.4的版本性能更bt,等有空试试。

#美国镜像
wget http://dev.mysql.com/get/Downloads/MySQL-5.1/mysql-5.1.45.tar.gz/from/http://mysql.llarian.net/
#台湾镜像
wget http://dev.mysql.com/get/Downloads/MySQL-5.1/mysql-5.1.45.tar.gz/from/http://mysql.ntu.edu.tw/

2.添加mysql用户和组:

sudo groupadd mysql -g 48
sudo useradd -g mysql mysql -u 48

48是我本地自动安装时添加的id编号,手动安装就自己指定一下好了,通常系统服务的id都在1000以下。

3.预备一些数据路径:

sudo mkdir -p /var/run/mysqld
sudo chown -R mysql /var/run/mysqld
sudo chmod -R g+wx /var/run/mysqld
#数据路径
sudo mkdir -p /data0/mysql0
sudo mkdir -p /data0/mysql0/data0
sudo mkdir -p /data0/mysql0/innodb
sudo chown -R mysql /data0/mysql0
sudo chmod -R g+wx /data0/mysql0

4.配置编译安装:

tar zxf mysql-5.1.45.tar.gz
cd mysql-5.1.45/
./configure --prefix=/usr/local/mysql --with-mysqld-user=mysql --includedir=/usr/local/include --libdir=/usr/local/lib --localstatedir=/var/run/mysqld --sysconfdir=/usr/local/mysql/etc --datadir=/data0/mysql0/data0 --with-unix-socket-path=/var/run/mysqld/mysqld.sock --with-mysqlmanager --with-charset=utf8 --with-collation=utf8_general_ci --with-extra-charsets=gbk,gb2312,utf8 --without-debug --with-client-ldflags=-all-static --with-mysqld-ldflags=-all-static --enable-assembler --with-pthread --enable-thread-safe-client --with-big-tables --enable-local-infile --with-embedded-server --with-plugins=all

在vps里最好加上配置参数
--with-low-memory
不需要innodb可以去掉 --with-plugins=all
配置完毕后,编译安装:

make
sudo make install

设定mysql的配置文件my.cnf

sudo mkdir -p /usr/local/mysql/etc
sudo cp support-files/my-medium.cnf /usr/local/mysql/etc/my.cnf

修改配置文件my.cnf,例如我本机的配置:

[client]
port            = 3306
socket          = /var/run/mysqld/mysqld.sock
[mysqld_safe]
socket          = /var/run/mysqld/mysqld.sock
nice            = 0
[mysqld]
port            = 3306
user            = mysql
socket          = /var/run/mysqld/mysqld.sock
pid-file        = /var/run/mysqld/mysqld.pid
datadir         = /data0/mysql0/data0
tmpdir          = /tmp
skip-external-locking
key_buffer_size = 8M
max_allowed_packet = 16M
table_cache = 64
sort_buffer_size = 512K
join_buffer_size = 128K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M
thread_stack            = 192K
thread_cache_size       = 10
thread_concurrency = 8

#log_slow_queries = ON
slow_query_log
#log_slow_queries=slow-log
slow_query_log_file=slow-log
long_query_time = 3

open_files_limit    = 600
back_log = 20
max_connections = 100
max_connect_errors = 200

myisam_max_sort_file_size = 10G
##myisam_max_extra_sort_file_size = 10G
myisam_repair_threads = 1
myisam_recover
bulk_insert_buffer_size = 2M
default_table_type = MyISAM
transaction_isolation = READ-UNCOMMITTED
tmp_table_size = 512K
max_heap_table_size = 32M

#query_cache_size = 0M
#query_cache_limit = 2M
#query_cache_min_res_unit = 2k
skip-innodb
##log_long_format
log-short-format

log-bin=mysql-bin

binlog_format=mixed
binlog_cache_size = 2M
max_binlog_cache_size = 4M
max_binlog_size = 512M
expire_logs_days = 7
server-id       = 1

binlog-ignore-db=mysql
binlog-ignore-db=information_schema
binlog-ignore-db=aclocal
binlog-ignore-db=test

innodb_data_home_dir = /data0/mysql0/innodb/
innodb_data_file_path = ibdata1:10M:autoextend
innodb_log_group_home_dir = /data0/mysql0/innodb/
innodb_buffer_pool_size = 16M
innodb_additional_mem_pool_size = 2M
innodb_log_file_size = 5M
innodb_log_buffer_size = 8M
innodb_flush_log_at_trx_commit = 1
innodb_lock_wait_timeout = 50

[mysqldump]
quick
max_allowed_packet = 16M

[mysql]
no-auto-rehash

[isamchk]
key_buffer = 20M
sort_buffer_size = 20M
read_buffer = 2M
write_buffer = 2M

[myisamchk]
key_buffer = 20M
sort_buffer_size = 20M
read_buffer = 2M
write_buffer = 2M

[mysqlhotcopy]
interactive-timeout

在etc配置路径下做个软链接:

sudo ln -s /usr/local/mysql/etc/my.cnf /etc/my.cnf

安装基本的数据库:

sudo scripts/mysql_install_db --datadir=/data0/mysql0/data0 --user=mysql

将启动脚本设定为系统服务:

sudo cp support-files/mysql.server /etc/init.d/mysqld
sudo vi /etc/init.d/mysqld

修改配置路径:
改为:

basedir=/usr/local/mysql
datadir=/data0/mysql0/data0

修改执行权限,安装为系统服务,启动服务:

sudo chmod a+x /etc/init.d/mysqld
sudo update-rc.d mysqld defaults
sudo /etc/init.d/mysqld start

如果你需要修改root密码:

/usr/local/mysql/bin/mysqladmin -u root password '123456'

将一些常用命令链接到系统路径:

sudo ln -s /usr/local/mysql/bin/mysql /usr/bin/
sudo ln -s /usr/local/mysql/bin/mysqldump /usr/bin/
sudo ln -s /usr/local/mysql/bin/mysqladmin /usr/bin/
sudo ln -s /usr/local/mysql/bin/mysql_config /usr/bin/

至此mysql服务基本安装完毕,console下直接输入mysql连接入本地mysql服务器
/etc/init.d/mysqld 可以启动(start),停止(stop),重启(restart)mysql服务。

, , ,

以下内容为个人配置笔记,仅供参考,请勿用于生产环境

vps系统的选型,个人选择的是ubuntu 9.10,其实网上更多的是CentOS,或者说RHEL的配置,个人而言对rpm的依赖关系有心理阴影,敝人用的桌面就是ubuntu的,习惯问题很重要,当然用debian也一样,apt绝对适合我这种懒人。
刚到手的vps基本上都是白纸一张需要自己精心调制。
基本环境的配置参考了TualatriX 的这篇配置略有出入。

1.新增一个日常用来管理的用户比如叫nick

adduser nick

2.将用户加入sudo组,并启用sudo功能

gpasswd -a username sudo

visudo在/etc/sudoers文件里root那行后面添加入你新加的管理:

root ALL=(ALL) ALL
nick ALL=(ALL) ALL

3.禁用root账户

passwd -l root

4.修改ubuntu的软件源
注意:你的主机在国外,用国外的源会更快而不是我们通常看到的国内的配置文章中所说的国内的源。
修改/etc/apt/sources.list:

sudo nano /etc/apt/sources.list

我的/etc/apt/sources.list的配置:

deb http://us.archive.ubuntu.com/ubuntu karmic main restricted universe multiverse
deb http://us.archive.ubuntu.com/ubuntu karmic-security main restricted universe multiverse
deb http://us.archive.ubuntu.com/ubuntu karmic-updates main restricted universe multiverse
deb http://us.archive.ubuntu.com/ubuntu karmic-proposed main restricted universe multiverse
deb http://us.archive.ubuntu.com/ubuntu karmic-backports main restricted universe multiverse
deb-src http://us.archive.ubuntu.com/ubuntu karmic main restricted universe multiverse
deb-src http://us.archive.ubuntu.com/ubuntu karmic-security main restricted universe multiverse
deb-src http://us.archive.ubuntu.com/ubuntu karmic-updates main restricted universe multiverse
deb-src http://us.archive.ubuntu.com/ubuntu karmic-proposed main restricted universe multiverse
deb-src http://us.archive.ubuntu.com/ubuntu karmic-backports main restricted universe multiverse

修改完后保存并更新本地软件源配置
sudo apt-get update
然后做本地软件更新:
sudo apt-get upgrade
sudo apt-get dist-upgrade

5.安装一些基本软件环境:
#安装一些Python、认证之类的软件包
sudo apt-get install ubuntu-minimal

#安装英文和中文环境,这步会产生locale
sudo apt-get install language-pack-en language-pack-zh

#安装bash的命令补全,vim编辑器以及screen和byobu这个很棒的screen profile
sudo apt-get install bash-completion nano vim ctags vim-doc vim-scripts screen byobu

#安装一些压缩解压缩软件
sudo apt-get install bzip2 unzip unrar p7zip

#安装基本的语言环境和开发包
sudo apt-get install perl python python-dev ruby ruby-dev sqlite sqlite3 openssl

#安装一些编译环境和开发包
sudo apt-get install gcc g++ make autoconf automake patch gdb libtool cpp build-essential libc6-dev libncurses-dev expat

#安装一些第三方类库的开发包,在后面如gd之类的环境安装时会用到
sudo apt-get install libbz2-dev libexpat1-dev libssl-dev libdb-dev libgmp3-dev

sudo apt-get install libcurl-dev
sudo apt-get install libcurl4-gnutls-dev

sudo apt-get install libpng12-dev
sudo apt-get install libxml2-dev
sudo apt-get install libjpeg-dev
sudo apt-get install libtiff-dev libfreetype6-dev libxslt1-dev
sudo apt-get install libssh-dev libssh2-1-dev
sudo apt-get install libpcre3-dev libpcre++-dev libssl-dev libgmp3-dev
sudo apt-get install libmhash-dev libmcrypt-dev libltdl7-dev mcrypt libiconv-hook-dev libsqlite-dev

#如果你需要git做源码管理:
sudo apt-get install git-core
#当然还有subversion:
sudo apt-get install subversion
#如果你需要mercurial做源码管理:
sudo apt-get install mercurial

#如果需要java环境:
sudo apt-get install sun-java6-jdk
#对系统默认的java解释器和javac编译器做选择设定:
sudo update-alternatives --config java
sudo update-alternatives --config javac
#编辑系统级别的环境变量:
sudo vi /etc/environment
#添加/修改设定:

CLASSPATH=.:/usr/lib/jvm/java-6-sun/lib
JAVA_HOME=/usr/lib/jvm/java-6-sun

#如果你有软件包需要ant编译处理:
sudo apt-get install ant
#编辑/etc/environment
#添加/修改设定:

CLASSPATH=.:/usr/lib/jvm/java-6-sun/lib:/usr/share/java/ant.jar

注意:/etc/environment中的设定是不允许变量引用的。

至此最最基本的程序语言环境就简单的搭建完毕了。下一步就是根据你的各种需要去搭建你的互联网应用需求了。

我的基本应用需求是php+mysql+nginx基本环境,支持perl,python,java,ruby,erlang等语言环境,可以利用周边的开源项目快速搭建应用服务群组的应用服务环境。
应用系统的数据环境计划安装在独立的挂载点上,/data0,将来数据迁移备份等也较轻松。

, , ,

不知不觉的新的一年又要开始了,国内的互联网环境经过tg一年的洗劫又进一步变的惨不忍睹,ccav,光腚总局,只要是个zf的关系户都想来蹂躏一把这个刚刚兴起的行业。
不堪烦扰,抛弃当初貌似很中国很美好的.cn域名(vaxiong.cn)在国外新注册了域名(axiong.me),不在把自己的咽喉放在别人的刀俎之下。
就域名本身而言,运营成本最低的还是越卖越便宜的.com域名,诸位被迫背井离乡的网友们买.com还是比较划算的,偶是没有满意的.com才买了.me的域名。个人注册而言godaddy,name.com都可以,
我们所有采购的标准就是:1.尊重人权、隐私, 2.不受第三方的影响力和胁迫,3.稳定实惠.

如果是仅仅拿来写写博客不推荐用vps,毕竟相对来说费用还是比较贵的。可以使用虚拟主机,推荐mt(media template) 或者hm(HostMonster)
如果您需要构建互联网应用平台,或者像我一样做开发的,找个业余的高级玩具,那可以使用vps.购买的话选择余地很多Linode.com(基于Xen),RapidXen.org(基于Xen),ramhost.us(基于OpenVZ)都可以。
所有的计划都停当后就是掏银子买米买vps了。
PS:
备案?,我当年也备过,折腾过一茬,去年又开始折腾了,又要实名又要复印件,反正就是只准州官放火不许百姓点灯,种种政策都是在构建他们自己的利益垄断壁垒。互联网本是个言论自由和个性舒展的地方,你用GFW屏蔽信息为自己遮羞,蒙蔽不明真相的群众,难道你不知道防民之口,甚于防川的道理么?本来我不想理这些事情,但是你们封code.google,封sourceforge,封python,我们本来只是做技术的,难道我们掌握先进的技术也要拜你伟大的允许所赐么?你们以为封了技术了就能愚民,就能让百姓不知道你到底做过哪些龌龊的事么,可恶之举,可笑之极。

, ,

新换的主题发现未登录的时候单体页面的排版有bug,检查了一下应该是comments的闭合问题。
查了一下模板的源码:登录段的没问题,未登录段的少了个div闭合标签。
代码在comments.php的146行左右:

修改前的:

<?php if ( get_option('comment_registration') && !$user_ID ) : ?>
<p>You must be <a href="<?php echo get_option('siteurl'); ?>/wp-login.php?redirect_to=<?php echo urlencode(get_permalink()); ?>">logged in</a> to post a comment.</p>
<?php else : ?>

修改后的:

<?php if ( get_option('comment_registration') && !$user_ID ) : ?>
<p>You must be <a href="<?php echo get_option('siteurl'); ?>/wp-login.php?redirect_to=<?php echo urlencode(get_permalink()); ?>">logged in</a> to post a comment.</p>
</div>
<?php else : ?>

比较杯具的是,需要把wp-super-cache生成的缓存给清理掉再来一边。

, ,

前言
在我们的日常web应用开发当中memcached可以算作是当今的标准开发配置了。相信memcache的基本原理大家也都了解过了,memcache虽然是分布式的应用服务,但分布的原则是由client端的api来决定的,api根据存储用的key以及已知的服务器列表,根据key的hash计算将指定的key存储到对应的服务器列表上。

基本的原理以及分布
在这里我们通常使用的方法是根据 key的hash值%服务器数取余数 的方法来决定当前这个key的内容发往哪一个服务器的。这里会涉及到一个hash算法的分布问题,哈希的原理用一句话解释就是两个集合间的映射关系函数,在我们通常的应用中基本上可以理解为 在集合A(任意字母数字等组合,此处为存储用的key)里的一条记录去查找集合B(如0-2^32)中的对应记录。(题外话:md5的碰撞或者说冲突其实就是发生在这里,也就是说多个A的记录映射到了同一个B的记录)

实际应用
显然在我们的应用中集合A的记录应该更均匀的分布在集合B的各个位置,这样才能尽量避免我们的数据被分布发送到单一的服务器上,在danga的memcached的原始版本(perl)中使用的是crc32的算法用java的实现写出来:
    private static int origCompatHashingAlg( String key ) {
        int hash    = 0;
        char[] cArr = key.toCharArray();

        for ( int i = 0; i < cArr.length; ++i ) {
            hash = (hash * 33) + cArr[i];
        }

        return hash;
    }
这里还有另一个改进版本的算法:
    private static int newCompatHashingAlg( String key ) {
        CRC32 checksum = new CRC32();
        checksum.update( key.getBytes() );
        int crc = (int) checksum.getValue();

        return (crc >> 16) & 0x7fff;
    }

分布率测试
有人做过测试,随机选择的key在服务器数量为5的时候所有key在服务器群组上的分布概率是:
origCompatHashingAlg:
0 10%
1 9%
2 60%
3 9%
4 9%

newCompatHashingAlg:
0 19%
1 19%
2 20%
3 20%
4 20%

显然使用旧的crc32算法会导致第三个memcached服务的负载更高,但使用新算法会让服务之间的负载更加均衡。
其他常用的hash算法还有FNV-1a Hash,RS Hash,JS Hash,PJW Hash,ELF Hash,AP Hash等等。有兴趣的童鞋可以查看这里:

http://www.partow.net/programming/hashfunctions/

http://hi.baidu.com/algorithms/blog/item/79caabee879ece2a2cf53440.html

小结
至此我们了解到了在我们的应用当中要做到尽量让我们的映射更加均匀分布,可以使服务的负载更加合理均衡。

新问题
但到目前为止我们依然面对了这样一个问题:就是服务实例本身发生变动的时候,导致服务列表变动从而会照成大量的cache数据请求会miss,几乎大部分数据会需要迁移到另外的服务实例上。这样在大型服务在线时,瞬时对后端数据库/硬盘照成的压力很可能导致整个服务的crash。

一致性哈希(Consistent Hashing)
在此我们采用了一种新的方式来解决问题,处理服务器的选择不再仅仅依赖key的hash本身而是将服务实例(节点)的配置也进行hash运算。

  1. 首先求出每个服务节点的hash,并将其配置到一个0~2^32的圆环(continuum)区间上。
  2. 其次使用同样的方法求出你所需要存储的key的hash,也将其配置到这个圆环(continuum)上。
  3. 然后从数据映射到的位置开始顺时针查找,将数据保存到找到的第一个服务节点上。如果超过2^32仍然找不到服务节点,就会保存到第一个memcached服务节点上。

整个数据的图例:


当增加服务节点时:

其他:只有在圆环上增加服务节点的位置为逆时针方向的第一个服务节点上的键会受到影响。

小结
一致性哈希算法最大程度的避免了key在服务节点列表上的重新分布,其他附带的改进就是有的一致性哈希算法还增加了虚拟服务节点的方法,也就是一个服务节点在环上有多个映射点,这样就能抑制分布不均匀,
最大限度地减小服务节点增减时的缓存重新分布。

应用
在memcached的实际应用,虽然官方的版本并不支持Consistent Hashing,但是已经有了现实的Consistent Hashing实现以及虚节点的实现,第一个实现的是last.fm(国外流行的音乐平台)开发的libketama,
其中调用的hash的部分的java版本的实现(基于md5):
    /**
     * Calculates the ketama hash value for a string
     * @param s
     * @return
     */
    public static Long md5HashingAlg(String key) {

        if(md5==null) {
            try {
                md5 = MessageDigest.getInstance("MD5");
            } catch (NoSuchAlgorithmException e) {
                log.error( "++++ no md5 algorythm found" );
                throw new IllegalStateException( "++++ no md5 algorythm found");            
            }
        }

        md5.reset();
        md5.update(key.getBytes());
        byte[] bKey = md5.digest();
        long res = ((long)(bKey[3]&0xFF) << 24) | ((long)(bKey[2]&0xFF) << 16) | ((long)(bKey[1]&0xFF) << 8) | (long)(bKey[0]&0xFF);
        return res;
    }
在一致性哈希的算法/策略环境中,按照测试来说时间和分布性都是综合来说比较让人满意的,参见:
http://www.javaeye.com/topic/346682

总结
在我们的web开发应用中的分布式缓存系统里哈希算法承担着系统架构上的关键点。
使用分布更合理的算法可以使得多个服务节点间的负载相对均衡,可以最大程度的避免资源的浪费以及服务器过载。
使用一致性哈希算法,可以最大程度的降低服务硬件环境变化带来的数据迁移代价和风险。
使用更合理的配置策略和算法可以使分布式缓存系统更加高效稳定的为我们整体的应用服务。

展望
一致性哈希的算法/策略来源于p2p网络,其实纵观p2p网络应用的场景,在许多地方与我们的应用有很多相似的地方,可以学习借鉴。
参考文章:
对等网络(P2P)中主流分布式哈希算法比较分析
http://www.ppcn.net/n3443c38.aspx

其他参考文章:
http://www.taiwanren.com/blog/article.asp?id=840
http://www.iwms.net/n923c43.aspx
http://tech.idv2.com/2008/07/24/memcached-004/

相关代码:
last.fm的ketama代码
http://static.last.fm/rj/ketama.tar.bz2

php版的Consistent Hashing实现:Flexihash
主页:
http://paul.annesley.cc/articles/2008/04/flexihash-consistent-hashing-php
google code上的代码主页:
http://code.google.com/p/flexihash/
现在已经移居到github上了:
http://github.com/pda/flexihash/

, ,

web系统缓存结构简单介绍 https://docs.google.com/Doc?id=ajgj4rnwkrbz_19qh6mjqm8

作者: 阿熊

本文按照创作共用-署名2.5中国大陆许可发布


现有系统开发中很多时候我们的开发需要用到持久化的对象数据,
在日常的开发当中这一层面往往不是依靠语言本身而是依靠外部程序RDBMS即关系型数据库来解决对象存储的问题。
在开发当中一般的流程是通过各种配置本地语言的数据库客户端Api实现,获取与RDBMS系统的联系并按照规则取出对象数据并转换为本地对象做进一步处理。

Read the rest of this entry »

, , ,

工作中遇到需要文字转拼音的东东,每次找库太麻烦,网上搜索了一下貌似这个Smart Pinyin Slug不错 改写了一下门头,自己用。

支持cli/CGI/mod_php等模式也可以为include调用返回,或者修改$pycv_varname为空NULL后仅做为调用类。
其实自己的代码只是wrapper,其中分析http头的charset比较有意思。

下载 @box.net

Read the rest of this entry »

, ,

最近一段时间同事在做一些貌似很无语的工作,恰巧自己又猛推jQuery鸟,所以就写个jQuery在GreaseMonkey插件下的脚本模板,支持自动执行与手动执行,当然想改也有很多方法,代码很简单,另存到本地后改改就可以在各个页面上用jQuery兴风作浪了,哈哈。
justdoit.user.js
下载:@box.net
源码中http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js 可以替换为其他的代码下载地址。
要编写的业务逻辑请在vaxiong_doMyStuff函数对象中编写。
用你自己的业务逻辑替换掉jQuery("body").append('<pre>Hello World!</pre>');这部分代码。
手工执行代码的话请在页面右下角出现[Just Do it!]的链接后点击执行。

window.vaxiong_doMyStuff=function(e){
	try{
	//Just remove the next line and write your code below.

		jQuery("body").append('<pre>Hello World!</pre>'); // remove this line of code.

	}catch (ex){
		alert(ex);
	}
	if(e){ e.preventDefault();}
	return false;
}

,

我们知道在分布式存储时一定会用到多台机器节点分配,这个时候总体上有两种策略:1通过hash散列算法把数据尽可能均匀的分配到已知的节点里去,2通过全局表自然增长的数据方式来实现。其中全局表的方式不用表述,hash表的方法相对来说较有意思,

memcache的client端原生实现是perl Hash,这里只有php版的实现:

function hashfunc ($key)
{
$hash = 0;
for ($i=0; $i<strlen($key); $i++)
{
$hash = $hash*33 + ord($key[$i]);
}

return $hash;
}
另外在php的客户端里还有一种比较简单的crc32的方法:
sprintf("%u",crc32($key));
今天搜东东的时候偶然发现了有人在memcached的mail list 里给了另一种据说分布更均匀效率更高的算法貌似不错,memcache不用自己别的地方倒是可以试试。
用的是位移的方法:
(crc32($key)>>16)&0x7fff;
按照作者的测试这个方式的分布概率和效率都比perl Hash要好,原文:

http://lists.danga.com/pipermail/memcached/2004-June/000664.html

mark 一下,之前有看到还有一种hash的实现存了下来,结果重装系统代码给丢了,残念~~

, ,

9

走出孤独-我们俩

晚饭过后,休息的时间本想浏览一下电视新闻就重回电脑旁,不觉中翻到了cctv6电影频道,在放这部电影《我们俩》,不知为何cctv冗长的插播广告都没能将我驱赶走却一看到底。

电影的场景只是一个很普通的老北京的四合院里,开始看的时候老太太已经和小马为了电话机较上了劲了,很快从对话中了解到了她们的租住关系,老太太的精明和算计让小马无所适从,年轻倔强的她又和老太太一次谈判妥协争吵再谈判。

接着看到故事中小马与老太太斗法,小马拉电话分机线,老太太想办法掐掉,再拉再掐,小马想用老太太的冰箱,老太太就敲诈她要帮她买一条她爱吃的鲤鱼,冬季小马的小屋没有暖炉想要从老太太那借一个,但没等开口老太太就搪塞过去了,她只得自己偷偷去买了个电暖器用。

看到这里我想我已经明白了导演所需要表达的想法,老人的故意为难,为鸡毛蒜皮的小事争吵,锱铢必究其实并不在事本身而是害怕平淡和孤独。

Read the rest of this entry »

,

Switch to our mobile site