This commit is contained in:
Nicholas Orlowsky 2022-04-22 15:37:45 -05:00
commit 0eae4c00ca
No known key found for this signature in database
GPG key ID: 3845F78A73B14100
15 changed files with 167 additions and 47 deletions

View file

@ -1,4 +1,26 @@
server { server {
gzip on;
gzip_types
application/atom+xml
application/geo+json
application/javascript
application/x-javascript
application/json
application/ld+json
application/manifest+json
application/rdf+xml
application/rss+xml
application/xhtml+xml
application/xml
font/eot
font/otf
font/ttf
image/svg+xml
text/css
text/javascript
text/plain
text/xml;
gzip_min_length 256;
listen 80; listen 80;
location / { location / {
root /usr/share/nginx/html; root /usr/share/nginx/html;

View file

@ -12,7 +12,11 @@
"@types/react": "^17.0.0", "@types/react": "^17.0.0",
"@types/react-animate-on-scroll": "^2.1.2", "@types/react-animate-on-scroll": "^2.1.2",
"@types/react-dom": "^17.0.0", "@types/react-dom": "^17.0.0",
<<<<<<< HEAD
"@types/react-router-dom": "^5.3.3", "@types/react-router-dom": "^5.3.3",
=======
"@types/react-router-dom": "^5.3.1",
>>>>>>> 8c84df02414fd057cd7f9392040d50522e98e12a
"@types/react-slick": "^0.23.4", "@types/react-slick": "^0.23.4",
"@types/react-tabs": "^2.3.2", "@types/react-tabs": "^2.3.2",
"@types/react-typing-animation": "^1.6.2", "@types/react-typing-animation": "^1.6.2",
@ -23,7 +27,12 @@
"react-animate-on-scroll": "^2.1.5", "react-animate-on-scroll": "^2.1.5",
"react-bootstrap": "^1.6.1", "react-bootstrap": "^1.6.1",
"react-dom": "^17.0.2", "react-dom": "^17.0.2",
<<<<<<< HEAD
"react-router-dom": "^6.3.0", "react-router-dom": "^6.3.0",
=======
"react-router": "^5.2.1",
"react-router-dom": "^5.3.0",
>>>>>>> 8c84df02414fd057cd7f9392040d50522e98e12a
"react-scripts": "4.0.3", "react-scripts": "4.0.3",
"react-slick": "^0.28.1", "react-slick": "^0.28.1",
"react-snapshot": "^1.3.0", "react-snapshot": "^1.3.0",

View file

@ -144,14 +144,10 @@ h1 {
animation: move-left-atx-anim 1s forwards; animation: move-left-atx-anim 1s forwards;
} }
ul {
list-style-type: none;
margin-left: -35px;
}
html { html {
scroll-snap-type: y proximity; scroll-snap-type: y mandatory;
} }
.child { .child {

View file

@ -13,8 +13,7 @@ export default function AboutMe() {
<div className={"col-12"} style={{width: "100vw", justifyContent: "center", display: "flex"}}> <div className={"col-12"} style={{width: "100vw", justifyContent: "center", display: "flex"}}>
<p className={"col-12"} style={{maxWidth: 600}}> <p className={"col-12"} style={{maxWidth: 600}}>
I was born and raised in Austin, Texas. I've been writing code for nearly 7 years and I'm I was born and raised in Austin, Texas. I've been writing code for nearly 7 years and I'm
currently going to <b>The University of Texas at Austin</b> and working as a <b>Software currently going to <b>The University of Texas at Austin</b> and working as the <b>Chief Technology Officer</b> at <b>Comp Wallet Corp.</b>
Engineer</b> at <b>Chicks Gold</b>.
</p> </p>
</div> </div>

View file

@ -3,11 +3,9 @@ import React from "react";
export default function Footer() { export default function Footer() {
return ( return (
<footer> <footer>
<div style={{minHeight: "10vh"}}> <div style={{height: 12, marginTop: -50}}>
<p className={"m-0"}>Copyright © 2021 Nicholas Orlowsky</p> <p style={{color: "grey"}} className={"m-0"}>Originally created by Nicholas Orlowsky - Licensed under GNU General Public License v3 - Original source available <a href={"https://github.com/nickorlow/personal-site"}>here</a></p>
<p className={"m-0"}>Licensed under GNU General Public License v3</p> <p>Hosting provided by <a href={"https://nws.nickorlow.com"}>Nick Web Services (NWS)</a></p>
<p className={"m-0"}>Original source available <a
href={"https://github.com/nickorlow/personal-site"}>here</a></p>
</div> </div>
</footer> </footer>
) )

View file

@ -13,7 +13,7 @@ export default function Hero() {
flexDirection: "column", flexDirection: "column",
alignItems: "center" alignItems: "center"
}}> }}>
<img alt="github profile" src={"https://avatars.githubusercontent.com/u/85139485?v=4"} <img alt="github profile picture" src={"https://avatars.githubusercontent.com/u/56371027?v=4"}
style={{height: "30vh", width: "auto"}} className={"pfp"}/> style={{height: "30vh", width: "auto"}} className={"pfp"}/>
<h1 className={"m-0 font-weight-bold"}>Nicholas Orlowsky</h1> <h1 className={"m-0 font-weight-bold"}>Nicholas Orlowsky</h1>
<h4 className={"m-0"}>Software Engineer</h4> <h4 className={"m-0"}>Software Engineer</h4>

View file

@ -1,9 +1,3 @@
@media only screen and (min-width: 993px) {
.center-card {
border-left: .5px rgba(255,255,255,.25) solid;
border-right: .5px rgba(255,255,255,.25) solid;
}
}
@media only screen and (max-width: 768px) { @media only screen and (max-width: 768px) {

View file

@ -3,18 +3,24 @@ import React from "react";
import Job from "../../types/Job"; import Job from "../../types/Job";
import "./JobCard.css"; import "./JobCard.css";
export default function JobCard(props: {style?: any, className?: string, job: Job, isCenter: boolean}){ export default function JobCard(props: {style?: any, className?: string, job: Job}){
return ( return (
<ScrollAnimation className={"job-card "+(props.isCenter ? "center-card " : "")+(props.className || "")} style={props.style} animateIn="fade-up" duration={2} animateOnce={true} offset={50} delay={200}> <ScrollAnimation className={"job-card "+(props.className || "")} style={props.style} animateIn="fade-up" duration={2} animateOnce={true} offset={50} delay={200}>
<div style={{padding: 20}}> <div className={"row"} style={{paddingTop: 40}}>
<img alt={props.job.company+" company logo"} src={props.job.image} style={{maxHeight: 70, padding: 10,width: "auto", maxWidth: "100%"}}/> <div className={"col-md-4"}>
<h2>{props.job.title}</h2> <img className={"float-left float-md-none"} alt={props.job.company+" company logo"} src={props.job.image} style={{paddingLeft: 20, objectFit: "contain" ,height: "auto", maxWidth: 300}}/>
{props.job.uri == null && <h5>{props.job.company}</h5>} </div>
{props.job.uri != null && <a href={props.job.uri}><h5>{props.job.company}</h5></a>} <div className={"col-md-8 row"}>
<p>{props.job.timespan}</p> <div className={"col-md-6 text-left"}>
<ul> <h2>{props.job.title}</h2>
{props.job.items.map((s) => <li>{s}</li>)} {props.job.uri == null && <h5>{props.job.company}</h5>}
</ul> {props.job.uri != null && <a href={props.job.uri}><h5>{props.job.company}</h5></a>}
<p>{props.job.timespan}</p>
</div>
<ul className={"col-md-6 text-left"}>
{props.job.items.map((s) => <li>{s}</li>)}
</ul>
</div>
</div> </div>
</ScrollAnimation> </ScrollAnimation>
); );

View file

@ -6,12 +6,9 @@ import "./Jobs.css";
export default function Jobs() { export default function Jobs() {
return ( return (
<div className={"child"} style={{minHeight: "100vh"}}> <div className={"child"} style={{minHeight: "100vh"}}>
<div className={"row"} style={{justifyContent: "center", alignItems: "center", alignContent: "center"}}> <div style={{alignContent: "center", padding: 50}}>
<h1 className={"col-12"} style={{marginBottom: 20}}>Work</h1> <h1 style={{marginBottom: 40}}>Work</h1>
{AllJobs.map((job, i) =><JobCard job={job}/>)}
{AllJobs.map((job, i) =><JobCard className={"col-md-4"} job={job}
isCenter={i % 2 === 1}/>)}
</div> </div>
</div> </div>
) )

View file

@ -10,6 +10,14 @@ const RunningHobby: InfoCardProps = {
listClassName: "col-12" listClassName: "col-12"
} }
const Lifting: InfoCardProps = {
title: "Lifting",
description: "Once I was done with cross country, I was so used to working out everyday, I just couldn't stop. I started lifting as a break from my 6 years and 10,000 miles of running and really really liked it.",
listTitle: "Personal Records",
list:["Bench - 235lbs", "Squat - 345lbs", "Deadlift - 345lbs (I think)"],
listClassName: "col-12"
}
const VideogameHobby: InfoCardProps = { const VideogameHobby: InfoCardProps = {
title: "Video Games", title: "Video Games",
description: "Video games are what got me interested in programming in the first place. I tend to play them a lot less now in favor of programming though, I'll occasionally sink a couple hours into a game.", description: "Video games are what got me interested in programming in the first place. I tend to play them a lot less now in favor of programming though, I'll occasionally sink a couple hours into a game.",
@ -17,5 +25,5 @@ const VideogameHobby: InfoCardProps = {
list: ["Galaga", "Clone Hero", "Minecraft"] list: ["Galaga", "Clone Hero", "Minecraft"]
} }
export const AllHobbies: InfoCardProps[] = [RunningHobby, VideogameHobby]; export const AllHobbies: InfoCardProps[] = [RunningHobby, Lifting];

View file

@ -1,7 +1,8 @@
import Job from "../../types/Job"; import Job from "../../types/Job";
import VrboImage from "../images/vrbo-logo-min.png"; import VrboImage from "../images/vrbo-logo-min.png";
import CavImage from "../images/cavcash-logo-min.png"; import CavImage from "../images/cavcash-logo-min.png";
import ChicksImage from "../images/chicks-logo.svg"; import ChicksImage from "../images/chicks-logo.png";
import CompImage from "../images/compwallet-logo.png";
const VrboJob: Job = { const VrboJob: Job = {
title: "Data Scientist", title: "Data Scientist",
@ -19,15 +20,13 @@ const VrboJob: Job = {
const CavCashJob: Job = { const CavCashJob: Job = {
title: "CEO & Software Engineer", title: "CEO & Software Engineer",
company: "CavCash Inc", company: "CavCash",
timespan: "May 2017 - Present", timespan: "May 2017 - April 2021",
items: [ items: [
"Founded the company", "Founded the company",
"Wrote a C# webAPI", "Wrote a C# webAPI",
"Managed mongoDB and MSSQL databases", "Managed mongoDB and MSSQL databases",
"Deployed and maintained k8s clusters on bare metal", "Deployed and maintained k8s clusters on bare metal on in-house datacenter",
"Managed CI/CD & DevOps in Azure DevOps",
"Ran & migrated services between Azure, AWS, and GCP"
], ],
image: CavImage image: CavImage
} }
@ -36,7 +35,7 @@ const ChicksJob: Job = {
title: "Software Engineer", title: "Software Engineer",
company: "Chicks Gold", company: "Chicks Gold",
uri: "https://chicksgold.com", uri: "https://chicksgold.com",
timespan: "April 2021 - Present", timespan: "April 2021 - October 2021",
items: [ items: [
"Added features & bugfixes to .NET 5 API", "Added features & bugfixes to .NET 5 API",
"Added features & bugfixes to Aurelia website", "Added features & bugfixes to Aurelia website",
@ -46,6 +45,18 @@ const ChicksJob: Job = {
image: ChicksImage image: ChicksImage
} }
const CompWalletJob: Job = {
title: "Chief Technology Officer",
company: "Casino CompWallet",
timespan: "October 2021 - Present",
items: [
"Architected & built in-house advertising platform",
"Work on Ruby-On-Rails API",
"Updated a React Native mobile app used with ~15,000 users"
],
image: CompImage
}
export const AllJobs: Job[] = [VrboJob, CavCashJob, ChicksJob];
export const AllJobs: Job[] = [CompWalletJob, CavCashJob, ChicksJob, VrboJob];

View file

@ -2,13 +2,22 @@ import InfoCardProps from "../../types/InfoCardProps";
const WebsiteProject: InfoCardProps = { const WebsiteProject: InfoCardProps = {
title: "personal-site (this website)", title: "personal-site (this website)",
description: "As a primairly backend guy, I wrote my last website as a JSON file (imatating a webAPI). Feedback showed that that was a bad idea so I made this pretty neat site (in my opinion). If you like it, feel free to use it yourself!", description: "As a primairly backend guy, I wrote my last website as a JSON file (imatating a webAPI). Feedback showed that that was a bad idea so I made this pretty neat site (in my opinion). If you like it, feel free to use it yourself! The backend is run in a homemade datacenter (a few Dell Poweredges on a rack) running on Kubernetes.",
listTitle: "Technologies & Resources used", listTitle: "Technologies & Resources used",
list:["React", "Typescript", "Bootstrap", "Icons8", "Docker", "Kubernetes"], list:["React", "Typescript", "Bootstrap", "Icons8", "Docker", "Kubernetes"],
link: "https://github.com/nickorlow/personal-site", link: "https://github.com/nickorlow/personal-site",
linkTitle: "GitHub Repo" linkTitle: "GitHub Repo"
} }
const RoomyProject: InfoCardProps = {
title: "roomy-sentry",
description: "Built software to monitor the presence of a person based on sniffing the wi-fi packets of their mobile devices. Practically used in order to tell if my roommate is home.",
listTitle: "Technologies Used",
list: ["C#", ".NET 6", "NoSQL", "Docker", "nginx", "React Native", "Cloudflare"],
link: "https://github.com/nickorlow/roomy-sentry",
linkTitle: "Github Repository"
}
const CavCashProject: InfoCardProps = { const CavCashProject: InfoCardProps = {
title: "cavcash", title: "cavcash",
description: "CavCash started as a project in 2017 as a way to pay with flashdrives. After recruiting a few friends to help me, we build ourselves into a PayPal competitor but shutdown due to funding. I continued to re-write the platform as a cryptocurrency.", description: "CavCash started as a project in 2017 as a way to pay with flashdrives. After recruiting a few friends to help me, we build ourselves into a PayPal competitor but shutdown due to funding. I continued to re-write the platform as a cryptocurrency.",
@ -36,5 +45,5 @@ const SPONODEProject: InfoCardProps = {
linkTitle: "GitHub Repo" linkTitle: "GitHub Repo"
} }
export const AllProjects: InfoCardProps[] = [WebsiteProject, CavCashProject, XenMapProject, SPONODEProject]; export const AllProjects: InfoCardProps[] = [WebsiteProject, RoomyProject, XenMapProject, SPONODEProject];

View file

@ -0,0 +1,71 @@
# Doing C assignments in C#
Thanks to Arpan Dhatt for doing most of the work on this (his blog here: [https://arpan.one/posts/messing-with-gradescope/](https://arpan.one/posts/messing-with-gradescope/))
At the end, he made this comment:
>And so, that's the end of this post. To whom it may concern, don't try doing your C assignment in C# (you know who you are).
The reason for this comment (besides the fact that I talk about C# a lot) is due to the fact that C# requires a runtime to be installed for it to work. This is because C# does not compile to native bytecode but rather compiles to an intermediary language (dubbed CIL by Microsoft) and is then translated 'Just In Time' by the runtime.
This makes running assignments in a docker container where the runtime is not already installed considerably hard. One option we have is that we could just include the runtime in our submission. Sounds easy, right? Well it would be non-trivial to do but due to the fact that the .NET runtime is very large, I wouldn't consider this a good idea (Not to mention it's super boring).
The better solution is to use .NET's (experimental) AOT compilation feature (formerly called CoreRT). C# has had a number of attempts at an AOT compiler such as :
- List
- LLD2CPP built by Unity
We'll be using the official AOT compilation built by Microsoft. In order to use it, all you have to do is add the following to your `nuget.config`:
```xaml
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />
```
and then install the package: `Microsoft.DotNet.ILCompiler`. After doing that if you run the command: `dotnet publish -r [Runtime] -c [Config]` and after waiting a considerable amount of time, you'll have a full-fledged C# application compiled directly to your target runtime's bytecode!
Compiling my simple Hello, Wold test to linux-x64 (`dotnet publish -r linux-x64 -c Release`) and adding it to my project files should let me run it using the same method Arpan used in his blog.
But running that command gives this beautiful error:
`Cross-OS native compilation is not supported. https://github.com/dotnet/corert/issues/5458 [.../CSharpAOTCompilation/CSharpAOTCompilation/CSharpAOTCompilation.csproj]`
This (unfortunately) means that I need to either find a Linux machine to run this on or spin up a docker container to compile it for me. Luckily, I'm pretty good with docker and was able to spin this Dockerfile up relatively quickly that allows for this compilation:
```dockerfile
```
After doing that, we can follow the instructions followed by Arpan and viola! C# runs on Gradescope!
I don't recommend this but it was fun to do and I needed stuff to write in a blog.
## Other Interesting (Low Level) C#/.NET Features
C# actually has many lower level features people don't expect it to have. Some of these include pointers and direct memory management. Pointers can be enabled by encasing your code in an unsafe code block.
Example (Written by [Microsoft](https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/unsafe-code))
```c#
// Normal pointer to an object.
int[] a = new int[5] { 10, 20, 30, 40, 50 };
// Must be in unsafe code to use interior pointers.
unsafe
{
// Must pin object on heap so that it doesn't move while using interior pointers.
fixed (int* p = &a[0])
{
// p is pinned as well as object, so create another pointer to show incrementing it.
int* p2 = p;
Console.WriteLine(*p2);
// Incrementing p2 bumps the pointer by four bytes due to its type ...
p2 += 1;
Console.WriteLine(*p2);
p2 += 1;
Console.WriteLine(*p2);
Console.WriteLine("--------");
Console.WriteLine(*p);
// Dereferencing p and incrementing changes the value of a[0] ...
*p += 1;
Console.WriteLine(*p);
*p += 1;
Console.WriteLine(*p);
}
}
```
In .NET 6, the `NativeMemory` class was introduced which you can read about here: [](). It allows for malloc-like memory allocation and freeing which can be important for performance (and is also generally just better than letting a garbage garbage collector do your

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB