-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.xml
908 lines (661 loc) · 52.4 KB
/
index.xml
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
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Just Numbers & Things</title>
<link>http://justnumbersandthings.com/</link>
<atom:link href="http://justnumbersandthings.com/index.xml" rel="self" type="application/rss+xml" />
<description>Just Numbers & Things</description>
<generator>Source Themes Academic (https://sourcethemes.com/academic/)</generator><language>en-us</language><copyright>© 2019</copyright><lastBuildDate>Sun, 24 Nov 2019 00:00:00 +0000</lastBuildDate>
<image>
<url>http://justnumbersandthings.com/img/icon-192.png</url>
<title>Just Numbers & Things</title>
<link>http://justnumbersandthings.com/</link>
</image>
<item>
<title> Setting up Oracle ODBC on macOS with ISQL</title>
<link>http://justnumbersandthings.com/post/2019-11-24-setup-oracle-odbc-with-isql/</link>
<pubDate>Sun, 24 Nov 2019 00:00:00 +0000</pubDate>
<guid>http://justnumbersandthings.com/post/2019-11-24-setup-oracle-odbc-with-isql/</guid>
<description>
<h1 id="0-install-isql">0) Install ISQL</h1>
<p>If you&rsquo;re on macOS the easiest way to install isql is using <a href="https://brew.sh" target="_blank">homebrew</a> <code>brew install unixodbc</code>.</p>
<h1 id="1-download-drivers">1) Download drivers</h1>
<ol>
<li>Download ODBC Package &amp; Basic Package from <a href="https://www.oracle.com/database/technologies/instant-client/macos-intel-x86-downloads.html" target="_blank">here</a></li>
<li>Create an oracle account if necessary</li>
</ol>
<h1 id="2-prepare-driver-files">2) Prepare driver files</h1>
<ol>
<li><code>cd Downloads</code></li>
<li><code>unzip instantclient-basic-macos.x64-19.3.0.0.0dbru.zip</code></li>
<li><code>unsip instantclient-odbc-macos.x64-19.3.0.0.0dbru.zip</code></li>
<li><code>mkdir ~/lib</code></li>
<li><code>mkdir -p /opt/oracle/</code></li>
<li><code>mv $(pwd)/instantclient_19_3 /opt/oracle/</code></li>
<li><code>ln -s /opt/oracle/instantclient_19_3/libclntsh.dylib.19.1 /opt/oracle/instantclient_19_3/libclntshcore.dylib.19.1 ~/lib</code></li>
</ol>
<h1 id="3-update-odbc-ini-files">3) Update ODBC ini files</h1>
<ol>
<li><p>update <code>odbcinst.ini</code> to add</p>
<pre><code>[ODBC Drivers]
Oracle ODBC Driver = Installed
...
...
[Oracle ODBC Driver]
Description = Oracle 19 ODBC driver
Driver = /opt/oracle/instantclient_19_3/libsqora.dylib.19.1
Setup =
FileUsage =
CPTimeout =
CPReuse =
</code></pre></li>
<li><p>Update <code>odbc.ini</code> to add</p>
<pre><code>[ODBC Data Sources]
{dsn_name} = [Oracle ODBC Driver]
...
...
[{dsn_name}]
AggregateSQLType=FLOAT
Application Attributes=T
Attributes=W
BatchAutocommitMode=IfAllSuccessful
BindAsFLOAT=F
CacheBufferSize=20
CloseCursor=F
DisableDPM=F
DisableMTS=T
DisableRULEHint=T
Driver=/opt/oracle/instantclient_19_3/libsqora.dylib.19.1
DSN={dsn_name}
EXECSchemaOpt=
EXECSyntax=T
Failover=T
FailoverDelay=10
FailoverRetryCount=10
FetchBufferSize=64000
ForceWCHAR=F
LobPrefetchSize=8192
Lobs=T
Longs=T
MaxLargeData=0
MaxTokenSize=8192
MetadataIdDefault=F
QueryTimeout=T
ResultSets=T
ServerName={host}:{port}/{server}
SQLGetData extensions=F
SQLTranslateErrors=F
StatementCache=F
Translation DLL=
Translation Option=0
UseOCIDescribeAny=F
UserID={username}
Password={password}
</code></pre></li>
</ol>
<h1 id="4-verify-installation">4) Verify installation</h1>
<ol>
<li>Verify by connecting <code>isql -v {dsn_name}</code></li>
<li>Note: on macOS Catalina or later you may have to workaround the lack of notarization by navigating to &ldquo;system preferences&gt;security&gt;allow&rdquo; and approving multiple files after multiple connection attempts using step 4.1</li>
</ol>
</description>
</item>
<item>
<title> Connecting to Google BigQuery with DBeaver</title>
<link>http://justnumbersandthings.com/post/2018-10-07-dbeaver-bigquery-part2/</link>
<pubDate>Sun, 07 Oct 2018 00:00:00 +0000</pubDate>
<guid>http://justnumbersandthings.com/post/2018-10-07-dbeaver-bigquery-part2/</guid>
<description>
<h1 id="0-install-dbeaver">0) Install DBeaver</h1>
<p>You can find installation instructions <a href="http://justnumbersandthings.com/post/2017-03-26-dbeaver-mac/">here</a>.
Make sure to install version 5.2.2 or later. If you haven&rsquo;t updated to 5.2.2 or later you may use this <a href="http://justnumbersandthings.com/post/2018-09-22-dbeaver-bigquery/">post</a>
as a guide for connecting to BigQuery.</p>
<h1 id="1-create-a-new-service-account">1) Create a new service account</h1>
<ol>
<li>Instructions &amp; details for creating a new service account can be found on <a href="https://cloud.google.com/docs/authentication/production#auth-cloud-implicit-python" target="_blank">Google&rsquo;s website</a></li>
<li>Grant your desired BigQuery permissions to your new service account</li>
<li>Download the service account key</li>
</ol>
<h1 id="2-create-a-new-connection">2) Create a new connection</h1>
<ol>
<li>In the menu bar navigate to <code>Database &gt; New Connection</code></li>
<li>Select BigQuery &amp; press next</li>
<li>Fill in project with the name of your BigQuery Project
<ul>
<li>Optional, add additional projects in the subsequent field</li>
</ul></li>
<li>Select service-based</li>
<li>Fill in the name of the service account ex: <code>bigquery-demo@project_name.iam.gserviceaccount.com</code></li>
<li>Fill in the path to the service key downloaded earlier</li>
<li>Press finish</li>
</ol>
<p>Congrats you&rsquo;ve successfully connected to BigQuery using Dbeaver!</p>
<h1 id="7-troubleshooting">7) Troubleshooting</h1>
<ul>
<li>If you receive
<code>[Simba][BigQueryJDBCDriver](100004) HttpTransport IO error : 403 Forbidden</code> make sure you&rsquo;ve created a service account with the necessary permissions.</li>
</ul>
</description>
</item>
<item>
<title>Exploring Complex Types in BigQuery</title>
<link>http://justnumbersandthings.com/post/2018-09-23-exploring-complex-types-bigquery/</link>
<pubDate>Sun, 23 Sep 2018 00:00:00 +0000</pubDate>
<guid>http://justnumbersandthings.com/post/2018-09-23-exploring-complex-types-bigquery/</guid>
<description>
<h1 id="introduction">Introduction</h1>
<p>Google&rsquo;s BigQuery has support for complex types (arrays &amp; structs) which are relatively new in analytical databases.
While the ideas and of arrays and structs aren&rsquo;t unique to BigQuery some of the syntax and capabilities are unique.
In this post I&rsquo;ll be going over what I&rsquo;ve found to be the most useful patterns and tricks.</p>
<h2 id="arrays">Arrays</h2>
<p>Put plainly an array is a series of values of the same type stored within a single value.
You can create array literals via brackets <code>[]</code> as demonstrated by the following snippet.</p>
<pre><code class="language-sql">select [1, 2, 3] as array_of_ints
</code></pre>
<p>You can also explicitly declare the type of an array as follows.</p>
<pre><code class="language-sql">select
['2018-01-01', '2018-02-01', '2018-03-01'] as array_of_string,
array&lt;date&gt;['2018-01-01', '2018-02-01', '2018-03-01'] as array_of_date
</code></pre>
<h2 id="structs">Structs</h2>
<p>A struct is a grouping of values that need not be of the same type and is very similar to the concept of tuples.
They are commonly used to group related values together.
You can create struct literals using the function struct</p>
<pre><code class="language-sql">select struct(1 as id, 2 as value) as user_info
</code></pre>
<h2 id="purpose">Purpose</h2>
<p>Arrays and structs allow for a more compact organization of related data which makes writing and reading many queries easier.
So while BigQuery is the engine that I&rsquo;m covering today I expect these concepts to spread to other databases as knowledge of their utility spreads.</p>
<h1 id="basic-usage">Basic Usage</h1>
<h2 id="example-dataset">Example DataSet</h2>
<p>I&rsquo;ll be using the following CTE to demonstrate various functions for arrays &amp; structs.</p>
<pre><code class="language-sql">with data_sample as (
select
1 as id_race,
date'2018-08-01' as date_race,
[3, 4] as id_participants,
[ struct(7.0 as distance, 1 as lap_number, [struct(3 as id_participant, 1 as position),
struct(4 as id_participant, 2 as position)] as finish_order),
struct(6.5 as distance, 2 as lap_number, [struct(3 as id_participant, 1 as position),
struct(4 as id_participant, 2 as position)] as finish_order),
struct(7.2 as distance, 3 as lap_number, [struct(4 as id_participant, 1 as position),
struct(3 as id_participant, 2 as position)] as finish_order)
] as race_laps
union all
select
2 as id_race,
date'2018-08-08' as date_race,
[3, 5] as id_participants,
[ struct(7.5 as distance, 1 as lap_number, [struct(5 as id_participant, 1 as position),
struct(3 as id_participant, 2 as position)] as finish_order),
struct(7.4 as distance, 2 as lap_number, [struct(5 as id_participant, 1 as position),
struct(3 as id_participant, 2 as position)] as finish_order),
struct(7.3 as distance, 3 as lap_number, [struct(5 as id_participant, 1 as position),
struct(3 as id_participant, 2 as position)] as finish_order)
] as race_laps
)
</code></pre>
<h2 id="access-an-individual-element-from-an-array">Access an individual element from an array</h2>
<pre><code class="language-sql">with data_sample as (
--See above
--Note: these lines will be omitted from subsequent examples
)
select
ds.id_participants[offset(0)] as first_participant, --zero based
ds.id_participants[ordinal(1)] as first_participant_also --one based
from data_sample as ds
</code></pre>
<h2 id="determine-the-length-of-an-array">Determine the length of an array</h2>
<pre><code class="language-sql">select
array_length(ds.id_participants) as number_of_participants
from data_sample as ds
</code></pre>
<h2 id="access-values-structs-within-an-array">Access values &amp; structs within an array</h2>
<p>There are a couple of different ways to interact with arrays in BigQuery. The following three examples show different ways to access the example data structure and calculate the total distance for each race.</p>
<h3 id="by-joining-the-lap-array">by joining the lap array</h3>
<pre><code class="language-sql">select
ds.id_race,
sum(rl.distance) as race_distance
from data_sample as ds
join ds.race_laps as rl
group by 1
</code></pre>
<h3 id="by-unnesting-the-lap-array">by unnesting the lap array</h3>
<pre><code class="language-sql">select
ds.id_race,
sum(rl.distance) as race_distance
from data_sample as ds,
unnest(ds.race_laps) as rl
group by 1
</code></pre>
<h3 id="by-using-at-inline-query">by using at inline query</h3>
<pre><code class="language-sql">select
ds.id_race,
(select sum(rl.distance) from unnest(ds.race_laps) as rl) as race_distance
from data_sample as ds
</code></pre>
<h3 id="by-joining-multiple-arrays">by joining multiple arrays</h3>
<p>The following query returns a list of race ids &amp; participants ids &amp; and a comma separated string showing that participants place each lap of each race.</p>
<pre><code class="language-sql">select
ds.id_race,
fo.id_participant,
string_agg(cast(fo.position as string), ', ' order by rl.lap_number) lap_positions
from data_sample as ds
join ds.race_laps as rl
join rl.finish_order as fo
group by 1, 2
</code></pre>
<h2 id="filtering-by-contents-of-an-array">Filtering by contents of an array</h2>
<pre><code class="language-sql">select
ds.id_race
from data_sample as ds
where 3 in unnest(ds.id_participants)
</code></pre>
</description>
</item>
<item>
<title> Connecting to Google BigQuery with DBeaver with JDBC Drivers</title>
<link>http://justnumbersandthings.com/post/2018-09-22-dbeaver-bigquery/</link>
<pubDate>Sat, 22 Sep 2018 00:00:00 +0000</pubDate>
<guid>http://justnumbersandthings.com/post/2018-09-22-dbeaver-bigquery/</guid>
<description>
<h1 id="update-2018-10-07">Update (2018-10-07)</h1>
<p>Shortly after this post DBeaver was updated with a native connector.
Please see this <a href="http://justnumbersandthings.com/post/2018-10-07-dbeaver-bigquery-part2/">post</a> for a more up to date connection instructions if
you have updated DBeaver to 5.2.2 or later.</p>
<h1 id="0-install-dbeaver">0) Install DBeaver</h1>
<p>You can find installation instructions <a href="http://justnumbersandthings.com/post/2017-03-26-dbeaver-mac/">here</a></p>
<h1 id="1-download-the-latest-drivers">1) Download the latest drivers</h1>
<p>You can find the latest drivers on <a href="https://cloud.google.com/bigquery/partners/simba-drivers/" target="_blank">Google&rsquo;s website</a></p>
<h1 id="2-create-a-folder-to-store-the-drivers">2) Create a folder to store the drivers</h1>
<p><code>mkdir ~/.dbeaver-drivers/bigquery/</code></p>
<h1 id="3-extract-driver-jars-and-move-to-the-folder-we-made-earlier">3) Extract driver jars and move to the folder we made earlier</h1>
<p><img src="http://justnumbersandthings.com/img/20180922_bigquery_jars_in_place.png" alt="jars_in_folder" /></p>
<h1 id="4-create-a-new-driver-in-dbeaver">4) Create a New Driver in DBeaver</h1>
<ol>
<li>Navigate to <code>Database &gt; Driver Manager &gt; New</code></li>
<li>Add all the files from <code>~/.dbeaver-drivers/bigquery/</code></li>
<li>Driver name: <code>BigQuery</code> (for labeling only)</li>
<li>Class name: <code>com.simba.googlebigquery.jdbc42.Driver</code> (at the time of this writing)</li>
<li>Default port: <code>443</code></li>
<li>URL template: <code>jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;ProjectId={server};OAuthType=0;OAuthServiceAcctEmail={user};OAuthPvtKeyPath={host};</code>
<ul>
<li>Note there are 4 different ways to connect to BigQuery using the JDBC driver. This tutorial illustrates connecting using the service account authorization method.</li>
<li>Additionally, at the time of this writing, Dbeaver only supports a couple URL template variables (e.g. server, user, host) which is why I&rsquo;ve used the <code>host</code> variable for a path to key file rather than something like <code>key_path</code></li>
</ul></li>
</ol>
<h1 id="5-create-a-new-service-account">5) Create a new service account</h1>
<ol>
<li>Instructions &amp; details for creating a new service account can be found on <a href="https://cloud.google.com/docs/authentication/production#auth-cloud-implicit-python" target="_blank">Google&rsquo;s website</a></li>
<li>Grant your desired BigQuery permissions to your new service account</li>
<li>Download the service account key</li>
</ol>
<h1 id="6-create-a-new-connection">6) Create a New Connection</h1>
<ol>
<li>In the menu bar navigate to <code>Database &gt; New Connection</code></li>
<li>Select BigQuery</li>
<li>Fill in the appropriate values for host, server, user</li>
<li>Set host to the path the service account key e.g., <code>/Users/admin/.dbeaver_drivers/bigquery/project_name-####.json</code></li>
<li>Set server to project id for your BigQuery project</li>
<li>Set user to the email address for the generated service account</li>
<li>Press finish</li>
</ol>
<p>Congrats you&rsquo;ve successfully connected to BigQuery using Dbeaver!</p>
<p><img src="http://justnumbersandthings.com/img/20180922_bigquery_connection.png" alt="successful connection" /></p>
<h1 id="7-troubleshooting">7) Troubleshooting</h1>
<ul>
<li>If you receive <code>[Simba][BigQueryJDBCDriver](100004) HttpTransport IO error : 403 Forbidden</code> make sure you&rsquo;ve created a service account with the necessary permissions.</li>
<li>-As of Dbeaver 5.2.0 Dbeaver is unable to return arrays of ints and other numerics-
<ul>
<li>e.g., select [1, 2] as ids results in <code>org.jkiss.dbeaver.model.exec.DBCException: SQL Error [10140] [22003]: [Simba][JDBC](10140) Error converting value to long.</code></li>
</ul></li>
</ul>
</description>
</item>
<item>
<title>Importing a CSV into a database using DBeaver Part 2</title>
<link>http://justnumbersandthings.com/post/2018-08-12-dbeaver-import-csv-2/</link>
<pubDate>Sun, 12 Aug 2018 00:00:00 +0000</pubDate>
<guid>http://justnumbersandthings.com/post/2018-08-12-dbeaver-import-csv-2/</guid>
<description>
<h2 id="forward">Forward</h2>
<p>This is a followup to my previous <a href="http://justnumbersandthings.com/post/2018-06-12-dbeaver-import-csv/">post</a>. My previous post demonstrated how to import a CSV using Dbeaver&rsquo;s database to database export &amp; import feature. As of version 5.1.5 Dbeaver introduced a direct CSV option for importing CSVs.</p>
<h2 id="0-install-dbeaver">0) Install DBeaver</h2>
<p>You can find installation instructions <a href="http://justnumbersandthings.com/post/2017-03-26-dbeaver-mac/">here</a></p>
<h2 id="1-connect-to-your-target-database">1) Connect to your target database</h2>
<p>1.1) Navigate through your target database &amp; schema and right click on your target table and select import table data</p>
<p><img src="http://justnumbersandthings.com/img/20180612_import_table_data.png" alt="import_table_data" /></p>
<p>1.2) Next select CSV from the list</p>
<p><img src="http://justnumbersandthings.com/img/20180812_select_csv_option.png" alt="select_csv_option" /></p>
<p>1.3) Select your CSV file for upload</p>
<p><img src="http://justnumbersandthings.com/img/20180812_select_csv_file.png" alt="select_csv_table" /></p>
<h2 id="2-ensure-that-the-mappings-of-each-of-your-columns-is-correct">2) Ensure that the mappings of each of your columns is correct</h2>
<ul>
<li>For column names that are an exact match DBeaver will automatically map them for you</li>
<li>For the remaining columns make sure to map the source columns to your desired target columns</li>
</ul>
<p><img src="http://justnumbersandthings.com/img/20180812_map_columns.png" alt="map_columns" /></p>
<h2 id="3-complete-the-wizard-and-watch-dbeaver-import-your-data">3) Complete the wizard and watch DBeaver import your data</h2>
<p>Note: For large files it may be necessary to go get lunch but in my case 4 records doesn&rsquo;t take long to import :)</p>
<p><img src="http://justnumbersandthings.com/img/20180612_data_finished.png" alt="data_finished" /></p>
<h2 id="4-check-to-make-sure-that-the-data-has-loaded-correctly">4) Check to make sure that the data has loaded correctly</h2>
<p>As a last optional step it is good practice to make sure that everything loaded correctly which can easily be done by running a query against your target DB</p>
<p><img src="http://justnumbersandthings.com/img/20180612_data_in_table.png" alt="data_in_table" /></p>
</description>
</item>
<item>
<title>Importing a CSV into a database using DBeaver</title>
<link>http://justnumbersandthings.com/post/2018-06-12-dbeaver-import-csv/</link>
<pubDate>Tue, 12 Jun 2018 00:00:00 +0000</pubDate>
<guid>http://justnumbersandthings.com/post/2018-06-12-dbeaver-import-csv/</guid>
<description>
<h2 id="update-august-12-2018">Update: August 12, 2018</h2>
<p>The following post demonstrates how to import CSVs using Dbeaver&rsquo;s database to database export &amp; import feature. If you are certain of the quality of your CSV &amp; just want to import it quickly my subsequent <a href="http://justnumbersandthings.com/post/2018-08-12-dbeaver-import-csv-2/">post</a> may be more useful.</p>
<h2 id="0-install-dbeaver">0) Install DBeaver</h2>
<p>You can find installation instructions <a href="http://justnumbersandthings.com/post/2017-03-26-dbeaver-mac/">here</a></p>
<h2 id="1-create-a-folder-to-be-used-as-your-csv-database">1) Create a folder to be used as your CSV Database</h2>
<p><code>mkdir ~/desktop/csvs</code></p>
<p>Place the CSV you want to load into this folder</p>
<h2 id="2-create-a-csv-database-connection">2) Create a CSV database connection</h2>
<p>In the menu bar select <code>Database &gt; Create a New Connection</code>
&amp; from the list of drivers select <code>Flat files(CSV) &gt; CSV/DBF</code></p>
<p><img src="http://justnumbersandthings.com/img/20180612_select_driver.png" alt="select_driver" /></p>
<p>Set the path of the connection to the folder you created earlier (the JDBC URL will auto-populate)</p>
<p><img src="http://justnumbersandthings.com/img/20180612_configure_path.png" alt="configure_path" /></p>
<p>Note: If you run into trouble downloading the driver navigate to the <a href="http://csvjdbc.sourceforge.net/" target="_blank">source website</a> and download the driver manually</p>
<h2 id="3-connect-to-your-target-database">3) Connect to your target database</h2>
<p>3.1) Navigate through your target database &amp; schema and right click on your target table and select import table data</p>
<p><img src="http://justnumbersandthings.com/img/20180612_import_table_data.png" alt="import_table_data" /></p>
<p>3.2) Next select your source CSV from your CSV connection as the source container</p>
<p><img src="http://justnumbersandthings.com/img/20180612_select_csv_table.png" alt="select_csv_table" /></p>
<p>Note: In this example case I&rsquo;m loading a test CSV into a Postgres database but this functionality works with any connection that DBeaver supports (which is basically everything)</p>
<h2 id="4-ensure-that-the-mappings-of-each-of-your-columns-is-correct">4) Ensure that the mappings of each of your columns is correct</h2>
<ul>
<li>For column names that are an exact match DBeaver will automatically map them for you</li>
<li>For the remaining columns make sure to map the source columns to your desired target columns</li>
</ul>
<p><img src="http://justnumbersandthings.com/img/20180612_map_columns.png" alt="map_columns" /></p>
<h2 id="5-complete-the-wizard-and-watch-dbeaver-import-your-data">5) Complete the wizard and watch DBeaver import your data</h2>
<p>Note: For large files it may be necessary to go get lunch but in my case 4 records doesn&rsquo;t take long to import :)</p>
<p><img src="http://justnumbersandthings.com/img/20180612_data_finished.png" alt="data_finished" /></p>
<h2 id="6-check-to-make-sure-that-the-data-has-loaded-correctly">6) Check to make sure that the data has loaded correctly</h2>
<p>As a last optional step it is good practice to make sure that everything loaded correctly which can easily be done by running a query against your target DB</p>
<p><img src="http://justnumbersandthings.com/img/20180612_data_in_table.png" alt="data_in_table" /></p>
<h2 id="7-final-notes-thoughts">7) Final Notes &amp; Thoughts</h2>
<ul>
<li>While this process takes a little bit more time to get setup than other tools setting up the CSV connection only needs to be done once
<ul>
<li>One side benefit of this as well is that you are now able to run SQL queries against CSVs very easily</li>
</ul></li>
<li>The only real pain point that I have run across is that if you add a new CSV file or add/delete columns in an active CSV connection you have to cancel the import wizard &amp; refresh the CSV connection for the changes to be picked up
<ul>
<li>this feedback was provided in <a href="https://github.com/dbeaver/dbeaver/issues/926" target="_blank">issue 926</a> and hopefully it will be resolved in a future update</li>
</ul></li>
</ul>
</description>
</item>
<item>
<title>Moved to Hugo</title>
<link>http://justnumbersandthings.com/post/2018-03-23-hugo-migration/</link>
<pubDate>Fri, 23 Mar 2018 00:00:00 +0000</pubDate>
<guid>http://justnumbersandthings.com/post/2018-03-23-hugo-migration/</guid>
<description>
<h2 id="what-was-i-using-before">What was I using before</h2>
<p>Previously I was using <a href="https://github.com/getpelican/pelican" target="_blank">Pelican</a> a static site generator written in Python. Personally I&rsquo;m a huge Python fan which led me to search out Pelican rather than go with a more popular solution such as <a href="https://jekyllrb.com/" target="_blank">Jekyll</a>.</p>
<h2 id="why-change">Why Change</h2>
<p>As it turns out if you aren&rsquo;t going to be modifying the static site generator in anyway you don&rsquo;t need to concern yourself with the language that it is written in. This fact escaped me while I was seeking out Pelican. Coming to this realization opened up a world of possibilities and when I saw an article discussing Hugo and its killer feature, <a href="https://gohugo.io/getting-started/usage/#livereload" target="_blank">Live Reload</a>, I made the jump!</p>
<h2 id="unique-migration-tasks">Unique Migration tasks</h2>
<p>The most complex task of this migration for me was ensuring that the old urls would point to the correct articles after I moved. fortunately Hugo made this dead simple via url <a href="https://gohugo.io/content-management/urls/#aliases" target="_blank">Aliases</a>.</p>
<p>Simply add the following to the front matter of the article you&rsquo;d like migrate.</p>
<pre><code>+++
aliases = [
&quot;/posts/my-original-url/&quot;,
&quot;/2010/01/01/even-earlier-url.html&quot;
]
+++
</code></pre>
</description>
</item>
<item>
<title>macOS 10.13.2 EGPU Adventures</title>
<link>http://justnumbersandthings.com/post/2017-12-28-egpu-adventures/</link>
<pubDate>Thu, 28 Dec 2017 00:00:00 +0000</pubDate>
<guid>http://justnumbersandthings.com/post/2017-12-28-egpu-adventures/</guid>
<description>
<h1 id="1-what-is-an-egpu-when-did-apple-start-supporting-them">1) What is an EGPU &amp; when did Apple start supporting them?</h1>
<p>The acronym EGPU stands for external <a href="https://en.wikipedia.org/wiki/Graphics_processing_unit" target="_blank">GPU</a>. Until recently they were relatively niche however, with the release of thunderbolt3 they have begun to gain traction. At WWDC17 Apple announced that they would be fully supported in High Sierra sometime during the spring of 2018. This news was welcomed at <a href="egpu.io" target="_blank">egpu.io</a> where a community of capable individuals have been trail blazing EGPUs on macOS <a href="https://EGPU.io/setup-guide-external-graphics-card-mac/" target="_blank">prior to 10.13</a> &amp; Windows. They quickly updated some of their <a href="https://EGPU.io/macos-high-sierra-official-external-gpu/" target="_blank">guides and recommendations</a> to help beginners, such as myself, start their EGPU journey on High Sierra.</p>
<h1 id="2-my-setup">2) My setup</h1>
<p>So after reading about the success and watching several youtube reviews I thought it was time to give this EGPU thing a go. For my enclosure I decided to go with the <a href="http://amzn.to/2CgKwQR" target="_blank">Mantiz Venus</a> ($399). For my graphics card I decided to go with the <a href="http://amzn.to/2Ci1wpR" target="_blank">Vega64</a>. As a side note it looks like some users have had success with Nvidia cards on macOS after some elbow grease but AMD cards were reported to be plug and play; hence my decisions to go with AMD.</p>
<h1 id="3-initial-experiences">3) Initial experiences</h1>
<p>After plugging it in and turning it on for the first time I was excited to see that everything was working out of the box.</p>
<p><img src="http://justnumbersandthings.com/img/20171228_egpu_plug_n_play.png" alt="plug_n_play" /></p>
<p>The only oddity that I noticed at first is that system information lists the Vega64 as &ldquo;AMD RX xxx&rdquo;. However, his appears to only be a cosmetic issue so I ignore it.</p>
<p><img src="http://justnumbersandthings.com/img/20171228_system_information.png" alt="system_information" /></p>
<p>So after my initial excitement I tried playing a couple games with my new setup and quickly stumbled across something I should have uncovered sooner in my research. The Vega64 is quite power hungry and the enclosure I purchased <a href="https://myMantiz.com/pages/faq" target="_blank">doesn&rsquo;t actually support it, it only supports Vega56</a>.</p>
<p>For reference the problem that you&rsquo;ll encounter is that the entire enclosure will shut down which results in a soft or sometimes a hard system crash. So for those are thinking about purchasing the Mantiz &amp; Vega make sure to go with the Vega56 rather than the Vega64. However, if you are like me and already have a Vega64 and/or you want to try an unsupported setup keep reading.</p>
<h1 id="4-resolving-the-power-draw-issue">4) Resolving the power draw issue.</h1>
<p>After some more research I found a new <a href="https://www.newegg.com/Product/Product.aspx?Item=N82E16817273013" target="_blank">power supply</a> ($190) that would provide the needed power &amp; had the same dimensions as the power supply that ships with the Mantiz. I&rsquo;m happy to report that installing this part turned out to be essentially painless. The existing power supply comes out without much fuss and the new power supply fits perfectly in place of the old one. The only exception here is that the new power supply is a little longer than the existing one but there is ample room in the enclosure to accommodate this.</p>
<h1 id="5-subsequent-experiences">5) Subsequent experiences</h1>
<p>After upgrading the power supply I&rsquo;ve yet to experience another power related crash and have had a far more enjoyable experience.</p>
<p>The only remaining issue that I&rsquo;ve had is a rare crash. Twice I&rsquo;ve had macOS freeze for several seconds followed by a flash which results in all of my applications being closed (according to the dock, force-quite dialogs, &amp; command-tab) but leaving the underlying processes untouched. This results in a bizarre situation where I can&rsquo;t view my application however, I can still hear the audio and see the process running in activity monitor. I expect/hope that this is one of those things that will be squashed once Apple rolls out official EGPU support in the spring with 10.13.x.</p>
<h1 id="6-benchmarks">6) Benchmarks</h1>
<p>What review of an EGPU setup would be complete without some benchmarks? Given the wide variety of applications &amp; uses for an EGPU I decided to stay simple with some Geekbench benchmarks.</p>
<p>Using the AMD Pro 555 in my macbook-pro I received a score of <a href="https://browser.geekbench.com/v4/compute/1670314" target="_blank">37,697</a></p>
<p><img src="http://justnumbersandthings.com/img/20171228_internal_score.png" alt="internal_score" /></p>
<p>Using my EGPU setup I received a score of <a href="https://browser.geekbench.com/v4/compute/1670320" target="_blank">175,303</a> a 4.65x improvement over the internal GPU offered by Apple. Quite the improvement!</p>
<p><img src="http://justnumbersandthings.com/img/20171228_external_score.png" alt="external_score" /></p>
<h1 id="7-final-thoughts">7) Final Thoughts</h1>
<h2 id="pros">Pros</h2>
<ul>
<li>Performance
<ul>
<li>The Geekbench results show a 4.65x increase and my experiences with this increase have been tremendously positive</li>
</ul></li>
<li>Flexibility
<ul>
<li>If I need my laptop to be portable it is as simple as unplugging a cord</li>
<li>If I need my laptop to be ultra-fast it is as simple as plugging in a cord</li>
</ul></li>
<li>Upgradability
<ul>
<li>With this setup my Apple laptop now has an upgradable GPU which means I can keep my machine going for longer</li>
</ul></li>
<li>Ports
<ul>
<li>One of the nice things about the Mantiz enclosure is that it provides a lot of ports (5 USB &amp; 1 gigabit ethernet port) and even includes a spot for a <a href="https://www.amazon.com/gp/search?ie=UTF8&amp;tag=justnumbersan-20&amp;linkCode=ur2&amp;linkId=f73bf29f7e5ed526f77b4bfb06ae1826&amp;camp=1789&amp;creative=9325&amp;index=electronics&amp;keywords=SSD" target="_blank">2.5&rdquo; SSD Drive</a></li>
<li>So rather than buying more dongles you can utilize the Mantiz as a hub as well</li>
</ul></li>
</ul>
<h2 id="cons">Cons</h2>
<ul>
<li>Weight
<ul>
<li>One thing that caught me off guard was just how heavy the enclosure &amp; GPU were</li>
<li>It is far lighter than a desktop tower but still heavy enough to dissuade any thoughts of lugging it around</li>
</ul></li>
<li>Drivers
<ul>
<li>I thought that the Vega series would have first class support as an EGPU because of the Vega&rsquo;s inclusion in the iMac Pro however, since system information doesn&rsquo;t accurately identify the card it is clear that some support is still yet to come, likely in the spring</li>
<li>Update as of 10.13.4 This has been resolved with Apple now officially supporting EGPU setups</li>
</ul></li>
<li>Support (Apple now officially supports EGPU setups for AMD cards)
<ul>
<li><del>If you go with the Vega or really any other setup other than the <a href="https://developer.apple.com/development-kit/external-graphics/" target="_blank">Apple EGPU kit</a> you are in an area that isn&rsquo;t officially supported</del></li>
<li><del>That being said you won&rsquo;t be alone or the first so don&rsquo;t let that hold you back too much</del></li>
</ul></li>
</ul>
<p>In summary I&rsquo;d recommend an EGPU to anyone who is looking for a more robust GPU. The Pros are very compelling and the cons while worth considering don&rsquo;t out weight the benefits for anyone looking for improved performance. The only other thing I&rsquo;ll call out is that I&rsquo;d recommend the <a href="http://amzn.to/2C4u4Gw" target="_blank">Vega56</a> + <a href="http://amzn.to/2CgKwQR" target="_blank">Mantiz</a> rather than the <a href="http://amzn.to/2Ci1wpR" target="_blank">Vega64</a> + Mantiz given the Vega64 requires an unsupported/warranty-breaking modification.</p>
</description>
</item>
<item>
<title>Improving Tableau's Document API</title>
<link>http://justnumbersandthings.com/post/2017-06-04-improving-tableaus-document-api/</link>
<pubDate>Sun, 04 Jun 2017 00:00:00 +0000</pubDate>
<guid>http://justnumbersandthings.com/post/2017-06-04-improving-tableaus-document-api/</guid>
<description>
<h1 id="1-what-is-tableau-s-document-api">1) What is Tableau&rsquo;s Document API?</h1>
<p>With the release of Tableau 10, Tableau released a <a href="https://github.com/tableau/document-api-python" target="_blank">python utility</a> called the Tableau Document API (or TDA for short). TDA allows users to easily programmatically modify tableau workbooks. Modifying tableau workbooks without using Tableau Desktop was possible before as tableau files <code>.twb</code> are actually just xml files. However, manually editing the xml of <code>.twb</code> files could easily result in a corrupted workbook. Fortunately with the release of this tool it is now much less risky to modify workbooks without using Tableau Desktop.</p>
<h1 id="2-using-tableau-s-document-api">2) Using Tableau&rsquo;s Document API</h1>
<p>TDA is written in Python so using it is as simple as <code>pip install TableauDocumentApi</code> and <code>import TableauDocumentApi</code>. For example if you needed to update the connection strings in a dozen local tableau files you could use the following script to update them all.</p>
<pre><code class="language-python">import TableauDocumentApi as tda
import glob, os
os.chdir(&quot;my_folder&quot;)
for file in glob.glob(&quot;*.twb&quot;):
tableau_workbook = tda.Workbook(file)
for datasource in tableau_workbook.datasources:
for connection in datasource.connections:
connection.server = 'my-new-host'
tableau_workbook.save()
</code></pre>
<h1 id="3-tableau-s-query-bands-initial-sql">3) Tableau&rsquo;s Query Bands &amp; Initial SQL</h1>
<p>Taking a step away from TDA for a moment Tableau has two less visible but still immensely useful features: <a href="http://onlinehelp.tableau.com/current/pro/desktop/en-us/examples_teradata.html#initial_sql" target="_blank">Initial SQL</a> &amp; <a href="http://onlinehelp.tableau.com/current/pro/desktop/en-us/examples_teradata.html#query_band" target="_blank">querybands</a>. I&rsquo;ve personally used these features to stage temporary tables &amp; tag each query (there are so many&hellip;) that tableau runs.</p>
<h1 id="4-how-does-this-relate-to-the-tableaudocumentapi">4) How does this relate to the TableauDocumentAPI</h1>
<p>The <a href="https://github.com/t8y8/document-api-python/blob/3a38058f168e29874dc95af4f697888bba71a4fe/tableaudocumentapi/connection.py" target="_blank">first version I used of Tableau&rsquo;s Document API</a> did not support modifying initial sql &amp; query bands. After being faced with modifying thousands of workbooks to use query bands I decided to review the library and see if support could be easily added. Glancing at the source code I could see that each of the properties of a connection was cleanly defined. Using Port as an example I was able to submit a <a href="https://github.com/tableau/document-api-python/pull/123" target="_blank">pull request</a> implementing the functionality. Fortunately, the Tableau team was very responsive and quickly merged the pull request.</p>
<h1 id="5-tying-it-all-together">5) Tying it all together</h1>
<p>So now if you find yourself in a situation where you need to modify the query bands or the initial sql in your workbooks you can use the TDA to save yourself some time.</p>
<p>Update: Looks like Tableau was even kind enough to mention this new feature in the <a href="https://www.tableau.com/about/blog/2017/2/check-out-new-enterprise-features-tableau-102-66459" target="_blank">release notes of 10.2</a> Search for &ldquo;and with our Document API&rdquo;</p>
<p>Cheers!</p>
</description>
</item>
<item>
<title> Connecting to Hive with DBeaver using Kerberos Authentication</title>
<link>http://justnumbersandthings.com/post/2017-05-06-dbeaver-hive/</link>
<pubDate>Sat, 06 May 2017 00:00:00 +0000</pubDate>
<guid>http://justnumbersandthings.com/post/2017-05-06-dbeaver-hive/</guid>
<description>
<h1 id="0-install-dbeaver">0) Install DBeaver</h1>
<p>You can find installation instructions <a href="http://justnumbersandthings.com/post/2017-03-26-dbeaver-mac/">here</a></p>
<h1 id="1-download-the-latest-drivers">1) Download the latest drivers</h1>
<p>You can find the latest drivers on the <a href="https://www.cloudera.com/downloads/connectors/hive/jdbc.html" target="_blank">Cloudera website</a></p>
<h1 id="2-create-a-folder-to-store-the-drivers">2) Create a folder to store the drivers</h1>
<p><code>mkdir ~/.dbeaver-drivers/cloudera-hive/</code></p>
<h1 id="3-extract-driver-jars-and-move-to-the-folder-we-made-earlier">3) Extract driver jars and move to the folder we made earlier</h1>
<p><img src="http://justnumbersandthings.com/img/20170506_hive_jars_in_place.png" alt="jars_in_folder" /></p>
<h1 id="4-create-a-new-driver-in-dbeaver">4) Create a New Driver in DBeaver</h1>
<ol>
<li>Navigate to <code>Database &gt; Driver Manager &gt; New</code></li>
<li>Add all the files from <code>~/.dbeaver-drivers/cloudera-hive/</code></li>
<li>Driver name: <code>Hive-Cloudera</code> (for labeling only)</li>
<li>Class name: <code>com.cloudera.hive.jdbc41.HS2Driver</code> (at the time of this writing)</li>
<li>Default port: <code>10000</code></li>
<li>URL template: <code>jdbc:hive2://{host}:{port}/{database};AuthMech=1;KrbRealm=FOO.BAR;KrbHostFQDN={server}; KrbServiceName=hive;KrbAuthType=2</code>
<ul>
<li>Note you need to change <code>FOO.BAR</code> to match your krb5.conf settings</li>
</ul></li>
</ol>
<h1 id="5-create-a-new-connection">5) Create a New Connection</h1>
<ol>
<li>In the menu bar Navigate to <code>Database &gt; New Connection</code></li>
<li>Select Hive-Cloudera</li>
<li>Fill in the appropriate values for host &amp; database (I set database to default)</li>
<li>Set server to be your KrbHostFQDN</li>
<li>Leave your user name &amp; password blank</li>
<li>Test connection</li>
<li>Press next, next, &amp; change the name of this connection as you see fit</li>
<li>Press finish</li>
</ol>
<p>Congrats you&rsquo;ve successfully connected to hive using kerberos authentication!</p>
<h1 id="6-troubleshooting">6) Troubleshooting</h1>
<p>If you are receiving <code>[Cloudera][HiveJDBCDriver](500168) Error creating login context using ticket cache: Unable to obtain Principal Name for authentication</code> make sure to check the following</p>
<ol>
<li>Ensure that you have the latest cryptography libraries installed
<ul>
<li>Java 9 includes these libraries by default</li>
</ul></li>
<li>That you&rsquo;ve configured your <code>/etc/krb5.conf</code> successfully
<ul>
<li>If you&rsquo;ve done this correctly you should be able to run <code>kinit</code> in terminal and create a ticket without issue</li>
</ul></li>
<li><p>For Windows adding the following lines to your dbeaver.ini may be necessary as well</p>
<ul>
<li><code>-Djava.security.krb5.conf=c:\kerberos\krb5.ini</code>
<ul>
<li>note: this is the windows equivalent of <code>/etc/krb5.conf</code></li>
</ul></li>
<li><p><code>-Djava.security.auth.login.config=c:\kerberos\jaas.conf</code></p>
<ul>
<li><p>success has also been reported with the following jaas.conf file &amp; keytab usage</p>
<pre><code>Client {
com.sun.security.auth.module.Krb5LoginModule required
debug=true
doNotPrompt=true
useKeyTab=true
keyTab=&quot;C:\Users\{user}\krb5cc_{user}&quot;
useTicketCache=true
renewTGT=true
principal=&quot;{user}@FOO.BAR&quot;
;
};
</code></pre></li>
</ul></li>
</ul></li>
</ol>
</description>
</item>
<item>
<title>Installing DBeaver on a Mac</title>
<link>http://justnumbersandthings.com/post/2017-03-26-dbeaver-mac/</link>
<pubDate>Sun, 26 Mar 2017 21:35:50 -0800</pubDate>
<guid>http://justnumbersandthings.com/post/2017-03-26-dbeaver-mac/</guid>
<description>
<h1 id="0-what-is-dbeaver-http-dbeaver-jkiss-org">0) What is <a href="http://dbeaver.jkiss.org/" target="_blank">DBeaver</a>?</h1>
<p>Quite simply DBeaver is the best multi-database SQL IDE that I&rsquo;ve used. It supports every JDBC connection that I&rsquo;ve thrown at it and has advanced features for some of the more popular databases such as Mysql &amp; Postgres. Many thanks to <a href="https://github.com/serge-rider" target="_blank">serge-rider</a> for creating such an awesome tool.</p>
<h1 id="1-install-java">1) Install Java</h1>
<p>First we need to install java which can be easily by running the following command in terminal (<a href="https://brew.sh/" target="_blank">homebrew required</a>):</p>
<pre><code class="language-bash">brew cask install java
</code></pre>
<p>Note: Previous versions of this article instructed an installation of the cask <code>jce-unlimited-strength-policy</code> but that has been removed as its contents have been incorporated into the cask <code>java</code> with the release of 9.0</p>
<h2 id="notes">Notes</h2>
<ul>
<li>I recommend the newest version of Java as DBeaver regularly depreciates old versions of Java
<ul>
<li><a href="https://support.apple.com/kb/DL1572?locale=en_US" target="_blank">Java SE6</a> is not supported</li>
</ul></li>
</ul>
<h1 id="2-install-dbeaver">2) Install DBeaver</h1>
<ol>
<li>Download the <a href="http://dbeaver.jkiss.org/download/" target="_blank">latest version</a> | <a href="https://github.com/serge-rider/dbeaver/releases" target="_blank">Github Alternate</a></li>
<li>After downloading drag and drop into your application folder
<ul>
<li>The first time you run the application you may need to right-click on the application and then press open</li>
</ul></li>
</ol>
<p>Congratulations you&rsquo;ve installed DBeaver!</p>
<p>Your next step is configuring a connection(s) to your database(s).</p>
</description>
</item>
<item>
<title>First Blog With Pelican</title>
<link>http://justnumbersandthings.com/post/2017-03-03-pelican-intro/</link>
<pubDate>Fri, 03 Mar 2017 00:00:00 +0000</pubDate>
<guid>http://justnumbersandthings.com/post/2017-03-03-pelican-intro/</guid>
<description>
<h2 id="update-2018-03-18-i-ve-since-moved-to-hugo">Update 2018-03-18: I&rsquo;ve since moved to Hugo</h2>
<p>This is my first blog post using Pelican and Markdown. A lot of the content below is to be used as reference mostly for myself and any others who are exploring using Python3, Pelican, &amp; Markdown to create a blog.</p>
<p>How to get up and running</p>
<pre><code class="language-bash">mkvirtualenv personal_blog
pip install pelican
pip install markdown
pip install fabric3
pip install ghp-import
pip install webassets
npm install less -g
cd Dropbox/projects/python/personal_blog/
git clone https://github.com/r-richmond/rirchmond.github.io.git
git submodule add https://github.com/textbook/bulrush.git
git submodule add https://github.com/getpelican/pelican-plugins.git
</code></pre>
<p>Running commands using Fab3 which help prepare posts</p>
<pre><code class="language-bash">fab rebuild
fab preview
fab serve
fab clean
fab gh_pages
fab reserve
</code></pre>
<p>This <a href="http://nafiulis.me/making-a-static-blog-with-pelican.html" target="_blank">post</a> was very helpful as well</p>
<p>I followed this <a href="http://www.curtismlarson.com/blog/2015/04/12/github-pages-google-domains/" target="_blank">post</a> to setup my custom domain</p>
</description>
</item>
</channel>
</rss>