当我发现vi-like bash的编辑模式时,我很着迷.人们可以通过发出set -o vi命令轻松切换它.但有没有办法切换类似vim的模式?
我的意思是当你处于类似vi的模式时,你可以v在一个功能齐全的vi编辑器窗口中按键并编辑你的命令,但我想知道如何强制bash启动vim编辑器而不是vi因为perks vim提供给我们(视觉选择) ,附加命令等)?
鉴于这两个协议及其扩展:
protocol FirstDelegate {
func someFunc()
}
protocol SecondDelegate {
func someFunc()
}
extension FirstDelegate {
func someFunc() {
print("First delegate")
}
}
extension SecondDelegate {
func someFunc() {
print("Second delegate")
}
}
Run Code Online (Sandbox Code Playgroud)
并试图符合他们两个:
class SomeClass: FirstDelegate, SecondDelegate {}
Run Code Online (Sandbox Code Playgroud)
我收到编译时错误:
类型'SomeClass'不符合协议'FirstDelegate'
交换FirstDelegate和SecondDelegate:
class SomeClass: SecondDelegate, FirstDelegate {}
Run Code Online (Sandbox Code Playgroud)
产生逆转:
类型'SomeClass'不符合协议'SecondDelegate'
删除其中一个扩展可以解决问题.同上提供someFunc()内部实现SomeClass.
这个协议扩展功能对我来说相当新.苹果官方的"Swift编程指南(Prerelease)"中有关它的信息目前还很少.
我在这里违反了一些协议扩展规则吗?
在学习Linux内核模块时,我可以看到(目前为止有两个来源)编写Makefile的两种方法.第一个是这样的:
ifneq ($(KERNELRELEASE),)
obj-m := module.o
else
default:
$(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules
endif
Run Code Online (Sandbox Code Playgroud)
后者不那么复杂:
obj-m := module.o
all:
$(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules
Run Code Online (Sandbox Code Playgroud)
makefile编译导致成功编译模块.我的学习附有LDD3书籍,到目前为止我读到的是下一本书:
此makefile在典型构建中读取两次.从命令行调用makefile时,它注意到尚未设置KERNELRELEASE变量.它通过利用已安装的modules目录中的符号链接构建指向内核构建树的事实来定位内核源目录.如果您实际上没有运行正在构建的内核,则可以在命令行上提供KERNELDIR =选项,设置KERNELDIR环境变量,或者重写在makefile中设置KERNELDIR的行.一旦找到内核源代码树,makefile将调用default:target,它运行第二个make命令(在makefile中参数化为$(MAKE))以调用内核构建系统,如前所述.在第二次阅读时,makefile设置obj-m,
如果makefile被读取两次,那么第二种方法应该导致递归,不是吗?
我正在测试Swift 2.0 beta,并发现了奇怪的行为.这是一个示例代码:
private func someFunc(inout someString: String) {
print("Inside \'someFunc()\'")
print(someString)
someString = "Some another string"
}
private var someAncillaryInt = 42
print(someAncillaryInt)
private var someString: String {
get {
print("Inside \'getter\'")
return "Some string"
}
set {
print("Inside \'setter\'")
someAncillaryInt = 24
}
}
someFunc(&someString)
print(someAncillaryInt)
Run Code Online (Sandbox Code Playgroud)
输出:
42
在'getter'里面
在'someFunc()'里面
一些字符串
内部'二传手'
24
我不明白为什么不吸气,同时打印称为someString内部someFunc()以及为什么它时,someFunc()得到了与传递someString.
可以假设我还没有理解inout参数的复杂性,并且在传递之后因为inout参数计算属性停止,em,"计算",但为什么在我们设置另一个值时调用'setter' someString?
谢谢!
UPD:我在下面添加了答案.
更新2015年11月18日:Apple已经更新了他们的手册,详细解释了如何使用params.
以下代码:
protocol SomeProtocol {
typealias SomeType = Int // used typealias-assignment
func someFunc(someVar: SomeType)
}
class SomeClass: SomeProtocol {
func someFunc(someVar: SomeType) {
print(someVar)
}
}
Run Code Online (Sandbox Code Playgroud)
给出编译时错误:
使用未声明类型'SomeType'
例如typealias SomeType = Double,添加SomeClass可以解决错误.
问题是,虽然协议关联类型声明的typealias-assignment部分(可选btw)有什么意义?
现在,我正在阅读Robert Love的书“ Linux Kernel Development 3d Edition”。他在那里写了有关thread_info结构的信息,该结构包含指向task_struct结构的指针,并且据我所知,它位于进程的内核堆栈的底部或顶部(取决于体系结构)。直到最近我才对Linux内核API感到陌生,并且不了解current()方法的存在。本书摘录涉及current()方法的实际工作方式:
在x86上,电流是通过屏蔽堆栈指针的13个最低有效位以获得thread_info结构来计算的,这是通过current_thread_info()函数完成的,该程序集如下所示:movl $ -8192,%eax和l% esp,%eax假定堆栈大小为8KB。启用4KB堆栈时,将使用4096代替8192。
我的问题是:
对于那些将阅读本主题的人来说,我所说的问题可能会导致结论,即作者对内存分配和管理过程的理解不正确。好的,由于我可以将分配给堆栈的内存表示为充满位(或字节)的功能区,因此这可能是正确的。所有这些字节都可以由表示为十进制值的特定内存地址访问。堆栈的原点是最低的内存地址,堆栈的fin是最高的内存地址值。但是,我们如何才能仅通过屏蔽位于ARBITRARY所在的堆栈指针的13个最低有效位来获得指向位于堆栈末尾的thread_info结构的指针(如果我理解正确,我们就屏蔽掉了堆栈指针ADDRESS表示为十进制值)。
当我通过发出make cscopeI get database file以及具有相对路径的文件列表来生成Linux内核cscope数据库时.这对我来说是一个问题,因为稍后当我在vim编辑器中从任何目录附加外部内核的数据库但内核我可以轻松搜索特定符号但是我无法打开包含该符号的文件.
我写了下一个bash脚本
#!/bin/bash
SNAME="$0"
SNAME=${SNAME##*/}
function usage()
{
echo Generate Linux kernel cscope database
echo "Usage: $SNAME [PATH]"
echo -n "You must provide this script with an ABSOLUTE path of your "
echo "kernel's root directory"
}
if [[ -z "$1" ]]; then
usage
exit -1
fi
KDIR="$1"
echo -n "Collecting a list of files... "
if find "$KDIR" -path "${KDIR}/arch/*" ! -path "${KDIR}/arch/x86*" -prune -o \
-path "${KDIR}/include/asm-*" \ …Run Code Online (Sandbox Code Playgroud) 不会为其他编译器说话,但在GNU GCC编译器中,您可以使用以下语法静态初始化数组:
struct some_struct {
unsigned *some_array;
} some_var = {
.some_array = (unsigned[]) { 1u, 2u, 3u, 4u, 5u, },
};
Run Code Online (Sandbox Code Playgroud)
首先,我遇到了这种语法,寻找我所关心的问题的答案,并得出了这个答案.但我还没有找到任何GNU参考的链接,它涵盖了这种语法.
如果有人与我分享这个语法的链接,我将非常感激.谢谢!
以下代码:
protocol SomeProtocol {}
class SomeClass: SomeProtocol {}
private func doSomethingWith(inout someVar: SomeProtocol) {}
private var someGlobalVar = SomeClass() // inferring SomeClass's type
doSomethingWith(&someGlobalVar)
Run Code Online (Sandbox Code Playgroud)
产生以下错误:
无法使用类型'(inout SomeClass)的参数列表调用'doSomethingWith'
更改倒数第二行以private var someGlobalVar: SomeProtocol = SomeClass()解决错误.
SUBJ.
假设我有一个初始数为2个实例的自动缩放组.假设此自动缩放组的实例类型相同(因此内存和CPU的数量相同).在这种情况下,最大实例数不相关.此外,我有一个ELB,负载平衡此组的实例之间的负载.除此之外,此自动缩放组的实例是我之前创建的一些新ECS集群的成员.在这种情况下,只有一个任务定义,只有一个容器可以使用512Mb的RAM.此容器还需要从主机80到容器5000的端口映射.
假设我已经启动了这个自动缩放组,现在可以使用2个初始实例了.然后我试图根据上述任务定义产生4个任务的服务.想象一下,如果这两个实例被两个放置(如果主机每个都有1Gb的RAM),那么这个任务就完全适合这两个实例.
这种设置是否合法?如果是这样,那么端口映射会发生什么,因为在一台主机上会有2个相同的容器?