Author Archive

[Rails 3]Cropping images use paperclip and jcrop

在railscast看到用paperclip跟Jcrop(一个jquery的一个插件)来实现图片裁剪功能,看起来很简单 就顺便用在现在做的项目里面了。 结果杯具的花了一天多的时间来弄。

在上一篇

[/rails]

paperclip works on windows 中记录了怎么给一个model加avatar

100×100# VS 100×100>

在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接下来就会用来被裁剪的图片。

Action

我们要实现的是, 当用户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

Jcrop选区

然后我们要新加一个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选区范围

显然这只实现了一个在图片中选中一个区域的步骤,我们需要告诉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该如何处理?

Reprocess

安装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= :o 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>

现在再一运行 一切正常啦。

add a preview

但是这样用户体验不够好啊,那再加入一个预览的吧
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了好久才找到。希望以后不要再犯这样的错误

[rails] paperclip works on windows

需要实现一个avatar的功能

谷哥说paperclip

先在railscast上看了下Ryan的介绍, 对于功能基本满意。

1. 安装

Rails3用bundle来管理gem的dependencies。

在Gemfile里面加上如下代码

gem 'paperclip' 

然后命令行 bundle check, paperclip需要安装 再bundle install, 再check一下 现在所有的dependencies 都满足了

2. migration

这里假设我是要给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 (我经常忘记 囧 ), 这样数据库就搞定啦。

3. controller

Controller 里面不需要做什么改动,因为这里的avatar跟其他的email之类的属性是一样的 所以update的时候都会update的, 就来看看view吧

4. views

首先要有一个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)

5.ImageMagick

嗯 运行一下,理论上应该是不行的, 因为这里有个重要的东西我们没有安装。 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

再测试。。搞定。。

6 最后

不在于这个问题是怎么解决的,而在于这个过程怎么去发现问题分析问题最后才是解决问题。

明天做image的 crop..

漂移过海去北爱

带着两个专辑上路
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

Carrick-A-Rede

Carrick-A-Rede

Giant causeway

石柱

Day 3- Sunrise

第一次看日出

那一刻的感觉 非常美妙

清晨的游乐场

camping site

我的帐篷

END

出路 上路

心漂久了 会累

当处变不惊的时候 并不知道这算好还是不好

拥有那些别人以为的美好 却并不能让我觉得快乐

整理好背包 带上帐篷 再次上路

在路上 寻找出路

01082010

割肉补血。 Coldplay code play.
困 睡 晚安世界

与HUST有关的三人三事

又是一年夏天 又是一个毕业季

根叔的寄语

如果看过了Ellen DeGeneres at Tulane’s 2009 Commencement Speech(youtube地址youku地址),一定会觉得国内的毕业典礼是相当的无趣。

而这一次根叔只是用我们平时说话的语言就让大家感动了。

浪费了太多的时间听了太多虚假的言语的我们,只是需要一些跟我们说真实的话。

请去掉官僚 让我们真实的对话 赞根叔

“母校 就是那个你一天骂她八遍却不许别人骂的地方。”

李行亮之快男

之前听过他在华工摇滚节上的演唱  Desperado确实惊艳

不记得跟谁一起去看的他的毕业个人演唱会,似乎是跟小猴子他们一起刷过去的。

去看了演唱会的人,定会被那样的情景打动。

一个人唱歌,一万个人在听。

朋友的伴奏,站台。

记得子时当时还弄了个女子第一band

跟一帮有共同梦想的人为了一个梦想而激情奋斗的夏天

之前说不要踏入娱乐圈的他 今年竟然参加了快男 而且一路高歌进入十二强

祝福他能实现音乐梦想

那年一起听演唱会的同学们 你们现在都在哪里呢?

谢谢 李行亮唤起的那年夏天的hust露天电影院的回忆

R.I.P 陈熙

周五晚上小明忽然在qq上跟我说 如果在国外不开心 就快回来吧

然后跟我讲了陈熙的事情 震惊 不敢相信

对于这个名字并不熟悉 虽然一起上过很多课

惋惜 是怎么样的绝望让他彻底离开的勇气

太理解在国外的孤单 朋友一个一个的送

还有找工作的艰辛与压力

此刻对胖子充满了钦佩 如何强大的内心 让他可以坚持在这边找工作找一年

但是熬过来就好了  everything is gonna be OK

傻孩子 希望你在天堂会快乐 没烦恼

这个事情以后对于心理健康方面思考了很多

工作以后 我们都变得越来越忙碌 但是请别忘了老朋友

保持联络 你的留言短信电话会温暖另一个人的世界

最后 积极生活 一切都会好起来的

武汉这些天一直在下雨

在虾米一直循环播这首。

想念那个满是回忆的城市

那里有我爱的人们

那里有再也回不去的年华

这里这些天也一直在下雨

而谁会在有阳光的地方等我呢?

武汉这些天一直在下雨
词曲:钟立风

武汉这些天一直在下雨
淋湿了她的裙子我的心
还有你
我的小宝贝 我的小宝贝

我看到有人从黄鹤楼跳了下去
像只飞鸟消失无踪影
长江上
白帆点点 飘向了天边

武汉这些天一直在下雨
绵绵细雨里有我纷纷的情欲(你想要的岂止是一句我爱你)
而我很快就会离开这里
我会在有阳光的地方等你

武汉这些天一直在下雨
你用你小小的身体温暖我的心(传过户部巷鲁磨路流连你怀里)
而我很快就会离开这里
我会在有阳光的地方等你

*写于2009年夏。“果实与艳遇”行旅音乐会,行至武汉。

[Into the wild] BenCruachan and KilchurnCastle


行程起源:

5月30日是bank holiday, 加上周末就是long weekend啦。要出去活动活动筋骨才是。

shady提议 Ben Cruachan walking, walking highland 网站提供的路线在此

定了地点就开始安排行程了。Googlewave在Google IO 上正式发布了,跟以前相比有了很大的提高, 我们就用它来作为我们行程准备工具。

截个图先

新加的next wave的功能很不错,可以方便跟进最新的改变。  wave可以记录整个讨论过程,但却不能去掉讨论过程直接文档化。 目前wave好像也不支持打印功能。嗯,但整体来说google wave在做异地团队沟通上还是挺不错的。

由于决定出行的时间比较短,而且大部分人都会在这个bank holiday出行,所以呢就没有办法定到住的地方。 在couchsurfing 上也没有找到合适的地方。 最后决定camping。

————————————————————————————————————

行程计划:

Ben Cruachan walking的路线是6-7个小时,周六早上一早出发 11:00 到山脚下,晚上在山上露营,如果天气好的话早上还是可以看个日出的。

第二天下山去loch awe station 附近的 KilchurnCastle, 在google earth上发现这个地方无比的漂亮啊。然后就回家了。

然而计划只是计划

按照行程计划我们周六到周日中午都是在山上渡过,没有任何地方可以买水,shady就背了5l的水,我背了3.5l的水。山上遍地的羊和羊屎,不敢 随便喝泉水。

早上8点在Glasgow Queen street station 汇合,买票,走人。

—————————————————————————–

Day 1

出行前我的背包跟shady的背包, 除了水还有睡袋,防潮垫,帐篷,还有2天的食物。

我的背包

我们坐的是 west highland line,lasgow-oban/Mallaig的路线。 幸亏经人提醒这个火车是会在某个地方断成两截向不同的方向前行的, 才换到正确的车厢。

在Falls of Cruachan下车,列车员专门叮嘱我们在这一站只有一个车厢的门开,原因是就只有我们两个人在这里下车。这个小车站只有单轨呢。

Stop,Look,Listen

单轨的火车道

嗯 准备开始。

忽然意识到我把地图还有详细路线图给丢家里忘记带了, 就只能adventure了。

刚开始爬就开始下雨了 淅淅沥沥

我的鞋子由于服役太久,竟然漏水进去了,相当的难受。

后来肩膀实在受不了 几乎是爬10分钟就要休息一下,边走边嘲笑自己是傻子,连羊都一直咩咩的笑我们。

黑面羊

我们是快乐的一家

水坝

还是水坝 和路上第一次遇到的人

厚厚的雾

大雾大雾

下午5点眼看是没办法按照计划完成了,问了相反方向走过来的人 说没有什么可以camping的地方,所以我能就找了一个相对比较平的草地,把包丢下,然后自由的爬上山顶。但是云雾也都跟着过来了,完全看不到远处。 anyway,登顶了。等到7点,云雾还没有散去。只有下山搭帐篷。

Camp on the munros(A Munro is a mountain in Scotland with a height over 3000 ft (914.4 m).)

山顶上写着 memory of的牌子

在山顶 什么都看不见。。

搭帐篷

由于太冷,行动缓慢, 搭个帐篷用了一个多小时。

我冷的想爆粗口,半夜醒来,我还说只有大风没有下雨已经感谢了。 结果瞬间开始下雨,大雨,像是有人拿着水管对着我们帐篷冲。 哎不敢乱说话,一夜睡的都不是很踏实。

本来打算晚上生火把湿的衣服鞋子都烤一下。结果。。

—————————————————————————————-

Day 2

早上醒来,最痛苦的就是穿上那些湿的衣服和鞋子。

天开始渐渐放晴了。拿着地图商量了一下,决定改变计划,走另外一条路线, 向着阳光走去。

早上起来天气好了很多 终于可以看见远处了

来拍张照

这张过曝了

天气很不错,我们就在山上多拍了些照片

云开始散去

蓝天蓝天

山上还有雪呢

刚开始背起包的那一刻真是痛苦,肩膀很痛,走着走着就已经忘记了肩膀上的重量。因为脚下的路太难走。

回首望

站在悬崖边

回头望 走过的路

很美的倒影

抬头望

终于到了草地,开始沿着一个小河奔的很愉快,奔着奔着小河变成了峡谷。每次以为奔完一个山坡的时候都会发现还有另外一个,不过天气好还是挺开心的。

山涧

山涧边行走

远望

we all need down to earth

嗯 这个时候终于可以用奔这个字眼了。但是好景不长呢。

陡坡陡坡 就是这样滑下来的

远眺的loch awe

快接近地面的时候 等高线变得非常密,也就是说很陡。 四五百米的海拔,我们走了差不多快一个小时。有时候看到太陡的坡,顾不上满地的羊屎就滑下去。甚是欢乐啊。整个一路没有看到一个人。

leaves on the blue sky

小溪变峡谷

back into the civilization

穿过这个桥洞 遇见一些在河边钓鱼的人

Fishing man is on the phone

leaves on the blue sky

这就是nature

我们就这样想文明社会前行着,到达地面后,在河边休息了好久,真的累坏了。

———————————————————————————————————————–

下一站 kilchurn Castle

Hitchhiker

实在太累,走不动了,也是之前的计划。, 在路边拦了一个小时的车,才搭上一辆。

Hitchhiker


Finally, heading to KilchurnCastle

Walk into wild again

Kilchurn Castle

Here we are

虽然是废弃的 依然能看出以前是豪宅的样子

How peaceful when I was sitting here.

这里像是世外桃源一般,有一些人在那边钓鱼。 言语无法形容的感觉,加上错过了最后一班回Glasgow的车,我们就决定留在这里继续camping一晚。

食物都吃光了,接下来分工,shady走出去买食物,我搭帐篷。 此时我已经走不了了,泡了快两天的脚痛的要死。

一个人坐在城堡前面的这个平台上,感觉无比的宁静。 据说这个一片地方是一个老头20年前花1000镑买下来的,他一直不停的赞叹这个老头是个wise man。

shady买回食物回来已经过去2个小时了,过程坎坷,差点没有买到。

决定先生火再吃,没想到生火竟然生了快2个小时。 由于之前下雨,所有的木头都是湿的。好烧的木头烧的快,烧的慢的木头烧不着。薰了两个小时,一身的烧烤味。 然后吃着9镑一盒的fishandchips.

castle, tent, fire. How prefect it is

Fire

—————————————————————————————-
DAY 3 -Back to civilization

周一,醒来天气无比的好,城堡周围晃了晃,拍了下照,准备闪人了。早上起来就开始有些难过,要离开,要结束这个into the wild的旅程,但又期盼能回家洗澡。

小岛

山,帐篷

城堡

无需用语言来描述

那么小的我

衣服都湿了 借了shady的T恤 穿起来像裙子

倒影倒影

可以拿来当桌面了

大叔去小岛上钓鱼去了

穿过铁路 走向Dalmally

walking on the raod. 看不见我。

Dalmally train station, 踩点

路边的b&b,不提供午餐

太喜欢这种在路上的感觉,简单自由。

从kilchurnCastle走到Dalmally, 阳光暴晒,伤了。 宁静的小乡村,找到一家bar,午餐。

好大一盘salad

等火车

Tired

回归文明社会。

——————-

我尽量不写成流水账。。但是。。。嗯。整理图片文字也花了一天的时间,估计也没有几个人能完整的看完。。太长

华丽的冒险,该体验的都体验了,非常精彩。天气从糟糕的雨天渐渐晴朗,直到晒伤了。 经历了雨天在山上野营,也体验了晴天在湖边的camp。尽管木头都很潮湿,但是最终还是点燃了篝火。走了很rocky的路,也滑了草。实现了第一次在uk的hitchhiker,第一次背着大背包沿着公路走。

带着into the wide 的书在路上,也会想起 Christopher McCandless

暂时的离开文明社会,在野外真实的生存的感觉很不错。

Keep life simple, Keep life real.

Danyifeng.com 正式启用

昨天godaddy上0.99刀的offer 迅速强入一枚

danyi.codetea.co.uk 会直接转向danyifeng.com

Walle 早上没睡醒就被我拉起来当模特了。。可怜的孩子

散花hoho

欢迎交互链接 O(∩_∩)O

Photos| Sunny Weekend at Kelvingrove

很难得的夏天, 周六朋友来访, 吃完下午茶, 去Kelvingrove晃悠了一下。


最后来个冰激凌降降温

Return top