又要说再见
- October 12th, 2010
- Write comment
上周早上醒来 天气无比的好 史蒂芬童鞋在gtalk上呼叫
11点决定去Isle of Arran, 2点半在火车站集合
完全没有计划的出逃
Train Glasgow-> Ardrossan Harbor 14:15-15:09
Ferry Ardrossan -> Brodick 15:15 – 16:10
手动模式 一不小心就爆了, 凑合看吧
到Brodick
先发个map,接下来的两天我们就是绕岛一周, Arran是苏格兰第7大岛,英国第九大,人口5000多吧。
到了在information center耗了很久,问了很多问题, 决定晚上直接去Kildonan看日落,明天继续起来看日出。但是在那里耽搁太久导致错过了一班bus,下一班要等到7点。 这样我们看日落的希望就木有了,所以再次的要hitchhiking啦。
小逛了一下,就去拦车了
大概等了半个多小时吧,一个善良的大妈搭救了我们, 她是去养老院看她妈妈的,后来她说自己不赶时间就直接送我们去了camping site, 一路上还跟我妈讲了很多可以玩的地方, 充满期待。她曾经在岛上看过北极光,非常fabulous的说。
路上顾着聊天也没拍照 转眼我们就到了 Kildonan. 露营的地方旁边就是 Kildonan hotel.
这个地方的划分有些奇怪,在房间里面的呢是餐厅,露天的是bar。在露天这边吃东西呢只能点bar menu上面的食物。
看了半天不知道点什么,本来期待海边能有点什么龙虾蟹之类的,结果无奈的点了 fish and salad,出人意料的好吃。比起城市里的那些,fish要肥美很多。
没事玩一下定焦头,很多换了哈 虽然现在还不太会玩
边吃晚餐边看日落啦
吃晚饭check in,compingsite的老板跟我们说这是最后一个周末了, 十月compingsite应该都关门啦。 交完钱,搭完帐篷。晚上月亮出来了
然后接下来就是赏月赏星光了, 在海中的大岩石上躺下来 看天一点点暗下去, 星星越来越多,还一不小心看到了一颗流星。后来刻意的等了很久就再没有出现了。 嘿嘿,虽然有点小冷,但是这种感觉太美妙了。我是俗人,以物喜以己悲。 后悔手机里没有装个star walk,可以多认识点星星嘛。
后来实在太冷 又跑去bar里做了一会 喝了杯热巧。
该换睡袋了,晚上就一个字,冷。
在information center查的6:15的日出,五点半就爬起来啦。
等到快7点的时候 就觉得已经看不到了 一直在犹豫要不要回去接着睡 结果这边开始亮了
跟太阳玩一下
看完,回家收帐篷
另外一边一个骑摩托车的哥们跟我们说远处有很多海豹,还借了他的望远镜给我们看。 吃完早餐,遇到一个团,他们的导游说不要靠近海豹,会吓着他们。于是远远的有了下面这张,经过我的仔细观察辨认,那不是木头,确实是在晒太阳的海豹们。
远处的小岛啊 轮船啊 有点海市蜃楼的景象,都飘了起来
早上第一班bus是11点半
等得无聊 跑去玩了会儿秋千
在路上看到有人玩越野摩托车
我们到这里的车晚点了,就没有赶到去Lochranza的车。 司机把我们丢下说,可以去路边get lift。 嗯 第二次的 hitchhiking。
搭了两次车, 一次是一个在格拉斯哥工作的中老年男人带着他5,6岁的儿子。把我丢在另一个相对比较好拦车的地方, 然后遇到一个神奇的在Holly island呆了一个星期的长胡子的中老年女性。 由于第一天遇到的人说北部有很多鹿啊 各种动物之类,我们满怀期待的来带了 Lochranza。
然后郁闷的事情就开始接二连三的发生了, 由于之前现金没有准备够,我们已经身无分文啦,接下来的bus也木有钱,问了一个餐馆的服务人员,这个小镇是没有ATM的,要拿钱可以在店里买东西拿cashback,手续费2镑左右。 真是黑啊。Stephen去买了瓶可乐,取了点现金。满怀期待的去传说中很好吃的海鲜餐馆。
早上起来太早,在回brodick的bus上就睡着啦。 还好没有坐过站,下车以后傻了。 这个餐馆下午3-6点关门,我们到那里的时候大概4点15, 晚上7点15的ferry。 从餐馆走回码头大概需要30分钟,6点开门我们显然是等不及了, 纠结郁闷悲愤的离去,在超市随便买了点牛角面包之类的。
行程结束,回来的时候太冷,相机都懒得往外拿。 回到格拉斯哥以后去十家楼补了一顿,但是自从那天起,我就开始每天都觉得吃不饱。
Arran真是个小地方,我们遇过的人几乎都遇到了两遍以上,抱憾的海鲜餐怀恨至今。
但是 24小时内,看了日出日落,赏了月看了星星, 还抓住了流星,意外在海边遇到晒太阳的海豹, hitchhiking了三次,在公车上瞟了一眼鹿,在9月的尾巴又去露营了一次。 还能奢求更多吗?
估计这也是最后一次跟斯蒂芬同学一起旅行了,再过两个星期他也要回到祖国母亲的怀抱了。 耸肩叹气。
这篇流水账竟然弄了快4个小时。。回到现实已经一个星期,强烈怀恋躺在岩石上看星星的那种宁静。
n633
新玩具 Amazon EC2
昨天重启了服务器以后就再也ssh不上去了 connection refused了, google 了半天 原来是ubuntu10.04的一个bug
因为micro的最便宜 所以就在micro上玩, 谁知道它不支持ephemeral storage(就是放一些数据之类的,反正这个东西是个临时数据),当重启以后发现找不到ephemeral storage了, 但是cloud-init这个傻子呢还傻傻的死等, 这就是bug的地方啦。
解决问题当然也就不难了, 只要让他不再等就好了
Mark 一下solution
在这里找到这个解决方法 (别着急,这个方法是有问题的)
modified the init file to tell ssh to start after the network has been initialized, replaced in /etc/init/ssh.conf :
start on filesystem
with
start on (started network-interface
or started network-manager
or started networking)
重新生成AMI,然后启动一个micro的instance,跟解决了。 但是视乎这个解决方案不好, 因为启动的时候你告诉他你可以现在A开始,或者B, 或者C。 机器会傻的, 到底是要从哪里呢?
当然后面又有高人出来了, launchpad上面给出了两种办法
第一种是ssh上去然后copy下面一段
[ "$(uname -m)" = "x86_64" ] && ephd=/dev/sdb || ephd=/dev/sda2
sudo sed -i.dist "\,${ephd},s,^,#," /etc/fstab
第二种能 就是 launch instance with cloud-config metadata
这个没弄明白应该怎么加
上面三种方法 前两种都做了测试 顺利搞定 mark一下
估计在ubuntu10.10就会把这个bug修复了
在railscast看到用paperclip跟Jcrop(一个jquery的一个插件)来实现图片裁剪功能,看起来很简单 就顺便用在现在做的项目里面了。 结果杯具的花了一天多的时间来弄。
paperclip works on windows 中记录了怎么给一个model加avatar
在model中我们加入了一下的代码
has_attached_file :avatar, :styles => { :medium => "300x300>", :thumb => "100x100>" }
注意这里的在维度后面加了一个大于号,当时不是很理解。 google也没有找到答案,今天又仔细研究了一下, 100*100>的话呢,>是指按比例缩放的情况下最长边等于100. #就不是按比例缩放了, 如果是 100×100# 最后的图就是拉伸到100×100,不论之前的比例。
首先 在model里面把上面这句改成下面一句
has_attached_file :avatar, :style {:medium=>"150x150#", :large=>"500x500>"}
我们在页面上显示用户的头像是150*150的。
因为用户上传的图片的大小必然是各种各样的,所以我们这里先把用户给的图片变化成我们已知的大小, 这里的large style接下来就会用来被裁剪的图片。
我们要实现的是, 当用户upload一个图片时转到一个叫crop的页面去进行裁剪。
所以需要修改controller里面的action,下面这段代码直接从railscast里面偷过来的。
def create
@user = User.new(params[:user])
if @user.save
if params[:user][:avatar].blank?
flash[:notice] = "Successfully created user."
redirect_to @user
else
render :action => "crop"
end
else
render :action => 'new'
end
end
def update
@user = User.find(params[:id])
if @user.update_attributes(params[:user])
if params[:user][:avatar].blank?
flash[:notice] = "Successfully updated user."
redirect_to @user
else
render :action => "crop"
end
else
render :action => 'edit'
end
end
然后我们要新加一个crop的view,就是在upload一个图片后,跳转到用来图片剪裁的页面。 在这个页面中呢, 我们就要用到Jcrop这个plugin了,下载地址
把JavaScript,stylesheet一股脑都丢进这个文件里面, 当然为了保证Javascript在head里面呢,我们可以用 yield跟content_for 来做,请同学们自行动手尝试。(也可以到这里围观Ryan是怎么做的)
加入下列代码 依然是偷过来的,我自己的使用haml写的
<% title "Crop Avatar" %>
<% content_for (:head) do %>
<%= stylesheet_link_tag "jquery.Jcrop" %>
<%= javascript_include_tag "jquery.Jcrop.min" %>
<script type="text/javascript">
$(function() {
$('#cropbox').Jcrop();
});
</script>
<% end %>
<%= image_tag @user.avatar.url(:large), :id => "cropbox" %>
显然这只实现了一个在图片中选中一个区域的步骤,我们需要告诉paperclip我们选择了哪个区域。
回到model里 加入下面的代码
attr_accessor:crop_x, :crop_y, :crop_w,:crop_h
什么是attr_accessor, 字面上来看呢 就是attribute accessors,如果你熟悉java或者c++, whatever else. 这个就相当于getter跟setter的合体。
这里的四个值呢 分别是 crop_x 左上角的x坐标, crop_y 左上角的y坐标, crop_w 所选框的width,同理crop_h 所选框的height.
怎么把这些值传递给paperclip让它知道呢,首先想到的是要弄一个表单,为了不让这些值显示给亲爱的用户,所以我们使用hidden input.
继续偷代码
<% form_for @user do |form| %>
<% for attribute in [:crop_x, :crop_y, :crop_w, :crop_h] %>
<%= form.text_field attribute, :id => attribute %>
<% end %>
<p><%= form.submit "Crop" %></p>
<% end %>
这时候我们在Jcrop的调用中也要加一些配置了
$(function() {
$('#cropbox').Jcrop({
onChange: update_crop,
onSelect: update_crop,
setSelect: [0, 0, 500, 500],
aspectRatio: 1
});
});
function update_crop(coords) {
$('#crop_x').val(coords.x);
$('#crop_y').val(coords.y);
$('#crop_w').val(coords.w);
$('#crop_h').val(coords.h);
}
这里update_crop的方法呢就是用来更新选区。通过表单提交给model,这时候呢我们要通知model 我们需要来进行crop
在model中加入以下偷来的代码
after_update :reprocess_avatar, :if => :cropping?
def cropping?
!crop_x.blank? && !crop_y.blank? && !crop_w.blank? && !crop_h.blank?
end
private
def reprocess_avatar
avatar.reprocess!
end
上面这段代码是说什么呢, 通过crop_x, crop_y, crop_w,crop_h来判定是否进行croping,如果进行cropping的话就通知paperclip再reprocess一下。
然后就是要告诉paperclip该如何处理?
安装railscast上讲的,我们需要有在lib文件夹下,新建一个paperclip_processors的文件夹, 然后new以下新的文件cropper.rb 内容如下
module Paperclip
class Cropper < Thumbnail
def transformation_command
if crop_command
crop_command + super.sub(/ -crop \S+/, '')
else
super
end
end
def crop_command
target = @attachment.instance
if target.cropping?
" -crop '#{target.crop_w}x#{target.crop_h}+#{target.crop_x}+#{target.crop_y}'"
end
end
end
end
这时候测试一下, 错误如下
uninitialized constant Paperclip::Cropper
检查一下,好像是因为lib文件夹下面的文件并没有自动载入, 一google才知道 rails3 取消了对lib文件的autoload. 既然不能自动我们就手动呗。到model文件里面加入下面两句
require 'lib/paperclip_processors/cropper.rb' include Paperclip
再次运行,新的错误又来了,
undefined method `sub’ for ["-resize", "x170", "-crop", "170x170+9+0", "+repage"]:Array
看了railscast下面的comment,有人也有同样的问题,原因是新版本的paperclip改变了他处理命令的方式,这里有人给出了解决方式
在cropper文件里面分别替换成下面两行
crop_command + super.join(' ').sub(/ -crop \S+/, '').split(' ')
["-crop", "#{target.crop_w}x#{target.crop_h}+#{target.crop_x}+#{target.crop_y}"]
再运行下,理论上应该可以crop了。
但是视乎裁剪的结果并不不准确,原因是我们用large style的图片来做选区,但其实是在original的图上裁剪的,所以我们需要在中间做一个转换。
我们需要知道original跟large的width跟height。在model里面再加入下面的代码
def avatar_geometry(style=riginal) @geometry ||= {} @geometry[style] ||= Paperclip::Geometry.from_file(avatar.path(style)) end
把update_crop文件更新为下面这样
function update_crop(coords) {
var ratio = <%= @user.avatar_geometry(:original).width %> / <%= @user.avatar_geometry(:large).width %>;
$("#crop_x").val(Math.round(coords.x * ratio));
$("#crop_y").val(Math.round(coords.y * ratio));
$("#crop_w").val(Math.round(coords.w * ratio));
$("#crop_h").val(Math.round(coords.h * ratio));
}
</script>
现在再一运行 一切正常啦。
但是这样用户体验不够好啊,那再加入一个预览的吧
view文件里面
<h4>Preview</h4> <div style="width: 100px; height: 100px; overflow: hidden;"> <%= image_tag @user.avatar.url(:large), :id => "preview" %> </div>
javascrip里面继续更新一下update_crop文件
function update_crop(coords) {
var rx = 100/coords.w;
var ry = 100/coords.h;
$('#preview').css({
width: Math.round(rx * <%= @user.avatar_geometry(:large).width %>) + 'px',
height: Math.round(ry * <%= @user.avatar_geometry(:large).height %>) + 'px',
marginLeft: '-' + Math.round(rx * coords.x) + 'px',
marginTop: '-' + Math.round(ry * coords.y) + 'px'
});
var ratio = <%= @user.avatar_geometry(:original).width %> / <%= @user.avatar_geometry(:large).width %>;
$("#crop_x").val(Math.round(coords.x * ratio));
$("#crop_y").val(Math.round(coords.y * ratio));
$("#crop_w").val(Math.round(coords.w * ratio));
$("#crop_h").val(Math.round(coords.h * ratio));
}
一切搞定。
悲催的我在写cropping?的时候, 少写了一个感叹号给crop_h.blank? debug了好久才找到。希望以后不要再犯这样的错误
n1774需要实现一个avatar的功能
谷哥说paperclip
先在railscast上看了下Ryan的介绍, 对于功能基本满意。
Rails3用bundle来管理gem的dependencies。
在Gemfile里面加上如下代码
gem 'paperclip'
然后命令行 bundle check, paperclip需要安装 再bundle install, 再check一下 现在所有的dependencies 都满足了
这里假设我是要给user这个model加一个avatar
按照github上讲的http://github.com/thoughtbot/paperclip, 在model里面加上 下面这句
has_attached_file :avatar, :styles => { :medium => "300x300>", :thumb => "100x100>" }
rails g paperclip user avatar
这样生成了一个migration file,下面这段是自动生成滴
class AddAttachmentAvatarToUser< ActiveRecord::Migration
def self.up
add_column :users, :avatar_file_name, :string
add_column :users, :avatar_content_type, :string
add_column :users, :avatar_file_size, :integer
add_column :users, :avatar_updated_at, :datetime
end
def self.down
remove_column :users, :avatar_file_name
remove_column :users, :avatar_content_type
remove_column :users, :avatar_file_size
remove_column :users, :avatar_updated_at
end
end
好最后别忘了 rake db:migrate (我经常忘记 囧 ), 这样数据库就搞定啦。
Controller 里面不需要做什么改动,因为这里的avatar跟其他的email之类的属性是一样的 所以update的时候都会update的, 就来看看view吧
首先要有一个form吧, 嗯在我们的form的partial里面加一句, 因为我这里用的是haml所以就没有”"
= form.file_field :avatar
还没有完 还要给form加一个html的option, :multipart => true。这样呢 就给form加了一个enctype=”multipart/form-data“, 完整的haml代码如下
= form_for(@user,:html=>{:multipart=>true}) do |f|
.field
=f.label :avatar
=f.file_field :avatar
.field
=f.label :email
= f.text_field :email
.field
=f.label :name
= f.text_field :name
.actions
= f.submit
嗯 form有, 上传完了以后要show出来吧, 然后在show的里面加一句
=image_tag police.avatar.url(:medium)
嗯 运行一下,理论上应该是不行的, 因为这里有个重要的东西我们没有安装。 ImageMagick. 这个才是我们今天讨论的重点, 在linux跟mac下这个不是大问题。但是windows总是让人头痛的。
下载地址:http://www.imagemagick.org/script/binary-releases.php#windows
选好适合自己的下载, 注意安装的时候加入环境变量,为了安全起见可以check一下是否成功加入了
这个时候你运行呢 很可能会得到一个 ”Error: [...] is not recognized by the ‘identify’ command“ 的错误。
为什么环境变量加入了还是不能识别呢, 在cmd里面运行下面的代码
1. 把model里面的styles去掉 测试一下, 如果成功上传 说明确实是paperclip跟ImageMagick之间的沟通出了问题。否则,请检查以上步骤是否正确完成了
2. 测试完以后,加上styles, 为什么要加上? 因为我们需要嘛,如果不需要这个不同大小的话这里就可以算成功了 请忽略后面的。 现在打开你的log,看看有[paperclip]的行是怎么说。copy那句话,我的是如下的
identify '-format' '%wx%h' 'C:/Users/danyi/AppData/Local/Temp/str eam,4212,0.jpg[0]'
在cmd中输入,报错
这个时候呢 根据报错发现需要”代替‘.输入下面的命令,再试一下
identify "-format" "%wx%h" "C:/Users/danyi/AppData/Local/Temp/str eam,4212,0.jpg[0]"
视乎运行成功了, 嗯 问题也似乎找到了。如何解决呢,我在config/initializers里面加入了一个paperclip_patch.rb文件, 然后加入一下代码,overwirte原来的quote_command_options方法。
if RUBY_PLATFORM == 'i386-mingw32'
module Paperclip
def self.quote_command_options(*options)
options.map do |option|
option.split("\"").map{|m| "\"#{m}\"" }.join("\\\"")
end
end
end
end
再测试。。搞定。。
不在于这个问题是怎么解决的,而在于这个过程怎么去发现问题分析问题最后才是解决问题。
明天做image的 crop..
n530带着两个专辑上路
To Travels & Trunks 虾米地址: http://www.xiami.com/album/387936

Music for Tourists 虾米地址: http://www.xiami.com/album/169183

Air-conditioning is cold,
summers hot and love is old
i wish i was smaller,
i little creepy crawler
Theirs lovers sin in this town,
lovers cannot let down,
the summers hot as hell here you know,
if we think we can drink now,
we wont stop cos we dont know how,
it’s cold, but we love
how it feels alright
I sweat it all out, you sweat a lot too
we heart the same, the same black and blue
ohh ohhhh , i wanna catch my difficult
ohh ohhhhh , cos i’m scared i’m growing old
ohhh oh oh , don’t return the love i give
ohhhh oh oh, your still my favourite
Trouble’s win in this town,
Trouble’s dont turn upside-down,
ohh - they shit on the last bit of fun
Theres sin all around,
Lovers cannot let down,
and the winter wears and tears
our bones.
There’s a man in this town
is shooting us down, he
thinks he’s a big man but he doesnt know anything about us or anything at all.
At night he lies awake,
and his heart aches,
cos its cold - ohh ohh old,
he sweats it out all the night through,
and he throws up all over me and you.
ohh ohhh, i wanna catch my difficult
ohhh ohhh, cos i’m scared of growin old
ohh oh ohh, don’t return the love i gave you
ohhh oh oh, your still my favorite
Day 1
白墙 蓝天 海边小镇
海边的童年故事
抬头 你是飞向哪里
Day 2
水天一色
在路上
海角天涯呢?
Carrick-A-Rede
Day 3- Sunrise
第一次看日出
那一刻的感觉 非常美妙
清晨的游乐场
END
n292心漂久了 会累
当处变不惊的时候 并不知道这算好还是不好
拥有那些别人以为的美好 却并不能让我觉得快乐
整理好背包 带上帐篷 再次上路
在路上 寻找出路
n296又是一年夏天 又是一个毕业季
根叔的寄语
如果看过了Ellen DeGeneres at Tulane’s 2009 Commencement Speech(youtube地址,youku地址),一定会觉得国内的毕业典礼是相当的无趣。
而这一次根叔只是用我们平时说话的语言就让大家感动了。
浪费了太多的时间听了太多虚假的言语的我们,只是需要一些跟我们说真实的话。
请去掉官僚 让我们真实的对话 赞根叔
“母校 就是那个你一天骂她八遍却不许别人骂的地方。”
李行亮之快男
之前听过他在华工摇滚节上的演唱 Desperado确实惊艳
不记得跟谁一起去看的他的毕业个人演唱会,似乎是跟小猴子他们一起刷过去的。
去看了演唱会的人,定会被那样的情景打动。
一个人唱歌,一万个人在听。
朋友的伴奏,站台。
记得子时当时还弄了个女子第一band
跟一帮有共同梦想的人为了一个梦想而激情奋斗的夏天
之前说不要踏入娱乐圈的他 今年竟然参加了快男 而且一路高歌进入十二强
祝福他能实现音乐梦想
那年一起听演唱会的同学们 你们现在都在哪里呢?
谢谢 李行亮唤起的那年夏天的hust露天电影院的回忆
R.I.P 陈熙
周五晚上小明忽然在qq上跟我说 如果在国外不开心 就快回来吧
然后跟我讲了陈熙的事情 震惊 不敢相信
对于这个名字并不熟悉 虽然一起上过很多课
惋惜 是怎么样的绝望让他彻底离开的勇气
太理解在国外的孤单 朋友一个一个的送
还有找工作的艰辛与压力
此刻对胖子充满了钦佩 如何强大的内心 让他可以坚持在这边找工作找一年
但是熬过来就好了 everything is gonna be OK
傻孩子 希望你在天堂会快乐 没烦恼
这个事情以后对于心理健康方面思考了很多
工作以后 我们都变得越来越忙碌 但是请别忘了老朋友
保持联络 你的留言短信电话会温暖另一个人的世界
最后 积极生活 一切都会好起来的
n342