我在备份shell脚本的部分中有以下命令:
tar -cjf site1.bz2 /var/www/site1/
Run Code Online (Sandbox Code Playgroud)
当我列出档案的内容时,我得到:
tar -tf site1.bz2
var/www/site1/style.css
var/www/site1/index.html
var/www/site1/page2.html
var/www/site1/page3.html
var/www/site1/images/img1.png
var/www/site1/images/img2.png
var/www/site1/subdir/index.html
Run Code Online (Sandbox Code Playgroud)
但我想/var/www/site1从归档中的目录和文件名中删除该部分,以简化提取并避免无用的常量目录结构.永远都不知道,如果我在一个没有存储网络数据的地方提取备份网站/var/www.
对于上面的例子,我想:
tar -tf site1.bz2
style.css
index.html
page2.html
page3.html
images/img1.png
images/img2.png
subdir/index.html
Run Code Online (Sandbox Code Playgroud)
因此,当我提取时,文件在当前目录中被提取,之后我不需要移动提取的文件,因此保留了子目录结构.
关于tar和备份在stackoverflow网上和网上其他地方已经有很多问题,但是大多数都要求放弃整个子目录结构(展平),或者只是添加或删除名称中的首字母/(我不是知道它在提取时的确切变化),但不多了.
在阅读了这里和那里发现的一些解决方案以及手册之后,我尝试了:
tar -cjf site1.bz2 -C . /var/www/site1/
tar -cjf site1.bz2 -C / /var/www/site1/
tar -cjf site1.bz2 -C /var/www/site1/ /var/www/site1/
tar -cjf site1.bz2 --strip-components=3 /var/www/site1/
Run Code Online (Sandbox Code Playgroud)
但它们都没有按我想要的方式工作.有些人什么都不做,有些人不再存档子目录.
它位于由Cron启动的备份shell脚本中,所以我不太清楚,哪个用户运行它,路径和当前目录是什么,因此总是需要编写绝对路径,并且不希望更改当前目录避免在脚本中进一步破坏(因为它不仅备份网站,还备份数据库,然后将所有内容发送到FTP等)
怎么做到这一点?
我只是误解了选项-C的工作原理吗?
我是一个业余程序员,我因为一个大问题而变得绝望和疯狂:我的大多数程序都被avast反病毒阻止,而有些则没有,我不明白为什么.我试图调查越多,我就越不明白问题可能是什么.
我正在请求您的帮助以找到解决方案,以便我的程序不再被阻止,或者,默认情况下,至少有一些强有力的线索可以解释为什么会出现这种情况.网上已经有很多关于这方面的话题.然而,他们中的大多数只给出了肤浅的答案:他们只是解释了反病毒如何与签名和检测启发式一起使用,或者说你只需要在白名单中添加有问题的应用程序而不询问任何其他问题.虽然这当然是正确的,但我的感觉并不是可接受的答案,因为我仍然留下了自己的程序,拒绝工作而没有任何具体的想法开始调查.
首先,阻止我的程序的唯一反病毒是avast 7.x. 没有其他防病毒程序看到任何不方便运行我的软件.其次,我没有自己动手; 它安装在朋友的机器上.我有Windows 7,他有Windows XP.我完全确定问题是avast:暂时禁用它,或者如果程序被添加到其白名单中,一切都按预期工作得很好.
三个不同的程序遇到麻烦:
第一个是开源的,如果需要,我可以提供可执行文件和源代码的链接.另外两个是封闭源但可以免费使用,我只能给出当前版本的可执行文件的链接.这三个程序之间唯一明显的共同点是我作为开发人员,我编译它们的Windows 7机器,编译器系列是MinGW/GCC,它们都是没有任何框架的win32 GUI应用程序(没有MFC,没有WPF,没有QT,WXWidgets或其他;只是纯win32/C GUI应用程序)
这是我的观察,虽然到目前为止:
问题是由avast 7.x自动沙箱引起的.当尝试启动avast不喜欢的程序时会发生以下情况:
这是无法接受的.我的程序的新手用户,特别是游戏,不知道防病毒是如何工作的; 不知道怎么把它放到白名单中,为什么它会解锁呢?不知道如何改变他们的反病毒设置; 如果他们看到弹出窗口,不会理解它,最终会害怕或失望,因为他们不知道为什么不能玩; 如果他们没有看到弹出窗口,我不能指望他们用半冷冻电脑等待5分钟.每次他们想玩.
从那里,我做了以下扣除:
除此之外,我还认为我将程序作为便携式zip文件分发的事实可能是avast阻止的原因,相反,程序安装在程序文件中的事实可能是信任它的理由更多.所以我提供了一个简单的体验:我为我的游戏的beta 2.0.0编译了一个新的inno-setup 5安装程序,以及一个用于我的文本编辑器1.3版本的安装程序,并发现安装程序本身已被阻止!
我和我的朋友做了另一次经历,在那里我试图找到程序崩溃的地方,基于使用MessageBeep(MessageBox也被阻止了!).我没有发现任何问题.在登录对话框中第一次调用SetDlgItemText时会阻止游戏,但是如果我删除所有SetDlgItemText,它将被进一步阻止.在文本编辑器中,它在填充菜单栏时被阻止...
我的结论是,在我的游戏的新版本中,在我的文本编辑器的旧版本和我的音频播放器中,avast不喜欢这样的东西.最新版本的文本编辑器中缺少的东西.会是什么呢 ?你有什么线索吗?你是否只知道如何继续找到它是什么让我可以帮忙解决它?是否只有一种方法来分析这样的问题,还是由avast搞砸的洞世界?
请注意,我是一个人,而不是一个公司,所有这些程序都是免费使用的,我没有支付任何IDE来开发它们,而且当用户使用它们时我没有付费,所以我假设一个证书可能根本不负担得起.而且,我不知道它是否是一个真正的解决方案,如何签署一个用GCC编译的应用程序,我真的不想切换到像MSVC这样的"usineàgaz".如果有任何其他解决方案,即使是非常肮脏的解决方案,我宁愿强烈忘记该选项.
谢谢你的阅读.
我是在线游戏的主要开发者.玩家使用通过TCP/IP(TCP,而不是UDP)连接到游戏服务器的特定客户端软件
目前,服务器的体系结构是一个经典的多线程服务器,每个连接有一个线程.但在高峰时段,当经常有300或400个连接人员时,服务器变得越来越滞后.
我想知道,如果切换到java.nio.*异步I/O模型,几乎没有线程管理许多连接,如果性能会更好.在Web上查找涵盖此类服务器体系结构基础知识的示例代码非常简单.然而,经过数小时的谷歌搜索,我没有找到一些更高级的问题的答案:
1 - 协议是基于文本的,而不是基于二进制的.客户端和服务器交换以UTF-8编码的文本行.单行文本表示单个命令,每行由\n或\ r \n正确终止.对于经典的多线程服务器,我有这样的代码:
public Connection (Socket sock) {
this.in = new BufferedReader( new InputStreamReader( sock.getInputStream(), "UTF-8" ));
this.out = new BufferedWriter( new OutputStreamWriter(sock.getOutputStream(), "UTF-8"));
new Thread(this) .start();
}
Run Code Online (Sandbox Code Playgroud)
然后在运行中,使用readLine逐行读取数据.
在doc中,我发现了一个可以通过SocketChannel创建Reader的实用类Channels.但据说如果Channel处于非阻塞模式,生产的Reader将无法工作,这与非阻塞模式必须使用我愿意使用的高性能通道选择API的事实相矛盾.所以,我怀疑它不适合我想做的事情.因此,第一个问题如下:如果我不能使用它,如何有效和妥善地处理断行并使用缓冲区和通道将本机java字符串转换为nio API中的UTF-8编码数据?我是否必须手动使用get/put或者在包装的字节数组中?如何从ByteBuffer转到UTF-8编码的字符串?我承认不太了解如何在charset包中使用类以及它如何工作.
2 - 在异步/非阻塞I/O领域,连续读/写的处理本质上是一个接一个地顺序执行的呢?例如,登录过程,通常是基于质询 - 响应:服务器发送问题(特定计算),客户端发送响应,然后服务器检查客户端给出的响应.答案是,我认为,肯定不是要为整个登录过程发送一个单独的任务发送到工作线程,因为它很长,有很长时间冻结工作线程的风险(想象一下这个场景:10个池线程,10名玩家尝试同时连接;与已经在线的玩家相关的任务被延迟,直到一个线程再次准备好).
3 - 如果两个不同的线程同时在同一个Channel上调用Channel.write(ByteBuffer)会发生什么?客户端可能会收到混合线吗?例如,如果一个线程发送"aaaaa"而另一个发送"bbbbb",客户端是否可以收到"aaabbbbbaa",或者我确保每个都是按编组顺序发送的?我可以在调用返回后立即修改使用的缓冲区吗?或者有不同的问题,我是否需要额外的同步来避免这种情况?如果我需要另外同步,如何知道何时释放锁定等等,写入完成后?我担心答案并不像在选择器中注册OP_WRITE那么简单.通过尝试,我注意到我始终为所有客户端提供了写就绪事件,提前退出Selector.select,因为每个客户端只有3或4条消息要发送第二个,而选择循环每秒执行数百次.因此,潜在的,积极的等待,非常糟糕.
4 - 多个线程可以同时在同一个选择器上调用Selector.select而不会出现任何并发问题,例如错过事件,安排两次等等吗?
5 - 事实上,nio和它说的一样好吗?保持经典的多线程模型是否有趣,但不是每个连接创建一个线程,使用更少的线程并在连接上循环以使用InputStream.isAvailable查找数据可用性?这个想法是愚蠢和/或低效的吗?
这可能是一个愚蠢的问题,但我很惊讶地发现不允许在外部类中使用私有内部类作为泛型类型。
如果我将内部类设置为受保护,则它可以正常编译。
另外,我必须精确Outer.Inner而不是仅仅Inner,否则找不到内部类。这看起来也有点奇怪。
为什么 Inner 不能私有?为什么它被允许受到保护?
public class Outer extends AbstractSet<Outer.Inner> {
private static class Inner {
// ...
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
错误是:
Outer.java:3: error: Inner has private access in Outer
public class Outer extends AbstractSet<Outer.Inner> {
^
1 error
Run Code Online (Sandbox Code Playgroud)
我正在使用 Java SE 17,但我认为这并不重要。
新的 Java 17 类型模式匹配开关在幕后如何工作?由于该功能相当新,因此这个问题不讨论它。
提醒:要使此代码在 Java 17 下运行,您需要启用预览功能
public static void test (Object o) {
System.out.println(switch(o){
case Number n -> "number " + n;
case Enum e -> "enum " + e;
case String s -> "string " + s;
default -> "other " + o;
});
}
Run Code Online (Sandbox Code Playgroud)
上面代码的反汇编版本使用javap -c:
0: getstatic #7 // Field java/lang/System.out:Ljava/io/PrintStream;
3: aload_0
4: dup
5: invokestatic #13 // Method java/util/Objects.requireNonNull:(Ljava/lang/Object;)Ljava/lang/Object;
8: pop
9: astore_1
10: iconst_0
11: istore_2
12: aload_1 …Run Code Online (Sandbox Code Playgroud) 我正在网络上运行一个小游戏。为了使其能够以最佳方式通过屏幕阅读器访问,传入的消息(可以是关于游戏内操作或用户文本聊天的消息)必须在到达后立即自动阅读。
消息的读取必须快速,但也必须可靠。消息必须按顺序阅读,不得过早中断或完全跳过。否则,玩家可能会错过重要的事件或信息。有时,消息以相当高的频率和/或突发到达。无论如何,它们都必须按顺序、不间断地阅读。
由于消息到达太快,用户可能无法跟上。在这种情况下,他/她通常会按闭嘴键,通常是 Ctrl 键。这通常会立即停止讲话并丢弃所有排队的消息。屏幕阅读器本身不应在没有用户干预的情况下确定是否可以安全地删除消息。某些屏幕阅读器提供第二个选项来跳过当前消息并直接转到下一条消息,例如使用 NVDA 进行 Shift。所有屏幕阅读器用户都熟知这些快捷方式。
不幸的是,所有这些都只是理论,在实践中,我很难找到一种在任何地方都有效的方法。
最有问题的情况是 Mac 上的 VoiceOver,它似乎总是在新消息到达时立即中断当前正在朗读的消息(就好像该区域是自信的而不是礼貌的,这是不希望的),或者决定跳过消息随机。
我目前有 7 个演示页面,我在其中尝试使用礼貌 ARIA 实时区域的不同方式,这已经由我和我的小团队使用尽可能多的浏览器、设备和屏幕阅读器组合进行了测试。下面您将看到我迄今为止的发现。
你能推荐一些在任何地方都适用的东西吗?特别是,您能否为 Mac 上的 VoiceOver(这似乎是最有问题的)找到一个可行的解决方案?
当然,如果没有通用的解决方案,总是可以进行用户代理检测,但最好避免它。
提醒一下,这是一个游戏,所以要求很高:消息必须按顺序读取,不能中断(除非用户需要),不能跳过,即使消息快速到达。由于我们不希望受到任何打扰,因此自信而不是礼貌并不是解决方案。
以下是迄今为止尝试过的不同技术:
以下是当前结果:
| 组合/页面 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
|---|---|---|---|---|---|---|---|---|
| 镀铬+下巴 | 好的 | 重复 | 好的 | 重复 | 跳过 | 没有读过 | 紊乱 | 好的 |
| 火狐+大白鲨 | 好的 | 好的 | 好的 | 好的 | 好的 | 好的 | 好的 | 好的 |
| 边缘+钳口 | 好的 | 重复 | 好的 | 重复 | 跳过 | 没有读过 | 紊乱 | 好的 |
| 铬+英伟达 | 好的 | 没有读过 | 好的 | 没有读过 … |
我在WebRTC中相当新.我正试图在两个对等体之间建立一个简单的数据通道,没有音频和视频; 只是文字数据.最后,它将是一个游戏,2-7个同伴将连接到将成为游戏大师的同伴.
经过几个小时的谷歌搜索和阅读html5rocks,MDN和其他堆栈帖子,我尝试了很多东西,但我仍然无法使其工作.
当我在两个不同的Firefox选项卡上打开页面时,一切正常.我可以看到其中一个标签发送"Hello,world!" 另一个发送"它有效!".DataChannel已经建立,两个选项卡都会获得各自的对等方消息.
但是,在Chrome上运行时,它无效.在我的一个测试中,DataChannel在我能够发送任何内容之前神秘地关闭,而在另一个测试中,似乎根本没有调用RTCPeerConnection.ondatachannel事件(更多详细信息).如果我试图让Firefox使用Chrome的顺序沟通,无论我获得关于setRemoteDescription的失败不同的神秘的错误.
当然,在这些情况下,我都没有在Web/JavaScript控制台中收到任何错误消息; 这本来太容易了.
我的问题不在于信令过程,至少我不这么认为.普通的WebSocket用于与非常简单的Node.js服务器通信.我宁愿避免使用像PeerJS这样的库.首先,因为我们通过手动更好地学习它,其次是因为我想使用信令Node.js服务器来做除信令之外的其他事情.这在Node端本身并不是问题,但它在浏览器端(因为我不会在100 + KB缩小/混淆的源代码的海洋中找到一点雨滴)
基本方案非常简单:页面上每15秒自动刷新一个当前连接的用户列表.通过单击用户名,您可以与他联系,发送"Hello,world!" 而他回答"它有效!" 同时; 那是吃的.一旦我能够建立基本通信,简单的聊天文本框当然是下一个逻辑步骤.
更具体地说,如果我是用户A并单击用户B,则应该发生以下情况:
当A侧的DataChannel打开时,他发送"It works!" 到B; 这可能以相反的顺序发生
我想我应该有最新的Firefox和Crhome:resp.45和49,在Windows 7 64位上.
以下是我的JavaScript代码; 然后输出对应于几个场景,最后一些我通过阅读其他帖子和教程到目前为止.
function log (s) {
$('#log')[0].insertAdjacentHTML('beforeEnd', s+'<br />');
}
function callUser (e) {
var uname = this.href.substring(1+this.href.indexOf('#'));
ws.send({ type: 'RTCCall', to: uname });
log('Calling ' + uname + '...');
e.preventDefault();
return false;
}
function updateUserList (o) {
var div = $('#userlist')[0];
div.innerHTML='';
div.append('p', o.userlist.length + ' connected users'); …Run Code Online (Sandbox Code Playgroud)