??xml version="1.0" encoding="utf-8" standalone="yes"?>福彩快乐12开奖结果:BlogJava - 四川福利彩票快乐12快乐12开奖直播快乐12开奖辽宁福彩快乐12快乐彩12选5走势图//www.ot7t.com.cn/all专注于Java技?/description>zh-cnMon, 10 Dec 2018 13:34:04 GMTMon, 10 Dec 2018 13:34:04 GMT60 达达O2O后台架构演进实践:从0?000高并发请求背后的努力 - 四川福利彩票快乐12快乐12开奖直播快乐12开奖辽宁福彩快乐12快乐彩12选5走势图//www.ot7t.com.cn/jb2011/archive/2018/12/10/433542.htmlJack JiangJack JiangMon, 10 Dec 2018 11:32:00 GMT//www.ot7t.com.cn/jb2011/archive/2018/12/10/433542.html//www.ot7t.com.cn/jb2011/comments/433542.html//www.ot7t.com.cn/jb2011/archive/2018/12/10/433542.html#Feedback0//www.ot7t.com.cn/jb2011/comments/commentRss/433542.html//www.ot7t.com.cn/jb2011/services/trackbacks/433542.html阅读全文

Jack Jiang 2018-12-10 19:32 发表评论
]]>
node js后台运行 - 四川福利彩票快乐12快乐12开奖直播快乐12开奖辽宁福彩快乐12快乐彩12选5走势图//www.ot7t.com.cn/lhbjava/archive/2018/12/10/433540.html林的林的Mon, 10 Dec 2018 04:54:00 GMT//www.ot7t.com.cn/lhbjava/archive/2018/12/10/433540.html//www.ot7t.com.cn/lhbjava/comments/433540.html//www.ot7t.com.cn/lhbjava/archive/2018/12/10/433540.html#Feedback0//www.ot7t.com.cn/lhbjava/comments/commentRss/433540.html//www.ot7t.com.cn/lhbjava/services/trackbacks/433540.html阅读全文

林的 2018-12-10 12:54 发表评论
]]>
深度剖析右值、右值引用、完美转发等相关概念 - 四川福利彩票快乐12快乐12开奖直播快乐12开奖辽宁福彩快乐12快乐彩12选5走势图//www.ot7t.com.cn/bacoo/archive/2018/12/06/433537.htmlso trueso trueThu, 06 Dec 2018 03:38:00 GMT//www.ot7t.com.cn/bacoo/archive/2018/12/06/433537.html//www.ot7t.com.cn/bacoo/comments/433537.html//www.ot7t.com.cn/bacoo/archive/2018/12/06/433537.html#Feedback0//www.ot7t.com.cn/bacoo/comments/commentRss/433537.html//www.ot7t.com.cn/bacoo/services/trackbacks/433537.html右值、右值引用(T&&)、std::move、完美转发(std::forward)、通用引用(universal reference)、引用折叠(reference collapsing)这些概念貌似很玄,但其实很它们想做的事情很简单而且很单一,抓住本质就豁然开朗了?/div>
上面这些概念的引入完全是为了解决一个问题:尽可能用浅拷贝代替深拷贝;具体该如何实施呢:
1. 定义move constructor或move operator=,如果你新定义的类没有move constructor或move operator=,那根本就用不上上面那些高级的概念;
2. 告诉编译器什么时候用move constructor(而不是用copy constructor),这就需要借助std::move来把左值转成右值;
下面是一些零散的箴言?/div>
左值:能用&来取地址的东西(有名字的都是左值,不管其是否是const的,而且引用都是左值,因为引用肯定得起个名字去引用另外一个东西)?/div>
右值:不能?amp;来取地址的东西(说白了就是没名字的东西,例如函数的返回值)?/div>
const T&是万能引用,?const T& t = XXX; //XXX是左值、右值都可以?/div>
T& t = XXX; //XXX必须是左值;
T&& t = XXX; //XXX必须是右值;
const T&& t = XXX; //XXX必须是右值;
不要把T&&和const T&划等号,两个都能hold住临时变量,给临时变量续命,但:
T&& t1 = get_val();
const T& t2 = get_val();
t1和t2都是左值,因为都可以用&来取地址,但t1是非const的,因此可以t1.xxx = yyy;去修改t1里的内容(当然如果你定义const T&& t1 = get_val(),那就不能更改了),这样一来,下面这种代码受益了:
    string name = get_name(); //因为后面要修改name,所以不能用const string& name
    trim(name);
    可以修改为:
    string&& name = get_name();
    trim(name);
    
关于右值引用的生命周期(续命能续多久,下面讨论的也适用于const T&):
1. 函数不能返回对局部变量的引用(右值引用也不行),这是铁的原则?/div>
2. 引用一旦建立(用一个名字hold住了临时变量),例如T&& t = get_val();那么这个临时变量的析构时机就是变量t退出其作用域的时候,因此下面的代码是错误的:
    struct A {
        A(T&& t): _t(t) {};
        T&& _t;
    };
    A* pa = NULL;
    {
        T&& t = get_val();
        pa = new A(t);
    }
    pa->_t; //runtime crash, _t已经析构?/div>
    
std::move只做一件事:把左值转成右值,因此T t(std::move(get_val()));不管什么情况下都能保证调用move constructor来构造t?/div>
c++0x里stl的各种容器都已经新增了move constructor,因此当你希望使用浅拷贝的时候可以借助std::move来达成所愿了,至于什么时候可以用浅拷贝,分两种情况,有些情况编译器会默认帮你去调用move constructor,但在你自己新定义的函数或者类成员方法里就需要你自己来判断了,大的原则就是:这个变量只是传递过去就好,中间可以转好几道手,但在传递过程中不需要做修改?/div>
完美转发(std::forward),谈到这个就必须得谈到通用引用(universal reference)、引用折叠(reference collapsing),其实这几个概念是捆绑在一起的,而且只用在模板范畴内,而且只是为了解决下面这一种模式:
template <typename T>
void func2(T t) {
}
template <typename T>
void func(T&& t) {
    func2(std::forward<T>(t));
}
上面这个到底完美在哪里?
func(get_val()); //这个会导致最后是通过move constructor来构造func2函数里的参数t
T t0 = get_val();
T& t1 = t0;
const T& t2 = get_val();
T&& t3 = get_val();
const T&& t4 = get_val();
func(t0); func(t1); func(t2); func(t3); func(t4); //?个都会导致最后是通过copy constructor来构造func2函数里的参数t,因为这?个t*都是左值(有名字的就是左值)?/div>
    插播两个你有可能费解的地方:
    1. func函数的参数是T&&, t0、t1都是左值,不是说不能用左值赋值给右值吗?这就要提到引用折叠了(详情可参见最后我推荐的文章),说白了因为func是个模板函数才能这么干;
    2. t3类型是T&&,func的参数也是T&&,把t3传递过去,居然还是调用copy contructor,因为t3是右值引用,它引用了一个右值,但它本身却是左值,到了func函数内部,func函数只能知道它是个左值,了解不到它原本的面貌居然是个右值引用;如果还不理解,再看下下面?/div>
    template <typename T>
    void print(T t) {
    }
    int x1 = 1; int& x2 = x1; const int& x3 = x1; int* x4 = &x1;
    分别用x{1..4}来调用print方法,你肯定知道x1、x2、x3到了print函数里,T就是int,只有x4会被print函数认为T是int*,引用这个概念在模板类型推导时是无法让模板参数感知到的;此外print(T)和print(T&)是不能同定义的,编译器会抱怨ambiguous,这个事实也能帮你多一些理解?/div>
如果想让上面的这5个最终能通过move constructor来构造func2函数里的参数t,那么只要给每个都用func(std::move(t*))包装下就可以了;
再澄清下,func2函数的参数是类型T,并不是引用,因此无论如何都需要生成T的一个新实例,区别就是到底是通过copy constructor还是move constructor来生成了?/div>
所以,所谓的完美就是体现在了forward能把本来是左值的按左值来传递,本来是右值的按照右值来传递,具体来说就是作为中间环节的func函数内部实现过程中使用了func2(std::forward<T>(t));这句话,使得可以按照调用方实际的真实情况告知给func2函数如何构造参数t,这有什么好处呢,还是那句话:在适当的时机做合适的引导,让编译器帮你调用浅拷贝?/div>
除此之外,你完全可以忘掉这些玄乎其神的概念,所以只要会套用就可以了?/div>
以上是一些梗概性或结论性的东西,再结合下面这篇文章,把骨头之外的血肉补上吧?/div>
https://codinfox.github.io/dev/2014/06/03/move-semantic-perfect-forward/


so true 2018-12-06 11:38 发表评论
]]>一个野生程序员的真实自述:我是如何从数学专业学渣入坑程序员?/title><link>//www.ot7t.com.cn/jb2011/archive/2018/12/05/433536.html</link><dc:creator>Jack Jiang</dc:creator><author>Jack Jiang</author><pubDate>Wed, 05 Dec 2018 07:04:00 GMT</pubDate><guid>//www.ot7t.com.cn/jb2011/archive/2018/12/05/433536.html</guid><wfw:comment>//www.ot7t.com.cn/jb2011/comments/433536.html</wfw:comment><comments>//www.ot7t.com.cn/jb2011/archive/2018/12/05/433536.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>//www.ot7t.com.cn/jb2011/comments/commentRss/433536.html</wfw:commentRss><trackback:ping>//www.ot7t.com.cn/jb2011/services/trackbacks/433536.html</trackback:ping><description><![CDATA[<p style="box-sizing: border-box; margin: 0px 0px 25px; color: #2f2f2f; font-family: -apple-system, "SF UI Text", Arial, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif; font-size: 16px; background-color: #ffffff; word-break: break-word !important;"><br /></p><h1>福彩快乐12开奖结果:1、引言</h1><p style="box-sizing: border-box; margin: 0px 0px 25px; color: #2f2f2f; font-family: -apple-system, "SF UI Text", Arial, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif; font-size: 16px; background-color: #ffffff; word-break: break-word !important;">“恭喜你,成功的避过了所有的正确答案,选择了错误答?#8221;。没错,我是一个数学专业的普通大学生(准确地说,是学渣一枚),排除万难,我终于还是入了程序员的坑(不好意思,给程序员抹黑了)?/p><div style="box-sizing: border-box; padding-bottom: 25px; width: 700px; margin-left: -40px; text-align: center; color: #2f2f2f; font-family: -apple-system, "SF UI Text", Arial, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif; font-size: 16px; background-color: #ffffff;"><div style="box-sizing: border-box; position: relative; z-index: 100; background-color: transparent; transition: background-color 0.1s linear 0s; margin: 0px auto; max-width: 290px; max-height: 246px;"><div style="box-sizing: border-box; z-index: 50; padding-bottom: 246px;"></div><div data-width="290" data-height="246" style="box-sizing: border-box; position: absolute; top: 0px; left: 0px; width: 290px; height: 246px; overflow: hidden;"><img data-original-src="//upload-images.jianshu.io/upload_images/1500839-5ce74b27b8f2f654.jpg" src="//upload-images.jianshu.io/upload_images/1500839-5ce74b27b8f2f654.jpg" data-original-width="290" data-original-height="246" data-original-format="image/jpeg" data-original-filesize="12508" style="box-sizing: border-box; border: 0px; vertical-align: middle; transition: all 0.15s linear 0s; z-index: 100; opacity: 1; max-width: 100%; height: auto; cursor: zoom-in; display: block; filter: blur(0px);" alt="" /></div></div></div><p style="box-sizing: border-box; margin: 0px 0px 25px; color: #2f2f2f; font-family: -apple-system, "SF UI Text", Arial, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif; font-size: 16px; background-color: #ffffff; word-break: break-word !important;">(本文同步发布于?a target="_blank" rel="nofollow" style="box-sizing: border-box; background-color: transparent; color: #3194d0; text-decoration-line: none; cursor: pointer;">//www.52im.net/thread-2127-1-1.html</a>?/p><h1 class="yibqv">2、生活爆锤了我一?/h1><div style="box-sizing: border-box; padding-bottom: 25px; width: 700px; margin-left: -40px; text-align: center; color: #2f2f2f; font-family: -apple-system, "SF UI Text", Arial, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif; font-size: 16px; background-color: #ffffff;"><div style="box-sizing: border-box; position: relative; z-index: 100; background-color: transparent; transition: background-color 0.1s linear 0s; margin: 0px auto; max-width: 255px; max-height: 255px;"><div style="box-sizing: border-box; z-index: 50; padding-bottom: 255px;"></div><div data-width="255" data-height="255" style="box-sizing: border-box; position: absolute; top: 0px; left: 0px; width: 255px; height: 255px; overflow: hidden;"><img data-original-src="//upload-images.jianshu.io/upload_images/1500839-ed3971e647e31e28.jpg" src="//upload-images.jianshu.io/upload_images/1500839-ed3971e647e31e28.jpg" data-original-width="255" data-original-height="255" data-original-format="image/jpeg" data-original-filesize="11583" style="box-sizing: border-box; border: 0px; vertical-align: middle; transition: all 0.15s linear 0s; z-index: 100; opacity: 1; max-width: 100%; height: auto; cursor: zoom-in; display: block; filter: blur(0px);" alt="" /></div></div></div><p style="box-sizing: border-box; margin: 0px 0px 25px; color: #2f2f2f; font-family: -apple-system, "SF UI Text", Arial, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif; font-size: 16px; background-color: #ffffff; word-break: break-word !important;">我是一个平凡的人,人生也一直都是平淡且稀里糊涂的!像别人家孩子发生的事从来不会发生在我身上。在稀里糊涂的高考完之后,竟也能稀里糊涂的上了一个还凑活的本科院?虽然是数学专?,算不上好,也算不上坏。没有像大多数的考生一样抱怨没发挥“?#8221;,满怀憧憬的准备开启我的大学生活?/p><p style="box-sizing: border-box; margin: 0px 0px 25px; color: #2f2f2f; font-family: -apple-system, "SF UI Text", Arial, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif; font-size: 16px; background-color: #ffffff; word-break: break-word !important;">如绝大多数大学生一样,上午睡到自然醒,下午毒奶粉和撸啊撸,晚上喝酒聊天,打牌撸?好不逍遥自在!本以为我会像当下大多数大学生一?#8221;游戏”人生四年?/p><p style="box-sizing: border-box; margin: 0px 0px 25px; color: #2f2f2f; font-family: -apple-system, "SF UI Text", Arial, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif; font-size: 16px; background-color: #ffffff; word-break: break-word !important;">操蛋的是,生活毫不犹豫的给了我几皮锤,而且是一顿爆锤,锤的我是一脸懵逼。休学这种事情一向是别人家的孩子才会有的,没想到这次竟然到了我身上,不是因为世界那么大我想去看看,而是怀揣着对生活硬塞给我的迷茫回家休养。休学的生活更是极其的平淡无奇,没有北国的风光、江南的水乡,有的只是一张床、一间屋、一台电脑几本破书?/p><h1 class="yibqv">3、考验才刚刚开?/h1><div style="box-sizing: border-box; padding-bottom: 25px; width: 700px; margin-left: -40px; text-align: center; color: #2f2f2f; font-family: -apple-system, "SF UI Text", Arial, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif; font-size: 16px; background-color: #ffffff;"><div style="box-sizing: border-box; position: relative; z-index: 100; background-color: transparent; transition: background-color 0.1s linear 0s; margin: 0px auto; max-width: 240px; max-height: 240px;"><div style="box-sizing: border-box; z-index: 50; padding-bottom: 240px;"></div><div data-width="240" data-height="240" style="box-sizing: border-box; position: absolute; top: 0px; left: 0px; width: 240px; height: 240px; overflow: hidden;"><img data-original-src="//upload-images.jianshu.io/upload_images/1500839-9bb4565f81080722.jpg" src="//upload-images.jianshu.io/upload_images/1500839-9bb4565f81080722.jpg" data-original-width="240" data-original-height="240" data-original-format="image/jpeg" data-original-filesize="8970" style="box-sizing: border-box; border: 0px; vertical-align: middle; transition: all 0.15s linear 0s; z-index: 100; opacity: 1; max-width: 100%; height: auto; cursor: zoom-in; display: block; filter: blur(0px);" alt="" /></div></div></div><p style="box-sizing: border-box; margin: 0px 0px 25px; color: #2f2f2f; font-family: -apple-system, "SF UI Text", Arial, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif; font-size: 16px; background-color: #ffffff; word-break: break-word !important;">一年之后回到学校,本以为终于熬过了生活的几皮锤,没想到真正的考验才刚刚开始?#8220;久不入凡?#8221;的我回到学校,一切都是那么的不适应。嘈杂的宿舍,陌生的舍友?2点以后的作息,熙来攘往的食堂,甚至安静的做着?5分钟的课……这一切都让我难以忍受。终于在第一堂统计课上了三十分钟后,满头大汗,全身都在颤抖的我终于再也忍受不了,在老师和同学们异样的眼光中我夺门而出,如逃命一般离去,那个学期我没有再去上过一节课。对人生未来没有任何方向,对生活失去信息的我,退学的念头在我心中愈发强烈?/p><p style="box-sizing: border-box; margin: 0px 0px 25px; color: #2f2f2f; font-family: -apple-system, "SF UI Text", Arial, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif; font-size: 16px; background-color: #ffffff; word-break: break-word !important;">庆幸的是,我原来的基友们因为大四有的外出培训和实习,宿舍剩下了很多空铺。于是我当天就收拾铺盖卷搬到了我原来的宿舍。原来的宿舍还剩两个舍友,这两个哥们也很6,不着急找工作。在我最艰难的时候陪我度过了最难熬的一段时光。起初我每天在宿舍床上躺着无所事事,看看电视打打游戏打发时光。后来我这两个哥们的一件事改变了我?/p><p style="box-sizing: border-box; margin: 0px 0px 25px; color: #2f2f2f; font-family: -apple-system, "SF UI Text", Arial, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif; font-size: 16px; background-color: #ffffff; word-break: break-word !important;">有些时候你难以想象两个爱玩游戏的人,一旦志同道合是多么可怕的一件事,当时他们来热衷于玩地下城和撸啊撸。这俩货玩游戏玩到什么程度呢?我只能用超强的自律来形容,地下城这个游戏玩过的朋友都知道早晨六点刷新疲劳?/p><p style="box-sizing: border-box; margin: 0px 0px 25px; color: #2f2f2f; font-family: -apple-system, "SF UI Text", Arial, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif; font-size: 16px; background-color: #ffffff; word-break: break-word !important;">于是乎,6点钟这俩货准时起床打开电脑撸一管疲劳之后七点多洗刷吃早饭,完事回来上午接着撸,下午两个人睡个午觉之后开黑打撸啊撸,晚上继续地下城。一个哥们一天撸6管疲?6个号),一哥们一?管疲?每天晚上10点准时上床睡觉以备第二天6点能起床继续撸。这?#8220;自律”的生活寒暑不断,风雨无阻。至今想起,我扔感觉佩服不已。终于,我深深折服于这俩货的“自律认真”,受他们影响我也加入了他们的队伍中?/p><h1 class="yibqv">4、人丑就应该多读?/h1><div style="box-sizing: border-box; padding-bottom: 25px; width: 700px; margin-left: -40px; text-align: center; color: #2f2f2f; font-family: -apple-system, "SF UI Text", Arial, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif; font-size: 16px; background-color: #ffffff;"><div style="box-sizing: border-box; position: relative; z-index: 100; background-color: transparent; transition: background-color 0.1s linear 0s; margin: 0px auto; max-width: 300px; max-height: 184px;"><div style="box-sizing: border-box; z-index: 50; padding-bottom: 183.984px;"></div><div data-width="300" data-height="184" style="box-sizing: border-box; position: absolute; top: 0px; left: 0px; width: 300px; height: 183.984px; overflow: hidden;"><img data-original-src="//upload-images.jianshu.io/upload_images/1500839-28e763b3c90742f0.jpg" src="//upload-images.jianshu.io/upload_images/1500839-28e763b3c90742f0.jpg" data-original-width="300" data-original-height="184" data-original-format="image/jpeg" data-original-filesize="8606" style="box-sizing: border-box; border: 0px; vertical-align: middle; transition: all 0.15s linear 0s; z-index: 100; opacity: 1; max-width: 100%; height: auto; cursor: zoom-in; display: block; filter: blur(0px);" alt="" /></div></div></div><p style="box-sizing: border-box; margin: 0px 0px 25px; color: #2f2f2f; font-family: -apple-system, "SF UI Text", Arial, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif; font-size: 16px; background-color: #ffffff; word-break: break-word !important;">好景不长!虽然我之前也爱玩游戏,但是却做不到一?管疲劳,更别?管疲劳。做不到像他们一样乐此不疲的沉入到游戏中去。慢慢地我又开始迷茫了,觉得这样的生活很没有意义,而且身边的人都要毕业了,对于未来,对于工作还一无所知,前途一片迷茫?/p><p style="box-sizing: border-box; margin: 0px 0px 25px; color: #2f2f2f; font-family: -apple-system, "SF UI Text", Arial, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif; font-size: 16px; background-color: #ffffff; word-break: break-word !important;">恰逢此时,我们学校的图书馆,在吸收了我几年重修费之后终于建成开放。照了照镜子,最终决定为了不让我?#8220;天文数组”重修费不白交,我要去图书馆读读书?/p><p style="box-sizing: border-box; margin: 0px 0px 25px; color: #2f2f2f; font-family: -apple-system, "SF UI Text", Arial, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif; font-size: 16px; background-color: #ffffff; word-break: break-word !important;">起初,只是读一些文史小说之类的。后来不知道什么时候被猪油蒙了心,竟然鬼使神差的去读了一本HTML、CSS、JavaScript的书,正是这本书让我一步步的走上了不归路。当我使用代码敲出了第一个网页的时候,没错,就?#8220;成就?#8221;这种如毒品一样的感觉吸引了我。这次,我又回到了宿舍,还是和那俩货又混到了一起,不同的是,每天除了吃饭睡觉打游戏之外,敲代码成了我日常生活的一部分?/p><p style="box-sizing: border-box; margin: 0px 0px 25px; color: #2f2f2f; font-family: -apple-system, "SF UI Text", Arial, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif; font-size: 16px; background-color: #ffffff; word-break: break-word !important;">渐渐地,静态网页我也开始玩腻了。这个时?#8220;动态网?#8221;这个字眼走进了我眼睛。于是乎我又跑到了图书馆,找到了带我入行的第一本书。这本书现在看来虽然很简单,但确是陪我度过了大学里面最充实,最辉煌,真正带我入门的一本书?a target="_blank" rel="nofollow" style="box-sizing: border-box; background-color: transparent; color: #3194d0; text-decoration-line: none; cursor: pointer;">ASP.NET 从入门到精?/a>?ps:声明我不是卖书和推广书的!读书应该看看适不适合自己)?/p><p style="box-sizing: border-box; margin: 0px 0px 25px; color: #2f2f2f; font-family: -apple-system, "SF UI Text", Arial, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif; font-size: 16px; background-color: #ffffff; word-break: break-word !important;">自此正是开始了我的.NET学习与开发的生涯?/p><h1 class="yibqv">5、我好像走上了人生的巅峰</h1><div style="box-sizing: border-box; padding-bottom: 25px; width: 700px; margin-left: -40px; text-align: center; color: #2f2f2f; font-family: -apple-system, "SF UI Text", Arial, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif; font-size: 16px; background-color: #ffffff;"><div style="box-sizing: border-box; position: relative; z-index: 100; background-color: transparent; transition: background-color 0.1s linear 0s; margin: 0px auto; max-width: 240px; max-height: 240px;"><div style="box-sizing: border-box; z-index: 50; padding-bottom: 240px;"></div><div data-width="240" data-height="240" style="box-sizing: border-box; position: absolute; top: 0px; left: 0px; width: 240px; height: 240px; overflow: hidden;"><img data-original-src="//upload-images.jianshu.io/upload_images/1500839-099b0997571fdc09.jpg" src="//upload-images.jianshu.io/upload_images/1500839-099b0997571fdc09.jpg" data-original-width="240" data-original-height="240" data-original-format="image/jpeg" data-original-filesize="11913" style="box-sizing: border-box; border: 0px; vertical-align: middle; transition: all 0.15s linear 0s; z-index: 100; opacity: 1; max-width: 100%; height: auto; cursor: zoom-in; display: block; filter: blur(0px);" alt="" /></div></div></div><p style="box-sizing: border-box; margin: 0px 0px 25px; color: #2f2f2f; font-family: -apple-system, "SF UI Text", Arial, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif; font-size: 16px; background-color: #ffffff; word-break: break-word !important;">就这样学习了几个月之后,大三下学?也就是我的老同学大四下学期)。老同学们开始毕业选题。当我看到他们的选题列表的时候。。?/p><div style="box-sizing: border-box; padding-bottom: 25px; width: 700px; margin-left: -40px; text-align: center; color: #2f2f2f; font-family: -apple-system, "SF UI Text", Arial, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif; font-size: 16px; background-color: #ffffff;"><div style="box-sizing: border-box; position: relative; z-index: 100; background-color: transparent; transition: background-color 0.1s linear 0s; margin: 0px auto; max-width: 150px; max-height: 150px;"><div style="box-sizing: border-box; z-index: 50; padding-bottom: 150px;"></div><div data-width="150" data-height="150" style="box-sizing: border-box; position: absolute; top: 0px; left: 0px; width: 150px; height: 150px; overflow: hidden;"><img data-original-src="//upload-images.jianshu.io/upload_images/1500839-9edc621748a758c5.jpg" src="//upload-images.jianshu.io/upload_images/1500839-9edc621748a758c5.jpg" data-original-width="150" data-original-height="150" data-original-format="image/jpeg" data-original-filesize="8465" style="box-sizing: border-box; border: 0px; vertical-align: middle; transition: all 0.15s linear 0s; z-index: 100; opacity: 1; max-width: 100%; height: auto; cursor: zoom-in; display: block; filter: blur(0px);" alt="" /></div></div></div><p style="box-sizing: border-box; margin: 0px 0px 25px; color: #2f2f2f; font-family: -apple-system, "SF UI Text", Arial, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif; font-size: 16px; background-color: #ffffff; word-break: break-word !important;">没错,我的内心是这样的。在我免费承包了几个好基友的毕业设计之后,以后我的撸啊撸网名变成?#8220;爷万众景?#8221;,走路仿佛都在带风?/p><p style="box-sizing: border-box; margin: 0px 0px 25px; color: #2f2f2f; font-family: -apple-system, "SF UI Text", Arial, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif; font-size: 16px; background-color: #ffffff; word-break: break-word !important;">老天仿佛开了眼,系里老师怕我们这个专业毕业后不好找工作,在大三大四开了计算机相关课程(事实证明我这些老师是多么的英明,我们班30多个同学,除最后有三十个入了程序相关行业的?。难以想象兴趣驱动的学习和考试驱动的学习差距是多么的大,经过几个月的学习与实战之后,没上过课的我,在考试中,有一哥们八分钟作弊被撵了出去,而我在一群崇拜的眼光?0分钟交了卷,最后竟然考了全系第一,拿到了一等奖学金?/p><p style="box-sizing: border-box; margin: 0px 0px 25px; color: #2f2f2f; font-family: -apple-system, "SF UI Text", Arial, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif; font-size: 16px; background-color: #ffffff; word-break: break-word !important;">回想生活是多么的操蛋,大一的时候我每天占座按时上课努力学习,想考第一,最终却不尽如人意。没想到大学快结束了,一天天逃课反而得到了原来自己以前最想要的?/p><h1 class="yibqv">6、离别的忧伤与找工作的迷?/h1><div style="box-sizing: border-box; padding-bottom: 25px; width: 700px; margin-left: -40px; text-align: center; color: #2f2f2f; font-family: -apple-system, "SF UI Text", Arial, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif; font-size: 16px; background-color: #ffffff;"><div style="box-sizing: border-box; position: relative; z-index: 100; background-color: transparent; transition: background-color 0.1s linear 0s; margin: 0px auto; max-width: 255px; max-height: 255px;"><div style="box-sizing: border-box; z-index: 50; padding-bottom: 255px;"></div><div data-width="255" data-height="255" style="box-sizing: border-box; position: absolute; top: 0px; left: 0px; width: 255px; height: 255px; overflow: hidden;"><img data-original-src="//upload-images.jianshu.io/upload_images/1500839-8e87bab78c830fe7.jpg" src="//upload-images.jianshu.io/upload_images/1500839-8e87bab78c830fe7.jpg" data-original-width="255" data-original-height="255" data-original-format="image/jpeg" data-original-filesize="14098" style="box-sizing: border-box; border: 0px; vertical-align: middle; transition: all 0.15s linear 0s; z-index: 100; opacity: 1; max-width: 100%; height: auto; cursor: zoom-in; display: block; filter: blur(0px);" alt="" /></div></div></div><p style="box-sizing: border-box; margin: 0px 0px 25px; color: #2f2f2f; font-family: -apple-system, "SF UI Text", Arial, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif; font-size: 16px; background-color: #ffffff; word-break: break-word !important;">人们都说离别的时候,最后一个走的人是最痛苦的。而我注定是那最后一个走的。他们毕业以后,我和几个还在培训的同学在一起租了个房子度过了我大学生涯最后一段美好的时光。随着一个个找到工作的离去,偌大的房子就剩下了两个人。冬天还没到来,却感觉贼鸡儿冷。持续几个星期的感冒迟迟不好,又犯了鼻炎,整日呼吸都不顺畅,让我以为得了什么绝症,渐渐地感觉生活好像糟糕透了,我的心情也越来越差。不能再坐以待毙了,于是我决定出去找个工作?/p><h1 class="yibqv">7、新的挑?#8212;—入坑程序?/h1><div style="box-sizing: border-box; padding-bottom: 25px; width: 700px; margin-left: -40px; text-align: center; color: #2f2f2f; font-family: -apple-system, "SF UI Text", Arial, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif; font-size: 16px; background-color: #ffffff;"><div style="box-sizing: border-box; position: relative; z-index: 100; background-color: transparent; transition: background-color 0.1s linear 0s; margin: 0px auto; max-width: 296px; max-height: 300px;"><div style="box-sizing: border-box; z-index: 50; padding-bottom: 299.984px;"></div><div data-width="296" data-height="300" style="box-sizing: border-box; position: absolute; top: 0px; left: 0px; width: 296px; height: 299.984px; overflow: hidden;"><img data-original-src="//upload-images.jianshu.io/upload_images/1500839-1bca80d56acae11e.jpg" src="//upload-images.jianshu.io/upload_images/1500839-1bca80d56acae11e.jpg" data-original-width="296" data-original-height="300" data-original-format="image/jpeg" data-original-filesize="11515" style="box-sizing: border-box; border: 0px; vertical-align: middle; transition: all 0.15s linear 0s; z-index: 100; opacity: 1; max-width: 100%; height: auto; cursor: zoom-in; display: block; filter: blur(0px);" alt="" /></div></div></div><p style="box-sizing: border-box; margin: 0px 0px 25px; color: #2f2f2f; font-family: -apple-system, "SF UI Text", Arial, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif; font-size: 16px; background-color: #ffffff; word-break: break-word !important;">虽然在学校享受着别人“大神”的称呼,但实际上对找工作这件事我是慌得一比的,找到工作的同学都经过专业的培训,而我是野路子出身,也不知道自己学的怎么样。但当时想想出去面面也好,没人要就没人要,涨涨面试经验,不行回来再学习也行,于是抱着试试看的态度我准备出去找工作了?/p><p style="box-sizing: border-box; margin: 0px 0px 25px; color: #2f2f2f; font-family: -apple-system, "SF UI Text", Arial, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif; font-size: 16px; background-color: #ffffff; word-break: break-word !important;">尴尬的是大多数开发公司都集中在高新区,而学校到那里车程来回四五个小时。两天的奔波就面了两家公司,而且我连技术面试官的面都没见到,被人资就给打发回来了。再加上重感冒的原因有点吃不消,就想放弃。戏剧性的是,在我刚撤回简历的时候,一个电话邀我去面试,而且离我们学校还挺近。命运就是那么的有趣,鬼使神差的我又跟着去了?/p><p style="box-sizing: border-box; margin: 0px 0px 25px; color: #2f2f2f; font-family: -apple-system, "SF UI Text", Arial, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif; font-size: 16px; background-color: #ffffff; word-break: break-word !important;">当然,结局就是我最终去了这家公司也是我现在的公司?/p><p style="box-sizing: border-box; margin: 0px 0px 25px; color: #2f2f2f; font-family: -apple-system, "SF UI Text", Arial, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif; font-size: 16px; background-color: #ffffff; word-break: break-word !important;"><span style="box-sizing: border-box; font-weight: 700;">原因很简单:</span></p><p style="box-sizing: border-box; margin: 0px 0px 25px; color: #2f2f2f; font-family: -apple-system, "SF UI Text", Arial, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif; font-size: 16px; background-color: #ffffff; word-break: break-word !important;">第一、这个办公环境是真的棒,国家甲级写字楼,还特么有漂亮的小姐姐给开门摁电梯,慢慢的逼格吸引了我,就连重感冒都感觉好了几分;</p><p style="box-sizing: border-box; margin: 0px 0px 25px; color: #2f2f2f; font-family: -apple-system, "SF UI Text", Arial, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif; font-size: 16px; background-color: #ffffff; word-break: break-word !important;">第二、当时的技术总监的技术水平折服了我,我想去学东西?/p><p style="box-sizing: border-box; margin: 0px 0px 25px; color: #2f2f2f; font-family: -apple-system, "SF UI Text", Arial, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif; font-size: 16px; background-color: #ffffff; word-break: break-word !important;">至此,经历重重磨难,我终于入了程序员的坑,开启了另一种人生!在这里我经历了朝九晚五的上班族生活,也经历了史上最要人命的加班生活,经历了每月1800的苦逼岁月,也经历了一年翻五倍薪的辉煌人生,做过小兵、当过带头大哥,孤军奋战过,团队合作过,迷茫过、徘徊过……但还始终坚定地往前扑棱着?/p><h1 class="yibqv">8、最?/h1><p style="box-sizing: border-box; margin: 0px 0px 25px; color: #2f2f2f; font-family: -apple-system, "SF UI Text", Arial, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif; font-size: 16px; background-color: #ffffff; word-break: break-word !important;"><span style="box-sizing: border-box; font-weight: 700;">最后,送给还在生活中使劲扑棱的?</span></p><p style="box-sizing: border-box; margin: 0px 0px 25px; color: #2f2f2f; font-family: -apple-system, "SF UI Text", Arial, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif; font-size: 16px; background-color: #ffffff; word-break: break-word !important;">假如生活暴锤了你,不要悲伤不要着急,一定要坚定不移地向前再轱蛹、轱?</p><p style="box-sizing: border-box; margin: 0px 0px 25px; color: #2f2f2f; font-family: -apple-system, "SF UI Text", Arial, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif; font-size: 16px; background-color: #ffffff; word-break: break-word !important;">人丑应该多读书,人在迷茫的时候更不要停止学习的脚?</p><p style="box-sizing: border-box; margin: 0px 0px 25px; color: #2f2f2f; font-family: -apple-system, "SF UI Text", Arial, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif; font-size: 16px; background-color: #ffffff; word-break: break-word !important;">当你陷入生活的泥潭的时候要努力的寻求变?</p><p style="box-sizing: border-box; margin: 0px 0px 25px; color: #2f2f2f; font-family: -apple-system, "SF UI Text", Arial, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif; font-size: 16px; background-color: #ffffff; word-break: break-word !important;">无论任何时候都不要丧失对生活的信息,保持乐?</p><h1 class="yibqv">附录:更多感悟和思考的文章</h1><blockquote style="box-sizing: border-box; padding: 20px; margin: 0px 0px 25px; font-size: 16px; border-left-width: 6px; border-left-color: #b4b4b4; background-color: #f7f7f7; line-height: 30px; color: #2f2f2f; font-family: -apple-system, "SF UI Text", Arial, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif; word-break: break-word !important;"><p style="box-sizing: border-box; margin: 0px 0px 25px; line-height: 1.7; word-break: break-word !important;">?a target="_blank" rel="nofollow" style="box-sizing: border-box; background-color: transparent; color: #3194d0; text-decoration-line: none; cursor: pointer;">一个微信实习生自述:我眼中的微信开发团?/a>?/p><p style="box-sizing: border-box; margin: 0px 0px 25px; line-height: 1.7; word-break: break-word !important;">?a target="_blank" rel="nofollow" style="box-sizing: border-box; background-color: transparent; color: #3194d0; text-decoration-line: none; cursor: pointer;">微信程序员创业总结:如何提高Android开发效?/a>?/p><p style="box-sizing: border-box; margin: 0px 0px 25px; line-height: 1.7; word-break: break-word !important;">?a target="_blank" rel="nofollow" style="box-sizing: border-box; background-color: transparent; color: #3194d0; text-decoration-line: none; cursor: pointer;">如何做一个合格的 iOS Team Leader</a>?/p><p style="box-sizing: border-box; margin: 0px 0px 25px; line-height: 1.7; word-break: break-word !important;">?a target="_blank" rel="nofollow" style="box-sizing: border-box; background-color: transparent; color: #3194d0; text-decoration-line: none; cursor: pointer;">程序员中年危机:拿什么拯救你,我的三十五?/a>?/p><p style="box-sizing: border-box; margin: 0px 0px 25px; line-height: 1.7; word-break: break-word !important;">?a target="_blank" rel="nofollow" style="box-sizing: border-box; background-color: transparent; color: #3194d0; text-decoration-line: none; cursor: pointer;">一个魔都程序员?年:从程序员到CTO的历?/a>?/p><p style="box-sizing: border-box; margin: 0px 0px 25px; line-height: 1.7; word-break: break-word !important;">?a target="_blank" rel="nofollow" style="box-sizing: border-box; background-color: transparent; color: #3194d0; text-decoration-line: none; cursor: pointer;">为什么说即时通讯社交APP创业就是一个坑?/a>?/p><p style="box-sizing: border-box; margin: 0px 0px 25px; line-height: 1.7; word-break: break-word !important;">?a target="_blank" rel="nofollow" style="box-sizing: border-box; background-color: transparent; color: #3194d0; text-decoration-line: none; cursor: pointer;">致我们再也回不去?Github ...</a>?/p><p style="box-sizing: border-box; margin: 0px 0px 25px; line-height: 1.7; word-break: break-word !important;">?a target="_blank" rel="nofollow" style="box-sizing: border-box; background-color: transparent; color: #3194d0; text-decoration-line: none; cursor: pointer;">一?0后二流大学程序员的自述:我是如何?#8220;菜鸟”?#8220;辣鸡”?/a>?/p><p style="box-sizing: border-box; margin: 0px 0px 25px; line-height: 1.7; word-break: break-word !important;">?a target="_blank" rel="nofollow" style="box-sizing: border-box; background-color: transparent; color: #3194d0; text-decoration-line: none; cursor: pointer;">一个魔都程序员?年:从程序员到CTO的历?/a>?/p><p style="box-sizing: border-box; margin: 0px 0px 25px; line-height: 1.7; word-break: break-word !important;">?a target="_blank" rel="nofollow" style="box-sizing: border-box; background-color: transparent; color: #3194d0; text-decoration-line: none; cursor: pointer;">选择比努力更重要:我是如何从流水线工人到程序员的?/a>?/p><p style="box-sizing: border-box; margin: 0px 0px 25px; line-height: 1.7; word-break: break-word !important;">?a target="_blank" rel="nofollow" style="box-sizing: border-box; background-color: transparent; color: #3194d0; text-decoration-line: none; cursor: pointer;">程序员的抉择:必须离开帝都——因为除了工作机会,还有什么值得留恋?/a>?/p><p style="box-sizing: border-box; margin: 0px 0px 25px; line-height: 1.7; word-break: break-word !important;">?a target="_blank" rel="nofollow" style="box-sizing: border-box; background-color: transparent; color: #3194d0; text-decoration-line: none; cursor: pointer;">即时通讯创业必读:解密微信的产品定位、创新思维、设计法则等</a>?/p><p style="box-sizing: border-box; margin: 0px 0px 25px; line-height: 1.7; word-break: break-word !important;">?a target="_blank" rel="nofollow" style="box-sizing: border-box; background-color: transparent; color: #3194d0; text-decoration-line: none; cursor: pointer;">干了这碗鸡汤:从理发店小弟到阿里P10技术大?/a>?/p><p style="box-sizing: border-box; margin: 0px 0px 25px; line-height: 1.7; word-break: break-word !important;">?a target="_blank" rel="nofollow" style="box-sizing: border-box; background-color: transparent; color: #3194d0; text-decoration-line: none; cursor: pointer;">程序员神级跳槽攻略:什么时候该跳?做什么准备?到哪里找工作?/a>?/p><p style="box-sizing: border-box; margin: 0px 0px 25px; line-height: 1.7; word-break: break-word !important;">?a target="_blank" rel="nofollow" style="box-sizing: border-box; background-color: transparent; color: #3194d0; text-decoration-line: none; cursor: pointer;">感悟分享:在腾讯的八年,我的成长之路和职业思?/a>?/p><p style="box-sizing: border-box; margin: 0px 0px 25px; line-height: 1.7; word-break: break-word !important;">?a target="_blank" rel="nofollow" style="box-sizing: border-box; background-color: transparent; color: #3194d0; text-decoration-line: none; cursor: pointer;">调皮的程序员:Linux之父雕刻在Linux内核中的故事</a>?/p><p style="box-sizing: border-box; margin: 0px 0px 25px; line-height: 1.7; word-break: break-word !important;">?a target="_blank" rel="nofollow" style="box-sizing: border-box; background-color: transparent; color: #3194d0; text-decoration-line: none; cursor: pointer;">老罗最新发布了“子弹短信”这款IM,主打熟人社交能否对标微信?</a>?/p><p style="box-sizing: border-box; margin: 0px 0px 25px; line-height: 1.7; word-break: break-word !important;">?a target="_blank" rel="nofollow" style="box-sizing: border-box; background-color: transparent; color: #3194d0; text-decoration-line: none; cursor: pointer;">迷茫中前行:一个专科渣渣菜鸟的编程入门感悟</a>?/p><p style="box-sizing: border-box; margin: 0px 0px 25px; line-height: 1.7; word-break: break-word !important;">?a target="_blank" rel="nofollow" style="box-sizing: border-box; background-color: transparent; color: #3194d0; text-decoration-line: none; cursor: pointer;">盘点和反思在微信的阴影下艰难求生的移动端IM应用</a>?/p><p style="box-sizing: border-box; margin: 0px 0px 25px; line-height: 1.7; word-break: break-word !important;">?a target="_blank" rel="nofollow" style="box-sizing: border-box; background-color: transparent; color: #3194d0; text-decoration-line: none; cursor: pointer;">QQ现状深度剖析:你还认为QQ已经被微信打败了吗?</a></p><p style="box-sizing: border-box; margin: 0px 0px 25px; line-height: 1.7; word-break: break-word !important;">?a target="_blank" rel="nofollow" style="box-sizing: border-box; background-color: transparent; color: #3194d0; text-decoration-line: none; cursor: pointer;">机会不给无准备的人:一个Android程序员屡战屡败的悲惨校招经历</a>?/p><p style="box-sizing: border-box; margin: 0px 0px 25px; line-height: 1.7; word-break: break-word !important;">?a target="_blank" rel="nofollow" style="box-sizing: border-box; background-color: transparent; color: #3194d0; text-decoration-line: none; cursor: pointer;">盘点和反思在微信的阴影下艰难求生的移动端IM应用</a>?/p><p style="box-sizing: border-box; margin: 0px 0px 25px; line-height: 1.7; word-break: break-word !important;">?a target="_blank" rel="nofollow" style="box-sizing: border-box; background-color: transparent; color: #3194d0; text-decoration-line: none; cursor: pointer;">QQ现状深度剖析:你还认为QQ已经被微信打败了吗?</a></p><p style="box-sizing: border-box; margin: 0px 0px 25px; line-height: 1.7; word-break: break-word !important;">?a target="_blank" rel="nofollow" style="box-sizing: border-box; background-color: transparent; color: #3194d0; text-decoration-line: none; cursor: pointer;">笑中带泪的码农往事:入职三天被开,公司给100块叫我走人,有我惨?</a>?/p><p style="box-sizing: border-box; margin: 0px; line-height: 1.7; word-break: break-word !important;">?a target="_blank" rel="nofollow" style="box-sizing: border-box; background-color: transparent; color: #3194d0; text-decoration-line: none; cursor: pointer;">一个野生程序员的真实自述:我是如何从数学专业学渣入坑程序员?/a>?/p></blockquote><p style="box-sizing: border-box; margin: 0px 0px 25px; color: #2f2f2f; font-family: -apple-system, "SF UI Text", Arial, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif; font-size: 16px; background-color: #ffffff; word-break: break-word !important;">(本文同步发布于?a target="_blank" rel="nofollow" style="box-sizing: border-box; background-color: transparent; color: #3194d0; text-decoration-line: none; cursor: pointer;">//www.52im.net/thread-2127-1-1.html</a>?/p><img src ="//www.ot7t.com.cn/jb2011/aggbug/433536.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="//www.ot7t.com.cn/jb2011/" target="_blank">Jack Jiang</a> 2018-12-05 15:04 <a href="//www.ot7t.com.cn/jb2011/archive/2018/12/05/433536.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>全面了解移动端DNS域名劫持等杂症:原理、根源、HttpDNS解决方案?/title><link>//www.ot7t.com.cn/jb2011/archive/2018/12/04/433535.html</link><dc:creator>Jack Jiang</dc:creator><author>Jack Jiang</author><pubDate>Tue, 04 Dec 2018 05:36:00 GMT</pubDate><guid>//www.ot7t.com.cn/jb2011/archive/2018/12/04/433535.html</guid><wfw:comment>//www.ot7t.com.cn/jb2011/comments/433535.html</wfw:comment><comments>//www.ot7t.com.cn/jb2011/archive/2018/12/04/433535.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>//www.ot7t.com.cn/jb2011/comments/commentRss/433535.html</wfw:commentRss><trackback:ping>//www.ot7t.com.cn/jb2011/services/trackbacks/433535.html</trackback:ping><description><![CDATA[     摘要: 1、引言对于互联网,域名是访问的第一跳,而这一跳很多时候会“失足”(尤其是移动端网络),导致访问错误内容、失败连接等,让用户在互联网上畅游的爽快瞬间消失。而对于这关键的第一跳,包括鹅厂在内的国内互联网大厂,都在持续深入地研究和思考对策,本文将就鹅厂团队在这一块的技术实践,做一个深度的总结和技术分享,希望给大家带来些许启发。学习交流:- 即时通讯/推送技术开发交?群:101...  <a href='//www.ot7t.com.cn/jb2011/archive/2018/12/04/433535.html'>阅读全文</a><img src ="//www.ot7t.com.cn/jb2011/aggbug/433535.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="//www.ot7t.com.cn/jb2011/" target="_blank">Jack Jiang</a> 2018-12-04 13:36 <a href="//www.ot7t.com.cn/jb2011/archive/2018/12/04/433535.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MySQL 开发实?8 问,你能 hold 住几个?【转?/title><link>//www.ot7t.com.cn/xiaomage234/archive/2018/12/03/433534.html</link><dc:creator>小马?/dc:creator><author>小马?/author><pubDate>Mon, 03 Dec 2018 07:55:00 GMT</pubDate><guid>//www.ot7t.com.cn/xiaomage234/archive/2018/12/03/433534.html</guid><wfw:comment>//www.ot7t.com.cn/xiaomage234/comments/433534.html</wfw:comment><comments>//www.ot7t.com.cn/xiaomage234/archive/2018/12/03/433534.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>//www.ot7t.com.cn/xiaomage234/comments/commentRss/433534.html</wfw:commentRss><trackback:ping>//www.ot7t.com.cn/xiaomage234/services/trackbacks/433534.html</trackback:ping><description><![CDATA[     摘要: from:https://cloud.tencent.com/developer/article/1004475最近研发的项目?DB 依赖比较重,梳理了这段时间使用MySQL遇到?个比较具有代表性的问题,答案也比较偏自己的开发实践,没有 DBA专业和深入,有出入的请使劲拍砖!MySQL读写性能是多少,有哪些性能相关的配置参数?MySQL负载高时,如何找到是由哪些SQL引起的?如何针对具体的SQ...  <a href='//www.ot7t.com.cn/xiaomage234/archive/2018/12/03/433534.html'>阅读全文</a><img src ="//www.ot7t.com.cn/xiaomage234/aggbug/433534.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="//www.ot7t.com.cn/xiaomage234/" target="_blank">小马?/a> 2018-12-03 15:55 <a href="//www.ot7t.com.cn/xiaomage234/archive/2018/12/03/433534.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>推荐几本学习MySQL的好书【转?/title><link>//www.ot7t.com.cn/xiaomage234/archive/2018/12/03/433533.html</link><dc:creator>小马?/dc:creator><author>小马?/author><pubDate>Mon, 03 Dec 2018 07:54:00 GMT</pubDate><guid>//www.ot7t.com.cn/xiaomage234/archive/2018/12/03/433533.html</guid><wfw:comment>//www.ot7t.com.cn/xiaomage234/comments/433533.html</wfw:comment><comments>//www.ot7t.com.cn/xiaomage234/archive/2018/12/03/433533.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>//www.ot7t.com.cn/xiaomage234/comments/commentRss/433533.html</wfw:commentRss><trackback:ping>//www.ot7t.com.cn/xiaomage234/services/trackbacks/433533.html</trackback:ping><description><![CDATA[from://mingxinglai.com/cn/2015/12/material-of-mysql/<br /><br /><p style="padding: 0.5em 0.2em; margin: 0px; border: none; outline: none; font-family: Galdeano, "Hiragino Sans GB", "Microsoft YaHei", Trebuchet, "Trebuchet MS", Tahoma, "Lucida Grande", "Lucida Sans Unicode", Verdana, sans-serif; font-size: 16px; background-color: #ffffff;">我这里推荐几本MySQL的好书,应该能够有效避免学习MySQL的弯路,并且达到一个不错的水平?我这里推荐的书或材料分为两个部分,分别是MySQL的使用和MySQL的源码学习。在介绍的过程中,我会穿插简单的评语或感想?/p><h2 class="yibqv">1.MySQL的使?/h2><h4>1.1 MySQL技术内?InnoDB存储引擎</h4><p style="padding: 0.5em 0.2em; margin: 0px; border: none; outline: none; font-family: Galdeano, "Hiragino Sans GB", "Microsoft YaHei", Trebuchet, "Trebuchet MS", Tahoma, "Lucida Grande", "Lucida Sans Unicode", Verdana, sans-serif; font-size: 16px; background-color: #ffffff;">学习MySQL的使用,首推姜承尧的《MySQL技术内?InnoDB存储引擎》,当然不是因为姜sir是我的经理才推荐这本书。这本书确实做到了由渐入深、深入浅出,是中国人写的最赞的MySQL技术书籍,符合国人的思维方式和阅读习惯,而且,这本书简直就是面试宝典,对于近期有求职MySQL相关岗位的朋友,可以认真阅读,对找工作有很大的帮助。当然,也有人说这本书入门难度较大,这个就自己取舍了,个人建议就以这本书入门即可,有不懂的地方可以求助官方手册和google?/p><p style="padding: 0.5em 0.2em; margin: 0px; border: none; outline: none; font-family: Galdeano, "Hiragino Sans GB", "Microsoft YaHei", Trebuchet, "Trebuchet MS", Tahoma, "Lucida Grande", "Lucida Sans Unicode", Verdana, sans-serif; font-size: 16px; background-color: #ffffff;"><img src="//mingxinglai.com/cn/image/mysql-book-1.jpg" alt="MySQL技术内? style="padding: 0px; margin: 4px auto; border: none; outline: none; max-width: 800px; display: block; box-shadow: #999999 1px 1px 4px;" /></p><h4>1.2 MySQL的官方手?/h4><p style="padding: 0.5em 0.2em; margin: 0px; border: none; outline: none; font-family: Galdeano, "Hiragino Sans GB", "Microsoft YaHei", Trebuchet, "Trebuchet MS", Tahoma, "Lucida Grande", "Lucida Sans Unicode", Verdana, sans-serif; font-size: 16px; background-color: #ffffff;">我刚开始学习MySQL的时候误区就是,没有好好阅读MySQL的官方手册。例如,我刚开始很难理解InnoDB的锁,尤其是各个情况下如何加锁,这个问题在我师弟进入百度做DBA时,也困扰了他一阵子,我们两还讨论来讨论去,其实,MySQL官方手册已经写得清清楚楚,什么样的SQL语句加什么样的锁,当然,MySQL的官方手册非常庞大,一时半会很难看完,建议先看InnoDB相关的部分?/p><p style="padding: 0.5em 0.2em; margin: 0px; border: none; outline: none; font-family: Galdeano, "Hiragino Sans GB", "Microsoft YaHei", Trebuchet, "Trebuchet MS", Tahoma, "Lucida Grande", "Lucida Sans Unicode", Verdana, sans-serif; font-size: 16px; background-color: #ffffff;"><a style="padding: 0px; margin: 0px; border: none; outline: none; color: #dd0000; text-decoration-line: none;">//dev.mysql.com/doc/refman/5.7/en/innodb-storage-engine.html</a></p><h4>1.3 MySQL排错指南</h4><p style="padding: 0.5em 0.2em; margin: 0px; border: none; outline: none; font-family: Galdeano, "Hiragino Sans GB", "Microsoft YaHei", Trebuchet, "Trebuchet MS", Tahoma, "Lucida Grande", "Lucida Sans Unicode", Verdana, sans-serif; font-size: 16px; background-color: #ffffff;">?a style="padding: 0px; margin: 0px; border: none; outline: none; color: #dd0000; text-decoration-line: none;">MySQL排错指南</a>》是2015年夏天引入中国的书籍,这本书可以说是DBA速成指南,介绍的内容其实比较简单,但是也非常实用,对于DBA这个讲究经验的工种,这本书就是传授经验的,可能对有较多工作经验的DBA来说,这本书基本没有什么用,但是,对于刚入职场的新人,或学校里的学生,这本书会有较大的帮助,非常推荐?/p><p style="padding: 0.5em 0.2em; margin: 0px; border: none; outline: none; font-family: Galdeano, "Hiragino Sans GB", "Microsoft YaHei", Trebuchet, "Trebuchet MS", Tahoma, "Lucida Grande", "Lucida Sans Unicode", Verdana, sans-serif; font-size: 16px; background-color: #ffffff;"><img src="//mingxinglai.com/cn/image/mysql-book-2.jpg" alt="MySQL排错指南" style="padding: 0px; margin: 4px auto; border: none; outline: none; max-width: 800px; display: block; box-shadow: #999999 1px 1px 4px;" /></p><h4>1.4 高性能MySQL</h4><p style="padding: 0.5em 0.2em; margin: 0px; border: none; outline: none; font-family: Galdeano, "Hiragino Sans GB", "Microsoft YaHei", Trebuchet, "Trebuchet MS", Tahoma, "Lucida Grande", "Lucida Sans Unicode", Verdana, sans-serif; font-size: 16px; background-color: #ffffff;">?a style="padding: 0px; margin: 0px; border: none; outline: none; color: #dd0000; text-decoration-line: none;">高性能MySQL</a>》是MySQL领域的经典之作,拥有广泛的影响力,学习MySQL的朋友都应该有所耳闻,所以我就不作过多介绍,唯一的建议就是仔细看、认真看、多看几遍,我每次看都会有不小的收获。这就是一本虽然书很厚,但是需要一页一页、一行一行都认真看的书?/p><p style="padding: 0.5em 0.2em; margin: 0px; border: none; outline: none; font-family: Galdeano, "Hiragino Sans GB", "Microsoft YaHei", Trebuchet, "Trebuchet MS", Tahoma, "Lucida Grande", "Lucida Sans Unicode", Verdana, sans-serif; font-size: 16px; background-color: #ffffff;"><img src="//mingxinglai.com/cn/image/mysql-book-3.jpg" alt="高性能MySQL" style="padding: 0px; margin: 4px auto; border: none; outline: none; max-width: 800px; display: block; box-shadow: #999999 1px 1px 4px;" /></p><h4>1.5 数据库索引设计与优化</h4><p style="padding: 0.5em 0.2em; margin: 0px; border: none; outline: none; font-family: Galdeano, "Hiragino Sans GB", "Microsoft YaHei", Trebuchet, "Trebuchet MS", Tahoma, "Lucida Grande", "Lucida Sans Unicode", Verdana, sans-serif; font-size: 16px; background-color: #ffffff;">如果认真学习完前面几本书,基本上都已经对MySQL掌握得不错了,但是,如果不了解如何设计一个好的索引,仍然不能成为牛逼的DBA,牛逼的DBA和不牛逼的DBA,一半就是看对索引的掌握情况,?a style="padding: 0px; margin: 0px; border: none; outline: none; color: #dd0000; text-decoration-line: none;">数据库索引设计与优化</a>》就是从普通DBA走向牛逼DBA的捷径,这本书在淘宝内部非常推崇,但是在中国名气却不是很大,很多人不了解。这本书也是今年夏天刚有中文版本的,非常值得入手以后跟着练习,虽然知道的人不多,豆瓣上也几乎没有什么评价,但是,强烈推荐、吐血推荐?/p><p style="padding: 0.5em 0.2em; margin: 0px; border: none; outline: none; font-family: Galdeano, "Hiragino Sans GB", "Microsoft YaHei", Trebuchet, "Trebuchet MS", Tahoma, "Lucida Grande", "Lucida Sans Unicode", Verdana, sans-serif; font-size: 16px; background-color: #ffffff;"><img src="//mingxinglai.com/cn/image/mysql-book-4.jpg" alt="数据库索引设计与优化" style="padding: 0px; margin: 4px auto; border: none; outline: none; max-width: 800px; display: block; box-shadow: #999999 1px 1px 4px;" /></p><h4>1.6 Effective MySQL系列</h4><p style="padding: 0.5em 0.2em; margin: 0px; border: none; outline: none; font-family: Galdeano, "Hiragino Sans GB", "Microsoft YaHei", Trebuchet, "Trebuchet MS", Tahoma, "Lucida Grande", "Lucida Sans Unicode", Verdana, sans-serif; font-size: 16px; background-color: #ffffff;">?a style="padding: 0px; margin: 0px; border: none; outline: none; color: #dd0000; text-decoration-line: none;">Effective MySQL系列</a>》是?</p><ul style="padding: 0px; margin: 0px; border: none; outline: none; list-style-position: inside; font-family: Galdeano, "Hiragino Sans GB", "Microsoft YaHei", Trebuchet, "Trebuchet MS", Tahoma, "Lucida Grande", "Lucida Sans Unicode", Verdana, sans-serif; font-size: 16px; background-color: #ffffff;"><li style="padding: 0.2em 0px; margin: 0px; border: none; outline: none;">Effective MySQL Replication Techniques in Depth</li><li style="padding: 0.2em 0px; margin: 0px; border: none; outline: none;">Effective MySQL之SQL语句最优化</li><li style="padding: 0.2em 0px; margin: 0px; border: none; outline: none;">Effective MySQL之备份与恢复</li></ul><p style="padding: 0.5em 0.2em; margin: 0px; border: none; outline: none; font-family: Galdeano, "Hiragino Sans GB", "Microsoft YaHei", Trebuchet, "Trebuchet MS", Tahoma, "Lucida Grande", "Lucida Sans Unicode", Verdana, sans-serif; font-size: 16px; background-color: #ffffff;"><img src="//mingxinglai.com/cn/image/mysql-book-5.jpg" alt="effective" style="padding: 0px; margin: 4px auto; border: none; outline: none; max-width: 800px; display: block; box-shadow: #999999 1px 1px 4px;" /></p><p style="padding: 0.5em 0.2em; margin: 0px; border: none; outline: none; font-family: Galdeano, "Hiragino Sans GB", "Microsoft YaHei", Trebuchet, "Trebuchet MS", Tahoma, "Lucida Grande", "Lucida Sans Unicode", Verdana, sans-serif; font-size: 16px; background-color: #ffffff;">这一系列并不如前面推荐的好,其中,我只看了前两本,这几本书只能算是小册子,如果有时间可以看看,对某一?#8221;模块”进入深入了解?/p><h2 class="yibqv">2.MySQL的源?/h2><p style="padding: 0.5em 0.2em; margin: 0px; border: none; outline: none; font-family: Galdeano, "Hiragino Sans GB", "Microsoft YaHei", Trebuchet, "Trebuchet MS", Tahoma, "Lucida Grande", "Lucida Sans Unicode", Verdana, sans-serif; font-size: 16px; background-color: #ffffff;">关于MySQL源码的书非常少,还好现在市面上有两本不错的书,而且刚好一本讲server层,一本讲innodb存储引擎层,对于学习MySQL源码会很有帮助,至少能够更加快速地了解MySQL的原理和宏观结构,然后再深入细节。此外,还有一些博客或PPT将得也很不错,这里推荐最好的几份材料?/p><h4>2.1 InnoDB - A journey to the core</h4><p style="padding: 0.5em 0.2em; margin: 0px; border: none; outline: none; font-family: Galdeano, "Hiragino Sans GB", "Microsoft YaHei", Trebuchet, "Trebuchet MS", Tahoma, "Lucida Grande", "Lucida Sans Unicode", Verdana, sans-serif; font-size: 16px; background-color: #ffffff;">?a style="padding: 0px; margin: 0px; border: none; outline: none; color: #dd0000; text-decoration-line: none;">InnoDB - A journey to the core</a>?是MySQL大牛Jeremy Cole写的PPT,介绍InnoDB的存储模块,即表空间、区、段、页的格式、记录的格式、槽等等。是学习Innodb存储的最好的材料。感谢Jeremy Cole!</p><h4>2.2 深入MySQL源码</h4><p style="padding: 0.5em 0.2em; margin: 0px; border: none; outline: none; font-family: Galdeano, "Hiragino Sans GB", "Microsoft YaHei", Trebuchet, "Trebuchet MS", Tahoma, "Lucida Grande", "Lucida Sans Unicode", Verdana, sans-serif; font-size: 16px; background-color: #ffffff;">登博的分享?a style="padding: 0px; margin: 0px; border: none; outline: none; color: #dd0000; text-decoration-line: none;">深入MySQL源码</a>》,相信很多想了解MySQL源码的朋友已经知道这份PPT,就不过多介绍,不过,要多说一句,登博的参考资料里列出的几个博客,都要关注一下,干货满满,是学习MySQL必须关注的博客?/p><h4>2.3 深入理解MySQL核心技?/h4><p style="padding: 0.5em 0.2em; margin: 0px; border: none; outline: none; font-family: Galdeano, "Hiragino Sans GB", "Microsoft YaHei", Trebuchet, "Trebuchet MS", Tahoma, "Lucida Grande", "Lucida Sans Unicode", Verdana, sans-serif; font-size: 16px; background-color: #ffffff;">?a style="padding: 0px; margin: 0px; border: none; outline: none; color: #dd0000; text-decoration-line: none;">深入理解MySQL核心技?/a>》是第一本关于MySQL源码的书,着重介绍了MySQL的Server层,重点介绍了宏观架构,对于刚开始学习MySQL源码的人,相信会有很大的帮助,我在学习MySQL源码的过程中,反复的翻阅了几遍,这本书刚开始看的时候会很痛苦,但是,对于研究MySQL源码,非常有帮助,就看你是否需要,如果没有研究MySQL源码的决心,这本书应该会被唾弃?/p><p style="padding: 0.5em 0.2em; margin: 0px; border: none; outline: none; font-family: Galdeano, "Hiragino Sans GB", "Microsoft YaHei", Trebuchet, "Trebuchet MS", Tahoma, "Lucida Grande", "Lucida Sans Unicode", Verdana, sans-serif; font-size: 16px; background-color: #ffffff;"><img src="//mingxinglai.com/cn/image/mysql-book-6.jpg" alt="深入理解MySQL核心技? style="padding: 0px; margin: 4px auto; border: none; outline: none; max-width: 800px; display: block; box-shadow: #999999 1px 1px 4px;" /></p><h4>2.4 MySQL内核:InnoDB存储引擎</h4><p style="padding: 0.5em 0.2em; margin: 0px; border: none; outline: none; font-family: Galdeano, "Hiragino Sans GB", "Microsoft YaHei", Trebuchet, "Trebuchet MS", Tahoma, "Lucida Grande", "Lucida Sans Unicode", Verdana, sans-serif; font-size: 16px; background-color: #ffffff;">我们组的同事写的?a style="padding: 0px; margin: 0px; border: none; outline: none; color: #dd0000; text-decoration-line: none;">MySQL内核:InnoDB存储引擎</a>》,可能宇宙范围内这本书就数我学得最认真了,虽然书中有很多编辑错误,但是,平心而论,还是写得非常好的,相对于《深入理解MySQL核心技术》,可读性更强一些,建议研究Innodb存储引擎的朋友,可以了解一下,先对Innodb有一个宏观的概念,对大致原理有一个整体的了解,然后再深入细节,肯定会比自己从头开始研究会快很多,这本书可以帮助你事半功倍?/p><p style="padding: 0.5em 0.2em; margin: 0px; border: none; outline: none; font-family: Galdeano, "Hiragino Sans GB", "Microsoft YaHei", Trebuchet, "Trebuchet MS", Tahoma, "Lucida Grande", "Lucida Sans Unicode", Verdana, sans-serif; font-size: 16px; background-color: #ffffff;"><img src="//mingxinglai.com/cn/image/mysql-book-7.jpg" alt="MySQL内核" style="padding: 0px; margin: 4px auto; border: none; outline: none; max-width: 800px; display: block; box-shadow: #999999 1px 1px 4px;" /></p><h4>2.5 MySQL Internals Manual</h4><p style="padding: 0.5em 0.2em; margin: 0px; border: none; outline: none; font-family: Galdeano, "Hiragino Sans GB", "Microsoft YaHei", Trebuchet, "Trebuchet MS", Tahoma, "Lucida Grande", "Lucida Sans Unicode", Verdana, sans-serif; font-size: 16px; background-color: #ffffff;">?a style="padding: 0px; margin: 0px; border: none; outline: none; color: #dd0000; text-decoration-line: none;">MySQL Internals Manual</a>》相对于MySQL Manual来说,写的太粗糙,谁让人家是官方文呢,研究MySQL源码的时候可以简单地参考一下,但是,还是不要指望文?能够回答你的问题,还需要看代码才行?/p><p style="padding: 0.5em 0.2em; margin: 0px; border: none; outline: none; font-family: Galdeano, "Hiragino Sans GB", "Microsoft YaHei", Trebuchet, "Trebuchet MS", Tahoma, "Lucida Grande", "Lucida Sans Unicode", Verdana, sans-serif; font-size: 16px; background-color: #ffffff;"><a style="padding: 0px; margin: 0px; border: none; outline: none; color: #dd0000; text-decoration-line: none;">//dev.mysql.com/doc/internals/en/</a></p><h4>2.6 MariaDB原理与实?/h4><p style="padding: 0.5em 0.2em; margin: 0px; border: none; outline: none; font-family: Galdeano, "Hiragino Sans GB", "Microsoft YaHei", Trebuchet, "Trebuchet MS", Tahoma, "Lucida Grande", "Lucida Sans Unicode", Verdana, sans-serif; font-size: 16px; background-color: #ffffff;">评论里提到的?a style="padding: 0px; margin: 0px; border: none; outline: none; color: #dd0000; text-decoration-line: none;">MariaDB原理与实?/a>》我也买了一本,还不错,MariaDB讲的并不多,重点讲了Group Commit、线程池和复制的实现,都是MySQL Server层的知识,对MySQL Server层感兴趣的可以参考一下?/p><p style="padding: 0.5em 0.2em; margin: 0px; border: none; outline: none; font-family: Galdeano, "Hiragino Sans GB", "Microsoft YaHei", Trebuchet, "Trebuchet MS", Tahoma, "Lucida Grande", "Lucida Sans Unicode", Verdana, sans-serif; font-size: 16px; background-color: #ffffff;"><img src="//mingxinglai.com/cn/image/mysql-book-8.jpg" alt="MariaDB" style="padding: 0px; margin: 4px auto; border: none; outline: none; max-width: 800px; display: block; box-shadow: #999999 1px 1px 4px;" /></p><h2 class="yibqv">3. 后记</h2><p style="padding: 0.5em 0.2em; margin: 0px; border: none; outline: none; font-family: Galdeano, "Hiragino Sans GB", "Microsoft YaHei", Trebuchet, "Trebuchet MS", Tahoma, "Lucida Grande", "Lucida Sans Unicode", Verdana, sans-serif; font-size: 16px; background-color: #ffffff;">希望这里推荐的材料对学习MySQL的同学、朋友有所帮助,也欢迎推荐靠谱的学习材料,大家共同进步?/p><img src ="//www.ot7t.com.cn/xiaomage234/aggbug/433533.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="//www.ot7t.com.cn/xiaomage234/" target="_blank">小马?/a> 2018-12-03 15:54 <a href="//www.ot7t.com.cn/xiaomage234/archive/2018/12/03/433533.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>那些年微信开发过的鸡肋功能,及其带给我们的思?/title><link>//www.ot7t.com.cn/jb2011/archive/2018/12/01/433532.html</link><dc:creator>Jack Jiang</dc:creator><author>Jack Jiang</author><pubDate>Sat, 01 Dec 2018 11:06:00 GMT</pubDate><guid>//www.ot7t.com.cn/jb2011/archive/2018/12/01/433532.html</guid><wfw:comment>//www.ot7t.com.cn/jb2011/comments/433532.html</wfw:comment><comments>//www.ot7t.com.cn/jb2011/archive/2018/12/01/433532.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>//www.ot7t.com.cn/jb2011/comments/commentRss/433532.html</wfw:commentRss><trackback:ping>//www.ot7t.com.cn/jb2011/services/trackbacks/433532.html</trackback:ping><description><![CDATA[     摘要: 本文由作?#8220;卫夕”(ID:weixizhibei)原创,作者为资深广告产品经理,致力于剖析互联网广告的基本逻辑、思路及技巧?、引言坐拥7亿日活的微信极其成功,有人说微信的成功在于赛道的成功,然而即便把微信和国际上其他地区的同类应用WhatsApp、Line等相比,微信所取得的成绩依然鹤立鸡群,不仅因为其庞大的用户量,更因为微信枝繁叶茂的生态体系。产品人张小龙微信教科书式的...  <a href='//www.ot7t.com.cn/jb2011/archive/2018/12/01/433532.html'>阅读全文</a><img src ="//www.ot7t.com.cn/jb2011/aggbug/433532.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="//www.ot7t.com.cn/jb2011/" target="_blank">Jack Jiang</a> 2018-12-01 19:06 <a href="//www.ot7t.com.cn/jb2011/archive/2018/12/01/433532.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>定期清理tomcat日志 - 四川福利彩票快乐12快乐12开奖直播快乐12开奖辽宁福彩快乐12快乐彩12选5走势图//www.ot7t.com.cn/yangjunwei/archive/2018/11/29/433528.html杨军?/dc:creator>杨军?/author>Thu, 29 Nov 2018 10:09:00 GMT//www.ot7t.com.cn/yangjunwei/archive/2018/11/29/433528.html//www.ot7t.com.cn/yangjunwei/comments/433528.html//www.ot7t.com.cn/yangjunwei/archive/2018/11/29/433528.html#Feedback0//www.ot7t.com.cn/yangjunwei/comments/commentRss/433528.html//www.ot7t.com.cn/yangjunwei/services/trackbacks/433528.html
vi clean.sh


logs_path="/app/tomcatftp/logs"

find $logs_path -mtime +3 -name "localhost.*.log" -exec rm -rf {} \;
find $logs_path -mtime +3 -name "localhost_access_log.*.txt" -exec rm -rf {} \;
find $logs_path -mtime +3 -name "catalina.*.log" -exec rm -rf {} \;
find $logs_path -mtime +3 -name "manager.*.log" -exec rm -rf {} \;
find $logs_path -mtime +3 -name "host-manager.*.log" -exec rm -rf {} \;
find $logs_path -mtime +3 -name "fileservice.log.*" -exec rm -rf {} \;
>$logs_path/catalina.out;




chmod 777 clean.sh

crontab -e

0 2 * * * sh /app/tomcatftp/logs/clean.sh


]]>用JWT技术解决IM系统Socket长连接的身份认证痛点 - 四川福利彩票快乐12快乐12开奖直播快乐12开奖辽宁福彩快乐12快乐彩12选5走势图//www.ot7t.com.cn/jb2011/archive/2018/11/28/433527.htmlJack JiangJack JiangWed, 28 Nov 2018 04:28:00 GMT//www.ot7t.com.cn/jb2011/archive/2018/11/28/433527.html//www.ot7t.com.cn/jb2011/comments/433527.html//www.ot7t.com.cn/jb2011/archive/2018/11/28/433527.html#Feedback0//www.ot7t.com.cn/jb2011/comments/commentRss/433527.html//www.ot7t.com.cn/jb2011/services/trackbacks/433527.html阅读全文

Jack Jiang 2018-11-28 12:28 发表评论
]]>
Python读写、创建文?/title><link>//www.ot7t.com.cn/xzclog/archive/2018/11/28/433526.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Wed, 28 Nov 2018 03:52:00 GMT</pubDate><guid>//www.ot7t.com.cn/xzclog/archive/2018/11/28/433526.html</guid><wfw:comment>//www.ot7t.com.cn/xzclog/comments/433526.html</wfw:comment><comments>//www.ot7t.com.cn/xzclog/archive/2018/11/28/433526.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>//www.ot7t.com.cn/xzclog/comments/commentRss/433526.html</wfw:commentRss><trackback:ping>//www.ot7t.com.cn/xzclog/services/trackbacks/433526.html</trackback:ping><description><![CDATA[ 原文链接://www.cnblogs.com/juandx/p/4962089.html python中对文件、文件夹(文件操作函数)的操作需要涉及到os模块和shutil模块? 得到当前工作目录,即当前Python脚本工作的目录路? os.getcwd() 返回指定目录下的所有文件和目录?os.listdir() 函数用来删除一个文?os.remove() 删除多个目录:os.removedirs(r“c:\python”? 检验给出的路径是否是一个文件:os.path.isfile() 检验给出的路径是否是一个目录:os.path.isdir() 判断是否是绝对路径:os.path.isabs() 检验给出的路径是否真地?os.path.exists() 返回一个路径的目录名和文件?os.path.split() eg os.path.split(‘/home/swaroop/byte/code/poem.txt’) 结果?‘/home/swaroop/byte/code’, ‘poem.txt’) 分离扩展名:os.path.splitext() 获取路径名:os.path.dirname() 获取文件名:os.path.basename() 运行shell命令: os.system() 读取和设置环境变?os.getenv() 与os.putenv() 给出当前平台使用的行终止?os.linesep Windows使用’\r\n’,Linux使用’\n’而Mac使用’\r’ 指示你正在使用的平台:os.name 对于Windows,它?#8217;nt’,而对于Linux/Unix用户,它?#8217;posix’ 重命名:os.rename(old?new? 创建多级目录:os.makedirs(r“c:\python\test”? 创建单个目录:os.mkdir?#8220;test”? 获取文件属性:os.stat(file? 修改文件权限与时间戳:os.chmod(file? 终止当前进程:os.exit() 获取文件大小:os.path.getsize(filename? 文件操作? os.mknod(“test.txt”) 创建空文? fp = open(“test.txt”,w) 直接打开一个文件,如果文件不存在则创建文件 关于open 模式? w 以写方式打开? a 以追加模式打开 (?EOF 开? 必要时创建新文件) r+ 以读写模式打开 w+ 以读写模式打开 (参见 w ) a+ 以读写模式打开 (参见 a ) rb 以二进制读模式打开 wb 以二进制写模式打开 (参见 w ) ab 以二进制追加模式打开 (参见 a ) rb+ 以二进制读写模式打开 (参见 r+ ) wb+ 以二进制读写模式打开 (参见 w+ ) ab+ 以二进制读写模式打开 (参见 a+ ) fp.read([size]) #size为读取的长度,以byte为单? fp.readline([size]) #读一行,如果定义了size,有可能返回的只是一行的一部分 fp.readlines([size]) #把文件每一行作为一个list的一个成员,并返回这个list。其实它的内部是通过循环调用readline()来实现的。如果提供size参数,size是表示读取内容的总长,也就是说可能只读到文件的一部分? fp.write(str) #把str写到文件中,write()并不会在str后加上一个换行符 fp.writelines(seq) #把seq的内容全部写到文件中(多行一次性写?。这个函数也只是忠实地写入,不会在每行后面加上任何东西? fp.close() #关闭文件。python会在一个文件不用后自动关闭文件,不过这一功能没有保证,最好还是养成自己关闭的习惯?如果一个文件在关闭后还对其进行操作会产生ValueError fp.flush() #把缓冲区的内容写入硬? fp.fileno() #返回一个长整型?#8221;文件标签“ fp.isatty() #文件是否是一个终端设备文件(unix系统中的? fp.tell() #返回文件操作标记的当前位置,以文件的开头为原点 fp.next() #返回下一行,并将文件操作标记位移到下一行。把一个file用于for … in file这样的语句时,就是调用next()函数来实现遍历的? fp.seek(offset[,whence]) #将文件打操作标记移到offset的位置。这个offset一般是相对于文件的开头来计算的,一般为正数。但如果提供了whence参数就不一定了,whence可以?表示从头开始计算,1表示以当前位置为原点计算?表示以文件末尾为原点进行计算。需要注意,如果文件以a或a+的模式打开,每次进行写操作时,文件操作标记会自动返回到文件末尾? fp.truncate([size]) #把文件裁成规定的大小,默认的是裁到当前文件操作标记的位置。如果size比文件的大小还要大,依据系统的不同可能是不改变文件,也可能是?把文件补到相应的大小,也可能是以一些随机的内容加上去? 目录操作? os.mkdir(“file”) 创建目录 复制文件? shutil.copyfile(“oldfile”,”newfile”) oldfile和newfile都只能是文件 shutil.copy(“oldfile”,”newfile”) oldfile只能是文件夹,newfile可以是文件,也可以是目标目录 复制文件夹: shutil.copytree(“olddir”,”newdir”) olddir和newdir都只能是目录,且newdir必须不存? 重命名文件(目录? os.rename(“oldname”,”newname”) 文件或目录都是使用这条命? 移动文件(目录) shutil.move(“oldpos”,”newpos”) 删除文件 os.remove(“file”) 删除目录 os.rmdir(“dir”)只能删除空目? shutil.rmtree(“dir”) 空目录、有内容的目录都可以? 转换目录 os.chdir(“path”) 换路? Python读写文件 1.open 使用open打开文件后一定要记得调用文件对象的close()方法。比如可以用try/finally语句来确保最后能关闭文件? file_object = open(‘thefile.txt’) try: all_the_text = file_object.read( ) finally: file_object.close( ) 注:不能把open语句放在try块里,因为当打开文件出现异常时,文件对象file_object无法执行close()方法? 2.读文? 读文本文? input = open('data', 'r') #第二个参数默认为r input = open('data') 1 2 3 读二进制文件 input = open('data', 'rb') 1 读取所有内? file_object = open('thefile.txt') try: all_the_text = file_object.read( ) finally: file_object.close( ) 1 2 3 4 5 读固定字? file_object = open('abinfile', 'rb') try: while True: chunk = file_object.read(100) if not chunk: break do_something_with(chunk) finally: file_object.close( ) 1 2 3 4 5 6 7 8 9 读每? list_of_all_the_lines = file_object.readlines( ) 1 如果文件是文本文件,还可以直接遍历文件对象获取每行: for line in file_object: process line 1 2 3.写文? 写文本文? output = open('data', 'w') 1 写二进制文件 output = open('data', 'wb') 1 追加写文? output = open('data', 'w+') 1 写数? file_object = open('thefile.txt', 'w') file_object.write(all_the_text) file_object.close( ) 1 2 3 写入多行 file_object.writelines(list_of_text_strings) 1 注意,调用writelines写入多行在性能上会比使用write一次性写入要高? 在处理日志文件的时候,常常会遇到这样的情况:日志文件巨大,不可能一次性把整个文件读入到内存中进行处理,例如需要在一台物理内存为 2GB 的机器上处理一?2GB 的日志文件,我们可能希望每次只处理其?200MB 的内容? ?Python 中,内置?File 对象直接提供了一?readlines(sizehint) 函数来完成这样的事情。以下面的代码为例: file = open('test.log', 'r')sizehint = 209715200 # 200Mposition = 0lines = file.readlines(sizehint)while not file.tell() - position < 0: position = file.tell() lines = file.readlines(sizehint) 1 每次调用 readlines(sizehint) 函数,会返回大约 200MB 的数据,而且所返回的必然都是完整的行数据,大多数情况下,返回的数据的字节数会稍微比 sizehint 指定的值大一点(除最后一次调?readlines(sizehint) 函数的时候)。通常情况下,Python 会自动将用户指定?sizehint 的值调整成内部缓存大小的整数倍? file在python是一个特殊的类型,它用于在python程序中对外部的文件进行操作。在python中一切都是对象,file也不例外,file有file的方法和属性。下面先来看如何创建一个file对象? file(name[, mode[, buffering]]) 1 file()函数用于创建一个file对象,它有一个别名叫open(),可能更形象一些,它们是内置函数。来看看它的参数。它参数都是以字符串的形式传递的。name是文件的名字? mode是打开的模式,可选的值为r w a U,分别代表读(默认) ?添加支持各种换行符的模式。用w或a模式打开文件的话,如果文件不存在,那么就自动创建。此外,用w模式打开一个已经存在的文件时,原有文件的内容会被清空,因为一开始文件的操作的标记是在文件的开头的,这时候进行写操作,无疑会把原有的内容给抹掉。由于历史的原因,换行符在不同的系统中有不同模式,比如在 unix中是一个\n,而在windows中是‘\r\n’,用U模式打开文件,就是支持所有的换行模式,也就说‘\r’ ‘\n’ ‘\r\n’都可表示换行,会有一个tuple用来存贮这个文件中用到过的换行符。不过,虽说换行有多种模式,读到python中统一用\n代替。在模式字符的后面,还可以加? b t这两种标识,分别表示可以对文件同时进行读写操作和用二进制模式、文本模式(默认)打开文件? buffering如果?表示不进行缓?如果?表示进行“行缓?#8220;;如果是一个大?的数表示缓冲区的大小,应该是以字节为单位的? file对象有自己的属性和方法。先来看看file的属性? closed #标记文件是否已经关闭,由close()改写 encoding #文件编码 mode #打开模式 name #文件? newlines #文件中用到的换行模式,是一个tuple softspace #boolean型,一般为0,据说用于print 1 2 3 4 5 6 file的读写方法: F.read([size]) #size为读取的长度,以byte为单? F.readline([size]) #读一行,如果定义了size,有可能返回的只是一行的一部分 F.readlines([size]) #把文件每一行作为一个list的一个成员,并返回这个list。其实它的内部是通过循环调用readline()来实现的。如果提供size参数,size是表示读取内容的总长,也就是说可能只读到文件的一部分? F.write(str) #把str写到文件中,write()并不会在str后加上一个换行符 F.writelines(seq) #把seq的内容全部写到文件中。这个函数也只是忠实地写入,不会在每行后面加上任何东西? file的其他方法: F.close() #关闭文件。python会在一个文件不用后自动关闭文件,不过这一功能没有保证,最好还是养成自己关闭的习惯。如果一个文件在关闭后还对其进行操作会产生ValueError F.flush() #把缓冲区的内容写入硬? F.fileno() #返回一个长整型?#8221;文件标签“ F.isatty() #文件是否是一个终端设备文件(unix系统中的? F.tell() #返回文件操作标记的当前位置,以文件的开头为原点 F.next() #返回下一行,并将文件操作标记位移到下一行。把一个file用于for ... in file这样的语句时,就是调用next()函数来实现遍历的? F.seek(offset[,whence]) #将文件打操作标记移到offset的位置。这个offset一般是相对于文件的开头来计算的,一般为正数。但如果提供了whence参数就不一定了,whence可以?表示从头开始计算,1表示以当前位置为原点计算?表示以文件末尾为原点进行计算。需要注意,如果文件以a或a+的模式打开,每次进行写操作时,文件操作标记会自动返回到文件末尾? F.truncate([size]) #把文件裁成规定的大小,默认的是裁到当前文件操作标记的位置。如果size比文件的大小还要大,依据系统的不同可能是不改变文件,也可能是?把文件补到相应的大小,也可能是以一些随机的内容加上去? 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 //www.cnblogs.com/allenblogs/archive/2010/09/13/1824842.html //www.cnblogs.com/rollenholt/archive/2012/04/23/2466179.html<img src ="//www.ot7t.com.cn/xzclog/aggbug/433526.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="//www.ot7t.com.cn/xzclog/" target="_blank">xzc</a> 2018-11-28 11:52 <a href="//www.ot7t.com.cn/xzclog/archive/2018/11/28/433526.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在java中写出完美的单例模式(转?/title><link>//www.ot7t.com.cn/jlin/archive/2018/11/27/433525.html</link><dc:creator>fly</dc:creator><author>fly</author><pubDate>Tue, 27 Nov 2018 14:51:00 GMT</pubDate><guid>//www.ot7t.com.cn/jlin/archive/2018/11/27/433525.html</guid><wfw:comment>//www.ot7t.com.cn/jlin/comments/433525.html</wfw:comment><comments>//www.ot7t.com.cn/jlin/archive/2018/11/27/433525.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>//www.ot7t.com.cn/jlin/comments/commentRss/433525.html</wfw:commentRss><trackback:ping>//www.ot7t.com.cn/jlin/services/trackbacks/433525.html</trackback:ping><description><![CDATA[<div id="cnblogs_post_body" style="margin-bottom: 20px; word-break: break-word;"><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">1. 前言</p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">单例(Singleton)应该是开发者们最熟悉的设计模式了,并且好像也是最容易实现?#8212;—基本上每个开发者都能够随手写出——但是,真的是这样吗?</p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">作为一个Java开发者,也许你觉得自己对单例模式的了解已经足够多了。我并不想危言耸听说一定还有你不知道的——毕竟我自己的了解也的确有限,但究竟你自己了解的程度到底怎样呢?往下看,我们一起来聊聊看~</p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">2. 什么是单例?/p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">单例对象的类必须保证只有一个实例存?#8212;—这是维基百科上对单例的定义,这也可以作为对意图实现单例模式的代码进行检验的标准?/p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">对单例的实现可以分为两大?#8212;—懒汉式和饿汉式,他们的区别在于:</p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><ul style="list-style: none; margin: 0px 0px 10px 30px; padding-left: 0px; font-size: 12px;"><li style="list-style-type: disc;"><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">懒汉式:指全局的单例实例在第一次被使用时构建?/p></li><li style="list-style-type: disc;"><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">饿汉式:指全局的单例实例在类装载时构建?/p></li></ul><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">从它们的区别也能看出来,日常我们使用的较多的应该是懒汉式的单例,毕竟按需加载才能做到资源的最大化利用嘛~</p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">3. 懒汉式单?/p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">先来看一下懒汉式单例的实现方式?/p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">3.1 简单版?/p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">看最简单的写法Version 1?/p><div style="margin: 5px 0px; font-size: 12px !important;"><div style="margin-top: 5px;"><span style="padding-right: 5px; line-height: 1.5 !important;"><a title="复制代码" style="color: #1a8bc8; border: none !important;"><img src="https://common.cnblogs.com/images/copycode.gif" alt="复制代码" style="max-width: 900px; height: auto; border: none !important;" /></a></span></div><pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important;"><span style="color: #008000; line-height: 1.5 !important;">//</span><span style="color: #008000; line-height: 1.5 !important;"> Version 1</span> <span style="color: #0000ff; line-height: 1.5 !important;">public</span> <span style="color: #0000ff; line-height: 1.5 !important;">class</span><span style="line-height: 1.5 !important;"> Single1 { </span><span style="color: #0000ff; line-height: 1.5 !important;">private</span> <span style="color: #0000ff; line-height: 1.5 !important;">static</span><span style="line-height: 1.5 !important;"> Single1 instance; </span><span style="color: #0000ff; line-height: 1.5 !important;">public</span> <span style="color: #0000ff; line-height: 1.5 !important;">static</span><span style="line-height: 1.5 !important;"> Single1 getInstance() { </span><span style="color: #0000ff; line-height: 1.5 !important;">if</span> (instance == <span style="color: #0000ff; line-height: 1.5 !important;">null</span><span style="line-height: 1.5 !important;">) { instance </span>= <span style="color: #0000ff; line-height: 1.5 !important;">new</span><span style="line-height: 1.5 !important;"> Single1(); } </span><span style="color: #0000ff; line-height: 1.5 !important;">return</span><span style="line-height: 1.5 !important;"> instance; } }</span></pre><div style="margin-top: 5px;"><span style="padding-right: 5px; line-height: 1.5 !important;"><a title="复制代码" style="color: #1a8bc8; border: none !important;"><img src="https://common.cnblogs.com/images/copycode.gif" alt="复制代码" style="max-width: 900px; height: auto; border: none !important;" /></a></span></div></div><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">或者再进一步,把构造器改为私有的,这样能够防止被外部的类调用?/p><div style="margin: 5px 0px; font-size: 12px !important;"><div style="margin-top: 5px;"><span style="padding-right: 5px; line-height: 1.5 !important;"><a title="复制代码" style="color: #1a8bc8; border: none !important;"><img src="https://common.cnblogs.com/images/copycode.gif" alt="复制代码" style="max-width: 900px; height: auto; border: none !important;" /></a></span></div><pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important;"><span style="color: #008000; line-height: 1.5 !important;">//</span><span style="color: #008000; line-height: 1.5 !important;"> Version 1.1</span> <span style="color: #0000ff; line-height: 1.5 !important;">public</span> <span style="color: #0000ff; line-height: 1.5 !important;">class</span><span style="line-height: 1.5 !important;"> Single1 { </span><span style="color: #0000ff; line-height: 1.5 !important;">private</span> <span style="color: #0000ff; line-height: 1.5 !important;">static</span><span style="line-height: 1.5 !important;"> Single1 instance; </span><span style="color: #0000ff; line-height: 1.5 !important;">private</span><span style="line-height: 1.5 !important;"> Single1() {} </span><span style="color: #0000ff; line-height: 1.5 !important;">public</span> <span style="color: #0000ff; line-height: 1.5 !important;">static</span><span style="line-height: 1.5 !important;"> Single1 getInstance() { </span><span style="color: #0000ff; line-height: 1.5 !important;">if</span> (instance == <span style="color: #0000ff; line-height: 1.5 !important;">null</span><span style="line-height: 1.5 !important;">) { instance </span>= <span style="color: #0000ff; line-height: 1.5 !important;">new</span><span style="line-height: 1.5 !important;"> Single1(); } </span><span style="color: #0000ff; line-height: 1.5 !important;">return</span><span style="line-height: 1.5 !important;"> instance; } }</span></pre><div style="margin-top: 5px;"><span style="padding-right: 5px; line-height: 1.5 !important;"><a title="复制代码" style="color: #1a8bc8; border: none !important;"><img src="https://common.cnblogs.com/images/copycode.gif" alt="复制代码" style="max-width: 900px; height: auto; border: none !important;" /></a></span></div></div><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">我仿佛记得当初学校的教科书就是这么教的?—— 每次获取instance之前先进行判断,如果instance为空就new一个出来,否则就直接返回已存在的instance?/p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">这种写法在大多数的时候也是没问题的。问题在于,当多线程工作的时候,如果有多个线程同时运行到if (instance == null),都判断为null,那么两个线程就各自会创建一个实?#8212;—这样一来,就不是单例了?/p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">3.2 synchronized版本</p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">那既然可能会因为多线程导致问题,那么加上一个同步锁吧!</p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">修改后的代码如下,相对于Version1.1,只是在方法签名上多加了一个synchronized?/p><div style="margin: 5px 0px; font-size: 12px !important;"><div style="margin-top: 5px;"><span style="padding-right: 5px; line-height: 1.5 !important;"><a title="复制代码" style="color: #1a8bc8; border: none !important;"><img src="https://common.cnblogs.com/images/copycode.gif" alt="复制代码" style="max-width: 900px; height: auto; border: none !important;" /></a></span></div><pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important;"><span style="color: #008000; line-height: 1.5 !important;">//</span><span style="color: #008000; line-height: 1.5 !important;"> Version 2 </span> <span style="color: #0000ff; line-height: 1.5 !important;">public</span> <span style="color: #0000ff; line-height: 1.5 !important;">class</span><span style="line-height: 1.5 !important;"> Single2 { </span><span style="color: #0000ff; line-height: 1.5 !important;">private</span> <span style="color: #0000ff; line-height: 1.5 !important;">static</span><span style="line-height: 1.5 !important;"> Single2 instance; </span><span style="color: #0000ff; line-height: 1.5 !important;">private</span><span style="line-height: 1.5 !important;"> Single2() {} </span><span style="color: #0000ff; line-height: 1.5 !important;">public</span> <span style="color: #0000ff; line-height: 1.5 !important;">static</span> <span style="color: #0000ff; line-height: 1.5 !important;">synchronized</span><span style="line-height: 1.5 !important;"> Single2 getInstance() { </span><span style="color: #0000ff; line-height: 1.5 !important;">if</span> (instance == <span style="color: #0000ff; line-height: 1.5 !important;">null</span><span style="line-height: 1.5 !important;">) { instance </span>= <span style="color: #0000ff; line-height: 1.5 !important;">new</span><span style="line-height: 1.5 !important;"> Single2(); } </span><span style="color: #0000ff; line-height: 1.5 !important;">return</span><span style="line-height: 1.5 !important;"> instance; } }</span></pre><div style="margin-top: 5px;"><span style="padding-right: 5px; line-height: 1.5 !important;"><a title="复制代码" style="color: #1a8bc8; border: none !important;"><img src="https://common.cnblogs.com/images/copycode.gif" alt="复制代码" style="max-width: 900px; height: auto; border: none !important;" /></a></span></div></div><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">OK,加上synchronized关键字之后,getInstance方法就会锁上了。如果有两个线程(T1、T2)同时执行到这个方法时,会有其中一个线程T1获得同步锁,得以继续执行,而另一个线程T2则需要等待,当第T1执行完毕getInstance之后(完成了null判断、对象创建、获得返回值之后),T2线程才会执行执行?#8212;—所以这端代码也就避免了Version1中,可能出现因为多线程导致多个实例的情况?/p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">但是,这种写法也有一个问题:给gitInstance方法加锁,虽然会避免了可能会出现的多个实例问题,但是会强制除T1之外的所有线程等待,实际上会对程序的执行效率造成负面影响?/p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">3.3 双重检查(Double-Check)版?/p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">Version2代码相对于Version1d代码的效率问题,其实是为了解?%几率的问题,而使用了一?00%出现的防护盾。那有一个优化的思路,就是把100%出现的防护盾,也改为1%的几率出现,使之只出现在可能会导致多个实例出现的地方?/p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">——有没有这样的方法呢?当然是有的,改进后的代码Vsersion3如下?/p><div style="margin: 5px 0px; font-size: 12px !important;"><div style="margin-top: 5px;"><span style="padding-right: 5px; line-height: 1.5 !important;"><a title="复制代码" style="color: #1a8bc8; border: none !important;"><img src="https://common.cnblogs.com/images/copycode.gif" alt="复制代码" style="max-width: 900px; height: auto; border: none !important;" /></a></span></div><pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important;"><span style="color: #008000; line-height: 1.5 !important;">//</span><span style="color: #008000; line-height: 1.5 !important;"> Version 3 </span> <span style="color: #0000ff; line-height: 1.5 !important;">public</span> <span style="color: #0000ff; line-height: 1.5 !important;">class</span><span style="line-height: 1.5 !important;"> Single3 { </span><span style="color: #0000ff; line-height: 1.5 !important;">private</span> <span style="color: #0000ff; line-height: 1.5 !important;">static</span><span style="line-height: 1.5 !important;"> Single3 instance; </span><span style="color: #0000ff; line-height: 1.5 !important;">private</span><span style="line-height: 1.5 !important;"> Single3() {} </span><span style="color: #0000ff; line-height: 1.5 !important;">public</span> <span style="color: #0000ff; line-height: 1.5 !important;">static</span><span style="line-height: 1.5 !important;"> Single3 getInstance() { </span><span style="color: #0000ff; line-height: 1.5 !important;">if</span> (instance == <span style="color: #0000ff; line-height: 1.5 !important;">null</span><span style="line-height: 1.5 !important;">) { </span><span style="color: #0000ff; line-height: 1.5 !important;">synchronized</span> (Single3.<span style="color: #0000ff; line-height: 1.5 !important;">class</span><span style="line-height: 1.5 !important;">) { </span><span style="color: #0000ff; line-height: 1.5 !important;">if</span> (instance == <span style="color: #0000ff; line-height: 1.5 !important;">null</span><span style="line-height: 1.5 !important;">) { instance </span>= <span style="color: #0000ff; line-height: 1.5 !important;">new</span><span style="line-height: 1.5 !important;"> Single3(); } } } </span><span style="color: #0000ff; line-height: 1.5 !important;">return</span><span style="line-height: 1.5 !important;"> instance; } }</span></pre><div style="margin-top: 5px;"><span style="padding-right: 5px; line-height: 1.5 !important;"><a title="复制代码" style="color: #1a8bc8; border: none !important;"><img src="https://common.cnblogs.com/images/copycode.gif" alt="复制代码" style="max-width: 900px; height: auto; border: none !important;" /></a></span></div></div><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">这个版本的代码看起来有点复杂,注意其中有两次if (instance == null)的判断,这个叫做『双重检?Double-Check』?/p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><ul style="list-style: none; margin: 0px 0px 10px 30px; padding-left: 0px; font-size: 12px;"><li style="list-style-type: disc;"><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">第一个if (instance == null),其实是为了解决Version2中的效率问题,只有instance为null的时候,才进入synchronized的代码段——大大减少了几率?/p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p></li><li style="list-style-type: disc;"><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">第二个if (instance == null),则是跟Version2一样,是为了防止可能出现多个实例的情况?/p></li></ul><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">—— 这段代码看起来已经完美无瑕了?/p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">……</p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">……</p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">……</p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">—— 当然,只是『看起来』,还是有小概率出现问题的?/p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">这弄清楚为什么这里可能出现问题,首先,我们需要弄清楚几个概念:原子操作、指令重排?/p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">知识点:什么是原子操作?/p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">简单来说,原子操作(atomic)就是不可分割的操作,在计算机中,就是指不会因为线程调度被打断的操作?/p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">比如,简单的赋值是一个原子操作:</p><div style="margin: 5px 0px; font-size: 12px !important;"><pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important;">m = 6; <span style="color: #008000; line-height: 1.5 !important;">//</span><span style="color: #008000; line-height: 1.5 !important;"> 这是个原子操?/span></pre></div><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">假如m原先的值为0,那么对于这个操作,要么执行成功m变成?,要么是没执行m还是0,而不会出现诸如m=3这种中间?#8212;—即使是在并发的线程中?/p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">而,声明并赋值就不是一个原子操作:</p><div style="margin: 5px 0px; font-size: 12px !important;"><pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important;"><span style="color: #0000ff; line-height: 1.5 !important;">int</span> n = 6; <span style="color: #008000; line-height: 1.5 !important;">//</span><span style="color: #008000; line-height: 1.5 !important;"> 这不是一个原子操?/span></pre></div><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">对于这个语句,至少有两个操作?/p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">①声明一个变量n</p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">②给n赋值为6</p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">——这样就会有一个中间状态:变量n已经被声明了但是还没有被赋值的状态?/p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">——这样,在多线程中,由于线程执行顺序的不确定性,如果两个线程都使用m,就可能会导致不稳定的结果出现?/p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">知识点:什么是指令重排?/p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">简单来说,就是计算机为了提高执行效率,会做的一些优化,在不影响最终结果的情况下,可能会对一些语句的执行顺序进行调整?/p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">比如,这一段代码:</p><div style="margin: 5px 0px; font-size: 12px !important;"><div style="margin-top: 5px;"><span style="padding-right: 5px; line-height: 1.5 !important;"><a title="复制代码" style="color: #1a8bc8; border: none !important;"><img src="https://common.cnblogs.com/images/copycode.gif" alt="复制代码" style="max-width: 900px; height: auto; border: none !important;" /></a></span></div><pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important;"><span style="color: #0000ff; line-height: 1.5 !important;">int</span> a ; <span style="color: #008000; line-height: 1.5 !important;">//</span><span style="color: #008000; line-height: 1.5 !important;"> 语句1 </span> <span style="line-height: 1.5 !important;"> a </span>= 8 ; <span style="color: #008000; line-height: 1.5 !important;">//</span><span style="color: #008000; line-height: 1.5 !important;"> 语句2</span> <span style="color: #0000ff; line-height: 1.5 !important;">int</span> b = 9 ; <span style="color: #008000; line-height: 1.5 !important;">//</span><span style="color: #008000; line-height: 1.5 !important;"> 语句3</span> <span style="color: #0000ff; line-height: 1.5 !important;">int</span> c = a + b ; <span style="color: #008000; line-height: 1.5 !important;">//</span><span style="color: #008000; line-height: 1.5 !important;"> 语句4</span></pre><div style="margin-top: 5px;"><span style="padding-right: 5px; line-height: 1.5 !important;"><a title="复制代码" style="color: #1a8bc8; border: none !important;"><img src="https://common.cnblogs.com/images/copycode.gif" alt="复制代码" style="max-width: 900px; height: auto; border: none !important;" /></a></span></div></div><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">正常来说,对于顺序结构,执行的顺序是自上到下,也?234?/p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">但是,由于指令重排的原因,因为不影响最终的结果,所以,实际执行的顺序可能会变成3124或?324?/p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">由于语句3?没有原子性的问题,语?和语?也可能会拆分成原子操作,再重排?/p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">——也就是说,对于非原子性的操作,在不影响最终结果的情况下,其拆分成的原子操作可能会被重新排列执行顺序?/p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">OK,了解了原子操作和指令重排的概念之后,我们再继续看Version3代码的问题?/p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">下面这段话直接从陈皓的文?深入浅出单实例SINGLETON设计模式)中复制而来?/p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">主要在于singleton = new Singleton()这句,这并非是一个原子操作,事实上在 JVM 中这句话大概做了下面 3 件事情?/p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">1. ?singleton 分配内存</p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">2. 调用 Singleton 的构造函数来初始化成员变量,形成实例</p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">3. 将singleton对象指向分配的内存空间(执行完这?singleton才是?null 了)</p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">但是?JVM 的即时编译器中存在指令重排序的优化。也就是说上面的第二步和第三步的顺序是不能保证的,最终的执行顺序可能?1-2-3 也可能是 1-3-2。如果是后者,则在 3 执行完毕? 未执行之前,被线程二抢占了,这时 instance 已经是非 null 了(但却没有初始化),所以线程二会直接返?instance,然后使用,然后顺理成章地报错?/p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">再稍微解释一下,就是说,由于有一个『instance已经不为null但是仍没有完成初始化』的中间状态,而这个时候,如果有其他线程刚好运行到第一层if (instance == null)这里,这里读取到的instance已经不为null了,所以就直接把这个中间状态的instance拿去用了,就会产生问题?/p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">这里的关键在?#8212;—线程T1对instance的写操作没有完成,线程T2就执行了读操作?/p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">3.4 终极版本:volatile</p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">对于Version3中可能出现的问题(当然这种概率已经非常小了,但毕竟还是有的嘛~),解决方案是:只需要给instance的声明加上volatile关键字即可,Version4版本?/p><div style="margin: 5px 0px; font-size: 12px !important;"><div style="margin-top: 5px;"><span style="padding-right: 5px; line-height: 1.5 !important;"><a title="复制代码" style="color: #1a8bc8; border: none !important;"><img src="https://common.cnblogs.com/images/copycode.gif" alt="复制代码" style="max-width: 900px; height: auto; border: none !important;" /></a></span></div><pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important;"><span style="color: #008000; line-height: 1.5 !important;">//</span><span style="color: #008000; line-height: 1.5 !important;"> Version 4 </span> <span style="color: #0000ff; line-height: 1.5 !important;">public</span> <span style="color: #0000ff; line-height: 1.5 !important;">class</span><span style="line-height: 1.5 !important;"> Single4 { </span><span style="color: #0000ff; line-height: 1.5 !important;">private</span> <span style="color: #0000ff; line-height: 1.5 !important;">static</span> <span style="color: #0000ff; line-height: 1.5 !important;">volatile</span><span style="line-height: 1.5 !important;"> Single4 instance; </span><span style="color: #0000ff; line-height: 1.5 !important;">private</span><span style="line-height: 1.5 !important;"> Single4() {} </span><span style="color: #0000ff; line-height: 1.5 !important;">public</span> <span style="color: #0000ff; line-height: 1.5 !important;">static</span><span style="line-height: 1.5 !important;"> Single4 getInstance() { </span><span style="color: #0000ff; line-height: 1.5 !important;">if</span> (instance == <span style="color: #0000ff; line-height: 1.5 !important;">null</span><span style="line-height: 1.5 !important;">) { </span><span style="color: #0000ff; line-height: 1.5 !important;">synchronized</span> (Single4.<span style="color: #0000ff; line-height: 1.5 !important;">class</span><span style="line-height: 1.5 !important;">) { </span><span style="color: #0000ff; line-height: 1.5 !important;">if</span> (instance == <span style="color: #0000ff; line-height: 1.5 !important;">null</span><span style="line-height: 1.5 !important;">) { instance </span>= <span style="color: #0000ff; line-height: 1.5 !important;">new</span><span style="line-height: 1.5 !important;"> Single4(); } } } </span><span style="color: #0000ff; line-height: 1.5 !important;">return</span><span style="line-height: 1.5 !important;"> instance; } }</span></pre><div style="margin-top: 5px;"><span style="padding-right: 5px; line-height: 1.5 !important;"><a title="复制代码" style="color: #1a8bc8; border: none !important;"><img src="https://common.cnblogs.com/images/copycode.gif" alt="复制代码" style="max-width: 900px; height: auto; border: none !important;" /></a></span></div></div><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">volatile关键字的一个作用是禁止指令重排,把instance声明为volatile之后,对它的写操作就会有一个内存屏障(什么是内存屏障?),这样,在它的赋值完成之前,就不用会调用读操作?/p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">注意:volatile阻止的不singleton = new Singleton()这句话内部[1-2-3]的指令重排,而是保证了在一个写操作([1-2-3])完成之前,不会调用读操作(if (instance == null))?/p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">——也就彻底防止了Version3中的问题发生?/p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">——好了,现在彻底没什么问题了吧?</p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">……</p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">……</p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">……</p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">好了,别紧张,的确没问题了。大名鼎鼎的EventBus中,其入口方法EventBus.getDefault()就是用这种方法来实现的?/p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">……</p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">……</p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">……</p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">不过,非要挑点刺的话还是能挑出来的,就是这个写法有些复杂了,不够优雅、简洁?/p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">4. 饿汉式单?/p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">下面再聊了解一下饿汉式的单例?/p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">如上所说,饿汉式单例是指:指全局的单例实例在类装载时构建的实现方式?/p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">由于类装载的过程是由类加载器(ClassLoader)来执行的,这个过程也是由JVM来保证同步的,所以这种方式先天就有一个优?#8212;—能够免疫许多由多线程引起的问题?/p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">4.1 饿汉式单例的实现方式</p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">饿汉式单例的实现如下?/p><div style="margin: 5px 0px; font-size: 12px !important;"><div style="margin-top: 5px;"><span style="padding-right: 5px; line-height: 1.5 !important;"><a title="复制代码" style="color: #1a8bc8; border: none !important;"><img src="https://common.cnblogs.com/images/copycode.gif" alt="复制代码" style="max-width: 900px; height: auto; border: none !important;" /></a></span></div><pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important;"><span style="color: #008000; line-height: 1.5 !important;">//</span><span style="color: #008000; line-height: 1.5 !important;">饿汉式实?/span> <span style="color: #0000ff; line-height: 1.5 !important;">public</span> <span style="color: #0000ff; line-height: 1.5 !important;">class</span><span style="line-height: 1.5 !important;"> SingleB { </span><span style="color: #0000ff; line-height: 1.5 !important;">private</span> <span style="color: #0000ff; line-height: 1.5 !important;">static</span> <span style="color: #0000ff; line-height: 1.5 !important;">final</span> SingleB INSTANCE = <span style="color: #0000ff; line-height: 1.5 !important;">new</span><span style="line-height: 1.5 !important;"> SingleB(); </span><span style="color: #0000ff; line-height: 1.5 !important;">private</span><span style="line-height: 1.5 !important;"> SingleB() {} </span><span style="color: #0000ff; line-height: 1.5 !important;">public</span> <span style="color: #0000ff; line-height: 1.5 !important;">static</span><span style="line-height: 1.5 !important;"> SingleB getInstance() { </span><span style="color: #0000ff; line-height: 1.5 !important;">return</span><span style="line-height: 1.5 !important;"> INSTANCE; } }</span></pre><div style="margin-top: 5px;"><span style="padding-right: 5px; line-height: 1.5 !important;"><a title="复制代码" style="color: #1a8bc8; border: none !important;"><img src="https://common.cnblogs.com/images/copycode.gif" alt="复制代码" style="max-width: 900px; height: auto; border: none !important;" /></a></span></div></div><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">对于一个饿汉式单例的写法来说,它基本上是完美的了?/p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">所以它的缺点也就只是饿汉式单例本身的缺点所在了——由于INSTANCE的初始化是在类加载时进行的,而类的加载是由ClassLoader来做的,所以开发者本来对于它初始化的时机就很难去准确把握?/p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><ol style="padding-left: 40px;"><li style="list-style-type: decimal;"><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">可能由于初始化的太早,造成资源的浪?/p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p></li><li style="list-style-type: decimal;"><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">如果初始化本身依赖于一些其他数据,那么也就很难保证其他数据会在它初始化之前准备好?/p></li></ol><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">当然,如果所需的单例占用的资源很少,并且也不依赖于其他数据,那么这种实现方式也是很好的?/p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">知识点:什么时候是类装载时?/p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">前面提到了单例在类装载时被实例化,那究竟什么时候才是『类装载时』呢?/p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">不严格的说,大致有这么几个条件会触发一个类被加载:</p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">1. new一个对象时</p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">2. 使用反射创建它的实例?/p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">3. 子类被加载时,如果父类还没被加载,就先加载父?/p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">4. jvm启动时执行的主类会首先被加载</p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">5. 一些其他的实现方式</p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">5.1 Effective Java 1 —— 静态内部类</p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">《Effective Java》一书的第一版中推荐了一个中写法?/p><div style="margin: 5px 0px; font-size: 12px !important;"><div style="margin-top: 5px;"><span style="padding-right: 5px; line-height: 1.5 !important;"><a title="复制代码" style="color: #1a8bc8; border: none !important;"><img src="https://common.cnblogs.com/images/copycode.gif" alt="复制代码" style="max-width: 900px; height: auto; border: none !important;" /></a></span></div><pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important;"><span style="color: #008000; line-height: 1.5 !important;">//</span><span style="color: #008000; line-height: 1.5 !important;"> Effective Java 第一版推荐写?/span> <span style="color: #0000ff; line-height: 1.5 !important;">public</span> <span style="color: #0000ff; line-height: 1.5 !important;">class</span><span style="line-height: 1.5 !important;"> Singleton { </span><span style="color: #0000ff; line-height: 1.5 !important;">private</span> <span style="color: #0000ff; line-height: 1.5 !important;">static</span> <span style="color: #0000ff; line-height: 1.5 !important;">class</span><span style="line-height: 1.5 !important;"> SingletonHolder { </span><span style="color: #0000ff; line-height: 1.5 !important;">private</span> <span style="color: #0000ff; line-height: 1.5 !important;">static</span> <span style="color: #0000ff; line-height: 1.5 !important;">final</span> Singleton INSTANCE = <span style="color: #0000ff; line-height: 1.5 !important;">new</span><span style="line-height: 1.5 !important;"> Singleton(); } </span><span style="color: #0000ff; line-height: 1.5 !important;">private</span><span style="line-height: 1.5 !important;"> Singleton (){} </span><span style="color: #0000ff; line-height: 1.5 !important;">public</span> <span style="color: #0000ff; line-height: 1.5 !important;">static</span> <span style="color: #0000ff; line-height: 1.5 !important;">final</span><span style="line-height: 1.5 !important;"> Singleton getInstance() { </span><span style="color: #0000ff; line-height: 1.5 !important;">return</span><span style="line-height: 1.5 !important;"> SingletonHolder.INSTANCE; } }</span></pre><div style="margin-top: 5px;"><span style="padding-right: 5px; line-height: 1.5 !important;"><a title="复制代码" style="color: #1a8bc8; border: none !important;"><img src="https://common.cnblogs.com/images/copycode.gif" alt="复制代码" style="max-width: 900px; height: auto; border: none !important;" /></a></span></div></div><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">这种写法非常巧妙?/p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><ul style="list-style: none; margin: 0px 0px 10px 30px; padding-left: 0px; font-size: 12px;"><li style="list-style-type: disc;"><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">对于内部类SingletonHolder,它是一个饿汉式的单例实现,在SingletonHolder初始化的时候会由ClassLoader来保证同步,使INSTANCE是一个真·单例?/p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p></li><li style="list-style-type: disc;"><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">同时,由于SingletonHolder是一个内部类,只在外部类的Singleton的getInstance()中被使用,所以它被加载的时机也就是在getInstance()方法第一次被调用的时候?/p></li></ul><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">——它利用了ClassLoader来保证了同步,同时又能让开发者控制类加载的时机。从内部看是一个饿汉式的单例,但是从外部看来,又的确是懒汉式的实现?/p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">简直是神乎其技?/p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">5.2 Effective Java 2 —— 枚举</p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">你以为到这就算完了?不,并没有,因为厉害的大神又发现了其他的方法?/p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">《Effective Java》的作者在这本书的第二版又推荐了另外一种方法,来直接看代码?/p><div style="margin: 5px 0px; font-size: 12px !important;"><div style="margin-top: 5px;"><span style="padding-right: 5px; line-height: 1.5 !important;"><a title="复制代码" style="color: #1a8bc8; border: none !important;"><img src="https://common.cnblogs.com/images/copycode.gif" alt="复制代码" style="max-width: 900px; height: auto; border: none !important;" /></a></span></div><pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important;"><span style="color: #008000; line-height: 1.5 !important;">//</span><span style="color: #008000; line-height: 1.5 !important;"> Effective Java 第二版推荐写?/span> <span style="color: #0000ff; line-height: 1.5 !important;">public</span> <span style="color: #0000ff; line-height: 1.5 !important;">enum</span><span style="line-height: 1.5 !important;"> SingleInstance { INSTANCE; </span><span style="color: #0000ff; line-height: 1.5 !important;">public</span> <span style="color: #0000ff; line-height: 1.5 !important;">void</span><span style="line-height: 1.5 !important;"> fun1() { </span><span style="color: #008000; line-height: 1.5 !important;">//</span><span style="color: #008000; line-height: 1.5 !important;"> do something</span> <span style="line-height: 1.5 !important;"> } } </span><span style="color: #008000; line-height: 1.5 !important;">//</span><span style="color: #008000; line-height: 1.5 !important;"> 使用</span> <span style="line-height: 1.5 !important;"> SingleInstance.INSTANCE.fun1();</span></pre><div style="margin-top: 5px;"><span style="padding-right: 5px; line-height: 1.5 !important;"><a title="复制代码" style="color: #1a8bc8; border: none !important;"><img src="https://common.cnblogs.com/images/copycode.gif" alt="复制代码" style="max-width: 900px; height: auto; border: none !important;" /></a></span></div></div><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">看到了么?这是一个枚举类?#8230;…连class都不用了,极简?/p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">由于创建枚举实例的过程是线程安全的,所以这种写法也没有同步的问题?/p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">作者对这个方法的评价:</p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">这种写法在功能上与共有域方法相近,但是它更简洁,无偿地提供了序列化机制,绝对防止对此实例化,即使是在面对复杂的序列化或者反射攻击的时候。虽然这中方法还没有广泛采用,但是单元素的枚举类型已经成为实现Singleton的最佳方法?/p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">枚举单例这种方法问世一些,许多分析文章都称它是实现单例的最完美方法——写法超级简单,而且又能解决大部分的问题?/p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">不过我个人认为这种方法虽然很优秀,但是它仍然不是完美?#8212;—比如,在需要继承的场景,它就不适用了?/p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">6. 总结</p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">OK,看到这里,你还会觉得单例模式是最简单的设计模式了么?再回头看一下你之前代码中的单例实现,觉得是无懈可击的么?/p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">可能我们在实际的开发中,对单例的实现并没有那么严格的要求。比如,我如果能保证所有的getInstance都是在一个线程的话,那其实第一种最简单的教科书方式就够用了。再比如,有时候,我的单例变成了多例也可能对程序没什么太大影?#8230;…</p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">但是,如果我们能了解更多其中的细节,那么如果哪天程序出了些问题,我们起码能多一个排查问题的点。早点解决问题,就能早点回家吃饭……</p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">—— 还有,完美的方案是不存在,任何方式都会有一个『度』的问题。比如,你的觉得代码已经无懈可击了,但是因为你用的是JAVA语言,可能ClassLoader有些BUG?#8230;…你的代码谁运行在JVM上的,可能JVM本身有BUG?#8230;…你的代码运行在手机上,可能手机系统有问题?#8230;…你生活在这个宇宙里,可能宇宙本身有些BUG?#8230;…</p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">所以,尽力做到能做到的最好就行了?/p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;"> </p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px;">—— 感谢你花费了不少时间看到这里,但愿你没有觉得虚度?/p></div><div style="clear: both;"></div><div id="blog_post_info_block" style="margin-top: 20px;"><div id="BlogPostCategory" style="margin-bottom: 10px; color: #4b4b4b; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff;"></div><div id="EntryTag" style="color: #4b4b4b; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; margin-top: 0px !important;"></div><div id="blog_post_info" style="color: #4b4b4b; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff;"></div></div><img src ="//www.ot7t.com.cn/jlin/aggbug/433525.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="//www.ot7t.com.cn/jlin/" target="_blank">fly</a> 2018-11-27 22:51 <a href="//www.ot7t.com.cn/jlin/archive/2018/11/27/433525.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MVC5 自定义特性验?/title><link>//www.ot7t.com.cn/javavle/archive/2018/11/27/433524.html</link><dc:creator>viery</dc:creator><author>viery</author><pubDate>Tue, 27 Nov 2018 14:45:00 GMT</pubDate><guid>//www.ot7t.com.cn/javavle/archive/2018/11/27/433524.html</guid><wfw:comment>//www.ot7t.com.cn/javavle/comments/433524.html</wfw:comment><comments>//www.ot7t.com.cn/javavle/archive/2018/11/27/433524.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>//www.ot7t.com.cn/javavle/comments/commentRss/433524.html</wfw:commentRss><trackback:ping>//www.ot7t.com.cn/javavle/services/trackbacks/433524.html</trackback:ping><description><![CDATA[     摘要:   <a href='//www.ot7t.com.cn/javavle/archive/2018/11/27/433524.html'>阅读全文</a><img src ="//www.ot7t.com.cn/javavle/aggbug/433524.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="//www.ot7t.com.cn/javavle/" target="_blank">viery</a> 2018-11-27 22:45 <a href="//www.ot7t.com.cn/javavle/archive/2018/11/27/433524.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> 技术干货:从零开始,教你设计一个百万级的消息推送系?/title><link>//www.ot7t.com.cn/jb2011/archive/2018/11/27/433523.html</link><dc:creator>Jack Jiang</dc:creator><author>Jack Jiang</author><pubDate>Tue, 27 Nov 2018 12:49:00 GMT</pubDate><guid>//www.ot7t.com.cn/jb2011/archive/2018/11/27/433523.html</guid><wfw:comment>//www.ot7t.com.cn/jb2011/comments/433523.html</wfw:comment><comments>//www.ot7t.com.cn/jb2011/archive/2018/11/27/433523.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>//www.ot7t.com.cn/jb2011/comments/commentRss/433523.html</wfw:commentRss><trackback:ping>//www.ot7t.com.cn/jb2011/services/trackbacks/433523.html</trackback:ping><description><![CDATA[     摘要: 1、点评本文主要分享的是如何从零设计开发一个中大型推送系统,因限于篇幅,文中有些键技术只能一笔带过,建议有这方面兴趣的读者可以深入研究相关知识点,从而形成横向知识体系。本文适合有一定开发、架构经验的后端程序员阅读,文内个别技术点可能并非最佳实践,但至少都是生动的实践分享,至少能起到抛砖引玉的作用。希望即时通讯网本次整理的文章能给予你一些启发。学习交流:- 即时通讯/推送技术开发交?群:10127...  <a href='//www.ot7t.com.cn/jb2011/archive/2018/11/27/433523.html'>阅读全文</a><img src ="//www.ot7t.com.cn/jb2011/aggbug/433523.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="//www.ot7t.com.cn/jb2011/" target="_blank">Jack Jiang</a> 2018-11-27 20:49 <a href="//www.ot7t.com.cn/jb2011/archive/2018/11/27/433523.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>cheat excel for comma - 四川福利彩票快乐12快乐12开奖直播快乐12开奖辽宁福彩快乐12快乐彩12选5走势图//www.ot7t.com.cn/cyhboy/archive/2018/11/27/433522.html萍水相?/dc:creator>萍水相?/author>Tue, 27 Nov 2018 06:16:00 GMT//www.ot7t.com.cn/cyhboy/archive/2018/11/27/433522.html//www.ot7t.com.cn/cyhboy/comments/433522.html//www.ot7t.com.cn/cyhboy/archive/2018/11/27/433522.html#Feedback0//www.ot7t.com.cn/cyhboy/comments/commentRss/433522.html//www.ot7t.com.cn/cyhboy/services/trackbacks/433522.htmlHere's a "cheat" for the comma that you want:

 

When you hard code the data validation list, instead of a comma in your entry (Boston, MA) , use this key combination: Alt+0130

 

It will display a comma in the data validation list, as you requested, BUT, it isn't a "real" comma, so it will be ignored if you search for the string - Boston, MA - in the other parts of the spreadsheet...Or if you try to use the ouput of the data validation selection to lookup matching values elsewhere in your workbook...

 

But if you are hard-coding your data validation list, I assume that you aren't planning to use it to reference other places in the workbook, right?



]]>
MAC系统每次启动Powerpoint都会自动打开两个PPT文件 - 四川福利彩票快乐12快乐12开奖直播快乐12开奖辽宁福彩快乐12快乐彩12选5走势图//www.ot7t.com.cn/nkjava/archive/2018/11/27/433520.html草原上的骆驼草原上的骆驼Mon, 26 Nov 2018 20:46:00 GMT//www.ot7t.com.cn/nkjava/archive/2018/11/27/433520.html//www.ot7t.com.cn/nkjava/comments/433520.html//www.ot7t.com.cn/nkjava/archive/2018/11/27/433520.html#Feedback0//www.ot7t.com.cn/nkjava/comments/commentRss/433520.html//www.ot7t.com.cn/nkjava/services/trackbacks/433520.htmlMAC系统每次启动Powerpoint都会自动打开两个PPT文件,很烦人,一直没有找到解决方案。终于在官网打到,解决方式如下:

这个问题的话建议您尝?span style="box-sizing: inherit; border: 0px; margin: 0px; padding: 0px; vertical-align: top; -webkit-font-smoothing: antialiased; text-size-adjust: none; color: #333333;">打开finder(访达),按 shift+command+G,输?/span>

~/Library/Containers/com.microsoft.Powerpoint/Data/Library/Preferences/AutoRecovery/

或者打开终端,输?/span>

open ~/Library/Containers/com.microsoft.Powerpoint/Data/Library/Preferences/AutoRecovery/

?/span>后删除里面的文件即可?/span>

希望以上信息能够帮助到您?/span>



]]>HDFS副本设置——默? - 四川福利彩票快乐12快乐12开奖直播快乐12开奖辽宁福彩快乐12快乐彩12选5走势图//www.ot7t.com.cn/xzclog/archive/2018/11/26/433518.htmlxzcxzcMon, 26 Nov 2018 03:52:00 GMT//www.ot7t.com.cn/xzclog/archive/2018/11/26/433518.html//www.ot7t.com.cn/xzclog/comments/433518.html//www.ot7t.com.cn/xzclog/archive/2018/11/26/433518.html#Feedback0//www.ot7t.com.cn/xzclog/comments/commentRss/433518.html//www.ot7t.com.cn/xzclog/services/trackbacks/433518.html

xzc 2018-11-26 11:52 发表评论
]]>
java问题排查工具库(转) - 四川福利彩票快乐12快乐12开奖直播快乐12开奖辽宁福彩快乐12快乐彩12选5走势图//www.ot7t.com.cn/xiaomage234/archive/2018/11/23/433512.html小马?/dc:creator>小马?/author>Fri, 23 Nov 2018 02:47:00 GMT//www.ot7t.com.cn/xiaomage234/archive/2018/11/23/433512.html//www.ot7t.com.cn/xiaomage234/comments/433512.html//www.ot7t.com.cn/xiaomage234/archive/2018/11/23/433512.html#Feedback0//www.ot7t.com.cn/xiaomage234/comments/commentRss/433512.html//www.ot7t.com.cn/xiaomage234/services/trackbacks/433512.html阅读全文

]]>
技术干货:实时视频直播首屏耗时400ms内的优化实践 - 四川福利彩票快乐12快乐12开奖直播快乐12开奖辽宁福彩快乐12快乐彩12选5走势图//www.ot7t.com.cn/jb2011/archive/2018/11/22/433511.htmlJack JiangJack JiangThu, 22 Nov 2018 04:48:00 GMT//www.ot7t.com.cn/jb2011/archive/2018/11/22/433511.html//www.ot7t.com.cn/jb2011/comments/433511.html//www.ot7t.com.cn/jb2011/archive/2018/11/22/433511.html#Feedback0//www.ot7t.com.cn/jb2011/comments/commentRss/433511.html//www.ot7t.com.cn/jb2011/services/trackbacks/433511.html阅读全文

Jack Jiang 2018-11-22 12:48 发表评论
]]>
脑残式网络编程入??:什么是公网IP和内网IP?NAT转换又是什么鬼?/title><link>//www.ot7t.com.cn/jb2011/archive/2018/11/20/433508.html</link><dc:creator>Jack Jiang</dc:creator><author>Jack Jiang</author><pubDate>Tue, 20 Nov 2018 04:34:00 GMT</pubDate><guid>//www.ot7t.com.cn/jb2011/archive/2018/11/20/433508.html</guid><wfw:comment>//www.ot7t.com.cn/jb2011/comments/433508.html</wfw:comment><comments>//www.ot7t.com.cn/jb2011/archive/2018/11/20/433508.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>//www.ot7t.com.cn/jb2011/comments/commentRss/433508.html</wfw:commentRss><trackback:ping>//www.ot7t.com.cn/jb2011/services/trackbacks/433508.html</trackback:ping><description><![CDATA[     摘要: 本文引用?#8220;帅地”发表于公众号苦逼的码农的技术分享?、引言搞网络通信应用开发的程序员,可能会经常听到外网IP(即互联网IP地址)和内网IP(即局域网IP地址),但他们的区别是什么?又有什么关系呢?另外,内行都知道,提到外网IP和内网IP就不得不提NAT路由转换这种东西,那这双是什么鬼?本文就来简单讲讲这些到底都是怎么回事。另外,以下是与本文内相关知识点有关联的文章,可详细...  <a href='//www.ot7t.com.cn/jb2011/archive/2018/11/20/433508.html'>阅读全文</a><img src ="//www.ot7t.com.cn/jb2011/aggbug/433508.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="//www.ot7t.com.cn/jb2011/" target="_blank">Jack Jiang</a> 2018-11-20 12:34 <a href="//www.ot7t.com.cn/jb2011/archive/2018/11/20/433508.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>layui真实进度?/title><link>//www.ot7t.com.cn/javavle/archive/2018/11/19/433506.html</link><dc:creator>viery</dc:creator><author>viery</author><pubDate>Mon, 19 Nov 2018 02:44:00 GMT</pubDate><guid>//www.ot7t.com.cn/javavle/archive/2018/11/19/433506.html</guid><wfw:comment>//www.ot7t.com.cn/javavle/comments/433506.html</wfw:comment><comments>//www.ot7t.com.cn/javavle/archive/2018/11/19/433506.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>//www.ot7t.com.cn/javavle/comments/commentRss/433506.html</wfw:commentRss><trackback:ping>//www.ot7t.com.cn/javavle/services/trackbacks/433506.html</trackback:ping><description><![CDATA[     摘要:   <a href='//www.ot7t.com.cn/javavle/archive/2018/11/19/433506.html'>阅读全文</a><img src ="//www.ot7t.com.cn/javavle/aggbug/433506.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="//www.ot7t.com.cn/javavle/" target="_blank">viery</a> 2018-11-19 10:44 <a href="//www.ot7t.com.cn/javavle/archive/2018/11/19/433506.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于PYTHON爬虫代理的很好的教程 - 四川福利彩票快乐12快乐12开奖直播快乐12开奖辽宁福彩快乐12快乐彩12选5走势图//www.ot7t.com.cn/katsutou/archive/2018/11/18/433505.htmlSeraphiSeraphiSun, 18 Nov 2018 08:56:00 GMT//www.ot7t.com.cn/katsutou/archive/2018/11/18/433505.html//www.ot7t.com.cn/katsutou/comments/433505.html//www.ot7t.com.cn/katsutou/archive/2018/11/18/433505.html#Feedback0//www.ot7t.com.cn/katsutou/comments/commentRss/433505.html//www.ot7t.com.cn/katsutou/services/trackbacks/433505.html
https://www.jianshu.com/p/ebf2e5b34aad


Seraphi 2018-11-18 16:56 发表评论
]]> 网络编程懒人入门(?:通俗讲解,有了IP地址,为何还要用MAC地址?/title><link>//www.ot7t.com.cn/jb2011/archive/2018/11/16/433502.html</link><dc:creator>Jack Jiang</dc:creator><author>Jack Jiang</author><pubDate>Fri, 16 Nov 2018 04:32:00 GMT</pubDate><guid>//www.ot7t.com.cn/jb2011/archive/2018/11/16/433502.html</guid><wfw:comment>//www.ot7t.com.cn/jb2011/comments/433502.html</wfw:comment><comments>//www.ot7t.com.cn/jb2011/archive/2018/11/16/433502.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>//www.ot7t.com.cn/jb2011/comments/commentRss/433502.html</wfw:commentRss><trackback:ping>//www.ot7t.com.cn/jb2011/services/trackbacks/433502.html</trackback:ping><description><![CDATA[     摘要: 1、前言标题虽然是为了解释有?IP 地址,为什么还要用 MAC 地址,但是本文的重点在于理解为什么要?IP 这样的东西。本文对读者的定位是知?MAC 地址是什么,IP 地址是什么。(本文同步发布于://www.52im.net/thread-2067-1-1.html?、关于作者翟志军,个人博客地址:https://showme.codes/,Github:https://git...  <a href='//www.ot7t.com.cn/jb2011/archive/2018/11/16/433502.html'>阅读全文</a><img src ="//www.ot7t.com.cn/jb2011/aggbug/433502.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="//www.ot7t.com.cn/jb2011/" target="_blank">Jack Jiang</a> 2018-11-16 12:32 <a href="//www.ot7t.com.cn/jb2011/archive/2018/11/16/433502.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>巴厘岛四日游 - 四川福利彩票快乐12快乐12开奖直播快乐12开奖辽宁福彩快乐12快乐彩12选5走势图//www.ot7t.com.cn/baicker/archive/2018/11/16/433501.html009009Fri, 16 Nov 2018 03:33:00 GMT//www.ot7t.com.cn/baicker/archive/2018/11/16/433501.html//www.ot7t.com.cn/baicker/comments/433501.html//www.ot7t.com.cn/baicker/archive/2018/11/16/433501.html#Feedback0//www.ot7t.com.cn/baicker/comments/commentRss/433501.html//www.ot7t.com.cn/baicker/services/trackbacks/433501.html一、行前准?/span>

1、 //images.mafengwo.net/images/i/face/daily_v2/169.png
9月印尼和
北京 温差不是很大,且降雨不多,总体适合出游。但当地紫外线较强,除好看的?裙外,防晒衫、防晒霜、帽子、泳?、沙滩鞋是必备品

2、证 //images.mafengwo.net/images/i/face/daily_v2/139.png
*出境?span style="color:red">护照
必须。此外,还建议打印所?span style="color:red">航班的英文确认单(拨打对应航司客服电话即可获取)+预定酒店的英文确认单,若有包车,保留相应包车信息,提前加好客服联系方式?br /> 3、行 //images.mafengwo.net/images/i/face/daily_v2/114.png
*机票 公司有特价机票活动,预定的是东航直飞夜晚航班,双人往?K左右?br /> 参考航班: 北京 - 巴厘?/span> 东航 MU781 09.14 16:30~00:50
巴厘?/span> - 北京 东航 MU782 09.19 01:35~08:40
*包车 淘宝-按照评价筛选的,中文包??10小时-320元左右。可参考店铺:懒猫旅行、憨豆旅?br /> 4、电话卡、货?br /> *电话?购于淘宝,几乎全?G信号,微信免流量?0分钟印尼、国内通话费,插卡即用,不?0块。购买渠道:飞猪-
西安优行旅游专营店?br /> *货币:( 北京 )需提前?a target="_blank">中国银行预约兑换?天兑换了2100多人民币?40万印尼盾,行程结束后还有110万印尼盾左右。兑换当天需?a target="_blank">中国银行卡或现金及身份证兑换?

二、四天行程规?/span>


本次行程较短,主要集中在巴厘岛南部活动,想体验火车、早起追海豚也可以向北部行动?/span>


Day1?/span>

Ø 住宿 //images.mafengwo.net/images/i/face/daily_v2/160.png:库塔宜必?Ibis Bali Kuta) Jl. Raya Kuta No. 77 Tel:(62-361)228228
预定途径:马蜂窝,含税?00元,房间较小。地理位置:距离机场较近的快捷酒店,大约3公里左右。机场出租车均不太正规,不打表随口要价,此处推荐提前预定好接机司?淘宝/马蜂?美团均可?

Ø 第一天包车行?宜必思酒?库塔海滩- 水明?/span> -海神? 金巴?/span> 普拉玛帕达酒店(又称fox?br /> 库塔海滩适合冲浪,以上三个海滩排序:海神庙> 水明?/span> >库塔?br /> 库塔周边可以随意逛逛,之前做攻略,宜必思酒店对面有家港式餐厅,味道不错,但我们当天出发太早,没时间吃,有时间的朋友可以尝尝,并且逛逛库塔,还是值得一逛。海神庙门票大约30?人,库塔?水明?/span>免费?br />
Day2?/span>

Ø 住宿 //images.mafengwo.net/images/i/face/daily_v2/160.png?金巴?/span> 普拉 玛帕达酒?Pramapada Hotel Jimbaran) 即(FOX HARRIS Jimbaran Beach?https://www.mafengwo.cn/hotel/16273806.html?iMddid=10460
地址:Jalan Yoga Perkanthi No. 03, Bali, Indonesia

预定途径:马蜂窝,含税?00元(不含早)

Ø 第二天包车行?nbsp;   酒店-神鹰广场-乌鲁瓦图情人?padang padang海滩- 金巴?/span> 海滩日落
神鹰广场,门?2.5万印尼盾/人,约合60?人,此景点不推荐,就是几个带有历史背景意义的雕塑,此处推荐使用大众点评海外版,可以查看到此景点的相关评价,不推荐,可以省下钱去蓝点海滩(10万印尼盾)?br /> *乌鲁瓦图情人?此处和海神庙有些类似,总体海滩也比较美,有好多猴子,某些猴子还会调皮的抢走人的眼镜等东西,且很不好要回来。之前看攻略,可以给工作人员小费让帮忙拿回来,实际上并找不到工作人员
//images.mafengwo.net/images/i/face/daily_v2/54.png
*padang padang
海滩 总体较小,也有一些猴子,但是比较乖巧,不会来抢人东西,左侧砂砾较大,右侧砂砾较细,海浪有些大,门票大?.5万印尼盾,记不太清了,总之很小很便宜,人很?br /> * 金巴?/span> 海滩 预定?金巴?/span> 普拉 玛帕达酒?Pramapada Hotel Jimbaran) 距离海滩100米左右,超级近,当天日落时间18:30,看到了超美的日落?
Day3

Ø 继续住宿?/span>金巴?/span>普拉玛帕达酒?Pramapada Hotel Jimbaran)
行程?/span>蓝梦?/span>一日游 超推荐,海水超蓝超清澈,一眼见底!!!

预定渠道:淘?懒猫旅行海外店,大家可以根据自己需要、按照好评筛选,我当时选的是三处浮?海底漫步?00元左右。三处浮潜的第二处浮潜特别美,在海底看到了各色的鱼、珊瑚,以及海蛇 //images.mafengwo.net/images/i/face/daily_v2/83.png。上午是海上娱乐及浮潜等,下午带着大家绕岛看景点:恶魔的眼泪(强推)、梦幻海滩,预定时说赠送预定红树林,但是当天并没有带大家看?br /> Day4?/span>

Ø 继续住宿金巴?/span>普拉玛帕达酒?Pramapada Hotel Jimbaran)

Ø 金巴?/span> 海滩躺卧一?br /> 由于前三天比较累,行程较赶,最后一天决定在金巴?/span>海滩卧倒一天,租赁遮阳伞、躺椅并不贵,足足躺了一?//images.mafengwo.net/images/i/face/daily_v2/79.png
推荐 金巴?/span>普拉玛帕达酒店附近的吃处?、金悦轩粤菜海鲜餐厅,可车接车送,大众点评搜索可添加中文客服微信,可使用微信、美团?、coco supermarket:出酒店右转-右转,直行大?公里左右即可看到这家超市,超市旁边是一家叫做:heineken的餐馆,价格便宜,味道不错,晚餐两人不到25块人民币?/span>

 



009 2018-11-16 11:33 发表评论
]]>
当同时安装Python2和Python3后,如何兼容并切换使用详解(比如pip使用?/title><link>//www.ot7t.com.cn/xzclog/archive/2018/11/16/433500.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Fri, 16 Nov 2018 01:38:00 GMT</pubDate><guid>//www.ot7t.com.cn/xzclog/archive/2018/11/16/433500.html</guid><wfw:comment>//www.ot7t.com.cn/xzclog/comments/433500.html</wfw:comment><comments>//www.ot7t.com.cn/xzclog/archive/2018/11/16/433500.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>//www.ot7t.com.cn/xzclog/comments/commentRss/433500.html</wfw:commentRss><trackback:ping>//www.ot7t.com.cn/xzclog/services/trackbacks/433500.html</trackback:ping><description><![CDATA[转自:https://www.cnblogs.com/shabbylee/p/6792555.html 由于历史原因,Python有两个大的版本分支,Python2和Python3,又由于一些库只支持某个版本分支,所以需要在电脑上同时安装Python2和Python3,因此如何让两个版本的Python兼容,如何让脚本在对应的Python版本上运行,这个是值得总结的? 对于Ubuntu 16.04 LTS版本来说,Python2?.7.12)和Python3?.5.2)默认同时安装,默认的python版本?.7.12? 当然你也可以用python2来调用? 如果想调用python3,就用python3. 对于Windows,就有点复杂了。因为不论python2还是python3,python可执行文件都叫python.exe,在cmd下输入python得到的版本号取决于环境变量里哪个版本的python路径更靠前,毕竟windows是按照顺序查找的。比如环境变量里的顺序是这样的: 那么cmd下的python版本就是2.7.12? 反之,则是python3的版本号? 这就带来一个问题了,如果你想用python2运行一个脚本,一会你又想用python3运行另一个脚本,你怎么做?来回改环境变量显然很麻烦? 网上很多办法比较简单粗暴,把两个python.exe改名啊,一个改成python2.exe,一个改成python3.exe。这样做固然可以,但修改可执行文件的方式,毕竟不是很好的方法? 我仔细查找了一些python技术文?,发现另外一个我觉得比较好的解决办法? 借用py的一个参数来调用不同版本的Python。py -2调用python2,py -3调用的是python3. 当python脚本需要python2运行时,只需在脚本前加上,然后运行py xxx.py即可? #! python2 当python脚本需要python3运行时,只需在脚本前加上,,然后运行py xxx.py即可? #! python3 就这么简单? 同时,这也完美解决了在pip在python2和python3共存的环境下报错,提示Fatal error in launcher: Unable to create process using '"'的问题? 当需要python2的pip时,只需 py -2 -m pip install xxx 当需要python3的pip时,只需 py -3 -m pip install xxx python2和python3的pip package就这样可以完美分开了?img src ="//www.ot7t.com.cn/xzclog/aggbug/433500.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="//www.ot7t.com.cn/xzclog/" target="_blank">xzc</a> 2018-11-16 09:38 <a href="//www.ot7t.com.cn/xzclog/archive/2018/11/16/433500.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java Swing ImageIcon 包Jar包后的路径问?/title><link>//www.ot7t.com.cn/Noah/archive/2018/11/15/433496.html</link><dc:creator>眼镜?/dc:creator><author>眼镜?/author><pubDate>Thu, 15 Nov 2018 07:51:00 GMT</pubDate><guid>//www.ot7t.com.cn/Noah/archive/2018/11/15/433496.html</guid><wfw:comment>//www.ot7t.com.cn/Noah/comments/433496.html</wfw:comment><comments>//www.ot7t.com.cn/Noah/archive/2018/11/15/433496.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>//www.ot7t.com.cn/Noah/comments/commentRss/433496.html</wfw:commentRss><trackback:ping>//www.ot7t.com.cn/Noah/services/trackbacks/433496.html</trackback:ping><description><![CDATA[如果直接写图片名比如?br />new ImageIcon("ico/start.png");<br />这时它会默认在你的项目工程下找。比?项目工程是这样的结构,Project1/scr/com/test/aaa.java。那它会找Project/ico/start.png,这个文件。放在这也可以。在Eclipse下执行是正常的。但如果是打成Jar包后。这个图片文件不会被打进去。打进去也找不到。你只能在在这个打好的Jar的同级目录下在放一个这个图片文件、夹。虽然这样可以解决问题。但总感觉,这个图片属于这个Jar的,应该跟Jar是一个整体?br />所以,比较好的解决办法是,改成这样?new ImageIcon(getClass().getResource("/ico/start.png"))。这样一改,它的读取位置就是Project1/src/ico/start.png. 这样就可以打Jar包时一起被打进来。并且在Eclipse里执行也能正常显示。比之前那种要考文件的“高级”一些?img src ="//www.ot7t.com.cn/Noah/aggbug/433496.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="//www.ot7t.com.cn/Noah/" target="_blank">眼镜?/a> 2018-11-15 15:51 <a href="//www.ot7t.com.cn/Noah/archive/2018/11/15/433496.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WINDOWS下映射Ctrl键为Command键(MAC用户使用?/title><link>//www.ot7t.com.cn/nkjava/archive/2018/11/14/433493.html</link><dc:creator>草原上的骆驼</dc:creator><author>草原上的骆驼</author><pubDate>Wed, 14 Nov 2018 14:52:00 GMT</pubDate><guid>//www.ot7t.com.cn/nkjava/archive/2018/11/14/433493.html</guid><wfw:comment>//www.ot7t.com.cn/nkjava/comments/433493.html</wfw:comment><comments>//www.ot7t.com.cn/nkjava/archive/2018/11/14/433493.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>//www.ot7t.com.cn/nkjava/comments/commentRss/433493.html</wfw:commentRss><trackback:ping>//www.ot7t.com.cn/nkjava/services/trackbacks/433493.html</trackback:ping><description><![CDATA[最近在MAC下使用WINDOWS下映射Win键到Ctrl键,这样和MAC上的键统一?br /><br /><br />使用开源的工具?br /><div class="yibqv">https://github.com/randyrants/sharpkeys/releases<br /><br /><br />具体的说明如下:</div><div class="yibqv"><div class="yibqv">https://superuser.com/questions/1264164/how-to-map-windows-key-to-ctrl-key-on-windows-10</div></div><img src ="//www.ot7t.com.cn/nkjava/aggbug/433493.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="//www.ot7t.com.cn/nkjava/" target="_blank">草原上的骆驼</a> 2018-11-14 22:52 <a href="//www.ot7t.com.cn/nkjava/archive/2018/11/14/433493.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> 阿里技术分享:阿里自研金融级数据库OceanBase的艰辛成长之?/title><link>//www.ot7t.com.cn/jb2011/archive/2018/11/14/433490.html</link><dc:creator>Jack Jiang</dc:creator><author>Jack Jiang</author><pubDate>Wed, 14 Nov 2018 04:49:00 GMT</pubDate><guid>//www.ot7t.com.cn/jb2011/archive/2018/11/14/433490.html</guid><wfw:comment>//www.ot7t.com.cn/jb2011/comments/433490.html</wfw:comment><comments>//www.ot7t.com.cn/jb2011/archive/2018/11/14/433490.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>//www.ot7t.com.cn/jb2011/comments/commentRss/433490.html</wfw:commentRss><trackback:ping>//www.ot7t.com.cn/jb2011/services/trackbacks/433490.html</trackback:ping><description><![CDATA[     摘要: 本文原始内容由作?#8220;阳振?#8221;整理发布于OceanBase技术公众号?、引言OceanBase 是蚂蚁金服自研的分布式数据库,在?9 年的发展历程里,从艰难上线到找不到业务场景濒临解散,最后在双十一的流量考验下浴火重生,成为蚂蚁金服全部核心系统的承载数据库。这一路走来的艰辛和故事,蚂蚁金服高级研究员、OceanBase 团队负责人阳振坤将为你娓娓道来。什么是OceanBa...  <a href='//www.ot7t.com.cn/jb2011/archive/2018/11/14/433490.html'>阅读全文</a><img src ="//www.ot7t.com.cn/jb2011/aggbug/433490.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="//www.ot7t.com.cn/jb2011/" target="_blank">Jack Jiang</a> 2018-11-14 12:49 <a href="//www.ot7t.com.cn/jb2011/archive/2018/11/14/433490.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【原】使用FRP代理内网HTTP/TCP服务,方便公司外部访?/title><link>//www.ot7t.com.cn/iduido/archive/2018/11/13/433488.html</link><dc:creator>java要多思考下</dc:creator><author>java要多思考下</author><pubDate>Tue, 13 Nov 2018 07:06:00 GMT</pubDate><guid>//www.ot7t.com.cn/iduido/archive/2018/11/13/433488.html</guid><wfw:comment>//www.ot7t.com.cn/iduido/comments/433488.html</wfw:comment><comments>//www.ot7t.com.cn/iduido/archive/2018/11/13/433488.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>//www.ot7t.com.cn/iduido/comments/commentRss/433488.html</wfw:commentRss><trackback:ping>//www.ot7t.com.cn/iduido/services/trackbacks/433488.html</trackback:ping><description><![CDATA[由于需要在外使用公司内部网络环境,故采用了FRP做了端口转发,以下是一些配置要点:<br /><br /><strong class="yibqv">1、服务端配置</strong><br />    服务器必须是公网服务器,可以在AWS或ALIYUN开通,得到公网IP?nbsp;<br />    服务器配置非常简单,只需要修改frps.ini文件,加入以下配置: <br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />//www.CodeHighlighter.com/<br /><br />-->[common]<br />bind_port = 7777          #服务器监听地址,配合公司内网机器使?br />vhost_http_port=80      #服务器监?0端口<br />vhost_https_port=443   #服务器监?43端口,Https<br /></div> <br /><strong class="yibqv">2、客户端配置<br /></strong>    客户端配置复杂度随着业务的复杂度的增加而变大?br />    客户端配置,修改frpc.ini文件,配置如下:<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />//www.CodeHighlighter.com/<br /><br />-->[common]<br />server_addr = xxx.xxx.xxx.xx           #公网服务器的外网IP地址<br />server_port = 7777                          #公网服务器的监听地址,同frps.ini中的bind_port配置<br /><br />[ssh]                                               #暴露公司内网的ssh服务<br />type = tcp                                       #选择tcp类型<br />local_ip = 127.0.0.1                         #内网机器ip,  frp客户端程序所在的内网机器<br />local_port = 22                                #内网机器允许的ssh服务登录端口<br />remote_port = 7022                         #内网机器监听的外网ssh登录端口?比如在家里访问公司内网服务器,只需要输?ssh -p 7022 user@xxx.xxx.xxx.xxx即可 <br /><br />[web]                                              #暴露公司内网的git代码托管服务<br />type = http                                      #选择http类型<br />local_port = 88                                #gitlab本地监听地址,默认是80,需要修改gitlab配置?8或其他端口,以避免与内网nginx端口占用的冲?br />custom_domains = git.domain.com   #外网域名,该域名可以在dns解析到xxx.xxx.xxx.xxx的外网服务器ip上,这样在外就可以通过域名访问公司内部服务         <br /><br />[web2]                                            #暴露更多的公司内网测试环境服?br />type = http<br />local_port = 80                                #nginx本地监听地址,外网进来的服务通过nginx匹配各种domain来区分请求,转发<br />custom_domains = test.domain.com<br /><br />[web3]<br />type = http<br />local_port = 80<br />custom_domains = test2.domain.com<br /><br />[tcp1]                                             #暴露公司内网的socket服务<br />type = tcp                                       #选择tcp类型<br />local_port = 1111                            #本地socket监听端口<br />remote_port = 1111                        #外网服务器的接收端口<br /><br />[tcp2]                                             #暴露更多内网socket服务<br />type = tcp<br />local_port = 2222<br />remote_port = 2222<br /><br />[mysql]                                           #暴露内网mysql服务<br />type = tcp                                       #选择tcp类型<br />local_port = 3306                            #mysql监听端口<br />remote_port = 3306</div><br /><strong class="yibqv">3、启动服?/strong><br />    ./start.sh  client启动脚本如下?server端类?<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />//www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">#</span><span style="color: #008000; ">!/bin/sh</span><span style="color: #008000; "><br /></span><br />PID=`ps aux|grep frp|grep -v <span style="color: #800000; ">'</span><span style="color: #800000; ">grep</span><span style="color: #800000; ">'</span>|awk <span style="color: #800000; ">'</span><span style="color: #800000; ">{print $2}</span><span style="color: #800000; ">'</span>`<br /><span style="color: #0000FF; ">if</span> [ <span style="color: #800000; ">"</span><span style="color: #800000; ">$PID</span><span style="color: #800000; ">"</span> = <span style="color: #800000; ">""</span> ]; then<br /> echo <span style="color: #800000; ">'</span><span style="color: #800000; ">start frpc now<img src="//www.ot7t.com.cn/Images/dot.gif" alt="" />.</span><span style="color: #800000; ">'</span><br /> ./frpc -c ./frpc.ini > c.log &<br /> sleep 2<br /> tail -n 20 c.log<br /> echo <span style="color: #800000; ">'</span><span style="color: #800000; ">start finished</span><span style="color: #800000; ">'</span><br /><span style="color: #0000FF; ">else</span><br /> echo $PID <span style="color: #800000; ">'</span><span style="color: #800000; ">stop frpc<img src="//www.ot7t.com.cn/Images/dot.gif" alt="" /></span><span style="color: #800000; ">'</span><br /> kill -9 $PID<br /> ./frpc -c ./frpc.ini > client.log &<br /> echo <span style="color: #800000; ">'</span><span style="color: #800000; ">start it now<img src="//www.ot7t.com.cn/Images/dot.gif" alt="" /></span><span style="color: #800000; ">'</span><br /> sleep 2<br /> tail -n 20 client.log<br /> echo <span style="color: #800000; ">'</span><span style="color: #800000; ">start finished<img src="//www.ot7t.com.cn/Images/dot.gif" alt="" /></span><span style="color: #800000; ">'</span><br />fi</div><br /><strong class="yibqv">4、其他问?/strong><br />    1、如果使用了云服务,如aliyun,aws等,需要在安全组中开通以上端口(remote_port)的访问权限,否则外网到内网的链路无法通过?br />    2、服务端运行后,客户端运行,随后可以通过外网域名直接访问内网服务<br /><br /><br /><br /><img src ="//www.ot7t.com.cn/iduido/aggbug/433488.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="//www.ot7t.com.cn/iduido/" target="_blank">java要多思考下</a> 2018-11-13 15:06 <a href="//www.ot7t.com.cn/iduido/archive/2018/11/13/433488.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用Vertx+Ignite+MongoDB搭建大DAU游戏服务?/title><link>//www.ot7t.com.cn/lhulcn618/archive/2018/11/13/433487.html</link><dc:creator>北国狼人的BloG</dc:creator><author>北国狼人的BloG</author><pubDate>Tue, 13 Nov 2018 06:29:00 GMT</pubDate><guid>//www.ot7t.com.cn/lhulcn618/archive/2018/11/13/433487.html</guid><wfw:comment>//www.ot7t.com.cn/lhulcn618/comments/433487.html</wfw:comment><comments>//www.ot7t.com.cn/lhulcn618/archive/2018/11/13/433487.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>//www.ot7t.com.cn/lhulcn618/comments/commentRss/433487.html</wfw:commentRss><trackback:ping>//www.ot7t.com.cn/lhulcn618/services/trackbacks/433487.html</trackback:ping><description><![CDATA[     摘要: 最近在funplus做游戏,进而研究了一个新型架构。之前做游戏都是自己使用java搭建架构,经过几年的积累确实也达到了最初的设想,多进程,进程内多线程,无锁?延迟纯jdbc写库。对于单服架构来说,已经趋近于极致。今年小游戏盛行,如海盗来了,疯狂游戏那家公司,全部使用的都是go+mongodb实现的,因为go的语言级别支援高并发,这点是java无法比拟的。不过java开源项目多,有很多的高手铺垫了...  <a href='//www.ot7t.com.cn/lhulcn618/archive/2018/11/13/433487.html'>阅读全文</a><img src ="//www.ot7t.com.cn/lhulcn618/aggbug/433487.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="//www.ot7t.com.cn/lhulcn618/" target="_blank">北国狼人的BloG</a> 2018-11-13 14:29 <a href="//www.ot7t.com.cn/lhulcn618/archive/2018/11/13/433487.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>好久不更新Blog了?/title><link>//www.ot7t.com.cn/lhulcn618/archive/2018/11/13/433486.html</link><dc:creator>北国狼人的BloG</dc:creator><author>北国狼人的BloG</author><pubDate>Tue, 13 Nov 2018 03:31:00 GMT</pubDate><guid>//www.ot7t.com.cn/lhulcn618/archive/2018/11/13/433486.html</guid><wfw:comment>//www.ot7t.com.cn/lhulcn618/comments/433486.html</wfw:comment><comments>//www.ot7t.com.cn/lhulcn618/archive/2018/11/13/433486.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>//www.ot7t.com.cn/lhulcn618/comments/commentRss/433486.html</wfw:commentRss><trackback:ping>//www.ot7t.com.cn/lhulcn618/services/trackbacks/433486.html</trackback:ping><description><![CDATA[<div class="yibqv"><span style='display: inline !important; float: none; background-color: transparent; color: #000000; font-family: verdana,"courier new"; font-size: 14px; font-style: normal; font-variant: normal; font-weight: 400; letter-spacing: normal; line-height: 21.33px; orphans: 2; text-align: left; text-decoration: none; text-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; white-space: normal; word-spacing: 0px;'>好久不写blog了,我都已经从完?》创?》创业失?》开心网-》创?》创业失?》蓝?》funplus走了很多的历程了?/span></div><strong class="yibqv"></strong><em></em><u></u><sub></sub><sup></sup><strike></strike><strong class="yibqv"></strong><em></em><u></u><sub></sub><sup></sup><strike></strike><img src ="//www.ot7t.com.cn/lhulcn618/aggbug/433486.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="//www.ot7t.com.cn/lhulcn618/" target="_blank">北国狼人的BloG</a> 2018-11-13 11:31 <a href="//www.ot7t.com.cn/lhulcn618/archive/2018/11/13/433486.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>微信团队分享:Kotlin渐被认可,Android版微信的技术尝鲜之?/title><link>//www.ot7t.com.cn/jb2011/archive/2018/11/12/433484.html</link><dc:creator>Jack Jiang</dc:creator><author>Jack Jiang</author><pubDate>Mon, 12 Nov 2018 11:03:00 GMT</pubDate><guid>//www.ot7t.com.cn/jb2011/archive/2018/11/12/433484.html</guid><wfw:comment>//www.ot7t.com.cn/jb2011/comments/433484.html</wfw:comment><comments>//www.ot7t.com.cn/jb2011/archive/2018/11/12/433484.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>//www.ot7t.com.cn/jb2011/comments/commentRss/433484.html</wfw:commentRss><trackback:ping>//www.ot7t.com.cn/jb2011/services/trackbacks/433484.html</trackback:ping><description><![CDATA[     摘要: 本文由微信开发团队工程是?#8220;oneliang”原创发表于WeMobileDev公众号,内容稍有改动?、引言Kotlin 是一个用于现代多平台应用的静态编程语言,由 JetBrains 开发(也就是开发了号称Java界最智能的集成开发工具IntelliJ IDEA的公司)。Kotlin可以编译成Java字节码(就像Groovy和Scala一样),也可以编译成JavaScri...  <a href='//www.ot7t.com.cn/jb2011/archive/2018/11/12/433484.html'>阅读全文</a><img src ="//www.ot7t.com.cn/jb2011/aggbug/433484.html" width = "1" height = "1" /><br><br><div align=right><a href="//www.ot7t.com.cn/" title="四川福利彩票快乐12">四川福利彩票快乐12</a> 2018-11-12 19:03 <a href="//www.ot7t.com.cn/jb2011/archive/2018/11/12/433484.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <script>(function(){ var src = (document.location.protocol == "http:") ? "//js.passport.qihucdn.com/11.0.1.js?f7a6bc378844a5df707c414e6b6fea33":"https://jspassport.ssl.qhimg.com/11.0.1.js?f7a6bc378844a5df707c414e6b6fea33"; document.write('<script src="' + src + '" id="sozz"><\/script>'); })(); </script>