在评论中与@DerrickCoetzee 讨论后,我有时间重新考虑这个答案。事实是,答案实际上可能是在某些服务器上解决此问题的唯一方法。我曾建议给予数据库通用写访问权限,这无疑是不安全的。我发现,这是我唯一可以拥有的解决方案的原因是我的服务器已禁用 php 的写访问权限。 php 无法创建新文件,并且我无法将数据库的所有者更改为 apache 或没有 root 访问权限的“nobody”,这使得更好的解决方案变得不可能。
本质上,我的服务器已经锁定了 php,只有在每个人都可以写的情况下它才可以写。在我看来,这是一个糟糕的服务器设置,导致了这种安全风险,正如 @Derrick 所建议的,sqlite 数据库可能只应用于私人使用或仅服务器访问。有些系统未设置为安全地利用此功能。如果您发现 php 没有写入权限,并且您没有机器的 root 访问权限,则应考虑联系您的系统管理员或切换到 MySQL(如果可用)。
话虽这么说,当数据库不敏感或者只有一小部分人知道时,我发现以下解决方案对于快速原型解决方案非常方便。
我之前的回答:
我今天也遇到了同样的问题!我对 php 和 sqlite 还很陌生,但还是很顺利。突然间,我遇到了这个巨大的障碍(一天没有进展),因为我的 sqlite 数据库中缺少插入,如问题发布者所述。这里的区别因素是没有错误消息或异常,如果将execute语句放入if子句中,只会返回false。
所以,我终于找到了一种方法来获得插入工作,但我不能 100% 确定它是否安全。如果您认为有更好的方法,我将不胜感激。
主要问题是您试图让用户写入文件系统上的文件。但是,默认情况下,文件夹和文档仅对外部人员具有读取访问权限。因此,您需要为您的数据库(user.db)及其文件夹(./db)提供可写访问权限。
因此,您需要进入目录并输入:
chmod 777 ./db
chmod 766 ./db/user.db
这为我解决了这个问题,所以我希望它也能帮助您。我不知道是否有更好的方法,但这看起来很合乎逻辑。
您可能会看到的另一种解决方案是使用引用属性。
class User(db.Model):
name = db.StringProperty()
datejoined = db.DateTimeProperty(auto_now_add=True)
class Content(db.Model):
user = db.ReferenceProperty(User,collection_name='matched_content')
text = db.StringProperty()
datemod= db.DateTimeProperty(auto_now_add = True)
content = db.get(content_key)
user_name = content.user.name
#looking up all of the content for a particular user
user_content = content.user.matched_content
#create new content for a user
new_content = Content(reference=content.user)
@msalvadores 代码答案的 C# 版本
void Main()
{
int[] numbers = {3,9,8,4,5,7,10};
int target = 15;
sum_up(new List<int>(numbers.ToList()),target);
}
static void sum_up_recursive(List<int> numbers, int target, List<int> part)
{
int s = 0;
foreach (int x in part)
{
s += x;
}
if (s == target)
{
Console.WriteLine("sum(" + string.Join(",", part.Select(n => n.ToString()).ToArray()) + ")=" + target);
}
if (s >= target)
{
return;
}
for (int i = 0;i < numbers.Count;i++)
{
var remaining = new List<int>();
int n = numbers[i];
for (int j = i + 1; j < numbers.Count;j++)
{
remaining.Add(numbers[j]);
}
var part_rec = new List<int>(part);
part_rec.Add(n);
sum_up_recursive(remaining,target,part_rec);
}
}
static void sum_up(List<int> numbers, int target)
{
sum_up_recursive(numbers,target,new List<int>());
}
AFAIK GUID/UUID 不是适用于任何智能卡产品的标准卡实例标识方式。例如,SIM 卡是使用文件 EF_ICCID(ICC 标识)(ETSI TS 102 221 V6.15.0 (2010-02))的内容来识别的,因此您可以通过正常的 UICC 文件访问 API 获取它。 ATR 用于卡类型识别 (ISO/IEC 7816-4)。卡上的 GUID/UUID 特定于某些智能卡制造商/产品或智能卡应用程序。
因此,对于 GUID/UUID,您应该至少识别产品和制造商文档或使用该特定卡的人员可以回答您是否可以检索此信息以及如何检索(使用标准 API - 例如,如果它存储在 EF 或专有文件中)一个小程序。
从终端端来说,这通常是在经过一些安全验证后使用 SELECT/READ* 或 GET DATA APDU 来完成的。
我建议您编写一个单独的函数来从数据库中检索值。另外,您应该使用参数化查询来避免 SQL 注入:
public IEnumerable<int> GetPluginIds(int profileId)
{
using (var connection = new SqlConnection("SOME CONNECTION STRING"))
using (var cmd = connection.CreateCommand())
{
connection.Open();
cmd.CommandText = "SELECT plugin_id FROM profiles_plugins WHERE profile_id = @profile_id";
cmd.Parameters.AddWithValue("@profile_id", profileId);
using (var reader = cmd.ExecuteReader())
{
while (reader.Read())
{
yield return reader.GetInt32(0);
}
}
}
}
然后像这样调用该函数:
// get the profile_id from session
int profileId = Convert.ToInt32(Session["cod"]);
// fetch associated plugin ids
int[] pluginIds = GetPluginIds(profileId).ToArray();
// store the resulting array into session
Session["pluginIds"] = pluginIds;
这是 Mick 的答案,但针对 Swift 4。(IndexPath 替换了 NSIndexPath,后者带有一个空 IndexPath,因为 nil 会使 Swift 崩溃。此外,您可以使用 ==
比较 IndexPath 的两个实例)
声明 ExpandedIndexPath 属性。
var expandedIndexPath = IndexPath()
可选的 viewDidLoad 部分。
expandedIndexPath = IndexPath(row: 1, section: 2)
然后是 didSelectRow 部分。
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.beginUpdates()
if indexPath == expandedIndexPath {
expandedIndexPath = IndexPath()
} else {
expandedIndexPath = indexPath
}
tableView.endUpdates()
}
然后是 heightForRow 部分。
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
if indexPath == expandedIndexPath {
return 100
}
return 44
}
将 border-left: 2px Solid grey
或 border-right: 2px Solid grey
应用于其中一列怎么样?
除了@schwiz 的回答之外,您还可以重新考虑您的设计。这里有必要使用2个activity吗?为什么?在这种情况下,使用 2 个活动有什么好处?不过,如果没有看到一些具体细节,我们确实无法回答。
对于索引集合,您可以执行以下操作:
for(int i = 0; i < col.Length;i++)
{
if (predicate(col[i]))
return true;
}
return false;
但对于非索引 IEnumerable
,这是不可能的,因为它不提供索引器。这将是框架中的实现(通过反射):
public static bool Any<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
{
if (source == null)
{
throw Error.ArgumentNull("source");
}
if (predicate == null)
{
throw Error.ArgumentNull("predicate");
}
foreach (TSource local in source)
{
if (predicate.Invoke(local))
{
return true;
}
}
return false;
}
当它迭代 IEnumerable
的所有元素时,不会获得任何性能提升。然而,这个方向上的任何“优化”都会属于过早优化,如果存在性能问题,它更有可能在你的算法中比在这个函数中得到解决。
我遇到了与此类似的问题,尽管它似乎没有根据他的代码解释OP的情况;我只是想把它放在这里以防其他人遇到这个问题。
我将标题视图保留在实例变量中。在我的 viewDidLoad 中,我检查该变量是否为零,如果是,则创建视图,保留实例变量并将其设置为它,并将 tableHeaderView 设置为它。问题是这个条件只会成立一次,因为我的实例变量在我第一次创建它之后就永远不会为零;但是,当出现内存警告时,表视图的 tableHeaderView
属性将设置为 nil,因此不会再有标题视图,即使我仍然有在实例变量中查看。
解决方案是更改检查以查看表视图的 tableHeaderView
属性是否为零(然后每次设置为 nil 时重新创建标头视图),或者(因为在此如果我仍然将视图保留在实例变量中),则将赋值移至 if 块之外的 tableHeaderView
,因此每次运行 viewDidLoad
时,我们都会确保将标题视图重新分配给 tableHeaderView
,以防它设置为 nil。
Thread 类有一个 Abort 方法允许您终止线程。也就是说,终止线程的正确方法是使用一些共享资源来指示线程是否应该继续或停止。例如,在线程内部,您可以实现一种机制,在循环中测试此静态变量的值并跳出循环。在主线程上,当您决定终止后台线程时,只需设置静态变量的值,线程就会自行停止。
这是一个示例:
private static volatile bool _shouldTerminate = false;
在线程内部:
while (!_shouldTerminate)
{
// .. do something useful
}
当您决定从另一个线程停止该线程时:
_shouldTerminate = true;
您必须启用http扩展:
http://www.php.net/manual/en/http.setup.php" php.net/manual/en/http.setup.php
或者你可以尝试新的 HTTP_Request2:
sudo pear install --alldeps HTTP_Request2-alpha
然后:
$req = new HTTP_Request2('your.url');
$req->setMethod('POST');
$req->setHeader("content-type", $mimeType);
$req->setBody('');
$response = $req->send();
在我看来,您描述的问题的唯一架构模式是: 抽象
确保坚持使用不同供应商提供的资源,例如存储、队列等。为每个供应商创建抽象层。
希望这有帮助。考虑到云提供商的服务存在差异,我认为这不是一个超级简单的任务
In my opinion, the only architectural pattern to the problem you describe is: abstraction
Make sure to stick to using resources that are offered across various vendors,like storage, queue, etc. Create abstraction layers for each of them.
Hope this helps. I don't think its a super simple task to do, given the variability of the services across cloud providers
最小化云锁定风险的架构策略?