噫吁嚱,危乎高哉!蜀道之难,难于上青天!
蚕丛及鱼凫,开国何茫然!
尔来四万八千岁,不与秦塞通人烟。
西当太白有鸟道,可以横绝峨眉巅。
地崩山摧壮士死,然后天梯石栈相钩连。
上有六龙回日之高标,下有冲波逆折之回川。
黄鹤之飞尚不得过,猿猱欲度愁攀援。
青泥何盘盘,百步九折萦岩峦。
扪参历井仰胁息,以手抚膺坐长叹。
问君西游何时还?畏途巉岩不可攀。
但见悲鸟号古木,雄飞雌从绕林间。
又闻子规啼夜月,愁空山。
蜀道之难,难于上青天,使人听此凋朱颜!
连峰去天不盈尺,枯松倒挂倚绝壁。
飞湍瀑流争喧豗,砯崖转石万壑雷。
其险也如此,嗟尔远道之人胡为乎来哉!
剑阁峥嵘而崔嵬,一夫当关,万夫莫开。
所守或匪亲,化为狼与豺。
朝避猛虎,夕避长蛇;磨牙吮血,杀人如麻。
锦城虽云乐,不如早还家。
蜀道之难,难于上青天,侧身西望长咨嗟!
分类存档: Moo - 第11页
蜀道难 李白
解决Mac蓝牙鼠标卡顿现象
打开“系统偏好设定”,然后点击下面的“网络”图标,打开“网络”设定界面。左下角,会看到三个图标:“+”、“-”,最后一个是齿轮。点击这个齿轮,选择“设定服务顺序”, 在弹出来的对话框中,用鼠标点按住蓝牙PAN,往上拖到第一的位置,然后点击“好”按钮。点击“网络”界面右下脚的“应用”按钮。
经测有效
【转】TCP 状态转换
1、建立连接协议(三次握手)
(1)客户端发送一个带SYN标志的TCP报文到服务器。这是三次握手过程中的报文1。
(2) 服务器端回应客户端的,这是三次握手中的第2个报文,这个报文同时带ACK标志和SYN标志。因此它表示对刚才客户端SYN报文的回应;同时又标志SYN给客户端,询问客户端是否准备好进行数据通讯。
(3) 客户必须再次回应服务段一个ACK报文,这是报文段3。
2、连接终止协议(四次握手)
由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
(1) TCP客户端发送一个FIN,用来关闭客户到服务器的数据传送(报文段4)。
(2) 服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1(报文段5)。和SYN一样,一个FIN将占用一个序号。
(3) 服务器关闭客户端的连接,发送一个FIN给客户端(报文段6)。
(4) 客户段发回ACK报文确认,并将确认序号设置为收到序号加1(报文段7)。
CLOSED: 这个没什么好说的了,表示初始状态。
LISTEN: 这个也是非常容易理解的一个状态,表示服务器端的某个SOCKET处于监听状态,可以接受连接了。
SYN_RCVD: 这个状态表示接受到了SYN报文,在正常情况下,这个状态是服务器端的SOCKET在建立TCP连接时的三次握手会话过程中的一个中间状态,很短暂,基本 上用netstat你是很难看到这种状态的,除非你特意写了一个客户端测试程序,故意将三次TCP握手过程中最后一个ACK报文不予发送。因此这种状态 时,当收到客户端的ACK报文后,它会进入到ESTABLISHED状态。
SYN_SENT: 这个状态与SYN_RCVD遥想呼应,当客户端SOCKET执行CONNECT连接时,它首先发送SYN报文,因此也随即它会进入到了SYN_SENT状 态,并等待服务端的发送三次握手中的第2个报文。SYN_SENT状态表示客户端已发送SYN报文。
ESTABLISHED:这个容易理解了,表示连接已经建立了。
FIN_WAIT_1: 这个状态要好好解释一下,其实FIN_WAIT_1和FIN_WAIT_2状态的真正含义都是表示等待对方的FIN报文。而这两种状态的区别 是:FIN_WAIT_1状态实际上是当SOCKET在ESTABLISHED状态时,它想主动关闭连接,向对方发送了FIN报文,此时该SOCKET即 进入到FIN_WAIT_1状态。而当对方回应ACK报文后,则进入到FIN_WAIT_2状态,当然在实际的正常情况下,无论对方何种情况下,都应该马 上回应ACK报文,所以FIN_WAIT_1状态一般是比较难见到的,而FIN_WAIT_2状态还有时常常可以用netstat看到。
FIN_WAIT_2:上面已经详细解释了这种状态,实际上FIN_WAIT_2状态下的SOCKET,表示半连接,也即有一方要求close连接,但另外还告诉对方,我暂时还有点数据需要传送给你,稍后再关闭连接。
TIME_WAIT: 表示收到了对方的FIN报文,并发送出了ACK报文,就等2MSL后即可回到CLOSED可用状态了。如果FIN_WAIT_1状态下,收到了对方同时带 FIN标志和ACK标志的报文时,可以直接进入到TIME_WAIT状态,而无须经过FIN_WAIT_2状态。
CLOSING: 这种状态比较特殊,实际情况中应该是很少见,属于一种比较罕见的例外状态。正常情况下,当你发送FIN报文后,按理来说是应该先收到(或同时收到)对方的 ACK报文,再收到对方的FIN报文。但是CLOSING状态表示你发送FIN报文后,并没有收到对方的ACK报文,反而却也收到了对方的FIN报文。什 么情况下会出现此种情况呢?其实细想一下,也不难得出结论:那就是如果双方几乎在同时close一个SOCKET的话,那么就出现了双方同时发送FIN报 文的情况,也即会出现CLOSING状态,表示双方都正在关闭SOCKET连接。
CLOSE_WAIT: 这种状态的含义其实是表示在等待关闭。怎么理解呢?当对方close一个SOCKET后发送FIN报文给自己,你系统毫无疑问地会回应一个ACK报文给对 方,此时则进入到CLOSE_WAIT状态。接下来呢,实际上你真正需要考虑的事情是察看你是否还有数据发送给对方,如果没有的话,那么你也就可以 close这个SOCKET,发送FIN报文给对方,也即关闭连接。所以你在CLOSE_WAIT状态下,需要完成的事情是等待你去关闭连接。
LAST_ACK: 这个状态还是比较容易好理解的,它是被动关闭一方在发送FIN报文后,最后等待对方的ACK报文。当收到ACK报文后,也即可以进入到CLOSED可用状态了。
【转】c2d 坐标相关
Node类的setPosition,getPosition函数如果是一个Node的Child则获取的坐标就是该Node的本地坐标
另一个关键问题就是在cocos2d-x里就是各种对象的大小问题。因为在cocos2d-x里Node对象有缩放的方法setScaleX和setScaleY。所以在获取对象大小的时候必须根据情况明确指定获取对象原始大小,还是缩放后的大小。当然cocos2d-x里提供了对应函数来完成这些操作:
getContentSize函数来获得节点原始的大小。只是逻辑尺寸,不是像素。返回CGSize类型。
boundingBox函数来获得经过缩放和旋转之后的外框盒大小,返回CGRect类型。
getContentSizeInPixels获得的是像素点大小
像素点和逻辑点关系:逻辑点大小 = 像素大小/contentScaleFactor.
有个问题最近才遇到,父精灵进行缩放处理,会对子精灵进行标记(boolean值),在实际绘制过程中会影响子精灵显示大小,但并不改变子精灵的getBoundingBox所获得的值,也就是只有直接setscale才会影响getBoundingBox数值。
Sprite中有个方法:
getTextureRect返回精灵纹理大小,返回CGRect类型,并且是原始纹理大小,无关缩放。在一般情况下和getContentSize作用一样,但如果用TP处理过,还回值是实际纹理大小,留白部分会去除。这个在碰撞检测过程中经常用到。
cocos2d中还有两个方法用于坐标转换:
convertToWindowSpace,将节点坐标转换为屏幕坐标,注意的是转换后为UI坐标系。
convertToNodeSpace将屏幕坐标转换为节点坐标,转换后为GL坐标系。
getVisibleSize:默示获得视口(可视区域)的大小,若是DesignResolutionSize跟屏幕尺寸一样大,则getVisibleSize便是getWinSize。
getVisibleOrigin:默示可视区域的出发点坐标,这在处理惩罚相对地位的时辰很是有效,确保节点在不合辨别率下的地位一致。
坐标转换:
GL坐标系,cocos2d-x默认坐标系:
Point Director::convertToGL(const Point& uiPoint)
{
Size s = m_obWinSizeInPoints;
float newY = s.height – uiPoint.y;
}
屏幕坐标系: 默认原点在左上角
Point Director::convertToUI(const Point& glPoint)
{
Size winSize = m_obWinSizeInPoints;
float oppositeY = winSize.height – glPoint.y;
return ccp(glPoint.x,oppositeY);
}
两种坐标的X方向没有变,只变了Y方向,cocos2d-x里默认的GL坐标系,即左下角为原点ccp(0.0f,0.0f)
几种粒子效果
auto s = Director::getInstance()->getWinSize(); auto sun = ParticleSun::create(); sun->setTexture(Director::getInstance()->getTextureCache()->addImage(fire.png)); sun->setPosition(Vec2(s.width / 2 -100, s.height / 2)); sun->setTotalParticles(130); sun->setLife(5.0f); this->addChild(sun); // timers auto fire = ParticleFire::create(); fire->setTexture(Director::getInstance()->getTextureCache()->addImage(fire.png)); fire->setPosition(Vec2(s.width / 2 + 50, s.height / 2)); fire->setTotalParticles(130); fire->setLife(5.0f); this->addChild(fire); auto fireworks = ParticleFireworks::create(); fireworks->setTexture(Director::getInstance()->getTextureCache()->addImage(fire.png)); fireworks->setPosition(Vec2(s.width / 2 + 50, s.height / 2 - 200)); fireworks->setTotalParticles(130); fireworks->setLife(5.0f); this->addChild(fireworks); auto galaxy = ParticleGalaxy::create(); galaxy->setTexture(Director::getInstance()->getTextureCache()->addImage(fire.png)); galaxy->setPosition(Vec2( 50, s.height / 2 + 200)); galaxy->setTotalParticles(130); galaxy->setLife(5.0f); this->addChild(galaxy); auto flower = ParticleFlower::create(); flower->setTexture(Director::getInstance()->getTextureCache()->addImage(fire.png)); flower->setPosition(Vec2( 250, s.height / 2 + 200)); flower->setTotalParticles(130); flower->setLife(5.0f); this->addChild(flower); //流星 auto meteor = ParticleMeteor::create(); meteor->setTexture(Director::getInstance()->getTextureCache()->addImage(fire.png)); meteor->setPosition(Vec2( 250, 20)); meteor->setTotalParticles(130); meteor->setLife(5.0f); this->addChild(meteor); //旋涡 auto spiral = ParticleSpiral::create(); spiral->setTexture(Director::getInstance()->getTextureCache()->addImage(fire.png)); spiral->setPosition(Vec2( 450, 40)); spiral->setTotalParticles(130); spiral->setLife(5.0f); this->addChild(spiral); //爆炸 auto explosion = ParticleExplosion::create(); explosion->setTexture(Director::getInstance()->getTextureCache()->addImage(fire.png)); explosion->setPosition(Vec2( 50, 440)); explosion->setTotalParticles(130); explosion->setLife(5.0f); this->addChild(explosion); //烟雾 auto smoke = ParticleSmoke::create(); smoke->setTexture(Director::getInstance()->getTextureCache()->addImage(fire.png)); smoke->setPosition(Vec2( 450, 640)); smoke->setTotalParticles(130); smoke->setLife(5.0f); this->addChild(smoke); //雪 auto snow = ParticleSnow::create(); snow->setTexture(Director::getInstance()->getTextureCache()->addImage(fire.png)); snow->setPosition(Vec2( 450, 840)); snow->setTotalParticles(130); snow->setLife(5.0f); this->addChild(snow); //雨 auto rain = ParticleRain::create(); rain->setTexture(Director::getInstance()->getTextureCache()->addImage(fire.png)); rain->setPosition(Vec2( 450, 940)); rain->setTotalParticles(130); rain->setLife(5.0f); this->addChild(rain);
Linux Ctrl+Z 用法
假设你发现前台运行的一个程序需要很长的时间,但是需要干其他的事情,你就可以用 Ctrl-Z ,终止这个程序,然后可以看到系统提示:
[1]+ Stopped /root/bin/rsync.sh
然后我们可以把程序调度到后台执行:(bg 后面的数字为作业号)
#bg 1
[1]+ /root/bin/rsync.sh &
用 jobs 命令查看正在运行的任务:
#jobs
[1]+ Running /root/bin/rsync.sh &
如果想把它调回到前台运行,可以用
#fg 1
/root/bin/rsync.sh
这样,你在控制台上就只能等待这个任务完成了.
& 将指令丢到后台中去执行
[ctrl]+z 将前台任务丢到后台中暂停
jobs 查看后台的工作状态
fg %jobnumber 将后台的任务拿到前台来处理
bg %jobnumber 将任务放到后台中去处理
kill 管理后台的任务
命令运行时使用CTRL+Z,强制当前进程转为后台,并使之停止。
1. 使进程恢复运行(后台)
(1)使用命令bg
Example:
zuii@zuii-desktop:~/unp/tcpcliserv$ ./tcpserv01
*这里使用CTRL+Z,此时serv01是停止状态*
[1]+ Stopped ./tcpserv01
zuii@zuii-desktop:~/unp/tcpcliserv$ bg
[1]+ ./tcpserv01 & *此时serv01运行在后台*
zuii@zuii-desktop:~/unp/tcpcliserv$
(2)如果用CTRL+Z停止了几个程序呢?
Example:
zuii@zuii-desktop:~/unp/tcpcliserv$ jobs
[1]- Running ./tcpserv01 &
[2]+ Stopped ./tcpcli01 127.0.0.1
zuii@zuii-desktop:~/unp/tcpcliserv$ bg %1
bash: bg:任务 1 已转入后台 *后台运行*
2. 使进程恢复至前台运行
Example:
zuii@zuii-desktop:~/unp/tcpcliserv$ ./tcpserv04
[1]+ Stopped ./tcpserv04
zuii@zuii-desktop:~/unp/tcpcliserv$ fg
。/tcpserv04
总结:
(1) CTRL+Z停止进程并放入后台
(2) jobs 显示当前暂停的进程
(3) bg %N 使第N个任务在后台运行(%前有空格)
(4) fg %N 使第N个任务在前台运行
默认bg,fg不带%N时表示对最后一个进程操作!
mysql + php 中文字符乱码解决
数据库、表、字段 3者都改成utf8编码
修改数据库编码方式:alter database testdb character set utf8;
修改表的编码方式:ALTER TABLE `test` DEFAULT CHARACTER SET utf8;
修改字段的编码方式:ALTER TABLE `test` CHANGE `name` `name` VARCHAR(36) CHARACTER SET utf8 NOT NULL;
php和请求的html都改为utf8编码
It Worked
Linux下装载win共享
1. 安装cifs-utils
2. 在需要装载的路径处新建一个空目录 eg. /mnt/xxx
3. mount -t cifs //win_ip/win_share_name /mnt/xxx -o username=win_user
Lucky to be back
WL has been recovered from a mess. Everything back to normal !!!
近期评论