我有一个将参数绑定到 LIKE 语句的查询,如下所示:
my $sth = $dbh->prepare('SELECT foo FROM bar WHERE baz LIKE ?');
$sth->execute("%$like%");
Run Code Online (Sandbox Code Playgroud)
但是,$like它是由用户输入的值。因此,如果值包含子句LIKE( &, _, \) 识别的任何特殊字符,这些字符将以未转义的方式传递到数据库并解析为通配符或转义字符。例如,如果用户输入%value,将提交的查询是:SELECT foo FROM bar WHERE baz LIKE '%%value',而不是LIKE '%\%value我所期望的。
目前我正在使用正则表达式手动转义该字段:
# Escape LIKE wildcard characters
$like =~ s!\\!\\\\!g;
$like =~ s!%!\\%!g;
$like =~ s!_!\\_!g;
my $sth = $dbh->prepare('SELECT foo FROM bar WHERE baz LIKE ?');
$sth->execute("%$like%");
Run Code Online (Sandbox Code Playgroud)
但感觉转义是 DBI 应该能够处理的。我尝试过使用DBI::quote,但这是为引用整个字段而设计的,因此在这种情况下它还会引用%我添加的符号,并且文档中DBI::quote特别指出:
quote() 方法不应与“占位符和绑定值”一起使用。
是否有更好的方法将用户提供的输入绑定到 …
为了计算两个日期之间的年数,我在 iex 上编写了以下代码:
>date1 = {{2016,3,21},{0,0,0}}
>date2= {{1983,12,27},{0,0,0}}
>:calendar.time_difference(date1,date2)
Run Code Online (Sandbox Code Playgroud)
返回两个日期之间的天数。还有其他方法可以计算差异吗?
我正在努力将解密函数从.NET移植到elixir作为概念证明.
任何人都可以给我一些关于这是否可以与Erlang加密模块一起使用的指导?我玩过各种block_decrypt功能,但从来没能得到正确的结果.我在想我的问题来自一个不正确的密钥和IV.
我不确定如何从加密的纯文本值派生字节数据进入block_decrypt.
这是我用来尝试解密的elixir代码:
defmodule TestApp.Decrypt do
@iv <<30,64,180,159,172,197,92,10,197,3,39,75,53,92,93,37>>
def unpad(data) do
to_remove = :binary.last(data)
:binary.part(data, 0, byte_size(data) - to_remove)
end
def decrypt(data, key) do
IO.puts "WOrking to decrypt #{data} using #{key}"
padded = :crypto.block_decrypt(:aes_cbc256, key, @iv, :base64.decode(data))
unpad(padded)
end
end
Run Code Online (Sandbox Code Playgroud)
我有一个32字节的密钥,我试图传入,但我收到此错误:
Erlang error: :notsup
Run Code Online (Sandbox Code Playgroud)
加密库指出错误的原因是我的erlang版本没有启用脏调度程序,但我不知道在调查之前我是否正朝着正确的方向前进.
我的目标是找到从现在到一些提供的date_time之间的小时差异.我试着这样做:
pry(1)> dt1
#DateTime<2017-10-24 05:12:46.000000Z>
pry(2)> Ecto.DateTime.to_erl(dt1)
** (FunctionClauseError) no function clause matching in Ecto.DateTime.to_erl/1
The following arguments were given to Ecto.DateTime.to_erl/1:
# 1
#DateTime<2017-10-24 05:12:46.000000Z>
Attempted function clauses (showing 1 out of 1):
def to_erl(%Ecto.DateTime{year: year, month: month, day: day, hour: hour, min: min, sec: sec})
(ecto) lib/ecto/date_time.ex:608: Ecto.DateTime.to_erl/1
# ............
Run Code Online (Sandbox Code Playgroud)
如何解决?或者有更好的方法来实现我的目标吗?
请注意,我不使用timex,也不会使用它,也不会使用任何第三方库.只有内置于Elixir/Erlang/Phoenix的内置.
我正在努力了解的行为UriComponentsBuilder。我想使用它在查询参数中对URL进行编码,但是它似乎只能转义%字符,而不可以转义其他必需的字符&。
根本没有编码的查询参数中的URL的示例:
UriComponentsBuilder.fromUri("http://example.com/endpoint")
.queryParam("query", "/path?foo=foo&bar=bar")
.build();
Run Code Online (Sandbox Code Playgroud)
输出: http://example.com/endpoint?query=/path?foo=foo&bar=bar
这是不正确的,因为未编码的&原因bar=bar会被解释为/endpoint而不是的查询参数/path。
但是,如果我使用包含%字符的输入::
UriComponentsBuilder.fromUri("http://example.com/endpoint")
.queryParam("query", "/path?foo=%20bar")
.build();
Run Code Online (Sandbox Code Playgroud)
输出: http://example.com/endpoint?query=/path?foo=%2520bar
该%字符转义。
似乎UriComponentsBuilder会自动转义%字符,但不会自动转义其他保留字符,这是不一致的。
将URL编码为带有查询参数的正确过程是什么UriComponentsBuilder?
我有一个这样定义的Java类(我无法编辑,因为它是Thrift自动生成的):
public class TheirException extends Throwable {
public String message;
public TheirException(String message) {
this.message = message;
}
public String getMessage() {
return this.message;
}
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试message从Kotlin 获取,getMessage()则无法使用并产生Unresolved reference错误。尝试使用该message字段会产生以下错误:
错误:(470,30)Kotlin:重载解析度模糊:
public final var消息:字符串!在com.example.TheirException
公共打开值消息中定义:字符串?在com.example.TheirException中定义
但是,如果我改为:
(exception as Throwable).message
Run Code Online (Sandbox Code Playgroud)
它可以解决。
为什么Throwable在这里强制转换为必需的,为什么getMessage()不可用,以及造成歧义的原因是什么?
我想知道这个 Elixir 正则表达式是如何工作的。
Regex.run(~r{(*UTF)([^\w])+}, "dd!!%%%")
Run Code Online (Sandbox Code Playgroud)
当我执行这个正则表达式时,输出是
["!!%%%", "%"]
Run Code Online (Sandbox Code Playgroud)
我无法理解为什么在匹配正则表达式后会重复最后一个 %。
我有 Phoenix 应用程序,HTTP 端点背后有复杂的业务逻辑。此逻辑包括与数据库和少量外部服务的交互,一旦请求处理开始,就不得中断,直到所有操作完成为止。
但如果客户端突然关闭连接,Cowboy 或 Ranch 似乎会杀死请求处理程序进程(Phoenix 控制器),这会导致部分执行的业务流程。为了调试这个,我在控制器操作中有以下代码:
Process.flag(:trap_exit, true)
receive do
msg -> Logger.info("Message: #{inspect msg}")
after
10_000 -> Logger.info("Timeout")
end
Run Code Online (Sandbox Code Playgroud)
为了模拟连接关闭,我设置了 timeout: curl --request POST 'http://localhost:4003' --max-time 3。在 IEx 控制台中 3 秒后,我看到该进程即将退出:Message: {:EXIT, #PID<0.4196.0>, :shutdown}。
因此,我需要让控制器完成其工作,并在客户端仍然存在时回复客户端,或者如果连接丢失则不执行任何操作。这将是实现这一目标的最佳方法:
Task到控制器操作并等待其结果;exit_on_close但没有运气)?在 Elixir 中,您可以iex通过以下命令将 shell 与应用程序的上下文一起使用...
iex -S mix
Run Code Online (Sandbox Code Playgroud)
这个命令非常方便,让我们可以在交互式 shell 中使用应用程序功能。
我想知道是否可以使用参数启动交互式 shell,或者是否可以让您的应用程序在用户与 shell 交互之前调用某些函数。
例如,假设我有一个名为 的应用程序MyApp,并以 启动它iex -S mix。而不必手动在 shell 中输入命令,例如
iex -S mix
Run Code Online (Sandbox Code Playgroud)
有一种方法可以让这一切自动发生。
我有张量流模型的 .meta 和 .ckpt 文件。我想知道确切的输入和输出节点名称,但我通过遵循此获取节点名称列表。
当我有一个冻结的 protobuf 模型时,我使用以下代码将输入节点名称和输出节点名称作为列表的开头和结尾:
import tensorflow as tf
from tensorflow.python.platform import gfile
GRAPH_PB_PATH = 'frozen_model.pb'
with tf.Session() as sess:
print("load graph")
with gfile.FastGFile(GRAPH_PB_PATH,'rb') as f:
graph_def = tf.GraphDef()
graph_def.ParseFromString(f.read())
sess.graph.as_default()
tf.import_graph_def(graph_def, name='')
graph_nodes=[n for n in graph_def.node]
names = []
for t in graph_nodes:
names.append(t.name)
print(names)
Run Code Online (Sandbox Code Playgroud)
我可以为 .ckpt 或 .meta 文件做类似的事情吗?
elixir ×6
java ×2
cowboy ×1
datetime ×1
dbi ×1
elixir-iex ×1
erlang ×1
kotlin ×1
perl ×1
python ×1
ranch ×1
regex ×1
regex-group ×1
spring ×1
sql ×1
tensorflow ×1
url-encoding ×1