首页
网络资源
技术分享
云资源
分享你我
行动起来,活在当下
累计撰写
106
篇文章
累计创建
13
个标签
累计收到
0
条评论
栏目
首页
网络资源
技术分享
云资源
目 录
CONTENT
最新文章
使GitHub Actions 的 OpenWrt 在线集成自动编译实现自己的固件自由
<h4 id="h4-u4E3Au4EC0u4E48u8981u81EAu5DF1u7F16u8BD1u56FAu4EF6"><a name="为什么要自己编译固件" class="reference-link" href="#"></a><span class="header-link octicon octicon-link"></span>为什么要自己编译固件</h4><p>如果你在使用软路由,对于OpenWrt应该不陌生,肯定也纠结和尝试过各种网上的固件,对于大部分人来说,网上的固件是够用的,但我还是建议大家自己编译固件,因为网上的固件要么插件太多,要么自己想要的插件没有,其次就是编译的源码很多没有共享出来,你会不会也担心安全问题?</p> <p>今天给大家分享一下如何使用Github Action进行云编译OpenWrt。</p> <h3 id="h3-u4E91u7F16u8BD1"><a name="云编译" class="reference-link" href="#"></a><span class="header-link octicon octicon-link"></span>云编译</h3><p>使用Github Action编译OpenWrt固件网上有很多教程,但是对于小白来说,还是不友好,我踩了不少坑,以下教程适合小白用户。</p> <p>开始之前首先感谢以下几位大佬:</p> <p>Lean: <a href="https://github.com/coolsnowwolf/lede">https://github.com/coolsnowwolf/lede</a><br>P3TERX: <a href="https://github.com/P3TERX/Actions-OpenWrt">https://github.com/P3TERX/Actions-OpenWrt</a><br>kenzok8: <a href="https://github.com/kenzok8/small-package">https://github.com/kenzok8/small-package</a><br>fw876: <a href="https://github.com/fw876/helloworld">https://github.com/fw876/helloworld</a></p> <h5 id="h5-u5DE5u5177u51C6u5907"><a name="工具准备" class="reference-link" href="#"></a><span class="header-link octicon octicon-link"></span>工具准备</h5><p>首先需要准备以下工具:</p> <pre><code>一个GitHub账户 一台装有Ubuntu的电脑或者虚拟机</code></pre><p>为什么需要Ubuntu的电脑或者虚拟机呢?网上有教程通过Github Action的SSH功能也能实现编译,但是我实际验证非常容易报错和中断,所以建议大家采用Ubuntu系统来生成配置文件。</p> <h4 id="h4--github-"><a name="创建Github仓库" class="reference-link" href="#"></a><span class="header-link octicon octicon-link"></span>创建Github仓库</h4><p>登陆Github账户,访问P3TERX大佬的原始仓库,根据P3TERX的说明,创建自己的仓库,步骤如下:</p> <p>1.进入 P3TERX/Actions-OpenWrt 项目页面,点击页面中的 Use this template (使用这个模版)按钮。<br><img src="https://www.javalc.com/zb_users/upload/2022/11/202211141447476281330.png" alt=""></p> <p>2.填写仓库名称,然后点击Create repository from template(从模版创建储存库)按钮<br><img src="https://www.javalc.com/zb_users/upload/2022/11/202211141450043443055.png" alt=""><br>3.经过几秒钟的等待,页面会跳转到新建的仓库,内容和我的项目是相同的。然后点击Create new file(创建新文件)按钮<br><img src="https://www.javalc.com/zb_users/upload/2022/11/202211141451342355755.png" alt=""></p> <p>4.文件名填写为.config,这里不需要填写,后面会讲如何配置<br><img src="https://www.javalc.com/zb_users/upload/2022/11/202211141453082037227.png" alt=""></p> <p>5.翻到页面最下方,点击Commit new file(提交新文件)按钮<br><img src="https://www.javalc.com/zb_users/upload/2022/11/202211141454083920763.png" alt=""><br><strong>修改sh(可选)</strong></p> <h4 id="h4--ip-"><a name="修改固件的IP地址" class="reference-link" href="#"></a><span class="header-link octicon octicon-link"></span>修改固件的IP地址</h4><p>在Github Code页面,找到diy-part2.sh,点击编辑,修改默认IP地址,将192.168.2.1改为你想设置的地址即可。<br><img src="https://www.javalc.com/zb_users/upload/2022/11/202211141457073954308.png" alt=""></p> <h5 id="h5-u6DFBu52A0u8F6Fu4EF6u5305u5E93"><a name="添加软件包库" class="reference-link" href="#"></a><span class="header-link octicon octicon-link"></span>添加软件包库</h5><p>在Github Code页面,找到diy-part1.sh,点击编辑,按需求增加编译时可选的软件包,以下三个是我所使用的,包含绝大部分支持OpenWRT的软件包,大家可以访问对应的地址,查看详细软件包仓库说明<br><img src="https://www.javalc.com/zb_users/upload/2022/11/202211141458432951133.png" alt=""></p> <h5 id="h5--config-"><a name="生成Config文件" class="reference-link" href="#"></a><span class="header-link octicon octicon-link"></span>生成Config文件</h5><p><em>P3TERX大佬的脚本其实是支持SSH访问来生成Config,但是我几经尝试均失败,最后采用本地生成Config的方法成功了。</em></p> <h3 id="h3--ubuntu-lean-ubuntu-lean-"><a name="登陆Ubuntu系统,按 Lean 的教程进行编译 登陆Ubuntu系统,按 Lean 的教程进行编译" class="reference-link" href="#"></a><span class="header-link octicon octicon-link"></span>登陆Ubuntu系统,按<a href="https://github.com/coolsnowwolf/lede">Lean</a>的教程进行编译 登陆Ubuntu系统,按<a href="https://github.com/coolsnowwolf/lede">Lean</a>的教程进行编译</h3><p>1.安装编译依赖</p> <pre><code>sudo apt update -y sudo apt full-upgrade -y sudo apt install -y ack antlr3 asciidoc autoconf automake autopoint binutils bison build-essential \ bzip2 ccache cmake cpio curl device-tree-compiler fastjar flex gawk gettext gcc-multilib g++-multilib \ git gperf haveged help2man intltool libc6-dev-i386 libelf-dev libglib2.0-dev libgmp3-dev libltdl-dev \ libmpc-dev libmpfr-dev libncurses5-dev libncursesw5-dev libreadline-dev libssl-dev libtool lrzsz \ mkisofs msmtp nano ninja-build p7zip p7zip-full patch pkgconf python2.7 python3 python3-pip qemu-utils \ rsync scons squashfs-tools subversion swig texinfo uglifyjs upx-ucl unzip vim wget xmlto xxd zlib1g-dev </code></pre><p>2.下载源代码</p> <pre><code>git clone https://github.com/coolsnowwolf/lede && cd lede</code></pre><p>这里需要注意:</p> <h3 id="h3--root-"><a name="不能用使root权限帐户拉取(虽然可以拉但后面编译就凉凉)" class="reference-link" href="#"></a><span class="header-link octicon octicon-link"></span>不能用使root权限帐户拉取(虽然可以拉但后面编译就凉凉)</h3><h3 id="h3--sudo-sudo-"><a name="不能在需要使用sudo 提取的地方拉不然后面编译加sudo 就报错不加就是权限不足" class="reference-link" href="#"></a><span class="header-link octicon octicon-link"></span>不能在需要使用sudo 提取的地方拉不然后面编译加sudo 就报错不加就是权限不足</h3><p>3.进入本地的LEDE文件夹,修改feeds.conf.default文件,增加三个软件仓库<br><img src="https://www.javalc.com/zb_users/upload/2022/11/202211141503131733124.png" alt=""></p> <p>4.生成.Config文件(一会把生成的内容复制到前面创建.config文件中)</p> <pre><code>./scripts/feeds update -a ./scripts/feeds install -a make menuconfig </code></pre><p>之后就能看到OpenWrt的配置界面,按需选择想要的设置,然后保存。进入本地的LEDE文件夹,可以看到.Config文件<br><img src="https://www.javalc.com/zb_users/upload/2022/11/202211141506129906380.png" alt=""></p> <p>将.Config文件上传到Github仓库<br><img src="https://www.javalc.com/zb_users/upload/2022/11/202211141507344352960.png" alt=""></p> <h5 id="h5--action-"><a name="开启Action编译" class="reference-link" href="#"></a><span class="header-link octicon octicon-link"></span>开启Action编译</h5><p>在Github页面,点击Action,选择Build OpenWrt,SSH默认为false,Run workflow即开始云编译,等待编译结束后,可以在Act<!--autointro--></p> <!--105-->
2022-11-14
0
0
0
技术分享
免费内网穿透之Cloudflare
<h5 id="h5--80-"><a name="由于国内运营商不让用80端口,备案又麻烦。" class="reference-link" href="#"></a><span class="header-link octicon octicon-link"></span>由于国内运营商不让用80端口,备案又麻烦。</h5><pre><code>1. 优缺点 2. 免费且不需要服务器 3. 暂时不支持UDP协议</code></pre><h5 id="h5-u524Du63D0u6761u4EF6"><a name="前提条件" class="reference-link" href="#"></a><span class="header-link octicon octicon-link"></span>前提条件</h5><pre><code>1. 一个托管于Cloudflare的域名,相关教程看这里创建 Cloudflare 帐户并添加网站 2. 一台本地Linux Web机器,即内网穿透的对象 3. 正常网络连接 4. 安装 Cloudflared</code></pre><h5 id="h5--cloudflared"><a name="安装 Cloudflared" class="reference-link" href="#"></a><span class="header-link octicon octicon-link"></span>安装 Cloudflared</h5><pre><code>curl -LO https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb dpkg -i cloudflared-linux-amd64.deb rm cloudflared-linux-amd64.deb</code></pre><h5 id="h5--cloudflared"><a name="登录 Cloudflared" class="reference-link" href="#"></a><span class="header-link octicon octicon-link"></span>登录 Cloudflared</h5><pre><code>cloudflared tunnel login</code></pre><p>这时会弹出来一个URL,用浏览器打开,登录认证,然后选择你想用来做内网穿透的域名即可。</p> <p>成功后会生成证书,放置于~/cloudflared/cert.pem中。</p> <h5 id="h5-u65B0u5EFAu96A7u9053"><a name="新建隧道" class="reference-link" href="#"></a><span class="header-link octicon octicon-link"></span>新建隧道</h5><h6 id="h6-u540Du5B57u53EFu4EE5u968Fu610Fu8D77"><a name="名字可以随意起" class="reference-link" href="#"></a><span class="header-link octicon octicon-link"></span>名字可以随意起</h6><p>```<br>cloudflared tunnel create <Tunnel-NAME><!--autointro--></p> <!--103-->
2022-11-04
2
0
0
技术分享
uniapp nvue 仿抖音评论
<h5>评论框-组件</h5> <pre><code> <template> <!-- @tap=";" @mousemove=";" :style="'bottom:'+KeyboardHeight+'px;'" --> <view> <view class="comment_mask" :style="maskStyle" @tap.stop="maskCancel"></view> <view :class="{'input':isMaskContentStyle==true,'onInput':isMaskContentStyle==false}" class="comment_mask_content" :style="inputStyle" @tap.stop=";" @click.stop=";"></view></template><!--autointro--></code></pre><!--autointro--><!--102-->
2022-09-28
2
0
0
技术分享
C# 使用NAudio实现录音并过滤大部分无用的杂音并使用python 识别录音内容
<h6>NAudio 录音帮类</h6> <pre><code> public interface ISpeechRecorder { void SetFileName(string fileName); void StartRec(); void StopRec(); } public class NAudioRecorder : ISpeechRecorder { #region var /// <summary></summary><!--autointro--></code></pre><!--autointro--><!--101-->
2022-09-27
0
0
0
技术分享
java/C# 调用unipush2.0
<h4 id="h4--uniapp-unipush-"><a name="首先按照uniapp的文档添加 unipush服务" class="reference-link" href="#"></a><span class="header-link octicon octicon-link"></span>首先按照uniapp的文档添加 unipush服务</h4><p><a href="https://uniapp.dcloud.net.cn/unipush-v2.html" title="添加unipush服务文档">添加unipush服务文档</a><br><strong>注意:<br>没有使用 uni-id-pages 时执行云函数只有一个”opendb-tempdata”表并不会像文档所说有三个表</strong><br><img src="https://www.javalc.com/zb_users/upload/2022/08/202208121558522965071.png" alt=""></p> <h4 id="h4--package-json-"><a name="修改 package.json文件" class="reference-link" href="#"></a><span class="header-link octicon octicon-link"></span>修改 package.json文件</h4><pre><code class="language-json">{ "name": "uni-push-api", "dependencies": {}, "version": "1.0.0", "main": "index.js", "extensions": { "uni-cloud-push": {} } } </code></pre> <p><strong>注意此文件内不能出现注释</strong></p> <h4 id="h4--index-js-"><a name="修改同级目录中的 index.js文件" class="reference-link" href="#"></a><span class="header-link octicon octicon-link"></span>修改同级目录中的 index.js文件</h4><p>```json<br>‘use strict’;</p> <p>const uniPush = uniCloud.getPushManager({<br> appId: “<strong>UNI</strong>120F7BB”<br>}) //注意这里需要传入你的应用appId</p> <p>exports.main = async (event, context) =<!--autointro--></p> <!--100-->
2022-08-12
0
0
0
技术分享
xray 前置实现复用443端口
<h2 id="应用情景" tabindex="-1" style="scroll-behavior: smooth; transition: border-color var(--t-color); line-height: 1.25; font-size: 1.65rem; padding-bottom: 0.3rem; border-bottom: 1px solid var(--c-border); margin-top: calc(0.5rem - var(--navbar-height)); padding-top: calc(1rem + var(--navbar-height)); margin-bottom: 0px; color: rgb(44, 62, 80); font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; white-space: normal; background-color: rgb(255, 255, 255);"><!--autointro--><!--99-->
2022-07-17
2
0
0
技术分享
青龙面板使用selenium
<p><strong><span style="color: #4D4D4D; font-family: -apple-system, "SF UI Text", Arial, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif, SimHei, SimSun; background-color: #FFFFFF;"></span></strong></p><!--autointro--><!--98-->
2022-07-16
2
0
0
技术分享
httpcanary(小黄鸟)v3.3.6 平行空间补丁
<p><img src="https://www.javalc.com/zb_users/upload/2022/07/202207131622033592890.jpg" alt="bdf6c6e7df4a3d0a2bc04782cebbda0.jpg"/></p><p><img src="https://www.javalc.com/zb_users/upload/2022/07/202207131622134833483.jpg" alt="cada26ee97ce494ddee1913fb1b604c.jpg"/></p><!--autointro--><!--97-->
2022-07-13
1
0
0
技术分享
af-table-column 插件改版支持 VUE3 TS(el-table 自适应列宽)
<p><br/></p><p>新建组件:AFTableColumn.vue</p><pre class="brush:js;toolbar:false"><template> <!--判断 slots.default可知道是否存在子元素--> <el-table-column v-if="slots.default" v-bind="attrs" :class-name="className" :min-width="minWidth"> <template #default="scope"> <slot v-bind="scope"></slot> </template> </el-table-column> <!--使用 slot 自定义 header--> <el-table-column v-else-if="slots.header" v-bind="attrs" :class-name="className" :min-width="minWidth"> <template #header="scope"> <slot name="header" v-bind="scope"></slot> </template> </el-table-column> <!--默认情况使用原始 el-table-column--> <el-table-column v-else :class-name="className" v-bind="attrs" :min-width="minWidth"> </el-table-column> </template> <script lang="ts"> export default { name: 'af-table-column', // inheritAttrs: false, } </script> <script setup lang="ts" name="af-table-column"> import { getCurrentInstance, ref, reactive, watch, computed, nextTick, useAttrs, useSlots } from 'vue' import $consts from '../../configs/constants'; const { proxy } = getCurrentInstance() as any; const attrs = useAttrs() as any; const slots = useSlots(); let minLength = ref(10); // 初始也不要写成0, 避免未及时设置宽度太丑 let getComputedWidth = ref(10); // 自定义列中获取元素计算的宽度 const values = computed(() => { const data = proxy.$parent.data || [] return data.map((item: any) => item[attrs.prop]) }) // 是否自适应列宽, 默认是 const isFit = computed(() => { return (proxy.$parent.$attrs.autoFit === undefined && attrs.fit === undefined) || (proxy.$parent.$attrs.autoFit === false && attrs.fit !== undefined) }) // 为存在scope的添加className const className = computed(() => { const parentClass = attrs['class-name'] || '' const classPre = attrs.prop || `encode-${transChar(attrs.label)}` // 有的列因为有slotScope而不给prop return classPre ? `${parentClass} ${classPre}-column` : '' }) // 列最小宽度 const minWidth = computed(() => { if (!attrs.label) return undefined; if (!isFit.value) return undefined; const maxOne = Math.max(minLength.value, attrs.label.length * (fontRate.value as any).CHAR_RATE) * fontSize.value + 20; return attrs.width || Math.max(maxOne, getComputedWidth.value) }) // 字体大小 const fontSize = computed(() => attrs.fontSize || $consts.fontSize) // 字体比例 const fontRate = computed(() => { return { ...$consts.fontRate, // 默认值 ...attrs.fontRate || {}, // 父组件属性 } }) watch(values, (val: any) => { return isFit.value !== false && nextTick(() => { // 详情中的列表需要在nextTick才能生效 if (!slots.default) { // 存在自定义节点 minLength.value = getMaxLength(val); return; } setTimeout(() => { // 首次获取不到子节点, setTimeout才行 // 可能存在贴边列, 需要使用包含 fixed 的类名 const bodyWrapper = attrs.fixed ? (document as any).querySelector(`.el-table__fixed${attrs.fixed === 'right' ? `-${attrs.fixed}` : ''}`).querySelector('.el-table__fixed-body-wrapper') : document.querySelector('.el-table__body-wrapper') const nodes = bodyWrapper.querySelectorAll(`.${attrs.prop || `encode-${transChar(attrs.label)}`}-column`) if (nodes.length) { // 有可能会来不及获取nodes, 就切换菜单进入下一页了, 再研究吧 const target = reactive<Array<String>>([]); const getComputedWidths = reactive<Array<number>>([]); Array.from(nodes).map((item: any) => { let text = item.innerText; target.push(text); // 有可能存在自定义列内容超出容器, 取 scrollWidth 才行 getComputedWidths.push(item.querySelector('.cell').scrollWidth); }) getComputedWidth.value = Math.max(...getComputedWidths); minLength.value = getMaxLength(target); } }, 0) }) }) /** * 获取数组中元素按字体比例最长长度 * @param arr */ const getMaxLength = (arr: any) => { return arr.reduce((length: any, item: any) => { if (item) { const str = item.toString() const char = str.match(/[\u2E80-\u9FFF]/g) const charLength = char ? char.length : 0 const num = str.match(/\d|\./g) const numLength = num ? num.length : 0 const otherLength = str.length - charLength - numLength let newLength = charLength * $consts.fontRate.CHAR_RATE + numLength * $consts.fontRate.NUM_RATE + otherLength * $consts.fontRate.OTHER_RATE if (str.includes('\n')) newLength = getMaxLength(str.split('\n')) if (length < newLength) { length = newLength } } return length }, 0) } /** * 转换汉字为class支持的字母 * @param char */ const transChar = (char: any) => { return encodeURIComponent(char).replace(/[^a-zA-z]/g, 'eUC') } </script></pre><!--autointro--><!--96-->
2022-06-15
2
0
0
技术分享
python-eel-vite-vue-ts 构建桌面应用
<p>源码地址:<a href="https://github.com/Child-Cheng/python-eel-vite-vue-ts" _src="https://github.com/Child-Cheng/python-eel-vite-vue-ts">https://github.com/Child-Cheng/python-eel-vite-vue-ts</a></p><p>效果图:</p><p><img src="https://www.javalc.com/zb_users/upload/2022/05/202205241450164557089.png" alt="image.png"/></p><!--autointro--><!--95-->
2022-05-24
1
0
0
技术分享
1
2
3
4
5
...
11