October 11, 2013
Linux 之 /etc/profile、~/.bash_profile 等几个文件的执行过程
"\u003cp\u003e\u003cstrong\u003e在登录Linux时要执行文件的过程如下:\u003c/strong\u003e\n在刚登录Linux时,首先启动 /etc/profile 文件,然后再启动用户目录下的 ~/.bash_profile、 ~/.bash_login或 ~/.profile文件中的其中一个,\u003c/p\u003e\n\u003cp\u003e执行的顺序为:~/.bash_profile、 ~/.bash_login、 ~/.profile。\u003c/p\u003e\n\u003cp\u003e如果 ~/.bash_profile文件存在的话,一般还会执行 ~/.bashrc文件。\u003c/p\u003e\n\u003cp\u003e因为在 ~/.bash_profile文件中一般会有下面的代码:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eif [ -f ~/.bashrc ] ; then\n. ./bashrc\nfi\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e~/.bashrc中,一般还会有以下代码:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eif [ -f /etc/bashrc ] ; then\n. /etc/bashrc\nfi\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e所以,~/.bashrc会调用 /etc/bashrc文件。最后,在退出shell时,还会执行 ~/.bash_logout文件。\u003c/p\u003e\n\u003cp\u003e执行顺序为: /etc/profile -\u0026gt; (~/.bash_profile | ~/.bash_login | ~/.profile) -\u0026gt; …\u003c/p\u003e"
October 7, 2013
php框架–php框架的连贯查询实现原理
"\u003cp\u003e如果你是一名使用过多种框架的php程序员,你一定见过这样的查询语句:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$result = $mysqlDb-\u0026gt;limit(’0,10′)-\u0026gt;order(‘id desc’)-\u0026gt;findall();\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e上面的查询语句,连续使用-\u0026gt;操作符进行操作,并最终返回一个查询结果,那么这是如何实现的呢。\u003c/p\u003e\n\u003cp\u003e我们来简单分析一下:\u003c/p\u003e\n\u003cp\u003e-\u0026gt;操作符用来访问对象,上面的语句一共使用了3次-\u0026gt;操作符,而最后一次返回的是查询结果,这说明,前2次-\u0026gt;访问后,返回的应该是一个对象,因为在php中,如果你对一个非对象使用-\u0026gt;操作符是不可能的。这告诉我们,$mysql实例中的limit和order方法都返回一个对其所在类自身的引用即 return $this,了解了这一点,那么我们就可以实现连贯查询了。请看站长写的示例代码:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e/*\n *类功能:实现数据库的连贯查询操作\n */\n class mysql_query{\n var $tbl=’user’;//要操作的表名\n var $limit=”;//存储limit语句的变量\n var $order=”;//存储order …\u003c/code\u003e\u003c/pre\u003e"
October 7, 2013
[翻译]绝妙的 channel
"\u003cp\u003e在编写 golang 程序的过程中,channel 会经常使用。本文对 channel 的使用的确很特别,同时也非常实用。\u003c/p\u003e\n\u003cp\u003e原文在此: \u003ca href=\"http://dave.cheney.net/2013/04/30/curious-channels\" title=\"Curious channels\"\u003ehttp://dave.cheney.net/2013/04/30/curious-channels\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e在编写 golang 程序的过程中,channel 会经常使用。本文对 channel 的使用的确很特别,同时也非常实用。\u003c/p\u003e\n\u003cp\u003e原文在此:http://dave.cheney.net/2013/04/30/curious-channels\u003c/p\u003e\n\u003cp\u003e翻译:\u003ca href=\"http://mikespook.com/2013/05/%E7%BF%BB%E8%AF%91%E7%BB%9D%E5%A6%99%E7%9A%84-channel/#more-1635\"\u003ehttp://mikespook.com/2013/05/%E7%BF%BB%E8%AF%91%E7%BB%9D%E5%A6%99%E7%9A%84-channel/#more-1635\u003c/a\u003e\u003c/p\u003e"
October 4, 2013
VIM编辑器下go语法高亮显示
"\u003ch1 id=\"go-in-vim\"\u003eGo in Vim\u003c/h1\u003e\n\u003cp\u003eThe standard Go distribution includes a Go syntax file for Vim in \u003ccode\u003ego/misc/vim/\u003c/code\u003e.\u003c/p\u003e\n\u003ch2 id=\"installation-instructions\"\u003eInstallation Instructions\u003c/h2\u003e\n\u003cp\u003ePlace \u003ccode\u003e$GOROOT/misc/vim/syntax/go.vim\u003c/code\u003e in \u003ccode\u003e~/.vim/syntax/\u003c/code\u003e and put the following in \u003ccode\u003e~/.vim/ftdetect/go.vim\u003c/code\u003e:\u003c/p\u003e\n\u003cp\u003e在go的安装目录里有/misc/vim/syntax 他 /misc/vim/ftdetect 两个目录,将里面的文件复制到~/.vim/相应的目录里即可。\u003c/p\u003e\n\u003cp\u003eau BufRead,BufNewFile *.go set filetype=go\u003c/p\u003e\n\u003ch2 id=\"extras-and-alternative-files\"\u003eExtras and Alternative Files\u003c/h2\u003e\n\u003cp\u003eAn alternative indent file for Vim by Alecs King can be found \u003ca href=\"http://go-lang.cat-v.org/text-editors/vim/go-indent.vim\"\u003ehere\u003c/a\u003e.\u003c/p\u003e\n\u003ch2 id=\"autocompletion\"\u003eAutocompletion\u003c/h2\u003e\n\u003cp\u003eThe \u003ca href=\"http://github.com/nsf/gocode\"\u003egocode\u003c/a\u003e daemon by nsf includes a vim script …\u003c/p\u003e"
October 3, 2013
ZeroMQ的模式-Publish-Subscribe[转]
"\u003cp\u003e\u003cstrong\u003ePublish-subscribe Pattern\u003c/strong\u003e:发布订阅模式。\u003c/p\u003e\n\u003cp\u003e现实中,并不是所有请求都期待答复,而不期待答复,自然就没有了状态。所以相对于REQ-REP,PUB-SUB模式容易理解也简单得多。广播听过吧?收音机用过吧?就这个意思。\u003c/p\u003e\n\u003cp\u003e相应地,该模式下的socket也就两种:ZMQ_PUB \u0026amp; ZMQ_SUB。 分别对应电台和收音机。\u003c/p\u003e\n\u003ch1 id=\"toc9\"\u003eZMQ_PUB\u003c/h1\u003e\n\u003cp\u003eZMQ_PUB主要用来让消息发布者用来散发消息的。所有连接上的peer都能收到由它散发的消息。 \u003ca href=\"http://api.zeromq.org/2-1:zmq_recv\"\u003ezmq_recv(3)\u003c/a\u003e 这个API是不能用在这个socket上的,原因显而易见。而zmq_send作用在该socket上时是永远不会阻塞的,如果订阅者异常,发出的消息则会被丢弃。\u003c/p\u003e\n\u003cp\u003eSummary of ZMQ_PUB characteristics\u003c/p\u003e\n\u003cp\u003eCompatible peer sockets\n\u003cem\u003eZMQ_SUB\u003c/em\u003e\nDirection\u003c/p\u003e\n\u003cp\u003eUnidirectional\u003c/p\u003e\n\u003cp\u003eSend/receive pattern\u003c/p\u003e\n\u003cp\u003eSend only\u003c/p\u003e\n\u003cp\u003eIncoming routing strategy\u003c/p\u003e\n\u003cp\u003eN/A\u003c/p\u003e\n\u003cp\u003eOutgoing routing strategy …\u003c/p\u003e"
October 3, 2013
ZeroMQ的模式-综述
"\u003cp\u003e通过对 \u003ca href=\"http://zguide.zeromq.org/page:all\"\u003eGuide\u003c/a\u003e 的阅读,可以发现ZeroMQ对这个世界中消息传输的模式进行了很好的抽象。为了描述模式,0mq定义了不同的socket。 0mq socket是0mq世界的东西,跟传统世界的socket是不一样的。\u003c/p\u003e\n\u003cp\u003e我们知道,传统的socket其实就是访问下面两种(TCP \u0026amp; UDP)对象的\u003cstrong\u003e同步\u003c/strong\u003e的接口:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e面向连接的可靠字节流(SOCK_STREAM)\u003c/li\u003e\n\u003cli\u003e无连接的不可靠的数据报文(SOCK_DGRAM)\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e所以你可以说传统socket传输的是字节流或者独立的报文。\u003c/p\u003e\n\u003cp\u003e而0mq的socket传输的是消息(Message)。它是对\u003cstrong\u003e异步_消息_\u003c/strong\u003e\u003cem\u003e队列\u003c/em\u003e(MQ)的一种抽象。官方的原话是:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eØMQ sockets present an abstraction of an asynchronous \u003cem\u003emessage queue\u003c/em\u003e, with the exact queueing semantics depending on the socket type in use.\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e异步\u003c/strong\u003e的意思在这里指的是物理连接的创建、销毁、重连、传输对于用户来说都是透明的,这些东西都由0mq组织好了。它传输的是独立的**\u003cem\u003e消 …\u003c/em\u003e\u003c/p\u003e"
October 3, 2013
ZeroMQ的模式-Requset-Reply[转]
"\u003cp\u003e我们先来看看第一种模式:\u003cstrong\u003eRequest-Reply Pattern\u003c/strong\u003e。 请求应答模式。\u003c/p\u003e\n\u003cp\u003eRequest-Reply这个名字很直白,口语点说就是\u003cstrong\u003e一问一答\u003c/strong\u003e。可以使同步的遵循请求序的一问一答,也可以是异步的不按请求序的一问一答;其中也可以包含各种不同的路由策略——让谁来回答。zeromq定义的为这个模式服务的socket有:ZMQ_REQ, ZMQ_REP, ZMQ_ROUTER以及ZMQ_DEALER. 用他们进行合理的组合,就可以实现现实世界中各种不同的请求应答模式。\u003c/p\u003e\n\u003cp\u003e分别来看:\u003c/p\u003e\n\u003ch1 id=\"zmq_req\"\u003eZMQ_REQ\u003c/h1\u003e\n\u003cp\u003eZMQ_REQ做的事情就是\u003cstrong\u003e发问\u003c/strong\u003e,然后\u003cstrong\u003e收答\u003c/strong\u003e。发、收必须是严格按序进行。请求时对对端进行Round Robin,遇到异常则阻塞。官方对这个socket的总结如下:\u003c/p\u003e\n\u003cp\u003eSummary of ZMQ_REQ characteristics\u003c/p\u003e\n\u003cp\u003eCompatible peer sockets\n\u003cem\u003eZMQ_REP\u003c/em\u003e\nDirection\u003c/p\u003e\n\u003cp\u003eBidirectional\u003c/p\u003e\n\u003cp\u003eSend/receive pattern\u003c/p\u003e\n\u003cp\u003eSend, Receive, Send, Receive, …\u003c/p\u003e\n\u003cp\u003eOutgoing routing strategy …\u003c/p\u003e"
October 3, 2013
ZeroMQ的模式-Pipeline[转]
"\u003cp\u003e\u003cstrong\u003ePipeline pattern\u003c/strong\u003e 管道模式。\u003c/p\u003e\n\u003cp\u003e这种模式描述的场景是数据被散布到以管道方式组织的各个节点上。管道的每一步都连接一个或多个节点,连接多个节点时数据以RR方式往下流。\u003c/p\u003e\n\u003cp\u003e注意是\u003cstrong\u003e流\u003c/strong\u003e,意味着数据跟发布模式一样是单向的。这个模式对应的socket是ZMQ_PUSH和ZMQ_PULL.\u003c/p\u003e\n\u003ch1 id=\"zmq_push\"\u003eZMQ_PUSH\u003c/h1\u003e\n\u003cp\u003e用来向下游节点发消息。下游多个节点时采取RoundRobin分发,_zmq_recv()_对于这个socket也是无效的。\u003c/p\u003e\n\u003cp\u003e与Pub不同的是,当下游节点达到高水位(HWM)或者根本没有下游节点时,_zmq_send()_就阻塞了,消息并不丢失。\u003c/p\u003e\n\u003cp\u003eSummary of ZMQ_PUSH characteristics\u003c/p\u003e\n\u003cp\u003eCompatible peer sockets\n\u003cem\u003eZMQ_PULL\u003c/em\u003e\nDirection\u003c/p\u003e\n\u003cp\u003eUnidirectional\u003c/p\u003e\n\u003cp\u003eSend/receive pattern\u003c/p\u003e\n\u003cp\u003eSend only\u003c/p\u003e\n\u003cp\u003eIncoming routing strategy\u003c/p\u003e\n\u003cp\u003eN/A\u003c/p\u003e\n\u003cp\u003eOutgoing routing strategy\u003c/p\u003e\n\u003cp\u003eRound-robin\u003c/p\u003e\n\u003cp\u003eZMQ_HWM option action\u003c/p\u003e\n\u003cp\u003eBlock …\u003c/p\u003e"
October 2, 2013
gozmq的安装与使用教程(zeromq分布式消息队列+golang)
"\u003cp\u003e实现功能:用go实现消息队列的写入与读取(打算用在发送邮件服务)\u003c/p\u003e\n\u003cp\u003e环境工具:\nCentos 64X 6.4\nzeromq 3.2.4: \u003ca href=\"http://www.zeromq.org\"\u003ezeromq.org\u003c/a\u003e\ngolang: \u003ca href=\"http://golang.org/\"\u003ehttp://golang.org/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一.安装golang( \u003ca href=\"http://golang.org/doc/install\"\u003ehttp://golang.org/doc/install\u003c/a\u003e)\u003c/strong\u003e\n这一步很简单,只需要从 \u003ca href=\"http://code.google.com/p/go/downloads\"\u003ehttp://code.google.com/p/go/downloads\u003c/a\u003e 下载到服务器,解压到/usr/local/go目录,再设置一下系统变量就可以了.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ewget https://go.googlecode.com/files/go1.1.2.linux-amd64.tar.gz\ntar -C /usr/local -xzf go1.1.2.linux-amd64.tar.gz\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003e设置系统变量GOROOT\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eAdd \u003ccode\u003e/usr/local/go/bin\u003c/code\u003e to the \u003ccode\u003ePATH\u003c/code\u003e environment variable. You can do this by adding this line to your \u003ccode\u003e/etc/profile\u003c/code\u003e (for a system-wide …\u003c/p\u003e"
August 23, 2013
Git 常用命令详解(二)
"\u003ch3 id=\"git-community-book-中文版\"\u003e\u003ca href=\"http://gitbook.liuhui998.com/index.html\"\u003eGit Community Book 中文版\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eGit 是一个很强大的分布式版本管理工具,它不但适用于管理大型开源软件的源代码(如: \u003ca href=\"http://git.kernel.org/\"\u003elinux kernel\u003c/a\u003e),管理私人的文档和源代码也有很多优势(如: \u003ca href=\"http://code.google.com/p/wsi-lgame-pro/\"\u003ewsi-lgame-pro\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eGit 的更多介绍,请参考我的上一篇博客: \u003ca href=\"http://blog.csdn.net/sunboy_2050/article/details/7527877\"\u003eGit 版本管理工具\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一、 Git 命令初识\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e在正式介绍Git命令之前,先介绍一下Git 的基本命令和操作,对Git命令有一个总体的认识\u003c/p\u003e\n\u003cp\u003e示例:从Git 版本库的初始化,通常有两种方式:\u003c/p\u003e\n\u003cp\u003e1)git clone:这是一种较为简单的初始化方式,当你已经有一个远程的Git版本库,只需要在本地克隆一份\u003c/p\u003e\n\u003cp\u003e例如:git clone git://github.com/someone/some_project.git some_project\u003c/p\u003e\n\u003cp\u003e上面的命令就是将’git://github.com/someone/some_project.git’这个URL地址的远程版本库,完全克隆到本地some_project目录下\u003c/p\u003e\n\u003cp\u003e2)git init 和 git remote:这种方式稍微复杂一些,当你本地创建了一个工作目录,你可以进 …\u003c/p\u003e"
August 20, 2013
mysql中的表锁的优化
"\u003ch2 id=\"一获取锁等待情况\"\u003e一、获取锁等待情况\u003c/h2\u003e\n\u003cp\u003e可以通过检查table_locks_waited和table_locks_immediate状态变量来分析系统上的表锁定争夺:\nmysql\u0026gt; show status like ‘Table%’;\n+—————————-+———-+\n| Variable_name | Value |\n+—————————-+———-+\n| Table_locks_immediate | 105 |\n| Table_locks_waited | 3 |\n+—————————-+———-+\n2 rows in set (0.00 sec)\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eTable_locks_immediate\u003c/strong\u003e 表示立即释放MySQL表锁数,\n\u003cstrong\u003eTable_locks_waited\u003c/strong\u003e 表示需要等待的MySQL表锁数\u003c/p\u003e\n\u003cp\u003e如果Table_locks_waited的值比较高,则说明存在着较严重的表级锁争用情况。这时,需要我们对应用做进一步的检查,来确定问题所在。\u003c/p\u003e\n\u003cp\u003e可以通过检查Innodb_row_lock状态变量来分析系统上的行锁的争夺情况:\nmysql\u0026gt; show status …\u003c/p\u003e"
August 12, 2013
golang中结构体的初始化方法的不同用法(new方法)
"\u003cp\u003e自定义一个结构体\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003etype Rect struct {\n x, y float64\n width, height float64\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e初始化方法:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003erect1 := new(Rect)\nrect2 := \u0026amp;Rect{}\nrect3 := \u0026amp;Rect{0, 0, 100, 200}\nrect4 := \u0026amp;Rect{width:100, height:200}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e注意这几个变量全部为指向Rect结构的指针(\u003cstrong\u003e指针变量\u003c/strong\u003e),因为使用了new()函数和\u0026amp;操作符。\u003c/p\u003e\n\u003cp\u003e而如果使用方法\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ea := Rect{}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e则表示这个是一个Rect{}\u003cstrong\u003e结构类型\u003c/strong\u003e.两者是不一样的.参考代码:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003efunc main() {\na := Rect{}\na.x = 15\n\nrect1 := \u0026amp;Rect{0, 0, 100, 200}\nrect1.x = 10\n\nfmt.Printf(\u0026#34;%v\\n%T\\n\u0026#34;, a, a)\nfmt.Printf(\u0026#34;%v\\n%T\\n\u0026#34;, rect1, rect1)\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e运行结果为:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e{15 0 0 0}\n main.Rect …\u003c/code\u003e\u003c/pre\u003e"
August 11, 2013
golang中的文档管理
"\u003cp\u003efoo.go\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e// CopyRight 2013 The Go Author. All Right reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE fifle.\n\n/*\nPackage foo implements a set of simple mathematical functions. These comments are for\ndemonstration purpose only. Nothing more.\n\nIf you have any questions,please don’t hesitate to add yourself to\[email protected].\n\nyou can alse visit golang.org for full Go documentation.\n*/\n\npackage foo\n\nimport (\n\t\u0026#34;fmt\u0026#34;\n)\n\n// …\u003c/code\u003e\u003c/pre\u003e"
August 11, 2013
golang中的map数据类型操作实例
"\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epackage main\n\nimport (\n\t\u0026#34;fmt\u0026#34;\n)\n\ntype stu struct {\n\tName string\n\tAge int\n}\n\nfunc main() {\n\n\t// 声明一个map变量student,键名为string,值为stu\n\tvar student map[string]stu\n\n\t// 给map变量创建值,同时指定最多可以存储5个stu值\n\tstudent = make(map[string]stu, 5)\n\n\t// map元素赋值\n\tstudent[\u0026#34;stu1\u0026#34;] = stu{\u0026#34;zhao\u0026#34;, 25}\n\tstudent[\u0026#34;stu2\u0026#34;] = stu{\u0026#34;zhang\u0026#34;, 28}\n\tstudent[\u0026#34;stu3\u0026#34;] = stu{\u0026#34;sun\u0026#34;, 32}\n\tstudent[\u0026#34;stu4\u0026#34;] = stu{\u0026#34;li\u0026#34;, 40}\n\tstudent[\u0026#34;stu5\u0026#34;] = stu{}\n\n\t//上面方式的简写方法\n\t/* …\u003c/code\u003e\u003c/pre\u003e"
August 9, 2013
go语言单元测试
"\u003cp\u003eGo本身提供了一套轻量级的测试框架.符合规则的测试代码会在运行测试时被自动识别并执行.单元测试源文件的命名规则如平衡点:在需要测试的包下面创建以”_test”结尾的go文件,开如[^.]*_test.go\u003c/p\u003e\n\u003cp\u003eGo单元测试函数分为两在类.\u003cstrong\u003e功能测试函数\u003c/strong\u003e和\u003cstrong\u003e性能测试函数\u003c/strong\u003e,分别以Test和Benchmark为函数名前缀并以*testing.T 和 *testing.B 为单一参数的函数。\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003efunc TestAdd1(t *testing.T)\nfunc BenchmarkAdd1(t *testing.T)\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e测试工具会根据函数中的实际执行动作得到不同的测试结果。\u003c/p\u003e\n\u003cp\u003e功能测试函数会根据测试代码执行过程中是否发生错误来反馈结果;\n性能测试函数仅仅打印出来测试所花费时间,用来判断程序性能;\u003c/p\u003e\n\u003ch1 id=\"准备\"\u003e准备\u003c/h1\u003e\n\u003cp\u003e新建一个文件,命名为 go_test.go\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epackage go_test\n\nimport \u0026#34;testing\u0026#34;\n\nfunc Add(a, b int) int {\n return a + b\n}\n\u003c/code\u003e\u003c/pre\u003e\u003ch1 id=\"功能测试\"\u003e功能测试\u003c/h1\u003e\n\u003cp\u003e在go_test.go文件里添加以下代码\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003efunc TestAdd1(t …\u003c/code\u003e\u003c/pre\u003e"