小编Jos*_*son的帖子

连字符,下划线或camelCase作为URI中的单词分隔符?

我正在为Intranet应用程序设计基于HTTP的API.我意识到这是一个非常小的问题,在宏观方案中,但是:我应该使用连字符,下划线或camelCase来分隔URI中的单词吗?


以下是我最初的想法:

骆驼香烟盒

  • 如果服务器不区分大小写,则可能出现问题
  • 似乎在查询字符串键(相当广泛使用http://api.example.comSEARCHQUERY = ...),而不是在其他URI部分

连字符号

  • 比其他替代品更美观
  • 似乎广泛用于URI的路径部分
  • 从未在野外见过带连字符的查询字符串键
  • 可能更适合SEO(这可能是一个神话)

下划线

  • 编程语言可能更容易处理
  • 几个流行的API(Facebook,Netflix,StackExchange等)在URI的所有部分都使用下划线.

对于一切我都倾向于下划线.大多数大型玩家使用它们的事实令人信服(参见/sf/answers/42592091/).

api rest url uri restful-url

428
推荐指数
7
解决办法
14万
查看次数

PHP doctrine 1.2 ORM - 具有类表继承的多态查询

我正在试验PHP的Doctrine ORM(v1.2).我已经定义了一个班级"酒",有两个孩子类"杜松子酒"和"威士忌".我使用具体的继承(大多数文献中的类表继承)将类映射到三个单独的数据库表.

我试图执行以下操作:

$liquor_table = Doctrine_Core::getTable('liquor');
$liquors = $liquor_table->findAll();
Run Code Online (Sandbox Code Playgroud)

最初,我预计$ liquors是一个包含所有酒类的Doctrine_Collection,无论它们是威士忌还是杜松子酒.但是当我执行代码时,我得到一个空集合,尽管在威士忌和杜松子酒数据库表中有几行.基于生成的SQL,我理解为什么:ORM查询"酒"表,而不是存储实际数据的威士忌/杜松子酒表.

请注意,当我将继承类型切换到列聚合(简单表继承)时,代码可以正常工作.

获取包含所有酒的Doctrine_Collection的最佳方法是什么?

更新

经过一些研究后,看起来我期待Doctrine UNION在幕后执行SQL 操作来组合"威士忌"和"杜松子酒"表中的结果集.

这称为多态查询.

根据此票证,Doctrine 1.x中不提供此功能.它注定要发布2.0版本.(另见CTI的 Doctrine 2.0文档).

因此,根据这些信息,解决这一缺陷的最简洁,最有效的方法是什么?切换到单表继承?执行两个DQL查询并手动合并生成的Doctrine_Collections?

php doctrine class-table-inheritance

15
推荐指数
1
解决办法
1562
查看次数

开发可维护的RPC系统

我正在开发一个Web应用程序,它将广泛使用AJAX技术进行客户端/服务器通信......特别是JSON-RPC.Zend Framework正在服务器端使用,它提供了一个很好的JSON-RPC服务器,我想使用它.

我的目标是构建一个可维护的系统,将大量服务器端功能暴露给客户端(javascript),而不会产生不必要的代码重复.我已经看过很多关于如何使用ZF的JSON-RPC服务器的博客文章和教程(见这里这里),但它们似乎都面向暴露一个小型的公共可用API.代码重复很常见,例如一篇博文有以下暴露方法:

public static function setTitle($bookId, $title) {
    $book = new Nickel_Model_Book($bookId);
    $book->setTitle($title);
    $book->update();
    return true;
}
Run Code Online (Sandbox Code Playgroud)

我不喜欢有两种setTitle方法的事实.如果一个方法签名发生变化,另一个必须保持同步...如果你的API很广泛,似乎是一个可维护性的噩梦.在我看来应该有一个Book类,有一种setTitle方法.

我最初的想法是为@export我想要暴露的方法/类添加一个docblock注释.当我决定公开setTitle方法时,我只是添加注释而不是新方法.

我看到的一个潜在问题涉及对象持久性.在服务器端,setTitle设置对象的title属性是有意义的......但是在update()调用之前不会将其保留在数据库中.客户端,调用setTitle应立即影响数据库.一种可能的解决方案是修改所有访问器,使得它们采用可选的第二个参数,表示修改应立即更新数据库:

function setTitle($title, $persist = false) {
    $this->title = $title;

    if ($persist) $this->update();
}
Run Code Online (Sandbox Code Playgroud)

某种代理类可以确保$persist为所有客户端RPC调用设置标志.

另一个问题是PHP对象的序列化.在服务器端,进行OO风格的$book->setTitle("foo")调用book.setTitle(1234, "foo")是有意义的,但由于缺乏状态,客户端是有意义的(其中1234是本书的ID).我的解决方案是让上述代理类负责以某种方式book.setTitle(1234, "foo")变成:

$book = new Book();
$book->load(1234);
return $book->setTitle($title);
Run Code Online (Sandbox Code Playgroud)

我觉得这个问题必须先解决或讨论过......但我在网上找不到很多资源.这看起来像是一个理智的解决方案吗?

javascript ajax rpc zend-framework json-rpc

13
推荐指数
1
解决办法
1171
查看次数

PHP的异步处理 - 每个作业一个工作者

考虑一个PHP Web应用程序,其目的是接受用户启动通用异步作业的请求,然后创建一个工作进程/线程来运行该作业.作业不是特别占用CPU或内存,但预计会经常阻塞I/O调用.每秒应该启动不超过一个或两个作业,但由于运行时间长,可能会同时运行许多作业.

因此,工作并行运行至关重要.此外,每个作业都必须由负责杀死挂起的工作人员,根据用户请求中止工作人员等的经理守护程序进行监控.

实现这样的系统的最佳方法是什么?我可以看到:

  1. 从经理那里分配一名工人 - 这似乎是最低级别的选择,我必须自己实施一个监控系统.Apache是​​Web服务器,因此看起来该选项需要通过FastCGI启动任何PHP工作程序.
  2. 使用某种作业/消息队列.(gearman,beanstalkd,RabbitMQ等) - 最初,这似乎是明显的选择.经过一些研究,我对所有选项感到困惑.例如,Gearman看起来像是为庞大的分布式系统而设计的,那里有一个固定的工人池......所以我不知道它是否适合我需要的东西(每个工作一个工人).

php asynchronous message-queue gearman task-queue

9
推荐指数
1
解决办法
5744
查看次数

什么是使用Symfony的EventDispatcher组件的正确方法?

我想通过使某些类可观察来促进我的PHP代码中的松散耦合.Symfony的EventDispatcher组件看起来很有前途,SPL SplObserver/SplSubject对也是如此.

最好的方法是什么?我可以看到几种不同的可能性:

(1)将EventDispatcher实例注入每个可观察类(跟踪全局EventDispatcher实例):

class Foo
{
    public function __construct($dispatcher)
    {
        $this->dispatcher = $dispatcher;
    }

    public function bar()
    {
        $this->dispatcher->dispatch(...);
    }
}
Run Code Online (Sandbox Code Playgroud)

(2)让observable类扩展EventDispatcher类:

class Foo extends EventDispatcher
{
    public function bar()
    {
        $this->dispatch(...);
    }
}
Run Code Online (Sandbox Code Playgroud)

(3)使用SplObserver/SplSubject - 直截了当,但不如EventDispatcher组件灵活

php oop design-patterns symfony1

9
推荐指数
1
解决办法
3822
查看次数

这个函数应该返回什么类型的对象?

考虑这个课程:

class Widget
{
    Widget::Widget();
    bool initialize();
}
Run Code Online (Sandbox Code Playgroud)

A Widget具有以下特征:

  1. initialize() 必须调用才能完全构造
  2. initialize() 可能会失败
  3. initialize() 太贵了

鉴于此,我在工厂函数中封装创建,始终返回相同的Widget实例:

Widget* widget() {
    static auto w = new Widget;
    static auto initialized = false;

    if (!initialized) {
        if (!w->initialize()) {
            return nullptr;
        }
        initialized = true;
    }

    return w;
}
Run Code Online (Sandbox Code Playgroud)

返回类型应该widget()是什么?

特别是,我想以某种方式明确表示返回的生命周期Widget将超过任何调用者,但不会引用内部实现.

  1. 返回一个原始指针并添加一条注释,指出"返回的指针指向一个具有静态存储持续时间的对象,该对象在程序结束前不会被删除".这很简单,但不能自我记录.
  2. 回来一个std::shared_ptr<Widget>.这是自我记录的,但我不喜欢它会引入完全不必要的引用计数开销.
  3. std::unique_ptr<Widget>使用自动删除功能返回a .我认为如果调用者将其转换为#,则它与#2具有相同的感知问题shared_ptr.

c++ factory smart-pointers lifetime c++11

8
推荐指数
2
解决办法
256
查看次数

Eclipse CDT中的"开放实现"

从Eclipse CDT(Juno)中,如何快速导航到函数/方法声明的实现?

ctrl-click键盘快捷键可以让我从实施(在浏览.cxx文件)的声明(.h文件).我想要相反的行为.

c++ eclipse eclipse-cdt

7
推荐指数
2
解决办法
3836
查看次数

在 Spark 2.3.0 中读取 Zstandard 压缩文件

Apache Spark 据称从 Spark 2.3.0 开始支持 Facebook 的 Zstandard 压缩算法(https://issues.apache.org/jira/browse/SPARK-19112),但我无法实际读取 Zstandard 压缩文件:

$ spark-shell

...

// Short name throws an exception
scala> val events = spark.read.option("compression", "zstd").json("data.zst")
java.lang.IllegalArgumentException: Codec [zstd] is not available. Known codecs are bzip2, deflate, uncompressed, lz4, gzip, snappy, none.

// Codec class can be imported
scala> import org.apache.spark.io.ZStdCompressionCodec
import org.apache.spark.io.ZStdCompressionCodec

// Fully-qualified code class bypasses error, but results in corrupt records
scala> spark.read.option("compression", "org.apache.spark.io.ZStdCompressionCodec").json("data.zst")
res4: org.apache.spark.sql.DataFrame = [_corrupt_record: string]
Run Code Online (Sandbox Code Playgroud)

我需要做什么才能读取这样的文件?

环境是 AWS EMR 5.14.0。

amazon-emr apache-spark hadoop2 zstandard

7
推荐指数
1
解决办法
2800
查看次数

如何以编程方式获取有状态的ssh shell会话?

我正在开发一个需要向远程服务器发送命令的应用程序.使用大量SSH客户端库可以轻松发送命令.

但是,我希望在每个命令之间保留shell状态(即当前工作目录,环境变量等).我见过的所有客户端库都没有这样做.例如,以下是不能执行我想要的代码示例:

use Net::SSH::Perl;
my $server = Net::SSH::Perl->new($host);
$server->login($user, $pass);

$server->cmd('cd /var');
$server->cmd('pwd');      # I _would like_ this to output /var
Run Code Online (Sandbox Code Playgroud)

在发送命令之间将执行其他任务,因此组合命令$server->cmd('cd /var; pwd')是不可接受的.

ssh perl openssh

6
推荐指数
1
解决办法
673
查看次数

CSS布局随字体样式而变化

请考虑以下HTML标记.在我测试过的大多数浏览器中,第二个列表的显示方式不同(每个列表项都缩进).

两个列表之间的唯一区别与CSS font-style属性有关,我不希望更改列表布局.这种行为有解释吗?

<!DOCTYPE html>
<html>
    <head>
        <style>
            body {font-family: sans-serif}
            span {float: left}
            ul.bad span {font-style: italic}
        </style>
    </head>
    <body>
        <ul>
            <li><span>foo</span></li>
            <li><span>foo</span></li>
            <li><span>foo</span></li>
            <li><span>foo</span></li>
        </ul>
        <ul class="bad">
            <li><span>foo</span></li>
            <li><span>foo</span></li>
            <li><span>foo</span></li>
            <li><span>foo</span></li>
        </ul>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

html css

5
推荐指数
1
解决办法
269
查看次数