-
Notifications
You must be signed in to change notification settings - Fork 10
/
daily_tips.txt
793 lines (475 loc) · 26.9 KB
/
daily_tips.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
Windows IOCP AccepteEx() 的一些技巧:
http://stackoverflow.com/questions/19956186/iocp-acceptex-not-creating-completion-upon-connect
Call setsockopt() with SO_UPDATE_ACCEPT_CONTEXT on the accepted socket using the listening socket as the data...
If you do not want AcceptEx() to wait for data to arrive then simply provide a data buffer that is ONLY big enough for the addresses to be returned and pass 0 as the 'buffer size'. This will cause the AcceptEx() to operate like an overlaped accept() and return as soon as the connection is established.
Note that Martin James' initial comment to your question is in fact the answer you're looking for. Don't pass outBufLen - ((sizeof (sockaddr_in) + 16) * 2), pass 0.
See:
Boost 1.60
--------------
--------------------------------------------------------------------------------------------------
D:\Project\Boost\boost_1_60_0\boost\asio\detail\impl\win_iocp_socket_service_base.ipp
Line 473:
void win_iocp_socket_service_base::start_accept_op()
DWORD bytes_read = 0;
BOOL result = ::AcceptEx(impl.socket_, new_socket.get(), output_buffer,
0, address_length, address_length, &bytes_read, op);
--------------------------------------------------------------------------------------------------
D:\Project\Boost\boost_1_60_0\boost\asio\detail\impl\socket_ops.ipp
Line 179:
complete_iocp_accept()
// Need to set the SO_UPDATE_ACCEPT_CONTEXT option so that getsockname
// and getpeername will work on the accepted socket.
SOCKET update_ctx_param = s;
socket_ops::state_type state = 0;
socket_ops::setsockopt(new_socket, state,
SOL_SOCKET, SO_UPDATE_ACCEPT_CONTEXT,
&update_ctx_param, sizeof(SOCKET), ec);
--------------------------------------------------------------------------------------------------
h2o/picohttpparser / SSE 4.2 _mm_cmpestri
https://github.com/h2o/picohttpparser/blob/master/picohttpparser.c
_mm_cmpestri
See: https://msdn.microsoft.com/en-us/library/bb531465(v=vs.120).aspx
_mm_cmpestra (Have example code)
See: https://msdn.microsoft.com/en-us/library/bb514048(v=vs.120).aspx
--------------------------------------------------------------------------------------------------
Java 线程 — ThreadLocal (关于Java TLS的挺有建设性的一篇文章)
=================================================================
See: http://www.cnblogs.com/sunshine-2015/p/6072184.html
神奇的 0x61c88647
-------------------
在ThreadLocalMap的hash算法中,很少发生碰撞,原因在于精巧的hash算法
private final int threadLocalHashCode = nextHashCode();
private static final int HASH_INCREMENT = 0x61c88647;
private static int nextHashCode() {
return nextHashCode.getAndAdd(HASH_INCREMENT);
}
private Entry getEntry(ThreadLocal key) {
int i = key.threadLocalHashCode & (table.length - 1);
Entry e = table[i];
if (e != null && e.get() == key)
return e;
else
return getEntryAfterMiss(key, i, e);
}
这里最不解的是为什么要用0x61c88647这个数?怎么来的?
0x61c88647换算成十进制是1640531527,计算方法如下:
1640531527 = (long) ((1L << 31) * (Math.sqrt(5) - 1))
(Math.sqrt(5) - 1) / 2 是黄金分割数
这种hash方法是Donald Knuth在 The Art of Computer Programming 中提出,不明觉厉。
--------------------------------------------------------------------------------------------------
ImageNet缔造者:让冰冷的机器读懂照片背后的故事
李飞飞
http://www.leiphone.com/news/201604/uD8o9lV0AhJRhcit.html
--------------------------------------------------------------------------------------------------
手机VR软件大横评:想看羞羞视频?这几个最好用
http://mt.sohu.com/20161101/n471983244.shtml
编者注:此次入选评测的是 “暴风魔镜Pro、3D播播、三目VR、橙子VR、3D热播、3D播播、VR世界、第一VR、VR800、柚看VR、微鲸VR、乐视VR、脑穿越VR和妙境”这十四款主流的手机VR软件。为了保证数据的统一性和严谨性,相关数据基于Android 平台测试。
--------------------------------------------------------------------------------------------------
为什么多线程读写 shared_ptr 要加锁?(陈硕)
http://blog.csdn.net/solstice/article/details/8547547
(shared_ptr)的引用计数本身是安全且无锁的,但对象的读写则不是,因为 shared_ptr 有两个数据成员,读写操作不能原子化。根据文档( http://www.boost.org/doc/libs/release/libs/smart_ptr/shared_ptr.htm#ThreadSafety ), shared_ptr 的线程安全级别和内建类型、标准库容器、std::string 一样,即:
• 一个 shared_ptr 对象实体可被多个线程同时读取(文档例1);
• 两个 shared_ptr 对象实体可以被两个线程同时写入(例2),“析构”算写操作;
• 如果要从多个线程读写同一个 shared_ptr 对象,那么需要加锁(例3~5)。
请注意,以上是 shared_ptr 对象本身的线程安全级别,不是它管理的对象的线程安全级别。
--------------------------------------------------------------------------------------------------
【C++ & 汇编】try-catch异常处理机制的汇编实现
https://my.oschina.net/ybusad/blog/186545
介绍 C++ 中 try-catch 异常处理机制的汇编实现。
--------------------------------------------------------------------------------------------------
C++ 异常
http://blog.csdn.net/chenlycly/article/details/44871061
关于 C++ 异常的使用,注意事项等,还算全面,未包含 C++ 11 以后的内容。
--------------------------------------------------------------------------------------------------
怎么在 C++ 里实现一个常量表达式的计数器
How to implement a constant-expression counter in C++
http://b.atch.se/posts/constexpr-counter/
Non-constant constant-expressions in C++
http://b.atch.se/posts/non-constant-constant-expressions/
经过两篇文章的阅读, 基本掌握了原理, 下面是 purecpp.org 上的摘录, 此方法在 vc++ 上存在问题, vc++ 版本请看上面的两篇文章.
http://purecpp.org/?p=1144
2017/2/14
--------------------------------------------------------------------------------------------------
Is it possible to obtain the address of a implicit instantiation of a function template?
http://stackoverflow.com/questions/29522800/is-it-possible-to-obtain-the-address-of-a-implicit-instantiation-of-a-function-t
Answer1:
auto callable = +[](A<int> a, A<int> b) { return hello(a, b); };
Answer2:
原版的代码请看原文, 下面是经过本人略做修改后的代码(修改模板参数名称,更容易理解一点):
#include <functional>
#include <iostream>
template <class A>
void func(A a, int b)
{
std::cout << "a=" << a << " b=" << b << "\n";
}
template <typename... Args>
class proxy_func
{
public:
static auto call(Args... args) -> decltype(func(args...))
{
return func(args...);
}
};
template <template <typename...> typename Proxy, typename... Args>
void * addr_of(Args... args)
{
return (void *)&Proxy<Args...>::call;
}
template <template <typename...> typename Proxy, typename... Args>
auto call(Args... args) -> decltype(Proxy<Args...>::call(args...))
{
return Proxy<Args...>::call(args...);
}
template <class T>
void test()
{
T value = 1;
printf("func > %p\n", &func<T>);
printf("func > ");
func(value, 1);
printf("proxy> %p\n", &proxy_func<T, int>::call);
printf("proxy> ");
proxy_func<T, int>::call(value, 1);
printf("auto > %p\n", addr_of<proxy_func>(value, 1));
printf("auto > ");
call<proxy_func>(value, 1);
}
int main(int argc, char ** argv)
{
printf("==int==\n");
test<int>();
printf("==long==\n");
test<long>();
}
result:
g++ -std=c++11 -o /tmp/test /tmp/test.cpp && /tmp/test
==int==
func > 0x400a8d
func > a=1 b=1
proxy> 0x400ae6
proxy> a=1 b=1
auto > 0x400ae6
auto > a=1 b=1
==long==
func > 0x400b35
func > a=1 b=1
proxy> 0x400b91
proxy> a=1 b=1
auto > 0x400b91
auto > a=1 b=1
补充: (用宏实现定义不同的 proxy_func 类)
#define proxy_func(f) \
template <class... A> \
class proxy_func_ ## f \
{ \
public: \
static auto call(A... args) -> decltype(f(args...)) \
{ \
return f(args...); \
} \
}
proxy_func(func);
2017/2/14
--------------------------------------------------------------------------------------------------
Try catch statements in C
http://stackoverflow.com/questions/10586003/try-catch-statements-in-c
While some of the other answers have covered the simple cases using setjmp and longjmp, in a real application there's two concerns that really matter.
1. Nesting of try/catch blocks. Using a single global variable for your jmp_buf will make these not work.
2. Threading. A single global variable for you jmp_buf will cause all kinds of pain in this situation.
The solution to these is to maintain a thread-local stack of jmp_buf that get updated as you go. (I think this is what lua uses internally).
So instead of this (from JaredPar's awesome answer)
static jmp_buf s_jumpBuffer;
void Example() {
if (setjmp(s_jumpBuffer)) {
// The longjmp was executed and returned control here
printf("Exception happened\n");
} else {
// Normal code execution starts here
Test();
}
}
void Test() {
// Rough equivalent of `throw`
longjump(s_jumpBuffer, 42);
}
You'd use something like:
#define MAX_EXCEPTION_DEPTH 32;
struct exception_state {
int current_depth;
jmp_buf jumpBuffer[MAX_EXCEPTION_DEPTH];
};
__thread struct exception_state g_exception_state;
int try_point(struct exception_state * state) {
if(current_depth == MAX_EXCEPTION_DEPTH) {
abort();
}
int ok = setjmp(state->jumpBuffer[state->current_depth]);
if(ok) {
state->current_depth++;
} else {
// We've had an exception update the stack.
state->current_depth--;
}
return ok;
}
void catch_point(struct exception_state * state) {
state->current_depth--;
}
void end_try_point(struct exception_state * state) {
state->current_depth--;
}
void throw_exception(struct exception_state * state) {
longjump(state->jumpBuffer[state->current_depth - 1], 1);
}
void Example() {
if (try_point(&g_exception_state)) {
catch_point(&g_exception_state);
printf("Exception happened\n");
} else {
// Normal code execution starts here
Test();
end_try_point(&g_exception_state);
}
}
void Test() {
// Rough equivalent of `throw`
throw_exception(g_exception_state);
}
2017/2/14
--------------------------------------------------------------------------------------------------
使用 Let's Encrypt 和 Nginx 从同一服务器托管多个 HTTPS 域名 (翻译)
https://www.oschina.net/translate/running-multiple-https-domains-from-the-same-server
Let's Encrypt 证书自动续签脚本
/etc/letsencrypt/auto_renew.sh
#!/bin/sh
# This script renews all the Let's Encrypt certificates with a validity < 30 days
if ! /opt/letsencrypt/letsencrypt-auto renew > /var/log/letsencrypt/renew.log 2>&1 ; then
echo Automated renewal failed:
cat /var/log/letsencrypt/renew.log
exit 1
fi
nginx -t && nginx -s reload
现在将以上的脚本添加到计划任务, 执行 sudo crontab -e 添加下面一行代码:
@daily /etc/letsencrypt/auto_renew.sh
-------------------------------------------
原文链接:
Hosting Multiple HTTPS Domains from the Same Server with Let's Encrypt and Nginx
https://blog.benroux.me/running-multiple-https-domains-from-the-same-server/
--------------------------------------------------------------------------------------------------
EXACT STRING MATCHING ALGORITHMS (比较全面的字符串匹配算法介绍, 英文, 来自法国的网站)
http://www-igm.univ-mlv.fr/~lecroq/string
字符串匹配的KMP算法
http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html
字符串匹配的Boyer-Moore算法
http://www.ruanyifeng.com/blog/2013/05/boyer-moore_string_search_algorithm.html
--------------------------------------------------------------------------------------------------
String Matching
http://www.csie.ntnu.edu.tw/~u91029/StringMatching.html
一个台湾教育网的网站,从 http://www-igm.univ-mlv.fr/~lecroq/string 翻译整理而来,加上自己的理解,有一定的参考价值。
--------------------------------------------------------------------------------------------------
字符串模式匹配算法——BM、Horspool、Sunday、KMP、KR、AC算法一网打尽
http://dsqiu.iteye.com/blog/1700312
这个文章还算有一些参考价值, 可以一看.
-------------------------------------------
字符串匹配算法
http://www.cnblogs.com/gaochundong/p/string_matching.html
只介绍了朴素算法, KMP 和 BoyerMoore 算法, 参考价值一般.
--------------------------------------------------------------------------------------------------
敏感词项目中的柔性字符串匹配问题 (介绍了 KMP, BM, Horspool 算法, 多字符串匹配, 自动机等)
http://guokr.github.io/pattern-matching-problem.html
(C) 2015 果壳网平台组
--------------------------------------------------------------------------------------------------
怎么在 C++ 里实现一个常量表达式的计数器 (其实这个前面贴过,再贴一次)
How to implement a constant-expression counter in C++
http://b.atch.se/posts/constexpr-counter/
Non-constant constant-expressions in C++
http://b.atch.se/posts/non-constant-constant-expressions/
--------------------------------------------------------------------------------------------------
写代码用哪种字体看起来最舒适?
https://www.zhihu.com/question/32058777?sort=created
其中推荐的字体有:
Consolas, Roboto Mono, Monaco, Menlo, Ubuntu Mono, Fira Code, Inconsolata-g
注: Menlo 字体有点瘦长, 不够好; Roboto Mono 字体不错.
------------------------------------------
Fira Code, 还有一种是 Fira Mono.
https://www.fontsquirrel.com/fonts/fira-code
https://www.fontsquirrel.com/fonts/fira-mono
--------------------------------------------------------------------------------------------------
Hack Font 字体 (这个字体不错)
Hack 是一种专门用来显示编程语言的字体。
官方更新地址:
https://github.com/chrissimpkins/Hack
介绍文章:
https://www.oschina.net/p/hack-font
--------------------------------------------------------------------------------------------------
漂亮的等宽字体 Inconsolata
Inconsolata 是一款看起来很漂亮的 monospace font(等宽字体),尤其适合在终端下和写代码的朋友使用。
官方地址:
https://github.com/google/fonts/tree/master/ofl/inconsolata
下载链接:
http://www.levien.com/type/myfonts/inconsolata.html
Windows 系统下载:.otf 格式文件
Linux 系统下载: .pfa 格式文件
--------------------------------------------------------------------------------------------------
Inconsolata-g 字体 (这个字体比 Inconsolata 好看,Inconsolata 有点瘦长)
https://github.com/powerline/fonts/tree/master/Inconsolata-g
--------------------------------------------------------------------------------------------------
Luxi Mono 字体 (还可以)
如果你很喜欢 Mac 的 Lucida Font(应该说是这个系列里面的 Lucida Grande), 但是,你又不愿意侵权复制来使用。这样可以考虑用 Luxi Font,Luxi Font 字形和 Lucida Font 类似,而且在 Linux 下,Luxi Font 的大小比 Lucida Font 更加适合~
最最最重要的是 Luxi Font 是免费的~ 可以随便使用,但是不能修改~ 这个字体的作者是: Kris Holmes 和 Charles Bigelow。 Lucida Font 就是他们的前作~ 很意外, 所以,Luxi 和 Lucida 是兄弟来的哦~ 可见 Luxi 的高质量啦~
https://www.oschina.net/p/luxi
下载地址:
https://www.fontsquirrel.com/fonts/Luxi-Mono
--------------------------------------------------------------------------------------------------
最适合程序员编程的10款字体
https://my.oschina.net/weichou/blog/359860
排名如下:
1. Inconsolata (还不如 Inconsolata-g, 排第一完全是由于作者个人喜欢)
2. Consolas (字体大小为11时, 效果不错, 行间距比一般的字体稍大)
3. Deja Vu Sans Mono (比 Droid Sans Mono 稍差一点, 两者很相似)
4. Droid Sans Mono (还不错, 比第 3 的好那么一点)
5. Proggy
6. Monofur
7. Profont
8. Monaco (Mac的默认字体, 还不错, 但缺点(特点)是行间距比较大)
9. Andale Mono
10. Courier / Courier New (以前觉得还不错, 现在看的确不是最好的选择)
具体可看帖子。
我个人的排名是:
1. Consolas
2. Roboto Mono
3. Droid Sans Mono
4. HackFont
5. Deja Vu Sans Mono
6. 宋体/新宋体
7. Monaco
8. Fira Code/Fira Mono
9. Menlo
10. Inconsolata-g
11. Courier / Courier New
以上排名其实很难排的, 大体排名是这样, 当下会使用哪一个, 得看当时的心情和当下能忍受/接受某个字体缺点的程度,
人的想法是会变的, 或许显示屏大小和点距大小也有所不同.
几个基本的原则就是: 等宽, 字体美观, 清晰好辨认, 0, o, 1, i 容易区分, 行间距适中,
字体不要太瘦长(本人不太喜欢瘦长的字体, 也许有的人喜欢).
原帖地址:(原帖图片已失效)
http://blog.csdn.net/huangliangjie/article/details/6774356
--------------------------------------------------------------------------------------------------
全局压缩-革命性的数据库技术 (奏爷公司的主页)
http://nark.cc/
nark 数据库
--------------------------------------------------------------------------------------------------
Shell学习总结之逻辑运算符及表达式 (一个还不错的关于 Shell 逻辑运算符和表达式的文章,很早之前搜到的)
http://blog.csdn.net/wirelessqa/article/details/19758479
2017/4/19
--------------------------------------------------------------------------------------------------
The Undocumented Functions (Microsoft Windows NT/2000/XP/Win7)
Currently includes: UserMode (Kernel Mode soon)
This is an advanced, low-level programer's guide to Windows NT Kernel, Native API and drivers.
All remarks, fixes and comments are very welcome.
(Windows NT/2000/XP/Win7 未公开的函数,目前只包含用户态的函数)
http://undocumented.ntinternals.net/index.html?page=title.html
--------------------------------------------------------------------------------------------------
FileSpy (一个监控文件系统驱动IRP等请求的工具)
http://www.zezula.net/en/fstools/filespy.html
FileTest (张文骁推荐)
A tool for interactive calling file system APIs (一个调用系统文件系统API函数的交互工具, 有源码)
http://www.zezula.net/en/fstools/filetest.html
源码: https://github.com/ladislav-zezula/FileTest
--------------------------------------------------------------------------------------------------
Spying a file system (一个利用系统API接口获得文件系统的一些常规消息通知的源码)
https://www.codeproject.com/Articles/4997/Spying-a-file-system
-----------------------------------------------------------------------
Introduction
Windows applications can do dynamic monitoring of any specified directory. Once changes have occurred and are detected, the spy application can run various tasks ( run antivirus, log activity, determine more information about changes, call other tasks etc).
Win 32 API provides three functions that are based on the events:
FindFirstChangeNotification
FindNextChangeNotification
FindCloseChangeNotification
ReadDirectoryChangesW
These allow creating watchdog or spying applications.
-----------------------------------------------------------------------
Win32 API provides also ReadDirectoryChangesW that can operate with following filters (MSDN) :
* FILE_NOTIFY_CHANGE_FILE_NAME
Any file name change in the watched directory or subtree causes a change notification wait operation to return. Changes include renaming, creating, or deleting a file.
* FILE_NOTIFY_CHANGE_DIR_NAME
Any directory-name change in the watched directory or subtree causes a change notification wait operation to return. Changes include creating or deleting a directory.
* FILE_NOTIFY_CHANGE_ATTRIBUTES
Any attribute change in the watched directory or subtree causes a change notification wait operation to return.
* FILE_NOTIFY_CHANGE_SIZE
Any file-size change in the watched directory or subtree causes a change notification wait operation to return. The operating system detects a change in file size only when the file is written to the disk. For operating systems that use extensive caching, detection occurs only when the cache is sufficiently flushed.
* FILE_NOTIFY_CHANGE_LAST_WRITE
Any change to the last write-time of files in the watched directory or subtree causes a change notification wait operation to return. The operating system detects a change to the last write-time only when the file is written to the disk. For operating systems that use extensive caching, detection occurs only when the cache is sufficiently flushed.
* FILE_NOTIFY_CHANGE_LAST_ACCESS
Any change to the last access time of files in the watched directory or subtree causes a change notification wait operation to return.
* FILE_NOTIFY_CHANGE_CREATION
Any change to the creation time of files in the watched directory or subtree causes a change notification wait operation to return.
* FILE_NOTIFY_CHANGE_SECURITY
Any security-descriptor change in the watched directory or subtree causes a change notification wait operation to return.
--------------------------------------------------------------------------------------------------
How to translate a virtual memory address to a physical address?
http://stackoverflow.com/questions/366602/how-to-translate-a-virtual-memory-address-to-a-physical-address
关于在内核态如果从虚拟内存地址转换为物理内存地址.
--------------------------------------------------------------------------------------------------
NtQueryVirtualMemory 枚举进程模块
http://www.cnblogs.com/icew4y/p/3694984.html
使用 NtQueryVirtualMemory() 函数在用户态驱动里枚举进程引用的所有模块.
通过 KeServiceDescriptorTable 获取 NtQueryVirtualMemory() 的函数入口地址.
NtQueryVirtualMemory = (PNtQueryVirtualMemory)KeServiceDescriptorTable->ntoskrnl.ServiceTableBase[uIndex];
--------------------------------------------------------------------------------------------------
SSDT, Shadow SSDT HOOK 进程防护
http://www.cnblogs.com/icew4y/p/3639064.html
模仿 PCHunter,利用 SSSDT, SSDT HOOK 来对进程进行防护, 例如: Hook NtUserFindWindowEx(), NtUserPostMessage(), NtUserDestroyWindow() 函数.
--------------------------------------------------------------------------------------------------
我后十年的技术路
http://www.yiiyee.cn/Blog/%E5%8D%81%E5%B9%B4/
《竹林蹊径》的作者张佩,2010年编写《竹林蹊径》,后在 ADM 工作,两年前,在Intel开源部门参与GPU虚拟化之开发至今。17年新年伊始,立志要在技术内容创作分享上,重新发力。
这篇文章写于 2015 年 6 月 12 日,对过去驱动开发的一些反思。
--------------------------------------------------------------------------------------------------
全局观Windows BCD
http://www.yiiyee.cn/Blog/bcd-1/
这是一篇解读 Windows 的 bcdedit 的深度好文。
--------------------------------------------------------------------------------------------------
GPU异步V-Sync技术方案
http://www.yiiyee.cn/Blog/vsync/
--------------------------------------------------------------------------------------------------
NSIS 静默安装VC运行库安装包
http://blog.csdn.net/wwwwxhh/article/details/55210882
ExecWait 'vcredist_x86.exe' # 一般的安装
ExecWait '"vcredist_x86.exe" /q' # silent install 静默安装
ExecWait '"vcredist_x86.exe" /q:a' # silent install, display a progress dialog but requires no user interaction.
ExecWait '"vcredist_x86.exe" /qb' # unattended install 无人值守安装
ExecWait 'vcredist_x86.exe /q:a /c:"msiexec /i vcredist.msi /qb! /l*v $TEMP\vcredist_x86.log" ' # suppress all UI during installation.
--------------------------------------------------------------------------------------------------
RocketMQ实战(一)
http://www.jianshu.com/p/3afd610a8f7d
RocketMQ实战(二)
http://www.jianshu.com/p/790d6bc4a1c1
RocketMQ实战(三):分布式事务
http://www.jianshu.com/p/53324ea2df92
RocketMQ实战(四)
http://www.jianshu.com/p/6868ddceaa5b
--------------------------------------------------------------------------------------------------
reactos 源码
https://download.reactos.org/reactos/ReactOS/0.4.4/
ntoskrnl.exe -- /ntoskrnl/ps/query.c 源码
NtQueryInformationProcess()
https://doxygen.reactos.org/d8/d22/ntoskrnl_2ps_2query_8c_source.html
--------------------------------------------------------------------------------------------------
hde64 64位汇编引擎(源码)
http://svn.saurik.com/repos/menes/branches/mobilesubstrate-3.1/
--------------------------------------------------------------------------------------------------
QT信号槽的六个优点
http://www.cnblogs.com/findumars/p/6283424.html
QT 信号槽(分类)
http://www.cnblogs.com/findumars/category/727798.html
--------------------------------------------------------------------------------------------------
使用 Java 构建微服务
http://www.oschina.net/news/67899/use-java-to-build-micro-services
快速浏览
在Java生态中,构建微服务的策略包括 Container-less,Self-contained,以及 In-container 等。
1. Container-less 微服务将应用及其依赖打包成一个单一的jar文件。
2. Self-contained 微服务也是打包成一个单一的Jar文件,但它还包括一个嵌入式框架,这个框架含有可选的第三方lib,当然这些lib是兼容的。
3. In-container 微服务打包成一个完整的Java EE容器,该服务在Docker镜像中实现。基于微服务的架构给架构师和开发者带来了新的挑战,然而,随着语言的升级和工具数量的增加,开发者和架构师完全有能力应对这样的挑战。Java也不例外,本文探讨了在Java生态系统内构建微服务的不同方法。
--------------------------------------------------------------------------------------------------