我正试图在Cocoa中掌握绘制(相当基本的)形状.我理解如何创建具有直边的路径(呃!),但是当涉及到做曲线时,我无法理解哪些输入会产生什么形状的曲线.具体而言,我不知道该怎么controlPoint1:和controlPoint2:参数的方法影响的形状.
我正在尝试近似Google Chrome中标签的形状:

我正在使用的代码是:
-(void)drawRect:(NSRect)dirtyRect {
NSSize size = [self bounds].size;
CGFloat height = size.height;
CGFloat width = size.width;
NSBezierPath *path = [NSBezierPath bezierPath];
[path setLineWidth:1];
[path moveToPoint:NSMakePoint(0, 0)];
[path curveToPoint:NSMakePoint(width * 0.1, height)
controlPoint1:NSMakePoint(width * 0.05, height)
controlPoint2:NSMakePoint(width * 0.03, height * 0.05)];
[path lineToPoint:NSMakePoint(width * 0.9, height)];
[path curveToPoint:NSMakePoint(width, 0)
controlPoint1:NSMakePoint(width * 0.95, height)
controlPoint2:NSMakePoint(width * 0.97, height * 0.05)];
[path closePath];
[[NSColor colorWithCalibratedWhite:0.98 alpha:1] set];
[path fill];
[[NSColor colorWithCalibratedWhite:0.6 alpha:1] set];
[path stroke]; …Run Code Online (Sandbox Code Playgroud) 基本问题,但我希望这个结构占用13个字节的空间(1表示char,12表示3个无符号整数).相反,sizeof(ESPR_REL_HEADER)给我16个字节.
typedef struct {
unsigned char version;
unsigned int root_node_num;
unsigned int node_size;
unsigned int node_count;
} ESPR_REL_HEADER;
Run Code Online (Sandbox Code Playgroud)
我要做的是用一些值初始化这个结构并将它包含的数据(原始字节)写入文件的开头,这样当我打开这个文件后我才能重构这个结构并获得一些元数据有关文件其余部分包含内容的数据.
我正在初始化结构并将其写入文件,如下所示:
int esprime_write_btree_header(FILE * fp, unsigned int node_size) {
ESPR_REL_HEADER header = {
.version = 1,
.root_node_num = 0,
.node_size = node_size,
.node_count = 1
};
return fwrite(&header, sizeof(ESPR_REL_HEADER), 1, fp);
}
Run Code Online (Sandbox Code Playgroud)
node_size我实验时目前在哪里4.
在我向其编写结构后,该文件包含以下数据:
-bash$ hexdump test.dat
0000000 01 bf f9 8b 00 00 00 00 04 00 00 00 01 00 00 00
0000010
Run Code Online (Sandbox Code Playgroud)
我希望它实际上包含:
-bash$ hexdump …Run Code Online (Sandbox Code Playgroud) 如果我在(终端)Emacs工作并且在屏幕上使用水平分割有2个缓冲区:
+--------------------------+
| |
| |
| |
| |
+--------------------------+
| |
| |
| |
| |
+--------------------------+
Run Code Online (Sandbox Code Playgroud)
然后我决定打开粘液repl,Emacs将垂直拆分其中一个水平窗格:
+--------------------------+
| |
| |
| |
| |
+-------------+------------+
| | |
| | slime |
| | |
| | |
+-------------+------------+
Run Code Online (Sandbox Code Playgroud)
但我想要的是使用窗户的整个高度在右边粘液:
+-------------+------------+
| | |
| | |
| | |
| | |
+-------------+ slime |
| | |
| | |
| | |
| | |
+-------------+------------+
Run Code Online (Sandbox Code Playgroud)
有没有简单的方法可以从Emacs自动给我的安排,到我想要的那个(例如旋转安排),还是我自己明确关闭并重新拆分窗户?
编辑| 如果我现在正在使用完全水平分割,或者如果它实际上是不可能的话,我是否可以直接打开完全垂直分割也很好奇.
我试图NSPopUpButton像NSButton只有一个图像集的标准渲染,但没有运气.
很像Mail.app中的"+"按钮:

我假设他们这样做了NSPopUpButton.我尝试过的显而易见的事情是:
NSMenuItem *imageItem = [[[NSMenuItem alloc] init] autorelease];
[imageItem setImage:[NSImage imageNamed:NSImageNameAddTemplate]];
[[popUpButton cell] setUsesItemFromMenu:NO];
[[popUpButton cell] setMenuItem:imageItem];
[[popUpButton cell] setImagePosition:NSImageOnly];
Run Code Online (Sandbox Code Playgroud)
然而,这并没有显示图像,而只是显示了一对箭头(我怀疑它们被绘制在图像所在的位置).打电话[popUpButton setImage:...]也没有.
是否有记录的方法来执行此操作,还是归结为某些自定义子类?
给定MailerRails 3中的一个实例,有没有办法覆盖delivery_method它?
我想通过高优先级传输推送某些电子邮件,而其他人使用更繁忙,低优先级的方法.
我可以在运行时调整配置并再次更改它,但这充满了潜在的副作用.
这是一个微观问题,但每次我创建一个gem并需要加载一个子目录下的所有文件以达到某种反射目的(或者只是一个快速和脏的预加载),我问自己"肯定在那里必须是一个更清洁的方式?",参考这种常见的模式:
Dir[File.join(File.dirname(__FILE__), "subdirectory/**/*.rb")].each { |f| require f }
Run Code Online (Sandbox Code Playgroud)
需要调用File.dirname上__FILE__,使得它不必要的冗长.你不能在gem中使用相对路径,因为你不知道从哪里加载.
虽然它通常违背我们的设计原则,但我们需要让控制器#create在GET请求上执行它的操作(它是涉及外部服务的一系列重定向的工作流的一部分).有人知道这样做的目的是什么吗?我真的不想走出Rails路由提供的资源丰富的路由框架.我们不需要#index通常会响应该GET请求的操作.
我发现(令人惊讶的是)这是有效的,但我不知道它是否有意,或者我们是否正在利用Rails中的一个错误并在以后发生破坏的风险:
resources :agreements, :except => [:index, :create] do
get :create, :on => :collection
end
Run Code Online (Sandbox Code Playgroud)
如果get :create是get :something,我们就不得不像一个路线
Helper: something_agreement_path
Request: GET /agreements/:agreement_id/something
Action: agreements#something
Run Code Online (Sandbox Code Playgroud)
但是Rails实际上产生了我们想要的东西:
Helper: agreements_path
Request: GET /agreements
Action: agreements#create
Run Code Online (Sandbox Code Playgroud)
错误或功能?
char * s = "2f0a3f"当从十六进制表示中解码时,我需要将(可能非常长的)字符串转换为它所代表的实际字节.目前我正在这样做,但感觉笨拙和错误.
size_t hexlength = strlen(s);
size_t binlength = hexlength / 2;
unsigned char * buffer = malloc(binlength);
long i = 0;
char a, b;
for (; i < hexlength; i += 2) {
a = s[i + 0]; b = s[i + 1];
buffer[i / 2] =
((a < '9' ? a - '0' : a - 'a' + 10) << 4) + (b < '9' ? b - '0' : b - 'a' + …Run Code Online (Sandbox Code Playgroud) Emacs有一个名为open-rectangle的函数,它允许你选择一个矩形区域(即Vim的可视块模式),然后点击一个组合键用空格填充该矩形,将任何现有内容推出到右边:

在处理垂直对齐的文本列时,这非常有用.我觉得我也应该能够在Vim中轻松地使用visual block +搜索和替换.但我似乎无法弄清楚为什么我的搜索和替换没有绑定到我的矩形当我尝试它.
:'<,'>s/\^/ /
Run Code Online (Sandbox Code Playgroud)
这实际上缩进了整行,而不是打开这个选定的区域.我试过更换:
:'<,'>s/\v(.*)/ \1/
Run Code Online (Sandbox Code Playgroud)
但这有同样的效果.如何让我的模式理解我只想用空格+所选区域替换所选块中的每一行?简单的替换,如只是改变字母工作,但使用^或.*不按我期望的方式工作.
我知道有能力点击"I"并将一些空格插入正常模式,但是当你在很多行中进行大量缩进时,这很难判断.
我有一个AST,以通常的方式表示(抽象类型的节点树).我有几个遍历这个树的用例(一个优化器,它返回另一个AST; IR代码生成,它返回一个llvm::Value*;和一个调试分析器,它只是输出到stdout并且什么都不返回).
访问者感觉这是正确的方式,但访问者的每个用例的不同返回类型使得很难看到如何为此实现接口.我考虑过这个:
class Visitor;
class ASTNode {
public:
virtual void accept(Visitor *visitor);
};
class Visitor {
public:
virtual void visit(CallNode *node) = 0;
virtual void visit(BinExprNode *node) = 0;
// etc
};
Run Code Online (Sandbox Code Playgroud)
由于缺少返回值,每个Visitor实现都需要构建内部状态并提供result()具有合适返回类型的方法.然而,这很复杂,因为每次调用都visit()需要围绕被访问的表达式的某些上下文(即单独调用,或者它是否被用作二进制表达式的一部分?).对于像二进制表达式代码生成这样的事情来说,通过访问操作数的节点来收集返回值(我可以使用内部临时状态变量或其他类似的东西,但它感觉过度设计)并且难以推理(国家不断变化).
class OptimizingVisitor : public Visitor {
ASTNode *m_result;
public:
ASTNode *result() {
return m_result;
}
void setResult(ASTNode *node) {
m_result = node;
}
void visit(CallNode *node) {
node->left()->accept(this);
ASTNode *optimizedL = result();
node->right()->accept(this);
ASTNode *optimizedR = result();
setResult(new CallNode(optimizedL, optimizedR)); …Run Code Online (Sandbox Code Playgroud)