这个三角棋,是一个双人对战的棋类游戏,黑白双方轮流下子,然后最终(旗子铺满所有可落子的点后),数一数谁围成的正三角形多,谁就获胜。这里的正三角形可以是变成1个单位的,也可以是更大的,所以还是有一定的变化性的。如果开启了“高级模式”,斜的正三角形甚至也能算在里面。
点子其实是几年前就想到了,当时是想和小学生的娃下棋,在卡纸上画过一个棋盘,用笔下棋,然后手工数结果,就当让娃练习一下对几何图形的敏感性了。也确实下过几盘,还有点好玩的。
其实那时候就试着写过一个web页面,想把这些逻辑程序化,但其实真去手工画图,发现还有点麻烦,后来就没做出来,就这么放了几年。
最近,大家都在说cursor如何如何好用,小学生都能用它写个像模像样的小游戏,于是也就下载下来试试。在想让它写个啥的时候,突然就看到之前写了一半的代码,于是。。。就写出了现在这个还算完整的版本。
cursor写代码确实方便,配合 claude-3.5-sonnet,基本上真的是自然语言编程了,小修改也都是“tab到底”,科技发展确实日新月异了。
更要命的是,我让AI写了个“人机”,稍微调整一下策略之后,发现这不到一百行JS代码的人机居然还挺强的,虽然每次都只考虑一步,但已经不是随随便便都下赢的了。不信的话,大家可以试试。
Enjoy!
发表于:2024年10月03日 16:28 | 分类: 游戏 | 2 个评论 »
前言:
自从我2022年来到新加坡以后,就发现这边有些地方确实是挺人性化的。举个我自己感受最深的例子:这边会有很多的免费喝水点,分布在机场里、食阁角落、公厕边上、小区内部,最主要还有很多在公园里和绿道边。要知道新加坡是一个接近赤道的热带国家,气温一直比较高,如果出门在外,是很容易口干舌燥的,如果去哪都要自己带水会很麻烦,如果光靠买水,那经济上的压力也会不小。
在户外能喝到免费放心的饮用水,对喜欢户外跑步或者徒步的人(比如我)尤其友好。但也因此带来了一个小小的问题:当我探索到一个陌生的地方,我要怎么才能知道附近哪来有喝水点呢?
试着解决:
我当然想过在google maps或者苹果的地图里搜索,但很遗憾,这个数据可能只在新加坡有意义,需求也相对比较小众,因此这些巨头企业是覆盖不到这个需求的。在新加坡的各种政府网站,我也没有搜到想要的答案。
而且,我看到有人做了类似事情,比如这个: https://linktr.ee/brayontng 作者是一个大一到学生,用Google forms收集数据,最终在google maps的自定义地图上做展示。但现在似乎也有大半年没更新了,而且我身边熟知的几个点好些都没有收录。还有就是大部分点都没有图片,真要用起来可能也不是太方便。
我的方案:
所以,我想到做一个手机app,嵌入地图SDK,打开app就能显示附近的喝水点,除了告诉你经纬度以外,还会告诉你所在楼层、水是常温的还是冰水或者热水;并且能显示一张图片,让你大致知道周边的情况,还能方便地调用第三方地图软件导航过去。
当然,我自己并没有完整的数据。所以,还会有一个“上传喝水点”的功能,希望发挥广大网友的力量,逐步完善这个数据。最终希望能覆盖整个新加坡绝大部分的喝水点。
于是,就有了 thirsty@SG。不过由于我也是刚学的SwiftUI,对界面设计也不太在行,因此目前app可能会有这样那样的小问题,界面也比较简陋,但我还是会尽我所能把这个事情做好。
APP:
所以,大家可以通过这里下载这个叫做“thirsty@SG”的app。目前只有iOS的,因为我不会安卓的app开发,可能暂时不会有安卓的版本。而且目前仅限在新加坡范围内使用,暂时没有打算支持更多地区。
关于上传喝水点:
方法也很简单,点击app左下角,会弹出上传的界面,此时需要拍一张喝水点的照片,app会自动获取此时的经纬度信息,填上一些必要的信息以后,就可以点界面上的“upload”上传了。
显示上传成功以后,暂时还不会直接在app上显示,为了防止有人滥用而误导其他用户,我设计了数据需要审核才能生效,审核我主要会看上传的照片,因此照片是不接受图库里选择的,只能现场拍,望大家理解。我也会尽快审核,慢也不太会超过一天。
上传的时候,可以选择填上你的邮箱。即使填了,也不会在任何地方公开这个信息,万一以后有会员体系什么的,这些做过贡献的用户,肯定默认就是高级用户。(对,我在画饼了,哈哈)
如果在使用app的过程中有任何问题,可以通过X(前Twitter)联系我: https://twitter.com/senob_ 其他未尽事宜,也欢迎联系咨询。
发表于:2023年11月13日 17:22 | 分类: 精华 | 2 个评论 »
没有人会想到,这个沉默了多年的blog居然还活着,更没有人会想到,它居然还更新了。。。
也没有啥起因,一切都很随意。我最近在学习一些区块链相关的技术,看到这篇文章感觉不错,正好也在提升英语,于是就打算给他翻译出来。那既然都已经翻译了,不如就发表出来吧。
英文原文在这里,如果英文不错的话,还是建议直接看原文,他有很多“银河系漫游指南”相关的梗,很难翻译出来(主要是我也不太懂这些梗),哈哈!
=========开始的分割线=========
点击查看全文 »
发表于:2023年01月19日 15:54 | 分类: 精华 | 标签: bitcoin, blockchain | 2 个评论 »
这是我第二次走进后山的这个神奇的山洞。
洞口不到一人高,大致呈一个不太规则的圆形,我稍微弯了下腰,侧身进了洞口。
和所有的晴朗夏日一样,山洞外面的天气有些闷热,阳光直勾勾地照射着江南这片肥沃的土地,山上高高低低的灌木显得有些无精打采,耷拉着叶子,与此形成鲜明对比的是那狂躁的知了,一个个都在卖力地大声叫着,似乎每只都怕自己的声音被其他知了淹没了。
但刚走进这个山洞,感觉就和外面完全不一样了。由于大山的阻隔,阳光没法照入这个山洞,体感瞬间就阴凉了下来,很是舒服。然后,外面嘈杂的知了声也迅速变小了,才往里走了几步,就安静地能听见针掉在地上的声音了。这时我就发现了这个山洞不寻常的地方——这里并不黑,虽然洞里面没有任何可见的光源,但走了几步后,周围的亮度就稳定了下来,并不是常理的越走到里面越黑,大致相当于正常的白天室内的亮度吧。
越往里走,空间就越大,现在不仅能站直身子,“天花板”已经高高在上了。
这时候,山洞就拐了个弯。我感觉这是一个U形的180度的大弯,但奇怪的是,这个弯并没有让我回到山的外面,而是进入了一个巨大的大厅,这大厅到底有多大呢?虽然我没有去过北京的人民大会堂,但我几乎可以确信这个山洞内的大厅不会比人民大会堂小。
这时,我想起前几天我第一次来到这里时的情景,当时的遭遇着实吓了我一跳:
当时我看到这个大厅靠里面的位置有一些椰子树,上面的椰子已经成熟了,密密麻麻地挂着,甚是诱人。而我那时有点儿口渴,就只想打个椰子吃,也没有觉得这么多椰树长在浙江有什么不妥——更何况还是长在一个山洞的里面。但即便我不去理会椰树的来源,接下来发生的事情也足够使我震惊的了。
我首先想到的采椰子的方法是拿石头砸,反正山洞里并不缺小石头。于是我捡起一块大小趁手的石头,瞄准一个我觉得比较好吃的椰子,用力砸了过去。石头在空中划出了一道漂亮的抛物线,眼看就要砸中我事先选好的椰子了,正在我对自己的投石技巧洋洋得意的时候,奇怪的事情发生了——石头似乎穿过了那个椰子,继续沿着抛物线在前进着,也不知道后来落到了哪里。我揉了揉自己的眼睛,虽然我不愿意相信,但那颗椰子还是完好无损地挂在椰树上。接着我又捡了几块石头尝试,但相同的事情每次都发生了。
虽然我此时已经是满脑子疑惑,但还是没有放弃想吃一个椰子解渴的想法,于是我在山洞的大厅里,好不容易找到了一根足够长的杆子,拿着杆子走到了一棵椰树的底下,努力举起杆子,使它伸向了我心心念念的椰子。但这次还是没有如我的意,杆子在触碰到椰子的时候,我没有感觉到任何的阻力,杆子直接穿过了椰子。。。
这时候,我不免开始有点害怕了,丢下杆子,开始往回跑。好在撤退的过程比较顺利,往回转过那个U形大弯,没几步就到了山洞的出口。俯身出了洞口后,又回到了现实的世界,外面还是这么闷热,知了还是卖力地叫着,一切都是那么地熟悉,这感觉真好。
丛里面出来以后,我从来没有和任何人提起过这个奇怪的山洞,其实即使说了估计也没人会相信我,只会让人觉得我发疯了吧。而我也给了自己一个很勉强的解释:那些椰树类似海市蜃楼,通过某种奇特的光学作用投射到了山洞里面,所以才看得见摸不着。至于为什么海市蜃楼会出现在一个封闭的空间里之类的细节问题,我就没多想了,我怕自己也给不出合理的解释,反而徒增烦恼。
也许是我内心的好奇心驱使着我,也许这就是鬼使神差。反正,现在的我又一次怀着忐忑不安的心情,站在了这个大厅面前。
而这里已经看不到之前的那片椰树林了,取而代之的是一片沙滩。
对,你没看错,是一片金黄色、软绵绵的沙滩。
其实山洞还在,我也还在山洞的大厅里,但稍远处就是那片沙滩。给人的感觉就好像山洞的大厅里嵌入里一个巨大的、占满整个大厅的显示器,而那片沙滩就是显示器里播放着的动态图像。但我的大脑马上就否定了这个“显示器假说”,因为即使这是个视网膜屏的显示器,即使可以做到无限大的分辨率,也不可能做到如此逼真的裸眼3D效果——我能看到沙滩稍远处微微的海浪一层层地冲刷着沙滩,能感受到海风拂面的那种舒服的感觉,甚至能闻到咸湿的海水的气息。
最重要的是,沙滩上还放着两张躺椅,上面分别躺着一男一女两个“人”。男的身材魁梧,肌肉健硕,可以说是棱角分明,国字脸上分布着端正的五官,很是帅气。女子很年轻,有点微胖,但整体身材也是极好的,该凸的地方凸、该翘的地方翘,皮肤白皙而光滑,留着一头飘逸的长发。他们都一丝不挂地躺在躺椅上晒着日光浴——没错,这个藏在山洞里的沙滩确实还有一个明媚的太阳。
也许他们是感觉到我走近了,原本头朝着我这个方向平躺着的两个人,都侧身转过头来看了看我。虽然他们脸上都带着笑容,这妹子的笑容还很甜美。但我还是有点被他们吓到了,因为他们侧身以后,我就看到了他们有个明显不同于人类的地方:他们的背后都有一对翅膀——并不是鸟类那种带有羽毛的翅膀,否则我会以为自己见到了天使——而是类似芭蕉树叶子的一对绿色的、薄得有点半透明的翅膀,这翅膀的面积也不算太大,收起来之后不会比他们的身体更宽了,我很难想象这么一对薄薄的小翅膀能让这个体型的他们飞起来。
似乎是为了打消我的疑虑,这个妹子就真的轻轻扇动翅膀,飞了起来。她拍打翅膀的频率很慢,感觉很轻松,完全不费劲地就悬停在了不到一人高的低空中。
我正在纳闷,这不符合物理学规律啊,这么小的翅膀慢慢地扇着,怎么能提供足够的力来支撑妹子的重量呢?不科学!
“你好!”,男的说话了,打断了我自顾自的思考。
这时我才意识到自己多少有点不够礼貌。忙回道:
“你好。。你好,我有打扰到你们吗?”
“不碍事,我们有的是时间,而且我们在这此处休息的目的之一本来也是在等你。”妹子回答道,她的声音很软也很好听。
“等。。。等我?”
看着我丈二和尚摸不着头脑的样子,妹子忍不住笑出声来,说:“是啊,请帮忙在我们的旅行册上签个名吧!”
看到我露出了更加疑惑的表情,男的也忍不住笑了。开始解释起来:“我们是来自大麦哲伦星系,WOH G64恒星的星际旅行者,在过去几年时间里,已经去过5个星系的几百颗恒星旅行了。每到一颗恒星,如果那颗恒星系里存在高等智慧生命,有自己的文字,我们就会收集一个当地文明的“签名”以做纪念,至今也已经收集了十几个签名了吧,最近在银河系边缘的猎户旋臂区域闲逛时,发现这个叫做太阳系的地方疑似有智慧生命存在,于是就来碰碰运气,结果果然没让我们失望。”
“是啊!”妹子接过话茬,继续说道:“这个叫地球的行星实在是太美了!这里有高山、有大海,有森林、有草原,还有无数种类的动物和植物,显得生机勃勃,一切都是这么的和谐美好,我们都不想回去了,哈哈!”
看我露出了会心的笑容,妹子似乎突然想起了正事,说:“你等我一下,我去拿下旅行册!”
说完轻轻扇动翅膀,自顾自地飞到了不远处的一个奇怪的篷子边上。
这时我才注意到原来那里还存在着这么一个奇怪的篷子,粗看上去,就像一个不起眼的大帐篷,篷布甚至显得有点破旧,内部似乎用六根柱子支撑着,外观呈现出六边形。但仔细看,就会发现着篷子很有“科技感”,帐篷的门并不是一个简单的布帘子,而是有一个“摄像头”,似乎能识别门口站着的是不是主人。帐篷的各处还分布着各种指示灯,时不时地闪烁着。
妹子似乎很轻盈,不一会儿就降落在了帐篷的门口,她收起翅膀的同时,门自动打开了。她转身就进去,才一会儿,就拿到了她说的旅行册,又轻盈地飞了回来。
我心里暗暗地想,她会拿出什么高科技的旅行册过来给我见识见识呢?但没想到的是,拿过来的真的只是一个旅行册而已,我几乎能肯定那是一本普通的纸做的册子,即使放在夜市的地摊里,也不会显得太突兀。上面贴的也都是地球上的美丽风景照,当然还有两位外星人的各种姿势的自拍照,我终于知道自拍已经不是地球人的专利了。
妹子走到我跟前,打开一页,递给我看。我很自然地伸手去接,结果奇怪的事情再次发生了。我的手穿过了那本册子,根本没有感觉到有任何交互。妹子和她的旅行册虽然近在眼前,但似乎又和我处于完全没有交集的两个世界。
这时,她不知道从哪里拿出了一支笔,朝我递了过来。看上去着就是很普通的一支钢笔,这倒是和那旅行册很相配。但仔细看,马上能看出不简单的地方,这支笔的全身覆盖着一层不一样的金光——并不像是笔本身发出的光,而像是有人刻意想把笔丛周遭的环境中突显出来而做的标记,就像是某些游戏里的可交互的宝物会有的标记一样。
看着妹子甜美的笑容里完全没有恶意,我也就放心了忐忑的内心,伸手去接这支笔。这次一切正常——倒使我感到不习惯了——我能感受到笔正常的重量和温度,并且拿在了我的手上,虽然笔还是闪着那奇怪的金光。
在妹子的示意下,我拿起了这支笔,在她拿着的旅行册上签下了自己的名字——刘顺。拿着这支普通又特殊的笔,签字的过程倒是很顺利,笔尖碰到旅行册的纸张时,有正常的力反馈,留下的笔迹也清晰可见。
签完后,妹子说道:“谢谢你,地球人的文字真好看,尤其是这片地区流行的文字,就像艺术品一样!”
看着妹子露出满意的笑容,我也开心地。。。醒了。。。这真是一个不错的梦!
——以上源自一个我做的梦,情节略有增改。
发表于:2018年04月05日 13:18 | 分类: 记梦器 | 5 个评论 »
很久之前找到的小脚本,比较方便,可以基于此,自己在里面写各种逻辑,比如之前我是给改成做30x的跳转(根据输出参数,跳转到不同url),还是很合适的。
最近又想用,发现几乎找不到了,很多收藏的链接都已经失效了,于是觉得还是应该在自己能把控的地方记录下,把代码帖这个里吧,这个的效果和 python 的 SimpleHTTPServer 有点类似。
注意,这个脚本没有任何安全性可言,可以通过..
访问到上级目录,也可能通过``
执行任意指令,所以最好别长期开着。这只是个例子,处理逻辑自己改。
#!/usr/bin/env bash
while true
do
f="/tmp/out$RANDOM"
mkfifo "$f"
trap "rm -f $f" EXIT
cat "$f" | nc -4l 8000 > >(
export REQUEST=
while read -r line
do
line=$(echo "$line" | tr -d '\r\n')
echo $line
if echo "$line" | grep -qE '^GET /' ; then
REQUEST=$(echo "$line" | cut -d ' ' -f2)
elif [ -z "$line" ] ; then
( #这里面写自己的处理逻辑,这是一个很丑的例子。
if [ "$REQUEST" == "/" ] ; then
Message_Body="<!DOCTYPE html><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8></head><body>
`find . -type f -exec ls -l {} \; | awk '{print $1,$2,$3,$4,$5,$6,$7,$8,"<a href=\\"/" $9 "\\">" $9 "</a><br>"}'`</body></html>"
else
Message_Body="`cat "./$REQUEST"`"
fi
echo -en "HTTP/1.0 200 OK\nContent-Length: ${#Message_Body}\n\n$Message_Body"
) > "$f"
fi
done
)
rm -f "$f"
echo done, next request.
done |
#!/usr/bin/env bash
while true
do
f="/tmp/out$RANDOM"
mkfifo "$f"
trap "rm -f $f" EXIT
cat "$f" | nc -4l 8000 > >(
export REQUEST=
while read -r line
do
line=$(echo "$line" | tr -d '\r\n')
echo $line
if echo "$line" | grep -qE '^GET /' ; then
REQUEST=$(echo "$line" | cut -d ' ' -f2)
elif [ -z "$line" ] ; then
( #这里面写自己的处理逻辑,这是一个很丑的例子。
if [ "$REQUEST" == "/" ] ; then
Message_Body="<!DOCTYPE html><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8></head><body>
`find . -type f -exec ls -l {} \; | awk '{print $1,$2,$3,$4,$5,$6,$7,$8,"<a href=\\"/" $9 "\\">" $9 "</a><br>"}'`</body></html>"
else
Message_Body="`cat "./$REQUEST"`"
fi
echo -en "HTTP/1.0 200 OK\nContent-Length: ${#Message_Body}\n\n$Message_Body"
) > "$f"
fi
done
)
rm -f "$f"
echo done, next request.
done
另外,也可以看看几年前的这篇。
发表于:2018年03月08日 16:12 | 分类: CLI软件 | 3 个评论 »
经常接触linux,尤其是多人共用的服务器上的linux的朋友,也许会经常遇到这样的问题:
收到一个磁盘告警,说某某分区已经满了,然后登录服务器 df
一看,发现磁盘确实快满了,然后你就想找到具体是哪个目录满了,于是 du -s *
一看,却发现所有子目录的大小总和却和df显示的总已使用磁盘空间对不上,有时候甚至还相差很多,于是就纳闷了:我的磁盘空间去哪了呢?
这里就列一下我所知的3种情况:
- 隐藏文件
linux系统把文件名以.
(点号)开头的文件视为隐藏文件,而类似bash里*这样的操作符是不会匹配隐藏文件的,所以如果根目录下有个较大的隐藏文件的话,是不会被du -sh * 统计到的,解决办法就是: du -sh .[^.]*
。
- 非空目录被mount
一般挂载其他分区的时候都是建议mount到一个空目录的,那么如果mount到一个非空的目录,情况会怎么样呢?比如/mnt目录本来里面是有文件的,然后执行了sudo mount /dev/sda6 /mnt
。其实这个mount命令完全能正常执行,被mount的分区也能正常访问,只是原先在/mnt里的文件,现在已经访问不到了,包括du也看不到大小了,但是磁盘空间却还是被占着,因为如果你 umount /mnt
以后,原来的文件都还会回来的。
- 空洞文件
一个文件的大小和所占磁盘空间也不一定完全一致,比如某个程序一直打开着一个叫log的文件在写,而中间有人用 > log
命令清除了log的内容,就会产生这样的文件。这里有这种文件的介绍。
上面3种是我所知的,应该还有其他情况,欢迎留言补充。
发表于:2011年09月25日 21:37 | 分类: 经验技巧 | 19 个评论 »
最近又搬家了,需要重新办理宽带。问了下电信和网通的价格,虽然华数网通便宜很多,但是那句“一分钱,一分货”还真是一点都没错,之前用过才知道网通不是一般的垃圾,详见我以前的牢骚,所以还是办理了电信宽带。
这电信的入户方式和网通不一样,是电话线入户的,也就是说局端接过来的是一个RJ11的水晶头,然后电信会给一个modem,一般的上网方式就是在modem后面接一个无线路由,再用路由拨号。
但是这样显然不够方便,因为我的路由器是淘宝上淘的RG100A-AA,上面是有RJ11接口的,如果能用路由器直接拨号,就可以抛开电信给的modem了,这样会环保很多(至少modem的电源就不需要了)。
然而,我的路由器默认刷的是OpenWRT的固件,这固件是完全开源的,功能非常强大,什么电驴、BT、samba、FTP、print server统统支持,但是唯独不支持adsl拨号。。。查其原因,据说是BCM系列芯片的adsl驱动是dlink享有版权的,并且不开源。想要用adsl功能必须给路由器刷上基于dlink的固件。
了解到这个信息以后,就开始搜索靠谱的dlink固件,最后我用的是这里下载(需注册)的,这个版本有web界面(英文)、有ssh。基本就可以玩了。
下载后在原来的OpenWRT的web界面里直接上传文件,再重启就刷好固件了,这步真是超乎想象的简单。
再次登录,就是dlink的界面了,默认的用户名和密码都是admin
,进去以后,就可以进行一堆设置了,诸如wifi的ssid、密码之类的,都是大同小异,唯一值得一提的是ADSL拨号的设置:
要先在’Advanced Setup’里选择’Layer2 Interface’,就是OSI7层模型里的第二层了,下面有个’ATM Interface’,需要add一条记录,add的时候,会让你填两个数值,就是 VPI 和 VCI ,这两个值各地的运营商都会不一样,比如我这里是杭州余杭电信,这两个值是8/35,具体的值可以到网上查或者是打10000询问电信(不知道电信会不会告诉你)。关于ATM层的更多介绍详见这里。
‘ATM Interface’ 设置好以后,就可以设置’WAN Service’了,这里需要选择刚刚设置好的ATM设备,比如我这是 ATM0/0_8_35
,然后下一步就是填个账号和密码之类的,保存就会自动拨上ADSL了,整个过程还是蛮有趣的,还可以顺便学习一下底层的网络知识。
另外,据说已经有人把dlink的adsl模块二进制地移植到了OpenWRT了,并且已经可用了,说不定哪天我就回OpenWRT了,哈哈。
发表于:2011年06月10日 22:04 | 分类: 经验技巧 | 10 个评论 »
注意:此脚本只是一个对我来说刚刚够用的脚本,并不是一个通用的方案,如果你的源DVD里有多语言、多字幕之类的,很可能需要修改参数才能正常运行,另外输出文件的码率、画面长宽、声音采样率等,也需要按实际情况修改。
给儿子买了12张巧虎的DVD,但是这年头,已经很少见DVD播放器了,电视机都是直接插U盘的,所以打算把DVD里的内容dump到U盘里(mp4格式),再进行播放。我的盘是按故事分段的,所以我也按段分成不同的mp4文件,一个盘的内容放在一个目录里。
用到的几个命令:
lsdvd
命令可以取得DVD的标题、语言、字幕、分段等信息。
mencoder
是个强大得一塌糊涂的视频/音频编码工具。
eject
命令可以弹出光盘,放在脚本最后最合适了。
上脚本:
#!/bin/sh
DIR="/media/sda1/qiaohu"
DVD=`lsdvd`
title="`echo "$DVD" | grep "^Disc Title:" | cut -d ":" -f2-`"
title=${title:1}
chapters="`echo "$DVD" | grep "^Title" | awk -F"[ ,]+" '{print $6}'`"
echo "$title | $chapters"
T="$DIR/$title"
if [ -d "$T" ] ; then
i=1
while [ -d "$T$i" ] ; do
((i++))
done
T="$T$i"
fi
mkdir "$T"
i=1
while [ $i -le $chapters ] ; do
echo $T/$i.mp4
mencoder -of lavf -lavfopts format=mp4 -oac lavc -ovc lavc -lavcopts aglobal=1:vglobal=1:vcodec=mpeg4:vbitrate=800:acodec=libfaac:abitrate=96 -af lavcresample=48000 -vf dsize=720:540:0,scale=0:0,expand=720:540,harddup -ofps 29.970 -srate 48000 -o "$T/$i.mp4" dvd://1 -chapter $i-$i
((i++))
done
eject |
#!/bin/sh
DIR="/media/sda1/qiaohu"
DVD=`lsdvd`
title="`echo "$DVD" | grep "^Disc Title:" | cut -d ":" -f2-`"
title=${title:1}
chapters="`echo "$DVD" | grep "^Title" | awk -F"[ ,]+" '{print $6}'`"
echo "$title | $chapters"
T="$DIR/$title"
if [ -d "$T" ] ; then
i=1
while [ -d "$T$i" ] ; do
((i++))
done
T="$T$i"
fi
mkdir "$T"
i=1
while [ $i -le $chapters ] ; do
echo $T/$i.mp4
mencoder -of lavf -lavfopts format=mp4 -oac lavc -ovc lavc -lavcopts aglobal=1:vglobal=1:vcodec=mpeg4:vbitrate=800:acodec=libfaac:abitrate=96 -af lavcresample=48000 -vf dsize=720:540:0,scale=0:0,expand=720:540,harddup -ofps 29.970 -srate 48000 -o "$T/$i.mp4" dvd://1 -chapter $i-$i
((i++))
done
eject
突然又觉得这事儿挺折腾的,呵呵,而且不知道这样做(自己dump、自己看)算不算侵犯版权呢?
发表于:2011年05月15日 21:34 | 分类: CLI软件 | 10 个评论 »
本文说的mysql主备是指单向、异步的数据复制。可以是一个主、多个备。
这样做的好处显而易见:有利于健壮性、速度和系统管理。备用数据库可以做为只读查询和备份的机器,减轻主用数据库的负担。
实施前提:
主用数据库的配置里至少有:
[mysqld]
log-bin=mysql-bin
server-id=1 |
[mysqld]
log-bin=mysql-bin
server-id=1
建议主备的数据库版本一致。
我所知道的最简单的实施方式(不需要停主库,甚至不需要长时间地禁止主库写入):
主库操作:
在主库里建一个复制用的用户:
grant replication slave on *.* TO 'replication'@'备库地址' identified by 'replication'; |
grant replication slave on *.* TO 'replication'@'备库地址' identified by 'replication';
导出主库的数据,并记下当然日志文件和偏移:
mysqldump --master-data=2 --single-transaction -uroot -p --all-databases >dumpfile |
mysqldump --master-data=2 --single-transaction -uroot -p --all-databases >dumpfile
这里是把数据以SQL的形式导出,并记下导出瞬间的日志文件和偏移(得益于--master-data=2
参数),出来的dumpfile的前面会有一行类似以下的注释信息,就是文件名和偏移值了:
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000011', MASTER_LOG_POS=1061553673; |
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000011', MASTER_LOG_POS=1061553673;
对于这步,网络上一般采用的方法为:
FLUSH TABLES WITH READ LOCK;--先把主库设置成只读,然后导出SQL或者直接复制数据文件
SHOW MASTER STATUS; --记下日志文件和偏移
UNLOCK TABLES; --恢复主库写入 |
FLUSH TABLES WITH READ LOCK;--先把主库设置成只读,然后导出SQL或者直接复制数据文件
SHOW MASTER STATUS; --记下日志文件和偏移
UNLOCK TABLES; --恢复主库写入
这样,至少在复制数据的那段时间,主库是不可提供服务的。
备库操作:
复制主库的/etc/my.cnf
和dumpfile
。
把主库配置里的 server-id 改成2(或者3、4,多个备库保存互不相同),再加上
relay-log = slave-relay.log
relay-log-index = slave-relay-log.index |
relay-log = slave-relay.log
relay-log-index = slave-relay-log.index
导入数据:
进入mysql命令行执行:
SLAVE STOP;
CHANGE MASTER TO
MASTER_HOST='主库地址',
MASTER_PORT=3306,
MASTER_USER='replication',
MASTER_PASSWORD='密码',
MASTER_LOG_FILE='mysql-bin.000011',
MASTER_LOG_POS=1061553673;
SLAVE START; |
SLAVE STOP;
CHANGE MASTER TO
MASTER_HOST='主库地址',
MASTER_PORT=3306,
MASTER_USER='replication',
MASTER_PASSWORD='密码',
MASTER_LOG_FILE='mysql-bin.000011',
MASTER_LOG_POS=1061553673;
SLAVE START;
然后,就搞定了,可以在备库执行
查看同步的状态,如果此命令的输出里有两个“system user”的进程,并且Command都是“Connect”的话,就差不多OK了,此时,任何对主库的修改,都能准实时地从备库里查询出来。
参考文章:mysql官方中文手册
发表于:2011年05月11日 19:48 | 分类: 备忘 | 6 个评论 »
我那Ubuntu源服务器(u.srt.cn),最近出现了一些很诡异的错误。
比如:之前设置的crontab同步linux.deepin.org的iso镜像,已经有一段时间没有成功过了,手工执行rsync,却发现连的似乎是自己,因为banner都出来“Thanks for using SRT ubuntu mirror.”了,但是ping linux.deepin.org 却又能得到正确的结果。
再比如之前我设置了用公钥可以ssh登录另外一台机器,但是现在却提示我输入密码。
排查了许久之后,发现了一个问题,很多(但不是全部)公网的域名虽然ping的时候对应了正确的ip,但是正在使用(比如上面的rsync或ssh)的时候,好像都指到本地了。
再后来,无意之中,发现用ping6 去ping那些有问题的域名,返回的都是 localhost(::1),于是终于知道怎么回事了:系统用IPv6去访问那些域名了,而那些域名的IPv6解析不正确。
为了验证这点,只需要把系统的IPv6彻底禁用再试试就成了,但是服务器也是ubuntu,而ubuntu最新的版本都已经把IPv6编译进内核了,不能通过rmmod来禁用IPv6了,要完全禁用需要修改grub的配置,给内核传参数才行(方法见这里)。
这显然太麻烦了,其实暂时禁用一下还是有方便的办法的,就是这样:
echo 1 | sudo tee /proc/sys/net/ipv6/conf/all/disable_ipv6 |
echo 1 | sudo tee /proc/sys/net/ipv6/conf/all/disable_ipv6
执行完以后,可以执行
来确认已经禁用成功了,如果这命令没有输出就OK了。
然后现在再用ping6的话,会提示connect: Network is unreachable
。
再去试试之前的rsync和ssh,果然都正常了。
现在我担心的是:IPv4地址不都已经枯竭了吗?接下来该怎么办呢?
发表于:2011年02月10日 17:50 | 分类: 故障分析 | 6 个评论 »