我正在使用erlang,mnesia和webmachine构建一个网站.我读过的大多数文档都赞扬了具有引用透明功能的优点.
问题是,所有数据库访问都是外部状态.这意味着任何命中数据库的方法都不再是引用透明的.
假设我在数据库中有一个用户对象和一些处理身份验证的函数.
参考不透明的函数可能看起来像:
handle_web_request(http_info) ->
is_authorized_user(http_info.userid),
...
%referentially opaque
is_authorized_user(userid) ->
User = get_user_from_db(userid),
User.is_authorized.
%referentially opaque
lots_of_other_functions(that_are_similar) ->
db_access(),
foo.
Run Code Online (Sandbox Code Playgroud)
引用透明度要求我最小化引用不透明代码的数量,因此调用者必须从数据库中获取对象并将其作为参数传递给函数:
handle_web_request(http_info) ->
User = get_user(http_info.userid),
is_authorized_user(User),
...
%referentially opaque
get_user(userid) ->
get_user_from_db(userid).
%referentially transparent
is_authorized(userobj) ->
userobj.is_authorized.
%referentially transparent
lots_of_other_functions(that_are_similar) ->
foo.
Run Code Online (Sandbox Code Playgroud)
上面的代码显然不是生产代码 - 它纯粹是出于说明目的而编写的.
我不想陷入教条.引用透明代码(如可证明的单元测试)的好处是否证明了不太友好的接口?我应该在追求传教的过程中走多远?
您认为哪种C宏最有用?我找到了以下一个,用于在C中进行矢量运算:
#define v3_op_v3(x, op, y, z) {z[0]=x[0] op y[0]; \
z[1]=x[1] op y[1]; \
z[2]=x[2] op y[2];}
Run Code Online (Sandbox Code Playgroud)
它的工作方式如下:
v3_op_v3(vectorA, +, vectorB, vectorC);
v3_op_v3(vectorE, *, vectorF, vectorJ);
...
Run Code Online (Sandbox Code Playgroud) 我正在使用pysvn,我正在尝试找到一种合适的方法来处理只能通过svn + ssh访问的存储库.显然,SSH密钥使这一切变得异常简单,但我无法保证最终用户将使用SSH密钥.这也必须能够在没有用户交互的情况下运行,因为它将进行一些svn日志解析.
最大的问题是,使用svn + ssh会弹出一个交互式提示进行身份验证.显然我希望能够让pysvn自动使用一组给定的凭据登录,但是set_default_username和set_default_password在这方面对我没有任何帮助.如果我不能拥有它,我至少希望能够失败,并记录一条消息告诉用户设置SSH密钥.但是,set_interactive似乎与此无关,我仍然会提示输入client.log('svn + ssh:// path')的密码.
有关如何解决这个问题的任何想法?是否真的有可能在没有SSH密钥的情况下处理这个问题,因为SSH正在抛出提示?
我是运行.NET 3.5的C#新手,我想在App.config中存储一堆应用程序默认值,因为设置可能因服务器环境(例如开发,登台,生产)而异.我想要做的是类似于StackOverflow文章中描述的内容,但我也希望能够使用非字符串值(例如int,bool).像这样的东西(名称值只是例子,顺便说一句):
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<applicationSettings>
<MyApp>
<setting name="InitText" serializeAs="String">
<value>Hello</value>
</setting>
<setting name="StartAt" serializeAs="Integer">
<value>5</value>
</setting>
<setting name="IsWeekend" serializeAs="Boolean">
<value>True</value>
</setting>
</MyApp>
</applicationSettings>
</configuration>
Run Code Online (Sandbox Code Playgroud)
有人可以提供一个如何执行此操作的示例,以及如何通过C#检索值?我已经看过很多需要使用的例子,但是我不确定我是否需要这些元素,如果需要,如何创建它们.
我正在尝试测试我的控制器并保持关注点的分离.
第一个问题是"谁能够执行哪个行动?"
我使用authlogic进行身份验证,使用be9的acl9进行授权.但这应该不重要,我所有的授权问题都是在a before_filter.我正在before_filter通过类似的东西测试这样的:
describe SomeModelsController, "GET to index (authorization)" do
before(:each) do
@siteadmin = mock_model(User)
@siteadmin.stub!(:has_role?).with("siteadmin", nil).and_return(true)
end
it "should grant access to a siteadmin" do
controller.should_receive(:current_user).at_least(:once).and_return(@siteadmin)
get :index
response.should be_success
end
end
Run Code Online (Sandbox Code Playgroud)
这个规格工作得很好!
现在,第二个问题是"行动是否做了应该做的事情?"
这不涉及检查授权.最好/最干净的解决方案是将before_filter所有内容一起跳过,并执行以下操作:
describe SomeModelsController, "GET to index (functional)" do
it "should find all Models" do
Model.should_receive(:find).with(:all)
end
end
Run Code Online (Sandbox Code Playgroud)
无需担心具有哪个角色的用户必须首先登录.现在我解决了这个问题:
describe SomeModelsController, "GET to index (functional)" do
before(:each) do
@siteadmin = mock_model(User)
@siteadmin.stub!(:has_role?).with("siteadmin", nil).and_return(true)
controller.stub!(:current_user).and_return(@siteadmin)
end
it …Run Code Online (Sandbox Code Playgroud) 我使用过ASP.NET,现在我正在使用Sinatra/MongoDB应用程序.使用ASP.NET体系结构,给定请求使用的数据库连接来自ADO.NET管理的连接池.在请求之间,池中的连接保持活动状态,因此不会为每个http请求支付构建和拆除连接的成本.
Sinatra MongoDB应用程序中是否有类似的机制,或者我是否需要连接/断开每个请求?如果有机制,代码是什么样的?
编辑1:以下不起作用.浏览器发送的每个HTTP请求都会命中new.db行,包括对css,js,jpeg文件的请求.
require 'mongo'
include Mongo
db = Mongo::Connection.new.db("MyDb")
class MyApp < Sinatra::Base
get '/' do
etc
Run Code Online (Sandbox Code Playgroud) 这就是我现在拥有的:
$("input").bind("keydown",function(e){
var value = this.value + String.fromCharCode(e.keyCode);
}
Run Code Online (Sandbox Code Playgroud)
如果e.keyCode可能不是一个ASCII字符(Alt,backspace,del,arrows,,等)......我现在需要trim这些价值从value某种程度上(最好是编程-不查找表).
我正在使用jQuery.
我必须使用这个keydown活动.keyPress不会激活某些键我需要捕捉(Esc,del,backspace等).
我无法setTimeout用来获取输入的值.setTimeout(function(){},0)太慢了.
我编写了这个方便的通用函数,用于将集合集合转换为单个集合:
public static <T> Set<T> makeSet(Collection<Collection<T>> a_collection) {
Iterator<Collection<T>> it = a_collection.iterator();
Set<T> result = new HashSet<T>();
while (it.hasNext()) {
result.addAll(it.next());
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
然后我试着打电话给它:
List<List<String>> resultLists = ... ;
Set<String> labelsSet = CollectionsHelper.makeSet(resultLists);
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
<T>makeSet(java.util.Collection<java.util.Collection<T>>) in CollectionsHelper
cannot be applied to (java.util.List<java.util.List<java.lang.String>>)
Run Code Online (Sandbox Code Playgroud)
现在a List 是a Collection,a String 是a T.那么为什么这不起作用,我该如何解决呢?
有没有关于使用结构作为WCF服务的返回类型的官方建议?
我目前正在与一项我没有写过的服务进行互动,并发现自己受到启发,要求查看我的烦恼是否合理.
我过去总是使用类 - 可能部分是因为这是样本总是显示的,但正如我现在想的那样,出于其他"直观"的原因:
我通过定义一个单独的项目来开始合同样式,该项目的接口表示服务来回传递的类型.
我使用LINQ很多,因此对于可空性的测试是隐含的引用类型,而对于结构和其他值类型,我总是需要标记为可空.
虽然我承认它比我脑子里的项目符号列表更直观,但有些东西会马上来找我.我想问这个问题,因为我正在处理一个返回结构的服务,并且在处理返回值时必须写:
var foo = Bar.Value.MyField;
Run Code Online (Sandbox Code Playgroud)
代替
var foo = Bar.Value;
Run Code Online (Sandbox Code Playgroud) 我需要从文本字段中提取信息,该文本字段可以包含许多值中的一个.SQL看起来像:
SELECT fieldname
FROM table
WHERE bigtextfield LIKE '%val1%'
OR bigtextfield LIKE '%val2%'
OR bigtextfield LIKE '%val3%'
.
.
.
OR bigtextfield LIKE '%valn%'
Run Code Online (Sandbox Code Playgroud)
我的问题是:当数值接近数百,可能数千时,这有多高效?有一个更好的方法吗?
一种解决方案是创建一个新的表/列,只包含我之后的值并执行以下操作:
SELECT fieldname
FROM othertable
WHERE value IN ('val1', 'val2', 'val3', ... 'valn')
Run Code Online (Sandbox Code Playgroud)
我想象的是更高效,因为它只需要进行精确的字符串匹配.这样做的问题是保持这个表最新是很多工作.
顺便说一句我正在使用MS SQL Server 2005.
c# ×2
.net-3.5 ×1
app-config ×1
c ×1
c99 ×1
collections ×1
covariance ×1
erlang ×1
generics ×1
java ×1
javascript ×1
jquery ×1
keycode ×1
macros ×1
mnesia ×1
mongodb ×1
performance ×1
pysvn ×1
python ×1
rspec ×1
ruby ×1
search ×1
sinatra ×1
sql ×1
ssh ×1
string ×1
struct ×1
svn ×1
value-type ×1
wcf ×1