三坐标转台算法的思考

明天要去一家客户解决转台问题,当其他同事搞了四个月还没有搞好,我也没有信心去一次就能搞定。所以我今天就在做一些准备,就想从原理上先解决一下转台的算法,这样到了现场就比较容易地分析问题出在哪里。

作为一个附加的设备,控制柜中并没有能直接读出坐标值的功能,读到的值依旧是XYZ三个轴上的读数头的示值。而转台唯一能提供的就是当前旋转的角度。

而校准转台时又可以得到转台相对于机器坐标系的轴线坐标\[\begin{cases}x=x_0+it\\y=y_0+jt\\z=z_0+kt\end{cases}(t\in R)\],那么可以得到当转台旋转角度为\(0^\circ\)时的坐标系仿射矩阵为(抱歉这里打成转置矩阵了,我用的算法库里行列就是反的╮(╯_╰)╭)\[A=\begin{bmatrix}\frac{k}{\sqrt{1-j^2}}&0&\frac{-i}{\sqrt{1-j^2}}&-x\\\frac{-i*j}{\sqrt{1-j^2}}&\sqrt{1-j^2}&\frac{-j*k}{\sqrt{1-j^2}}&-y\\i&j&k&-z\\0&0&0&1\end{bmatrix}^T\]。

当转台旋转了\(\theta^\circ\)时,坐标系为原坐标系乘以一个旋转矩阵\[A’=A*\begin{bmatrix}1&0&0&0\\0&\cos{\theta}&-\sin{\theta}&0\\0&\sin{\theta}&\cos{\theta}&0\\0&0&0&1\end{bmatrix}\]

因为三坐标取点是离散的,那么每个角度采的点只是\(\theta\)不同而已,那么就可以通过\(A’\)矩阵将每个点转换到转台的坐标系上。

新工作来临了

刚才领导语气沉重地电话通知,说明年其他工作先放放,先把自动化生产线的东西搞一搞,老板看了竞争对手的展会后很不高兴,觉得我们这面落后了。

我到是蛮想搞的,虽然充其量就是一个本科毕设量级的东西,不过相比于现在做的连本科毕设都不如的东西,还算有点意思吧。

第一步是做预算和方案,然后今后会写一些机械手和自动化相关的东西了吧。

落榜了

申请前也做过落榜的心理准备,不过这么快还是有点措手不及。本来估计起码能混个面试,然后面试可能被刷或者待定,结果却是直接没有面试资格。

到现在依旧不知道问题出在哪里,几周或几个月后,可以申请查询。目前我能猜到的理由是,管理经验过少,相对的年龄偏大,不过不管怎么样,生活还要继续,申请准备的过程其实也有很多收获,希望明年我还有这个意愿。

数据不会说谎——清华MBA自测统计结果

最近想念个MBA,刚刚交了面试申请,然后清华的MBA网站上线了一个自评系统,由于上线在申请截止时间以后,官方报名群里几个人抱怨这个没有用,而且里面并没有给出什么结论,只是把你的一些资料放在所有参加自测的人里面相比较,给一个比例。虽然说话的都说没用,不过还是能看出一些东西的。

首先,保守估计报名或者有报名意愿的应该有4000人左右,目前参加测试的只有280人,先要假设这280人是一个随机均匀的样本,从结果看来这个假设是成立的。

可以看这三个结果:

行业分布——清华的官网上解释录取标准里不包括行业和学科的评价,从数据来看,这是对的,参加测试的人员的行业分布和去年录取人员的行业比例惊人的相似,金融、咨询、能源、科技新媒体比例稍高,但是差的不多,房地产、非营利组织、不容易归类的其他行业稍低。

制造业

 

 

职能部门——这个趋势图几乎一致,不过百分比有些出入,不是特别明显,唯一就是去年公务员全军覆灭。

职位

学科——这个几乎是一模一样了。

学科

OK,在证实了这个分布基本是可以参考的以后,不同的分布就可以看出在录取上的取舍标准了。

学校——参加测试的分布和真实情况吻合与否无法判断,不过大概是对的,首批985才10所左右,985有30所左右,211有一大批,普通本科更是多,奇怪的是211学校的报名人数少很多。

但是再看去年录取的学生,普通本科的比例大大下降,首批985的比例大为上升。

所以本科学校的排名是个很重要的参考项。

院校

 

 

学历——这个已经很明显了,本科是标配,影响不大,专科和结业的很受影响,研究生还是有些优势。学历

 

职位——职位越高,机会越多,其实这个也从侧面证明了参考数据的有效性。级别?学历

 

 

 

 

 

 

 

 

Python与DotNet交互环境的搭建以及一些问题

之前一直工作在.NET环境下使用C#,在稍微接触了Python以后被迷住了,实际上到现在除了一个演示滤波的小玩具其他什么也没做,不过参考之前的一些经历,觉得把环境搭好比较重要,方便以后随时地开始玩(造)。
在经历了开始的兴奋阶段后,开始琢磨我可以用这个做些什么,当然对我日常工作很有帮助,但是鉴于我的工作大部分时间要在客户的工作站上完成,所以有了以下需求:
1.需要打包成exe部署到客户端。
2.需要可以和C#交互以便复用之前的一些工作,避免重复开发引起的功能不兼容,以及使用对方没有的功能。

解决方案有3个(未完全测试):

1.IronPython,在.NET下实现Python,这样可以在Python中使用所有的.NET库,当然支持所有Python语法。
2.Microsoft Scripting功能以及IronPython.dll,实际上是在.NET程序中加入了脚本支持功能。
3.CPython+Python for .NET,实际上通过一个接口可以在Python中调用.NET下的CLR,最后再用py2exe打包。

先声明:环境搭建好后还没有经过完全测试,没办法保证可以部署到其他设备上正常使用。会慢慢找机会测试。

方案一——将IronPython集成到.NET开发环境:

首先安装IronPython,安装好后可以使用自带的或其他IDE,我试了Eclipse+PyDev,和SharpDevelop,PyDev不支持可视化图形界面,而SharpDevelop没办法加BreakPoint(不知道是不是我不会设置,求大神帮助)。

一个简单的例子如下:

import sys
sys.path.append("C:\Program Files (x86)\IronPython 2.7\Lib")
sys.path.append("C:\\Program Files (x86)\\IronPython 2.7\\lib\\site-packages")
sys.path.append(r"C:\Program Files (x86)\IronPython 2.7")
sys.path.append(r"C:\Program Files (x86)\IronPython 2.7\DLLs");
sys.path.append(r"C:\Python27\Lib\site-packages")
import clr
clr.AddReference('mtrand.dll')
clr.AddReference('System.Windows.Forms')
clr.AddReference('System.Drawing')
#clr.AddReference('SPInterface')
clr.AddReference('System.IO')
clr.AddReference('System')


from System.Diagnostics import Trace
from System import Console
#import SPInterface as SP
import numpy as np

print 'Hello World'

如果有多种语言的经验,这里比较好理解
sys.path.append类似C编译时的头文件Include路径
clr.AddReference就是.NET里的添加引用
而from System.Diagnostics import Trace则是类似于C#里的
using System.Diagnostics

里面注释掉的几行是我在C#之前写的库,经测试可以正常使用(而且我的库依赖mathdotnet,在同文件夹下貌似自动识别了)。

优点:比较方便,更偏向于.NET,虽然使用的是Python语法。可以很方便的搭建界面。

缺点:由于不兼容CPython,所以很多库用不了,numpy刚刚支持没多久,而matplotlib不支持,实际上感觉完全不能发挥Python的优点。

方案二——在.NET开发环境使用Python脚本:

第一步同上,安装IronPython,在安装文件夹下有Platforms\Net40文件夹,在.NET项目中引用其中的Microsoft.Scripting.dll和IronPython.dll,可以去网上搜搜例子,就可以在代码调用Python脚本了,一个简单的例子:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using IronPython.Hosting;

namespace testIron2
{
   public partial class Form1 : Form
    {
        Microsoft.Scripting.Hosting.ScriptEngine engine;
        public Form1()
        {
            InitializeComponent();
            var source =
@"
import clr
clr.AddReference('mtrand.dll')

def SysPath():
    import sys
    return sys.path
def ImportNumpy():
    import numpy
            ";

            engine = Python.CreateEngine();

            var sp = engine.GetSearchPaths();
            sp.Add(@"C:\Program Files (x86)\IronPython 2.7");
            sp.Add(@"C:\Program Files (x86)\IronPython 2.7\DLLs");
            sp.Add(@"C:\Program Files (x86)\IronPython 2.7\Lib");
            sp.Add(@"C:\Program Files (x86)\IronPython 2.7\Lib\site-packages");
            engine.SetSearchPaths(sp);

            var scope = engine.CreateScope();
            var ops = engine.Operations;

            engine.Execute(source, scope);
            dynamic py = scope;

            // Calling into IronPython works fine + sys.path looks correct
            dynamic syspath = py.SysPath();

            // EXCEPTION when we try to "import numpy":
            // "The type initializer for 'NumpyDotNet.NpyCoreApi' threw an exception.",
            // "Unable to load DLL 'NpyAccessLib': The specified module could not be found. (Exception from HRESULT: 0x8007007E)"
            dynamic numpy = py.ImportNumpy();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            engine.Execute(textBox1.Text);
        }
    }
}

这段代码是当时在网上找的,很抱歉忘记原始链接了,里面的注释应该是原作者遇到的问题,我遇到了应该是相同的,异常信息是无法读取库,原因是没有mtrand.dll文件,stack overflow上有解答,貌似是因为C编译库的问题,所以要在Python命令字符串中加入

clr.AddReference('mtrand.dll')

可以看出来,和方案一其实是一样的,所以优点是熟悉C#代码的可以尽量的用C#,脚本只是辅助方便现场调试修改。
貌似所有在IronPython下安装的库会有DLL版,这意味着我在纯C#下可以用numpy了?还没有测试。

缺点:所有方案一的缺点,而且Python代码无法调试,只有看异常信息然后从头运行。

方案三:在有.NET环境下安装Python for .NET

这个是目前看起来最方便的,只需要装一个库,就可以用类似IronPython的方式来调用.NET环境,包括我自己的库。同时保留所有之前的功能。简单例子如下:

# encoding: utf-8
'''
Created on 2014年5月14日

@author: zcxsun
'''
# import sys
#sys.path.append(r"C:\Qt\Projects\sp_reader\sp_reader\bin\Debug")

import clr
# clr.AddReference('SPInterface')

from System import String
#import SPInterface as SP

a = String('   a,b,c,d,e,f,g   ')
b = a.Trim()
c = String(b).Split(',')
for i in c:
    print i
# SP.SP_Path.folder_name = r'C:\Users\Public\Documents\Zeiss\CALYPSO\sp_filter\conf\spiConf.xml'
# SP.SPI.init()
# for i in SP.SPI.elements:
#     print i.identifier

print 'finish'

注释部分是调用我自己库的代码,需要注意的是很多地方需要显式转换,所以不能用类似a.Trim().Split(‘,’)这样的语法,只能String(a.Trim()).Split(‘,’)这样。因为用type(String(‘ a,b,c ‘).Trim())得到的类型不是Trim应该返回的String类型,而是<type ‘unicode’>

这个感觉应该是最方便的,在Eclipse下显示良好,调试良好。不确定的是py2exe后效果如何。

结论:目前感觉方案2针对我的情况是最优的,方案3则是用来实现功能测试用最方便的,所以未来的短期计划是用PyDev调用一些自己的库,用来设计和实现算法和功能。实验好了后在C#中实现,然后将脚本功能放在文件中调用。

当然,这样的性能应该是有一定问题的,不过对于我的情况是够了。

 

使用Python模拟高斯滤波过程并生成视频

Python在这类工作上的方便程度真的是——爽。

这里模拟的是低通高斯滤波的过程。

代码如下:需要numpy 和matplotlib,如果想保存成视频文件还需要下载ffmpeg

# encoding: utf-8
'''
Created on 2014年5月1日

@author: zcxsun
'''
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import animation
plt.rcParams['animation.ffmpeg_path'] = r'C:\sunxin\ffmpeg_x64\bin\ffmpeg.exe'

# First set up the figure, the axis, and the plot element we want to animate
fig = plt.figure()

speed = 1
size = 360
a = np.arange(size) *np.pi/180
b = np.zeros(size)
x = -0.1
for i in range(1,14,2):
    x = x*(i-2)/i
    b += x * np.sin(a*i)
b+= 0.02 * np.sin(a*50) + 0.01 * np.sin(a*150)
fix_signal = b

hamonic = 15

len = max(1, size/hamonic/2)
print len
scale = 0.3*len+0.8;
scale2x = -0.5/scale/scale
win =  np.exp( pow(np.arange(2*len+1)-len,2)*scale2x)
win/=sum(win)
move_gauss = win
print win.size
filtered_data = np.convolve(b, win, 'same')


#set the axis arrange
y_max = 0.4
ax = plt.axes(xlim=(0, 360), ylim=(-0.2, y_max))
line_gauss, = ax.plot([], [], lw=2)
line_filtered, = ax.plot([],[],lw=2)

plt.plot(fix_signal)

# initialization function: plot the background of each frame
def init():
    line_gauss.set_data([],[])
    line_filtered.set_data([],[])
    return line_gauss,line_filtered,
# animation function.  This is called sequentially
def animate(i):
    n = np.floor(i*speed)
    line_gauss.set_data(n+np.arange(0,win.size),win + (y_max-0.03-win.max()))
    line_filtered.set_data(np.arange(0,n),filtered_data[0:n])
    return line_gauss,line_filtered,
anim = animation.FuncAnimation(fig, animate, init_func=init,
                               frames=int(np.floor(size/speed)), interval=10, blit=True)

FFwriter = animation.FFMpegWriter(fps = 15)
path = r"C:\Users\Public\Documents\filter_show_hamonic_" + str(hamonic) + ".mp4"
anim.save(path, writer = FFwriter)
#
# plt.show()
print 'finish'

 

解决DOKUWIKI中TSQL标签错误高亮的问题

昨天试验性的装了个wiki,感觉用来记笔记比Blog要方便而且专业的多了。

今天往里面插入代码的时候却郁闷了,dokuwiki使用的是geshi高亮,先是sql没有datetime和nvarchar关键字,我在插件目录里修改完了却不生效。然后用tsql支持这些关键字,但是会把我inspection的in当作关键字高亮,改了半天依然无效,搜了半天,原来……人家geshi已经集成了,不是当作插件来运行的,我下载了插件改了半天(\plugin\geshi\geshi\),但是实际上生效的是\inc\geshi\,找到位置后修改,OK。

原因是因为像in, and, or在这个文件里被当作运算符号来处理,所以和+-=一类的放到了SYMBOL里,对于a+b,肯定是高亮加号的,但是mine总不能高亮中间的in吧。

办法一:把这些字符类的符号前后加空格:’IN’ -> ‘ IN ‘因为敲代码时遇到这些逻辑单词肯定要高空格的,这样匹配的时候就不会匹配单词的一部分了。

方法二:把这些字符类的SYMBOL移到KEYWORD里去,单独建一个组,然后在STYLE那里给个组设置一下,改成和SYMBOL一样。

反编译.NET程序及调试

想要了解一个开源项目,可以直接读代码,想了解别的,就得反编译了。

其实.NET的反编译算是方便的,毕竟是IL中间语言而不是机器码或者汇编,不过当我需要这个功能并开始找的时候发现选择并不多,其实就两个:Reflector和ILSpy。

Reflector更有名,不过2011年开始转向了收费,ILSpy则是?Development started after Red Gate?announced?that the free version of .NET Reflector would cease to exist by end of February 2011.

但是2012年开始ILSpy也停止了更新,按理说一个开源软件停止更新基本两个原因:1.社区人跑光了;2.一些法律或者其他公司的干预。ILSpy和SharpDevelop是一个社区,一直非常活跃,所以开始我觉得是M$又动手脚了。

实际情况是ILSpy的项目整合到了SharpDevelop里面,不过没有任何明确的公告,我想原因可能是遭到了M$的压力或者核心成员有争论。

ILSpy1.0开始就支持直接反编译DLL然后直接attach调试,设断点什么的,但是2.0开始变成了插件需要自己编译(二进制包里这个被删了,源码包里有)。2.1的时候连源码里也没有了而且最新的一个发布里面有冲突。ILSpy的Debug功能消失几乎是和ILSpy停止开发同时,再同时,SharpDevelop出了类似的功能,可以在调试的同时反编译第三方库。

本质上这其实是一个功能,但是实际上ILSpy原来的用法更方便,因为不需要构造Solution敲任何代码,直接可以用。

我想原因可能是:

1.过于简单的反编译操作使得门槛降低,可能受到了一些压力。

2.开发这个项目的社区目的是方便开发人员调试自己的程序,而不是去剽窃他人的劳动,所以人为地加了一些限制。

不管怎么样,现在的确不方便了,虽然可以用2.0版,不过2.0不支持64位的环境= =。

 

关于个人前途的胡言乱语

完全不知道写这个东西的意义所在,只是想找人聊又无人可聊。

最近几周心情都不太好,主要是因为临近回国却前途未卜,再加上右脚拇指发炎,这种有点低烧的感觉应该是我的免疫系统在工作吧。

出国前对现在的情况有过估计,也有心理准备,不过想到了心情还是不好,看来心志是需要锻炼的。

出来半年后以前的直系领导调部门升职,又过了两个月左右得知组织结构重组,且我的职位已经被人顶替了,虽然组织架构图没有变,但是各种邮件列表和开会名单都开始包含那位同志的名字。最后,几天前我的名字被排除出了各个群发列表,按照正常推理,这是温水煮青蛙,赶紧辞职的意思吧……不过我花公司钱出来这一年还没有结束,出来前还签了三年补充合同,这是什么节奏啊。皇上臣妾不明白啊,我也很想辞职啊,不过你们想让我走,我可以不赔钱么?不会因为现在现金流是负的于是拿我找齐吧。。。也不对,我花的是去年的钱啊。

现在的说法是我回去以后弄一个新的部门,不过人数,规模,工作性质,任务,指标,什么都没有提,本来领导说下周来德国开会(不是我的事),可以找她谈谈,结果临时找了个借口不来了,那我就要不明不白的回国吃闲饭了么,想想也不错,如果什么都不干,现在的薪水还算是可以接受的。

其实我现在还是愿意接受挑战的,自从知道要弄新部门,在德国这面就各种努力找资源,不过臣妾做不到啊……有些破东西我自己反编译看代码重新打包都好几个月了,一问还是说:“这个我要找管理层问问,看看他们的意见。”你妹的,7个多月了还没意见呢,我也懒得问了,反正公司就这样,没权限的事情有能力做也不允许做。等回去了更没办法Push了。

现在的想法是,回去以后先考MBA,三年后补充合同到期恢复自由身,学位也差不多拿到手了,到时进退自由。

说到读这个,想起了水木社区上N多小朋友叫嚣类似“本科不是清华的不要自称清华校友”,其实这个现象蛮普遍的,有点像之前流行过一阵的鄙视链,土著非土著,Top2,985,211……

其实人的圈子不同,看这种事情的观点就不同,在学校的时候,周围的人都是一个圈子(或者阶级)的,看某件事情就会非常相似,比如:

专科生:公司招聘要求学历就是浪费,没什么不一样。

清华的:你是清华的?几字班的?

但是实际情况呢?
没有本科学历的人可能知道Top2,但是应该不知道985和211的差别,211和一般重点大学的区别。
重点大学或者那些985高校的呢,可能知道有二本和三本,但是他们应该不知道有专升本,大专,查不到证的大专,成人高考,高自考。

这个社会就是这么等级分明,虽然专科毕业也有大富翁,清华出来也有地青,但是差别是存在的,我也招聘过,我几乎不考虑专科生,除非简历能打动我(当然目前还没遇到),连本科线都过不了,我怎么能指望你理解坐标系的转换可以用仿射矩阵运算?上次有个客户和我在QQ上聊天,一边说专科本科能力一样,一边问我怎么能让自己的专科背景有更多的工作机会,我当时的建议是,去读个专升本或者成人高考吧。那哥们最后也没有什么行动,因为他认为他的能力足够,而这种性质的学历认证没有用。

的确,我也不认为国内这个体系的教育制度有什么真正的能力培养,不过,对于一个已经不可能把自己的第一学历变成本科的人来说,选择这条路意味着:我承认这个社会的游戏规则和等级制度,我认可自己之前失败了,我愿意在这个等级制度下进步一点。那么你的机会肯定会比原地踏步的人多许多,我们国家就是人多,只要你进步一点点,你就可以多把几万人甩在身后。

当我下意识得给客户提出这个意见,然后又梳理出原因后,我忽然意识到我和我的客户没有什么不同。

1.在清华北大,或者一些世界级名校出身的人看来,985还是211,可能和专科生也没有什么差别。
2.现在的能力,生活已经超出了儿时能理解的上限,我有时也会觉得自己不比清华北大毕业的人差。
3.之前我也没有弄一个研究生学历的想法,考研失败(其实中途放弃)后,就下意识的厌恶这个话题,即使大学同学中70%是硕士,10%是博士。

这件事大概发生在两年前吧,从那里开始,我就经常想找一个我自己的“专接本”,为了能让自己在这个阶级社会里再上一级。

不过一直没什么行动,一是没有合适的,对于我的情况,要找一个研究生读而且学校比本科高一个级别的,国内只有那两所了,或者出国,需要大量的时间成本和经济基础,在职研究生的学位证又不一样。不过我的运气还比较好,在我下定决心出国读书的时候,公司有个外派机会。

但是问题依旧在,最后我的解决办法是读MBA,像大多数人一样,我以前也认为MBA是混学历,花钱买学历,但是随着在这个社会上混得时间变长,我发现所谓“大多数人认为”就是扯淡,每个人的情况都不一样,而且我的目标又不是当大多数人。

有没有用?不知道,开始时不知道,后来静下心里看一些人的经历和总结,又觉得这个问题没什么意义了,社会的价值观是不统一的,不像在学校,你多背十个单词考试分就会高一点,所以有用。而商品社会的规则是,你付出东西,得到东西,可能赚钱,可能赔钱,当然有时钱也会蒸发,赚了一样倒霉。所以一些之前脑海里抵触MBA的情绪一扫而空。

花钱买学历,没错,而且没什么丢人的,十几万买个硕士学历也是投资,比买辆三系五系的贬值强。不算清华校友,自己往脸上贴金,真不用,规则是,你NB了,大家抢着让你当校友。

心情好多了,“国王长了个驴耳朵”疗法还是有用的。

 

又一次在求实BBS上和人吵架

除了一些已经没人发言的俱乐部版面,在求实收藏夹里只有三个版了,留学,工作还有鹊桥。

这次吵架是在留学版,起因其实蛮简单,某个刚拿到offer还没开学的小姑娘写了个系列贴——“从零开始留学申请”。刚刚开始还好,还能算是个技术贴——对我而言,判断的标准很简单:你是在介绍经验的同时做点生意,还是打着介绍经验的幌子来做生意——但是当这位小姑娘发了三四篇不太丰满的贴子后宣布更新暂停,理由是(摘抄原文):

?为了解决当务之急,开了个淘宝店来赚取赴美帝机票,由于生意起色不大,因此申请等经验的分享可能要受到影响而放慢脚步并有可能搁置了,还请各位见谅。?
生意顺畅之后会再继续更新留学指导和经验分享,并为大家答疑。?

以及:

这几天忙着装修淘宝店铺,给大家带来的不便尽情谅解,经验分享何时继续?店铺生意不需要我担心时即会在回来分享的。

为了避免断章取义:原文链接,地球人都知道淘宝店要想稳定运行起码几个月吧,我于是就认为这位小姑娘本意只是做生意,于是我的毛病就犯了,回帖说了几句(当然不好听),然后就是开始吵。

话说回来,这次我意识到了这个混求实养成的恶习,遇到和自己看不惯的事情,就要冷嘲热讽一番,还要装作很清高的站在道德至高点上。其实完全没必要:一、人家只是做生意,虽然说找了个借口,但是也算是常见的推销手段,版主站务作为维护论坛的人员都不管,我的确没有权利更没有义务去管人家;二、对我没有好处,我在争吵中付出的是时间精力以及用胡搅蛮缠的思路去思考,不但没好处,还影响自己;三、实际受益者不领情,如果说真有什么收益者,就是那些没有看出小姑娘是在做广告,经过我们这番争吵意识到了,不过实际情况是,看出来的不需要我提醒,没看出来的依然质问我为什么多管闲事影响人家小姑娘分享经验。

我也有些进步,以前可能会继续吵吧,这次我起码优雅的退出,道歉,承认错误,祝人家留学顺利,当然也想祝人家生意顺利,不过听起来想讽刺就没写,然后消失。

再然后,写在自己的地盘里,想说什么说什么,你回复还要经过老娘批准呢,哼。

不过暂时还没人回复过我任何文章呢,哼唧。