-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.html
2710 lines (824 loc) · 107 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!DOCTYPE html>
<html class="theme-next pisces use-motion" lang="zh-CN">
<head><meta name="generator" content="Hexo 3.8.0">
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=2">
<meta name="theme-color" content="#222">
<link rel="stylesheet" href="/lib/font-awesome/css/font-awesome.min.css?v=4.7.0">
<link rel="stylesheet" href="/css/main.css?v=7.1.2">
<link rel="apple-touch-icon" sizes="180x180" href="/images/logo_cat_32.png?v=7.1.2">
<link rel="icon" type="image/png" sizes="32x32" href="/images/logo_cat_32.png?v=7.1.2">
<link rel="icon" type="image/png" sizes="16x16" href="/images/logo_cat_32.png?v=7.1.2">
<link rel="mask-icon" href="/images/logo_cat_32.png?v=7.1.2" color="#222">
<script id="hexo.configurations">
var NexT = window.NexT || {};
var CONFIG = {
root: '/',
scheme: 'Pisces',
version: '7.1.2',
sidebar: {"position":"left","display":"always","offset":12,"onmobile":false,"dimmer":false},
back2top: true,
back2top_sidebar: true,
fancybox: false,
fastclick: false,
lazyload: false,
tabs: true,
motion: {"enable":true,"async":false,"transition":{"post_block":"fadeIn","post_header":"slideDownIn","post_body":"slideDownIn","coll_header":"slideLeftIn","sidebar":"slideUpIn"}},
algolia: {
applicationID: '',
apiKey: '',
indexName: '',
hits: {"per_page":10},
labels: {"input_placeholder":"Search for Posts","hits_empty":"We didn't find any results for the search: ${query}","hits_stats":"${hits} results found in ${time} ms"}
}
};
</script>
<meta name="keywords" content="EBS,财务模块,APEX,Python,数据分析">
<meta property="og:type" content="website">
<meta property="og:title" content="Chong's Site book">
<meta property="og:url" content="https://leichong2019.github.io/index.html">
<meta property="og:site_name" content="Chong's Site book">
<meta property="og:locale" content="zh-CN">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Chong's Site book">
<link rel="canonical" href="https://leichong2019.github.io/">
<script id="page.configurations">
CONFIG.page = {
sidebar: "",
};
</script>
<title>Chong's Site book</title>
<noscript>
<style>
.use-motion .motion-element,
.use-motion .brand,
.use-motion .menu-item,
.sidebar-inner,
.use-motion .post-block,
.use-motion .pagination,
.use-motion .comments,
.use-motion .post-header,
.use-motion .post-body,
.use-motion .collection-title { opacity: initial; }
.use-motion .logo,
.use-motion .site-title,
.use-motion .site-subtitle {
opacity: initial;
top: initial;
}
.use-motion .logo-line-before i { left: initial; }
.use-motion .logo-line-after i { right: initial; }
</style>
</noscript>
</head>
<body itemscope itemtype="http://schema.org/WebPage" lang="zh-CN">
<div class="container sidebar-position-left
page-home">
<div class="headband"></div>
<header id="header" class="header" itemscope itemtype="http://schema.org/WPHeader">
<div class="header-inner"><div class="site-brand-wrapper">
<div class="site-meta">
<div class="custom-logo-site-title">
<a href="/" class="brand" rel="start">
<span class="logo-line-before"><i></i></span>
<span class="site-title">Chong's Site book</span>
<span class="logo-line-after"><i></i></span>
</a>
</div>
</div>
<div class="site-nav-toggle">
<button aria-label="切换导航栏">
<span class="btn-bar"></span>
<span class="btn-bar"></span>
<span class="btn-bar"></span>
</button>
</div>
</div>
<nav class="site-nav">
<ul id="menu" class="menu">
<li class="menu-item menu-item-home menu-item-active">
<a href="/" rel="section"><i class="menu-item-icon fa fa-fw fa-home"></i> <br>首页</a>
</li>
<li class="menu-item menu-item-tags">
<a href="/tags/" rel="section"><i class="menu-item-icon fa fa-fw fa-tags"></i> <br>标签<span class="badge">18</span></a>
</li>
<li class="menu-item menu-item-categories">
<a href="/categories/" rel="section"><i class="menu-item-icon fa fa-fw fa-th"></i> <br>分类<span class="badge">25</span></a>
</li>
<li class="menu-item menu-item-archives">
<a href="/archives/" rel="section"><i class="menu-item-icon fa fa-fw fa-archive"></i> <br>归档<span class="badge">33</span></a>
</li>
<li class="menu-item menu-item-hexo_docs">
<a href="/docs/" rel="section"><i class="menu-item-icon fa fa-fw fa-book"></i> <br>Hexo_docs</a>
</li>
<li class="menu-item menu-item-references">
<a href="/references/" rel="section"><i class="menu-item-icon fa fa-fw fa-book"></i> <br>references</a>
</li>
<li class="menu-item menu-item-markdown_ref">
<a href="/markdown_ref/" rel="section"><i class="menu-item-icon fa fa-fw fa-book"></i> <br>markdown_ref</a>
</li>
</ul>
</nav>
</div>
</header>
<a href="https://github.com/leichong2019/" class="github-corner" title="Follow me on GitHub" aria-label="Follow me on GitHub" rel="noopener" target="_blank"><svg width="80" height="80" viewbox="0 0 250 250" aria-hidden="true"><path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"/><path d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2" fill="currentColor" style="transform-origin: 130px 106px;" class="octo-arm"/><path d="M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z" fill="currentColor" class="octo-body"/></svg></a>
<main id="main" class="main">
<div class="main-inner">
<div class="content-wrap">
<div id="content" class="content">
<section id="posts" class="posts-expand">
<article class="post post-type-normal" itemscope itemtype="http://schema.org/Article">
<div class="post-block">
<link itemprop="mainEntityOfPage" href="https://leichong2019.github.io/2019/09/28/Oracle-Cloud-For-Free/">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="name" content="Chong">
<meta itemprop="description" content>
<meta itemprop="image" content="/images/logo_cat.jpg">
</span>
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="Chong's Site book">
</span>
<header class="post-header">
<h1 class="post-title" itemprop="name headline">
<a href="/2019/09/28/Oracle-Cloud-For-Free/" class="post-title-link" itemprop="url">免费注册Oracle Cloud</a>
</h1>
<div class="post-meta">
<span class="post-time">
<span class="post-meta-item-icon">
<i class="fa fa-calendar-o"></i>
</span>
<span class="post-meta-item-text">发表于</span>
<time title="创建时间:2019-09-28 22:48:54" itemprop="dateCreated datePublished" datetime="2019-09-28T22:48:54+08:00">2019-09-28</time>
<span class="post-meta-divider">|</span>
<span class="post-meta-item-icon">
<i class="fa fa-calendar-check-o"></i>
</span>
<span class="post-meta-item-text">更新于</span>
<time title="修改时间:2019-09-29 00:10:20" itemprop="dateModified" datetime="2019-09-29T00:10:20+08:00">2019-09-29</time>
</span>
<span class="post-category">
<span class="post-meta-divider">|</span>
<span class="post-meta-item-icon">
<i class="fa fa-folder-o"></i>
</span>
<span class="post-meta-item-text">分类于</span>
<span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/Oracle-Cloud/" itemprop="url" rel="index"><span itemprop="name">Oracle Cloud</span></a></span>
</span>
</div>
</header>
<div class="post-body" itemprop="articleBody">
<p>Larry在甲骨文Oracle OpenWorld 2019上大笔一挥,推出了终身免费的Oracle Cloud试用。虽然没办法跟Oracle的律师计较always free能维持多久,可以看得见的是羊毛还是值得一薅的。</p>
<h2 id="免费注册"><a href="#免费注册" class="headerlink" title="免费注册"></a>免费注册</h2><ul>
<li>注册网址:<a href="https://www.oracle.com/cn/cloud/free/" target="_blank" rel="noopener">https://www.oracle.com/cn/cloud/free/</a><br><img src="https://raw.githubusercontent.com/leichong2019/images/master/forNotebooks/20190928230845.png" alt></li>
</ul>
<p>注册步骤不复述了,网上有很多教程,一步一步填写就行了。<br>注册的过程中可能会遇到的问题,如收不到手机验证码,可能是以前注册过只能换手机试试了;信用卡审核不过,可以淘宝买visa或者master的1美元礼品卡注册一下。</p>
<ul>
<li>登陆地址<br>Oracle Cloud的控制台最近应该是被墙了,现在要访问的话要自备梯子,也许过段时间就好了。<br>控制台URL:<br>韩国区 <a href="https://console.ap-seoul-1.oraclecloud.com/" target="_blank" rel="noopener">https://console.ap-seoul-1.oraclecloud.com/</a><br>东京区 <a href="https://console.ap-tokyo-1.oraclecloud.com" target="_blank" rel="noopener">https://console.ap-tokyo-1.oraclecloud.com</a></li>
</ul>
<p>控制台登陆界面:<br><img src="https://raw.githubusercontent.com/leichong2019/images/master/forNotebooks/20190928232239.png" alt><br>登陆后可以看到,VPS虚机,自治数据库,数据仓库都有终生免费的功能可以使用,还是很值得个人学习折腾折腾的。</p>
<p>##Compute Instance VPS功能使用<br>在Compute / Instance 界面可以轻松创建各种虚机的实例Instance。<br>如果打算长期使用的话,配置估计要选最低的。不过现在反正有Larry给的300刀,选个几十核几十G内存的试试也未尝不可。<br>操作系统可以选Window、Oracle Linux、 Ubuntu<br><img src="https://raw.githubusercontent.com/leichong2019/images/master/forNotebooks/20190928232646.png" alt></p>
<p>我这里就做了个Ubuntu虚机,安装配置完成之后可以保存为自己定义的镜像模板,只要资源允许以后无限复制使用都可以。</p>
<h3 id="Instance-IP配置"><a href="#Instance-IP配置" class="headerlink" title="Instance IP配置"></a>Instance IP配置</h3><p>创建的实例,要勾选分配公网IP,这样才能正常通过公网访问。 VCN的私网IP是虚拟机内网使用的,VCN后面的网络配置能控制这两者之间的映射和过滤规则。<br><img src="https://raw.githubusercontent.com/leichong2019/images/master/forNotebooks/20190928233151.png" alt></p>
<h3 id="VCN及安全规则配置"><a href="#VCN及安全规则配置" class="headerlink" title="VCN及安全规则配置"></a>VCN及安全规则配置</h3><p>VCN Virtual Cloud Networks 从名字能猜出它管理这Oracle Cloud的虚拟网络及防火墙规则。从Internet外网对Oracle云内部的访问,需要经过VCN的路由才能通,同时Oracle Cloud内部的网络也在VCN中定义及管理。<br>新建虚机实例的时候,会创建一个默认VCN配置。着点很好理解,如果系统不自动创建,新建的实例可定时不能访问的,那就比较不友好了。<br>根据Oracle Cloud的文档,在默认VCN的管理下,Linux实例可以直接通过22端口SSH上去管理,window实例需要手工添加一条映射的安全规则才能远程桌面。</p>
<p>就是这个默认的安全规则Security Lists了,个人用的话改改这个就基本上够用了<br><img src="https://raw.githubusercontent.com/leichong2019/images/master/forNotebooks/20190928234243.png" alt></p>
<p>第一条是默认带过来的,允许22端口ssh, 请忽略第2、3、4条,比较偷懒的允许所有协议访问。大家自己用的时候千万别学这样,自己加需要的协议和端口就好了。<br><img src="https://raw.githubusercontent.com/leichong2019/images/master/forNotebooks/20190928234437.png" alt></p>
<h3 id="Ubuntu防火前设置"><a href="#Ubuntu防火前设置" class="headerlink" title="Ubuntu防火前设置"></a>Ubuntu防火前设置</h3><p>如果设置了允许所有规则,依然无法访问虚机,比如ssh正常但是开启tomcat,但是默认的8080网页访问不了,那估计是linux自己的防火墙拦住了。<br>关闭系统防火前及iptable限制试试。<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#停止firewall</span></span><br><span class="line">systemctl stop firewalld.service</span><br><span class="line"> </span><br><span class="line"><span class="comment">#禁止firewall开机启动</span></span><br><span class="line">systemctl <span class="built_in">disable</span> firewalld.service</span><br><span class="line"> </span><br><span class="line"><span class="comment">#关闭iptables</span></span><br><span class="line">service iptables stop</span><br><span class="line"> </span><br><span class="line"><span class="comment">#去掉iptables开机启动</span></span><br><span class="line">chkconfig iptables off</span><br><span class="line"><span class="comment">#开放所有端口</span></span><br><span class="line">sudo iptables -P INPUT ACCEPT</span><br><span class="line">sudo iptables -P FORWARD ACCEPT</span><br><span class="line">sudo iptables -P OUTPUT ACCEPT</span><br><span class="line">sudo iptables -F</span><br><span class="line"><span class="comment">#Oracle自带的Ubuntu镜像默认设置了Iptable规则,关闭它</span></span><br><span class="line">apt-get purge netfilter-persistent</span><br><span class="line">reboot </span><br><span class="line"><span class="comment">#强制删除</span></span><br><span class="line">rm -rf /etc/iptables && reboot</span><br></pre></td></tr></table></figure></p>
<h3 id="登陆用户设置"><a href="#登陆用户设置" class="headerlink" title="登陆用户设置"></a>登陆用户设置</h3><p>登录到云服务器,直接使用命令sudo -i 就可以切换到root权限,如果你想要使用root登录,请使用以下命令(密码是zzPasspword,你可以替换为其它的):<br>修改成允许root登陆,允许root密码登陆,修改root登陆密码</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">echo</span> root:zzPasspword |sudo chpasswd root</span><br><span class="line">sudo sed -i <span class="string">'s/^#\?PermitRootLogin.*/PermitRootLogin yes/g'</span> /etc/ssh/sshd_config;</span><br><span class="line">sudo sed -i <span class="string">'s/^#\?PasswordAuthentication.*/PasswordAuthentication yes/g'</span> /etc/ssh/sshd_config;</span><br><span class="line">sudo service sshd restart</span><br></pre></td></tr></table></figure>
<p>如果你想要开机就使用root登录,可以使用以下命令(密码是zzPasspword,你可以替换为其它的):<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#编辑cloud.cfg</span></span><br><span class="line">vim /etc/cloud/cloud.cfg</span><br><span class="line"><span class="comment">#在最后加入以下代码</span></span><br><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"><span class="built_in">echo</span> root:zzPasspword |sudo chpasswd root</span><br><span class="line">sudo sed -i <span class="string">'s/^#\?PermitRootLogin.*/PermitRootLogin yes/g'</span> /etc/ssh/sshd_config;</span><br><span class="line">sudo sed -i <span class="string">'s/^#\?PasswordAuthentication.*/PasswordAuthentication yes/g'</span> /etc/ssh/sshd_config;</span><br><span class="line">sudo service sshd restart</span><br></pre></td></tr></table></figure></p>
<h2 id="免费VPS性能评测"><a href="#免费VPS性能评测" class="headerlink" title="免费VPS性能评测"></a>免费VPS性能评测</h2><h3 id="bench-sh"><a href="#bench-sh" class="headerlink" title="bench.sh"></a>bench.sh</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#命令1:</span></span><br><span class="line">wget -qO- bench.sh | bash</span><br><span class="line"><span class="comment">#或者</span></span><br><span class="line">curl -Lso- bench.sh | bash</span><br><span class="line"></span><br><span class="line"><span class="comment">#命令2:</span></span><br><span class="line">wget -qO- 86.re/bench.sh | bash</span><br><span class="line"><span class="comment">#或者</span></span><br><span class="line">curl -so- 86.re/bench.sh | bash</span><br><span class="line"></span><br><span class="line"><span class="comment">#备注:</span></span><br><span class="line">bench.sh 既是脚本名,同时又是域名。如果以上失效,请使用以下地址下载再执行脚本:</span><br><span class="line"><span class="comment">#下载地址:</span></span><br><span class="line">https://github.com/teddysun/across/blob/master/bench.sh</span><br></pre></td></tr></table></figure>
<p><img src="https://raw.githubusercontent.com/leichong2019/images/master/forNotebooks/20190929000427.png" alt></p>
<h3 id="LemonBench"><a href="#LemonBench" class="headerlink" title="LemonBench"></a>LemonBench</h3><p><img src="https://raw.githubusercontent.com/leichong2019/images/master/forNotebooks/20190929000552.png" alt></p>
<h2 id="虚拟机使用"><a href="#虚拟机使用" class="headerlink" title="虚拟机使用"></a>虚拟机使用</h2><p>虚机和网络都配置好了,剩下就是用来做什么了。<br>相信很多人会用来做梯子,这个需求可以考虑 v2ray,配置还是比较方便的。<br>也可以用来做数据分析装上Anaconda 和Jupyterlab,公网可用,这是多么惬意啊。<br><img src="https://raw.githubusercontent.com/leichong2019/images/master/forNotebooks/20190929001006.png" alt></p>
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</div>
</article>
<article class="post post-type-normal" itemscope itemtype="http://schema.org/Article">
<div class="post-block">
<link itemprop="mainEntityOfPage" href="https://leichong2019.github.io/2019/08/12/Jupyter-notebook-500-Internal-Server-Error/">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="name" content="Chong">
<meta itemprop="description" content>
<meta itemprop="image" content="/images/logo_cat.jpg">
</span>
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="Chong's Site book">
</span>
<header class="post-header">
<h1 class="post-title" itemprop="name headline">
<a href="/2019/08/12/Jupyter-notebook-500-Internal-Server-Error/" class="post-title-link" itemprop="url">Jupyter Notebook 500:Internal Server Error</a>
</h1>
<div class="post-meta">
<span class="post-time">
<span class="post-meta-item-icon">
<i class="fa fa-calendar-o"></i>
</span>
<span class="post-meta-item-text">发表于</span>
<time title="创建时间:2019-08-12 01:28:28 / 修改时间:01:46:19" itemprop="dateCreated datePublished" datetime="2019-08-12T01:28:28+08:00">2019-08-12</time>
</span>
<span class="post-category">
<span class="post-meta-divider">|</span>
<span class="post-meta-item-icon">
<i class="fa fa-folder-o"></i>
</span>
<span class="post-meta-item-text">分类于</span>
<span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/Python/" itemprop="url" rel="index"><span itemprop="name">Python</span></a></span>
,
<span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/Python/Jupyter/" itemprop="url" rel="index"><span itemprop="name">Jupyter</span></a></span>
</span>
</div>
</header>
<div class="post-body" itemprop="articleBody">
<h2 id="Jupyter-Notebook-500-Internal-Server-Error"><a href="#Jupyter-Notebook-500-Internal-Server-Error" class="headerlink" title="Jupyter Notebook 500:Internal Server Error"></a>Jupyter Notebook 500:Internal Server Error</h2><p>毫无预兆,突然Jupyter Notebook除了能打开目录页面,打开其他任意notebook文件都是现实 500:Internal Error。 </p>
<p>检查Jupyter Notebook的控制面板,发现报错了。<br>具体错误内容好像是用jinjia2模板渲染网页的某个模块出问题了。进一步确认应该是刚装好的notebook extensions模块的问题。<br><img src="https://raw.githubusercontent.com/leichong2019/images/master/forNotebooks/%E5%BE%AE%E4%BF%A1%E6%88%AA%E5%9B%BE_20190812005147.png" alt></p>
<h2 id="解决办法"><a href="#解决办法" class="headerlink" title="解决办法"></a>解决办法</h2><p>决定先重装 nbextensions 试试</p>
<p>卸载:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">conda remove jupyter_contrib_nbextensions</span><br></pre></td></tr></table></figure></p>
<p>重装<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">conda install -c conda-forge jupyter_contrib_nbextensions</span><br></pre></td></tr></table></figure></p>
<p>重装之后Jupyter Notebook功能恢复正常。</p>
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</div>
</article>
<article class="post post-type-normal" itemscope itemtype="http://schema.org/Article">
<div class="post-block">
<link itemprop="mainEntityOfPage" href="https://leichong2019.github.io/2019/08/08/SQLAlchemy-Oracle-encoding-setup/">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="name" content="Chong">
<meta itemprop="description" content>
<meta itemprop="image" content="/images/logo_cat.jpg">
</span>
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="Chong's Site book">
</span>
<header class="post-header">
<h1 class="post-title" itemprop="name headline">
<a href="/2019/08/08/SQLAlchemy-Oracle-encoding-setup/" class="post-title-link" itemprop="url">SQLAlchemy和cx_Oracle使用中碰到的数据库编码问题</a>
</h1>
<div class="post-meta">
<span class="post-time">
<span class="post-meta-item-icon">
<i class="fa fa-calendar-o"></i>
</span>
<span class="post-meta-item-text">发表于</span>
<time title="创建时间:2019-08-08 13:01:37 / 修改时间:16:39:10" itemprop="dateCreated datePublished" datetime="2019-08-08T13:01:37+08:00">2019-08-08</time>
</span>
<span class="post-category">
<span class="post-meta-divider">|</span>
<span class="post-meta-item-icon">
<i class="fa fa-folder-o"></i>
</span>
<span class="post-meta-item-text">分类于</span>
<span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/Python/" itemprop="url" rel="index"><span itemprop="name">Python</span></a></span>
,
<span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/Python/SQLAlchemy/" itemprop="url" rel="index"><span itemprop="name">SQLAlchemy</span></a></span>
</span>
</div>
</header>
<div class="post-body" itemprop="articleBody">
<h2 id="1-系统结构及问题"><a href="#1-系统结构及问题" class="headerlink" title="1. 系统结构及问题"></a>1. 系统结构及问题</h2><pre><code>最近在搭建基于Jupyter notebook,panda,dash plotly的数据分析系统。从各个业务系统抽取数据,分析展示。
难免会涉及到中间数据保存,最后返现还是绕不开数据库。为了方便选了Oracle XE,看重其pluggable PDB实在是方便,每个库还可以不同字符编码,兼容各个业务系统。
然鹅,当我用pd.to_sql输出到DB的时候,却发现各种编码问题,并不是SQLAlchemy create engine的时候指定编码就能解决的。
</code></pre><p><img src="https://raw.githubusercontent.com/leichong2019/images/master/forNotebooks/20190808130001.png" alt="数据分析系统"></p>
<h2 id="2-数据读取"><a href="#2-数据读取" class="headerlink" title="2. 数据读取"></a>2. 数据读取</h2><pre><code>当业务系统库是UTF-8,我在XE DB中建了一个UTF-8的PDB,本已实现免除encoding转换。各库中都保留原来的编码,python中提取之后都是unicode,理想很完美。
现实是当我用cx_Oracle读取UTF-8业务库的数据,pandas中数据内容很正常。
此处穿件连接的encoding选项功能很正常。
</code></pre><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">con = cx_Oracle.connect(data_driver.MAIN_CONNECT_STRING,encoding=<span class="string">"UTF-8"</span>)</span><br><span class="line"></span><br><span class="line">df_all = pd.read_sql_query(con=con, sql=str_sql)</span><br></pre></td></tr></table></figure>
<h2 id="3-数据写入PDB"><a href="#3-数据写入PDB" class="headerlink" title="3. 数据写入PDB"></a>3. 数据写入PDB</h2><pre><code>写入数据库时,如果直接用cx_Oracle驱动代码比较麻烦,一般直觉肯会用Pandas的DataFrame.to_sql。这样底层的令人痛疼的create table, insert 都一边去,自己要做的就是在pandas里面整理数据,to_sql扔给数据库持久化保存。从效率来看,to_sql也远比 to_excel效率高,节省资源。
写入数据库,代码节大概如下。
</code></pre><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#SQLAlchemy 建立数据库engine</span></span><br><span class="line"><span class="comment">#这里按照文档,用了encoding='utf-8'。 双方数据都是utf-8编码,正常应该没问题。</span></span><br><span class="line">engine = create_engine(<span class="string">'oracle://'</span> + <span class="string">'DATANA:datana@XE_PDB3'</span>,encoding=<span class="string">'utf-8'</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment">#查看数据库编码,确实是 SIMPLIFIED CHINESE_CHINA.AL32UTF8</span></span><br><span class="line">engine.execute(<span class="string">"select userenv('language') from dual"</span>).fetchall()</span><br><span class="line"></span><br><span class="line"><span class="comment">#写数据</span></span><br><span class="line">df_all.to_sql(name=<span class="string">'表明_table'</span></span><br><span class="line"> ,con=engine <span class="comment"># utf-8 的sqlalchemy engine</span></span><br><span class="line"> ,if_exists=<span class="string">'replace'</span></span><br><span class="line"> ,chunksize=<span class="number">10000</span></span><br><span class="line"> ,dtype={ <span class="string">'column name'</span> : sqlalchemy.types.VARCHAR(<span class="number">10</span>) <span class="comment"># 对于pandas中object的列,要定义类型,否则。。。自动clob也是慢</span></span><br><span class="line"> }</span><br><span class="line"> ,index=<span class="literal">False</span></span><br><span class="line">)</span><br></pre></td></tr></table></figure>
<pre><code>写代码的时候自信满满以为照顾到了各方编码,结果还是出来GBK编码错误. 数据中心有'\xa0'全角空格,gbk无法编码。
返回错误
</code></pre><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">UnicodeEncodeError: <span class="string">'gbk'</span> codec can<span class="string">'t encode character '</span>\xa0<span class="string">' in position 0: illegal multibyte sequence</span></span><br></pre></td></tr></table></figure>
<h2 id="4-问题排查及解决"><a href="#4-问题排查及解决" class="headerlink" title="4. 问题排查及解决"></a>4. 问题排查及解决</h2><pre><code>错误出来之后,首先想到的是数据库编码有问题。
重复检查数据库,确实双方都是UTF-8, 分析用的XE PDB中也确实是UTF-8, 手工录入'\xa0'都没有问题。所以排除数据库自身编码的问题。
其次想到的是操作系统默认编码,因为服务器是windows,通过chcp 650001,改变默认编码为unicode,在启动python,这样貌似没地方会使gbk编码了吧。应该完美了。
测试之后,还是被打脸了,错误信息一点变化都没有。
最后想排查cx_Oracle 和SQLAlchemy 这两个库。
读取数据的时候pandas直接使用的cx_Oracle 连接,指定utf-8编码之后数据是正常的,所以基本上定位是SQLAlchemy的问题。
创建engine的时候,这里指定的encoding是否有效存疑啊。看来还是SQLAlchemy和cx_Oracle集成的时候出现了问题。
</code></pre><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">engine = create_engine(<span class="string">'oracle://'</span> + <span class="string">'DATANA:datana@XE_PDB3'</span>,encoding=<span class="string">'utf-8'</span>)</span><br></pre></td></tr></table></figure>
<pre><code>翻了几篇官方文档,试了各种。。。。此处省略一万种选择。最后找到希望
</code></pre><p><a href="https://docs.sqlalchemy.org/en/13/core/engines.html#sqlalchemy.create_engine" target="_blank" rel="noopener">Custom DBAPI connect() arguments</a><br><img src="https://raw.githubusercontent.com/leichong2019/images/master/forNotebooks/20190808162450.png" alt></p>
<p>SQLAlchemy对于创建 engine这件事情,提供了深度客制化的选择。<code>对于cx_Oracle兼容不太满意的情况,可以自己建一个creator,保证cx_Oracle的配置都做好之后,再传给SQLAlchemy。</code></p>
<p>代码示例:<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 定义基于cx_Oracle的creator,在里面生成connection,保证使用UTF-8编码。这是能正常work的,在读取的时候也验证过。</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">con_creator</span><span class="params">()</span>:</span></span><br><span class="line"> <span class="keyword">return</span> cx_Oracle.connect(<span class="string">'datana/datana@XE_PDB3'</span>, encoding=<span class="string">"UTF-8"</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment">#连接库生成SQLAlchemy engine时,调用creator,这时encoding写上就写上吧,可能真没用。</span></span><br><span class="line">engine = create_engine(<span class="string">'oracle+cx_oracle://'</span>, creator=con_creator ,encoding=<span class="string">'utf-8'</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">#写数据,这回没有烦人的encoding 错误了。拜拜了gbk</span></span><br><span class="line">df_all.to_sql(name=<span class="string">'表明_table'</span></span><br><span class="line"> ,con=engine <span class="comment"># utf-8 的sqlalchemy engine</span></span><br><span class="line"> ,if_exists=<span class="string">'replace'</span></span><br><span class="line"> ,chunksize=<span class="number">10000</span></span><br><span class="line"> ,dtype={ <span class="string">'column name'</span> : sqlalchemy.types.VARCHAR(<span class="number">10</span>) <span class="comment"># 对于pandas中object的列,要定义类型,否则。。。自动clob也是慢</span></span><br><span class="line"> }</span><br><span class="line"> ,index=<span class="literal">False</span></span><br><span class="line">)</span><br></pre></td></tr></table></figure></p>
<p>摆脱了这个编码问题,继续我建设功能感人的数据分析平台之路。</p>
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</div>
</article>