CuriousY A world with wonder

How to debug Jekyll sites

| Comment

One Problem

最近研究Jekyll遇到了不少坑,这里先讲其中的一个。

问题是这样的:我安装了jekyll-paginate插件,想要分页显示我的blog,然后在主页的index.html里面写了如下代码:

{% for post in paginator.posts %}
	<article class="post">
        <h1><a href="{{ post.url }}">{{ post.title }}</a></h1>
		<div class="post-content">{{ post.content }}</div>
	</article>
{% endfor %}

此时,启动server是可以正确在主页面看到分页的blog的。然后我希望这个blog部分移到/blog/页面下,所以就新建了blog文件夹和其中的index.html,并把上面的代码贴到新建的这个index.html里面。然而,打开/blog/页面,什么blog内容都没有,更别说分页了。

Read more

使用Kafka实践心得

| Comment

I. 部署

按照官方文档很容易部署,提几点比较重要的事:

  1. 默认情况下,kafka的进程都不是daemon进程,如果需要让启动的server转入后台运行,可以加上参数-daemon,比如:

    bin/zookeeper-server-start.sh -daemon config/zookeeper.properties
    
  2. 配cluster的时候,除了需要修改server.properties里面的broker.id,还需要修改zookeeper.connect为启动zookeeper server进程的那台机器。

  3. 实际部署的时候一般只需要部署多个kafka server作为brokers,producer和consumer一般是自己写代码来实现(kaka server本身应该就是一个tcp server,我们程序中只要向它发送请求即可达到发送message和接收message的目的)。

Read more

使用Jekyll搭建github个人网页实践

| Comment

拖延了很久,终于下决心重新整一整这个blog。为了整这个,又重新研究了下jekyll

I. 使用Jekyll

为什么在github上部署个人页面需要jekyll?因为github官方的页面就是用的liquid模板,而jekyII是一个比较流行了使用liquid模板来生成静态页面网站的工具(jekyll用了liquid来作为写html模板的工具,快速上手可以参考这里。)。它可以像flask一样在你本地运行一个webserver,但你不需要care它后台的逻辑,这些都帮你封装好了,也没有暴露给你,你只需要写好一些符合liquid格式的html文件(liquid可以参考Jekyll给定的一些变量filter来写(你看,Jekyll给你的能玩的东西也就这些了,是不是挺“傻瓜”的,当然它并没有限制你写js,但是后端相关的基本都剥离了))以及符合jekyll规定的文件和文件夹命名就可以了,jekyll会根据以下的逻辑来处理这些html模板和markdown的文章:

  1. Jekyll collects data.

    Jekyll scans the posts directory and collects all posts files as post objects. It then scans the layout assets and collects those and finally scans other directories in search of pages.

  2. Jekyll computes data.

    Jekyll takes these objects, computes metadata (permalinks, tags, categories, titles, dates) from them and constructs one big site object that holds all the posts, pages, layouts, and respective metadata. At this stage your site is one big computed ruby object.

  3. Jekyll liquifies posts and templates.

    Next jekyll loops through each post file and converts (through markdown or textile) and liquifies the post inside of its respective layout(s). Once the post is parsed and liquified inside the the proper layout structure, the layout itself is “liquified”.

    Liquification is defined as follows: Jekyll initiates a Liquid template, and passes a simpler hash representation of the ruby site object as well as a simpler hash representation of the ruby post object. These simplified data structures are what you have access to in the templates.

  4. Jekyll generates output.

    Finally the liquid templates are “rendered”, thereby processing any liquid syntax provided in the templates and saving the final, static representation of the file.

以上,简单说就是Jekyll会把所有markdown的东西(转换成html格式)放到模板里面,然后render就生成了我们打开网页看到的html文件啦。

至于放到github上,每次我们push一个commit的时候它会自动重新用Jekyll来编译生成新的静态页面的,从而保证了内容是最新的。

Read more

小坑:Flask server不能访问

| Comment

Problem

部署Flask server时碰到的一个问题:我在服务器上运行了我的Flask server程序,但是我本地浏览器却不能打开我的网页(http://remote_hostname:5000),把hostname换成ip也不行。然后我又把防火墙关了一遍,还是不行。在本地试图通过tcp连接到远程的5000端口,connection refused了,而连接到其他一些端口是可以成功的。

Reason

上述表现基本确定不是防火墙的锅,查了下是因为我直接app.run(),它的默认参数是host=’127.0.0.1’,官方文档也说了:

Set this to ‘0.0.0.0’ to have the server available externally as well. Defaults to ’127.0.0.1’.

Solution

把app.run()改为app.run(host=’0.0.0.0’)。

记坑:Flask中的请求处理函数

| Comment

Problem

用Flask写一个处理请求的函数,这个函数本身会再发送一个请求出去(在我这里是发送消息到一个Kafka消息队列,调用的其Python sdk里面的KafkaProducer.send)。在本地运行是没什么问题,放到服务器上跑的时候Kafka那边怎么都接收不到消息。然后我通过log来打点发现Flask的请求处理函数是触发的,并且KafkaProducer.send语句也是被执行了的。再然后我用了remote debugging来调试,发现逐条运行是正常的,但直接运行处理函数是有问题的。

Reason

到此已经非常接近真相了。真相只有一个,凶手就是时间!我在KafkaProducer.send后面添加了time.sleep(60),果然运行没有问题了!

也就是说KafkaProducer.send是异步执行的,而Flask对其请求的处理是用一个新的线程来执行处理函数,当此函数运行结束后线程就被销毁并放回线程池了,而此时KafkaProducer.send还没来得及执行完成(因为是异步的)。

Solution

确保Flask请求函数中所有的异步操作都同步后再离开函数(线程)。

| Page 23 of 25 |