记录解决scp服务器配置不能使用的问题

Posted by 涵曦 at 2014-12-04 with tags sftp, scp, linux

  1. ssh hlm-devel@192.168.16.234 可以进入服务器

  2. scp hlm-devel@192.168.16.234:~/t.lua t.lua 失败,无错误提示,无百分比输出。

  3. 查看/var/log/secure 无明显错误

  4. scp root@192.168.16.234:~/t.lua t.lua 正常

  5. 查看/etc/ssh/sshd_config 没异常配置,开始怀疑是sftp的问题

  6. 执行 sftp hlm-devel@192.168.16.234。出现下面错误

sftp Received message too long 458961715

搜到这个方案

http://prystash.blogspot.com/2009/12/sftp-message-received-message-too-long.html

和这个方案

http://www.linuxquestions.org/questions/slackware-14/sftp-received-message-too-long-887856/

文中提到~/.bashrc的问题。于是查看自己的配置看看。里面有一条命令:

sh /home/develop/2.log

注释该命令。一切正常。

2.log 文件是用来登录时输出欢迎文字的。随后把该命令移到/etc/profile后一切正常。

记录解决sshd服务配置不能使用公钥登录的问题

Posted by 涵曦 at 2014-12-03 with tags sshd, ssh, linux

  1. 服务查看log
    tail -1f /var/log/secure

因为搜索了好多sshd的配置都是一样的,不能解决问题,就想到了查看log显示更确切的报错什么的。

  1. 客户端执行命令
    time scp -v t.lua hlm-devel@192.168.16.234:/home/hlm-devel/t.lua

这句话是搜着搜着找到的。来自这里:http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=3744661 可以总结出,一般命令都有debug模式,以后出现问题就直接去查找命令的debug参数就是了。

  1. 查看服务器输出的log
    Dec  3 09:49:19 localhost sshd[15272]: Authentication refused: bad ownership or modes for directory /home/hlm-devel
    Dec  3 09:49:19 localhost sshd[15272]: Authentication refused: bad ownership or modes for directory /home/hlm-devel

输出了sshd的日志,根据log提示认证拒绝,权限问题,然后就搜 bad ownership or modes for directory 然后就找到了这个 http://blog.itpub.net/137293/viewspace-896312/

到此就解决了ssh公钥登录问题。

Markdown编辑器推荐之Mado

Posted by 涵曦 at 2014-09-21 with tags makdown, 编辑器

Markdown编辑器推荐之Mado

细数我用过的markdown编辑器

  • Made
  • StackEdit
  • Cmd Markdown
  • Mou
  • haroopad
  • ghost

还有一些忘记了名字的,一直在寻找合适的自己的Markdown编辑器。

首先,我需要的Markdown编辑器需要下面的功能:

  • 离线编辑
  • 轻量级
  • 跨平台:linux,mac osx,windows
  • 代码高亮

上面我用过的效果最好的是Cmd Markdown,功能丰富,支持好多扩展功能,界面美观,但是不支持离线编辑。

Mou界面也挺好看的,但是只支持mac平台。

haroopad挺不错的,三个平台都齐全,界面也好看,支持代码高亮,缺点是重量级,运行在node-webkit上的,没有其他缺点,而且开源,可是代码在linux和mac上都没运行成功,用了一段时间。

ghost博客自带的那个编辑器试过一次,有一个对于在线编辑器都应该有的功能,就是输入![xxoo]()后,预览区会转换为一个可点击的空图片区域,然后可以点击上传图片了,上传完毕自动替换编辑区的图片地址。

昨晚在chrome商店找了些markdown编辑器,每个都试了下,找到了Mado这个应用,而且开源,代码量少。最喜欢这种轻量级的。但是代码不支持高亮,只支持最基础的markdown和GFM。看代码那么简洁,估计自己修改不难。

再说说我上星期自己弄的一个简单的markdown编辑器,感觉做的很垃圾,不适合实际应用,只是个玩具,在公司搭建了个http服务,用于在线编辑共享文档。

接下来打算汉化Mado。这么好的编辑器得和更多国人共享啊。

[原创]py+js实现markdown编辑器

Posted by 涵曦 at 2014-09-14 with tags python, js, markdown, 编辑器

借用现成工具

Markdown 是由 John Gruber 和 Aaron Swartz 共同创建的一种轻量级标记语言

showdown.js 是一个 javascript 写的 markdown 渲染库

codemirror 是一款“Online Source Editor”,基于Javascript,短小精悍,实时在线代码高亮显示,他不是某个富文本编辑器的附属产品,他是许多大名鼎鼎的在线代码编辑器的基础库。

python接收上传文件 解析http POST form

python 所做的事情

  • httpd服务器,主要是用于接收ajax请求,做相应的处理,特别是上传图片

  • tohtml.py 批量将md文件转成html,采用Markdown.pl

js 所做的事情

  • md编辑区使用codemirror

  • ajax请求

  • md实时预览使用showdown.js

  • 图片上传插件

源码

使用lua表设计简单RPC协议

Posted by 涵曦 at 2014-08-06 with tags lua, c

协议设计

  • 协议类型:schema

  • 支持类型:int, string, array

  • 采用lua table定义协议

   p = {
       name = "hanxi",
       tel = 1383838,
       addresslist = {
           address = "gz",
           addtype = "work",
       },
   }

p 是定义一个协议格式,其中,addresslist是array类型,定义的内容表示array的元素的格式。协议的实际内容格式如下:

  p = {
      name = "hanxi",
      tel = 1383838,
      addresslist = {
          {
              address = "gz",
              addtype = "work",
          },
          {
              address = "jj",
              addtype = "home",
          },
  }

协议打包

  • 只打包value,key不打包

  • 协议模板做预处理,把key排序,添加字段_keysort.

p = {
      keysort = {"addresslist","name","tel"},
      name = "hanxi",
      tel = 1383838,
      addresslist = {
          keysort = {"addtype","address"},
          address = "gz",
          addtype = "work",
      },
}

协议解包

  • 根据协议模板,解析协议

  • 遍历顺序按照_keysort

实现

在c中提供接口:

    luaL_Reg l[] ={
        { "packinit", lpackinit },
        { "write", lwrite },
        { "getpack", lgetpack },
        { "unpackinit", lunpackinit },
        { "read", lread },
        { NULL, NULL },
    };

packinit, write, getpack三个函数用于打包协议

unpackinit, read 两个函数用于解包协议

  • 打包int时分64位,32位,16位,8位。第一个字节存储int位数和正负数标志

  • 打包sting时,先存储字符串长度,按int的方式打包,然后打包string

全部代码: https://github.com/hanxi/lproto

[原创]使用cocos2d-x v3.1开发小游戏(基本框架)

Posted by 涵曦 at 2014-07-15 with tags cocos2d-x, lua, c++

小游戏的组成

  • 欢迎界面

在游戏资源未全部加载完之前就需要载入,避免进入游戏会有一段黑屏时间。

可以用来展示游戏名称或者开发者logo。

  • 开始菜单界面

一般用于显示游戏名称和关卡选择(或者称游戏难度选择)。

可以外加一些设置性功能,如声音开关,帮助入口等等。

如果游戏设置内容较多可以把设置作为一个单独界面,在开始菜单上提供入口即可。

有的小游戏是以弹窗方式的菜单

  • 主游戏界面

游戏的中心部分,比如2048游戏的格子滑动界面,扫雷游戏的扫雷界面,贪吃蛇游戏的蛇移动的界面,等等。

小游戏拥有这一个界面也能算一个小游戏,但是没有其他界面会使游戏缺少更多选择。

游戏的主要逻辑都是在完成这个界面。

  • 游戏结束界面

游戏结束一般都会有个分数,用于展示本次游戏得分和历史最高得分对比。

在这个界面上可以添加再玩一次的按钮,让玩家重新玩一次。

大多数小游戏都是以弹窗的方式展示游戏结果。

  • 排行榜界面 (可选)

游戏中有分数这个概念就会有排名。

可以是单机的排行榜,也可以是联机的排行榜(需要服务器保存数据)。

排行榜可以促进玩家拿到更高的分数(也是有缺点的,看到其他玩家玩的分数太高了而放弃了)。

cocos2d-x v3.1 lua 框架的使用

  • lua代码结构

src
├── conf.lua                  # 配置文件,一些不变的配置保存在这里
├── GameOverScene.lua         # 游戏结束的界面
├── GameScene.lua             # 游戏主逻辑界面
├── HelloScene.lua            # 欢迎界面,在这里做资源更新检测
├── main.lua                  # 游戏lua脚本的入口
├── MainMenuScene.lua         # 游戏主菜单界面
├── RankScene.lua             # 排行榜界面
└── util.lua                  # 通用功能函数实现

每个XXOOScene.lua 文件的样子如下:

local XXOOScene = {}

XXOOScene.newScene = function ()
    local scene = cc.Scene:create()
    -- do other XXOO things
    return scene
end

return XXOOScene

关于Scene界面跳转,在util中封装一个通用函数用于界面跳转。

function util.toScene(scene)
    -- 增加一个统一的界面跳转动画
    scene = cc.TransitionSlideInR:create(0.5, scene)
    if cc.Director:getInstance():getRunningScene() then
        cc.Director:getInstance():replaceScene(scene)
    else
        cc.Director:getInstance():runWithScene(scene)
    end
end

main.lua用户进入HelloScene界面

HelloScene = require("src/HelloScene")
 
local function main()
    cc.FileUtils:getInstance():addSearchResolutionsOrder("src")
    cc.FileUtils:getInstance():addSearchResolutionsOrder("res")
 
    HelloScene.newScene()
end
 
 
local status, msg = xpcall(main, __G__TRACKBACK__)
if not status then
    error(msg)
end
  • 游戏启动logo的Scene特殊处理

因为加载lua资源需要时间,待所有资源都加载完再创建游戏启动界面会出现启动的时候黑屏。我在1G的安卓机上测试需要5秒才能进入到lua创建的Scene。

解决方案:在 C++ 中创建启动画面,HelloScene.lua中不做创建Scene的操作,直接getRunningScene。

AppDelegate::applicationDidFinishLaunching () {

    // ... other xxoo things

    auto scene = Scene::create();
    auto s = Director::getInstance()->getWinSize();
    auto layer = LayerColor::create(Color4B(255, 255, 255, 255), s.width, s.height);
    auto logo = Sprite::create("res/logo.png");
    layer->addChild(logo);
    logo->setPosition(Vec2(s.width*0.5,s.height*0.7));
    scene->addChild(layer,0);
    director->runWithScene(scene);
 
    // 特殊处理,延迟加载lua(创建好logoScene再加载)
    auto action = CallFunc::create(startLua);
    layer->runAction(action);

    return true;
}
  • cocos2d-x v3.1 引擎的精简

起因: 引擎编译完之后发现lib文件相比2.x版本的大了不少。由于是做小游戏,一般都会有用不到的引擎部分,比我我就没用到ui编辑器,所以就想办法不编译ui编辑器部分。

步骤:

  • 找到mk文件: $ find . -name "Android.mk"

  • 修改mk文件,把与ui编辑器相关的语句注释掉。

  • 编译,在编译错误提示中找出还有什么需要注释的代码。我遇到的问题主要是CCB那些。需要在lua_cocos2dx_extension_manual.cpp中把CCB的代码注释。

  • CCLuaStack.cpp中也需要注释几个注册函数。

我还精简了物理引擎,刚开始是用到了的,但后面看小游戏用不上就把它也干掉了(大概省下1M)。

  • cocos/scripting/lua-bindings/auto/ 下的文件生成

看README后执行生成命令,遇到了一些问题:

  • 问题1:官方只提供ubuntu 64位的libclang.so文件,在32位机子上跑会报下面这个错误

  • LibclangError: libclang.so: wrong ELF class: ELFCLASS64. To provide a path to libclang use Config.set_library_path() or Config.set_library_file().

  • 解决方法:在llvm官网下载4.3版本的llvm和clang。编译生成libclang.so.3.4。拷贝到bindings-generator/libclang/下覆盖libclang.so文件。怎么编译的那个博客现在找不到了,步骤大概是:

  • clang-3.4.src.tar.gz 和 llvm-3.4.src.tar.gz 。解压,然后把clang目录拷贝到llvm-3.4/tools/下。编译,在llvm-3.4同一个目录下建一个build文件夹,进入到build,执行cmake ../llvm-3.4/CMakeLists.txt

文字描述可能不清晰,目录结构如下:

. -> build
| ->llvm-3.4  -> tools -> clang -> CMakeLists.txt
             |-> CMakeLists.txt

  • 问题2: 找不到头文件,报错出现unkown type name ,原因是官方配置的android_headers路径和我电脑上的不一样,主要是gcc的版本,我的是4.8的,官方配置是4.7。如下:

  • details = "unknown type name '__locale_t'"

  • 解决方法:修改cocos2dx.ini中的android_headers 的值把/cxx-stl/gnu-libstdc++/4.7/ 改成/cxx-stl/gnu-libstdc++/4.8/ 。有两个地方要修改。这个问题要看自己的安卓ndk的配置情况,也许你的还是4.6呢,自己可以去ndk对应的路径下找找看自己的ndk版本。

全民顶爆菊花

应用宝:http://android.myapp.com/myapp/detail.htm?apkName=com.hanxi.runtodie

百度手机助手:http://as.baidu.com/a/item?docid=6678809

豌豆荚:http://www.wandoujia.com/apps/com.hanxi.runtodie

代码地址:https://github.com/hanxi/cocos2d-x-v3.1