想搞web什么都要学习,正在一点点修复博客的细节,今天就为一个小细节纠结了半天。

博客的代码高亮显示在pre标签中,这个是pygments自动生成的,也应该是个基本的标准吧。但是使用多了发现个问题,pre标签无法显示长度超过div标签长度的代码,虽然代码超过那个长度很少,而且规范的代码风格也不会允许你超过那个长度,但是少数语言种类,html,javascript多少都会很长的,考虑到这些我也开始尝试美化这个细节

思路一,换行

这个思路就是让pre到长度不够的时候自动换行,这样后面遮住的代码就可以完整的显示出来了,网上找了相关的资料,主要的方法就是修改css,下面整理了一个比较全面的css方案:

1
2
3
4
5
6
7
pre {
white-space: pre-wrap; /* css-3 */
white-space: -moz-pre-wrap; /* Mozilla, since 1999 */
white-space: -pre-wrap; /* Opera 4-6 */
white-space: -o-pre-wrap; /* Opera 7 */
word-wrap: break-word; /* Internet Explorer 5.5+ */
}

实测这个方案在chrome,firefox,ie8下是有效的,多余的我就不知道了!但是出来的结果让我不是很满意,首先,我的代码块没有设计行号,这个是为了美观,简洁,后面我们不打算加,那么换行后没有行号作为一个参考,就会显示的很乱,好吧,我放弃了!

方案二,滚动条

换行不行就试试能不能在长度不够的时候自动添加滚动条,我觉得这个应该是个不错的解决方案,由于自己css记得不多,就只能找了,得到下面的方案

1
2
3
4
pre {
overflow: auto;
overflow-y: hidden;
}

比较通俗不解释了,不过我有点疑问,为什么默认不设置overflow: auto呢,不过好歹问题解决了

最后的效果可以参考这篇文章

最近一直忙着寻找实习,也没什么时间来学习新的知识,越找啊越觉得自己懂得东西少。现在安顿下来,也要静下心来学习了!

manage.py是django的管理文件,简单的来说也可以理解为一个总控制台,我们日常操作django都可以通过他,比如我们需要启动调试服务器,我们会用到这样的命令:

python2 manage.py runserver

runserver就是其中一个管理命令,那么我们现在来尝试下自己添加管理命令。有人可能会这样认为管理嘛干嘛一定要在这里添加命令,自己写个脚本不就可以了,我是这样理解的,每个app都有自己的功能,如果需要一些自定义的功能的时候这样分类方便,将命令写入app也有助于以后app的重构。

再来个通俗点的,规范总是有价值的,不知道为什么那么遵守就是!开个玩笑!

我们先创建一个以命令名称为文件名的py文件,例如mycommand.py写入类似下面的代码:

1
2
3
4
5
6
7
8
from django.core.management.base import BaseCommand

class Command(BaseCommand):
args='any args'
help='print hello world'

def handle(self,*args,**options):
print 'hello world'

简单的来说就是继承BaseCommand来实现我们需要的功能,这里args指的是参数,但是并不影响你的输入,仅作为帮助提示,help顾名思义帮助文档,类似__doc__主要显示这条命令的功能,当然这两个参数可以不写的,主要就是其中的handle函数,这个函数完成这条命令的主体功能!

完成这些后将这个文件放入你的app的management/commands目录下目录结构应该是这样的

1
2
3
4
5
6
7
8
9
├── __init__.py
├── management
│   ├── commands
│   │   ├── __init__.py
│   │   └── mycommand.py
│   └── __init__.py
├── models.py
├── tests.py
└── views.py

这样django就会自动识别这些命令了,记得要启用你的app哦。这个时候我们运行

python2 manage.py

你应该可以看到他提示你的命令了

[myapp]   
    mycommand

现在我们看看提示

1
2
3
4
$ python2 manage.py help mycommand
Usage: manage.py mycommand [options] any args

print hello world

然后运行试试

1
2
$ python2 manage.py mycommand     
hello world

一个简单的例子就这样完成了,再使用时,好好考虑那些功能需要做成manage.py的命令,比如我准备写个简单的命令,将博客文章导出成markdown文件,做个备份

前几天,为了找实习,整理了一份简历,用来应付各种实习生应聘,当然我也忘不了python-cn邮件列表,抱着试一试的想法,我也主动发帖求份实习的工作,今天回头看一看好多人回复(我记得以前gmail会有提示的,怪了),根据大家的回复也说说自己的感想!

  • 简历应该扬长避短,正如其中有人说到的,四级分数不是那么高的话也就没有必要写出来,大家不会关心你的分数,如果分数足够亮可以拿出来,我嘛,还差很远。

  • 语言应该合理,语气应该适中,从头看到尾我的简历里的确有很多东西,有些偏激,这些地方一方面是为了体现我的一些想法,另一方面也是体现我的自信,但是语气的确有些过了,写简历也是个经验活啊!

  • 还缺乏亮点,尽管列表里有些人对我表示认可的态度,我觉得我的这第一份简历里面尚缺乏让人眼前一亮的点,对于我这样一个平凡的不能再平凡的人来说,还要完善,我是一个自由的人,我觉得不光要让人了解我的技术,还要让人了解我的个性,以及我对待事物的态度!

  • 另外有人说照片太。。。那是我身份证上的,改天一定要照张。。。。

吐槽下,要是5月木有找到实习就要参加学校的坑爹实习了,表示压力山大啊!我去!

deepin从我了解那天开始就是我一直想去的公司,撇开那些关于xp的好与不好,deepin的linux做的真的很用心,今天再一次有机会参观deepin,借着下载iso的时间聊聊今天的一些感想!

所见

由于显卡驱动的问题,deepin的新版de我没有机会尝试,今天去看了看,作为一个桌面环境来说,dde已经比较完善,launcher,dock,通知,电源,网络,挂载。。这些都实现了,我也刻意关注了下资源占用,基本上属于xfce级别,这点我很惊讶,compiz的特效配上新版de真的是比较炫,使用了半天电脑温度还好,经不住诱惑的我,想安装试试了。

说来一定要试试的就是deepin-emacs了,虽然我在arch上打包用过,但是相信配合deepin会使用的更好,emacs还是那么强大,败给他的仅仅是自己的耐心,听歌,文档,todo,终端,irc,email,翻译。。这些都是实用功能,自己配置起这样的emacs要花的时间可以想象

所闻

听侯哥说deepin有着庞大的野心,不仅要在桌面环境上下功夫,在网站及协作平台上来下功夫,要利用django来重写deepin整站,这点我很感兴趣,自从写这个博客体会到django的强大和便捷后,对这个陌生的领域特别的感兴趣。

所感

从deepin离开,侯哥送我出来聊了一下,表达了我对deepin这个自由的公司的向往,在车上我也有想,自己在所从事的领域,真的不够精,很多方面都是了解,但是不精通,导致自己在选择的时候,选项很多,但是底气确不够,我喜欢前沿技术但是我觉得要把每个计数都融会贯通,结合自己已经很熟悉的技术再来尝试新的技术,就像今天看的的利用python调用js渲染页面实现的一个简单的weibo的例子。

自己的大学已经不多了,真正自己能拿得出手的东西也不是很多,想指望这些一下能找个好的工作真的不容易,
我要加紧把握自己的时间,已经玩掉很多时间了,多练练手,不管最后有没有机会进入deepin,我相信这段经历都是美好的!

4-12
今天好热!

django网站数据库方便基本上都是自动维护的,但是如果要修改数据库就会比较麻烦,查了下相关的文档,django通过syncdb无法实现对models的增加。因为可能会造成意外的错误,所以推介手动修改数据库。但是比如我这个blog的维护,加入新功能难免会修改数据库,这里介绍个便捷的方法使用django-south

大家可以上他们官网来获取包的最新版本,也可以通过pip安装

下面简单讲下这个包的使用

  1. 在INSTALL_APP中添加south,通过syncdb将south同步进数据库

  2. 执行下列这个句,在你的app目录下创建migrations目录以及第一次迁移需要的0001_initial.py文件

    python2 manage.py convert_to_south youappnam

  3. 如果models改变就执行

    python2 manage.py schemamigration youappname –auto

  4. 最后执行同步数据库(如果出现表已存在的错误,后面加 –fake)

    migrate manage.py youappnam

忙活了几天,在@小邪兽_deepin 的帮助下 完善了许多博客的系统,基本所有wordpress的样式都移植过来了,侧边栏的功能也越来越完善,添加了标签云,分类,这些当初设计的时候都没有想过的。

现在的jovesky才真正像一个博客了,各方面功能也都比较完善了,但是系统整体代码不够严谨,很多漏洞还没发现,不过相信我会一直慢慢完善的,直到发布1.0版,哈,意淫下!

在这里不得不佩服django的强大,在排除前段和后台网页设计的压力后。这样一个博客写出来还是很轻松的,其中很多函数都帮住完成了常用的功能。

这几天不知道为什么,特别的有激情,哈,又找回了刚上大学那会的感觉,键盘手感都感觉好了许多。看来我就是这个命。

最后谢谢

:::python
hello world

到了大三 我也开始急着自己的实习了,喜欢python喜欢linux,总希望能找到相关的实习,但事实就是自己能力还不够哦。加上自己的项目经验不够多,感觉自己的简历都比别人薄一下。也许这也是很多大学生共同的烦恼。

最近正好收到豆瓣HR发来的邮件 约好时间参加线上笔试,说起豆瓣,我对他真是很有好感,一方面是因为他是国内成功运用python的网站之一,那些说python无法处理海量数据的只好闭嘴了,另一方面特别的喜欢豆瓣电台,基本上这两年听歌都用的她,说起他推介的歌还是不错的,偶尔可以发现一些不错的歌。

说到正题,拿到题目,AB卷,每个分别有两道算法题,一道操作题,我倒是很不理解,为什么还有操作题,发邮件也不好展示啊,上面还写着现场开发题,可能我没理解他的意思吧,这些不重要。简单谈谈题目。一道找零钱体,看似不难,但是我用以前的动态规划解答发现他给的币种太多了,递归严重超时了,于是gg思密达!一道加解密题借助着手边的电脑勉强做出来,一个数据库设计题,在我看来,我回答的简直是小学生水平,哈,然后是一个扑克判定输赢的题,看了题怎么看都是赌神里面玩的梭哈规则都一样,但是没什么思路加上时间木有了,表示木有做了!

怎么说了,第一次笔试,虽然是这种不正式的线上笔试,还能偷点懒,但是真的觉得很紧张,很多算法以前知道也突然想不起来,面对社会又是怎么的精彩或者惊彩。

不管怎么说这是一个好的开始,我要努力啊!

最近学习进度太慢了。

木有写文章,都是些牢骚!

说来,自己最近几个月真是懒了很多,看看可怜的小站就知道,很久没有文章更新,但是总的来说2012末日已经安全过去了,我还活着,这点不应该庆幸吗,呵呵

来年来,自己要学的东西真的很多,以前从没想过自己会去学习c#,但现在因为一个项目的需求也开始了解了,其实变成语言真的不分好坏,只有是否合适自己用。

大三马上就要完了,马上就要实习了,说实话压力很大,我总觉得自己知道的太少了,事实上也是这样的,要加油,少玩一点了。

如果哪个公司有合适的实习机会提供的话,可以联系我,非常感谢。

以前老是听说ROR开发有多快多块,网上还有朋友为了证明这,专门制作了10分钟利用rails框架搭建一个简易博客的教程,最近学习django框架,觉得django给开发者的便捷也很多,心血来潮来写个10分钟用django搭建简易博客的教程。

写在文章前

我不是什么web高手,接触web不久,正努力往大神的方向追赶,高手看到这的时候可以去喝咖啡了!10分钟不能完成博客的全部功能,只能完成博客最基本的显示文章和标题的功能,如果大家有兴趣可以慢慢去完善,比如评论,RSS。界面上大家凑合看吧!哈哈。

我写这篇文章的时候使用的python2.7,django1.4,如果版本不一样的话相信也区别不大,个别参数或者路径不同罢了!下面的代码多用于linux,windows下区别不大稍微修改点就好!

建立项目

看到这里,就是假定你已经安装好了python和django了!这些问题相信官方文档能帮助你更多!

1
2
3
django-admin.py startproject mysite


1
2
3
4
5
6
7
8
9
mysite
├── manage.py
└── mysite
├── __init__.py
├── settings.py
├── urls.py
└── wsgi.py


1
2
3
4
5
6
7
8
9
10
11
12
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
'NAME': '/home/jove/mydb.md', # Or path to database file if using sqlite3.
'USER': '', # Not used with sqlite3.
'PASSWORD': '', # Not used with sqlite3.
'HOST': '', # Set to empty string for localhost. Not used with sqlite3.
'PORT': '', # Set to empty string for default. Not used with sqlite3.
}
}


1
2
3
4
r'C:\py\mydb.md'



1
2
3
python2 manage.py startapp myblog


构建数据库

修改myblog/modesl.py加入如下内容,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from django.db import models
from django.contrib import admin

class Blog(models.Model):
title=models.CharField(max_length=120)
body=models.TextField()
time=models.DateTimeField()

class BlogAdmin(admin.ModelAdmin):
list_display=('title','time')

admin.site.register(Blog,BlogAdmin)


1
2
3
4
'myblog',
'django.contrib.admin',


1
2
3
4
5
6
7
8
9
from django.conf.urls import patterns, include, url
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
url(r'^admin/', include(admin.site.urls)),
)


1
2
3
python2 manage.py syncdb


构造页面

基本上这个时候博客的功能就算完成了,但是在哪里显示呢,所以我们要构建一个前台页面,简单的博客,我们就用一个单页面完成!
在myblog文件夹里创建文件夹templates里面存放这我们要的模板,顺便建立一个模板叫archive.html内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<html>
<style type="text/css">
body{color:#efd;background:#453;padding:0 5em;margin:0}
h1{padding:2em 1em;background:#675}
h2{color:#bf8;border-top:1px dotted #fff;margin-top:2em}
p{margin:len 0}
</style>
<body>
<h1>my blog</h1>
{% for post in posts %}
<h2>{{post.title}}</h2>
<p>{{post.time}}</p>
<p>{{post.body}}</p>
{% endfor %}
</body>
</html>


然后我们创建一个视图函数编辑myblog/views.py如下

1
2
3
4
5
6
7
8
9
10
11
12
from django.template import loader,Context
from django.http import HttpResponse
from myblog.models import Blog

def archive(request):
posts=Blog.objects.all()
t=loader.get_template("archive.html")
c=Context({'posts':posts})
return HttpResponse(t.render(c))



1
2
3
4
5
6
7
8
9
10
11
12
13
14
from myblog.views import archive
urlpatterns = patterns('',
url(r'^$', archive),
#......




```django自带开发服务器,方便了很多,只需要运行

```bash
python2 manage.py runserver


0 errors found
Django version 1.4.2, using settings ‘mysite.settings’
Development server is running at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

然后在浏览器中打开后台http://127.0.0.1:8000/admin你们应该看到的是这样子的
1

在blog中add添加然后可以看到简洁的文章输入界面,是不是有一点博客的味道了,呵呵,试试添加几篇文章,然后在首页去查看

2

到这里我们的教程就结束了。写的比较急,如果有错误还请指出!

最近一段时间参与一个开源项目https://github.com/sunng87/exaile-doubanfm-plugin 一个使exaile播放器支持豆瓣FM几乎所有功能的项目,虽然只是简单的维护项目适配新版exaile的API,但通读源代码后了解了豆瓣FM的运作,了解了插件系统的原理,了解一些基本的通信知识,其实收获还是很多的!

虽然刚开始提出帮助维护这个项目的时候心里还是很虚的,但是进步都是一点点出来的,大学教的真的很有限,我喜欢优秀的技术,也希望学会更多,不为别的,因为我喜欢,喜欢完成一个作品后的成就感!

项目也帮我又复习了python这门语言,真的很好用,虽然效率不如c但是开发效率也是效率,呵呵,多亏了这门语言,我读起源代码才能这么轻松的了解程序运作流程!维护这个项目的时候,想到这个纯python的插件或许能帮助正在快速成长的linuxdeepin,也和他们开发人员聊了下。期待有机会能去linuxdeepin实习!

都大三了,身边的朋友慢慢开始发奋,大家虽然目标不一样,但是都很努力,我也不能落后,喜欢自由,喜欢技术,我就要做我自己!

PS:有兴趣的朋友可以试试这个插件,现在支持exaile 0.3.3版本了,在download里面可以下载到,使用的时候记得Ctrl+D哦!
arch的朋友,可以试试我刚维护的AUR包 https://aur.archlinux.org/packages/exaile-doubanfm-plugin/