1.源码阅读忆丛(51)eBPF
2.Proteusçµåçµè·¯è®¾è®¡å仿ççç®å½
3.å¶ä½çµåå¾ä¹¦ç¨ä»ä¹è½¯ä»¶ï¼
4.C#è¯è¨åççµåç¸åç³»ç»
5.2022年最新Vue+electron项目创建
源码阅读忆丛(51)eBPF
eBPF:革新内核的电目瑞士军刀
eBPF的发展如火如荼,其势头正盛,录系似乎有潜力彻底重塑Linux内核的统源可能。初识eBPF,码电目录源于对复杂源码的系统渴望,Hotspot、源码双轨源码源码V8等大型项目让人望而却步,设置于是电目选择了一款小巧且充满潜力的eBPF来探索。深入学习后发现,录系eBPF的统源内容丰富多样,不仅提供了强大的码电目录调试工具,还能深入探测性能,系统勾起了我浓厚的源码奶粉朔源码 造假兴趣。
通过百度和阅读电子书《BPF之巅-洞悉Linux系统和应用性能》,设置我对eBPF的电目原理有了初步了解。书中的前五章着重介绍了eBPF的原理和技术,而后续章节则详细阐述了其工具的使用方法。这些工具的功能确实强大,但更多是在调试器层面的延展。我尤其对性能探测工具感到好奇,这促使我进一步深入研究。
对eBPF原理的兴趣驱使我追溯其发展脉络。从年eBPF的早期版本开始,我发现其基础架构已足够强大,足以替代iptables。求出源码java代码从年到年,这个领域似乎并未取得显著进展,这可能是因为它被忽视了。
随着深入研究Linux 4.1版本(年发行),我浏览了samples/bpf和kernel/bpf目录下的源代码,重点分析了libbpf.c、bpf_load.c、core.c、syscall.c、verifier.c等关键文件。这些代码揭示了eBPF的加载和编译机制,包括在用户态标记并记录映射和函数调用,kfc独立代理源码然后在内核态通过verifier.c的bpf_check(...)函数实现映射地址或函数地址的真实替换。至于代码的动态编译和优化,我选择跳过,因为涉及到的JIT等技术我已经较为熟悉。
在理解eBPF动态插桩和静态插桩技术的基础上,我回顾了Linux 2.6.版本(年)的trace静态插桩技术。这个版本的trace功能较为基础,主要记录函数调用地址,但提供快速写入功能,即使数据来不及读取也会被覆盖。然而,读取数据时需要比较所有CPU的创意电子软件源码环形缓冲区记录,找到最久的记录。虽然功能有限,但trace静态插桩在内核重要函数的调用跟踪中发挥了作用。
此外,我还研究了Linux 2.6.版本的kprobes动态插桩技术。kprobes提供了一种动态跟踪函数调用的方法,主要通过kernel/kprobes.c和arch/x/kernel/kprobes.c文件实现。reenter_kprobe函数处理调试中断时的重入问题,而kretprobe则将第二个CPU核单步执行,避免冲突。jprobe则通过插入代码改变程序流程,理论上避免了重入问题。
在回顾了这些源码后,我发现它们的难度并不高,结合网络资源,我能够顺利阅读并理解。我仅记录了当时重点思考的部分,这些部分涉及了源码的关键功能和实现细节。
Proteusçµåçµè·¯è®¾è®¡å仿ççç®å½
第1ç« Proteusæ¦è¿° 11.1 Proteusåå² 1
1.2 Proteusåºç¨é¢å 1
1.3 Proteus VSMç»ä»¶ 2
1.4 Proteusçå¯å¨åéåº 3
1.5 Proteus设计æµç¨ 5
1.5.1 èªé¡¶åä¸è®¾è®¡ 5
1.5.2 èªä¸èä¸è®¾è®¡ 5
1.6 Proteuså®è£ æ¹æ³ 6
第2ç« Proteus ISISåºæ¬æä½ 9
2.1 Proteus ISISå·¥ä½çé¢ 9
2.1.1 ç¼è¾çªå£ 9
2.1.2 é¢è§çªå£
2.1.3 对象éæ©å¨
2.1.4 èåæ ä¸ä¸»å·¥å ·æ
2.1.5 ç¶ææ
2.1.6 å·¥å ·ç®±
2.1.7 æ¹åå·¥å ·æ å仿çæé®
2.2 ç¼è¾ç¯å¢è®¾ç½®
2.2.1 模æ¿è®¾ç½®
2.2.2 å¾è¡¨è®¾ç½®
2.2.3 å¾å½¢è®¾ç½®
2.2.4 ææ¬è®¾ç½®
2.2.5 å¾å½¢ææ¬è®¾ç½®
2.2.6 交ç¹è®¾ç½®
2.3 ç³»ç»åæ°è®¾ç½®
2.3.1 å ä»¶æ¸ å设置
2.3.2 ç¯å¢è®¾ç½®
2.3.3 è·¯å¾è®¾ç½®
2.3.4 å±æ§å®ä¹è®¾ç½®
2.3.5 å¾çº¸å¤§å°è®¾ç½®
2.3.6 ææ¬ç¼è¾é项设置
2.3.7 å¿«æ·é®è®¾ç½®
2.3.8 å¨ç»é项设置
2.3.9 仿çé项设置
å®ä¾2-1 åçå¾ç»å¶å®ä¾
第3ç« Proteus ISISçµè·¯ç»å¶
3.1 ç»å¾æ¨¡å¼åå½ä»¤
3.1.1 Componentï¼å 件ï¼æ¨¡å¼
3.1.2 Junction dotï¼èç¹ï¼æ¨¡å¼
3.1.3 Wire labelï¼è¿çº¿æ å·ï¼æ¨¡å¼
3.1.4 Text scriptsï¼æåèæ¬ï¼æ¨¡å¼
3.1.5 æ»çº¿ï¼Busesï¼æ¨¡å¼
3.1.6 Subcircuitï¼åçµè·¯ï¼æ¨¡å¼
3.1.7 Terminalsï¼ç»ç«¯ï¼æ¨¡å¼
3.1.8 Device Pinsï¼å¨ä»¶å¼èï¼æ¨¡å¼
3.1.9 2Då¾å½¢å·¥å ·
3.2 导线çæä½
3.2.1 两对象è¿çº¿
3.2.2 è¿æ¥ç¹
3.2.3 éå¤å¸çº¿
3.2.4 æå¨è¿çº¿
3.2.5 移走èç¹
3.3 对象çæä½
3.3.1 éä¸å¯¹è±¡
3.3.2 æ¾ç½®å¯¹è±¡
3.3.3 å é¤å¯¹è±¡
3.3.4 å¤å¶å¯¹è±¡
3.3.5 æå¨å¯¹è±¡
3.3.6 è°æ´å¯¹è±¡
3.3.7 è°æ´æå
3.3.8 ç¼è¾å¯¹è±¡
3.4 ç»å¶çµè·¯å¾è¿é¶
3.4.1 æ¿æ¢å 件
3.4.2 éèå¼è
3.4.3 设置头æ¡
3.4.4 设置è¿çº¿å¤è§
3.5 å ¸åå®ä¾
å®ä¾3-1 ç»å¶å ±åå°ææ¾å¤§çµè·¯
å®ä¾3-2 JK触åå¨ç»æçä¸ä½äºè¿å¶å
æ¥è®¡æ°å¨çç»å¶ä¸æµè¯
å®ä¾3-3 KEYPADçç»å¶å仿ç
å®ä¾3-4 åçæºæ§ä¸²è¡è¾å ¥å¹¶è¡è¾åº
移ä½å¯åå¨ç»å¶ç»ä¹
第4ç« ProteusISISåæå仿çå·¥å ·
4.1 èæ仪å¨
4.2 æ¢é
4.3 å¾è¡¨
4.4 æ¿å±æº
4.4.1 ç´æµä¿¡å·åçå¨DC设置
4.4.2 å¹ åº¦ãé¢çãç¸ä½å¯æ§çæ£å¼¦
æ³¢åçå¨SINE设置
4.4.3 模æèå²åçå¨PULSE设置
4.4.4 ææ°èå²åçå¨EXP设置
4.4.5 åé¢çè°é¢æ³¢ä¿¡å·åçå¨SFFM
设置
4.4.6 PWLINå段线æ§èå²ä¿¡å·åç
å¨è®¾ç½®
4.4.7 FILEä¿¡å·åçå¨è®¾ç½®
4.4.8 é³é¢ä¿¡å·åçå¨AUDIO设置
4.4.9 åå¨ææ°åèå²åçå¨DPULSE
设置
4.4. æ°åå边沿信å·åçå¨DEDGE
设置
4.4. æ°åå稳æé»è¾çµå¹³åçå¨
DSTATE设置
4.4. æ°åæ¶éä¿¡å·åçå¨DCLOCK
设置
4.4. æ°å模å¼ä¿¡å·åçå¨DPATTERN
设置
4.5 å ¸åå®ä¾
å®ä¾4-1 å ±åå°ææ¾å¤§çµè·¯åæ
å®ä¾4-2 ADCçµè·¯æ¶åºåæ
å®ä¾4-3 å ±åå°æåºç¨ä½é滤波çµè·¯
åæ
第5ç« æ¨¡æçµè·¯è®¾è®¡å仿ç
5.1 è¿ç®æ¾å¤§å¨åºæ¬åºç¨çµè·¯
5.1.1 åç¸æ¾å¤§çµè·¯
5.1.2 åç¸æ¾å¤§çµè·¯
5.1.3 å·®å¨æ¾å¤§çµè·¯
5.1.4 å æ³è¿ç®çµè·¯
5.1.5 åæ³è¿ç®çµè·¯
5.1.6 å¾®åè¿ç®çµè·¯
5.1.7 积åè¿ç®çµè·¯
å®ä¾5-1 PIDæ§å¶çµè·¯åæ
5.2 æµéæ¾å¤§çµè·¯ä¸é离çµè·¯
5.2.1 æµéæ¾å¤§å¨
å®ä¾5-2 æµéæ¾å¤§å¨æµæ¸©çµè·¯åæ
5.2.2 é离æ¾å¤§å¨
å®ä¾5-3 模æä¿¡å·é离æ¾å¤§çµè·¯
åæ
5.3 ä¿¡å·è½¬æ¢çµè·¯
5.3.1 çµåæ¯è¾çµè·¯
5.3.2 çµå/é¢ç转æ¢çµè·¯
5.3.3 é¢ç/çµå转æ¢çµè·¯
5.3.4 çµåâçµæµè½¬æ¢çµè·¯
5.3.5 çµæµâçµå转æ¢çµè·¯
5.4 移ç¸çµè·¯ä¸ç¸ææ£æ³¢çµè·¯
5.4.1 移ç¸çµè·¯
5.4.2 ç¸ææ£æ³¢çµè·¯
å®ä¾5-4 ç¸ææ£æ³¢å¨é´ç¸ç¹æ§åæ
5.5 ä¿¡å·ç»åçµè·¯
å®ä¾5-5 çµé»é¾äºåé¢ç»åçµè·¯
åæ
5.6 ææºæ»¤æ³¢çµè·¯
5.6.1 ä½é滤波çµè·¯
5.6.2 é«é滤波çµè·¯
5.6.3 带é滤波çµè·¯
5.6.4 带é»æ»¤æ³¢çµè·¯
5.7 ä¿¡å·è°å¶/解è°
5.7.1 è°å¹ çµè·¯
5.7.2 è°é¢çµè·¯
5.7.3 è°ç¸çµè·¯
5.8 å½æ°åççµè·¯
5.8.1 æ£å¼¦æ³¢ä¿¡å·åççµè·¯
å®ä¾5-6 çµå®¹ä¸ç¹å¼æ¯è¡çµè·¯åæ
5.8.2 ç©å½¢æ³¢ä¿¡å·åççµè·¯
5.8.3 å 空æ¯å¯è°çç©å½¢æ³¢åç
çµè·¯
5.8.4 ä¸è§æ³¢ä¿¡å·åççµè·¯
5.8.5 é¯é½¿æ³¢ä¿¡å·åççµè·¯
å®ä¾5-7 éæå½æ°åçå¨ICL
çµè·¯åæ
第6ç« æ°åçµè·¯è®¾è®¡å仿ç
6.1 åºæ¬åºç¨çµè·¯
6.1.1 å稳æ触åå¨
6.1.2 å¯åå¨/移ä½å¯åå¨
å®ä¾6-1 LS 8ä½åå移ä½å¯åå¨
åæ
6.1.3 ç¼ç çµè·¯
6.1.4 è¯ç çµè·¯
å®ä¾6-2 CDè¯ç æ¾ç¤ºçµè·¯
åæ
6.1.5 ç®æ¯é»è¾çµè·¯
6.1.6 å¤è·¯éæ©å¨
6.1.7 æ°æ®åé å¨
6.1.8 å /å计æ°å¨
6.2 èå²çµè·¯
6.2.1 å®æ¶å¨ææçå¤è°æ¯è¡å¨
å®ä¾6-3 å 空æ¯ä¸é¢çåå¯è°çå¤
è°æ¯è¡å¨åæ
6.2.2 ç©å½¢èå²çæ´å½¢
6.3 çµå®¹æµé仪
6.3.1 çµå®¹æµé仪设计åç
6.3.2 çµå®¹æµé仪çµè·¯è®¾è®¡
6.4 å¤è·¯çµåæ¢çå¨
6.4.1 ç®å8è·¯çµåæ¢çå¨
6.4.2 8路带æ°åæ¾ç¤ºçµåæ¢çå¨
第7ç« åçæºä»¿ç
7.1 Proteusä¸åçæºä»¿ç
7.1.1 å建æºä»£ç æ件
7.1.2 ç¼è¾æºä»£ç ç¨åº
7.1.3 çæç®æ 代ç
7.1.4 代ç çæå·¥å ·
7.1.5 å®ä¹ç¬¬ä¸æ¹æºä»£ç ç¼è¾å¨
7.1.6 使ç¨ç¬¬ä¸æ¹IDE
7.1.7 åæ¥è°è¯
7.1.8 æç¹è°è¯
7.1.9 MULTI-CPUè°è¯
7.1. å¼¹åºå¼çªå£
7.2 WinAVRç¼è¯å¨
7.2.1 WinAVRç¼è¯å¨ç®ä»
7.2.2 å®è£ WinAVRç¼è¯å¨
7.2.3 WinAVRç使ç¨
7.3 ATMEGAåçæºæ¦è¿°
7.3.1 AVRç³»ååçæºç¹ç¹
7.3.2 ATmegaæ»ä½ç»æ
7.4 I/O端å£åå ¶ç¬¬äºåè½
7.4.1 端å£Aç第äºåè½
7.4.2 端å£Bç第äºåè½
7.4.3 端å£Cç第äºåè½
7.4.4 端å£Dç第äºåè½
å®ä¾7-1 使ç¨Proteus仿çé®çæ§
LED
7.5 ä¸æå¤ç
7.5.1 ATmegaä¸ææº
7.5.2 ç¸å ³I/Oå¯åå¨
7.5.3 æå¤ç
å®ä¾7-2 使ç¨Proteus仿çä¸æå¤éç
é®ç
7.6 ADC模æè¾å ¥æ¥å£
7.6.1 ADCç¹ç¹
7.6.2 ADCçå·¥ä½æ¹å¼
7.6.3 ADCé¢åé¢å¨
7.6.4 ADCçåªå£°æå¶
7.6.5 ä¸ADCæå ³çI/Oå¯åå¨
7.6.6 ADCåªå£°æ¶é¤ææ¯
å®ä¾7-3 使ç¨Proteus仿çç®æçµ
é计
7.7 éç¨ä¸²è¡æ¥å£UART
7.7.1 æ°æ®ä¼ é
7.7.2 æ°æ®æ¥æ¶
7.7.3 ä¸UARTç¸å ³çå¯åå¨
å®ä¾7-4 使ç¨Proteus仿ç以æ¥è¯¢æ¹å¼
ä¸èæç»ç«¯ååçæºä¹é´äºç¸
éä¿¡
å®ä¾7-5 使ç¨Proteus仿çå©ç¨æ åI/O
æµä¸èæç»ç«¯éä¿¡è°è¯
7.8 å®æ¶å¨/计æ°å¨
7.8.1 T/C0
7.8.2 T/C1
7.8.3 T/C2
7.8.4 å®æ¶å¨/计æ°å¨çé¢åé¢å¨
å®ä¾7-6 使ç¨Proteus仿çT/C0å®æ¶
éªçLEDç¯
å®ä¾7-7 使ç¨Proteus仿çT/C2产ç
ä¿¡å·T/C1è¿è¡æè·
å®ä¾7-8 使ç¨Proteus仿çT/C1产ç
PWMä¿¡å·æ§çµæº
å®ä¾7-9 使ç¨Proteus仿ççé¨ç
å®æ¶å¨
7.9 åæ¥ä¸²è¡æ¥å£SPI
7.9.1 SPIç¹æ§
7.9.2 SPIå·¥ä½æ¨¡å¼
7.9.3 SPIæ°æ®æ¨¡å¼
7.9.4 ä¸SPIç¸å ³çå¯åå¨
å®ä¾7- 使ç¨Proteus仿ç端å£
æ©å±
7. 两线串è¡æ¥å£TWI
7..1 TWIç¹æ§
7..2 TWIçæ»çº¿ä»²è£
7..3 TWIç使ç¨
7..4 ä¸TWIç¸å ³çå¯åå¨
å®ä¾7- 使ç¨Proteus仿çåè¯ç
TWIéä¿¡
7. 综å仿ç
å®ä¾7- 使ç¨Proteus仿çDSB
æµæ¸©è®¡
å®ä¾7- 使ç¨Proteus仿ççµå
ä¸å¹´å
å®ä¾7- 使ç¨Proteus仿çDS
å®æ¶æ¶é
第8ç« PCBå¸æ¿
8.1 PCBæ¦è¿°
8.2 Proteus ARESçå·¥ä½çé¢
8.2.1 ç¼è¾çªå£
8.2.2 é¢è§çªå£
8.2.3 对象éæ©å¨
8.2.4 èåæ ä¸ä¸»å·¥å ·æ
8.2.5 ç¶ææ
8.2.6 å·¥å ·ç®±
8.3 ARESç³»ç»è®¾ç½®
8.3.1 é¢è²è®¾ç½®
8.3.2 é»è®¤è§å设置
8.3.3 ç¯å¢è®¾ç½®
8.3.4 éæ©è¿æ»¤å¨è®¾ç½®
8.3.5 å¿«æ·é®è®¾ç½®
8.3.6 ç½æ ¼è®¾ç½®
8.3.7 使ç¨æ¿å±è®¾ç½®
8.3.8 æ¿å±å¯¹è®¾ç½®
8.3.9 è·¯å¾è®¾ç½®
8.3. 模æ¿è®¾ç½®
8.3. å·¥ä½åºå设置
å®ä¾8-1 PCBå¸æ¿æµç¨
åèæç®
åçå¾ï¼é¡¾åæä¹å°±æ¯è¡¨ç¤ºçµè·¯æ¿ä¸åå¨ä»¶ä¹é´è¿æ¥åççå¾è¡¨ãå¨æ¹æ¡å¼åçæ£åç 究ä¸ï¼åçå¾çä½ç¨æ¯é常éè¦çï¼è对åçå¾çæå ³ä¹å ³ä¹æ´ä¸ªé¡¹ç®çè´¨éçè³çå½ãç±åçå¾å»¶ä¼¸ä¸å»ä¼æ¶åå°PCB layoutï¼ä¹å°±æ¯PCBå¸çº¿ï¼å½ç¶è¿ç§å¸çº¿æ¯åºäºåçå¾æ¥åæçï¼éè¿å¯¹åçå¾çåæ以åçµè·¯æ¿å ¶ä»æ¡ä»¶çéå¶ï¼è®¾è®¡è å¾ä»¥ç¡®å®å¨ä»¶çä½ç½®ä»¥åçµè·¯æ¿çå±æ°çã
åºå°é夫å®å¾Kirchhoff lawsæ¯çµè·¯ä¸çµååçµæµæéµå¾ªçåºæ¬è§å¾ï¼æ¯åæå计ç®è¾ä¸ºå¤æçµè·¯çåºç¡ï¼å¹´ç±å¾·å½ç©çå¦å®¶G.R.åºå°é夫ï¼Gustav Robert Kirchhoffï¼ï½ï¼æåºãå®æ¢å¯ä»¥ç¨äºç´æµçµè·¯çåæï¼ä¹å¯ä»¥ç¨äºäº¤æµçµè·¯çåæï¼è¿å¯ä»¥ç¨äºå«æçµåå 件çé线æ§çµè·¯çåæãè¿ç¨åºå°é夫å®å¾è¿è¡çµè·¯åææ¶ï¼ä» ä¸çµè·¯çè¿æ¥æ¹å¼æå ³ï¼èä¸ææ该çµè·¯çå å¨ä»¶å ·æä»ä¹æ ·çæ§è´¨æ å ³ãåºå°é夫å®å¾å æ¬çµæµå®å¾ï¼KCL)åçµåå®å¾(KVL)ï¼åè åºç¨äºçµè·¯ä¸çèç¹èåè åºç¨äºçµè·¯ä¸çåè·¯ã
å¤ç¨è¡¨
multimeter
ç±ç£çµç³»çµè¡¨çæµéæºæä¸æ´æµå¨ææçå¤åè½ãå¤éç¨çæºæ¢°å¼æ示çµè¡¨ï¼è§çµæµè¡¨ï¼ãå¯ç¨ä»¥æµé交ãç´æµçµåï¼äº¤ãç´æµçµæµï¼çµé»ãå称ä¸ç¨è¡¨æç¹ç¨è¡¨ãæäºå¤ç¨è¡¨è¿å ·ææµéçµå®¹ãçµæçåè½ã
å¤ç¨è¡¨ä¸»è¦ç±ç£çµç³»çµè¡¨çæµéæºæãæµéçµè·¯å转æ¢å¼å ³
ç»æãå ¶ä¸ï¼è½¬æ¢å¼å ³æ¯å¤ç¨è¡¨éæ©ä¸åæµéåè½åä¸åéç¨æ¶çåæ¢å 件ã
满å转çµæµçº¦ä¸º ï½Î¼Aãå¤ç¨è¡¨ç¨ä¸ä¸ªæµéæºææ¥æµéå¤ç§çµå¦éï¼åå ·æå 个éç¨ãå ¶å·¥ä½åçæ¯:éè¿æµéçµè·¯çåæ¢,å°è¢«æµéåæ¢æç£çµç³»æµéæºæè½å¤æ¥åçç´æµçµæµãä¾å¦æµéæºæç»ååæµå¨ï¼è§çµæµè¡¨ï¼åååå¨ï¼å°±å½¢ææµéç´æµçµæµåçµåçå¤éç¨ç´æµçµè¡¨ãç£çµç³»æµéæºæä¸åæ³¢æå ¨æ³¢æ´æµå¨ç»ææ´æµå¼çµè¡¨çæµéæºæï¼åç»ååæµå¨åååå¨ï¼å°±å½¢ææµé交æµçµæµåçµåçå¤éç¨äº¤æµçµè¡¨ãå¤ç¨è¡¨å è¿å¸¦æçµæ± ï¼å½è¢«æµçµé»å¼ä¸åæ¶ï¼çµæ± 使æµéæºæå éè¿ä¸åæ°å¼ççµæµï¼ä»èåæ åºä¸åç被æµçµé»å¼ã转æ¢å¼å ³æ¯å¤ç¨è¡¨éæ©ä¸åæµéåè½åä¸åéç¨æ¶çåæ¢å 件ã
ç¨å¤ç¨è¡¨æµéçµé»çåççµè·¯è§å¾ãå½è¢«æµçµé»Rx=0æ¶,çµè·¯ä¸ççµæµæ大,è°èR使æµéæºææéçå转è§ä¸ºæ»¡å»åº¦å¼ï¼æ¤æ¶çµè·¯ä¸ççµæµå¼I0=E/Rãå½è¢«æµçµé»Rxå¢å¤§æ¶,çµæµI=E/(R+Rx)éæ¸åå°ï¼æéçå转è§ä¹åå°ãå æ¤å¤ç¨è¡¨è¡¨çä¸ççµé»å¼æ å°ºæ¯ååçï¼èä¸å»åº¦ä¸ååãè¥è¢«æµçµé»Rx=Rï¼åçµæµI=I0/2ï¼æéå转è§ä¸ºæ»¡å转è§çä¸åãå æ¤å»åº¦ä¸ç¹å¤ææ ççµé»å¼(称为ä¸å¼çµé»)å³ä¸ºè¯¥éç¨ä¸å¤ç¨è¡¨çå é»å¼ãé常çµé»å¼æ å°ºçææ读æ°èå´ä¸º0.1ï½åä¸å¼çµé»å¼ã
éççµåææ¯çä¸æè¿æ¥ï¼å¤ç¨è¡¨æ£éæ¥åæ°åå¼æ¹ååå±ã
å¶ä½çµåå¾ä¹¦ç¨ä»ä¹è½¯ä»¶ï¼
å¶ä½çµå书ç软件ä¹å¾å¤ï¼èä¸å¶ä½ä¸åæ ¼å¼ççµå书æéæ©ç软件ä¹ä¸åã
ç«éé¾æ¥ï¼è°æ¯ä¸ªä¸é«æ?ä¹å¤§çµå书å¶ä½å·¥å ·æ¨ªè¯
ç°å¨æ们ç¨ç½æå¿«ææ¥å第ä¸æ¬çµå书ï¼
软件å称ï¼ç½æå¿«æ(CyberArticle)
软件çæ¬ï¼V4.
软件大å°ï¼K
æææ¹å¼ï¼ç ´è§£ç
ä¸è½½å°å1ï¼/html/1 ... &pn=0&.html
注åç ï¼Name:ASWord Codeï¼FBF-Bï¼BCB1A9
ç¨e书工åºå¯ä»¥å¶ä½åºçé¢é常æ¼äº®ï¼åè½å¾å¼ºå¤§çexeæ ¼å¼çµå书æ¥ãä¸è½½å®è£ åæå¼e书工åºï¼
é¦å å°éæ©è¦å¶ä½çµå书çæ件ç®å½ï¼ç¶åå¨"ç®å½"éå°éè¦çæ件添å è¿æ¥ï¼æ³¨æä¸å®è¦ææ件添å å°ä¸é´çå表æ¡ä¸æ¥ï¼å¯ä»¥ç´æ¥ç¹å»"ä»æ件夹å建"æå°æ件ä¸ä¸ªä¸ä¸ªæè¿å»ãç¶åå¯ä»¥è°æ´å®ä»¬ç顺åºï¼æä¸é¢çæ¯çµå书çé¦é¡µ(å°±æ¯ä¸æå¼çµå书é¦å çå°çé£ä¸é¡µ)ã
ç¶åå¯ä»¥å¨å ¶å®é项å¡ä¸è®¾ç½®"éªå±"ã"çé¢"ã"å¾æ "ã"å·¥å ·æ "çï¼e书工åºæä¾äºé常强大çå®å¶åè½ï¼å¯ä»¥æé ä¸ä¸ªå¾æ个æ§ççé¢ååè½ã
æ好ç¹å»"ä¿å"ï¼å°å·¥ç¨ä¿å好åï¼ç¹å»"ç¼è¯"ï¼å°±å¯ä»¥ç¼è¯åºexeæ ¼å¼ççµå书äºã
注ï¼e书工åºæ个å¾å¤§çä¸è¶³ä¹å¤ï¼å°±æ¯å¯¼å ¥çææ¬ä¸è½èªå¨æ¢è¡ï¼å¯¼è´ååºççµå书é 读æä¸æ¹ä¾¿ãæ以æ好ä¸è¦ç´æ¥å¯¼å ¥ææ¬ï¼èæ¯åºè¯¥å 转æ¢æç½é¡µï¼åå¶ä½ãè¿æ ·ä¸ä» å¯ä»¥é¿å è¿ä¸ªé®é¢ï¼è¿è½ååºæ´å¥½çççµå书æ¥ã
C#è¯è¨åççµåç¸åç³»ç»
é¦å éè¦å¨å级ç®å½ä¸å»ºç«æ件夹FileSystem
//åå°ä»£ç :
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.IO;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
namespace WebShop
{
/// <summary>
/// filesystem çæè¦è¯´æã
/// </summary>
public class filesystem : System.Web.UI.Page
{
protected System.Web.UI.WebControls.LinkButton LinkButton1;
protected System.Web.UI.WebControls.DataList DataList1;
protected System.Web.UI.WebControls.Button Button3;
protected System.Web.UI.WebControls.Button Button1;
protected System.Web.UI.WebControls.TextBox TextBox1;
protected System.Web.UI.WebControls.Button Button2;
protected System.Web.UI.WebControls.Label Label2;
protected System.Web.UI.WebControls.Label Label1;
protected System.Web.UI.HtmlControls.HtmlInputFile fileFeild1;
private void Page_Load(object sender, System.EventArgs e)
{
if(!IsPostBack)
{
Bind();
}
}
private void Bind()
{
string initpath="";
if(Request["path"]==null)
{
initpath=Server.MapPath("FileSystem");
}
else
{
initpath=Request["path"];
}
this.Label1.Text=initpath;
DataTable dt=new DataTable();
DataColumn dc0=new DataColumn("Image",System.Type.GetType("System.String"));
dt.Columns.Add(dc0);
DataColumn dc1=new DataColumn("Name",System.Type.GetType("System.String"));
dt.Columns.Add(dc1);
DirectoryInfo di=new DirectoryInfo(this.Label1.Text);
DirectoryInfo[] dis=di.GetDirectories();
foreach(DirectoryInfo d in dis)
{
DataRow dr=dt.NewRow();
dr[0]="<a href='filesystem.aspx?path="+HttpUtility.UrlEncode(d.FullName,System.Text.Encoding.UTF8)+"'><img src='images/folder.gif' border=0/></a>";
dr[1]=d.Name;
dt.Rows.Add(dr);
}
FileInfo[] fis=di.GetFiles();
foreach(FileInfo f in fis)
{
string ex=f.Extension.ToLower();
if(ex==".jpg" || ex==".jpeg" || ex==".gif" || ex==".png" || ex==".bmp")
{
string fullname=f.FullName;
string urlpath=fullname.Substring(fullname.IndexOf("FileSystem"));
string url=HttpUtility.UrlEncode(urlpath,System.Text.Encoding.UTF8);
DataRow dr=dt.NewRow();
dr[0]="<a href='"+url+"' target='_blank'><img src='"+url+"' border=0 width= height=/></a>";
dr[1]=f.Name;
dt.Rows.Add(dr);
}
}
this.DataList1.DataSource=dt;
this.DataList1.DataBind();
}
#region Web çªä½è®¾è®¡å¨çæç代ç
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 该è°ç¨æ¯ ASP.NET Web çªä½è®¾è®¡å¨æå¿ éçã
//
InitializeComponent();
base.OnInit(e);
}
/// <summary>
/// 设计å¨æ¯ææéçæ¹æ³ - ä¸è¦ä½¿ç¨ä»£ç ç¼è¾å¨ä¿®æ¹
/// æ¤æ¹æ³çå 容ã
/// </summary>
private void InitializeComponent()
{
this.LinkButton1.Click += new System.EventHandler(this.LinkButton1_Click);
this.Button3.Click += new System.EventHandler(this.Button3_Click);
this.Button1.Click += new System.EventHandler(this.Button1_Click);
this.Button2.Click += new System.EventHandler(this.Button2_Click);
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
private void LinkButton1_Click(object sender, System.EventArgs e)
{
string Parent=Directory.GetParent(this.Label1.Text).ToString();
if(Parent.IndexOf("FileSystem")>-1)
{
Response.Redirect("filesystem.aspx?path="+Parent);
}
else
{
return;
}
}
private void Button1_Click(object sender, System.EventArgs e)
{
HttpPostedFile hpf=this.fileFeild1.PostedFile;
string ClientPath=hpf.FileName;
string filename=Path.GetFileName(ClientPath);
string ex=Path.GetExtension(filename);
if(ex==".jpg" || ex==".jpeg" || ex==".gif" || ex==".png" || ex==".bmp")
{
string SavePath=this.Label1.Text+"\\"+filename;
hpf.SaveAs(SavePath);
Bind();
}
else
{
Response.Write(Tools.GetAlertJS("æä¸ä¼ çå¾çæ ¼å¼ä¸æ£ç¡®ï¼"));
return;
}
}
private void Button2_Click(object sender, System.EventArgs e)
{
string filename=this.TextBox1.Text;
Directory.CreateDirectory(this.Label1.Text+"\\"+filename);
Bind();
}
private void Button3_Click(object sender, System.EventArgs e)
{
for(int i=0;i<this.DataList1.Items.Count;i++)
{
if(((CheckBox)this.DataList1.Items[i].FindControl("CheckBox1")).Checked)
{
int index=this.DataList1.Items[i].ItemIndex;
string filePath=this.Label1.Text+"\\"+this.DataList1.DataKeys[index].ToString();
if(Directory.Exists(filePath))
{
Directory.Delete(filePath,true);
}
if(File.Exists(filePath))
{
File.Delete(filePath);
}
Bind();
}
}
}
}
}
åå°é¡µé¢:
<%@ Page language="c#" Codebehind="filesystem.aspx.cs" AutoEventWireup="false" Inherits="WebShop.filesystem" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
<HEAD>
<title>filesystem</title>
<meta content="Microsoft Visual Studio .NET 7.1" name="GENERATOR">
<meta content="C#" name="CODE_LANGUAGE">
<meta content="JavaScript" name="vs_defaultClientScript">
<meta content="pm 的安装。这个步骤对于构建任何基于 Vue 的项目都是基础要求,确保这些依赖环境的正确部署是启动项目的关键。有了基本环境后,通过在命令行工具或 VSCode 编辑器中执行命令“vue ui”,可以自动启动 Vue 的构建工具界面。在这里,开发者可以按照界面提示进行项目的创建与配置,灵活选择所需的组件和功能。例如,可以选择 Vue 的版本、添加路由和 Vuex 等核心功能,满足项目的具体需求。
构建完成之后,只需通过插件管理中查找并安装“electron-builder”插件,即可让 Vue 项目拥有跨平台支持的能力。通过选择和安装此插件,开发者能够将 Vue 项目轻松转换为具备跨平台兼容性的 Electron 应用,实现了代码共用,减少了不同平台上的重复开发工作。
在运行项目时,开发者可以选择直接运行源代码版本进行调试,或利用“electron-builder”进行项目打包,生成针对 Windows、Mac 或 Linux 等操作系统优化后的 exe 文件。这一过程可能涉及一些环境兼容性检查和错误处理,如电子引擎的正确安装等。在遇到错误时,确保 cmd 设置为 utf-8 编码,以及定期检查和更新项目依赖,是避免乱码问题和确保代码运行流畅的有效措施。
为实现更加高效的工作流程和更好的开发体验,推荐在项目的根目录下设置一个 `vue.config.js` 文件。这个文件允许自定义一系列与构建环境相关的配置选项,包括构建选项、构建目标、或自定义环境变量等。通过这种方式,开发者能够更加灵活地调整和优化项目的构建过程,特别是在结合 Node.js 的场景下,能够显著提升开发效率。
在最终部署前,可参考作者提供的文档或直接访问其 GitHub 地址获取详细的项目操作指南,确保所有配置正确无误,并顺利完成项目发布。除了本文的指导外,开发团队还可以关注作者的官方公众号和 CSDN 博客,获取最新资讯、实战技巧和社区支持,为项目开发工作提供持续的资源和信息支持。