vscode编辑器多行首尾插入光标技巧
选中的每行首部开始插入光标
用alt+shift+鼠标点击方式在不自动换换行情况下是可以的,但是被自动换行内容有可能选择了一行被自动换行成多行的行
选择多行后,先alt+shift+i可以实现每行尾部插入光标内容,反过来按Home可以回到多行的开始位置,如果有行被自动换行成多行的行,你就多按几次Home光标就能全部行回到正确的首行位置了。
vscode编辑器多行首尾插入光标技巧
选中的每行首部开始插入光标
用alt+shift+鼠标点击方式在不自动换换行情况下是可以的,但是被自动换行内容有可能选择了一行被自动换行成多行的行
选择多行后,先alt+shift+i可以实现每行尾部插入光标内容,反过来按Home可以回到多行的开始位置,如果有行被自动换行成多行的行,你就多按几次Home光标就能全部行回到正确的首行位置了。
今天为了个用户使用了Outlook 365邮箱需要发送邮箱,结果网上搜索如何开启smtp协议,结果不如人意,最后发现只要2行命令就搞定了,先登录,再开启即可,环境windows10。
#连接会话
Connect-ExchangeOnline -UserPrincipalName user@domain.com
# 启用单个用户的SMTP认证
Set-CASMailbox -Identity “user@domain.com” -SmtpClientAuthenticationDisabled $false
# 验证配置(输出应为 False)
Get-CASMailbox -Identity “user@domain.com” | Select SmtpClientAuthenticationDisabled
官方相关文档
https://learn.microsoft.com/zh-cn/exchange/clients-and-mobile-in-exchange-online/authenticated-client-smtp-submission
今天遇到个nuxt多语言包循环输出语言包里的分组内容,网查了半天没有合适的代码
自己研究后解决
cn.json
{ "test":{ "1":"a", "2":"b", "3":"c" } }
一般模板就是如下方式循环输出
<div v-for="(index, key) in 3" :key="key" > {{ key + 1 }} {{ t('test.'+index) }} </div>
但根据官方文档使用tm和rm就可以轻松方便输出了
<script setup lang="ts"> const { tm, rt } = useI18n() </script> <div v-for="(index, key) in tm('test')" :key="key" > {{ key }} {{ rt('index') }} </div>
官方文档地址:
https://vue-i18n.intlify.dev/api/composition.html#composer
<template > <div v-if="show"> <div class="flex"> <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-4 h-4 mr-1"> <path stroke-linecap="round" stroke-linejoin="round" d="M12 6v6h4.5m4.5 0a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z" /> </svg> <span>倒计时:{{ `${d || 0}天${h || 0}小时${m || 0}分${s || 0}秒` }}</span> </div> </div> </template> <script> export default { props: { endTime: { type: String, default: '' }, }, data() { return { d: '', h: '', m: '', s: '', timer: null, show:false } }, mounted() { clearTimeout(this.timer); this.countTime(); }, beforeDestroy() { clearTimeout(this.timer); }, methods: { countTime: function () { //获取当前时间 let date = new Date() let now = date.getTime() //设置截止时间 let endDate = new Date(this.endTime); let end = endDate.getTime() //时间差 let leftTime = end - now; //定义变量 d,h,m,s保存倒计时的时间 if (leftTime >= 0) { this.d = Math.floor(leftTime / 1000 / 60 / 60 / 24)//天数我没用到,暂且写上 this.h = Math.floor((leftTime / 1000 / 60 / 60) % 24) this.m = Math.floor((leftTime / 1000 / 60) % 60) this.s = Math.floor((leftTime / 1000) % 60) //递归每秒调用countTime方法,显示动态时间效果 this.timer = setTimeout(this.countTime, 1000) this.show=true } }, }, } </script>
以上内容存保存到到项目下的组件目录components/DateDown.vue
在需要的地方调用即可
<YDateDown :endTime=”netpc.com.cn” />
开始用setInterval实现发现会提示无法在客户端执行该函数,网上找到用回调setTimeout方式可行。
做一个多语言版本的网页使用一个多语言判断的中间件\App\Http\Middleware\Language::class
结果死活在控制器构造函数中跑不出结果,laravel加载执行生命周期,决定了是先跑了构造函数后才会跑中间件里的代码,无论你是写路由中间件组middlewareGroups ,还是写在路由配置里
Route::group([‘middleware’ => [‘Language’]], function () { // });
都得不到正确的加载语言包的结果,最后发现有两个解决方法,
1、全局注册中间件,在/app/Http/Kernel.php的$middleware中配置可以先执行中间件再跑控制器构造函数中的代码,但等于所有的地方都会用到该中间件了。
2、把依赖逻辑写在构造函数中使用中间件回调中可以解决。
public function __construct() { // $this->middleware('Language');// 想先执行这样也不行 $this->middleware(function ($request, $next) { echo __('netpc.com.cn'); return $next($request); //...add }); }
最近有个nuxt3项目需要部署,顺利的话其实也简单,这里简单说说:
首先编译yarn bulid,生成.output和.nuxt
使用pm2 start跑起项目,默认会去调用命令目录下的ecosystem.config.js,里面有启动的配置参数,nginx配置只要以下简单内容可以了,先用ip直接访问试试看后再用代理方式。
server { listen 80; server_name dev.netpc.com.cn; access_log off; location / { proxy_pass http://localhost:3001; index index.html index.htm; } }
这里遇到问题
1、修改了.ts文件发现yarn bulid重新生产一直有缓存
执行yarn nuxi cleanup清空缓存再编译
2、nginx配置不要除了反向代理的location /还有别的
例如处理jpg png 或js的,
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico)$ { expires 30d; access_log off; } location ~ .*\.(js|css)?$ { expires 7d; access_log off; }
上面内容会导致反向代理后出现404
php排序sort($tmpArr, SORT_STRING)方式就会和java的Arrays.sort()结果一致了。
在把一段Java代码转php的时候发现使用默认sort这个函数会出行排序不一致情况,经查询需要修改第二个参数为字符串。
php默认的排序参数信息
sort(array &$array, int $flags = SORT_REGULAR): true
可选的第二个参数 flags 可以用以下值改变排序的行为:
排序类型标记:
SORT_REGULAR – 正常比较单元 详细描述参见 比较运算符 章节
SORT_NUMERIC – 单元被作为数字来比较
SORT_STRING – 单元被作为字符串来比较
SORT_LOCALE_STRING – 根据当前的区域(locale)设置来把单元当作字符串比较,可以用 setlocale() 来改变。
SORT_NATURAL – 和 natsort() 类似对每个单元以“自然的顺序”对字符串进行排序。
SORT_FLAG_CASE – 能够与 SORT_STRING 或 SORT_NATURAL 合并(OR 位运算),不区分大小写排序字符串。
SORT_STRING 排序方式的底层实现是 C 语言的 memcmp,它对两个字符串从前往后,按照逐个字节比较,一旦字节有差异,就终止并比较出大小。
而 SORT_REGULAR 会智能判断需排序对象的类型,如果两个字符串都是“纯数字”形式的字符串,会以比较整个字符串所代表的十进制整数、浮点数大小的形式进行排序。如果两个字符串不是“纯数字“形式的,才会和 SORT_STRING 一样。
因此,如果需要以字符串 strcmp 方式逐个字节从前往后比较来进行排序,在调用 php 的 sort 类函数的时候请务必使用 SORT_STRING 这个 flag,否则如果两个字符串都是”纯数字“形式的,就会按照它们所代表的数字大小进行排序。
找到了就很简单了
onclick=”window.event.cancelBubble=true”
onclick=”event.stopPropagation();”
(1)stopPropagation符合W3C标准,适用于谷歌、火狐等浏览器,不支持IE
(2)cancelBubble方法不符合W3C标准,说是IE的,但是我谷歌上也可以用。
Execution failed for task ‘:app:mergeDexDebug’.
> A failure occurred while executing com.android.build.gradle.internal.tasks.DexMergingTaskDelegate
> There was a failure while executing work items
> A failure occurred while executing com.android.build.gradle.internal.tasks.DexMergingWorkAction
> com.android.builder.dexing.DexArchiveMergerException: Error while merging dex archives:
The number of method references in a .dex file cannot exceed 64K.
Learn how to resolve this issue at https://developer.android.com/tools/building/multidex.html
* Try:
> Run with –stacktrace option to get the stack trace.
> Run with –info or –debug option to get more log output.
> Run with –scan to get full insights.
解决方法如下:
应用内级别build.gradle添加:
android { defaultConfig { ... multiDexEnabled true } } dependencies { implementation 'com.android.support:multidex:1.0.3' }