小编Bru*_*ado的帖子

彩色shell脚本输出库

我正在寻找一种确定的方法来构建生成彩色输出的shell脚本.

不幸的是,我很难找到合适的lib或良好的技术来做到这一点.我发现了很多像有用的,但简单的例子,这个.到目前为止,我发现的最全面的指南就是这个.

在我开始编写自己的库之前,我想检查一下是否有人编写过它

如果您的解决方案不符合下面的观察,那不是问题.我还想阅读它,以便它可以帮助我决定编写我自己的解决方案

我的主要关注/意见:

  • 需要安全.想要避免垃圾输出,因为并非所有终端或寻呼机/编辑器(如less,more,vim等)都支持彩色输出或更多样式输出(粗体,眨眼,斜体等)
  • 需要简单易读.直接使用ANSI转义码非常糟糕:echo -e '\033[32mthis is ugly and \033[1;32mvery green\033[0m'
  • 需要让我访问前景和背景文本的整个调色板和样式.我发现的大多数示例仅使用前景文本的基本颜色.
  • 最好只使用简单的命令,如bash或内置命令的简单shell和/或可在大多数操作系统上找到的常用命令.例如,我可以使用colorize但我需要ruby(这有点好)并且安装了colorize gem(不行)
  • Tput似乎是一个很好的选择,因为它可以很好地操纵shell光标,但它更简单/更不灵活

编辑

在对终端控制和输出格式进行一些研究之后,我正在写这个试图完成这个的要点.到目前为止,它做得很好

linux macos shell colors

40
推荐指数
6
解决办法
4万
查看次数

每次加密使用随机盐时,我可以避免每次加密/解密调用的密码重新初始化吗?

编辑

实际上重新初始化密码并不是那么慢.由于迭代计数,创建密钥本身很慢.

此外,迭代计数被忽略,并且从未在加密本身中使用,仅用于密钥生成.根据所选择的算法,JCE api有点误导

原帖

由于Java中的加密技术非常...加密,我正在努力做一些优化.在功能方面,这个类非常有效,我希望它可以作为AES加密使用的一个例子

使用BouncyCastle的AES实现加密和解密数据时出现性能问题(我不比较,这是我测试过的唯一一个实现).实际上这个问题对于我决定使用的任何密码都是通用的.

主要问题是:我可以避免两个密码完全重新初始化每个加密/解密调用吗?它们太贵了

为简单起见,请记住以下代码已删除其异常处理,并进行了大量简化以保持对问题的关注.同步块用于保证线程安全

顺便说一下,欢迎对代码的任何部分进行反馈

谢谢

import java.nio.charset.Charset;
import java.security.SecureRandom;
import java.security.Security;
import java.util.Arrays;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec;

import org.bouncycastle.jce.provider.BouncyCastleProvider;

public class AES {

    private static final int ITERATIONS = 120000;
    private static final int SALT_SIZE_IN_BYTES = 8;
    private static final String algorithm = "PBEWithSHA256And128BitAES-CBC-BC";
    private static final byte[] KEY_SALT = "a fixed key salt".getBytes(Charset.forName("UTF-8"));

    private Cipher encryptCipher;
    private Cipher decryptCipher;
    private SecretKey key;
    private RandomGenerator randomGenerator = new …
Run Code Online (Sandbox Code Playgroud)

java performance cryptography aes salt

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

Python和非常小的小数

关于在macosx上运行的Python 2.7.6的有趣事实:

你有一个非常小的数字,如:

0.000000000000000000001
Run Code Online (Sandbox Code Playgroud)

您可以将其表示为:

>>> 0.1 / (10 ** 20)
1.0000000000000001e-21
Run Code Online (Sandbox Code Playgroud)

但是你可以在最后看到浮动指向错误.我们真正拥有的是这样的:

0.0000000000000000000010000000000000001
Run Code Online (Sandbox Code Playgroud)

所以我们得到了一个错误的数字,但没关系.问题如下:

正如所料:

>>> 0.1 / (10 ** 20) == 0
False
Run Code Online (Sandbox Code Playgroud)

但是,等等,这是什么?

>>> 0.1 / (10 ** 20) + 1 == 1
True

>>> repr(0.1 / (10 ** 20) + 1)
'1.0'
Run Code Online (Sandbox Code Playgroud)

看起来python正在使用另一种数据类型来表示我的数字,因为这只在使用第16个十进制数字时发生,依此类推.另外为什么python决定自动将我的号码转换0为添加?我不应该使用十进制小部分和浮点错误处理十进制数吗?

我知道这个问题可能落在浮点错误的保护伞中,并且解决方案通常是不信任这种计算的浮点数,但我想了解更多关于发生在幕后的事情.

python floating-point

5
推荐指数
2
解决办法
1566
查看次数

使用BouncyCastle的AES 256(而不是128)

我跟着这篇文章的大部分内容,目的是在我的软件中实现aes 256加密,它运行得很好

这里的关键点是上面链接中描述的整个实现使用AESEngine类.查看类代码和javadoc引用,AESEngine是128位而不是256位分组密码

搜索代码和文档我找不到192或256位实现.他们在哪儿?

为了完整性,这是我的实际加密类的核心:

    private void init(String passphrase) {
        try {
            String algorithm = "PBEWithSHA256And256BitAES-CBC-BC"; 

            encryptCipher = createCipher();
            decryptCipher = createCipher();    

            randomGenerator = new RandomGenerator();

            PBEKeySpec keySpec = new PBEKeySpec(passphrase.toCharArray(), KEY_SALT, ITERATIONS);    

            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(algorithm);
            key = keyFactory.generateSecret(keySpec);    

        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException("NoSuchAlgorithmException occured while trying to generate the crypto key. This error should never occur, check the application code", e);
        } catch (InvalidKeySpecException e) {
            throw new RuntimeException("InvalidKeySpecException …
Run Code Online (Sandbox Code Playgroud)

java cryptography bouncycastle aes

4
推荐指数
1
解决办法
8504
查看次数

从集合中获取一个或者无

在你有一个N大小的集合但想要使用单一项目(概念上是一个0 or 1大小的集合)的问题是很常见的.

我可以写传统的if:

def singular_item(collection):
    if collection:
        return collection[0]
    else:
        return None
Run Code Online (Sandbox Code Playgroud)

并简化为:

def singular_item(collection):
    return collection[0] if collection else None
Run Code Online (Sandbox Code Playgroud)

但它不适用于iterables,只有定义大小的集合.例如,传递生成器将失败:

singular_item((_ for _ in range(10)))
=> TypeError: 'generator' object has no attribute '__getitem__'
Run Code Online (Sandbox Code Playgroud)

所以我通常做的是:

def singular_item(collection):
    return next((_ for _ in collection), None) 

singular_item([1]) -> 1
singular_item([1,2,3]) -> 1
singular_item([]) -> None
Run Code Online (Sandbox Code Playgroud)

这适用于任何集合(或可迭代),但感觉有点笨拙创建一个生成器只获取一个项目.此外,可读性在某种程度上被杀死了:另外两个例子更清楚地表明代码正在尝试做什么.

所以我的问题是:

  • 是否有更好的方法可以使用内置函数?
  • 在创建一个只生成一个项目的生成器时,您是否浪费资源?

python generator

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