最近,在我最近部署到Heroku时,我收到警告,建议不要使用AssetSync.
remote: ###### WARNING:
remote: You are using the `asset_sync` gem.
remote: See https://devcenter.heroku.com/articles/please-do-not-use-asset-sync for more information.
Run Code Online (Sandbox Code Playgroud)
我们试图通过使用AssetSync解决的原始问题是我们的应用程序中的大型资产导致了巨大的段塞大小.在Heroku允许我们的300MB中,我们可能使用接近230MB - 尽管我们的git repo只有80MB左右.
我们通过使用AssetSync将所有已编译资产同步到通过Cloudfront提供的S3存储桶来解决此问题.在AssetSync运行之后,我们有一个钩子可以删除所有预编译资产以减少段塞大小.基本上,slug编译期间的工作流程如下所示:
链接的文章争论了一些关于它为什么不好以及使用什么的点.
使用资产同步可能会导致失败.调试很困难,不必要,并增加了额外的复杂性.不要使用它.相反,使用CDN.
[...]
您现在应该使用CDN.CDN在预编译后不会将资产复制到S3,而是从您的网站上抓取它们.以下是为什么更好的原因.
规范资产
[...]它允许您拥有存储信息的单一权威位置.如果您需要更改该信息,则只需在一个位置进行更改即可.[...]如果某人在资产同步后部署失败,会发生什么?如果有人修改了S3存储桶中的文件怎么办?现在你必须修复两个,而不是修复一个资产副本.
部署决定论
如果您使用heroku运行bash在dyno内部进行调试并运行rake资产:预编译这不仅仅是修改本地副本.它实际上也修改了S3上的副本.[...]如果网络出现故障,asset_sync的同步部分也会失败.如果您只编写文件的一部分,或者只有一半的资产被同步,该怎么办?这些事情发生了.
虽然我同意他们的观点,但问题仍然存在:当预编译资产存储在slug中时,部署Heroku应用程序的推荐方法是什么?
我现在已经在虚拟机中编译了8个多小时,现在还没有完成.
终端仍在打印东西,所以我知道它还在编译.
主机系统是一个2.10Ghz的Intel Core2Duo,带有4GB RAM,而guest虚拟机是一个PowerPC虚拟机(QEMU)上的Linux,内存为1GB.
我知道动态指令翻译可以减慢一些事情,但即便如此,Glibc不应该花费超过3个小时左右?
有什么不对或者我应该继续让它一夜之间做到这一点吗?
我最近开始进入低级别的东西,并研究引导加载程序和操作系统等...
据我了解,至少对于ARM处理器,外围设备由引导加载程序初始化,然后映射到物理内存空间.从这里开始,代码只需将值写入映射到外设寄存器的存储空间即可访问外设.稍后,如果芯片具有MMU,则可以将其用于进一步重新映射到虚拟存储器空间.我对吗?
我不明白的是(假设我上面说的是正确的):
好吧,我已经编写了一些代码来反转六角形字符作为我组成的有趣练习的一部分.
这就是我现在所拥有的:
#include <stdio.h>
int main() {
char a,b,c;
while (1) {
c = getchar();
if (!feof(stdin)) {
a = c % 16;
b = (c - a) / 16;
c = (a*16) + b;
putchar(c);
}else{break;}
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它适用于大多数值.例如,0xA0变为0x0A等...
但是,以"F"开头的值并不能很好地发挥作用.
0xF1变为0x10
0xFF变为0xF0
等...
有人能指出我正确的方向吗?
这个问题简短而甜蜜.
我知道指令之间可能会发生指令,但是在指令期间是否会发生中断?在将所有值加载到寄存器之前,是否可以中断加载多条指令?
mov r0, r1
< interrupt can happen here
ldm r0, {r1-r4} < can an interrupt happen **during** a load multiple instruction?
Run Code Online (Sandbox Code Playgroud) 我正在开发一个嵌入式平台,我正在努力研究如何动态链接共享库.我正在使用bFLT文件格式,我无法控制可执行文件和共享库的加载位置.
我的加载程序正确地将共享库和可执行文件加载到内存中,并在运行时修改可执行文件的GOT以链接到共享库.
我可以成功获取函数的地址,我知道在该位置反汇编代码是正确的.但是,如果我尝试调用该函数,整个事情就会崩溃.
事实证明,GCC在调用共享库函数时添加了"代码表单",并在调用函数时绕道而且实际上并未转移到函数的地址.代码表单分支的地址未正确重定位,因为它未显示在可执行二进制文件的重定位列表中.
单板的反汇编看起来像这样:
000008d0 <__library_call_veneer>:
8d0: e51ff004 ldr pc, [pc, #-4] ; 8d4 <__library_call_veneer+0x4>
8d4: 03000320 .word 0x03000320 ; This address isn't correctly relocated!
Run Code Online (Sandbox Code Playgroud)
如果我获取函数的地址并将其放入函数指针(因此,绕过'代码表单')并调用它,共享库就可以正常工作.
例如:
#define DIRECT_LIB_CALL(x, args...) do { \
typeof(x) * volatile tmp = x; \
tmp(#args); \
} while (0)
DIRECT_LIB_CALL(library_call); /* works */
library_call(); /* crashes */
Run Code Online (Sandbox Code Playgroud)
有没有办法要么告诉GCC不生成代码胶合代码并直接分支到位于GOT中的地址,或者以某种方式使代码胶合板分支的地址显示在重定位列表中以执行?
我有一个想要实现的 USB 协议,但我对实现它的最佳方法有点迷失。
USB 协议涉及来回交换数据和确认数据包,如下所示:
Device: data
Host: ACK
Host: reply
Device: ACK
Run Code Online (Sandbox Code Playgroud)
但有时,数据包可能会像这样异步进入:
Device: data #1
Device: data #2
Host: ACK #1
...
Run Code Online (Sandbox Code Playgroud)
我想要一个 API,它可以抽象出 USB 的所有细节,让程序只处理实际数据,而不必担心数据包标头或确认数据包或类似的事情。理想情况下,有一个write_to_device
函数会阻塞直到设备确认数据包,一个函数read_from_device
会阻塞直到收到数据包,还有一个is_data_available
函数会立即返回队列上是否有任何数据。
我正在考虑运行一个单独的线程来处理 USB 事件。该线程将处理所有数据封装和确认。
当数据包进入时,处理线程将发送一个 ACK 数据包,然后提取原始数据并将其写入管道。该read_from_device
函数(从主线程调用)将简单地从此管道中读取并自然阻塞,直到有数据为止。但是如果我使用这个方案,我将没有一个干净的方法来实现一个is_data_available
函数 - 没有办法在不读取数据的情况下检查管道中是否有数据。
像这样的东西:
[ Main thread ][ Processing thread ]
| Read from pipe || |
| || USB packet comes in |
| || Send ACK packet |
| || Extract data |
| || …
Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个Firefox扩展,它拦截某个HTTP请求并返回静态内容,而不会将请求发送到实际的服务器(类似于AdBlock).
我查阅了教程,并且我有一个基本的文件布局.我还得出结论,我需要使用nsITraceableChannel API并添加一个观察者来做我想做的事情,并且我有示例代码.
问题是,我在哪里实际放置此代码?我的扩展程序何时实际加载并执行?它是在后台持续和异步运行还是每页面视图加载?
文档似乎不是很清楚.这个扩展不需要GUI,所以我不需要布局XUL文件(或者我?).我尝试写一些XPCOM(我不认为我做对了)组件,注册它chrome.manifest
但它似乎没有运行.
任何人都可以确切地解释Firefox扩展如何工作以及我应该在哪里放置我的实际JavaScript代码来监控请求?或者我是否完全了解扩展是错误的?附加组件,扩展和插件之间有区别吗?
如果我调用va_arg
的次数少于在可变参数函数中传递的参数数量,那么它是否是未定义的行为?
例如:
#include <stdarg.h>
void foo(unsigned n, ...) {
va_list ap;
int bar = 0;
va_start(ap, n);
if (n) bar = va_arg(ap,int);
// Do something with bar
}
int main() {
foo(2, 3, 4);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
该程序会导致未定义的行为吗?
#include<stdio.h>
#include<stdlib.h>
char *str_cpy(char *, char *);
void main()
{
char *desti= (char *)calloc(sizeof(char),10);
char *m= (char *)calloc(sizeof(char),10);
m = str_cpy(desti,"dhawal");
printf("destination string is :%s\n",desti);
printf("%s\n",m);
}
char *str_cpy(char *a,char *b)
{
while(*b!='\0')
{
*a = *b;
a++;
b++;
}
*a = '\0';
return a;
}
Run Code Online (Sandbox Code Playgroud)
请解释为什么m
没有赋予desti
这里的价值?
它将字符串副本的结果赋值给第三个变量
我有这个功能:
myF :: String -> String
myF arg1 = "const" ++ arg1
Run Code Online (Sandbox Code Playgroud)
有没有办法简化它?我认为这可能与运营商"."有关.但我无法弄清楚如何在这里应用它.