小编Mat*_* Mc的帖子

转到界面字段

我很熟悉在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)

struct interface go

90
推荐指数
2
解决办法
4万
查看次数

针对iOS应用内购买的攻击保护

苹果公司的iOS应用程序内购买系统过去曾被欺骗过应用程序的人免费攻击.他们已经改进了所涉及的系统,试图限制这种事情.

我已经阅读了Apple提供的StoreKit参考文档,我对工作流程以及需要进行的检查有了一般概念,等等.但是,可能存在我不知道的安全问题.

任何人都可以提供针对应用程序内购买机制可能尝试的盗窃攻击的完整列表,开发人员如何错误地允许这些攻击,以及防止这些攻击的最佳做法是什么?

security itunes-store in-app-purchase ios

30
推荐指数
1
解决办法
1万
查看次数

最小浪费打印作业分组算法?

我在一家出版社工作,我正在设置我们的一台"帮派"印刷机,换句话说,同时印刷多个工作.鉴于不同的打印作业可以有不同的数量,并且一次可能需要考虑1到20个作业,问题在于确定将哪些作业组合在一起以最大限度地减少浪费(来自过度打印的废物在较小的情况下 - 给定集合中的数量作业,即).

鉴于以下稳定数据:

  1. 所有工作在空间大小方面都是相同的 - 纸上的位置没有考虑在内.
  2. 有三个"通道",意味着可以同时打印三个作业.
  3. 理想情况下,每条车道都有一项工作.部分问题是最小化每个作业运行的通道数.
  4. 如有必要,可以在两个车道上运行一个工作,在第三个车道上运行第二个工作.
  5. 来自给定工作组的"分组"浪费(假设它们的数量是x,y和z)将是最高数字减去两个较低数字.因此,如果x是较高的数字,则分组浪费将是(x-y)+(x-z).否则说明,通过打印作业Y和Z(超过其数量)产生的废物达到X的数量.分组废物将是给定集合的限定符,这意味着它不能超过一定数量或作业将只需单独打印.

因此,问题是:如何根据以下限定条件确定哪些作业集合在一起,在任何给定数量的作业中: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,但是我无法确切地看到它如何解决我的问题.

printing algorithm grouping

10
推荐指数
1
解决办法
969
查看次数

中央与分布式身份验证和授权

我对OAuth相关主题有一些困惑,我希望有人可以帮助我清理它们:)在任何我不合适的地方随意纠正我.

所以,假设我的网络公司在不同的域上运行了许多网站:

  • www.socks.com
  • www.boats.com
  • www.cakes.com

假设这些是带有一些社交性的电子商务网站,因此存在具有各种存储数据点的用户帐户.所以我的公司(我们称之为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进行身份验证的每个站点提取信息.通过这种方式,我们可以很好地融合袜子,船只和蛋糕,然后我们可以为客户收取费用!(你明白了.)

那么......怎么可能呢?

  • 从ACME OAuth服务器接收适用于卫星网站API的访问令牌?
  • 在每个卫星站点单独进行身份验证,使应用程序只能获取与船只和蛋糕相关的内容,因为用户不想在线拍摄他的袜子的照片?
  • 还有其他方法吗?

谢谢阅读!

authentication api oauth user-accounts web

10
推荐指数
1
解决办法
2268
查看次数

Go Protobuf 精度小数

如果我想传输任意精度的十进制值,在我的 protobuf 定义文件中使用的正确标量类型是什么?

我在 Go 代码中使用shopspring/decimal而不是 float64 来防止数学错误。在编写我的 protobuf 文件以通过 gRPC 传输这些值时,我可以使用:

传统智慧教会我在货币应用程序中避开浮动,但我可能过于小心,因为它是序列化的一个点。

go protocol-buffers arbitrary-precision

10
推荐指数
1
解决办法
1769
查看次数

Swift脚本自动完成

找到后一个 文章,描述使用苹果的斯威夫特编写脚本的目的,我想试试我的手吧.我想做一些在文件系统上执行操作的简单脚本:移动东西,重命名事物等等.

我首选的文本编辑器是Sublime,虽然有一个Swift语法包,但显然你没有得到任何类型的自动完成.或者,我可以使用Xcode,历史上曾经有过很棒的自动完成功能.从命令行,我可以键入open myFile.swift以弹出该文件的Xcode编辑器窗口.

但是,当我这样做时,没有自动完成功能.我担心我需要设置一个带有构建目标等的整个Xcode项目才能获得自动完成...这是这种情况吗?

有没有人知道在Xcode(或Sublime)中获取Swift自动完成的简单方法用于编写脚本?谢谢!

scripting xcode autocomplete swift

8
推荐指数
1
解决办法
1124
查看次数

Mac OSX上的VM中的Oracle Database 12c

我正在尝试在我的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)

java eclipse oracle macos jdbc

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

使用UIAutomation禁用iOS模拟器的硬件键盘

我正在使用UIAutomation在iOS模拟器中进行一些自动化测试.

在Xcode 6中,iOS模拟器的键盘行为更改为类似于真实设备,现在有一个菜单项可以将Mac键盘连接/断开连接到模拟器:硬件>键盘>连接硬件键盘.

我不介意这一点,但连接Mac键盘时会发生的情况是模拟器将不再显示软件键盘.当您使用UIAutomation运行测试脚本UIATarget.localTarget().frontMostApp().keyboard().typeString("myString");时,即使您已将文本字段设置为第一个响应者,因此类似的调用也会失败,因为键盘不会出现.

这很烦人,因为如果我在模拟器中进行任何手动测试,我将需要记住在运行任何UIAutomation测试之前禁用硬件键盘,否则它们都会失败.

从UIAutomation JS脚本中有没有办法检查硬件键盘设置并禁用它们?或者,在执行UIAutomation脚本之前,从命令行执行此操作的任何方法?

keyboard simulator ios ios-ui-automation xcode6

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

什么是Git命令来确定哪个提交更改了子模块指针?

我正在解析对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是否首次使用新子模块提交的事实?

git commit git-submodules

6
推荐指数
2
解决办法
764
查看次数

导航资源显示未找到 NavHostFragments

我正在运行 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)

android android-studio android-jetpack-navigation

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