无名晓's Space活出花样,记录精彩

Time
Comments评论

众所周知,在Linux系统中遍历查找文件可以使用 find 指令。我们这里来一点高级的干货 (bushi):

find ./ -type f -print0 -exec | xargs -0 grep "hello world"

上述指令将会在当前文件夹中遍历查找所有文件,并找出哪一个文件中包含 hello world 字样。


参数讲解

./ 当前文件夹路径
-type f 指定的格式,ffile, 亦仅查找文件
-print0 将文件名中存在的空格转换为 NULL 字符,而不是换行符 (可能解释的不正确)
-exec 后面跟着可执行的命令
| UNIX的管道操作
xargs 分割命令
-0 配合 -print0 使用,识别 NULL 字符进行分割,而不是换行符 (可能解释的不正确)
grep 查找出现的字符串
"(String)" 查找指定的字符串

以上。

Time
Comments评论

近日由于频繁需要在开发项目中使用 CMD, 所以每次都需要 Win + R 键呼出 CMD,非常的麻烦。
于是乎搜索了一番,发现可以使用注册表解决这个问题,我们一起来看具体步骤:

  1. 使用 Win + R 键呼出运行, 然后输入 regedit 打开注册表。
  2. 找到 HKEY_CLASSES_ROOT 栏, 然后找到你想添加的位置。例如文件夹目录下, 则为 Directory
  3. 找到项 shelll 并右键, 然后点击 新建 (N)->项 (K), 输入自定义的名称。
  4. 可以在右侧的 (默认) 里输入右键时需要显示的提示, 这里例如 在此处打开CMD命令提示符
  5. 若需要特定的图标显示, 可以在当前项创建 字符串值 并命名为 Icon, 然后输入Icon的资源地址 (这里例如 C:\Windows\System32\cmd.exe)。
  6. 在当前项中 创建子项, 并命名为 command
  7. command 中的 (默认) 位置输入单击此选项时需要执行的命令, 这里为 cmd.exe
  8. 打开一个文件夹, 对准TA点右键试一下吧~

PS: 若需要在空白处显示, 对应的项不是 Directory, 而是其目录下的 Background

各项菜单的注册表路径

桌面空白处:计算机HKEY_CLASSES_ROOTDesktopBackgroundShell
文件:计算机HKEY_CLASSES_ROOT*shell
文件夹:计算机HKEY_CLASSES_ROOTDirectoryshell
文件和文件夹:计算机HKEY_CLASSES_ROOTAllFilesystemObjectsshell
文件夹空白处:计算机HKEY_CLASSES_ROOTDirectoryBackgroundshell


本文参考 这里 学习到的, 欢迎阅读原文。

Time
Comments评论

最近刚开始学习Vue,由于没有使用vue-cli脚手架,并且本地的编译环境并非Nginx设定的web目录,所以尝试使用 npm run build 之后每次都需要手动将编译好的 dist 目录移动到Nginx设定的web目录下,非常的麻烦。(也许有更方便的办法,但耐于我是初学者一时半会不知道如何正确配置,所以使用了如下的脚本)

然后我便有了之前的以下代码:

@echo off
chcp 65001
set ORIGINAL_PATH=%cd%
cd ../..
set VUE_BUILT_PATH=%cd%
set TARGET_DEL_DIR=vuetest
set CURRENT_PATH=%VUE_BUILT_PATH%\%TARGET_DEL_DIR%
set input=N

if exist %CURRENT_PATH% (
    set /p input="本文件夹下的所有文件将被删除!此操作不可逆![Y/N]  "

    if %input% == Y (
        echo 路径: %CURRENT_PATH%  [已确认删除!]
        rd/s/q %CURRENT_PATH%
    ) else (
        echo 已取消.
    )
)

cd %ORIGINAL_PATH%
pause

结果后来经过非常之久的脚本执行,发现 set 的值 input 始终无法将参数传递到 if 语句里面,百度了半天也不知道是什么原因。

后来我突然意识到,会不会跟JavaScript一样变量都有作用域?然后我又尝试将 set input=N 移动到了 if 语句里面,结果还是不行。后来我干脆直接删除了 if 语句的判断,发现可以了。

直到那时候我才意识到可能是CMD的 "BUG" 或者 "特性" 导致的吧。

于是改进了代码之后有了如下的最终脚本:

@echo off
chcp 65001
TITLE 编译文件移动脚本
set ORIGINAL_PATH=%cd%
cd ../..
set VUE_BUILT_PATH=%cd%
set TARGET_DEL_DIR=vuetest
set CURRENT_PATH=%VUE_BUILT_PATH%\%TARGET_DEL_DIR%
set input=N

if not exist %CURRENT_PATH% (
    echo 正在移动编译文件夹...
    move %ORIGINAL_PATH%\dist %CURRENT_PATH%
    pause
    exit
)

set /p input="本文件夹下的所有文件将被删除!此操作不可逆![Y/N]  "

if %input% == Y (
    echo 路径: %CURRENT_PATH%  [已确认删除!]
    rd/s/q %CURRENT_PATH%
) else (
    echo 已取消.
)

cd %ORIGINAL_PATH%
pause

真的不知道是什么奇葩的问题导致的,好在最后解决了:)

Time
Comments评论

二者如何取舍
非线程安全是指多线程操作同一个对象可能会出现问题。而线程安全则是多线程操作同一个对象不会有问题。
线程安全必须要使用很多synchronized关键字来同步控制,所以必然会导致性能的降低。
所以在使用的时候,如果是多个线程操作同一个对象,那么使用线程安全的Vector;否则,就使用效率更高的ArrayList。

非线程安全!=不安全
有人在使用过程中有一个不正确的观点:我的程序是多线程的,不能使用ArrayList要使用Vector,这样才安全。
非线程安全并不是多线程环境下就不能使用。注意我上面有说到:多线程操作同一个对象。注意是同一个对象。比如最上面那个模拟,就是在主线程中new的一个ArrayList然后多个线程操作同一个ArrayList对象。
如果是每个线程中new一个ArrayList,而这个ArrayList只在这一个线程中使用,那么肯定是没问题的。

线程安全的实现
线程安全是通过线程同步控制来实现的,也就是synchronized关键字。


原文地址链接:https://www.jianshu.com/p/d46f06dd884d

Time
Comments评论

众所周知, 在现在前后端分离的大趋势下, 数据交互也变得复杂了起来。今天在写项目的时候用到了一个前端组件, 而且这个组件的数据传递方式就是传统的fetch。

问题所在: 前端的fetch请求写法正确, 但是PHP后端死活接收不到参数。在这耽搁了大概十多分钟后我受不了了,百度了半天才发现一个有用的方法,我这里转载进来,记录一下这个坑。
原文地址:点我访问


前端Fetch写法:

let data = {
    method: 'POST',
    headers: {
        'Content-Type': 'application/x-www-form-urlencoded'
    },
    body : 'id=value'
};

后端PHP写法:

<?php
$requestData = $_POST['id'];
var_dump($requestData); // string(5) "value";
?>

以上为总结, 防止下次踩坑!