我很熟悉在Go中,接口定义功能而不是数据.您将一组方法放入接口,但是您无法指定实现该接口的任何字段.
例如:
// Interface
type Giver interface {
Give() int64
}
// One implementation
type FiveGiver struct {}
func (fg *FiveGiver) Give() int64 {
return 5
}
// Another implementation
type VarGiver struct {
number int64
}
func (vg *VarGiver) Give() int64 {
return vg.number
}
Run Code Online (Sandbox Code Playgroud)
现在我们可以使用接口及其实现:
// A function that uses the interface
func GetSomething(aGiver Giver) {
fmt.Println("The Giver gives: ", aGiver.Give())
}
// Bring it all together
func main() {
fg := &FiveGiver{}
vg := &VarGiver{3}
GetSomething(fg)
GetSomething(vg) …
Run Code Online (Sandbox Code Playgroud) 苹果公司的iOS应用程序内购买系统过去曾被欺骗过应用程序的人免费攻击.他们已经改进了所涉及的系统,试图限制这种事情.
我已经阅读了Apple提供的StoreKit参考文档,我对工作流程以及需要进行的检查有了一般概念,等等.但是,可能存在我不知道的安全问题.
任何人都可以提供针对应用程序内购买机制可能尝试的盗窃攻击的完整列表,开发人员如何错误地允许这些攻击,以及防止这些攻击的最佳做法是什么?
我在一家出版社工作,我正在设置我们的一台"帮派"印刷机,换句话说,同时印刷多个工作.鉴于不同的打印作业可以有不同的数量,并且一次可能需要考虑1到20个作业,问题在于确定将哪些作业组合在一起以最大限度地减少浪费(来自过度打印的废物在较小的情况下 - 给定集合中的数量作业,即).
鉴于以下稳定数据:
因此,问题是:如何根据以下限定条件确定哪些作业集合在一起,在任何给定数量的作业中:1)三个相似的数量或2)两个数量,其中一个大约是另一个的两倍,与目标是在各组中最小化总分组浪费.
(编辑)数量信息:外语的典型作业数量可以是150到350,英文打印时可以是500到1000.此数据可用于为算法设置某些方案.例如,假设您有5个工作:
1000,500,500,450,250
通过观察,我可以看到几个答案.显然(1000/500/500)效率不高,因为你的分组浪费为1000.(500/500/450)更好,因为你会浪费50,但随后你跑(1000)和( 250)单独.但是你也可以在两条车道(500/250)上运行(1000/500),在两条车道上运行500,然后单独运行(450).
在车道最小化与浪费的权衡方面,我们可以说任何超过200的分组浪费都是过度的.
(结束编辑)
......不用说,这是一个很大的问题.(为了我.)
我是一名技术熟练的程序员,但我对算法并不熟悉,而且我对该领域的数学还没有充分研究.我是I/P写的一种蛮力程序,它只是尝试所有选项,忽略了任何似乎有过多分组浪费的选项树.但是,我不禁希望有一种更简单,更有效的方法.
我已经查看了各种网站,试图找到更多关于算法的信息,并且一直在通过符号系统,但它进展缓慢.不幸的是,维基百科关于这个主题的文章非常依赖于交叉,很难找到"in".我唯一能够真正找到的东西似乎是我需要的粗略算法类型的定义:"独家距离聚类",一维地说.
我确实看过这个网站上普遍提到的算法,Bin Packing one,但是我无法确切地看到它如何解决我的问题.
我对OAuth相关主题有一些困惑,我希望有人可以帮助我清理它们:)在任何我不合适的地方随意纠正我.
所以,假设我的网络公司在不同的域上运行了许多网站:
假设这些是带有一些社交性的电子商务网站,因此存在具有各种存储数据点的用户帐户.所以我的公司(我们称之为ACME电子商务)已经为不同的客户创建并管理所有这些网站.
现在,我们决定为所有电子商务网站建立一个中央帐户是很方便的; 其好处包括通过允许客户使用现有帐户登录任何站点来减少摩擦,以及集中信息以提高营销准确性并减少与客户的过多沟通.输入OAuth!
据我所知,OAuth是一种身份验证和授权标准.身份验证是"登录",授权是"你可以进行这些API调用",简而言之,对吗?让我们从身份验证开始:
认证!
这里的想法是你去socks.com,当你通常登录时,有一个"使用ACME ID登录"按钮,以及"登录到Socks.com".你到处都可以看到:登录Facebook,登录谷歌等等.所以我们有"使用ACME ID登录".
当用户点击"使用ACME ID登录"时,socks.com直接从ACME的OAuth服务器请求并接收未经授权的请求令牌,然后将用户的浏览器重定向到ACME的OAuth站点.在那里,用户插入其ACME ID帐户的用户名和密码,ACME OAuth授权请求令牌并通过重定向URL将其返回到socks.com.
所以在这一点上,Socks.com知道用户登录了ACME ID.如果Socks.com想要查询来自ACME资源API的信息,它会将其授权请求令牌交换为访问令牌然后进行调用,但我们只是在谈论身份验证,并且用户已经过身份验证.对?
假设我有这个权利,即使我有点错误,Socks.com在这一点上做了什么?因为在这种情况下,它有自己的用户数据库,它是否将中央OAuth身份验证与其自己的数据库同步?Socks.com现在知道joe@blow.com已经登录,它会在数据库中查询该电子邮件地址,以获取他的购买历史记录和最后购物车内容?它为joe维护一个会话,如果该会话到期,那么他必须再次使用他的ACME ID进行身份验证?
我知道Spotify会做这样的事情; 他们"登录Facebook".如果我选择此选项,则会在Facebook域上弹出一个带有登录窗口的小浏览器窗口.我登录,弹出窗口关闭,Spotify显示我已登录...我的Facebook电子邮件地址,以及一个由8个左右的随机数组成的帐户名.这似乎是Spotify看到我通过Facebook的OAuth服务器进行身份验证,然后在他们自己的系统中为我生成一个新帐户.随后的Facebook-OAuth身份验证/登录会让我每次都进入同一个Spotify帐户.
什么,如果有的话,我在这里有错吗?
因此,通过使用ACME ID的中央身份验证设置,我们可以允许用户使用相同的ID登录socks.com,boats.com和cakes.com,我们将在每个位置礼貌地为他们创建帐户.这是减少摩擦力的行动,但地址和信用卡数据仍然是分开存储的,因此我们没有获得集中化的好处.但是,这超出了身份验证,我们正在授权!
授权!
因此,我们进行了一些帐户数据重组,并将所有客户的地址和信用卡数据移动到其中央ACME ID帐户中.我们建立了一个API来请求和修改此信息.现在,当cakes.com使用ACME ID进行身份验证并获取其授权请求令牌时,该令牌将交换到ACME OAuth服务器以获取API的访问令牌.(这是存储在服务器端,存储在用户的会话数据中.)
现在,当用户进入结帐的cakes.com,我们可以进行API调用ACME资源服务器,传递ACME ID的用户名,来获取客户的地址的数组,然后用它来填充网页.嘿,这是很好的服务!Cakes.com 由OAuth程序授权执行此类操作.
我有一切吗?
边缘案例!
上面带有中央OAuth服务器的电子商务网站的实现非常明确,但是有些"边缘情况"可能会以不同的方式实现:
1)没有分布式用户帐户
如果我想强制socks.com,boats.com和cakes.com的所有用户仅使用ACME ID登录,该怎么办?也许在每个站点都有一个"用户帐户",包括购买数据和地址数据等,带有相关的用户名,但没有密码,也没有实际的登录机制.一旦ACME ID被验证,会话就被标记为"登录".
或者,也许所有信息(如购买历史记录,地址和CC#)都会汇总到ACME资源端点中,而不会在卫星电子商务网站上存储有关客户的信息?那么,卫星基本上是奴隶,使用ACME OAuth作为远程数据库.然后,由于购买历史是集中的,您或多或少需要集中您的项目,然后它可能会归结为"什么不集中?" 和"为什么有单独的网站" - 除了他们需要分开.
那么,这有什么好处吗?
2)用于移动应用程序的UI-Less Web API
假设您正在构建iOS/Android等.应用程序称为Horses,您需要在云端存储有关您的用户的一些信息,特别是他们真正喜欢的马匹.尽管有人认为任何人都可能因为马匹与袜子,船只和蛋糕无关,但您希望允许您的用户使用他们的ACME ID以及您发明的马匹ID进行登录.
现在,您基本上采取了在www.horses.com域上拥有卫星用户帐户系统的路线,并可选择允许此人使用ACME ID登录并慷慨地创建一个horses.com帐户,以便他们存储他们的horses.com相关数据.很标准; 一个区别是你实际上并不需要建立一个网站,它只是一个API.
但是,如果您只想允许ACME ID作为登录,没有horses.com帐户,该怎么办?因此,当您进入登录状态时,您的horses.com API将启动与ACME OAuth的OAuth舞蹈,进行身份验证,然后向应用程序提供访问令牌(针对horses.com).该访问令牌将用于根据用户在应用中喜欢的马匹向horses.com发出读写API调用.我在这里是正确的吗?
3)访问多个站点的Central Auth
我们采取这种设置:ACME ID包含用户名,密码,电子邮件,信用卡和账单信息.Socks.com,boats.com和cakes.com有购买历史记录,以及关于这些人在这些网站上做过的与袜子相关,船相关或蛋糕相关(分别)的事情的社交信息.
现在我们想要创建一个使用ACME ID进行身份验证的移动应用程序,并且可以从ACME ID的Resource API(用于CC和计费数据)以及使用ACME ID进行身份验证的每个站点提取信息.通过这种方式,我们可以很好地融合袜子,船只和蛋糕,然后我们可以为客户收取费用!(你明白了.)
那么......怎么可能呢?
谢谢阅读!
我在 Go 代码中使用shopspring/decimal而不是 float64 来防止数学错误。在编写我的 protobuf 文件以通过 gRPC 传输这些值时,我可以使用:
double
转换为 float64string
这肯定会以自己的方式精确,但让我觉得笨拙传统智慧教会我在货币应用程序中避开浮动,但我可能过于小心,因为它是序列化的一个点。
找到后一个 数 的 文章,描述使用苹果的斯威夫特编写脚本的目的,我想试试我的手吧.我想做一些在文件系统上执行操作的简单脚本:移动东西,重命名事物等等.
我首选的文本编辑器是Sublime,虽然有一个Swift语法包,但显然你没有得到任何类型的自动完成.或者,我可以使用Xcode,历史上曾经有过很棒的自动完成功能.从命令行,我可以键入open myFile.swift
以弹出该文件的Xcode编辑器窗口.
但是,当我这样做时,没有自动完成功能.我担心我需要设置一个带有构建目标等的整个Xcode项目才能获得自动完成...这是这种情况吗?
有没有人知道在Xcode(或Sublime)中获取Swift自动完成的简单方法用于编写脚本?谢谢!
我正在尝试在我的OSX笔记本电脑上启动并运行开发环境,在Eclipse中创建JSP,使用Tomcat服务器运行以及连接到Oracle数据库.
Eclipse和Tomcat一起玩得很好,我可以制作JSP等等.现在最困难的部分是在Mountain Lion上启动并运行Oracle数据库,并让Eclipse连接到它.
经过广泛的谷歌搜索,我发现了一些资源:
http://dimitrisli.wordpress.com/2012/08/08/how-to-install-oracle-database-on-mac-os-any-version/ http://barrymcgillin.blogspot.com/2011/12/使用Oracle的开发者-天virtualbox.html
(甚至https://docs.google.com/document/d/1Th5MSIhS13YIJYCD8W1GLnOQEfrfov-92-He1cluTec/pub)
按照这些(相当全面的)指南,我从Oracle下载了最新的虚拟机,网址为:http: //www.oracle.com/technetwork/database/enterprise-edition/databaseappdev-vm-161299.html
注意:上述所有三个教程都使用较旧版本的VM,它具有Oracle DB 10或11,但现在可用的是12c.新版本也有不同版本的Oracle Linux,可能还有其他一些差异.各种用户名和密码似乎略有不同.
我安装了VirtualBox,加载到VM中,将其联机.我的网络设置只配置了NAT适配器,适配器类型为"PCnet-FAST III",端口转发从127.0.0.1到10.0.4.15,端口1521到1521和2222到22.
现在,如果我在主机上打开终端,我可以通过以下方式SSH到我的VM : ssh -p 2222 oracle@localhost
. 我在虚拟机中获得终端,它给了我在VirtualBox中首次启动虚拟机时获得的欢迎消息.此外,我可以ping localhost或127.0.0.1,它响应变量但短滞后.
基于此,我只能假设我的VM正在工作,并且我的端口转发(在我链接到的所有3个教程中都已布局)处于良好状态.
现在,我希望将Eclipse连接到VM中的Oracle数据库.如果您查看第一个教程,dimitrisli会使用指向VM的数据源设置IntelliJ.我想在Eclipse中做同样的事情.
我是Eclipse的新手,所以我四处寻找如何做到这一点,我想出了:
1)制作新的数据库驱动程序.
我在这里从Oracle下载了JDBC for Oracle Database 12c,JDK 7 .我把.jar文件粘贴在我的Documents文件夹中(如果这是错误的).在Eclipse中,我根据其他Oracle驱动程序模板创建了一个新的数据库驱动程序,并更改了设置.在"驱动程序文件"下,我指向我的ojdbc7.jar
文件,在"属性"下,我有以下内容 - 如果这是错误,请告诉我:
Catalog: USER
Connection URL: jdbc:oracle:thin:@localhost:1521:orcl
Database Name: pdb1
Driver Class: oracle.jdbc.OracleDriver
Password:
User ID:
Run Code Online (Sandbox Code Playgroud)
我尝试使用Oracle驱动程序模板中的内容,只是调整以匹配我的确切场景(基于演练中所说的内容以及我可以在现代版本的虚拟机中进行思考).
2)建立新的数据库连接.
当我去创建一个新的数据库连接时,我转到驱动程序属性区域,然后我可以选择我的自定义驱动程序.还有一个属性字段,我将其输入以下内容:(当我创建驱动程序本身时,其中一些似乎覆盖或复制了我输入的内容?)
SID: orcl
Host: 127.0.0.1
Port Number: 1521
User Name: hr // Gotten …
Run Code Online (Sandbox Code Playgroud) 我正在使用UIAutomation在iOS模拟器中进行一些自动化测试.
在Xcode 6中,iOS模拟器的键盘行为更改为类似于真实设备,现在有一个菜单项可以将Mac键盘连接/断开连接到模拟器:硬件>键盘>连接硬件键盘.
我不介意这一点,但连接Mac键盘时会发生的情况是模拟器将不再显示软件键盘.当您使用UIAutomation运行测试脚本UIATarget.localTarget().frontMostApp().keyboard().typeString("myString");
时,即使您已将文本字段设置为第一个响应者,因此类似的调用也会失败,因为键盘不会出现.
这很烦人,因为如果我在模拟器中进行任何手动测试,我将需要记住在运行任何UIAutomation测试之前禁用硬件键盘,否则它们都会失败.
从UIAutomation JS脚本中有没有办法检查硬件键盘设置并禁用它们?或者,在执行UIAutomation脚本之前,从命令行执行此操作的任何方法?
我正在解析对git repo进行的一系列更改,其中一些更改涉及子模块.我曾经git blame
在子模块中找到相关的提交,但是有一种简单的方法来定位我的主仓库中的哪个提交改变了该提交的子模块指针?
提示简单图:
1 <- 2 <- 3 <- 4 <- 5 (Main chain of commits)
| | | | |
1 1 1 2 2 (Submodule)
Run Code Online (Sandbox Code Playgroud)
我找到了子模块#1变为子模块#2的提交(比如它是9d95812e ...).如何确定main-commit#4是否首次使用新子模块提交的事实?
我正在运行 Android Studio 3.6.3 并且我正在尝试使用作为 Android Jetpack 一部分的新导航资源。我做了Navigation Codelab来学习如何使用这个功能。
在我的项目中,我添加了一个导航资源,Android Studio 会自动添加此功能的依赖项。然后我创建了一个带有 a 的 Activity 布局NavHostFragment
。
但是,当我转到我的导航资源时,HOST
左侧的部分显示No NavHostFragments found
.
我试过同步 Gradle、清理和重建,但无济于事。
有趣的是,当我预览我的主要 Activity 布局时,“主目的地”片段会通过 偷看NavHostFragment
,所以看起来关系是在一个方向上建立的,而不是另一个方向。
如何让我的NavHostFragment
出现在导航资源中?
这是我的布局 XML:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context="my.app.MyActivity"
>
<data>
<variable
name="viewModel"
type="my.app.MyViewModel" />
</data>
<androidx.coordinatorlayout.widget.CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<fragment
android:id="@+id/my_nav_host"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:defaultNavHost="true"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:navGraph="@navigation/central_navigation" />
</LinearLayout>
</androidx.core.widget.NestedScrollView>
<com.google.android.material.appbar.AppBarLayout …
Run Code Online (Sandbox Code Playgroud)