Friday, February 15, 2013

Random Square Music Player




This is an extremely cool music player, which keep randomly plays songs from your local audio resources on your selected EQ.
For those in need, it also contains a very cool guitar tuner(E4, B3, G3, D3, A2, E2).
The most attractive thing about this App is the simple and elegant modern style "six square" layout.
PL = PLAY
SK = SKIP
PS = PAUSE
ST = STOP
TN = TUNER
EQ = EQUALIZER
To manipulate the MIDI, you need to have a android-midi-libv2-1 library to play
with the Tuner.
********************************************
Here is the link to Google Play Page of this little app:
https://play.google.com/store/apps/details?id=com.tangkk.randommusicplayer
Here is the link to the source of this app in github:
https://github.com/tangkk/rmp
Or simply click the badge below:







Get it on Google Play

tangkk



Friday, January 4, 2013

Install Simplescalar 3.0 on Ubuntu 12.04

My platform:
Intel® Core™ i5-3550 CPU
32bit Ubuntu 12.04

Here is the procedure for installing simplescalar on my computer, pay attention that this is written for newbies to linux therefore it may contain something that may not be so obvious to them. For those who does not need to use the cross-compiler and binutils,  step 5 alone is enough to setup simplescalar and run some binary form benchmarks.


1. Download the sources


Download simplesim-3v0e.tgz and simpletools-2v0.tgz from http://www.simplescalar.com/index.html

Download simpleutils-990811.tar.gz (If you insist on using the simpleutils-2v0.tgz on the official page of simplescalar, stop here and try this installation guide instead)
Download Cross Compiler gcc-2.7.2.3
You man also need the benchmark.

2. Setup the environment


i.

export IDIR=/any/directory/you/choose/ (for example, mine is /home/tangkk/Build/simplescalar)
export HOST=i686-pc-linux
export TARGET=sslittle-na-sstrix
(Assuming your host is also little endian. It could be ssbig-na-sstrix. If this is the case, all the following appeared "sslittle-na-sstrix" should be replaced by "ssbig-na-sstrix".)

(Pay attention that if you ever quit the terminal, next time you loggin to the terminal you need to assign these values again. To give you some idea of what these setting may be, for the HOST part, i686 specifies your target CPU's architecture, other possible value maybe "arm", "mips", "i386", etc., and linux specifies your operating system, other possible value could be "solaris", "gnu"..., the "pc" part specifies the "company"; for the TARGET part, it specifies the endian. You can check out more information at [1])


(Further reading: Host and Target, Configuration Names, Build,Host and Target)

ii.

make the IDIR directory by executing "mkdir $IDIR" and then move all the tarballs you've just downloaded into this directory.

iii.

make sure you update your softwares:

sudo apt-get update


make sure you install:

build-essential
flex
bison
gcc-multilib(may be optional)
g++-multilib(may be optional)

If you haven't, do:


sudo apt-get install <package name>


3. Unpack the Simpletools-2v0

(Basically this package contains the sources of a gcc(GNU C Compiler) and a glibc ported to simplescalar architecture. And according to [7], building the glibc is non-trivial, thus this Simpletools package contains pre-compiled libraries in both ssbig-na-sstrix/ and sslittle-na-sstrix/ folder)

Simply do:


cd $IDIR

tar xvfz simpletools-2v0.tgz
rm -rf gcc-2.6.3

There is a gcc-2.6.3 folder, but you can remove it because later we will use the newer version gcc-2.7.2.3(also a cross-compiler) instead.


(after this step you got ssbig-na-sstrix and sslittle-na-sstrix folders under the $IDIR, and they both contains an include folder and a lib folder)

4. Install the SimpleUtils-990811

(Basically this package contains the sources of a cross GUN binutils)

First we unpack the tarball:


cd $IDIR

tar xvfz simpleutils-990811.tar.gz
cd simpleutils-990811

Then, replace the "yy_current_buffer" by "YY_CURRENT_BUFFER" in the file /ld/ldlex.l .(You can to use "vim" or "gedit" to fix it.)


After that, you can configure:


cd $IDIR/simpleutils-990811

./configure --host=$HOST --target=$TARGET --with-gnu-as --with-gnu-ld --prefix=$IDIR
(If you want to know the meaning of these settings, refer to the [1]. Here because we are to build a "cross" GNU binutils, both HOST and TARGET should be specified)

(It should be successful configured. If not, check whether you follow all the above instructions before you ask someone. This is also strongly suggested for all the following steps.)


Then you can make and install with:


make

make install

(after this step you got another 5 folders under $IDIR, they are: bin, lib, include, man, share. And moreover, a bin folder is also added to both the ssbig-na-sstrix and sslittle-na-sstrix folder)

5. Install the Simplesim-3v0e

(This package contains the sources of the simplescalar architecture and micro-architecture(or we can say sources of the simplescalar functional simulator and performance simulator, which is basically referring to the same thing)

Firstly, unpack it:


cd $IDIR

tar xvfz simplesim-3v0e.tgz
cd simplesim-3.0
make config-pisa
make

(or make config-alpha according to your need
or if you want to change the target configuration from
one to another, you need to:
make clean
make config-alpha)


(Because the simulator runs on the hosts only, it is a native build. Everything should be OK and afterwards you will see "my work is done here...")


Run the following to test the simulator

./sim-safe tests/bin.little/test-math

(You will see something like 

sim: ** starting functional simulation **
pow(12.0, 2.0) == 144.000000
pow(10.0, 3.0) == 1000.000000
pow(10.0, -3.0) == 0.001000
...)

6. Install the gcc cross compiler

This is the most error-prone part for the whole installation.

As always, unpack the file first:


cd $IDIR

tar xvfz gcc-2.7.2.3.ss.tar.gz
cd gcc-2.7.2.3
./configure --host=$HOST --target=$TARGET --with-gnu-as --with-gnu-ld --prefix=$IDIR

so far so good! But we cannot proceed with a "make" here because there will be many errors because of various incompatibilities. To get over these, we need to fix some of the sources:


Firstly, for our convenience, do the following to get ourselves with write access to the current directory

chmod -R +w .
(Don't forget about the little "." at the end of this command!)

Following the instructions provided by [2], we have:

i.
Appending "-I/usr/include" at the end of the 130 line of the Makefile

ii.

Replace <varargs.h> with <stdarg.h> in the 60 line of protoize.c

iii.

In the 341 line of obstack.h, change
*((void **)__o->next_free)++   to be *((void **)__o->next_free++)

iv.

Run:

cp ./patched/sys/cdefs.h ../sslittle-na-sstrix/include/sys/cdefs.h 

cp ../sslittle-na-sstrix/lib/libc.a ../lib/
cp ../sslittle-na-sstrix/lib/crt0.o ../lib/

v.

Then build it[3].

make LANGUAGES="c c++" CFLAGS="-O" CC="gcc"

Then you will come across with errors regarding to insn-output.c, so we fix it by appending "\" at the end of the 675, 750 and 823 line of the file insn-output.c. (Note that if you "make clean" and then "make" again, you should do this once again because this file is generated by the build procedure.) Then make again by:

make LANGUAGES="c c++" CFLAGS="-O" CC="gcc"

Then you will come across something like 
"*** buffer overflow detected ***: /home/tangkk/simplescalar/sslittle-na-sstrix/bin/ar terminated"
This could be solved by methods suggested by [2], which is quoted here:
"2 At this point you might encounter a “buffer overflow” if you use Ubuntu 8.10 or later. If so,
download the following files and put them in $IDIR/sslittle-na-sstrix/bin:
(And I should add one more comment here for the newcomers:
cd $IDIR/sslittle-na-sstrix/bin/
chmod +x ar ranlib)

Now go back to your gcc-2.7.2.3 directory, after doing so and you can make once again

make LANGUAGES="c c++" CFLAGS="-O" CC="gcc"

Then you may come across something like
"In file included from /usr/include/features.h:389,
                 from /usr/include/limits.h:27,
                 from include/limits.h:112,
                 from include/syslimits.h:7,
                 from include/limits.h:11,
                 from ./libgcc2.c:1121:
/usr/include/gnu/stubs.h:7: gnu/stubs-32.h: No such file or directory"

This maybe a bug in ubuntu but I don't know for sure. Refering to [4], it can be solved by appending "-I/usr/include/i386-linux-gnu" at the end of the line 130 of Makefile. (If it still doesn't work, install  gcc-multilib and g++-multilib and try again)

(So now the 130 line of Makefile becomes:
GCC_CFLAGS=$(INTERNAL_CFLAGS) $(X_CFLAGS) $(T_CFLAGS) $(CFLAGS) -I./include -I/usr/include -I/usr/include/i386-linux-gnu
)

Then you make again:

make LANGUAGES="c c++" CFLAGS="-O" CC="gcc"

And still there is error regarding to the generated file cxxmain.c. It can be solved by the method suggested by [5], namely, simply commenting out the 2978‐2979 line of cxxmain.c. Then make again.

make LANGUAGES="c c++" CFLAGS="-O" CC="gcc"

There should be no error this time.

7. Make enquire
Also under the "$IDIR/simplescalar/gcc-2.7.2.3" directory, do

make enquire

Then it will pop out some error as: "undefined reference to `__isoc99_sscanf", which, referring to [6], could be solved by adding "-D_GNU_SOURCE" after the "$(ENQUIRE_CFLAGS)" in the line 995 of the Makefile under the directory (namely $IDIR/simplescalar/gcc-2.7.2.3). Then make again

make enquire

Finally we are done!

Finally we follow the rest of those old references to install the cross compiler:

../simplesim-3.0/sim-safe ./enquire -f > float.h-cross
make LANGUAGES="c c++" CFLAGS="-O" CC="gcc" install

8. Hello World!
We can check it with a hello.c program. Use vi to write the following program called hello.c:

#include <stdio.h>
main() {
  printf("Hello World!\n");
}

Then compile it with the cross compiler:

$IDIR/bin/sslittle-na-sstrix-gcc –o hello hello.c
(If you fail to run this, try entering the above "bin" directory and run "./sslittle-na-sstrix-gcc -o ../hello ../hello.c" assuming that the hello.c program is within the $IDIR directory. But if you still fail, maybe there is some chaos with your environment viable, restart the terminal and try it once again)

The you can run the output file "hello" with the simulator:

$IDIR/simplesim-3.0/sim-safe hello

If you see something like this:

sim: ** starting functional simulation **
Hello World!

Congratulations!

For testbenches: the tests-alpha/ and tests-pisa/ folders under simplesim-3.0/ contains some benchmarks, also there are some instructor's benchmarks here.




To remind once again, if you get stuck in any of these steps, check whether you strictly follow all the previous steps first before you ask someone else.


references:

[1] http://www.simplescalar.com/docs/install_guide_v2.txt
[2] http://www.ann.ece.ufl.edu/courses/eel5764_10fal/project/1.36445-Simplescalar-installation-instructions.pdf
[3] http://www.ann.ece.ufl.edu/courses/eel5764_10fal/project/simplescalar_installation.pdf
[4] http://gcc.gnu.org/ml/gcc/2012-02/msg00314.html
[5] http://harryscode.blogspot.hk/2008/10/installing-simplescalar.html
[6] http://lists.gnu.org/archive/html/ltib/2011-11/msg00009.html
[7] A User’s and Hacker’s Guide to the SimpleScalar Architectural Research Tool Set (for tool set release 2.0), Todd M. Austin, 1997

Also thanks for the page http://www.ann.ece.ufl.edu/courses/eel5764_10fal/project.html,  although I did not reference it! It contains a lot of useful links.

The following link is a very good Lab on how to use simplescalar:
http://www.ecs.umass.edu/ece/koren/architecture/Simplescalar/
whose parent link:
http://www.ecs.umass.edu/ece/koren/architecture/
contains a lot of useful tools on understanding computer architecture and organization as well.

tangkk

Friday, December 7, 2012

外婆家的印象

不知道为什么不叫做“外公家的印象“。其实外公和外婆一样对我很好,他们都很好,但我总不能写成”外公与外婆家的印象“或者”外婆与外公家的印象“或者什么“外家的印象?”哈哈……总之我总要选择一个,我选择了“外婆家的印象”,因为这样好像有“意境”一点?

我总是有这样那样的印象,外婆家的印象总是给我很舒服的感觉,虽然假若要我努力记起一些发生在外婆家的不开心的事情,也能记起一些,但是说到“印象”,我总能想起一些最开始最开始的时候恍如梦境一样美好的片段。我会告诉你在某个周六的早上,我跟妈妈一起,站在外婆家的门口,我跳起来按了一下那个几十年都没换过的旧门铃,我好像看到了金色的阳光洒落在水泥台阶上。然后我很可能会想到那首叫做“金色的沙滩上”的歌:“在那金色沙滩上....月光..寻找往事踪影...”,虽然我小时候应该不可能听过这首歌。我会发现自己一觉睡醒,在外婆家里最小那个房间里,房间里有张小床,一扇对着马路打开着的旧式玻璃窗,天气很晴朗。我想到了小舅舅,但不记得他做过的具体的事。外公在外面看香港台的新闻,外婆在帮我做牛奶麦片。我和表哥一起玩乐高模型,和姨丈玩扑克牌。我偷偷打开外婆的饼干罐吃了两个水泡饼。

这是外婆家的印象……

tangkk

Wednesday, November 28, 2012

我记得一首小时候听过的儿歌...



我记得一首小时候听过的儿歌。“太阳似朵大红花,在那高高天空挂,随着月儿落都未回来...”一个录音机,一盒录音带,妈妈时不时播一播这首歌我就会很开心。我不知我有没记错,开心之余,我那时也会觉得这个旋律不是完全开心的旋律,但我很喜欢听。我只记得三句,也不知有没记错,也不想搜其他的。
之后的印象要到小学,搬了家,家里有个音响,我爸就开始用它来播音乐(而我妈好像从来没有自己的CD)。我听了很多陈百强,许冠杰,还有一些我不喜欢的什么禅院钟声之类的歌。我最喜欢的是偏偏喜欢你,深爱着你,念亲恩,还有许冠杰的难忘你,这几首歌现在我还经常哼,有时哼着哼着不知为什么很想哭的。
我人生第一次买CD是某年的香港十大劲歌金曲。忘了那一年,但那张CD有许志安的真心真意,杨千嬅的抬起我的头来。当时我喜欢听真心真意,不喜欢抬起我的头来。但现在我已经好多年没听真心真意了,但抬起我的头来变成了MP3里面的常备曲目。我真的很喜欢杨千嬅。
我喜欢杨千嬅可能还是因为某年暑假带了一张杨千嬅的CD去表哥家里玩了半个月的原因吧?也许是因为某次夏令营的活动期间我不断听她的歌?我不知道。我最喜欢听”恋爱意思“(《我错过了什么》),会特别期待最后那句”其实我也不相信那是我“。其次是木偶奇遇记,数你,只要为我好,曾几何时。这些都是我生命里的美好回忆。
但在人生第一张CD之后,我记得的第二张CD不是杨千嬅,是陈奕迅的幸福摩天轮。但我不喜欢听幸福摩天轮,因为我不喜欢唱。我喜欢时光倒流二十年,飘飘飘飘,垃圾。这些歌都让我想起在文德路读英语夜校的故事。我记得很多人,刘德恒,梁晓东,陆晓凡,陈耀辉。老实说,我最记得的是陈嘉慧。
因为陈嘉慧是我同桌,而且我很欣赏她。我还记得在课堂上我们唱”私家菠萝啤“(斯卡布莱尔市集?哈哈),还记得”英重!“(英语为重!)。我很感动的一次是最后一节课,老师(对不起我记不得你名字了)带我们一起唱英文版的月亮代表我的心。后来我学会弹吉他之后,就经常唱这个版本的月亮代表我的心。
后来就和这些同学基本上没见过面了。在陈奕迅之后,我记得我开始喜欢梁咏琪,很喜欢一天一天,爱自己,死心塌地,今夜没有风。我觉得这几首最单纯最清澈了。我不喜欢花火,不知为什么。我想到了Kiss me,我喜欢这首歌,不知为何把我思绪又带回到小学,我们喜欢搞生日party,每个同学生日都要聚会一次。
有一次我参加别人的聚会,竟然是一班小学鸡唱卡拉OK,我坐在一边做观众。然后我听到一首至今为止也会很经常听的歌,《小玩意》。有一次别人来参加我的party,他们竟然带了一些卡啦OK的VCD来我家,这次全都是儿歌,于是我又学会了一首歌叫做《友共情》。我还记得很多人,黎润生,张元舜,刘德恒,余智斌,何倩婷,林韵琪,莉莉,谢翠丽……
就这样我对一首首歌产生独特的感情。我觉得那些能让我产生感情的歌基本上在某个瞬间都会有一个让我动容的点。比如《恋爱意思》的最后一句“仍情愿你不相信曾经交给我太多,其实我也不相信那是我”,《曾几何时》的“最落寞那次仍然笑说我没事”,《木偶奇遇记》则比较喜欢最后的“Please just hold my hand”……每首歌至少有一个点让我感动了。
有一些歌是突然间走进来的,并没有什么经历和它们相联系,但一听就好像觉得很熟悉,好像很小的时候就听过一样。有一些歌听很多次也不会有什么特别的感觉,跟我一点关系都没有。有一些歌我总是会跳播,有一些歌会重复又重复。

tangkk

Monday, November 26, 2012

Pretty man 漂亮的男人

我最反感吃饭时坐在我对面那个人突然挪到旁边的位置。我也不认识他,他也不认识我,我只是不得已才坐在这个人对面的。


Pretty man

"Do I look completely ugly today?"
"No! Why?"
"Do I look like a bad guy?"
"Of course not! Why?"
"Well, I couldn't find a place to sit down to have my dinner except that little seat opposite to that man. And you know what, when that two ladies sitting next to us go away, that funny man suddenly shift himself away. I wanted to go to somewhere else immediately you know?"
"Why?"
"Because I don't want to show respect to such people any more! But unfortunately, I just couldn't find one single place to go."
"Oh, maybe you shouldn't do that! Maybe he felt more comfortable moving away."
"You know, he is a man. A man would ever do that? Oh! Maybe I'm wrong. He is not a man, he is a pretty man. Yes! He's a pretty man."
"Pretty man?"
"Yes, pretty man, who must dress up a lot, look into the mirror a lot, train his tone a lot, shop a lot, act like a gentleman a lot, listen to music a lot and dating with girls a lot. Oh! Monsters! People get hurt, pretty man becomes pretty."

The following are proudly translated by Google
以下是自豪地通过谷歌翻译


漂亮的男人

“我今天看起来完全难看吗?”
“没有!”为什么?“
“你看我像坏人吗?”
“当然不是了,为什么?”
“好吧,我不能找一个地方坐下来,我的晚餐除了坐在对面的那个男人。而且你知道什么,离开时,两位女士坐在我们旁边,是有趣的人突然改变了马脚。我希望去到别的地方你会立刻知道了吗?“
“为什么?”
“因为我不想以示尊重这样的人了!但不幸的是,我只是无法找到一个单一的地方去。”
“噢,也许你不应该这样做!也许他感觉舒服多了,搬走。”
“你知道,他是一个男人。一个人会永远做到这一点?哦!也许我错了,他不是一个人,他​​是一个漂亮的人。是的!他是一个漂亮的男人。”
“漂亮的人吗?”
“是的,漂亮的人,谁必须打扮了很多,照镜子了很多,训练他的语气很多,店里很多,像一个绅士了很多,听音乐很多,与女孩约会了很多哦!怪物!人们受到伤害,漂亮的人变得漂亮。”

tangkk

Sunday, November 25, 2012

I don't like "Ping-an"'s singing 我不喜欢那个叫平安的人唱歌

我不喜欢那个叫平安的人唱歌,虽然很好听,但我真心不喜欢。
(I don't like "Ping-an"'s singing, although sounds great, but I really hate it.)

"Why? Are you jealous of his voice?"

"No"
"His pretty face and his height?"
"No"
"His charming, his age, and probably his talent?"
"Probably not"
"Then why? I don't see any problem."
"But I do. I don't know why you can't see any."
"Then tell me."
"I don't know. Maybe he reminds me of someone I disliked. I'm not talking about someone who is disliked by many people, not those kind of people."
"Then what kind of people? Why would you ever dislike him?"
"I hope I can come up with a better reason but I can't. You know, maybe this is kind of jealous, but I never know. You see, I'm shy, and I'm not handsome, maybe I this could be a reason of jealousy. But who knows? To be honest, he is someone who seems to me so positive, so shining, so proud, so love, so joy, as to make me feel negative, dark, frustrated and sad. You know, sometimes you have to balance your emotion right? And sometimes you don't have to always show how positive, happy and how "smart" you are before those not so positive people right? You don't have to always appear to be a smart and talented guy right? If you do that people may get hurt."
"Wow Jesus! How come!"
"You never had such an experience? You never met such guy before? Oh Jesus!"

The following are proudly translated by Google

以下是自豪地通過谷歌翻譯


“為什麼?你嫉妒他的聲音嗎?”
“否”
“他漂亮的臉,他的身高是多少?”
“否”
“他的迷人的,他的年齡,而且很可能他的天賦嗎?”
“可能還沒有”
“那為什麼我沒有看到任何問題。”
“但我做的,我不知道為什麼你看不到任何。”
“那你告訴我。”“我不知道,也許他讓我想起了我不喜歡的人,我不是在談論的人誰是不喜歡很多人,而不是那種人。”
“那是什麼樣的人呢?為什麼你永遠不喜歡他嗎?”
“我希望我能想出一個更好的理由,但我不能,你知道,也許這是一種嫉妒,但我從來不知道,你看,我害羞,和我長得不漂亮,也許我這的嫉妒可能是一個原因,但誰知道?說實話,他是在我看來,如此積極的人,這樣明亮,很自豪,所以愛,所以快樂,讓我感到消極,陰暗,沮喪和悲傷。你知道,有時候你必須平衡自己的情緒吧?有時你不必總是顯示你是多麼的幸福和如何“智能”以前的那些不那麼積極的人吧?你不總是出現是一個聰明,有才華的傢伙吧?如果你這樣做的人可能會受到傷害。“
“哇耶!怎麼會這樣!”
“你從來沒有過這樣的經歷嗎?從來沒有見過這樣一個傢伙之前哦耶!”


tangkk

Saturday, November 24, 2012

You are so civilized! You are great! 你是太文明了!你是偉大的!

现在那些什么乱七八糟的音乐会,都不如吴莫愁一首歌。

“Why?”

“Because they just doesn't make sense!”
“Well you are so dumb! They really make sense!”
“Well, OK! That is just because they doesn't makes sense to me. Because I'm not as civilized as you are, alright?”

///////////////////////////////////////////////////////////


"Why?"

"Because the performers seems very enjoying."
"But isn't it good? Therefore we can also enjoy more!"
"No, because they're not enjoying playing music"
"Then what are they enjoying Huh?"
"I don't know, maybe I'll never know."
"But why? What do you mean by they're not enjoying playing music. It seems to me that they all enjoy playing music!"
"Yeah, but not for us, OK? They play for themselves."

//////////////////////////////////////////////////////////


"Why?"

"I don't know, maybe too complicated for me."
"But you should learn, man. You really should learn to appreciate."
"I'm sorry, but I'm really dumb. And you know what? I'm also really poor."
"OK! Anyway, you cannot get along with those elite guys if you cannot understand."
"Sorry! And Farewell! I don't understand those things. I don't need to. Plus I don't even understand what "elite" is for. You are so pretty well civilized, you are great!"

那些对吴莫愁不以为然的人,不知道心里面装的是什么文明。


/////////////////////////////////////////////////////////


And the following are proudly translated by Google! This is something really great! Wow!


以下是自豪地通過谷歌翻譯!這是真正偉大的東西!哇!



“為什麼?”
“因為他們只是沒有任何意義!”
“嗯,你是太愚蠢了!他們真正意義!“
“嗯,OK!這僅僅是因為他們沒有對我來說很有意義。因為我不是作為文明的你,還好嗎?“

/ / / //////////// // // // // // // // // // // // // // // // // // / / / ////// /


“為什麼?”

“由於演員似乎很享受。”
“不過是不是好?因此,我們也可以享受更多的!”
“沒有,因為他們不喜歡玩音樂”
“那是他們享受了嗎?”
“我不知道,也許我永遠也不會知道。”
“但是,為什麼?你的意思是他們不喜歡玩音樂。在我看來,他們都喜歡玩音樂!”
“是的,但不適合我們,OK?他們自己玩。”

/ / / //////////// // // // // // // // // // // // // // // // // // / / / / /////


“為什麼?”

“我不知道,也許是太複雜了我。”
“但是你應該學會,男人,你真的應該學會欣賞。”
“我很抱歉,但我真的很愚蠢的,而且你知道嗎,我也真可憐。”
“OK!無論如何,你不能相處與精英的傢伙,如果你不明白。”
“對不起!永別了!我不明白這些事情,我不需要。另外,我什至不明白什麼是”精英“。你這麼漂亮文明,你是偉大的!”

tangkk