From 7c052e4af5bd179e925c451c0ae914b8b6201f1e Mon Sep 17 00:00:00 2001 From: Dillon Curry Date: Sun, 28 Jan 2024 22:42:24 -0500 Subject: [PATCH] Started setting up blog, some learning materials --- astro.config.mjs | 3 +- bun.lockb | Bin 242729 -> 265051 bytes learning/datastructures/LinkedList.ts | 123 ++++++++++-------- .../ch1-c-threads/happycoin | Bin 0 -> 33686 bytes .../ch1-c-threads/happycoin-threads | Bin 0 -> 34094 bytes .../ch1-c-threads/happycoin-threads.c | 86 ++++++++++++ .../ch1-c-threads/happycoin.c | 35 +++++ .../ch1-c-threads/src/env.d.ts | 1 - .../ch2-shared-workers/blue.html | 6 + .../ch2-shared-workers/blue.js | 7 + .../ch2-shared-workers/red.html | 6 + .../ch2-shared-workers/red.js | 7 + .../ch2-shared-workers/shared-worker.js | 18 +++ .../ch2-web-workers/index.html | 6 + .../ch2-web-workers/main.js | 10 ++ .../ch2-web-workers/worker.js | 6 + package.json | 1 + src/components/Header.astro | 39 ++++++ src/components/Page.astro | 2 +- src/layouts/BlogLayout.astro | 27 ++++ src/layouts/Layout.astro | 38 +----- src/pages/blog.astro | 5 +- src/pages/blog/what-im-learning.mdx | 14 ++ 23 files changed, 349 insertions(+), 91 deletions(-) create mode 100755 learning/multithreaded-javascript/ch1-c-threads/happycoin create mode 100755 learning/multithreaded-javascript/ch1-c-threads/happycoin-threads create mode 100644 learning/multithreaded-javascript/ch1-c-threads/happycoin-threads.c delete mode 100644 learning/multithreaded-javascript/ch1-c-threads/src/env.d.ts create mode 100644 learning/multithreaded-javascript/ch2-shared-workers/blue.html create mode 100644 learning/multithreaded-javascript/ch2-shared-workers/blue.js create mode 100644 learning/multithreaded-javascript/ch2-shared-workers/red.html create mode 100644 learning/multithreaded-javascript/ch2-shared-workers/red.js create mode 100644 learning/multithreaded-javascript/ch2-shared-workers/shared-worker.js create mode 100644 learning/multithreaded-javascript/ch2-web-workers/index.html create mode 100644 learning/multithreaded-javascript/ch2-web-workers/main.js create mode 100644 learning/multithreaded-javascript/ch2-web-workers/worker.js create mode 100644 src/components/Header.astro create mode 100644 src/layouts/BlogLayout.astro create mode 100644 src/pages/blog/what-im-learning.mdx diff --git a/astro.config.mjs b/astro.config.mjs index 72e4803..759ccbe 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -2,10 +2,11 @@ import { defineConfig } from "astro/config"; import react from "@astrojs/react"; import tailwind from "@astrojs/tailwind"; import vercel from "@astrojs/vercel/serverless"; +import mdx from "@astrojs/mdx"; // https://astro.build/config export default defineConfig({ - integrations: [react(), tailwind()], + integrations: [react(), tailwind(), mdx()], output: "hybrid", adapter: vercel({ webAnalytics: { diff --git a/bun.lockb b/bun.lockb index 1e23e2dc0044a401f20d9809858131175513c754..ae6969c9039854cb7d2f17a03b7fedab0dd9d79b 100755 GIT binary patch delta 49191 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 KvX;w7wEqI?d+P%L delta 36365 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 diff --git a/learning/datastructures/LinkedList.ts b/learning/datastructures/LinkedList.ts index 30fbcfd..580ab06 100644 --- a/learning/datastructures/LinkedList.ts +++ b/learning/datastructures/LinkedList.ts @@ -1,76 +1,95 @@ -type NodeVal = number; -class ListNode { - val: NodeVal; - next: ListNode | null; - constructor(value: NodeVal) { - this.val = value; +class MyNode { + val: number; + next: MyNode | null; + constructor(val: number) { + this.val = val; this.next = null; } } + class MyLinkedList { - list: ListNode | null; + head: MyNode | null; + length: number; constructor() { - this.list = null; - } - valueOf() { - return this.list; + this.head = null; + this.length = 0; } get(index: number): number { - let position = 0; - let currentNode = this.list; - while (position !== index && currentNode !== null) { - currentNode = currentNode.next; - position++; + if (index < 0 || index >= this.length) { + return -1; } - if (position === index && currentNode !== null) { - return currentNode.val; + + let current = this.head; + for (let i = 0; i < index; i++) { + current = current!.next; } - return -1; + + return current!.val; } addAtHead(val: number): void { - let next = this.list; - const newNode = new ListNode(val); - if (next !== null) { - newNode.next = next; - } - this.list = newNode; + const newNode = new MyNode(val); + newNode.next = this.head; + this.head = newNode; + this.length++; } addAtTail(val: number): void { - if (this.list == null) { + const newNode = new MyNode(val); + + if (!this.head) { + this.head = newNode; + } else { + let current = this.head; + while (current.next) { + current = current.next; + } + current.next = newNode; + } + + this.length++; + } + + addAtIndex(index: number, val: number): void { + if (index < 0 || index > this.length) { return; } - let currentNode = this.list; - while (currentNode.next) { - currentNode = currentNode.next; + if (index === 0) { + this.addAtHead(val); + } else if (index === this.length) { + this.addAtTail(val); + } else { + let current = this.head; + for (let i = 0; i < index - 1; i++) { + current = current!.next; + } + + const newNode = new MyNode(val); + newNode.next = current!.next; + current!.next = newNode; + + this.length++; } - currentNode.next = new ListNode(val); } - addAtIndex(index: number, val: number): void {} + deleteAtIndex(index: number): void { + if (index < 0 || index >= this.length) { + return; + } - deleteAtIndex(index: number): void {} -} + if (index === 0) { + this.head = this.head!.next; + } else { + let current = this.head; + for (let i = 0; i < index - 1; i++) { + current = current!.next; + } -/** - * Your MyLinkedList object will be instantiated and called as such: - * var obj = new MyLinkedList() - * var param_1 = obj.get(index) - * obj.addAtHead(val) - * obj.addAtTail(val) - * obj.addAtIndex(index,val) - * obj.deleteAtIndex(index) - */ - -const list = new MyLinkedList(); - -list.addAtHead(2); -list.addAtTail(5); -list.addAtHead(1); -list.addAtTail(7); -list.addAtTail(9); - -console.log(list.get(3)); + current!.next = current!.next!.next; + } + + this.length--; + } +} diff --git a/learning/multithreaded-javascript/ch1-c-threads/happycoin b/learning/multithreaded-javascript/ch1-c-threads/happycoin new file mode 100755 index 0000000000000000000000000000000000000000..44dbc4c05fb583c283176dbc9064f7c4af80df64 GIT binary patch literal 33686 zcmeI5U2IfE6vyZ8cIoaGD5WS+FA`KF=g<_N!X+vHAXYOs;E>#jud^)E& zbLX6yIp@r8ZXajwrQth&P8LEF5EC>F>PQk|w{V~*#B69GRLXUEs|q$2xYm+)yr{+F zT@P6lXAdSyxuKwV!}wvf-Z|bU4BG-XDN0fzWyn(#G7LNt;|;!`Z)Oi|212&c)g4J9 zqIdLG%3vs58XR*a#tXfq$9u+@L3VsRs}TGf^#D|>vrlSaHzq+}uU_a7e{jnYSTN=C56|USH}oUIILoBs|S< zlG0gCgGyQMk2?m~6UUo{xk{Y+dczWv(4lyv^58vtrD)CSf|W(18;T^<1)Jocv6$*n z?~n2dkt;-m>Z4Px!Q*+uu7O<*o7hlIzrnWQd1$8)6?mpV*FocjYD}y%ew_Ldtfx7N zG8GO7l-`Sl;b354rMGmUySCB|o8$>7)p0#3J9+&ti&INfC(@GCcp%k025#WOn?b60Vco%m;e)C0!)AjFaajO1egF5 zU;<2l2`~XBzyz286ZlsIV&_HANWH0jq){}rHfG+7=8L9ivKWe)#SpGC&WM_wL)N+C z_vq4=4BS;-O1{=cd9PWB1JPvX&;Z7TH+$LGTnpA??cG>xW`BxvXrz8cJ90F2ndOyO zqv+{RMeGzKb}C|Pi2YtmMxjZM9fhw*i}c!U-yVK>yX}Zov)`tADAz5heY^cg6mj9- z7eySJZ^hgw;tm=)k!LL5NWIoRf<5&khN=-UtQO>)*^*%s5!XPn=!^;@H;tuXEV(5E zIXjK{o!vq#p?*KcFU4Zb6zf;yqMAly;Tq}mk@~#$zspT)uVJkfIVtvLO^-=2>^I)+ zwb?En&c@!Xn(ek?g8JfXcqo3{xt%+o*?}vsy^HBg%;Na5#>|d$`I#MAlq=oXN4m4q zc6qLN8;)mFpH)vO$^}$`%r9N-t-vq9Ltv- z*n8SB^Y|a^3`=cFc*IZO6y0uUX!NOScD5uPgrD!2Q`%(@c1mOqo|ye^OlE zuJ`9vR)!tIUgi(`LXLTEJH7D8E9Mwa2c9GjDBbUcB+*@Wy7NmKHtv;EpY9G%MmtMI z5TX*HuEB@J#?omKijAAS5yKHtCO1rg2`~XBzyz286JP>NfC(@GCcp%k025#WOn?b6 z0Vco%m;e)C0!)AjFaajO1egF5U;<2l2`~XBzyz286JP>NfC(@GCcp%k025#WOn?b6 z0Vco%m;e)C0!)AjFaajO1en18M!!6#U^jiV?ZvmhKNzxyxot4;k;>+jG2Toe2 z;Rgh?>CmTO$m)RC7uq6ZpafsA4+t6ZR(Xv1niMwmV*?ghRUth!p0aSrBP%>5Zcjj1 zyg^w}Qe9muUacze`ox$JYuSnq-jlZKRRL>q6HCfM}t_+%)3Ydya25OM-8a*WGZPi=F)>`n0|7`N!5dI;yD? zRrQ8@w>CFkz46Jx14lp4%J{zahu7|$@z*WNDgC+Q>R#E__t}nzUTg5CtY!; literal 0 HcmV?d00001 diff --git a/learning/multithreaded-javascript/ch1-c-threads/happycoin-threads b/learning/multithreaded-javascript/ch1-c-threads/happycoin-threads new file mode 100755 index 0000000000000000000000000000000000000000..2c7f2353c35a440c83f49863af79a8cd13553b2f GIT binary patch literal 34094 zcmeI5YiwLc701ur^<&qG6DN)8U`V`FYMnF>M@dN>3Sk{5kfb3Ac2o=!n%Lg8y^UYp zM`PECy2Oc+)`i4U04s&s^dWYu6qzctUID@=6|@B@wXsqORmB8E*Ypt;@xfbZyZq1G zyX)&sX(W*NbdGfH%$d1!=FIQR-ET8{^~3i*T1;dR!~tCf^%M}DCJ$;vpMvgzDs`y# zE4#nByZ#`zE)+d@Vbe_(`#Fmjl{&n;@$kZKJ>I*pjV!wm&8!GXi&9~KZ`d+WkHGpkiS568jnyaItR45#24&|Ei{ndQQ^moL1gKfJ%m*o!(wJ6mR3I_vSZ8>}4 zdWS84%$bF4yV!kmyHb&^V}UN83Usx0YkQ%;OP0SZQnvGb*!^=JhP9tvwTEj}-N6G5 z=1{M-2~cXuE1hU$bg={i7|Sdx)YOA7^<6#TLt+fqfP>vsnr4{kFM|iIYUH!(IeE1hq>s z3|6@!4G3yOzN4KzUzOM?%5sjzDv@udl-go8{9`j^lda=cX^O+uC@p|Bmmz z@V8Un-;6d7RIkZd3TUOe&g{wfhVyO|dVOp|)?j_?XY`BO%sqJC8YuVinw`EX5Hsdu zK|Bq8p|HPmMTCG55CTF#2nYco zAOwVf5D)@FKnMr{As_^VfDjM@LO=)z0U;m+gn$qb0zyCt2mv7=1cZPP5CTF#2nYco zAOwVf5D)@FKnMr{As_^VfDjM@LO=-Inn30XO{V)D@$>)ync_InFXdg_%55MoiyGi(c*P0XakkqXS2u-;F+LbR3ZGw8pX$^3wQy^py#rmQa<7hIn1uZ{nwxq0lH80*5E z?E8pe`eYv^*H2Bk-LG9-i?z87_dA*i;M|i;PI@kOW%YQ>IWkTkocQA?+GcK}6gi?(KjJzVCT~Md z!E{Zb$+ps<)EbVt+~QI0O~m0JaUM;+gczOkdBgmvIDGROm|?rc^>*Gf4K(Su*fEQ7 z)a?v-&b5W!)VnAjgP;4bj|O?}zPsm`z0L*Z2JdAY%UhglyqoUd70=WeX1=d5lOpV8 zW5`7`=7K+tDTaOh>$+9ruFI$DUnv+3Cbv)`Qw?2bt!W+nE~5wadaOM@yDplDJx!BT z>P8sRDVz&EzjM>(p}%4;H-eRphsSX|@N)z4WU4HGRrCI0g(jcbD$8GAVD2w1G_;TN zf%x5sFIgQ;fZ1S@W6E)kCNvZDYo7T2T()n7*EU;@aqu_mq@gung|GcQ9oaFoAse5K z7k?W(A7Naj&b2p%^Qq=KI9^@{;-AEOv(?^2(&>I~f#2R8L*;ls&il;9R>y|Dn$0y1 z&R)QNt55fT8Q;B`7o33|D|29ON98qLFR|5^*y_t|_1kUr3R``(t$v4Dzq6ww;-Qk3 z?nqbIbEmI_fAx?b`ixb2P_lTSe7+Y_z-Qh0%rEP9>s&e4`RwpwJXdNDL>+MTCfYFA z8d?@*-#FPDH5_GcZGuTVHBWq&nM`zt`Uq3Hwz$T=;`j*yazb_NJbmz7`A*(YFF2)1>Ck zCin}ozwXYh_t3FWq*M6Mb zp)8&0NJr1{BNxo;70}3)r3P+}fG{`QCjy)3@h_M*{|`IcWA~c&Cd*!L_3yB3{@-^V zzss`u4hXgnShm+1-wYe=+@*zcZMVy#<07xyGCbOeN2}BpPQBF z!?zYsfb5f4S~gcJ(1z_|JVp+DjSjta9zZ|7E-gSbaNgt42(6}1D!kcFBe(H4nBP>0 z?s_Cq`u540-wnR#32l47yvK9yjo7MRK78zYW7T_oo1Q9q{*g;BGNZ(CXO^4Gl$1^53wQZ(E>+&OmUYBJhdd~n4}xAOnL_E)|A`yZdU i_h)nKFaGe{Z+gm?2dB6EVe^g2K=re=r~lP(t>WJ{bBGWC literal 0 HcmV?d00001 diff --git a/learning/multithreaded-javascript/ch1-c-threads/happycoin-threads.c b/learning/multithreaded-javascript/ch1-c-threads/happycoin-threads.c new file mode 100644 index 0000000..7b01bf7 --- /dev/null +++ b/learning/multithreaded-javascript/ch1-c-threads/happycoin-threads.c @@ -0,0 +1,86 @@ +#include +#include +#include +#include +#include +#include + +struct happy_result { + size_t count; + uint64_t * nums; +}; + +uint64_t random64(uint32_t * seed) { + uint64_t result; + uint8_t * result8 = (uint8_t *)&result; + for (size_t i = 0; i< sizeof(result); i++) { + result8[i] = rand_r(seed); + } + return result; +} + +uint64_t sum_digits_squared(uint64_t num) { + uint64_t total = 0; + while (num > 0) { + uint64_t num_mod_base = num % 10; + total += num_mod_base * num_mod_base; + num = num / 10; + } + return total; +} + +bool is_happy(uint64_t num) { + while (num != 1 && num != 4) { + num = sum_digits_squared(num); + } + return num == 1; +} + +bool is_happycoin(uint64_t num) { + return is_happy(num) && num % 10000 == 0; +} + +void * get_happycoins(void * arg) { + int attempts = *(int *)arg; + int limit = attempts/10000; + uint32_t seed = time(NULL); + uint64_t * nums = malloc(limit * sizeof(uint64_t)); + struct happy_result * result = malloc(sizeof(struct happy_result)); + result->nums = nums; + result->count = 0; + for(int i = 1; i < attempts; i++) { + if (result->count == limit) { + break; + } + uint64_t random_num = random64(&seed); + if (is_happycoin(random_num)) { + result->nums[result->count++] = random_num; + } + } + return (void *)result; +} + +#define THREAD_COUNT 4 + +int main() { + pthread_t thread [THREAD_COUNT]; + + int attempts = 10000000/THREAD_COUNT; + int count = 0; + for(int i = 0; i < THREAD_COUNT; i++) { + pthread_create(&thread[i], NULL, get_happycoins, &attempts); + } + + for(int j = 0; j < THREAD_COUNT; j++) { + struct happy_result * result; + pthread_join(thread[j], (void **)&result); + count += result->count; + for(int k = 0; k < result->count; k++) { + printf("%" PRIu64 " ", result->nums[k]); + } + free(result->nums); + free(result); + } + printf("\ncount %d\n", count); + return 0; +} \ No newline at end of file diff --git a/learning/multithreaded-javascript/ch1-c-threads/happycoin.c b/learning/multithreaded-javascript/ch1-c-threads/happycoin.c index 662a28a..7d89dd3 100644 --- a/learning/multithreaded-javascript/ch1-c-threads/happycoin.c +++ b/learning/multithreaded-javascript/ch1-c-threads/happycoin.c @@ -11,4 +11,39 @@ uint64_t random64(uint32_t * seed) { result8[i] = rand_r(seed); } return result; +} + +uint64_t sum_digits_squared(uint64_t num) { + uint64_t total = 0; + while (num > 0) { + uint64_t num_mod_base = num % 10; + total += num_mod_base * num_mod_base; + num = num / 10; + } + return total; +} + +bool is_happy(uint64_t num) { + while (num != 1 && num != 4) { + num = sum_digits_squared(num); + } + return num == 1; +} + +bool is_happycoin(uint64_t num) { + return is_happy(num) && num % 10000 == 0; +} + +int main() { + uint32_t seed = time(NULL); + int count = 0; + for (int i = 1; i < 10000000; i++) { + uint64_t random_num = random64(&seed); + if (is_happycoin(random_num)) { + printf("%" PRIu64 " ", random_num); + count++; + } + } + printf("\ncount %d\n", count); + return 0; } \ No newline at end of file diff --git a/learning/multithreaded-javascript/ch1-c-threads/src/env.d.ts b/learning/multithreaded-javascript/ch1-c-threads/src/env.d.ts deleted file mode 100644 index 8c34fb4..0000000 --- a/learning/multithreaded-javascript/ch1-c-threads/src/env.d.ts +++ /dev/null @@ -1 +0,0 @@ -/// \ No newline at end of file diff --git a/learning/multithreaded-javascript/ch2-shared-workers/blue.html b/learning/multithreaded-javascript/ch2-shared-workers/blue.html new file mode 100644 index 0000000..a110ce1 --- /dev/null +++ b/learning/multithreaded-javascript/ch2-shared-workers/blue.html @@ -0,0 +1,6 @@ + + + Shared Workers Blue + + + diff --git a/learning/multithreaded-javascript/ch2-shared-workers/blue.js b/learning/multithreaded-javascript/ch2-shared-workers/blue.js new file mode 100644 index 0000000..36b012f --- /dev/null +++ b/learning/multithreaded-javascript/ch2-shared-workers/blue.js @@ -0,0 +1,7 @@ +console.log("blue.js"); + +const worker = new SharedWorker("shared-worker.js"); + +worker.port.onmessage = (event) => { + console.log("EVENT", event.data); +}; diff --git a/learning/multithreaded-javascript/ch2-shared-workers/red.html b/learning/multithreaded-javascript/ch2-shared-workers/red.html new file mode 100644 index 0000000..cd11934 --- /dev/null +++ b/learning/multithreaded-javascript/ch2-shared-workers/red.html @@ -0,0 +1,6 @@ + + + Shared Workers Red + + + diff --git a/learning/multithreaded-javascript/ch2-shared-workers/red.js b/learning/multithreaded-javascript/ch2-shared-workers/red.js new file mode 100644 index 0000000..4bb5f92 --- /dev/null +++ b/learning/multithreaded-javascript/ch2-shared-workers/red.js @@ -0,0 +1,7 @@ +console.log("red.js"); + +const worker = new SharedWorker("shared-worker.js"); + +worker.port.onmessage = (event) => { + console.log("EVENT", event.data); +}; diff --git a/learning/multithreaded-javascript/ch2-shared-workers/shared-worker.js b/learning/multithreaded-javascript/ch2-shared-workers/shared-worker.js new file mode 100644 index 0000000..4f06495 --- /dev/null +++ b/learning/multithreaded-javascript/ch2-shared-workers/shared-worker.js @@ -0,0 +1,18 @@ +const ID = Math.floor(Math.random() * 999999); +console.log("shared-worker.js", ID); + +const ports = new Set(); + +self.onconnect = (event) => { + const port = event.ports[0]; + ports.add(port); + console.log("CONN", ID, ports.size); + + port.onmessage = (event) => { + console.log("MESSAGE", ID, event.data); + + for (let p of ports) { + p.postMessage([ID, event.data]); + } + }; +}; diff --git a/learning/multithreaded-javascript/ch2-web-workers/index.html b/learning/multithreaded-javascript/ch2-web-workers/index.html new file mode 100644 index 0000000..291d464 --- /dev/null +++ b/learning/multithreaded-javascript/ch2-web-workers/index.html @@ -0,0 +1,6 @@ + + + Web Workers Hello World + + + diff --git a/learning/multithreaded-javascript/ch2-web-workers/main.js b/learning/multithreaded-javascript/ch2-web-workers/main.js new file mode 100644 index 0000000..52b30f5 --- /dev/null +++ b/learning/multithreaded-javascript/ch2-web-workers/main.js @@ -0,0 +1,10 @@ +console.log("hello from main.js"); + +const worker = new Worker("worker.js"); +worker.onmessage = (msg) => { + console.log("message received from worker:", msg.data); +}; + +worker.postMessage("message sent to worker"); + +console.log("hello from end of main.js"); diff --git a/learning/multithreaded-javascript/ch2-web-workers/worker.js b/learning/multithreaded-javascript/ch2-web-workers/worker.js new file mode 100644 index 0000000..8d50f69 --- /dev/null +++ b/learning/multithreaded-javascript/ch2-web-workers/worker.js @@ -0,0 +1,6 @@ +console.log("hello from worker.js"); + +self.onmessage = (msg) => { + console.log("message from main:", msg.data); + postMessage("message sent from worker"); +}; diff --git a/package.json b/package.json index 877f2b7..a9bf493 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ }, "dependencies": { "@astrojs/check": "^0.3.4", + "@astrojs/mdx": "^2.1.0", "@astrojs/react": "^3.0.9", "@astrojs/tailwind": "^5.1.0", "@astrojs/vercel": "^7.0.1", diff --git a/src/components/Header.astro b/src/components/Header.astro new file mode 100644 index 0000000..117a6d0 --- /dev/null +++ b/src/components/Header.astro @@ -0,0 +1,39 @@ +--- +import { Image } from 'astro:assets'; +import myPicture from '../../public/images/me.png' +import Link from './Link.astro'; +--- + +

+ + \ No newline at end of file diff --git a/src/components/Page.astro b/src/components/Page.astro index 7d01a73..bd27caa 100644 --- a/src/components/Page.astro +++ b/src/components/Page.astro @@ -3,7 +3,7 @@ import Link from "./Link.astro"; ---
-
+
diff --git a/src/layouts/BlogLayout.astro b/src/layouts/BlogLayout.astro new file mode 100644 index 0000000..ed19227 --- /dev/null +++ b/src/layouts/BlogLayout.astro @@ -0,0 +1,27 @@ +--- +import Layout from "./Layout.astro"; + +const { frontmatter: {title, date} } = Astro.props; + +// Assuming you have a Date object +const currentDate = new Date(date); + +// Format the date using toLocaleDateString +const formattedDate = currentDate.toLocaleDateString("en-US", { + year: "numeric", + month: "long", + day: "numeric", + timeZone: "UTC" +}); +--- + + +
+

{title}

+

📝 Published on

+
+ +
+ +
+
diff --git a/src/layouts/Layout.astro b/src/layouts/Layout.astro index 2989f88..8573b79 100644 --- a/src/layouts/Layout.astro +++ b/src/layouts/Layout.astro @@ -1,9 +1,6 @@ --- -import Link from "../components/Link.astro"; import Page from "../components/Page.astro"; -import { Image } from 'astro:assets'; -import myPicture from '../../public/images/me.png' - +import Header from "../components/Header.astro"; interface Props { title: string; } @@ -19,25 +16,10 @@ const { title } = Astro.props; - Dillon Curry - {title} + {title} - dilloncurry.com - +
@@ -79,18 +61,4 @@ const { title } = Astro.props; Courier New, monospace; } - nav { - text-align: right; - margin: 0 auto; - padding: 0 24px; - max-width: 65ch; - display: flex; - justify-content: space-between; - height: 72px; - } - - nav li { - display: inline-block; - padding-left: 4px; - } diff --git a/src/pages/blog.astro b/src/pages/blog.astro index 48b6b4d..2518432 100644 --- a/src/pages/blog.astro +++ b/src/pages/blog.astro @@ -1,9 +1,12 @@ --- import Layout from "../layouts/Layout.astro"; +import Link from "../components/Link.astro" ---
-

Maybe I'll write something here soon

+
    +
  • What I'm Currently Learning
  • +
\ No newline at end of file diff --git a/src/pages/blog/what-im-learning.mdx b/src/pages/blog/what-im-learning.mdx new file mode 100644 index 0000000..01834f0 --- /dev/null +++ b/src/pages/blog/what-im-learning.mdx @@ -0,0 +1,14 @@ +--- +layout: ../../layouts/BlogLayout.astro +date: 2024-01-28 +title: What I'm Currently Learning +description: A look at where I'm spending my time to learn new things to help in my career +--- + +This is a look at where I'm spending my time to learn new things to help me +advance my career to a place that is fulfilling. + +- Working on this site, dilloncurry.com +- [Google Tech Dev Guide](https://techdevguide.withgoogle.com/), to improve my knowledge around data structure and algorithms +- [web.dev/learn](https://web.dev/learn), to strengthen my knowledge in the web domain +- 📕 ["Multihreaded JavaScript: Concurrency Beyond the Event Loop"](https://www.oreilly.com/library/view/multithreaded-javascript/9781098104429/), to better my understanding of JavaScript