diff --git a/_config.yml b/_config.yml index 0a280a671..79d699201 100644 --- a/_config.yml +++ b/_config.yml @@ -1,15 +1,17 @@ -title: Moonwalk -author: Abhinav Saxena -url: https://www.abhinavsaxena.com/moonwalk # root address of the site +title: Yayo's Site +author: Luis De León +url: https://www.its-yayo.github.io # root address of the site description: > # description of the site (multiple lines allowed) - Moonwalk is a fast and elegant Jekyll theme with a clean dark mode. It comes with horizontal list (for navbar and footer), card list (for portfolio), and a generic vertical list. It is very easy to modify in case you want to build over it - please see _layouts/home.html to do that. + I'm Yayo and you reached my site, feel free to explore it. Here you can find all projects I'm involved, as well as some great articles related to coding and hacking (red teaming), as well as some non-coding articles too. + + permalink: /:slug favicon: "./logo.png" # relative path to site's favicon twitter: - username: abhinav # update or delete this + username: elyayoveloz # update or delete this card: summary_large_image #theme: moonwalk # if you are using GitHub Pages, change it to remote_theme: abhinavs/moonwalk @@ -18,8 +20,8 @@ remote_theme: abhinavs/moonwalk theme_config: appearance: "dark" # can be "light", "dark" or "auto" appearance_toggle: true # if appearance can be switched by user - back_home_text: "home.." # customize text for homepage link in post layout - date_format: "%Y-%m-%d" # customize how date is formatted + back_home_text: "Click here to go home" # customize text for homepage link in post layout + date_format: "%m-%d-%Y" # customize how date is formatted show_description: true # show blog description show_navbar: true # show horizontal navbar show_footer: true # show footer links in home page,add in _data/home.yml @@ -27,17 +29,14 @@ theme_config: # following keys are using to create home layout show_projects: true # show projects as cards, add in _data/home.yml show_blog: true # show blog posts added in _posts - show_old_projects: true # show old projects as cards, add in _data/home.yml show_misc_list: false # show generic vertical list for misc details, add _data/home.yml show_reading_time: true # show number of words and reading time in the blog posts show_tags: true # show tags in a blog posts # options for "home" page home: - title_projects: Portfolio + title_projects: Projects title_misc_list: Details title_blog: Blog - title_old_projects: Old Projects - soopr: publish_token: "" # sign up at https://www.soopr.co to get your publish token and personalize share and reaction options diff --git a/_data/home.yml b/_data/home.yml index 0ef30fc60..d2a2599eb 100644 --- a/_data/home.yml +++ b/_data/home.yml @@ -1,71 +1,22 @@ navbar_entries: - - title: about + - title: About url: about - - title: blog + - title: Blog url: blog - - title: website - url: https://www.abhinav.co + - title: Contact + url: contact project_entries: - - title: Project 1 - url: overview-post - desc: This is an example project, configured in _data/home.yml - - - title: Project 2 - url: overview-post - desc: Projects are shown in card layout - - - title: Project 3 - url: overview-post - desc: You can control visibility from _config.yml file - - - title: Project 4 - url: overview-post - desc: This project uses highlight markup, configured in _data/home.yml - highlight: WIP - - - title: Project 5 - url: overview-post - desc: Moonwalk also has horizontal list (used in header and footer) - highlight: WIP - - - title: Project 6 - url: overview-post - desc: It also has a scalable vertical list (in case you need it) - -old_project_entries: - - title: Soopr - url: https://www.soopr.co - desc: Delight your readers - add beautiful share and like buttons easily to your websites - highlight: NEW - - - title: Cookie - url: https://github.com/abhinavs/cookie - desc: An open source landing website with supporting pages and integrated blog - - - title: Moonwalk - url: https://github.com/abhinavs/moonwalk - desc: A fast and minimalist Jekyll blog theme with clean dark mode - - - title: Humangous - url: https://www.humangous.co - desc: The better people know you, the better they collaborate - -footer_entries: - - title: abhinav's homepage - url: https://www.abhinav.co - - - title: twitter - url: https://twitter.com/abhinav - - - title: github - url: https://github.com/abhinavs - - - title: feed - url: feed.xml - + - title: Keypwn + url: keypwn + desc: Keypwn is a single keylogger tool for cryptography purposes. + + - title: Ramskit + url: ramskit + desc: Ramskit is a single ransomware tool to encrypt/decrypt data for pentesting. + misc_entries: - title: this is an example vertical list url: false @@ -77,7 +28,7 @@ misc_entries: url: false - title: Blog posts - post_list: true + post_list: false url: false - title: moonwalk on the Internet diff --git a/_posts/2020-07-07-overview-post.md b/_posts/2020-07-07-overview-post.md deleted file mode 100644 index 7611fddfc..000000000 --- a/_posts/2020-07-07-overview-post.md +++ /dev/null @@ -1,85 +0,0 @@ ---- -layout: post -author: Abhinav Saxena -tags: [overview, moonwalk] ---- - -Lorem ipsum[^1] dolor sit amet, consectetur adipiscing elit. Pellentesque vel lacinia neque. Praesent nulla quam, ullamcorper in sollicitudin ac, molestie sed justo. Cras aliquam, sapien id consectetur accumsan, augue magna faucibus ex, ut ultricies turpis tortor vel ante. In at rutrum tellus. - -# Sample heading 1 -## Sample heading 2 -### Sample heading 3 -#### Sample heading 4 -##### Sample heading 5 -###### Sample heading 6 - -Mauris viverra dictum ultricies. Vestibulum quis ipsum euismod, facilisis metus sed, varius ipsum. Donec scelerisque lacus libero, eu dignissim sem venenatis at. Etiam id nisl ut lorem gravida euismod. - -## Lists - -Unordered: - -- Fusce non velit cursus ligula mattis convallis vel at metus[^2]. -- Sed pharetra tellus massa, non elementum eros vulputate non. -- Suspendisse potenti. - -Ordered: - -1. Quisque arcu felis, laoreet vel accumsan sit amet, fermentum at nunc. -2. Sed massa quam, auctor in eros quis, porttitor tincidunt orci. -3. Nulla convallis id sapien ornare viverra. -4. Nam a est eget ligula pellentesque posuere. - -## Blockquote - -The following is a blockquote: - -> Suspendisse tempus dolor nec risus sodales posuere. Proin dui dui, mollis a consectetur molestie, lobortis vitae tellus. - -## Thematic breaks (
) - -Mauris viverra dictum ultricies[^3]. Vestibulum quis ipsum euismod, facilisis metus sed, varius ipsum. Donec scelerisque lacus libero, eu dignissim sem venenatis at. Etiam id nisl ut lorem gravida euismod. **You can put some text inside the horizontal rule like so.** - ---- -{: data-content="hr with text"} - -Mauris viverra dictum ultricies. Vestibulum quis ipsum euismod, facilisis metus sed, varius ipsum. Donec scelerisque lacus libero, eu dignissim sem venenatis at. Etiam id nisl ut lorem gravida euismod. **Or you can just have an clean horizontal rule.** - ---- - -Mauris viverra dictum ultricies. Vestibulum quis ipsum euismod, facilisis metus sed, varius ipsum. Donec scelerisque lacus libero, eu dignissim sem venenatis at. Etiam id nisl ut lorem gravida euismod. Or you can just have an clean horizontal rule. - -## Code - -Now some code: - -``` -const ultimateTruth = 'follow middlepath'; -console.log(ultimateTruth); -``` - -And here is some `inline code`! - -## Tables - -Now a table: - -| Tables | Are | Cool | -| ------------- |:-------------:| -----:| -| col 3 is | right-aligned | $1600 | -| col 2 is | centered | $12 | -| zebra stripes | are neat | $1 | - -## Images - -![theme logo](http://www.abhinavsaxena.com/images/abhinav.jpeg) - -This is an image[^4] - ---- -{: data-content="footnotes"} - -[^1]: this is a footnote. You should reach here if you click on the corresponding superscript number. -[^2]: hey there, don't forget to read all the footnotes! -[^3]: this is another footnote. -[^4]: this is a very very long footnote to test if a very very long footnote brings some problems or not; hope that there are no problems but you know sometimes problems arise from nowhere. diff --git a/_posts/2020-07-08-language-tests.md b/_posts/2020-07-08-language-tests.md deleted file mode 100644 index b7e5172be..000000000 --- a/_posts/2020-07-08-language-tests.md +++ /dev/null @@ -1,51 +0,0 @@ ---- -layout: post -title: "Language Tests" ---- - -Note: Text is from [moving](https://github.com/huangyz0918/moving), which is another good Jekyll theme. - -### 1. 日本語テスト - -This is a Japanese test post to show you how japanese is displayed. - -私は昨日ついにその助力家というのの上よりするたなけれ。 -最も今をお話団はちょうどこの前後なかろでくらいに困りがいるたをは帰着考えたなかって、そうにもするでうたらない。 -がたを知っないはずも同時に九月をいよいよたありた。 - -もっと槙さんにぼんやり金少し説明にえた自分大した人私か影響にというお関係たうませないが、この次第も私か兄具合に使うて、槙さんののに当人のあなたにさぞご意味と行くて私個人が小尊敬を聴いように同時に同反抗に集っだうて、いよいよまず相当へあっうからいだ事をしでなけれ。 - -> それでそれでもご時日をしはずはたったいやと突き抜けるますて、その元がは行ったてという獄を尽すていけですた。 - -この中道具の日その学校はあなたごろがすまなりかとネルソンさんの考えるですん、辺の事実ないというご盲従ありたですと、爺さんのためが薬缶が結果までの箸の当時してならて、多少の十月にためからそういう上からとにかくしましないと触れべきものたで、ないうですと多少お人達したのでたた。 - -From [すぐ使えるダミーテキスト - 日本語 Lorem ipsum.](http://lipsum.sugutsukaeru.jp/index.cgi) - - -### 2. 繁体中文测试 - -This is a chinese test post to show you how chinese is displayed. - -善我王上魚、產生資西員合兒臉趣論。畫衣生這著爸毛親可時,安程幾?合學作。觀經而作建。都非子作這!法如言子你關!手師也。 - -以也座論頭室業放。要車時地變此親不老高小是統習直麼調未,行年香一? - -就竟在,是我童示讓利分和異種百路關母信過明驗有個歷洋中前合著區亮風值新底車有正結,進快保的行戰從:弟除文辦條國備當來際年每小腳識世可的的外的廣下歌洲保輪市果底天影;全氣具些回童但倒影發狀在示,數上學大法很,如要我……月品大供這起服滿老?應學傳者國:山式排只不之然清同關;細車是!停屋常間又,資畫領生,相們制在?公別的人寫教資夠。資再我我!只臉夫藝量不路政吃息緊回力之;兒足灣電空時局我怎初安。意今一子區首者微陸現際安除發連由子由而走學體區園我車當會,經時取頭,嚴了新科同?很夫營動通打,出和導一樂,查旅他。坐是收外子發物北看蘭戰坐車身做可來。道就學務。 - -國新故。 - -> 工步他始能詩的,裝進分星海演意學值例道……於財型目古香亮自和這乎?化經溫詩。只賽嚴大一主價世哥受的沒有中年即病行金拉麼河。主小路了種就小為廣不? - -From [亂數假文產生器 - Chinese Lorem Ipsum.](http://www.richyli.com/tool/loremipsum/) - - - -### 3. 简体中文测试 - -效育声去本义然空,各值太法心想,场强实地。 题铁习点儿表管少间千,只何政亲织文意部,千影画派证男须。 手反取长风治增非等直难群,连取及天他己事头级,影数弦适把气快目人。 专议以省通引而千个,格则口段度样水热马,地教少务改磨。 包思外心半院应她算斯,市外会快记路又火学,劳如肃它准众丧边。 - - > 团算部住县单总边素格军所,合音府教看和广光采率位转,位用品根确针百。 证其标元角工方海接交他,论象切万世认一响义,治然身本风弦带题。 向我次路持加北,她不反心。 说总元军例市决,现始即算证养,规走还壳。 - -因林可相儿应满军,热影省条律因资再,整肃赤心将届。 局广写两量备验还,南教事争工民的,备进研上布。 素身电活非直,速这区交示从,百层达。 资量那毛什京身,白这快。 半打容三手开常价或,手严量般象式效,名可重芽门适。 来设什一我么,光界美么或,住身式准。 造酸改表委验众办地百养,商物战众本列听度名院,制压录丽快与千机内。 住需当四议决得命南然照按民置,当住命形金决否矿单外。 气象理离开新集增际,三划方工义很年关,拉许准孝口。 构片出干计由备美打养,持育总指承入无己。 - -From [假文生成器, lorem ipsum Chinese](http://www.cancms.com/content/dummytext) \ No newline at end of file diff --git a/_posts/2020-07-08-very-very-very-long-title-and-very-very-very-short-content.md b/_posts/2020-07-08-very-very-very-long-title-and-very-very-very-short-content.md deleted file mode 100644 index 9d7b30159..000000000 --- a/_posts/2020-07-08-very-very-very-long-title-and-very-very-very-short-content.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -layout: post ---- - -Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque vel lacinia neque. Praesent nulla quam, ullamcorper in sollicitudin ac, molestie sed justo. Cras aliquam, sapien id consectetur accumsan, augue magna faucibus ex, ut ultricies turpis tortor vel ante. In at rutrum tellus. Nullam vestibulum metus eu purus malesuada, volutpat mattis leo facilisis. \ No newline at end of file diff --git a/_posts/2020-07-09-post-example-with-headings-and-toc.md b/_posts/2020-07-09-post-example-with-headings-and-toc.md deleted file mode 100644 index bd689f475..000000000 --- a/_posts/2020-07-09-post-example-with-headings-and-toc.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -layout: post ---- - -Mauris viverra dictum ultricies. Vestibulum quis ipsum euismod, facilisis metus sed, varius ipsum. Donec scelerisque lacus libero, eu dignissim sem venenatis at. Nunc a egestas tortor, sed feugiat leo. - -## Table of contents -- [Table of contents](#table-of-contents) -- [The start](#the-start) -- [The middle](#the-middle) -- [The end](#the-end) - -Mauris viverra dictum ultricies. Vestibulum quis ipsum euismod, facilisis metus sed, varius ipsum. Donec scelerisque lacus libero, eu dignissim sem venenatis at. Nunc a egestas tortor, sed feugiat leo. Vestibulum porta tincidunt tellus, vitae ornare tortor. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Sed nunc neque, tempor in iaculis non, faucibus et metus. Etiam id nisl ut lorem gravida euismod. - -## [The start](#the-start) - -Fusce non velit cursus ligula mattis convallis vel at metus. Sed pharetra tellus massa, non elementum eros vulputate non. Suspendisse potenti. Quisque arcu felis, laoreet vel accumsan sit amet, fermentum at nunc. Sed massa quam, auctor in eros quis, porttitor tincidunt orci. Nulla convallis id sapien ornare viverra. Cras nec est lacinia ligula porta tincidunt. Nam a est eget ligula pellentesque posuere. Maecenas quis enim ac risus accumsan scelerisque. Aliquam vitae libero sapien. Etiam convallis, metus nec suscipit condimentum, quam massa congue velit, sit amet sollicitudin nisi tortor a lectus. Cras a arcu enim. Suspendisse hendrerit euismod est ac gravida. Donec vitae elit tristique, suscipit eros at, aliquam augue. In ac faucibus dui. Sed tempor lacus tristique elit sagittis, vitae tempor massa convallis. - -## [The middle](#the-middle) - -Proin quis velit et eros auctor laoreet. Aenean eget nibh odio. Suspendisse mollis enim pretium, fermentum urna vitae, egestas purus. Donec convallis tincidunt purus, scelerisque fermentum eros sagittis vel. Aliquam ac aliquet risus, tempus iaculis est. Fusce molestie mauris non interdum hendrerit. Curabitur ullamcorper, eros vitae interdum volutpat, lacus magna lacinia turpis, at accumsan dui tortor vel lectus. Aenean risus massa, semper non lectus rutrum, facilisis imperdiet mi. Praesent sed quam quis purus auctor ornare et sed augue. Vestibulum non quam quis ligula luctus placerat sed sit amet erat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Fusce auctor, sem eu volutpat dignissim, turpis nibh malesuada arcu, in consequat elit mauris quis sem. Nam tristique sit amet enim vel accumsan. Sed id nibh commodo, dictum sem id, semper quam. - -## The end - -Donec ex lectus, tempus non lacinia quis, pretium non ipsum. Praesent est nunc, rutrum vel tellus eu, tristique laoreet purus. In rutrum orci sit amet ex ornare, sit amet finibus lacus laoreet. Etiam ac facilisis purus, eget porttitor odio. Suspendisse tempus dolor nec risus sodales posuere. Proin dui dui, mollis a consectetur molestie, lobortis vitae tellus. Vivamus at purus sed urna sollicitudin mattis. Mauris lacinia libero in lobortis pulvinar. Nullam sit amet condimentum justo. Donec orci justo, pharetra ut dolor non, interdum finibus orci. Proin vitae ante a dui sodales commodo ac id elit. Nunc vel accumsan nunc, sit amet congue nunc. Aliquam in lacinia velit. Integer lobortis luctus eros, in fermentum metus aliquet a. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. - diff --git a/_posts/2021-01-08-code.md b/_posts/2021-01-08-code.md deleted file mode 100644 index 32538a23e..000000000 --- a/_posts/2021-01-08-code.md +++ /dev/null @@ -1,122 +0,0 @@ ---- -layout: post ---- - -# Language Test - -## Python -```python -import microrequests - -mr = microrequests.init() -# mr is requests' session object and you can use it in similar manner -res = mr.get("http://httpbin.org/get") -print(res.text) -``` - -## Ruby -```ruby -require 'gmail' -require 'time' -require 'yaml' -require 'erb' - -if ARGV.length != 2 - puts "Syntax: #{__FILE__} gmail-username gmail-password" - exit -end - -config = YAML.load_file("#{File.dirname(__FILE__)}/config.yaml") -body = ERB.new(config['body']) - -gmail = Gmail.connect(ARGV[0], ARGV[1]) - -# variable 'name' is important given it is used in body as well -for name, email_id in config['to'] do - puts "sending to #{email_id}" - email = gmail.compose do - to email_id - from config['from'] - subject config['subject'] - body body.result(binding) - end - email.deliver! -end - -gmail.logout -``` - -## Javascript -```javascript -const path = require('path'); -const { merge } = require('webpack-merge'); -const common = require('./webpack.common.js'); - -module.exports = merge(common, { - mode: 'development', - devtool: 'inline-source-map', - devServer: { - writeToDisk: true, - contentBase: path.join(__dirname, 'dist'), - publicPath: path.join(__dirname, 'dist'), - compress: true, - port: 8000, - }, -}); -``` - -## Elixir -```elixir -defmodule MyAppWeb.BearerAuth do - - import Plug.Conn - alias MyApp.Account - - def init(options) do - options - end - - def call(conn, _options) do - case get_bearer_auth_token(conn) do - nil -> - conn |> unauthorized() - :error -> - conn |> unauthorized() - auth_token -> - account = - Account.get_from_token(auth_token) - if account do - assign(conn, :current_account, account) - else - conn |> unauthorized() - end - end - end - - defp get_bearer_auth_token(conn) do - with ["Bearer " <> auth_token] <- get_req_header(conn, "authorization") do - auth_token - else - _ -> :error - end - end - - defp unauthorized(conn) do - conn - |> resp(401, "Unauthorized") - |> halt() - end -end - -``` - -## CSS -```css -.highlight, pre code, blockquote { - border-radius: 0.5em; -} -blockquote { - background-color: var(--bg-secondary); - border: 1px var(--border) solid; -} -``` diff --git a/_posts/2021-03-04-soopr.md b/_posts/2021-03-04-soopr.md deleted file mode 100644 index fe3ca6038..000000000 --- a/_posts/2021-03-04-soopr.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -layout: post -tags: [soopr, config] ---- - -[Soopr][soopr-website] is the easiest way for you to add share & reaction buttons to your blog and website, integrate an URL shortener and simple to understand analytics service. Soopr lets you manage all of these using a powerful dashboard. - -Moonwalk uses Soopr for share and like buttons and it is already integrated. By default, Moonwalk shows `circular` Twitter, Facebook and Copy buttons in `base` size. To add `like` button, please signup for free on [Soopr][soopr-website] - -Once you have signed up on Soopr, get a publish token for your website and edit `_config.yml` file and add it under `soopr` key and restart the server. -```yml -soopr: - publish-token: "ADD_YOUR_PUBLISH_TOKEN_HERE" -``` - -Check out the [Soopr Website][soopr-website] for more info on how to get the most out of Soopr. - -[soopr-website]: https://www.soopr.co diff --git a/_posts/2022-12-21-basic-doc-for-async-programming.md b/_posts/2022-12-21-basic-doc-for-async-programming.md new file mode 100644 index 000000000..ceaa07056 --- /dev/null +++ b/_posts/2022-12-21-basic-doc-for-async-programming.md @@ -0,0 +1,189 @@ +--- +layout: post +--- + +When a programmer is writing some code, usually is noted that a function requires to be executed, making +this code synchronous. Here's a basic example. + +```python +# Add 2 numbers + +def sum_numbers(x, y): + return x + y + +def main(): + x, y = 4, 5 + print(sum_numbers(x, y)) + +main() +``` + +In this example, the interpreter knows that the args in the function above needs to be known +to be executed. Because of this, the numbers are known calling the main function. (What is to +be expected.) In this example, the output will be 9. + +* * * + + + +However, there's another way to code in a simply way, when 2 (or more) functions are being executed at the same time, with different responses and +one after the other. I know this seems pretty confusing, so I'm gonna explain it to you in a more simple way. + +```python +def sum_numbers(x, y): + return x + y +``` + +From the previous example, we can note that there's a return value. However, we're not calling the function, so there will be no output. When this function is being called +while another function is running, this is what is known as asynchronous code. In Python (and JavaScript), it's being denoted by the key word ```async```. So, refering as a main function, it is something like: + +```python +async def main(): + # Code here +``` +Now, in order to code asynchronous programming, is important to import a library called ```asyncio```, which provides high-level APIs, structured network code and asynchronous frameworks. You +can find more information about this library [here](https://docs.python.org/3/library/asyncio.html). + +That's very important at the time we need to schedule a function that's needed to be executed. And I say "schedule" because as I mentioned +before, you need to code a sequence of statements inside a block of code. To add more fundamental concepts related to this, first check this snippet code: + +```python +# By Yayo +import asyncio +import time + +async def test(word: str): + return word + +async def main(): + print("Time started at: ", time.strftime('%X')) + print(await asyncio.gather(test(word="Hello"))) + await asyncio.sleep(0.5) + + print("World") + + print("Time finished at: ", time.strftime('%X')) + +if __name__ == "__main__": + asyncio.run(main()) + +``` +When you run this, your console should show you something like this: + +``` +$ python3 some_code.py +Time started at: 15:34:02 +['Hello'] +World +Time finished at: 15:34:02 +$ +``` +And yea, I can read your mind and I'd say you have no idea what I just code. Lemme explain you better. In case you have some experience +with Python, you can see that the first function is just returning an string object. In the main function we are calling it but, there's something new for non-async programmers and that's known as Task-based Asynchronous Pattern (TAP), using async/await syntax. + +The concept ```await``` is used as a key word to control a loop passed as an event. Both synchronous and asynchronous uses tasks perfomed while the whole code is executed. The only main difference between being sync and async is the code's threads, so referering to the explanation at the beginning of this doc, a sync code has only one thread, while an async code has multiple threads because of a code block's awaiting. + +In the previous example, we have some asyncio's methods and this is trully important. That will allow us to make a code asynchronous and there are plenty of methods you as a programmer can use, but just let's take a look. + +```python +print(await asyncio.gather(test(word="Hello"))) +``` +What we are doing in this sniṕpet code? First, let's define what does ```asyncio.gather()``` means. Asyncio provides this method to call awaitable objects together. In our example, it doesn't make too sense because we are using just one object to call ```test(word: str)``` and it's just one arg, but it's useful when we have +2 objects calling 'em at the same time. I've got this well-written [doc](https://superfastpython.com/asyncio-gather/) for you if you wanna play with gathering objects. + +```python +await asyncio.sleep(0.5) +``` +This snippet code seems pretty easy to understand, but hold up, not too fast eh. ```time``` (another Python module) already has a similar method, named ```time.sleep()```. Ok, so what's the main difference? Yeah, one's for async threads and the other one for a single-thread code. Mmm, not so close, because we are talking about something really important. + +If we use ```time.sleep()```, we are suspending a whole single-thread execute until with an specific time range. In simple words, the code will just do nothing during the specified time. However, ```asyncio.sleep()``` works slightly different, considering we're coding async code. Assuming we have multiple-thread tasks, this method will allow us to suspend an event while there's a loop running at the same time. This means that there's a loop stopped while an await statement finishes it's execution. + +In our example, we have just little time setted, but this is useful when we code lots of tasks and we wanna set loop-running events suspended or doing something else while the main execute finishes. + +Now, see at the final code block. + +```python +if __name__ == "__main__": + asyncio.run(main()) +``` + +Here's a useful [doc](https://realpython.com/if-name-main-python/) why ```if __name__ == "__main__"``` is so important in Python and why we should include this in all our Python codes. We should look what we can see next. + +As I wrote before, you need to call a function to be executed, otherwise, it will be more statically than useful. (Yea, your code will impress even a farmer lol). Well, a programmer knows this and it's important in any compilated/interpreted programming language. In Python, we call any function by the function's name and the main args if it has. In the first example, I typed ```main()``` to call the main function, so refering as the last example, we can suppose that we call it like in the first example. Is this true? + +Check what happens if we run our code with ```main()``` instead of ```asyncio.run(main())```: + +``` +$ python3 some_code.py +/home/user/some_code.py:32: RuntimeWarning: coroutine 'main' was never awaited + main() +RuntimeWarning: Enable tracemalloc to get the object allocation traceback +$ +``` +In simple words, the ```main()``` function is not actually awaited due of not being really a concurrent task, calling it as a not regular asynchronous function. If u are a curious programmer, ```tracemalloc``` is just a Python debugger module to trace memory blocks disabled. Check [this](https://docs.python.org/3/library/tracemalloc.html) for more info. + +Now, remember that each object is stored in a memory location. In C/C++, pointers are really important, they allow us a programmers to know where is our object. I'm not going to write C/C++ code here because is not the main objective, but in Python, we can note that every async objects is allocated in a memory location once I already setted in my code. + +Also, I'ma tell you that the ```await``` key word is not valid if we wanna code an awaiting object outside the async function, so it's important to take this in consideration. This is the error showed in your console: + +``` +$ python3 some_code.py +File "/home/user/some_code.py", line 12 + await main() + ^^^^^^^^^^^^ +SyntaxError: 'await' outside function +$ +``` +Now, after all of this, I need to set an object while another object is being executed and it's already noted that this is an asynchronous code with multiple threads setted on. + +I need you to understand this, because this will solve our doubt why we use ```asyncio.run(main())``` to run our function, so in order to this, let's introduce a new important object based on TAP. A coroutine is an object used in async programming to be scheduled in case of suspending it and then being executed again. It's based on our syntax we stablished before (async/await), so at the time we are scheduling an object, we are scheduling a coroutine to be awaited in case we wanna do it (Usually yes). Also, as I mentioneed before in this doc, there's an event-loop running while a function is being awaited, due of having multiple threads. At this point, we can call 'em as subroutines, because at the end, it's just a sequence of instructions performing a specific task. + +```asyncio.run(main())``` let us to run a event-loop coroutine in order for each function awaited, then to be executed. + +*** + +I mentioned what's a task and how it's performed during an execution inside an async block code. But now we run into another doubt: Is it possible to create our own tasks, avoiding an unquote object blocked by an another awaitable object? Or in simple words: Execute a task while another is awaiting? Yes and I'm gonna show you: + +```python +# By Yayo +import asyncio +import time + +async def test(word: str): + print(word) + await asyncio.sleep(1) + +async def main(): + print("Time started at: ", time.strftime('%X')) + + print("Task 1 Done") + task_created = asyncio.create_task(test(word="Task 2 Done")) + print("Task 3 Done") + + await asyncio.sleep(1) + + for i in range(0, 3): + print("Looped task 4 Done") + + print("Time finished at: ", time.strftime('%X')) + +if __name__ == "__main__": + asyncio.run(main()) +``` + +This is what your console should show: + +``` +$ python3 some_code.py +Time started at: 10:29:39 +Task 1 Done +Task 3 Done +Task 2 Done +Looped task 4 Done +Looped task 4 Done +Looped task 4 Done +Time finished at: 10:29:40 +$ +``` +In this snippet code, I'm showing you how to create a task with asyncio using ```asyncio.create_task()```, and showing you when a task is being either awaited or executed. + +```asyncio.create_task()``` is a method that allows us to create a task, but it's important to note that this method is not a coroutine, so we can't await it. diff --git a/_posts/2023-01-21-quick-intro-of-time-complexity-for-algorithms.md b/_posts/2023-01-21-quick-intro-of-time-complexity-for-algorithms.md new file mode 100644 index 000000000..091b91a29 --- /dev/null +++ b/_posts/2023-01-21-quick-intro-of-time-complexity-for-algorithms.md @@ -0,0 +1,120 @@ +--- +layout: post +--- + + +Programming is like a cooking recipe. There's a set of instructions in which, you need to follow to solve an specific problem, or to perform a task. And each task in this case, will conform the whole cooking recipe. + +Wanna make a pizza? You need some ingredients (Which from now, I'm gonna call 'em as objects to be in reference): Cheese, Tomato sauce, Pizza dough, etc. You need to assemble all ingredients and then bake it. But I'll ask u something: Don't u ever took how much time did u last making all that pizza? + +In programming, it works similar, but at the time we are coding, we can figure out why our code is taking so much long time to execute, compile, etc. Or the opposite way: Why our code is running so fast, even before noticing how many code lines we wrote? + +That's a hard truth when we are talking about algorithms. I know that debugging a +10000 line code program is really difficult, frustating and also takes a lot of time in terms of releasing a project or adding new updates to that project. To avoid that (or maybe, to invest better our time doing more effectively code) we need to think how we can solve an specific problem in less time possible according to the number of statements that conforms a task, not the time that statement needs to be done. + +To measure it, we as programmers use something we call Time Complexity. And yea, the less tasks needed to be done, better. To understand it, I'll explain very simple how each complexity works with it's respective snipet code. It should be noted that I'll put C code. + +Check this out (resuming all complexities and what the O means): +- 0(1): Constant (Very Good) +- O(Log(N)): Logaritmic (Very Good) +- O(N): Linear (Good) +- O(Nlog(N)): Linearithmic (Good) +- O(N^2): Quadratic (Not good) + +These are the most common ones according to the Big O Notation syntax. Notice the last word I put in each time complexity. To summarize it, simplifies the time of an algorithm with that complexity should take. But yea, I'll explain each one with an example. + +* * * + +### O(1) + +Refers an algorithm that doesn't need to loop or to iterate an object, which means to be constant. A constant object is an inmutable object (can't be modified), so if are outputing something or doing a conditional statement, remember that those objects once outputed can't be modified unless u modify ur code. + +Check this simply code: + +```c +// By Yayo +#include + +int main(int argc, char* argv[]) { + int number = 4; + + if (number < 5) { + printf("This number is lower than 5\n"); + } else { + printf("This number is higher than 5\n"); + } + + return 0; +} +``` +When I run this, it should showed me something like this: + +``` +$ gcc some_code.c -o main && ./main +This number is lower than 5 +$ +``` + +Very simple. It's just a conditional statement outputing something, but to put u in reference, there's no a loop conditional inside a block of code we need to execute, so it takes less than 14 nanoseconds to output a string object. If u don't understand what are the main function's args, check this [doc](https://linuxhint.com/argc-argv-cpp/), it's the same for C and C++. + + +### O(Log(N)) + +This time complexity is often confused with the O(1) runtime complexity, but it's not as close as you think, because in this complexity, a programmer is are aware of how much times he needs to iterate an object. This means that it's not necessary to iterate the whole object as a linear algorithm (more about this below), but it's better than that: + +Imagine you have an array of 10 elements and you wanna find one of these elements but u don't know in which index it is. What we can do? + +First you need to understand that this array was sorted previously, so you don't have to sort it at the time you are looking for that element. And.. also, also u wanna find this element in the less time posible, 'cause you don't wanna wait for the next day at the time u read 34 books, played CSGO 3 hrs and u ate 4 times per hr lmao. + +Ya being serious, you don't need to iterate the whole array, so for this, I'ma explain y'all what is the Binary Search algorithm, which is a perfect example to explain this complexity. + +The main idea for this algorithm is to guess this item by dividing the given array into 3 parts. Why 3 parts? Imagine that a user chose 2 incorrect items, one is lower and the other one is higher from the number you chose at the beginning. By default, we can trash the array's part that's lower and the part that's higher. So for example, my item is 45, the incorrect items are 25 and 47, and the array's range is between 0 and 50, we need to trash the range 0-25 and 47-50. Therefore, the left range is between 26 and 46. At this time we can iterate the whole array asking this question to the program whether the item chosen is the range given or not and dividing it if it's necessary. + +I'ma code this recursively because at the time we are calling the function in each statement, we are trimming the array. In the worst case, we'll trimmer the whole array until we find the item. + +```c +// By Yayo +#include + +int binary_search(int array[], int len, int piv, int search) { + if (piv == -1 || piv == len + 1) { + printf("\nNumber out of range\n"); + return 1; + } else { + if (search >= array[piv]) { + return binary_search(array, len, piv - 1, search); + } + } + return binary_search(array, len, piv + 1, search); +} + +``` + +There's no main function to call the ```binary_search(int array[], int len, int piv, int search)``` method because I wanna emphasize in the algorithm snippet code. I called the method each time we trimmer the array, as I mentioned before. That's why, I add and substract the pivot just one element in each call. If the item is not located in the array, the program ends. + +Also, as I said, I used recursion but we can also iterate the whole array using loops. You can code it by yourself, but this code could represent how the program iterates and divides the array to find the item. But I'ma use maths instead. + +Let's say we divide an 10 element array into 2 parts, by choosing a pivot (Literally what I explained before). We divide it and then, we choose the item array[6], which is the item 30 and we wanna locate where it is. + +Given the array {3, 4, 10, 23, 25, 29, 30, 56, 77, 90}, check this: + +``` + 0 1 2 3 4 5 6 7 8 9 +{3, 4, 10, 23, 25, 29, 30, 56, 77, 90} + ^^ +Item chosed: 25 == 30? False -> 10 * (1 / 2) = 5 + + 5 6 7 8 9 +{29, 30, 56, 77, 90} + ^^ +Item chosed: 77 == 30? False -> 5 * (1 / 2) = 2.5 + + 5 6 7 +{29, 30, 56} + ^^ +Item chosed: 30 == 30? True -> 2.5 * (1 / 2) = 1.25 + + 6 +{30} = [6] +``` + +This is the "GUI" explanation of the code. Notice the end value doesn't end in 1. Why? diff --git a/_posts/2023-02-14-the-fizzbuzz-challenge-in-javascript.md b/_posts/2023-02-14-the-fizzbuzz-challenge-in-javascript.md new file mode 100644 index 000000000..55233f95a --- /dev/null +++ b/_posts/2023-02-14-the-fizzbuzz-challenge-in-javascript.md @@ -0,0 +1,243 @@ +--- +layout: post +--- + + +When we talk about a problem that's very common in an interview, we assume we already know how +to code and solve it. We can discuss some of the most popular problems, like the fibonacci algorithm, plenty of sorting algorithms, etc. and that's a true thing. + +We surely don't know how many problems are but, I'll explain u (by my words) one problem very popular (and often is memed by the community) that's in the 98% of the times, it'll be a question you need to solve by hand in less than 5 min (well, that's the most accurate number tho). This problem's called: The FizzBuzz. + +This article will be relately short, but I'll explain the problem and how to solve it in JavaScript. I'll start saying that this problem is very simple, but it's a good way to test your logic and your ability to code it in the less time possible. + +I'll not use any GUI tools to explain the algorithm, since it's very easy. The thing is that there's lots of ways to solve this problem and each programmer has his own way to solve it according to his logic, so there's no "the best way" to solve it or, a unique rule to follow and if u don't follow it, u are disordering the time-space continuum and the universe will collapse. lol + +Nah, just kidding (or not). Well, let's start. First of all, what is the FizzBuzz problem? This problem consists in a simple algorithm that prints the numbers from 1 to 100, but if the number is divisible by 3, it outputs "Fizz" instead of the number, if the number is divisible by 5, it outputs "Buzz" instead of the number and if the number is divisible by 3 and 5 (or 15), it outputs "FizzBuzz" instead of the number. + +Seems easy, right? Well, as I said, there's lots of ways to solve this problem, but I'll code it in some ways I thought of. Check this out: + +```js +// By Yayo +const fizzbuzz = (n) => { + for (let i = 1; i <= n; i++) { + if (i % 15 == 0) console.log('FizzBuzz'); + else if (i % 3 == 0) console.log('Fizz'); + else if (i % 5 == 0) console.log('Buzz'); + else console.log(i); + } +} + +``` + +If you already know JavaScript, you are just noticing I did an if sentence. To reduce lines, I didn't use curly brackets (yea, Python memories lol). But you can use them: + +```js +// By Yayo +const fizzbuzz = (n) => { + for (let i = 1; i <= n; i++) { + if (i % 15 == 0) { + console.log('FizzBuzz'); + } else if (i % 3 == 0) { + console.log('Fizz'); + } else if (i % 5 == 0) { + console.log('Buzz'); + } else { + console.log(i); + } + } +} + +``` + +Let's see what happens if we call this function with the number 100 (well yea, it's 1 to 100). + +``` +$ node some_code.js +1 +2 +Fizz +4 +Buzz +Fizz +7 +8 +Fizz +Buzz +11 +Fizz +13 +14 +FizzBuzz +16 +17 +Fizz +19 +Buzz +Fizz +22 +23 +Fizz +Buzz +26 +Fizz +28 +29 +FizzBuzz +31 +32 +Fizz +34 +Buzz +Fizz +37 +38 +Fizz +Buzz +41 +Fizz +43 +44 +FizzBuzz +46 +47 +Fizz +49 +Buzz +Fizz +52 +53 +Fizz +Buzz +56 +Fizz +58 +59 +FizzBuzz +61 +62 +Fizz +64 +Buzz +Fizz +67 +68 +Fizz +Buzz +71 +Fizz +73 +74 +FizzBuzz +76 +77 +Fizz +79 +Buzz +Fizz +82 +83 +Fizz +Buzz +86 +Fizz +88 +89 +FizzBuzz +91 +92 +Fizz +94 +Buzz +Fizz +97 +98 +Fizz +Buzz +$ +``` + +Damn well, that's a lot of outputed lines. What we can do in this case? Let's try creating an array which all the output will be stored in it and then, we'll print the list. + +```js +// By Yayo +const fizzbuzz = (n) => { + let array = []; + + for (let i = 1; i <= n; i++) { + if (i % 15 == 0) array.push('FizzBuzz'); + else if (i % 3 == 0) array.push('Fizz'); + else if (i % 5 == 0) array.push('Buzz'); + else array.push(i); + } + return array; +} + +console.log(fizzbuzz(100)); +``` + +Now, let's see what happens if we run this code. + +``` +$ node some_code.js +[ + 1, 2, 'Fizz', 4, 'Buzz', 'Fizz', + 7, 8, 'Fizz', 'Buzz', 11, 'Fizz', + 13, 14, 'FizzBuzz', 16, 17, 'Fizz', + 19, 'Buzz', 'Fizz', 22, 23, 'Fizz', + 'Buzz', 26, 'Fizz', 28, 29, 'FizzBuzz', + 31, 32, 'Fizz', 34, 'Buzz', 'Fizz', + 37, 38, 'Fizz', 'Buzz', 41, 'Fizz', + 43, 44, 'FizzBuzz', 46, 47, 'Fizz', + 49, 'Buzz', 'Fizz', 52, 53, 'Fizz', + 'Buzz', 56, 'Fizz', 58, 59, 'FizzBuzz', + 61, 62, 'Fizz', 64, 'Buzz', 'Fizz', + 67, 68, 'Fizz', 'Buzz', 71, 'Fizz', + 73, 74, 'FizzBuzz', 76, 77, 'Fizz', + 79, 'Buzz', 'Fizz', 82, 83, 'Fizz', + 'Buzz', 86, 'Fizz', 88, 89, 'FizzBuzz', + 91, 92, 'Fizz', 94, 'Buzz', 'Fizz', + 97, 98, 'Fizz', 'Buzz' +] +$ +``` +Much better eh? This array shows every value I push into it, as you see. Also, it's more readable for a user to check all the code's output, because if output every value in a single new line, it would be a mess, but also for a user could be boring to check every value by scrolling the terminal. + +You need to scroll it anyways lol, but it's more readable, clearner and easier to check and evaluate the outuput. You might use the switch sentence also to create conditional statements. In this case, for the fizzbuzz challenge. + +```js +// By Yayo +const fizzbuzz = (n) => { + let array = []; + + for (let i = 1; i <= n; i++) { + switch (true) { + case i % 15 === 0: array.push('FizzBuzz'); break; + case i % 3 === 0: array.push('Fizz'); break; + case i % 5 === 0: array.push('Buzz'); break; + default: array.push(i); + } + } + return array; +} +``` +The output is the same as the previous code I showed you. You can try it by yourself if you want!, also to see the difference between the switch sentence and the if sentence, but also to think about the best way to solve this problem for yourself. + +Now, I'ma explain you some JS basics. To declare a function, you might use the function keyword, like this: + +```js +function some_function() { + // Code here +} +``` +Like in other languages, there's a key reserved word to declare a function, but in JS, you can also use the arrow function, like this: + +```js +const some_function = () => { + // Code here +} +``` +The arrow function is a new way to declare a function in JS, and it's more used than the function keyword. The ```const``` keyword is used to declare a constant. This constant is only read-only, so you can't change it's value. Also you can't redeclare it with another value, so because of this, the ```const``` form will only be read-only what's inside the function's code. + +If you want to declare a variable, you might use the ```let``` keyword. This variable can be changed, so you can redeclare it with another value. I used it to declared the ```array``` variable, because I wanted to change it's value (pushing new items), so I used the ```let``` keyword. + +If you wanna learn more about JS, I recommend you to check the [MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/JavaScript) or the JavaScript [documentation](https://devdocs.io/javascript/). Thanks for reading this, and I hope you learned something new. :) diff --git a/_posts/2023-05-17-keypwn.md b/_posts/2023-05-17-keypwn.md new file mode 100644 index 000000000..8bdf6f740 --- /dev/null +++ b/_posts/2023-05-17-keypwn.md @@ -0,0 +1,6 @@ +--- +layout: post +author: Its-Yayo +--- + +Updates soon... diff --git a/_posts/2023-06-19-ramskit.md b/_posts/2023-06-19-ramskit.md new file mode 100644 index 000000000..8bdf6f740 --- /dev/null +++ b/_posts/2023-06-19-ramskit.md @@ -0,0 +1,6 @@ +--- +layout: post +author: Its-Yayo +--- + +Updates soon... diff --git a/about.md b/about.md index dafcbe23f..b9802239a 100644 --- a/about.md +++ b/about.md @@ -3,6 +3,69 @@ layout: post title: About --- -This is an example page! +Yoooo Folks! I'm Luis De León, best known as Yayo or Elyayoveloz (or Celfeercho too). This is my welcome to my porfolio and feel free to explore it. -Actually, it has the same layout of a post... \ No newline at end of file +I'm from Mexico and I'm currently studying in Tecnológico de Monterrey CEM (Campus Estado de México) + +I have lots of hobbies, here's a few of 'em: +- Bowling (Firstly it was more for chill, but now I'm taking it more seriously. I use 2-handed style and my current max score is 136, updated to Jan 13 2023) +- Chess (I love playing chess, now I'm playing it more seriously to dominate it. I often play a classical 30+0 but sometimes I play blitz 10+0 and 10+3) +- Drawing and writing +- I read a lot (Hacking and programming books in a mod, growing and motivational books in an another mod. I like fantasy and historical books too) +- Often I play FPS games (once I played tryharded and got into some tournaments lol). When I have enough time, I play COD Mobile, PUBG Mobile, Critical Ops and CSGO. +- I can compose some basic Heavy Metal riffs (Fav bands: Iron Maiden, Metallica, Anthrax, Slayer, Overkill, DRI, Black Sabbath, Deep Purple, KISS, Dokken, Cinderella, Stratovarius, Rhapsody, +Skull Fist...) +- I like to assemble things like legos or bricks. +- Learn new languages (Currently I speak spanish, english, 2/3 french and some basic italian and german) +- I love cars and motorsport, so when I was little I used to play with scale cars. Now, I collect 'em. + +I'm adding also that, if there's any person who wants some help due of difficult times, here's a user :). I know we all pass through difficult times, but only a few people teach me that those +times are to make us more strong than before, and those people are only a part of your life motivating you to help others, I love 'em a lot. + +### Anyways, I'm studying Computer Engineering, so I love developing things. However, this is what I'm studying and developing right now. + +And I'd say that I discovered developing when I was trying to code a simple BASIC C64 Program on an emulator. That was fantastic to me, because I discovered why computers are so populars since +the 70s. I remember that I coded something like: +``` +10 LET X = 30 +20 LET Y = 40 +30 PRINT X + Y +RUN +``` +For me that was fantastic and obviously, I outputed my first "Hello World" tho. I don't care if I'm 20 yo, that's awesome!. Along my career, I discovered new things I can do with programming +and eventually I was more deeper in this area. I loved it. I started with CPUs, RAM, ROM, EEPROM memories, etc. Then I moved on into Python, C/C++, some JS stuff, and nowadays I'm still building +my knowledge. Here's what I'm studying right now: +- Backend Developing, low and high-level programming +- Data Structures and Algorithms +- Reforce Python, C/C++, JS +- Advanced Algorithms +- Async Programming (Mostly on Python) +- Quantum Computing (Tests on Python for now with qiskit) +- Still not advanced but PHP, Perl and Rust +- Clouding Environment (IaaS, SaaS, PaaS) +- Blockchain and Crypto +- Stocks and investments + +I've been on some AWS events, both virtual and presencial. Some of 'em include AWS Summit Mexico City 2022, AWS Cloud Practioner... and also, I've some experience with AWS S3, AWS GuardDuty, Amazon EventBridge (For event-oriented Programming) and AWS Cloud9. I'm interested also to include Azure, Google Cloud and IBM Cloud (For Quantum researches) to store my projects. I seriously believe that AI, Clouding Enviroment, Electric infraestructure and specially Quantum Computing will be the main clue of the future. + +For instance, with this knowledge I'm moving into something bigger, which is the Security. An ethical hacker has the responsability to detect those explots made because of bugs or code errors, +patching 'em. I like CTF games, that's where I can develop and think more patiently to solve a problem with logic and calm. Still in process to win some ones. Because of this, these topics are fundamental into my career, what I'm still studying: +- Networking Environments (OSI Model, WAN, MAN...) +- OSCP, OSCE, eCPPT, eCPPTv2, CEH, LPT, GPEN (In every one I'll get a certificate) +- Pentesting, pivoting and tunneling +- Active and transversal Directory +- Bug Bounty +- SET (Social Engineering Toolkit) +- Get deeper with some collabs with OWASP (Open Web Application Security Project) +- Privilage Escalation +- Reverse Shell (Linux/Windows) +- Reverse Engineering (Most popular tool is BurpSuite PortSwigger) +- File transfers +- 80, 443 (Burp Response, Apache Exploiting, htaccess and htpasswd, HTTP requests, Parameter fuzzing, Burp Spider) +- SQL Injection +- Port scanning and listening with nmap and ncat +- Cryptography +- Buffer Overflows + +And there's more!, but now, my lab has 3 VM's with Windows XP (no encrypt), 7 (encrypt) and 10 (encrypt) and 1 VM running Kali Linux with GNOME 42.0. (Updated to Dec 25 2022). Also, I store my VM'S +in VMware Workstation Pro and VMware Player for fast tests. diff --git a/contact.md b/contact.md new file mode 100644 index 000000000..10f41364e --- /dev/null +++ b/contact.md @@ -0,0 +1,18 @@ +--- +layout: post +title: Contact +--- + +## Follow me +- [My Twitter for geek stuff](https://twitter.com/elyayoveloz) +- [My Twitter for motivation support](https://twitter.com/celfeercho) +- [My TY Channel](https://www.youtube.com/channel/UC_bHbAMGcm1yLguVWJNUyLg/featured) +- [My LinkedIn Profile](https://www.linkedin.com/in/luis-de-le%C3%B3n-a2b3bb245/) +- [My Reddit](https://www.reddit.com/user/Elyayoveloz) +- [My Telegram](https://t.me/Elyayoveloz/) + +## Support my work +- [My Github](https://www.github.com/Its-Yayo) + +## Pls buy me a coffee haha +- [My buymeacoffee page](https://www.buymeacoffee.com/elyayoveloz) diff --git a/logo.png b/logo.png index a3587de61..24c5e1448 100644 Binary files a/logo.png and b/logo.png differ