From c388ebdbd6a1e3c7528a48a2a8f6103e0d343e8b Mon Sep 17 00:00:00 2001 From: g1n Date: Tue, 14 Dec 2021 13:59:39 +0000 Subject: [PATCH] Moved GRU Devlog to GRU's own page --- blog/.backup.tar.gz | Bin 0 -> 34889 bytes blog/.config | 41 + blog/.yesterday.tar.gz | Bin 0 -> 34889 bytes blog/all_posts.html | 61 + blog/all_tags.html | 62 + blog/bb-backup.sh | 1174 +++++++++++++++++ blog/bb.sh | 1122 ++++++++++++++++ blog/blog.css | 29 + blog/feed.rss | 629 +++++++++ ...urces-published-and-add-wc-to-grutils.html | 60 + ...sources-published-and-add-wc-to-grutils.md | 22 + ...--orsh-now-like-proper-shell-and-gasm.html | 66 + ...0---orsh-now-like-proper-shell-and-gasm.md | 31 + ...g-11---yemu-and-channel-on-liberachat.html | 53 + ...log-11---yemu-and-channel-on-liberachat.md | 18 + ...3---ocpu-thoughts-and-some-elecronics.html | 50 + ...-13---ocpu-thoughts-and-some-elecronics.md | 15 + blog/gru-devlog-13---yemu-gasm-and-ocpu.html | 52 + blog/gru-devlog-13---yemu-gasm-and-ocpu.md | 17 + blog/gru-devlog-14---ocpu-and-yemu.html | 52 + blog/gru-devlog-14---ocpu-and-yemu.md | 17 + ...ru-devlog-15---ocpu-yemu-and-licenses.html | 46 + .../gru-devlog-15---ocpu-yemu-and-licenses.md | 11 + blog/gru-devlog-16---ormp-and-egg.html | 50 + blog/gru-devlog-16---ormp-and-egg.md | 15 + ...evlog-17-18---coreutils-egg-and-ideas.html | 52 + ...-devlog-17-18---coreutils-egg-and-ideas.md | 17 + .../gru-devlog-19---gic-and-several-libs.html | 61 + blog/gru-devlog-19---gic-and-several-libs.md | 26 + blog/gru-devlog-2---orion.html | 52 + blog/gru-devlog-2---orion.md | 14 + blog/gru-devlog-20---olibc.html | 50 + blog/gru-devlog-20---olibc.md | 17 + ...-and-dreams-about-gru-software-future.html | 81 ++ ...on-and-dreams-about-gru-software-future.md | 40 + ...and-organizations-on-tildegitcodeberg.html | 59 + ...u-and-organizations-on-tildegitcodeberg.md | 23 + ...son-coreutils-and-gxt-tui-text-editor.html | 59 + ...erson-coreutils-and-gxt-tui-text-editor.md | 24 + ...d-gxt-and-interrupts-working-in-orion.html | 50 + ...hed-gxt-and-interrupts-working-in-orion.md | 15 + ...yboard-paging-and-wip-initrd-in-orion.html | 51 + ...keyboard-paging-and-wip-initrd-in-orion.md | 16 + ...-devlog-8---orsh-and-published-initrd.html | 48 + ...ru-devlog-8---orsh-and-published-initrd.md | 13 + ...ion-bootloader-gru-xmpp-room-and-logo.html | 56 + ...orion-bootloader-gru-xmpp-room-and-logo.md | 21 + ...ek-0---grsh-grutils-and-start-of-gros.html | 53 + ...week-0---grsh-grutils-and-start-of-gros.md | 15 + blog/index.html | 324 +++++ blog/main.css | 33 + blog/tag_contribution.html | 57 + blog/tag_coreutils.html | 86 ++ blog/tag_dreams.html | 79 ++ blog/tag_egg.html | 77 ++ blog/tag_electonics.html | 48 + blog/tag_gasm.html | 129 ++ blog/tag_gic.html | 59 + blog/tag_girclib.html | 59 + blog/tag_gros.html | 88 ++ blog/tag_grsh.html | 87 ++ blog/tag_gru.html | 662 ++++++++++ blog/tag_grutils.html | 88 ++ blog/tag_gxt.html | 84 ++ blog/tag_hexutils.html | 57 + blog/tag_irc.html | 48 + blog/tag_jitsi.html | 54 + blog/tag_libera.html | 51 + blog/tag_liblinux.html | 86 ++ blog/tag_libs.html | 59 + blog/tag_license.html | 44 + blog/tag_lobste.rs.html | 64 + blog/tag_lolcpu.html | 48 + blog/tag_meeting.html | 64 + blog/tag_ocpu.html | 129 ++ blog/tag_olibc.html | 86 ++ blog/tag_orcc.html | 57 + blog/tag_org-mode.html | 94 ++ blog/tag_org-roam.html | 51 + blog/tag_orion.html | 221 ++++ blog/tag_ormp.html | 48 + blog/tag_orsh.html | 122 ++ blog/tag_tilde.news.html | 64 + blog/tag_tilde.tel.html | 54 + blog/tag_transistors.html | 48 + blog/tag_webpage.html | 57 + blog/tag_xmpp.html | 81 ++ blog/tag_yemu.html | 186 +++ 88 files changed, 8439 insertions(+) create mode 100644 blog/.backup.tar.gz create mode 100755 blog/.config create mode 100644 blog/.yesterday.tar.gz create mode 100644 blog/all_posts.html create mode 100644 blog/all_tags.html create mode 100755 blog/bb-backup.sh create mode 100755 blog/bb.sh create mode 100644 blog/blog.css create mode 100644 blog/feed.rss create mode 100644 blog/gru-devlog-1---gros-sources-published-and-add-wc-to-grutils.html create mode 100644 blog/gru-devlog-1---gros-sources-published-and-add-wc-to-grutils.md create mode 100644 blog/gru-devlog-10---orsh-now-like-proper-shell-and-gasm.html create mode 100644 blog/gru-devlog-10---orsh-now-like-proper-shell-and-gasm.md create mode 100644 blog/gru-devlog-11---yemu-and-channel-on-liberachat.html create mode 100644 blog/gru-devlog-11---yemu-and-channel-on-liberachat.md create mode 100644 blog/gru-devlog-13---ocpu-thoughts-and-some-elecronics.html create mode 100644 blog/gru-devlog-13---ocpu-thoughts-and-some-elecronics.md create mode 100644 blog/gru-devlog-13---yemu-gasm-and-ocpu.html create mode 100644 blog/gru-devlog-13---yemu-gasm-and-ocpu.md create mode 100644 blog/gru-devlog-14---ocpu-and-yemu.html create mode 100644 blog/gru-devlog-14---ocpu-and-yemu.md create mode 100644 blog/gru-devlog-15---ocpu-yemu-and-licenses.html create mode 100644 blog/gru-devlog-15---ocpu-yemu-and-licenses.md create mode 100644 blog/gru-devlog-16---ormp-and-egg.html create mode 100644 blog/gru-devlog-16---ormp-and-egg.md create mode 100644 blog/gru-devlog-17-18---coreutils-egg-and-ideas.html create mode 100644 blog/gru-devlog-17-18---coreutils-egg-and-ideas.md create mode 100644 blog/gru-devlog-19---gic-and-several-libs.html create mode 100644 blog/gru-devlog-19---gic-and-several-libs.md create mode 100644 blog/gru-devlog-2---orion.html create mode 100644 blog/gru-devlog-2---orion.md create mode 100644 blog/gru-devlog-20---olibc.html create mode 100644 blog/gru-devlog-20---olibc.md create mode 100644 blog/gru-devlog-3---orion-and-dreams-about-gru-software-future.html create mode 100644 blog/gru-devlog-3---orion-and-dreams-about-gru-software-future.md create mode 100644 blog/gru-devlog-4---more-projects-started-webpage-for-gru-and-organizations-on-tildegitcodeberg.html create mode 100644 blog/gru-devlog-4---more-projects-started-webpage-for-gru-and-organizations-on-tildegitcodeberg.md create mode 100644 blog/gru-devlog-5---first-contribution-from-other-person-coreutils-and-gxt-tui-text-editor.html create mode 100644 blog/gru-devlog-5---first-contribution-from-other-person-coreutils-and-gxt-tui-text-editor.md create mode 100644 blog/gru-devlog-6---yemu-published-gxt-and-interrupts-working-in-orion.html create mode 100644 blog/gru-devlog-6---yemu-published-gxt-and-interrupts-working-in-orion.md create mode 100644 blog/gru-devlog-7---keyboard-paging-and-wip-initrd-in-orion.html create mode 100644 blog/gru-devlog-7---keyboard-paging-and-wip-initrd-in-orion.md create mode 100644 blog/gru-devlog-8---orsh-and-published-initrd.html create mode 100644 blog/gru-devlog-8---orsh-and-published-initrd.md create mode 100644 blog/gru-devlog-9---orsh-orion-bootloader-gru-xmpp-room-and-logo.html create mode 100644 blog/gru-devlog-9---orsh-orion-bootloader-gru-xmpp-room-and-logo.md create mode 100644 blog/gru-devlog-week-0---grsh-grutils-and-start-of-gros.html create mode 100644 blog/gru-devlog-week-0---grsh-grutils-and-start-of-gros.md create mode 100644 blog/index.html create mode 100644 blog/main.css create mode 100644 blog/tag_contribution.html create mode 100644 blog/tag_coreutils.html create mode 100644 blog/tag_dreams.html create mode 100644 blog/tag_egg.html create mode 100644 blog/tag_electonics.html create mode 100644 blog/tag_gasm.html create mode 100644 blog/tag_gic.html create mode 100644 blog/tag_girclib.html create mode 100644 blog/tag_gros.html create mode 100644 blog/tag_grsh.html create mode 100644 blog/tag_gru.html create mode 100644 blog/tag_grutils.html create mode 100644 blog/tag_gxt.html create mode 100644 blog/tag_hexutils.html create mode 100644 blog/tag_irc.html create mode 100644 blog/tag_jitsi.html create mode 100644 blog/tag_libera.html create mode 100644 blog/tag_liblinux.html create mode 100644 blog/tag_libs.html create mode 100644 blog/tag_license.html create mode 100644 blog/tag_lobste.rs.html create mode 100644 blog/tag_lolcpu.html create mode 100644 blog/tag_meeting.html create mode 100644 blog/tag_ocpu.html create mode 100644 blog/tag_olibc.html create mode 100644 blog/tag_orcc.html create mode 100644 blog/tag_org-mode.html create mode 100644 blog/tag_org-roam.html create mode 100644 blog/tag_orion.html create mode 100644 blog/tag_ormp.html create mode 100644 blog/tag_orsh.html create mode 100644 blog/tag_tilde.news.html create mode 100644 blog/tag_tilde.tel.html create mode 100644 blog/tag_transistors.html create mode 100644 blog/tag_webpage.html create mode 100644 blog/tag_xmpp.html create mode 100644 blog/tag_yemu.html diff --git a/blog/.backup.tar.gz b/blog/.backup.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..d672844f1cef10ec2edbf5b88865be800d065cb7 GIT binary patch literal 34889 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 literal 0 HcmV?d00001 diff --git a/blog/.config b/blog/.config new file mode 100755 index 0000000..24e04ba --- /dev/null +++ b/blog/.config @@ -0,0 +1,41 @@ +global_software_name="BashBlog" +global_software_version="2.9" + +# Blog title +global_title="GRU's blog" +# The typical subtitle for each blog +global_description="GRU's blog" +# The public base URL for this blog +global_url="https://gru.codeberg.page/blog" + +# Your name +global_author="G1n" +# You can use twitter or facebook or anything for global_author_url +#global_author_url="http://twitter.com/example" +# Your email +global_email="g1n@ttm.sh" + +# CC by-nc-nd is a good starting point, you can change this to "©" for Copyright +global_license="CC by-nc-nd" + +# If you have a Google Analytics ID (UA-XXXXX) and wish to use the standard +# embedding code, put it on global_analytics +# If you have custom analytics code (i.e. non-google) or want to use the Universal +# code, leave global_analytics empty and specify a global_analytics_file +#global_analytics="" +#global_analytics_file="" + +# Leave this empty (i.e. "") if you don't want to use feedburner, +# or change it to your own URL +global_feedburner="https://gru.codeberg.page/blog/feed.xml" + +# Change this to your username if you want to use twitter for comments +#global_twitter_username="" +# Set this to false for a Twitter button with share count. The cookieless version +# is just a link. +global_twitter_cookieless="true" +# Default search page, where tweets more than a week old are hidden +#global_twitter_search="twitter" + +# Change this to your disqus username to use disqus for comments +#global_disqus_username="" diff --git a/blog/.yesterday.tar.gz b/blog/.yesterday.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..279b319dcfdeddbfdb1987c5c8692fbde3b0809c GIT binary patch literal 34889 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 R;j@Pd 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 literal 0 HcmV?d00001 diff --git a/blog/all_posts.html b/blog/all_posts.html new file mode 100644 index 0000000..a2ce6fa --- /dev/null +++ b/blog/all_posts.html @@ -0,0 +1,61 @@ + + + + + + + +GRU's blog — all posts + +
+
+
+

GRU's blog

+
GRU's blog
+
+
+

all posts

+

December 2021

+ +

November 2021

+ +

October 2021

+ +

September 2021

+ +

August 2021

+ +

July 2021

+ + +
+ +
+ diff --git a/blog/all_tags.html b/blog/all_tags.html new file mode 100644 index 0000000..c346586 --- /dev/null +++ b/blog/all_tags.html @@ -0,0 +1,62 @@ + + + + + + + +GRU's blog — all tags + +
+
+
+

GRU's blog

+
GRU's blog
+
+
+

all tags

+ + +
+ +
+ diff --git a/blog/bb-backup.sh b/blog/bb-backup.sh new file mode 100755 index 0000000..e253d1f --- /dev/null +++ b/blog/bb-backup.sh @@ -0,0 +1,1174 @@ +#!/usr/bin/env bash + +# BashBlog, a simple blog system written in a single bash script +# (C) Carlos Fenollosa , 2011-2016 and contributors +# https://github.com/carlesfe/bashblog/contributors +# Check out README.md for more details + +# Global variables +# It is recommended to perform a 'rebuild' after changing any of this in the code + +# Config file. Any settings "key=value" written there will override the +# global_variables defaults. Useful to avoid editing bb.sh and having to deal +# with merges in VCS +global_config=".config" + +# This function will load all the variables defined here. They might be overridden +# by the 'global_config' file contents +global_variables() { + global_software_name="bashblog" + global_software_version="2.8" + + # Blog title + global_title="my tildelog" + # The typical subtitle for each blog + global_description="a blog about tildes" + # The public base URL for this blog + global_url="https://gru.codeberg.page/blog" + + # Your name + global_author="g1n" + # You can use twitter or facebook or anything for global_author_url + global_author_url="https://gru.codeberg.page/" + # Your email + global_email="g1n@ttm.sh" + + # CC by-nc-nd is a good starting point, you can change this to "©" for Copyright + global_license="CC by-nc-nd" + + + # Leave this empty (i.e. "") if you don't want to use feedburner, + # or change it to your own URL + global_feedburner="" + + # Change this to your username if you want to use twitter for comments + global_twitter_username="" + # Set this to false for a Twitter button with share count. The cookieless version + # is just a link. + global_twitter_cookieless="true" + # Default search page, where tweets more than a week old are hidden + global_twitter_search="twitter" + + # Blog generated files + # index page of blog (it is usually good to use "index.html" here) + index_file="index.html" + number_of_index_articles="10" + # global archive + archive_index="all_posts.html" + tags_index="all_tags.html" + + # ignore gophermap file + gophermap="gophermap" + + # ignore gemini generation script and gemini index + gemini_index="index.gmi" + + # Non blogpost files. Bashblog will ignore these. Useful for static pages and custom content + # Add them as a bash array, e.g. non_blogpost_files=("news.html" "test.html") + non_blogpost_files=() + + # feed file (rss in this case) + blog_feed="feed.rss" + number_of_feed_articles="50" + # "cut" blog entry when putting it to index page. Leave blank for full articles in front page + # i.e. include only up to first '
', or '----' in markdown + cut_do="cut" + # When cutting, cut also tags? If "no", tags will appear in index page for cut articles + cut_tags="yes" + # Regexp matching the HTML line where to do the cut + # note that slash is regexp separator so you need to prepend it with backslash + cut_line='
' + # save markdown file when posting with "bb post -m". Leave blank to discard it. + save_markdown="yes" + # prefix for tags/categories files + # please make sure that no other html file starts with this prefix + prefix_tags="tag_" + # personalized header and footer (only if you know what you're doing) + # DO NOT name them .header.html, .footer.html or they will be overwritten + # leave blank to generate them, recommended + header_file="" + footer_file="" + # extra content to add just after we open the tag + # and before the actual blog content + body_begin_file="" + # extra content to add just before we cloese ) + body_end_file="" + # CSS files to include on every page, f.ex. css_include=('main.css' 'blog.css') + # leave empty to use generated + css_include=() + # HTML files to exclude from index, f.ex. post_exclude=('imprint.html 'aboutme.html') + html_exclude=() + + # Localization and i18n + # "Comments?" (used in twitter link after every post) + template_comments="comments?" + # "Read more..." (link under cut article on index page) + template_read_more="read more..." + # "View more posts" (used on bottom of index page as link to archive) + template_archive="archive" + # "All posts" (title of archive page) + template_archive_title="all posts" + # "All tags" + template_tags_title="all tags" + # "posts" (on "All tags" page, text at the end of each tag line, like "2. Music - 15 posts") + template_tags_posts="posts" + template_tags_posts_2_4="posts" # Some slavic languages use a different plural form for 2-4 items + template_tags_posts_singular="post" + # "Posts tagged" (text on a title of a page with index of one tag, like "My Blog - Posts tagged "Music"") + template_tag_title="posts tagged" + # "Tags:" (beginning of line in HTML file with list of all tags for this article) + template_tags_line_header="tags:" + # "Back to the index page" (used on archive page, it is link to blog index) + template_archive_index_page="back home" + # "Subscribe" (used on bottom of index page, it is link to RSS feed) + template_subscribe="rss" + # "Subscribe to this page..." (used as text for browser feed button that is embedded to html) + template_subscribe_browser_button="subscribe to this page..." + # "Tweet" (used as twitter text button for posting to twitter) + template_twitter_button="tweet" + template_twitter_comment="<type your comment here but please leave the URL so that other people can follow the comments>" + + # The locale to use for the dates displayed on screen + date_format="%B %d, %Y" + date_locale="C" + date_inpost="bashblog_timestamp" + # Don't change these dates + date_format_full="%a, %d %b %Y %H:%M:%S %z" + date_format_timestamp="%Y%m%d%H%M.%S" + date_allposts_header="%B %Y" + + # Perform the post title -> filename conversion + # Experts only. You may need to tune the locales too + # Leave empty for no conversion, which is not recommended + # This default filter respects backwards compatibility + convert_filename="iconv -f utf-8 -t ascii//translit | sed 's/^-*//' | tr [:upper:] [:lower:] | tr ' ' '-' | tr -dc '[:alnum:]-'" + + # URL where you can view the post while it's being edited + # same as global_url by default + # You can change it to path on your computer, if you write posts locally + # before copying them to the server + preview_url="" + + # Markdown location. Trying to autodetect by default. + # The invocation must support the signature 'markdown_bin in.md > out.html' + [[ -f Markdown.pl ]] && markdown_bin=./Markdown.pl || markdown_bin=$(which Markdown.pl 2>/dev/null || which markdown 2>/dev/null) +} + +# Check for the validity of some variables +# DO NOT EDIT THIS FUNCTION unless you know what you're doing +global_variables_check() { + [[ $header_file == .header.html ]] && + echo "Please check your configuration. '.header.html' is not a valid value for the setting 'header_file'" && + exit + [[ $footer_file == .footer.html ]] && + echo "Please check your configuration. '.footer.html' is not a valid value for the setting 'footer_file'" && + exit +} + + +# Test if the markdown script is working correctly +test_markdown() { + [[ -n $markdown_bin ]] && + ( + [[ $("$markdown_bin" <<< $'line 1\n\nline 2') == $'

line 1

\n\n

line 2

' ]] || + [[ $("$markdown_bin" <<< $'line 1\n\nline 2') == $'

line 1

\n

line 2

' ]] + ) +} + + +# Parse a Markdown file into HTML and return the generated file +markdown() { + out=${1%.md}.html + while [[ -f $out ]]; do out=${out%.html}.$RANDOM.html; done + $markdown_bin "$1" > "$out" + echo "$out" +} + +# Reads HTML file from stdin, prints its content to stdout +# $1 where to start ("text" or "entry") +# $2 where to stop ("text" or "entry") +# $3 "cut" to remove text from
to +# note that this does not remove
line itself, +# so you can see if text was cut or not +get_html_file_content() { + awk "//, //{ + if (!// && !//) print + if (\"$3\" == \"cut\" && /$cut_line/){ + if (\"$2\" == \"text\") exit # no need to read further + while (getline > 0 && !//) { + if (\"$cut_tags\" == \"no\" && /^

$template_tags_line_header/ ) print + } + } + }" +} + +# Edit an existing, published .html file while keeping its original timestamp +# Please note that this function does not automatically republish anything, as +# it is usually called from 'main'. +# +# Note that it edits HTML file, even if you wrote the post as markdown originally +# Note that if you edit title then filename might also change +# +# $1 the file to edit +# $2 (optional) edit mode: +# "keep" to keep old filename +# "full" to edit full HTML, and not only text part (keeps old filename) +# leave empty for default behavior (edit only text part and change name) +edit() { + [[ ! -f "${1%%.*}.html" ]] && echo "Can't edit post "${1%%.*}.html", did you mean to use \"bb.sh post \"?" && exit -1 + # Original post timestamp + edit_timestamp=$(LC_ALL=C date -r "${1%%.*}.html" +"$date_format_full" ) + touch_timestamp=$(LC_ALL=C date -r "${1%%.*}.html" +"$date_format_timestamp") + tags_before=$(tags_in_post "${1%%.*}.html") + if [[ $2 == full ]]; then + $EDITOR "$1" + filename=$1 + else + if [[ ${1##*.} == md ]]; then + test_markdown + if (($? != 0)); then + echo "Markdown is not working, please edit HTML file directly." + exit + fi + # editing markdown file + $EDITOR "$1" + TMPFILE=$(markdown "$1") + filename=${1%%.*}.html + else + # Create the content file + TMPFILE=$(basename "$1").$RANDOM.html + # Title + get_post_title "$1" > "$TMPFILE" + # Post text with plaintext tags + get_html_file_content 'text' 'text' <"$1" | sed "/^

$template_tags_line_header/s|\\1|\\1|g" >> "$TMPFILE" + $EDITOR "$TMPFILE" + filename=$1 + fi + rm "$filename" + if [[ $2 == keep ]]; then + parse_file "$TMPFILE" "$edit_timestamp" "$filename" + else + parse_file "$TMPFILE" "$edit_timestamp" # this command sets $filename as the html processed file + [[ ${1##*.} == md ]] && mv "$1" "${filename%%.*}.md" 2>/dev/null + fi + rm "$TMPFILE" + fi + touch -t "$touch_timestamp" "$filename" + touch -t "$touch_timestamp" "$1" + chmod 644 "$filename" + echo "Posted $filename" + tags_after=$(tags_in_post "$filename") + relevant_tags=$(echo "$tags_before $tags_after" | tr ',' ' ' | tr ' ' '\n' | sort -u | tr '\n' ' ') + if [[ ! -z $relevant_tags ]]; then + relevant_posts="$(posts_with_tags $relevant_tags) $filename" + rebuild_tags "$relevant_posts" "$relevant_tags" + fi +} + +# Create a Twitter summary (twitter "card") for the post +# +# $1 the post file +# $2 the title +twitter_card() { + [[ -z $global_twitter_username ]] && return + + echo "" + echo "" + echo "" # Twitter truncates at 70 char + description=$(grep -v "^

$template_tags_line_header" "$1" | sed -e 's/<[^>]*>//g' | head -c 250 | tr '\n' ' ' | sed "s/\"/'/g") + echo "" + image=$(sed -n 's/.*" +} + +# Adds the code needed by the twitter button +# +# $1 the post URL +twitter() { + [[ -z $global_twitter_username ]] && return + + if [[ $global_twitter_cookieless == true ]]; then + id=$RANDOM + + search_engine="https://twitter.com/search?q=" + + echo "

$template_comments $template_twitter_button " + echo " 

" + return; + else + echo "

$template_comments "; + fi + + echo "$template_twitter_button " + echo "

" +} + +# Check if the file is a 'boilerplate' (i.e. not a post) +# The return values are designed to be used like this inside a loop: +# is_boilerplate_file && continue +# +# $1 the file +# +# Return 0 (bash return value 'true') if the input file is an index, feed, etc +# or 1 (bash return value 'false') if it is a blogpost +is_boilerplate_file() { + name=${1#./} + # First check against user-defined non-blogpost pages + for item in "${non_blogpost_files[@]}"; do + [[ "$name" == "$item" ]] && return 0 + done + + case $name in + ( "$index_file" | "$archive_index" | "$gophermap" | "$gemini_index" | "$tags_index" | "$footer_file" | "$header_file" | "$global_analytics_file" | "$prefix_tags"* ) + return 0 ;; + ( * ) # Check for excluded + for excl in "${html_exclude[@]}"; do + [[ $name == "$excl" ]] && return 0 + done + return 1 ;; + esac +} + +# Adds all the bells and whistles to format the html page +# Every blog post is marked with a and +# which is parsed afterwards in the other functions. There is also a marker +# to determine just the beginning of the text body of the post +# +# $1 a file with the body of the content +# $2 the output file +# $3 "yes" if we want to generate the index.html, +# "no" to insert new blog posts +# $4 title for the html header +# $5 original blog timestamp +# $6 post author +create_html_page() { + content=$1 + filename=$2 + index=$3 + title=$4 + timestamp=$5 + author=$6 + + # Create the actual blog post + # html, head + { + cat ".header.html" + echo "$title" + twitter_card "$content" "$title" + echo "" + # stuff to add before the actual body content + [[ -n $body_begin_file ]] && cat "$body_begin_file" + # body divs + echo '
' + echo '
' + # blog title + echo '
' + cat .title.html + echo '
' # title, header, headerholder + echo '
' + + file_url=${filename#./} + file_url=${file_url%.rebuilt} # Get the correct URL when rebuilding + # one blog entry + if [[ $index == no ]]; then + echo '' # marks the beginning of the whole post + echo "

" + # remove possible

's on the title because of markdown conversion + title=${title//

/} + title=${title//<\/p>/} + echo "$title" + echo '

' + if [[ -z $timestamp ]]; then + echo "" + else + echo "" + fi + if [[ -z $timestamp ]]; then + echo -n "
$(LC_ALL=$date_locale date +"$date_format")" + else + echo -n "
$(LC_ALL=$date_locale date +"$date_format" --date="$timestamp")" + fi + [[ -n $author ]] && echo -e " — \n$author" + echo "
" + echo '' # This marks the text body, after the title, date... + fi + cat "$content" # Actual content + if [[ $index == no ]]; then + echo -e '\n' + + twitter "$global_url/$file_url" + + echo '' # absolute end of the post + fi + + echo '
' # content + + # page footer + cat .footer.html + # close divs + echo '
' # divbody and divbodyholder + [[ -n $body_end_file ]] && cat "$body_end_file" + echo '' + } > "$filename" +} + +# Parse the plain text file into an html file +# +# $1 source file name +# $2 (optional) timestamp for the file +# $3 (optional) destination file name +# note that although timestamp is optional, something must be provided at its +# place if destination file name is provided, i.e: +# parse_file source.txt "" destination.html +parse_file() { + # Read for the title and check that the filename is ok + title="" + while IFS='' read -r line; do + if [[ -z $title ]]; then + # remove extra

and

added by markdown + title=$(echo "$line" | sed 's/<\/*p>//g') + if [[ -n $3 ]]; then + filename=$3 + else + filename=$title + [[ -n $convert_filename ]] && + filename=$(echo "$title" | eval "$convert_filename") + [[ -n $filename ]] || + filename=$RANDOM # don't allow empty filenames + + filename=$filename.html + + # Check for duplicate file names + while [[ -f $filename ]]; do + filename=${filename%.html}$RANDOM.html + done + fi + content=$filename.tmp + # Parse possible tags + elif [[ $line == "

$template_tags_line_header"* ]]; then + tags=$(echo "$line" | cut -d ":" -f 2- | sed -e 's/<\/p>//g' -e 's/^ *//' -e 's/ *$//' -e 's/, /,/g') + IFS=, read -r -a array <<< "$tags" + + echo -n "

$template_tags_line_header " >> "$content" + for item in "${array[@]}"; do + echo -n "$item, " + done | sed 's/, $/<\/p>/g' >> "$content" + else + echo "$line" >> "$content" + fi + done < "$1" + + # Create the actual html page + create_html_page "$content" "$filename" no "$title" "$2" "$global_author" + rm "$content" +} + +# Manages the creation of the text file and the parsing to html file +# also the drafts +write_entry() { + test_markdown && fmt=md || fmt=html + f=$2 + [[ $2 == -html ]] && fmt=html && f=$3 + + if [[ -n $f ]]; then + TMPFILE=$f + if [[ ! -f $TMPFILE ]]; then + echo "The file doesn't exist" + delete_includes + exit + fi + # guess format from TMPFILE + extension=${TMPFILE##*.} + [[ $extension == md || $extension == html ]] && fmt=$extension + # but let user override it (`bb.sh post -html file.md`) + [[ $2 == -html ]] && fmt=html + # Test if Markdown is working before re-posting a .md file + if [[ $extension == md ]]; then + test_markdown + if (($? != 0)); then + echo "Markdown is not working, please edit HTML file directly." + exit + fi + fi + else + TMPFILE=.entry-$RANDOM.$fmt + echo -e "Title on this line\n" >> "$TMPFILE" + + [[ $fmt == html ]] && cat << EOF >> "$TMPFILE" +

The rest of the text file is an html blog post. The process will continue as soon +as you exit your editor.

+ +

$template_tags_line_header keep-this-tag-format, tags-are-optional, example

+EOF + [[ $fmt == md ]] && cat << EOF >> "$TMPFILE" +The rest of the text file is a **Markdown** blog post. The process will continue +as soon as you exit your editor. + +$template_tags_line_header keep-this-tag-format, tags-are-optional, beware-with-underscores-in-markdown, example +EOF + fi + chmod 600 "$TMPFILE" + + post_status="E" + filename="" + while [[ $post_status != "p" && $post_status != "P" ]]; do + [[ -n $filename ]] && rm "$filename" # Delete the generated html file, if any + $EDITOR "$TMPFILE" + if [[ $fmt == md ]]; then + html_from_md=$(markdown "$TMPFILE") + parse_file "$html_from_md" + rm "$html_from_md" + else + parse_file "$TMPFILE" # this command sets $filename as the html processed file + fi + + chmod 644 "$filename" + [[ -n $preview_url ]] || preview_url=$global_url + echo "To preview the entry, open $preview_url/$filename in your browser" + + echo -n "[P]ost this entry, [E]dit again, [D]raft for later? (p/E/d) " + read -r post_status + if [[ $post_status == d || $post_status == D ]]; then + mkdir -p "drafts/" + chmod 700 "drafts/" + + title=$(head -n 1 $TMPFILE) + [[ -n $convert_filename ]] && title=$(echo "$title" | eval "$convert_filename") + [[ -n $title ]] || title=$RANDOM + + draft=drafts/$title.$fmt + mv "$TMPFILE" "$draft" + chmod 600 "$draft" + rm "$filename" + delete_includes + echo "Saved your draft as '$draft'" + exit + fi + done + + if [[ $fmt == md && -n $save_markdown ]]; then + mv "$TMPFILE" "${filename%%.*}.md" + else + rm "$TMPFILE" + fi + chmod 644 "$filename" + echo "Posted $filename" + relevant_tags=$(tags_in_post $filename) + if [[ -n $relevant_tags ]]; then + relevant_posts="$(posts_with_tags $relevant_tags) $filename" + rebuild_tags "$relevant_posts" "$relevant_tags" + fi +} + +# Create an index page with all the posts +all_posts() { + echo -n "Creating an index page with all the posts " + contentfile=$archive_index.$RANDOM + while [[ -f $contentfile ]]; do + contentfile=$archive_index.$RANDOM + done + + { + echo "

$template_archive_title

" + prev_month="" + while IFS='' read -r i; do + is_boilerplate_file "$i" && continue + echo -n "." 1>&3 + # Month headers + month=$(LC_ALL=$date_locale date -r "$i" +"$date_allposts_header") + if [[ $month != "$prev_month" ]]; then + [[ -n $prev_month ]] && echo "" # Don't close ul before first header + echo "

$month

" + echo "
    " + prev_month=$month + fi + # Title + title=$(get_post_title "$i") + echo -n "
  • $title —" + # Date + date=$(LC_ALL=$date_locale date -r "$i" +"$date_format") + echo " $date
  • " + done < <(ls -t ./*.html) + echo "" 1>&3 + echo "
" + echo "" + } 3>&1 >"$contentfile" + + create_html_page "$contentfile" "$archive_index.tmp" yes "$global_title — $template_archive_title" "$global_author" + mv "$archive_index.tmp" "$archive_index" + chmod 644 "$archive_index" + rm "$contentfile" +} + +# Create an index page with all the tags +all_tags() { + echo -n "Creating an index page with all the tags " + contentfile=$tags_index.$RANDOM + while [[ -f $contentfile ]]; do + contentfile=$tags_index.$RANDOM + done + + { + echo "

$template_tags_title

" + echo "
    " + for i in $prefix_tags*.html; do + [[ -f "$i" ]] || break + echo -n "." 1>&3 + nposts=$(grep -c "<\!-- text begin -->" "$i") + tagname=${i#"$prefix_tags"} + tagname=${tagname%.html} + case $nposts in + 1) word=$template_tags_posts_singular;; + 2|3|4) word=$template_tags_posts_2_4;; + *) word=$template_tags_posts;; + esac + echo "
  • $tagname — $nposts $word
  • " + done + echo "" 1>&3 + echo "
" + echo "" + } 3>&1 > "$contentfile" + + create_html_page "$contentfile" "$tags_index.tmp" yes "$global_title — $template_tags_title" "$global_author" + mv "$tags_index.tmp" "$tags_index" + chmod 644 "$tags_index" + rm "$contentfile" +} + +# Generate the index.html with the content of the latest posts +rebuild_index() { + echo -n "Rebuilding the index " + newindexfile=$index_file.$RANDOM + contentfile=$newindexfile.content + while [[ -f $newindexfile ]]; do + newindexfile=$index_file.$RANDOM + contentfile=$newindexfile.content + done + + # Create the content file + { + n=0 + while IFS='' read -r i; do + is_boilerplate_file "$i" && continue; + if ((n >= number_of_index_articles)); then break; fi + if [[ -n $cut_do ]]; then + get_html_file_content 'entry' 'entry' 'cut' <"$i" | awk "/$cut_line/ { print \"

$template_read_more

\" ; next } 1" + else + get_html_file_content 'entry' 'entry' <"$i" + fi + echo -n "." 1>&3 + n=$(( n + 1 )) + done < <(ls -t ./*.html) # sort by date, newest first + + feed=$blog_feed + if [[ -n $global_feedburner ]]; then feed=$global_feedburner; fi + echo "" + } 3>&1 >"$contentfile" + + echo "" + + create_html_page "$contentfile" "$newindexfile" yes "$global_title" "$global_author" + rm "$contentfile" + mv "$newindexfile" "$index_file" + chmod 644 "$index_file" +} + +# Finds all tags referenced in one post. +# Accepts either filename as first argument, or post content at stdin +# Prints one line with space-separated tags to stdout +tags_in_post() { + sed -n "/^

$template_tags_line_header/{s/^

$template_tags_line_header//;s/<[^>]*>//g;s/[ ,]\+/ /g;p;}" "$1" | tr ', ' ' ' +} + +# Finds all posts referenced in a number of tags. +# Arguments are tags +# Prints one line with space-separated tags to stdout +posts_with_tags() { + (($# < 1)) && return + set -- "${@/#/$prefix_tags}" + set -- "${@/%/.html}" + sed -n '/^

/{s/.*href="\([^"]*\)">.*/\1/;p;}' "$@" 2> /dev/null +} + +# Rebuilds tag_*.html files +# if no arguments given, rebuilds all of them +# if arguments given, they should have this format: +# "FILE1 [FILE2 [...]]" "TAG1 [TAG2 [...]]" +# where FILEn are files with posts which should be used for rebuilding tags, +# and TAGn are names of tags which should be rebuilt. +# example: +# rebuild_tags "one_post.html another_article.html" "example-tag another-tag" +# mind the quotes! +rebuild_tags() { + if (($# < 2)); then + # will process all files and tags + files=$(ls -t ./*.html) + all_tags=yes + else + # will process only given files and tags + files=$(printf '%s\n' $1 | sort -u) + files=$(ls -t $files) + tags=$2 + fi + echo -n "Rebuilding tag pages " + n=0 + if [[ -n $all_tags ]]; then + rm ./"$prefix_tags"*.html &> /dev/null + else + for i in $tags; do + rm "./$prefix_tags$i.html" &> /dev/null + done + fi + # First we will process all files and create temporal tag files + # with just the content of the posts + tmpfile=tmp.$RANDOM + while [[ -f $tmpfile ]]; do tmpfile=tmp.$RANDOM; done + while IFS='' read -r i; do + is_boilerplate_file "$i" && continue; + echo -n "." + if [[ -n $cut_do ]]; then + get_html_file_content 'entry' 'entry' 'cut' <"$i" | awk "/$cut_line/ { print \"

$template_read_more

\" ; next } 1" + else + get_html_file_content 'entry' 'entry' <"$i" + fi >"$tmpfile" + for tag in $(tags_in_post "$i"); do + if [[ -n $all_tags || " $tags " == *" $tag "* ]]; then + cat "$tmpfile" >> "$prefix_tags$tag".tmp.html + fi + done + done <<< "$files" + rm "$tmpfile" + # Now generate the tag files with headers, footers, etc + while IFS='' read -r i; do + tagname=${i#./"$prefix_tags"} + tagname=${tagname%.tmp.html} + create_html_page "$i" "$prefix_tags$tagname.html" yes "$global_title — $template_tag_title \"$tagname\"" "$global_author" + rm "$i" + done < <(ls -t ./"$prefix_tags"*.tmp.html 2>/dev/null) + echo +} + +# Return the post title +# +# $1 the html file +get_post_title() { + awk '/

/, /<\/a><\/h3>/{if (!/

/ && !/<\/a><\/h3>/) print}' "$1" +} + +# Return the post author +# +# $1 the html file +get_post_author() { + awk '/
.+/, //{if (!/
.+/ && !//) print}' "$1" | sed 's/<\/div>//g' +} + +# Displays a list of the tags +# +# $2 if "-n", tags will be sorted by number of posts +list_tags() { + if [[ $2 == -n ]]; then do_sort=1; else do_sort=0; fi + + ls ./$prefix_tags*.html &> /dev/null + (($? != 0)) && echo "No posts yet. Use 'bb.sh post' to create one" && return + + lines="" + for i in $prefix_tags*.html; do + [[ -f "$i" ]] || break + nposts=$(grep -c "<\!-- text begin -->" "$i") + tagname=${i#"$prefix_tags"} + tagname=${tagname#.html} + ((nposts > 1)) && word=$template_tags_posts || word=$template_tags_posts_singular + line="$tagname # $nposts # $word" + lines+=$line\\n + done + + if (( do_sort == 1 )); then + echo -e "$lines" | column -t -s "#" | sort -nrk 2 + else + echo -e "$lines" | column -t -s "#" + fi +} + +# Displays a list of the posts +list_posts() { + ls ./*.html &> /dev/null + (($? != 0)) && echo "No posts yet. Use 'bb.sh post' to create one" && return + + lines="" + n=1 + while IFS='' read -r i; do + is_boilerplate_file "$i" && continue + line="$n # $(get_post_title "$i") # $(LC_ALL=$date_locale date -r "$i" +"$date_format")" + lines+=$line\\n + n=$(( n + 1 )) + done < <(ls -t ./*.html) + + echo -e "$lines" | column -t -s "#" +} + +# Generate the feed file +make_rss() { + echo -n "Making RSS " + + rssfile=$blog_feed.$RANDOM + while [[ -f $rssfile ]]; do rssfile=$blog_feed.$RANDOM; done + + { + pubdate=$(LC_ALL=C date +"$date_format_full") + echo '' + echo '' + echo "$global_title$global_url/$index_file" + echo "$global_descriptionen" + echo "$pubdate" + echo "$pubdate" + echo "" + + n=0 + while IFS='' read -r i; do + is_boilerplate_file "$i" && continue + ((n >= number_of_feed_articles)) && break # max 10 items + echo -n "." 1>&3 + echo '' + get_post_title "$i" + echo '$global_url/${i#./}" + echo "$global_url/$i" + echo "$(get_post_author "$i")" + echo "$(LC_ALL=C date -r "$i" +"$date_format_full")" + + n=$(( n + 1 )) + done < <(ls -t ./*.html) + + echo '' + } 3>&1 >"$rssfile" + echo "" + + mv "$rssfile" "$blog_feed" + chmod 644 "$blog_feed" +} + +make_gophermap() { + if [ ! -d "${HOME}/public_gopher" ]; then + printf "Creating gopher hole\\n" + mkdir "${HOME}/public_gopher" + fi + + if [ ! -L "${HOME}/public_gopher/blog" ]; then + ln -sf "${HOME}/public_html/blog/" "${HOME}/public_gopher/blog" + fi + + if [ ! -f "${HOME}/public_gopher/blog/$gophermap" ]; then + cat <<- 'EOF' > $HOME/public_html/blog/$gophermap + #!/usr/bin/env sh + printf "my bashblog posts\n" + user=$(stat -c '%U' .) + for post in $(ls -t *.md); do + post=$(basename $post) + printf "0$post\t/~$user/blog/$post\ttilde.team\t70\n" + done + EOF + chmod +x $HOME/public_html/blog/$gophermap + fi + chmod 644 *.md +} + +make_gemini() { + if [ ! -d "${HOME}/public_gemini" ]; then + printf "Creating ~/public_gemini\\n" + mkdir "${HOME}/public_gemini" + fi + + if [ ! -L "${HOME}/public_gemini/blog" ]; then + ln -sf "${HOME}/public_html/blog/" "${HOME}/public_gemini/blog" + fi + + if [ ! -f "${HOME}/public_gemini/blog/$gemini_index" ]; then + cat <<- 'EOF' > $HOME/public_gemini/blog/$gemini_index + #!/usr/bin/env sh + printf "20 text/gemini\r\n" + printf "my bashblog posts\r\n" + user=$(stat -c '%U' $0) + for post in $(ls -t /home/$user/public_gemini/blog/*.md); do + post=$(basename $post) + printf "=> /~$user/blog/$post $post\r\n" + done + EOF + chmod +x ${HOME}/public_gemini/blog/$gemini_index + fi +} + +# generate headers, footers, etc +create_includes() { + { + echo "

$global_title

" + echo "
$global_description
" + } > ".title.html" + + if [[ -f $header_file ]]; then cp "$header_file" .header.html + else { + echo '' + echo '' + echo '' + echo '' + printf '\n' "${css_include[@]}" + if [[ -z $global_feedburner ]]; then + echo "" + else + echo "" + fi + } > ".header.html" + fi + + if [[ -f $footer_file ]]; then cp "$footer_file" .footer.html + else { + protected_mail=${global_email//@/@} + protected_mail=${protected_mail//./.} + echo "
$global_license $global_author$protected_mail
" + echo 'generated with bashblog, a single bash script to easily create blogs like this one
' + } >> ".footer.html" + fi +} + +# Delete the temporarily generated include files +delete_includes() { + rm ".title.html" ".footer.html" ".header.html" +} + +# Create the css file from scratch +create_css() { + # To avoid overwriting manual changes. However it is recommended that + # this function is modified if the user changes the blog.css file + (( ${#css_include[@]} > 0 )) && return || css_include=('main.css' 'blog.css') + if [[ ! -f blog.css ]]; then + # blog.css directives will be loaded after main.css and thus will prevail + echo '#title{font-size: x-large;} + a.ablack{color:black !important;} + li{margin-bottom:8px;} + ul,ol{margin-left:24px;margin-right:24px;} + #all_posts{margin-top:24px;text-align:center;} + .subtitle{font-size:small;margin:12px 0px;} + .content p{margin-left:24px;margin-right:24px;} + h1{margin-bottom:12px !important;} + #description{font-size:large;margin-bottom:12px;} + h3{margin-top:42px;margin-bottom:8px;} + h4{margin-left:24px;margin-right:24px;} + img{max-width:100%;} + #twitter{line-height:20px;vertical-align:top;text-align:right;font-style:italic;color:#333;margin-top:24px;font-size:14px;}' > blog.css + fi + + # If there is a style.css from the parent page (i.e. some landing page) + # then use it. This directive is here for compatibility with my own + # home page. Feel free to edit it out, though it doesn't hurt + if [[ -f ../style.css ]] && [[ ! -f main.css ]]; then + ln -s "../style.css" "main.css" + elif [[ ! -f main.css ]]; then + echo 'body{font-family:Georgia,"Times New Roman",Times,serif;margin:0;padding:0;background-color:#F3F3F3;} + #divbodyholder{padding:5px;background-color:#DDD;width:100%;max-width:874px;margin:24px auto;} + #divbody{border:solid 1px #ccc;background-color:#fff;padding:0px 48px 24px 48px;top:0;} + .headerholder{background-color:#f9f9f9;border-top:solid 1px #ccc;border-left:solid 1px #ccc;border-right:solid 1px #ccc;} + .header{width:100%;max-width:800px;margin:0px auto;padding-top:24px;padding-bottom:8px;} + .content{margin-bottom:5%;} + .nomargin{margin:0;} + .description{margin-top:10px;border-top:solid 1px #666;padding:10px 0;} + h3{font-size:20pt;width:100%;font-weight:bold;margin-top:32px;margin-bottom:0;} + .clear{clear:both;} + #footer{padding-top:10px;border-top:solid 1px #666;color:#333333;text-align:center;font-size:small;font-family:"Courier New","Courier",monospace;} + a{text-decoration:none;color:#003366 !important;} + a:visited{text-decoration:none;color:#336699 !important;} + blockquote{background-color:#f9f9f9;border-left:solid 4px #e9e9e9;margin-left:12px;padding:12px 12px 12px 24px;} + blockquote img{margin:12px 0px;} + blockquote iframe{margin:12px 0px;}' > main.css + fi +} + +# Regenerates all the single post entries, keeping the post content but modifying +# the title, html structure, etc +rebuild_all_entries() { + echo -n "Rebuilding all entries " + + for i in ./*.html; do + is_boilerplate_file "$i" && continue; + contentfile=.tmp.$RANDOM + while [[ -f $contentfile ]]; do contentfile=.tmp.$RANDOM; done + + echo -n "." + # Get the title and entry, and rebuild the html structure from scratch (divs, title, description...) + title=$(get_post_title "$i") + + get_html_file_content 'text' 'text' <"$i" >> "$contentfile" + + # Read timestamp from post, if present, and sync file timestamp + timestamp=$(awk '// { print }' "$i" | cut -d '#' -f 2) + [[ -n $timestamp ]] && touch -t "$timestamp" "$i" + # Read timestamp from file in correct format for 'create_html_page' + timestamp=$(LC_ALL=C date -r "$i" +"$date_format_full") + + create_html_page "$contentfile" "$i.rebuilt" no "$title" "$timestamp" "$(get_post_author "$i")" + # keep the original timestamp! + timestamp=$(LC_ALL=C date -r "$i" +"$date_format_timestamp") + mv "$i.rebuilt" "$i" + chmod 644 "$i" + touch -t "$timestamp" "$i" + rm "$contentfile" + done + echo "" +} + +# Displays the help +usage() { + echo "$global_software_name v$global_software_version" + echo "usage: bb command [filename]" + echo "" + echo "Commands:" + echo " post [-html] [filename] insert a new blog post, or the filename of a draft to continue editing it" + echo " it tries to use markdown by default, and falls back to HTML if it's not available." + echo " use '-html' to override it and edit the post as HTML even when markdown is available" + echo " edit [-n|-f] [filename] edit an already published .html or .md file. **NEVER** edit manually a published .html file," + echo " always use this function as it keeps internal data and rebuilds the blog" + echo " use '-n' to give the file a new name, if title was changed" + echo " use '-f' to edit full html file, instead of just text part (also preserves name)" + echo " delete [filename] deletes the post and rebuilds the blog" + echo " rebuild regenerates all the pages and posts, preserving the content of the entries" + echo " reset deletes everything except this script. Use with a lot of caution and back up first!" + echo " list list all posts" + echo " tags [-n] list all tags in alphabetical order" + echo " use '-n' to sort list by number of posts" + echo "" + echo "for more information please see https://tilde.team/wiki/?page=tildeblogs" + echo "source here: https://tildegit.org/team/bashblog" +} + +# Delete all generated content, leaving only this script +reset() { + echo "Are you sure you want to delete all blog entries? Please write \"Yes, I am!\" " + read -r line + if [[ $line == "Yes, I am!" ]]; then + rm .*.html ./*.html ./*.css ./*.rss &> /dev/null + echo + echo "Deleted all posts, stylesheets and feeds." + echo "Kept your old '.backup.tar.gz' just in case, please delete it manually if needed." + else + echo "Phew! You dodged a bullet there. Nothing was modified." + fi +} + +# Detects if GNU date is installed +date_version_detect() { + date --version >/dev/null 2>&1 + if (($? != 0)); then + # date utility is BSD. Test if gdate is installed + if gdate --version >/dev/null 2>&1 ; then + date() { + gdate "$@" + } + else + # BSD date + date() { + if [[ $1 == -r ]]; then + # Fall back to using stat for 'date -r' + format=${3//+/} + stat -f "%Sm" -t "$format" "$2" + elif [[ $2 == --date* ]]; then + # convert between dates using BSD date syntax + command date -j -f "$date_format_full" "${2#--date=}" "$1" + else + # acceptable format for BSD date + command date -j "$@" + fi + } + fi + fi +} + +# Main function +# Encapsulated on its own function for readability purposes +# +# $1 command to run +# $2 file name of a draft to continue editing (optional) +do_main() { + # make sure we're in the right directory + #[ $(pwd) != $HOME/public_html/blog ] && + # echo "you're not in your blog directory. moving you there now" && mkdir -p $HOME/public_html/blog && cd $HOME/public_html/blog + + # Detect if using BSD date or GNU date + date_version_detect + # Load default configuration, then override settings with the config file + global_variables + [[ -f $global_config ]] && source "$global_config" &> /dev/null + global_variables_check + + # Check for $EDITOR + [[ -z $EDITOR ]] && + echo "Please set your \$EDITOR environment variable. For example, to use nano, add the line 'export EDITOR=nano' to your \$HOME/.bashrc file" && exit + + # Check for validity of argument + [[ $1 != "reset" && $1 != "post" && $1 != "rebuild" && $1 != "list" && $1 != "edit" && $1 != "delete" && $1 != "tags" ]] && + usage && exit + + [[ $1 == list ]] && + list_posts && exit + + [[ $1 == tags ]] && + list_tags "$@" && exit + + if [[ $1 == edit ]]; then + if (($# < 2)) || [[ ! -f ${!#} ]]; then + echo "Please enter a valid .md or .html file to edit" + exit + fi + fi + + # Test for existing html files + if ls ./*.html &> /dev/null; then + # We're going to back up just in case + tar -c -z -f ".backup.tar.gz" -- *.html && + chmod 600 ".backup.tar.gz" + elif [[ $1 == rebuild ]]; then + echo "Can't find any html files, nothing to rebuild" + exit + fi + + # Keep first backup of this day containing yesterday's version of the blog + [[ ! -f .yesterday.tar.gz || $(date -r .yesterday.tar.gz +'%d') != "$(date +'%d')" ]] && + cp .backup.tar.gz .yesterday.tar.gz &> /dev/null + + [[ $1 == reset ]] && + reset && exit + + create_css + create_includes + [[ $1 == post ]] && write_entry "$@" + [[ $1 == rebuild ]] && rebuild_all_entries && rebuild_tags + [[ $1 == delete ]] && rm "$2" &> /dev/null && rebuild_tags + if [[ $1 == edit ]]; then + if [[ $2 == -n ]]; then + edit "$3" + elif [[ $2 == -f ]]; then + edit "$3" full + else + edit "$2" keep + fi + fi + rebuild_index + all_posts + all_tags + make_rss + #make_gophermap + #make_gemini + delete_includes +} + + +# +# MAIN +# Do not change anything here. If you want to modify the code, edit do_main() +# +do_main "$@" + +# vim: set shiftwidth=4 tabstop=4 expandtab: diff --git a/blog/bb.sh b/blog/bb.sh new file mode 100755 index 0000000..ac72d6e --- /dev/null +++ b/blog/bb.sh @@ -0,0 +1,1122 @@ +#!/usr/bin/env bash + +# BashBlog, a simple blog system written in a single bash script +# (C) Carlos Fenollosa , 2011-2016 and contributors +# https://github.com/carlesfe/bashblog/contributors +# Check out README.md for more details + +# Global variables +# It is recommended to perform a 'rebuild' after changing any of this in the code + +# Config file. Any settings "key=value" written there will override the +# global_variables defaults. Useful to avoid editing bb.sh and having to deal +# with merges in VCS +global_config=".config" + +# This function will load all the variables defined here. They might be overridden +# by the 'global_config' file contents +global_variables() { + global_software_name="bashblog" + global_software_version="2.8" + + # Blog title + global_title="my tildelog" + # The typical subtitle for each blog + global_description="a blog about tildes" + # The public base URL for this blog + global_url="https://gru.codeberg.page/blog" + + # Your name + global_author="g1n" + # You can use twitter or facebook or anything for global_author_url + global_author_url="https://gru.codeberg.page/" + # Your email + global_email="g1n@ttm.sh" + + # CC by-nc-nd is a good starting point, you can change this to "©" for Copyright + global_license="CC by-nc-nd" + + + # Leave this empty (i.e. "") if you don't want to use feedburner, + # or change it to your own URL + global_feedburner="" + + # Change this to your username if you want to use twitter for comments + global_twitter_username="" + # Set this to false for a Twitter button with share count. The cookieless version + # is just a link. + global_twitter_cookieless="true" + # Default search page, where tweets more than a week old are hidden + global_twitter_search="twitter" + + # Blog generated files + # index page of blog (it is usually good to use "index.html" here) + index_file="index.html" + number_of_index_articles="10" + # global archive + archive_index="all_posts.html" + tags_index="all_tags.html" + + # ignore gophermap file + gophermap="gophermap" + + # ignore gemini generation script and gemini index + gemini_index="index.gmi" + + # Non blogpost files. Bashblog will ignore these. Useful for static pages and custom content + # Add them as a bash array, e.g. non_blogpost_files=("news.html" "test.html") + non_blogpost_files=() + + # feed file (rss in this case) + blog_feed="feed.rss" + number_of_feed_articles="50" + # "cut" blog entry when putting it to index page. Leave blank for full articles in front page + # i.e. include only up to first '
', or '----' in markdown + cut_do="cut" + # When cutting, cut also tags? If "no", tags will appear in index page for cut articles + cut_tags="yes" + # Regexp matching the HTML line where to do the cut + # note that slash is regexp separator so you need to prepend it with backslash + cut_line='
' + # save markdown file when posting with "bb post -m". Leave blank to discard it. + save_markdown="yes" + # prefix for tags/categories files + # please make sure that no other html file starts with this prefix + prefix_tags="tag_" + # personalized header and footer (only if you know what you're doing) + # DO NOT name them .header.html, .footer.html or they will be overwritten + # leave blank to generate them, recommended + header_file="" + footer_file="" + # extra content to add just after we open the tag + # and before the actual blog content + body_begin_file="" + # extra content to add just before we cloese ) + body_end_file="" + # CSS files to include on every page, f.ex. css_include=('main.css' 'blog.css') + # leave empty to use generated + css_include=() + # HTML files to exclude from index, f.ex. post_exclude=('imprint.html 'aboutme.html') + html_exclude=() + + # Localization and i18n + # "Comments?" (used in twitter link after every post) + template_comments="comments?" + # "Read more..." (link under cut article on index page) + template_read_more="read more..." + # "View more posts" (used on bottom of index page as link to archive) + template_archive="archive" + # "All posts" (title of archive page) + template_archive_title="all posts" + # "All tags" + template_tags_title="all tags" + # "posts" (on "All tags" page, text at the end of each tag line, like "2. Music - 15 posts") + template_tags_posts="posts" + template_tags_posts_2_4="posts" # Some slavic languages use a different plural form for 2-4 items + template_tags_posts_singular="post" + # "Posts tagged" (text on a title of a page with index of one tag, like "My Blog - Posts tagged "Music"") + template_tag_title="posts tagged" + # "Tags:" (beginning of line in HTML file with list of all tags for this article) + template_tags_line_header="tags:" + # "Back to the index page" (used on archive page, it is link to blog index) + template_archive_index_page="back home" + # "Subscribe" (used on bottom of index page, it is link to RSS feed) + template_subscribe="rss" + # "Subscribe to this page..." (used as text for browser feed button that is embedded to html) + template_subscribe_browser_button="subscribe to this page..." + # "Tweet" (used as twitter text button for posting to twitter) + template_twitter_button="tweet" + template_twitter_comment="<type your comment here but please leave the URL so that other people can follow the comments>" + + # The locale to use for the dates displayed on screen + date_format="%B %d, %Y" + date_locale="C" + date_inpost="bashblog_timestamp" + # Don't change these dates + date_format_full="%a, %d %b %Y %H:%M:%S %z" + date_format_timestamp="%Y%m%d%H%M.%S" + date_allposts_header="%B %Y" + + # Perform the post title -> filename conversion + # Experts only. You may need to tune the locales too + # Leave empty for no conversion, which is not recommended + # This default filter respects backwards compatibility + convert_filename="iconv -f utf-8 -t ascii//translit | sed 's/^-*//' | tr [:upper:] [:lower:] | tr ' ' '-' | tr -dc '[:alnum:]-'" + + # URL where you can view the post while it's being edited + # same as global_url by default + # You can change it to path on your computer, if you write posts locally + # before copying them to the server + preview_url="" + + # Markdown location. Trying to autodetect by default. + # The invocation must support the signature 'markdown_bin in.md > out.html' + [[ -f Markdown.pl ]] && markdown_bin=./Markdown.pl || markdown_bin=$(which Markdown.pl 2>/dev/null || which markdown 2>/dev/null) +} + +# Check for the validity of some variables +# DO NOT EDIT THIS FUNCTION unless you know what you're doing +global_variables_check() { + [[ $header_file == .header.html ]] && + echo "Please check your configuration. '.header.html' is not a valid value for the setting 'header_file'" && + exit + [[ $footer_file == .footer.html ]] && + echo "Please check your configuration. '.footer.html' is not a valid value for the setting 'footer_file'" && + exit +} + + +# Test if the markdown script is working correctly +test_markdown() { + [[ -n $markdown_bin ]] && + ( + [[ $("$markdown_bin" <<< $'line 1\n\nline 2') == $'

line 1

\n\n

line 2

' ]] || + [[ $("$markdown_bin" <<< $'line 1\n\nline 2') == $'

line 1

\n

line 2

' ]] + ) +} + + +# Parse a Markdown file into HTML and return the generated file +markdown() { + out=${1%.md}.html + while [[ -f $out ]]; do out=${out%.html}.$RANDOM.html; done + $markdown_bin "$1" > "$out" + echo "$out" +} + +# Reads HTML file from stdin, prints its content to stdout +# $1 where to start ("text" or "entry") +# $2 where to stop ("text" or "entry") +# $3 "cut" to remove text from
to +# note that this does not remove
line itself, +# so you can see if text was cut or not +get_html_file_content() { + awk "//, //{ + if (!// && !//) print + if (\"$3\" == \"cut\" && /$cut_line/){ + if (\"$2\" == \"text\") exit # no need to read further + while (getline > 0 && !//) { + if (\"$cut_tags\" == \"no\" && /^

$template_tags_line_header/ ) print + } + } + }" +} + +# Edit an existing, published .html file while keeping its original timestamp +# Please note that this function does not automatically republish anything, as +# it is usually called from 'main'. +# +# Note that it edits HTML file, even if you wrote the post as markdown originally +# Note that if you edit title then filename might also change +# +# $1 the file to edit +# $2 (optional) edit mode: +# "keep" to keep old filename +# "full" to edit full HTML, and not only text part (keeps old filename) +# leave empty for default behavior (edit only text part and change name) +edit() { + [[ ! -f "${1%%.*}.html" ]] && echo "Can't edit post "${1%%.*}.html", did you mean to use \"bb.sh post \"?" && exit -1 + # Original post timestamp + edit_timestamp=$(LC_ALL=C date -r "${1%%.*}.html" +"$date_format_full" ) + touch_timestamp=$(LC_ALL=C date -r "${1%%.*}.html" +"$date_format_timestamp") + tags_before=$(tags_in_post "${1%%.*}.html") + if [[ $2 == full ]]; then + $EDITOR "$1" + filename=$1 + else + if [[ ${1##*.} == md ]]; then + test_markdown + if (($? != 0)); then + echo "Markdown is not working, please edit HTML file directly." + exit + fi + # editing markdown file + $EDITOR "$1" + TMPFILE=$(markdown "$1") + filename=${1%%.*}.html + else + # Create the content file + TMPFILE=$(basename "$1").$RANDOM.html + # Title + get_post_title "$1" > "$TMPFILE" + # Post text with plaintext tags + get_html_file_content 'text' 'text' <"$1" | sed "/^

$template_tags_line_header/s|\\1|\\1|g" >> "$TMPFILE" + $EDITOR "$TMPFILE" + filename=$1 + fi + rm "$filename" + if [[ $2 == keep ]]; then + parse_file "$TMPFILE" "$edit_timestamp" "$filename" + else + parse_file "$TMPFILE" "$edit_timestamp" # this command sets $filename as the html processed file + [[ ${1##*.} == md ]] && mv "$1" "${filename%%.*}.md" 2>/dev/null + fi + rm "$TMPFILE" + fi + touch -t "$touch_timestamp" "$filename" + touch -t "$touch_timestamp" "$1" + chmod 644 "$filename" + echo "Posted $filename" + tags_after=$(tags_in_post "$filename") + relevant_tags=$(echo "$tags_before $tags_after" | tr ',' ' ' | tr ' ' '\n' | sort -u | tr '\n' ' ') + if [[ ! -z $relevant_tags ]]; then + relevant_posts="$(posts_with_tags $relevant_tags) $filename" + rebuild_tags "$relevant_posts" "$relevant_tags" + fi +} + +# Create a Twitter summary (twitter "card") for the post +# +# $1 the post file +# $2 the title +twitter_card() { + [[ -z $global_twitter_username ]] && return + + echo "" + echo "" + echo "" # Twitter truncates at 70 char + description=$(grep -v "^

$template_tags_line_header" "$1" | sed -e 's/<[^>]*>//g' | head -c 250 | tr '\n' ' ' | sed "s/\"/'/g") + echo "" + image=$(sed -n 's/.*" +} + +# Adds the code needed by the twitter button +# +# $1 the post URL +twitter() { + [[ -z $global_twitter_username ]] && return + + if [[ $global_twitter_cookieless == true ]]; then + id=$RANDOM + + search_engine="https://twitter.com/search?q=" + + echo "

$template_comments $template_twitter_button " + echo " 

" + return; + else + echo "

$template_comments "; + fi + + echo "$template_twitter_button " + echo "

" +} + +# Check if the file is a 'boilerplate' (i.e. not a post) +# The return values are designed to be used like this inside a loop: +# is_boilerplate_file && continue +# +# $1 the file +# +# Return 0 (bash return value 'true') if the input file is an index, feed, etc +# or 1 (bash return value 'false') if it is a blogpost +is_boilerplate_file() { + name=${1#./} + # First check against user-defined non-blogpost pages + for item in "${non_blogpost_files[@]}"; do + [[ "$name" == "$item" ]] && return 0 + done + + case $name in + ( "$index_file" | "$archive_index" | "$tags_index" | "$footer_file" | "$header_file" | "$global_analytics_file" | "$prefix_tags"* ) + return 0 ;; + ( * ) # Check for excluded + for excl in "${html_exclude[@]}"; do + [[ $name == "$excl" ]] && return 0 + done + return 1 ;; + esac +} + +# Adds all the bells and whistles to format the html page +# Every blog post is marked with a and +# which is parsed afterwards in the other functions. There is also a marker +# to determine just the beginning of the text body of the post +# +# $1 a file with the body of the content +# $2 the output file +# $3 "yes" if we want to generate the index.html, +# "no" to insert new blog posts +# $4 title for the html header +# $5 original blog timestamp +# $6 post author +create_html_page() { + content=$1 + filename=$2 + index=$3 + title=$4 + timestamp=$5 + author=$6 + + # Create the actual blog post + # html, head + { + cat ".header.html" + echo "$title" + twitter_card "$content" "$title" + echo "" + # stuff to add before the actual body content + [[ -n $body_begin_file ]] && cat "$body_begin_file" + # body divs + echo '
' + echo '
' + # blog title + echo '
' + cat .title.html + echo '
' # title, header, headerholder + echo '
' + + file_url=${filename#./} + file_url=${file_url%.rebuilt} # Get the correct URL when rebuilding + # one blog entry + if [[ $index == no ]]; then + echo '' # marks the beginning of the whole post + echo "

" + # remove possible

's on the title because of markdown conversion + title=${title//

/} + title=${title//<\/p>/} + echo "$title" + echo '

' + if [[ -z $timestamp ]]; then + echo "" + else + echo "" + fi + if [[ -z $timestamp ]]; then + echo -n "
$(LC_ALL=$date_locale date +"$date_format")" + else + echo -n "
$(LC_ALL=$date_locale date +"$date_format" --date="$timestamp")" + fi + [[ -n $author ]] && echo -e " — \n$author" + echo "
" + echo '' # This marks the text body, after the title, date... + fi + cat "$content" # Actual content + if [[ $index == no ]]; then + echo -e '\n' + + twitter "$global_url/$file_url" + + echo '' # absolute end of the post + fi + + echo '
' # content + + # page footer + cat .footer.html + # close divs + echo '
' # divbody and divbodyholder + [[ -n $body_end_file ]] && cat "$body_end_file" + echo '' + } > "$filename" +} + +# Parse the plain text file into an html file +# +# $1 source file name +# $2 (optional) timestamp for the file +# $3 (optional) destination file name +# note that although timestamp is optional, something must be provided at its +# place if destination file name is provided, i.e: +# parse_file source.txt "" destination.html +parse_file() { + # Read for the title and check that the filename is ok + title="" + while IFS='' read -r line; do + if [[ -z $title ]]; then + # remove extra

and

added by markdown + title=$(echo "$line" | sed 's/<\/*p>//g') + if [[ -n $3 ]]; then + filename=$3 + else + filename=$title + [[ -n $convert_filename ]] && + filename=$(echo "$title" | eval "$convert_filename") + [[ -n $filename ]] || + filename=$RANDOM # don't allow empty filenames + + filename=$filename.html + + # Check for duplicate file names + while [[ -f $filename ]]; do + filename=${filename%.html}$RANDOM.html + done + fi + content=$filename.tmp + # Parse possible tags + elif [[ $line == "

$template_tags_line_header"* ]]; then + tags=$(echo "$line" | cut -d ":" -f 2- | sed -e 's/<\/p>//g' -e 's/^ *//' -e 's/ *$//' -e 's/, /,/g') + IFS=, read -r -a array <<< "$tags" + + echo -n "

$template_tags_line_header " >> "$content" + for item in "${array[@]}"; do + echo -n "$item, " + done | sed 's/, $/<\/p>/g' >> "$content" + else + echo "$line" >> "$content" + fi + done < "$1" + + # Create the actual html page + create_html_page "$content" "$filename" no "$title" "$2" "$global_author" + rm "$content" +} + +# Manages the creation of the text file and the parsing to html file +# also the drafts +write_entry() { + test_markdown && fmt=md || fmt=html + f=$2 + [[ $2 == -html ]] && fmt=html && f=$3 + + if [[ -n $f ]]; then + TMPFILE=$f + if [[ ! -f $TMPFILE ]]; then + echo "The file doesn't exist" + delete_includes + exit + fi + # guess format from TMPFILE + extension=${TMPFILE##*.} + [[ $extension == md || $extension == html ]] && fmt=$extension + # but let user override it (`bb.sh post -html file.md`) + [[ $2 == -html ]] && fmt=html + # Test if Markdown is working before re-posting a .md file + if [[ $extension == md ]]; then + test_markdown + if (($? != 0)); then + echo "Markdown is not working, please edit HTML file directly." + exit + fi + fi + else + TMPFILE=.entry-$RANDOM.$fmt + echo -e "Title on this line\n" >> "$TMPFILE" + + [[ $fmt == html ]] && cat << EOF >> "$TMPFILE" +

The rest of the text file is an html blog post. The process will continue as soon +as you exit your editor.

+ +

$template_tags_line_header keep-this-tag-format, tags-are-optional, example

+EOF + [[ $fmt == md ]] && cat << EOF >> "$TMPFILE" +The rest of the text file is a **Markdown** blog post. The process will continue +as soon as you exit your editor. + +$template_tags_line_header keep-this-tag-format, tags-are-optional, beware-with-underscores-in-markdown, example +EOF + fi + chmod 600 "$TMPFILE" + + post_status="E" + filename="" + while [[ $post_status != "p" && $post_status != "P" ]]; do + [[ -n $filename ]] && rm "$filename" # Delete the generated html file, if any + $EDITOR "$TMPFILE" + if [[ $fmt == md ]]; then + html_from_md=$(markdown "$TMPFILE") + parse_file "$html_from_md" + rm "$html_from_md" + else + parse_file "$TMPFILE" # this command sets $filename as the html processed file + fi + + chmod 644 "$filename" + [[ -n $preview_url ]] || preview_url=$global_url + echo "To preview the entry, open $preview_url/$filename in your browser" + + echo -n "[P]ost this entry, [E]dit again, [D]raft for later? (p/E/d) " + read -r post_status + if [[ $post_status == d || $post_status == D ]]; then + mkdir -p "drafts/" + chmod 700 "drafts/" + + title=$(head -n 1 $TMPFILE) + [[ -n $convert_filename ]] && title=$(echo "$title" | eval "$convert_filename") + [[ -n $title ]] || title=$RANDOM + + draft=drafts/$title.$fmt + mv "$TMPFILE" "$draft" + chmod 600 "$draft" + rm "$filename" + delete_includes + echo "Saved your draft as '$draft'" + exit + fi + done + + if [[ $fmt == md && -n $save_markdown ]]; then + mv "$TMPFILE" "${filename%%.*}.md" + else + rm "$TMPFILE" + fi + chmod 644 "$filename" + echo "Posted $filename" + relevant_tags=$(tags_in_post $filename) + if [[ -n $relevant_tags ]]; then + relevant_posts="$(posts_with_tags $relevant_tags) $filename" + rebuild_tags "$relevant_posts" "$relevant_tags" + fi +} + +# Create an index page with all the posts +all_posts() { + echo -n "Creating an index page with all the posts " + contentfile=$archive_index.$RANDOM + while [[ -f $contentfile ]]; do + contentfile=$archive_index.$RANDOM + done + + { + echo "

$template_archive_title

" + prev_month="" + while IFS='' read -r i; do + is_boilerplate_file "$i" && continue + echo -n "." 1>&3 + # Month headers + month=$(LC_ALL=$date_locale date -r "$i" +"$date_allposts_header") + if [[ $month != "$prev_month" ]]; then + [[ -n $prev_month ]] && echo "" # Don't close ul before first header + echo "

$month

" + echo "
    " + prev_month=$month + fi + # Title + title=$(get_post_title "$i") + echo -n "
  • $title —" + # Date + date=$(LC_ALL=$date_locale date -r "$i" +"$date_format") + echo " $date
  • " + done < <(ls -t ./*.html) + echo "" 1>&3 + echo "
" + echo "" + } 3>&1 >"$contentfile" + + create_html_page "$contentfile" "$archive_index.tmp" yes "$global_title — $template_archive_title" "$global_author" + mv "$archive_index.tmp" "$archive_index" + chmod 644 "$archive_index" + rm "$contentfile" +} + +# Create an index page with all the tags +all_tags() { + echo -n "Creating an index page with all the tags " + contentfile=$tags_index.$RANDOM + while [[ -f $contentfile ]]; do + contentfile=$tags_index.$RANDOM + done + + { + echo "

$template_tags_title

" + echo "
    " + for i in $prefix_tags*.html; do + [[ -f "$i" ]] || break + echo -n "." 1>&3 + nposts=$(grep -c "<\!-- text begin -->" "$i") + tagname=${i#"$prefix_tags"} + tagname=${tagname%.html} + case $nposts in + 1) word=$template_tags_posts_singular;; + 2|3|4) word=$template_tags_posts_2_4;; + *) word=$template_tags_posts;; + esac + echo "
  • $tagname — $nposts $word
  • " + done + echo "" 1>&3 + echo "
" + echo "" + } 3>&1 > "$contentfile" + + create_html_page "$contentfile" "$tags_index.tmp" yes "$global_title — $template_tags_title" "$global_author" + mv "$tags_index.tmp" "$tags_index" + chmod 644 "$tags_index" + rm "$contentfile" +} + +# Generate the index.html with the content of the latest posts +rebuild_index() { + echo -n "Rebuilding the index " + newindexfile=$index_file.$RANDOM + contentfile=$newindexfile.content + while [[ -f $newindexfile ]]; do + newindexfile=$index_file.$RANDOM + contentfile=$newindexfile.content + done + + # Create the content file + { + n=0 + while IFS='' read -r i; do + is_boilerplate_file "$i" && continue; + if ((n >= number_of_index_articles)); then break; fi + if [[ -n $cut_do ]]; then + get_html_file_content 'entry' 'entry' 'cut' <"$i" | awk "/$cut_line/ { print \"

$template_read_more

\" ; next } 1" + else + get_html_file_content 'entry' 'entry' <"$i" + fi + echo -n "." 1>&3 + n=$(( n + 1 )) + done < <(ls -t ./*.html) # sort by date, newest first + + feed=$blog_feed + if [[ -n $global_feedburner ]]; then feed=$global_feedburner; fi + echo "" + } 3>&1 >"$contentfile" + + echo "" + + create_html_page "$contentfile" "$newindexfile" yes "$global_title" "$global_author" + rm "$contentfile" + mv "$newindexfile" "$index_file" + chmod 644 "$index_file" +} + +# Finds all tags referenced in one post. +# Accepts either filename as first argument, or post content at stdin +# Prints one line with space-separated tags to stdout +tags_in_post() { + sed -n "/^

$template_tags_line_header/{s/^

$template_tags_line_header//;s/<[^>]*>//g;s/[ ,]\+/ /g;p;}" "$1" | tr ', ' ' ' +} + +# Finds all posts referenced in a number of tags. +# Arguments are tags +# Prints one line with space-separated tags to stdout +posts_with_tags() { + (($# < 1)) && return + set -- "${@/#/$prefix_tags}" + set -- "${@/%/.html}" + sed -n '/^

/{s/.*href="\([^"]*\)">.*/\1/;p;}' "$@" 2> /dev/null +} + +# Rebuilds tag_*.html files +# if no arguments given, rebuilds all of them +# if arguments given, they should have this format: +# "FILE1 [FILE2 [...]]" "TAG1 [TAG2 [...]]" +# where FILEn are files with posts which should be used for rebuilding tags, +# and TAGn are names of tags which should be rebuilt. +# example: +# rebuild_tags "one_post.html another_article.html" "example-tag another-tag" +# mind the quotes! +rebuild_tags() { + if (($# < 2)); then + # will process all files and tags + files=$(ls -t ./*.html) + all_tags=yes + else + # will process only given files and tags + files=$(printf '%s\n' $1 | sort -u) + files=$(ls -t $files) + tags=$2 + fi + echo -n "Rebuilding tag pages " + n=0 + if [[ -n $all_tags ]]; then + rm ./"$prefix_tags"*.html &> /dev/null + else + for i in $tags; do + rm "./$prefix_tags$i.html" &> /dev/null + done + fi + # First we will process all files and create temporal tag files + # with just the content of the posts + tmpfile=tmp.$RANDOM + while [[ -f $tmpfile ]]; do tmpfile=tmp.$RANDOM; done + while IFS='' read -r i; do + is_boilerplate_file "$i" && continue; + echo -n "." + if [[ -n $cut_do ]]; then + get_html_file_content 'entry' 'entry' 'cut' <"$i" | awk "/$cut_line/ { print \"

$template_read_more

\" ; next } 1" + else + get_html_file_content 'entry' 'entry' <"$i" + fi >"$tmpfile" + for tag in $(tags_in_post "$i"); do + if [[ -n $all_tags || " $tags " == *" $tag "* ]]; then + cat "$tmpfile" >> "$prefix_tags$tag".tmp.html + fi + done + done <<< "$files" + rm "$tmpfile" + # Now generate the tag files with headers, footers, etc + while IFS='' read -r i; do + tagname=${i#./"$prefix_tags"} + tagname=${tagname%.tmp.html} + create_html_page "$i" "$prefix_tags$tagname.html" yes "$global_title — $template_tag_title \"$tagname\"" "$global_author" + rm "$i" + done < <(ls -t ./"$prefix_tags"*.tmp.html 2>/dev/null) + echo +} + +# Return the post title +# +# $1 the html file +get_post_title() { + awk '/

/, /<\/a><\/h3>/{if (!/

/ && !/<\/a><\/h3>/) print}' "$1" +} + +# Return the post author +# +# $1 the html file +get_post_author() { + awk '/
.+/, //{if (!/
.+/ && !//) print}' "$1" | sed 's/<\/div>//g' +} + +# Displays a list of the tags +# +# $2 if "-n", tags will be sorted by number of posts +list_tags() { + if [[ $2 == -n ]]; then do_sort=1; else do_sort=0; fi + + ls ./$prefix_tags*.html &> /dev/null + (($? != 0)) && echo "No posts yet. Use 'bb.sh post' to create one" && return + + lines="" + for i in $prefix_tags*.html; do + [[ -f "$i" ]] || break + nposts=$(grep -c "<\!-- text begin -->" "$i") + tagname=${i#"$prefix_tags"} + tagname=${tagname#.html} + ((nposts > 1)) && word=$template_tags_posts || word=$template_tags_posts_singular + line="$tagname # $nposts # $word" + lines+=$line\\n + done + + if (( do_sort == 1 )); then + echo -e "$lines" | column -t -s "#" | sort -nrk 2 + else + echo -e "$lines" | column -t -s "#" + fi +} + +# Displays a list of the posts +list_posts() { + ls ./*.html &> /dev/null + (($? != 0)) && echo "No posts yet. Use 'bb.sh post' to create one" && return + + lines="" + n=1 + while IFS='' read -r i; do + is_boilerplate_file "$i" && continue + line="$n # $(get_post_title "$i") # $(LC_ALL=$date_locale date -r "$i" +"$date_format")" + lines+=$line\\n + n=$(( n + 1 )) + done < <(ls -t ./*.html) + + echo -e "$lines" | column -t -s "#" +} + +# Generate the feed file +make_rss() { + echo -n "Making RSS " + + rssfile=$blog_feed.$RANDOM + while [[ -f $rssfile ]]; do rssfile=$blog_feed.$RANDOM; done + + { + pubdate=$(LC_ALL=C date +"$date_format_full") + echo '' + echo '' + echo "$global_title$global_url/$index_file" + echo "$global_descriptionen" + echo "$pubdate" + echo "$pubdate" + echo "" + + n=0 + while IFS='' read -r i; do + is_boilerplate_file "$i" && continue + ((n >= number_of_feed_articles)) && break # max 10 items + echo -n "." 1>&3 + echo '' + get_post_title "$i" + echo '$global_url/${i#./}" + echo "$global_url/$i" + echo "$(get_post_author "$i")" + echo "$(LC_ALL=C date -r "$i" +"$date_format_full")" + + n=$(( n + 1 )) + done < <(ls -t ./*.html) + + echo '' + } 3>&1 >"$rssfile" + echo "" + + mv "$rssfile" "$blog_feed" + chmod 644 "$blog_feed" +} + +# generate headers, footers, etc +create_includes() { + { + echo "

$global_title

" + echo "
$global_description
" + } > ".title.html" + + if [[ -f $header_file ]]; then cp "$header_file" .header.html + else { + echo '' + echo '' + echo '' + echo '' + printf '\n' "${css_include[@]}" + if [[ -z $global_feedburner ]]; then + echo "" + else + echo "" + fi + } > ".header.html" + fi + + if [[ -f $footer_file ]]; then cp "$footer_file" .footer.html + else { + protected_mail=${global_email//@/@} + protected_mail=${protected_mail//./.} + echo "
$global_license $global_author$protected_mail
" + echo 'generated with bashblog, a single bash script to easily create blogs like this one
' + } >> ".footer.html" + fi +} + +# Delete the temporarily generated include files +delete_includes() { + rm ".title.html" ".footer.html" ".header.html" +} + +# Create the css file from scratch +create_css() { + # To avoid overwriting manual changes. However it is recommended that + # this function is modified if the user changes the blog.css file + (( ${#css_include[@]} > 0 )) && return || css_include=('main.css' 'blog.css') + if [[ ! -f blog.css ]]; then + # blog.css directives will be loaded after main.css and thus will prevail + echo '#title{font-size: x-large;} + a.ablack{color:black !important;} + li{margin-bottom:8px;} + ul,ol{margin-left:24px;margin-right:24px;} + #all_posts{margin-top:24px;text-align:center;} + .subtitle{font-size:small;margin:12px 0px;} + .content p{margin-left:24px;margin-right:24px;} + h1{margin-bottom:12px !important;} + #description{font-size:large;margin-bottom:12px;} + h3{margin-top:42px;margin-bottom:8px;} + h4{margin-left:24px;margin-right:24px;} + img{max-width:100%;} + #twitter{line-height:20px;vertical-align:top;text-align:right;font-style:italic;color:#333;margin-top:24px;font-size:14px;}' > blog.css + fi + + # If there is a style.css from the parent page (i.e. some landing page) + # then use it. This directive is here for compatibility with my own + # home page. Feel free to edit it out, though it doesn't hurt + if [[ -f ../style.css ]] && [[ ! -f main.css ]]; then + ln -s "../style.css" "main.css" + elif [[ ! -f main.css ]]; then + echo 'body{font-family:Georgia,"Times New Roman",Times,serif;margin:0;padding:0;background-color:#F3F3F3;} + #divbodyholder{padding:5px;background-color:#DDD;width:100%;max-width:874px;margin:24px auto;} + #divbody{border:solid 1px #ccc;background-color:#fff;padding:0px 48px 24px 48px;top:0;} + .headerholder{background-color:#f9f9f9;border-top:solid 1px #ccc;border-left:solid 1px #ccc;border-right:solid 1px #ccc;} + .header{width:100%;max-width:800px;margin:0px auto;padding-top:24px;padding-bottom:8px;} + .content{margin-bottom:5%;} + .nomargin{margin:0;} + .description{margin-top:10px;border-top:solid 1px #666;padding:10px 0;} + h3{font-size:20pt;width:100%;font-weight:bold;margin-top:32px;margin-bottom:0;} + .clear{clear:both;} + #footer{padding-top:10px;border-top:solid 1px #666;color:#333333;text-align:center;font-size:small;font-family:"Courier New","Courier",monospace;} + a{text-decoration:none;color:#003366 !important;} + a:visited{text-decoration:none;color:#336699 !important;} + blockquote{background-color:#f9f9f9;border-left:solid 4px #e9e9e9;margin-left:12px;padding:12px 12px 12px 24px;} + blockquote img{margin:12px 0px;} + blockquote iframe{margin:12px 0px;}' > main.css + fi +} + +# Regenerates all the single post entries, keeping the post content but modifying +# the title, html structure, etc +rebuild_all_entries() { + echo -n "Rebuilding all entries " + + for i in ./*.html; do + is_boilerplate_file "$i" && continue; + contentfile=.tmp.$RANDOM + while [[ -f $contentfile ]]; do contentfile=.tmp.$RANDOM; done + + echo -n "." + # Get the title and entry, and rebuild the html structure from scratch (divs, title, description...) + title=$(get_post_title "$i") + + get_html_file_content 'text' 'text' <"$i" >> "$contentfile" + + # Read timestamp from post, if present, and sync file timestamp + timestamp=$(awk '// { print }' "$i" | cut -d '#' -f 2) + [[ -n $timestamp ]] && touch -t "$timestamp" "$i" + # Read timestamp from file in correct format for 'create_html_page' + timestamp=$(LC_ALL=C date -r "$i" +"$date_format_full") + + create_html_page "$contentfile" "$i.rebuilt" no "$title" "$timestamp" "$(get_post_author "$i")" + # keep the original timestamp! + timestamp=$(LC_ALL=C date -r "$i" +"$date_format_timestamp") + mv "$i.rebuilt" "$i" + chmod 644 "$i" + touch -t "$timestamp" "$i" + rm "$contentfile" + done + echo "" +} + +# Displays the help +usage() { + echo "$global_software_name v$global_software_version" + echo "usage: bb command [filename]" + echo "" + echo "Commands:" + echo " post [-html] [filename] insert a new blog post, or the filename of a draft to continue editing it" + echo " it tries to use markdown by default, and falls back to HTML if it's not available." + echo " use '-html' to override it and edit the post as HTML even when markdown is available" + echo " edit [-n|-f] [filename] edit an already published .html or .md file. **NEVER** edit manually a published .html file," + echo " always use this function as it keeps internal data and rebuilds the blog" + echo " use '-n' to give the file a new name, if title was changed" + echo " use '-f' to edit full html file, instead of just text part (also preserves name)" + echo " delete [filename] deletes the post and rebuilds the blog" + echo " rebuild regenerates all the pages and posts, preserving the content of the entries" + echo " reset deletes everything except this script. Use with a lot of caution and back up first!" + echo " list list all posts" + echo " tags [-n] list all tags in alphabetical order" + echo " use '-n' to sort list by number of posts" + echo "" + echo "for more information please see https://tilde.team/wiki/?page=tildeblogs" + echo "source here: https://tildegit.org/team/bashblog" +} + +# Delete all generated content, leaving only this script +reset() { + echo "Are you sure you want to delete all blog entries? Please write \"Yes, I am!\" " + read -r line + if [[ $line == "Yes, I am!" ]]; then + rm .*.html ./*.html ./*.css ./*.rss &> /dev/null + echo + echo "Deleted all posts, stylesheets and feeds." + echo "Kept your old '.backup.tar.gz' just in case, please delete it manually if needed." + else + echo "Phew! You dodged a bullet there. Nothing was modified." + fi +} + +# Detects if GNU date is installed +date_version_detect() { + date --version >/dev/null 2>&1 + if (($? != 0)); then + # date utility is BSD. Test if gdate is installed + if gdate --version >/dev/null 2>&1 ; then + date() { + gdate "$@" + } + else + # BSD date + date() { + if [[ $1 == -r ]]; then + # Fall back to using stat for 'date -r' + format=${3//+/} + stat -f "%Sm" -t "$format" "$2" + elif [[ $2 == --date* ]]; then + # convert between dates using BSD date syntax + command date -j -f "$date_format_full" "${2#--date=}" "$1" + else + # acceptable format for BSD date + command date -j "$@" + fi + } + fi + fi +} + +# Main function +# Encapsulated on its own function for readability purposes +# +# $1 command to run +# $2 file name of a draft to continue editing (optional) +do_main() { + # make sure we're in the right directory + #[ $(pwd) != $HOME/public_html/blog ] && + # echo "you're not in your blog directory. moving you there now" && mkdir -p $HOME/public_html/blog && cd $HOME/public_html/blog + + # Detect if using BSD date or GNU date + date_version_detect + # Load default configuration, then override settings with the config file + global_variables + [[ -f $global_config ]] && source "$global_config" &> /dev/null + global_variables_check + + # Check for $EDITOR + [[ -z $EDITOR ]] && + echo "Please set your \$EDITOR environment variable. For example, to use nano, add the line 'export EDITOR=nano' to your \$HOME/.bashrc file" && exit + + # Check for validity of argument + [[ $1 != "reset" && $1 != "post" && $1 != "rebuild" && $1 != "list" && $1 != "edit" && $1 != "delete" && $1 != "tags" ]] && + usage && exit + + [[ $1 == list ]] && + list_posts && exit + + [[ $1 == tags ]] && + list_tags "$@" && exit + + if [[ $1 == edit ]]; then + if (($# < 2)) || [[ ! -f ${!#} ]]; then + echo "Please enter a valid .md or .html file to edit" + exit + fi + fi + + # Test for existing html files + if ls ./*.html &> /dev/null; then + # We're going to back up just in case + tar -c -z -f ".backup.tar.gz" -- *.html && + chmod 600 ".backup.tar.gz" + elif [[ $1 == rebuild ]]; then + echo "Can't find any html files, nothing to rebuild" + exit + fi + + # Keep first backup of this day containing yesterday's version of the blog + [[ ! -f .yesterday.tar.gz || $(date -r .yesterday.tar.gz +'%d') != "$(date +'%d')" ]] && + cp .backup.tar.gz .yesterday.tar.gz &> /dev/null + + [[ $1 == reset ]] && + reset && exit + + create_css + create_includes + [[ $1 == post ]] && write_entry "$@" + [[ $1 == rebuild ]] && rebuild_all_entries && rebuild_tags + [[ $1 == delete ]] && rm "$2" &> /dev/null && rebuild_tags + if [[ $1 == edit ]]; then + if [[ $2 == -n ]]; then + edit "$3" + elif [[ $2 == -f ]]; then + edit "$3" full + else + edit "$2" keep + fi + fi + rebuild_index + all_posts + all_tags + make_rss + delete_includes +} + + +# +# MAIN +# Do not change anything here. If you want to modify the code, edit do_main() +# +do_main "$@" + +# vim: set shiftwidth=4 tabstop=4 expandtab: diff --git a/blog/blog.css b/blog/blog.css new file mode 100644 index 0000000..c01e7f6 --- /dev/null +++ b/blog/blog.css @@ -0,0 +1,29 @@ +body { + background:#1c1c1c; + color:#a7d129; + margin:0; + padding:0; +} +hr{ + color:#32302f; +} +ul{ + list-style: none; +} +li{ + color:#81b214; +} +a{ + text-decoration:none; + color:#9ede73; +} +h1,h2,h3,h4,h5,h6{color:#9ede73;} +h1{margin-bottom:12px !important;} +h4{margin-left:24px;margin-right:24px;} +img{max-width:100%;} +h3{font-size:20pt;width:100%;font-weight:bold;margin-top:32px;margin-bottom:0;} +header{width:100%;max-width:800px;margin:0px auto;padding-top:24px;padding-bottom:8px;} +#footer{padding-top:10px;border-top:solid 1px #666;text-align:center;font-size:small;font-family:"Courier New","Courier",monospace;} +#all_posts{margin-top:24px;margin-bottom:24px;text-align:center;} +.subtitle{font-size:small;margin:12px 0px;} +.content p{margin-left:24px;margin-right:24px;} diff --git a/blog/feed.rss b/blog/feed.rss new file mode 100644 index 0000000..d2cc86a --- /dev/null +++ b/blog/feed.rss @@ -0,0 +1,629 @@ + + +GRU's bloghttps://gru.codeberg.page/blog/index.html +GRU's blogen +Tue, 14 Dec 2021 13:57:36 +0000 +Tue, 14 Dec 2021 13:57:36 +0000 + + +GRU Devlog 20 - olibc +This week I was making olibc. I was implementing <string.h>. Also I was fixing liblinux to +be able to include it without need to use full path in #include. I had several other issues +with it and also fixed them.

+ +

My current goal is to implement <string.h> and after that I am planning to publish it. +Currently most of funcs are implemented. Making strtok now but all other functions need +locale.h and I don’t know yet how I will be implemented. But it is already cool that we +have most of functions that should be in <string.h>!

+ +

Also we now have gru webpage on codeberg! Maybe next week I +will move all devlogs to gru webpage so it will be easier to move.

+ +

Hope you liked this post! If you would like to help us, contact me via email, xmpp or irc :)

+ +

tags: gru, olibc, liblinux

+ + + +]]>
https://gru.codeberg.page/blog/gru-devlog-20---olibc.html +https://gru.codeberg.page/blog/./gru-devlog-20---olibc.html +G1n +Sun, 12 Dec 2021 17:46:18 +0000
+ +GRU Devlog 19 - gic and several libs +This week started with making gic (maybe name will be change). As I have written before +it is going to be suckless ii clone. Also I started making girclib - simple C library for irc +protocol. I think it will be published as separate project, because I would like to make it +for both: client and server. I don’t yet how it will be done but we will see…

+ +

Then I thought that would be cool to have own libc, but have no knowledge how it speaks with OS. +Then I understood that on linux it is working via syscalls. So started making liblinux - +C library for linux syscalls. Using it we won’t need to use assembly a lot in our libc. Currently +write and read syscalls are done and programmer can use it if passed -I, -L and -l flags to compiler. +And it is already published! (check codeberg or tildegit)

+ +

After understanding how to create proper makefile with liblinux, I started making olibc. Currently +it has very tiny number of features. But string.h is mostly done! I don’t know when I will fill that +it will be ready enough to be published, but hope to have useful functions and test suit there till +that time.

+ +

When olibc will be done enough I am going to start making C compiler (already have some code, but it +is old and I not understand how it works, so need to be rewritten). Also I hope that we will have +enough toolchain (or I will have enough knowledge to implement things that are not done faster) +for our own Linux or BSD distribution. But that will be in future…

+ +

Hope you liked this post! If you would like to help us, contact me via email, xmpp or irc :)

+ +

tags: gru, gic, girclib, liblinux, olibc, libs

+ + + + + +]]>
https://gru.codeberg.page/blog/gru-devlog-19---gic-and-several-libs.html +https://gru.codeberg.page/blog/./gru-devlog-19---gic-and-several-libs.html +G1n +Sun, 05 Dec 2021 16:57:11 +0000
+ +GRU Devlog 17-18 - coreutils, EGG and ideas +Last week I didn’t make devlog because was busy and haven’t done anything useful except +mkdir for coreutils.

+ +

This week I started from try to make something in framebuffer but currently nothing, because +I can’t even understand why my code can’t see size of my display. I think E will require making +something like Elib for easier communicating with E (but it will be in very far future…)

+ +

Then I made echo and very simple ls for coreutils. I am going to add more flags to ls next week. +This week I also have made simple irc bot in python, so I will try to make simple clone of suckless ii +on C (i think name gic is now really good so if you have ideas please suggest them to me). +Currently I don’t reallly understand how to work with sockets but I will try to do something.

+ +

Hope you liked this post! If you would like to help us, contact me via email, xmpp or irc :)

+ +

tags: gru, coreutils, egg

+ + + + + +]]>
https://gru.codeberg.page/blog/gru-devlog-17-18---coreutils-egg-and-ideas.html +https://gru.codeberg.page/blog/./gru-devlog-17-18---coreutils-egg-and-ideas.html +G1n +Sun, 28 Nov 2021 17:06:52 +0000
+ +GRU Devlog 16 - ormp and EGG +This week i was working on one more new project - ormp. It will be terminal multiplexor. +Currently i am doing it in ncurses. For current time it is not working - can just handle input but not display it.

+ +

Also i have an idea for new projects - EGG (Extended/Exciting GRU GUI). I am planning some proj in this category - eggwm, eggterm, eggmenu and E. +E would be a new display server. We will need to have it for Orion in future. Currently i am planning to do it or on fbdev or on DRM/KMS.

+ +

Also now yemu can be compiled with different compilers, -pedantic flag was added to makefile and all errors fixed.

+ +

And now our channels are bridged via matterbridge: irc on ~chat, irc on libera and xmpp muc.

+ +

Hope you liked this post! If you would like to help us, contact me via email, xmpp or irc :)

+ +

tags: gru, ormp, egg, yemu, xmpp, irc

+ + + + + +]]>
https://gru.codeberg.page/blog/gru-devlog-16---ormp-and-egg.html +https://gru.codeberg.page/blog/./gru-devlog-16---ormp-and-egg.html +G1n +Sun, 14 Nov 2021 17:03:05 +0000
+ +GRU Devlog 15 - ocpu, yemu and licenses +This week wasn’t very productive. I was working on one of my personal projects.

+ +

I have added ADD for registers, INC, DEC and NOP instructions.

+ +

Also codeberg informed me that yemu has to have license, and I fast added MIT license to all our projects.

+ +

Hope you liked this post! If you would like to help me, contact me via email, xmpp or irc :)

+ +

tags: gru, ocpu, yemu, license

+ + + + + +]]>
https://gru.codeberg.page/blog/gru-devlog-15---ocpu-yemu-and-licenses.html +https://gru.codeberg.page/blog/./gru-devlog-15---ocpu-yemu-and-licenses.html +G1n +Sun, 07 Nov 2021 17:00:07 +0000
+ +GRU Devlog 14 - ocpu and yemu +This week I was working on ocpu emulator. So using it we can know if specifications can be implemented. +It helps me adding some description to it.

+ +

First I made yemu a bit modular, so you need to add several lines to main file and then building your emulator +based on template (that should be placed in docs one day). Now if someone would like to add some architecture to +our emulator they won’t need to rewrite it from scratch.

+ +

I also added –system flag to yemu so architecture can be choosen more user-friendly way.

+ +

Currently in ocpu emulator only mov and add instructions are implemented. +We also added some description to commands in specifications, so it is easier to understand what it should do

+ +

Hope you liked this post! If you would like to help me, contact me via email, xmpp or irc :)

+ +

tags: gru, yemu, ocpu

+ + + + + +]]>
https://gru.codeberg.page/blog/gru-devlog-14---ocpu-and-yemu.html +https://gru.codeberg.page/blog/./gru-devlog-14---ocpu-and-yemu.html +G1n +Sun, 31 Oct 2021 17:14:06 +0000
+ +GRU Devlog 13 - ocpu thoughts and some elecronics +This week was very busy week at school and I had no time for programming.

+ +

But in the start of week I was thinking about making ocpu specs more Turing-complete. +I still think it is not done but maybe it will in some time (and of course more description required).

+ +

But I had time to buy some transistors and other electronics. Currently I am trying to make half-adder.

+ +

I have created tiny log page - lolcpu. I am going to post there some of my +electronic ideas, circuits and progress in doing some electronic things.

+ +

Hope you liked this post! If you would like to help me, contact me via email, xmpp or irc :)

+ +

tags: gru, lolcpu, ocpu, transistors, electonics

+ + + + + +]]>
https://gru.codeberg.page/blog/gru-devlog-13---ocpu-thoughts-and-some-elecronics.html +https://gru.codeberg.page/blog/./gru-devlog-13---ocpu-thoughts-and-some-elecronics.html +G1n +Sun, 24 Oct 2021 16:05:58 +0000
+ +GRU Devlog 12 - yemu, gasm and ocpu +This week I have done several new instructions for yemu. For example all transfer instructions.

+ +

Also I have rewritten gasm to support 6502, published it and it should help me with debugging yemu. +It supports not very a lot instructions but I hope it is good start.

+ +

But I think the coolest what I did this week is ocpu proccessor specification. +Currently it is draft but i have already published it here. +I hope this specifications will be Turing complete and we will try to implement it in real world. +But firstly we need to make this specififcations complete, assembler and emulator for it.

+ +

Also smlckz’s idea was to make translator from ocpu assembler instructions to avr to emulate it on arduino!

+ +

Hope you liked this post! If you would like to help me, contact me via email, xmpp or irc :)

+ +

tags: gru, yemu, gasm, ocpu

+ + + + + +]]>
https://gru.codeberg.page/blog/gru-devlog-13---yemu-gasm-and-ocpu.html +https://gru.codeberg.page/blog/./gru-devlog-13---yemu-gasm-and-ocpu.html +G1n +Sun, 17 Oct 2021 17:10:17 +0000
+ +GRU Devlog 11 - yemu and channel on libera.chat +I am making this devlog a bit earlier, because I will be busy on weekends.

+ +

This week I didn’t have plan, but it seems I have done some things to yemu: added loading programs +from binary file and several instructions - TAX, TAY and NOP.

+ +

I think gasm will be made for 6502 firstly, because it is easier then x86 and it would help in +testing yemu.

+ +

I was trying to make some daily notes in Org Roam (and moved devlog notes there), but it wasn’t +very success, but I hope to do it more often :)

+ +

Also I have registered #gru channel on libera, so you can join us also on libera.chat :)

+ +

Hope you liked this post :). If you would like to help me, contact me via email, xmpp or irc :)

+ +

tags: gru, yemu, libera, org-mode, org-roam

+ + + + + +]]>
https://gru.codeberg.page/blog/gru-devlog-11---yemu-and-channel-on-liberachat.html +https://gru.codeberg.page/blog/./gru-devlog-11---yemu-and-channel-on-liberachat.html +G1n +Fri, 08 Oct 2021 15:18:16 +0000
+ +GRU Devlog 10 - orsh now like proper shell and gasm +Hooray! Today is 10’s GRU Devlog! :)

+ +

This week i was trying to make notes to org document, to not forget something and put TODOs +there for future weeks.

+ +

First several days was the most valuable - readline support and signal handling! +This means you can use emacs-like bindings there (but i think readline also supports vi bindings, +so maybe i will add them too!)

+ +

Also we now have very minimal completion support there :), but still proper function need to be added +for that (currently only filenames completion)

+ +

Orsh also has one session history, so you don’t need to rewrite command from scratch now

+ +

And I have started to use it as my main (but had some problems after chsh, so currently is autostarts after bash +and i can exit from there any time i will need)

+ +

Then I have started making our own assembler - gasm. Currently it only supports NOP, so i haven’t published it yet.

+ +

This week I also registered to ~news and shared devlog there (i think this devlog also will be there ;) ) +If you have lobste.rs account please contact me to invite me, if you can, because it may advertize GRU more!

+ +

Today (Sunday) we had first testing GRU meeting via Jitsi. Thanks to r1k for joining. +We need to make something like plan our schedule (to know about what to speak) and discuss meeting time better.

+ +

Hope you liked this post and you will join our XMPP muc (if you are not already there) :). +If you would like to help me, contact me via email, xmpp or irc :)

+ +

tags: gru, org-mode, gasm, orsh, meeting, lobste.rs, tilde.news

+ + + + + +]]>
https://gru.codeberg.page/blog/gru-devlog-10---orsh-now-like-proper-shell-and-gasm.html +https://gru.codeberg.page/blog/./gru-devlog-10---orsh-now-like-proper-shell-and-gasm.html +G1n +Sun, 03 Oct 2021 15:54:01 +0000
+ +GRU Devlog 9 - orsh, orion, bootloader, GRU xmpp room and logo +This week I didn’t commited a lot, but started some new projects. +I made orsh signal handling working (so it won’t exit on ^C) and homedir “handling” +(can replace homedir in prompt with ~, and you can use ‘cd ~’ or just ‘cd’ to change +dir to homedir)

+ +

Also I started making bootloader, but for now it can only detect what CPU is (intel if x86 and amd if x86_64), +some additional instructions (msr) and if apic is avalible.

+ +

I was trying to make something with orion fs, maybe it will use pak files for initrd. Currently i am making archiver +for it, but after that i will need to understand more how vfs working and rewrite initrd to use pak files.

+ +

We now have xmpp room (gru@conference.hmm.st) and logo! Thanks to chunk for it!

+ +

I was thinking about making weekly or monthly “conferences”. We could do it via jitsi tildeverse instance or tilde.tel +(tel.tilde.org.nz) conference. I think jitsi is better, but we should try tilde.tel confernce at least once, why not? :)

+ +

Hope you liked this post and you will join our XMPP muc :). If you would like to help me, contact me via email, xmpp or irc :)

+ +

tags: gru, orion, orsh, xmpp, tilde.tel, jitsi

+ + + + + +]]>
https://gru.codeberg.page/blog/gru-devlog-9---orsh-orion-bootloader-gru-xmpp-room-and-logo.html +https://gru.codeberg.page/blog/./gru-devlog-9---orsh-orion-bootloader-gru-xmpp-room-and-logo.html +G1n +Sun, 26 Sep 2021 16:59:17 +0000
+ +GRU Devlog 8 - orsh and published initrd +This week I have published initrd, but it is not working as expected.

+ +

Also I have started one more project - orsh. It is one more shell, but now in C. +Maybe it will be easier to port to Orion. It already supports ; but they are working a bit weird.

+ +

Also in orsh you can work with environment variables. +From today’s morning I am trying to replace bash with it, but still a lot need to be done.

+ +

Hope you liked this post and if you would like to help me, contact me via email, xmpp or irc :)

+ +

tags: gru, orsh, orion

+ + + + + +]]>
https://gru.codeberg.page/blog/gru-devlog-8---orsh-and-published-initrd.html +https://gru.codeberg.page/blog/./gru-devlog-8---orsh-and-published-initrd.html +G1n +Sun, 19 Sep 2021 16:18:12 +0000
+ +GRU Devlog 7 - keyboard, paging and WIP initrd in Orion +This week I was improving Orion. First I made keyboard working, next day paging! +Also I have added several new LibC functions. +Today I have made scrolling working.

+ +

Last few days I was trying to make initrd working +(this required heap implementing so I also did that but I don’t know if it works correctly). +Currently it can only output /dev directory.

+ +

But I made something wrong with %x in printf and it can display weird chars first +and then contents of files!

+ +

Hope you liked this post and if you would like to help me, contact me via email, xmpp or irc :)

+ +

tags: gru, orion

+ + + + + +]]>
https://gru.codeberg.page/blog/gru-devlog-7---keyboard-paging-and-wip-initrd-in-orion.html +https://gru.codeberg.page/blog/./gru-devlog-7---keyboard-paging-and-wip-initrd-in-orion.html +G1n +Sun, 12 Sep 2021 17:10:09 +0000
+ +GRU Devlog 6 - yemu, published gxt and interrupts working in Orion +This week I have published gxt, but it currently works as more (only down scrolling). +Also it has a lot of of runtime error (Segmentation fault and others).

+ +

I have started working on yemu - Yet another EMUlator. It currently supports only 6502 +proccessor with tiny number of instructions (LDA, LDX and LDY)

+ +

Today we have fixed interrupts in Orion and now I can implement timer, paging, keyboard +and a lot of other things (thanks to quinn and smlckz from tilde.chat)

+ +

Hope you liked this post and if you would like to help me, +contact me via email, xmpp or irc :)

+ +

tags: gru, gxt, yemu, orion

+ + + + + +]]>
https://gru.codeberg.page/blog/gru-devlog-6---yemu-published-gxt-and-interrupts-working-in-orion.html +https://gru.codeberg.page/blog/./gru-devlog-6---yemu-published-gxt-and-interrupts-working-in-orion.html +G1n +Sun, 05 Sep 2021 16:33:09 +0000
+ +GRU Devlog 5 - First contribution from other person, coreutils and gxt (tui text editor) +This week I had a lot of new ideas. But I think we have to work on something that +have already been started. +Also we now have one more coreutils rewrite +(now on C to more easily port it to Orion in future).

+ +

Also i have started working on some +projects that is not ready to be published yet. One of them is gxt - tui text editor.

+ +

Currently it can only move cursor and display files. But I think I’ll publish it next week +when editing will be working.

+ +

Bad news is that my school lessons will start next week so maybe this devlogs won’t be +published every week, because of not enough work done. But I don’t know, maybe I’ll have +enough time.

+ +

Also good news - we have first contribution on codeberg to grsh. I didn’t know this person +(because he is not from tildeverse :) ), so it is cool!

+ +

Hope you liked this devlog! If you can somehow help us, please contribute to our projects +on tildegit/codeberg and/or message me in someway :)

+ +

tags: gru, coreutils, contribution, gxt, grsh

+ + + + + +]]>
https://gru.codeberg.page/blog/gru-devlog-5---first-contribution-from-other-person-coreutils-and-gxt-tui-text-editor.html +https://gru.codeberg.page/blog/./gru-devlog-5---first-contribution-from-other-person-coreutils-and-gxt-tui-text-editor.html +G1n +Sun, 29 Aug 2021 16:27:38 +0000
+ +GRU Devlog 4 - more projects started, webpage for GRU and organizations on tildegit/codeberg +In first days of this week I thought it will be not very productive. +But I was wrong.

+ +

We now have webpage and organizations on tildegit/codeberg:

+ +

https://g1n.ttm.sh/gru/

+ +

Also I am working on some new projects:

+ +
    +
  • orcc - GRU/Orion Compilers Collection (but currently I am working only on lexer so it is not published yet)

  • +
  • gasm - GRU assembler (maybe will be part of GRU binutils. Also not published yet)

  • +
  • hexutils - I think hexdump, xxd and some other utils will be in this project

  • +
+ + +

Also I tryed to advertize GRU on ~chat, some users liked us, +so maybe soon someone will help me with all this.

+ +

And of course if you can help me please contact me in someway! :)

+ +

tags: gru, orcc, gasm, hexutils, webpage

+ + + + + +]]>
https://gru.codeberg.page/blog/gru-devlog-4---more-projects-started-webpage-for-gru-and-organizations-on-tildegitcodeberg.html +https://gru.codeberg.page/blog/./gru-devlog-4---more-projects-started-webpage-for-gru-and-organizations-on-tildegitcodeberg.html +G1n +Sun, 22 Aug 2021 16:08:03 +0000
+ +GRU DevLog 3 - Orion and dreams about GRU software future +This week I was trying to make interrupts, paging and other memory things working in Orion. +I found this guide and tried to follow it without rewriting the whole project: +http://www.jamesmolloy.co.uk/index.html

+ +

For now only Global Descriptor Table maybe working.

+ +

My current goals/dreams:

+ +
    +
  • make filesystem (the coolest would be make Ext2 driver)

  • +
  • build GCC hosted compiler (this will help GCC understand our OS better)

  • +
+ + +

My very future dreams:

+ +
    +
  • make kernel, libs, ports and soft in different repos

  • +
  • make proper way to make “distros” on our kernel

  • +
  • make some website with mirror of ports scripts (like in Serenity OS but not in one repo with +everything and tool for searching and downloading ports from that mirror)

  • +
  • maybe (if i will work a lot on this projects) I’ll make one more account on tilde.team +for our organisation (domain name - gru.ttm.sh, is cool), but i’ll ask admins about that

  • +
+ + +

Also I think Orion need new name because i found several projects with this name :)

+ +

Some ideas about the GRU name:

+ +
    +
  • GRU rocks (or rocking) UNIX

  • +
  • GloRious UNIX

  • +
  • GloRious Union

  • +
+ + +

If you can help me or have some ideas (name/names or anything else) contact me via email +or any other type of contact (irc: g1n on tilde.chat, xmpp: g1n@hmm.st)

+ +

tags: gru, orion, dreams

+ + + + + + + + +]]>
https://gru.codeberg.page/blog/gru-devlog-3---orion-and-dreams-about-gru-software-future.html +https://gru.codeberg.page/blog/./gru-devlog-3---orion-and-dreams-about-gru-software-future.html +G1n +Sun, 15 Aug 2021 17:11:33 +0000
+ +GRU DevLog 2 - Orion +This week I was developing new OS - Orion.

+ +

I don’t understand very basic osdev thing so I decided to make OS on C and Asm. +Currently that can just output text (with printf arguments) on screen and serial. +Now gros is much cooler than Orion - it has input, interupts and a lot of else. +But maybe I’ll understand OSdev better. +Currently working on GDT (global descriptor table) and than will work on +interrupts and exceptions.

+ +

Of course if you can help me contact me throught email or in other ways!

+ +

tags: gru, orion

+ + + + + + + + +]]>
https://gru.codeberg.page/blog/gru-devlog-2---orion.html +https://gru.codeberg.page/blog/./gru-devlog-2---orion.html +G1n +Sun, 08 Aug 2021 14:11:43 +0000
+ +GRU DevLog 1 - gros sources published and add wc to grutils +I didn’t make a lot work this week, so i think this devlogs should be renamed from “week number” to just “number” +Ok, so what i did this week: +- Add wc to grutils +- Published gros +- Add basic shell and some commands for gros

+ +

I know that is not a lot, but i was reading some osdev articles and books. +Currently I would like to implement basic filesystem but i don’t know what to do.

+ +

Some goals for gros (I will add that to gros readme): +- Filesystem (FAT or Ext2) +- ELF or other executable formats +- LibC (for compiling C programs) +- Maybe basic networking but after all of that

+ +

All code in osdev wiki is for C so I need to implement it myself (or port existing rust code)

+ +

If you can help me somehow please contact me via email (g1n@ttm.sh) or in other ways (~chat irc, xmpp)

+ +

tags: gru, grutils, gros

+ + + + + + + + +]]>
https://gru.codeberg.page/blog/gru-devlog-1---gros-sources-published-and-add-wc-to-grutils.html +https://gru.codeberg.page/blog/./gru-devlog-1---gros-sources-published-and-add-wc-to-grutils.html +G1n +Sun, 01 Aug 2021 16:12:04 +0000
+ +GRU DevLog Week 0 - grsh, grutils and start of gros +So I have started new project this week - grsh! It is shell written on Rust. Also, for now, other rewrites of coreutils are there.

+ +

What grsh can do for this moment: echo some variables (pwd, user, home, status of previous command using $?) and text; true, false, : - set status; pwd shows current dir, also comments and cd working, basic piping (thanks to that article and of course executing not builtin command also working.

+ +

Some grutils that I made: ls, touch, mkdir/rmdir, rm, grep, head/tail, yes, cat.

+ +

TODOs exist in grsh repo - so you can read there some of my plans.

+ +

Yesterday i have started GROS - OS on Rust! But I haven’t published code yet because it not have that minimum of funcionality that i want. Thanks for that site for teaching how to make basics - https://os.phil-opp.com

+ +

So it was first of GRU Devlog! Thanks for reading! If you want to contribute to some of that project write me an email - g1n@ttm.sh , or contact me in other ways

+ +

tags: gru, grsh, grutils, gros

+ + + + + + + + +]]>
https://gru.codeberg.page/blog/gru-devlog-week-0---grsh-grutils-and-start-of-gros.html +https://gru.codeberg.page/blog/./gru-devlog-week-0---grsh-grutils-and-start-of-gros.html +G1n +Sun, 25 Jul 2021 17:22:59 +0000
+
diff --git a/blog/gru-devlog-1---gros-sources-published-and-add-wc-to-grutils.html b/blog/gru-devlog-1---gros-sources-published-and-add-wc-to-grutils.html new file mode 100644 index 0000000..f9a8861 --- /dev/null +++ b/blog/gru-devlog-1---gros-sources-published-and-add-wc-to-grutils.html @@ -0,0 +1,60 @@ + + + + + + + +GRU DevLog 1 - gros sources published and add wc to grutils + +
+
+
+

GRU's blog

+
GRU's blog
+
+
+ +

+GRU DevLog 1 - gros sources published and add wc to grutils +

+ +
August 01, 2021 — +G1n +
+ + +

I didn’t make a lot work this week, so i think this devlogs should be renamed from “week number” to just “number” +Ok, so what i did this week: +- Add wc to grutils +- Published gros +- Add basic shell and some commands for gros

+ +

I know that is not a lot, but i was reading some osdev articles and books. +Currently I would like to implement basic filesystem but i don’t know what to do.

+ +

Some goals for gros (I will add that to gros readme): +- Filesystem (FAT or Ext2) +- ELF or other executable formats +- LibC (for compiling C programs) +- Maybe basic networking but after all of that

+ +

All code in osdev wiki is for C so I need to implement it myself (or port existing rust code)

+ +

If you can help me somehow please contact me via email (g1n@ttm.sh) or in other ways (~chat irc, xmpp)

+ +

tags: gru, grutils, gros

+ + + + + + + + + +
+ +
+ diff --git a/blog/gru-devlog-1---gros-sources-published-and-add-wc-to-grutils.md b/blog/gru-devlog-1---gros-sources-published-and-add-wc-to-grutils.md new file mode 100644 index 0000000..897f153 --- /dev/null +++ b/blog/gru-devlog-1---gros-sources-published-and-add-wc-to-grutils.md @@ -0,0 +1,22 @@ +GRU DevLog 1 - gros sources published and add wc to grutils + +I didn't make a lot work this week, so i think this devlogs should be renamed from "week number" to just "number" +Ok, so what i did this week: +- Add wc to grutils +- Published gros +- Add basic shell and some commands for gros + +I know that is not a lot, but i was reading some osdev articles and books. +Currently I would like to implement basic filesystem but i don't know what to do. + +Some goals for gros (I will add that to gros readme): +- Filesystem (FAT or Ext2) +- ELF or other executable formats +- LibC (for compiling C programs) +- Maybe basic networking but after all of that + +All code in osdev wiki is for C so I need to implement it myself (or port existing rust code) + +If you can help me somehow please contact me via email (g1n@ttm.sh) or in other ways (~chat irc, xmpp) + +tags: gru, grutils, gros diff --git a/blog/gru-devlog-10---orsh-now-like-proper-shell-and-gasm.html b/blog/gru-devlog-10---orsh-now-like-proper-shell-and-gasm.html new file mode 100644 index 0000000..f01d6ac --- /dev/null +++ b/blog/gru-devlog-10---orsh-now-like-proper-shell-and-gasm.html @@ -0,0 +1,66 @@ + + + + + + + +GRU Devlog 10 - orsh now like proper shell and gasm + +
+
+
+

GRU's blog

+
GRU's blog
+
+
+ +

+GRU Devlog 10 - orsh now like proper shell and gasm +

+ +
October 03, 2021 — +G1n +
+ + +

Hooray! Today is 10’s GRU Devlog! :)

+ +

This week i was trying to make notes to org document, to not forget something and put TODOs +there for future weeks.

+ +

First several days was the most valuable - readline support and signal handling! +This means you can use emacs-like bindings there (but i think readline also supports vi bindings, +so maybe i will add them too!)

+ +

Also we now have very minimal completion support there :), but still proper function need to be added +for that (currently only filenames completion)

+ +

Orsh also has one session history, so you don’t need to rewrite command from scratch now

+ +

And I have started to use it as my main (but had some problems after chsh, so currently is autostarts after bash +and i can exit from there any time i will need)

+ +

Then I have started making our own assembler - gasm. Currently it only supports NOP, so i haven’t published it yet.

+ +

This week I also registered to ~news and shared devlog there (i think this devlog also will be there ;) ) +If you have lobste.rs account please contact me to invite me, if you can, because it may advertize GRU more!

+ +

Today (Sunday) we had first testing GRU meeting via Jitsi. Thanks to r1k for joining. +We need to make something like plan our schedule (to know about what to speak) and discuss meeting time better.

+ +

Hope you liked this post and you will join our XMPP muc (if you are not already there) :). +If you would like to help me, contact me via email, xmpp or irc :)

+ +

tags: gru, org-mode, gasm, orsh, meeting, lobste.rs, tilde.news

+ + + + + + +
+ +
+ diff --git a/blog/gru-devlog-10---orsh-now-like-proper-shell-and-gasm.md b/blog/gru-devlog-10---orsh-now-like-proper-shell-and-gasm.md new file mode 100644 index 0000000..abfee57 --- /dev/null +++ b/blog/gru-devlog-10---orsh-now-like-proper-shell-and-gasm.md @@ -0,0 +1,31 @@ +GRU Devlog 10 - orsh now like proper shell and gasm + +Hooray! Today is 10's GRU Devlog! :) + +This week i was trying to make notes to org document, to not forget something and put TODOs +there for future weeks. + +First several days was the most valuable - readline support and signal handling! +This means you can use emacs-like bindings there (but i think readline also supports vi bindings, +so maybe i will add them too!) + +Also we now have very minimal completion support there :), but still proper function need to be added +for that (currently only filenames completion) + +Orsh also has one session history, so you don't need to rewrite command from scratch now + +And I have started to use it as my main (but had some problems after chsh, so currently is autostarts after bash +and i can exit from there any time i will need) + +Then I have started making our own assembler - gasm. Currently it only supports NOP, so i haven't published it yet. + +This week I also registered to ~news and shared devlog there (i think this devlog also will be there ;) ) +If you have lobste.rs account please contact me to invite me, if you can, because it may advertize GRU more! + +Today (Sunday) we had first testing GRU meeting via Jitsi. Thanks to r1k for joining. +We need to make something like plan our schedule (to know about what to speak) and discuss meeting time better. + +Hope you liked this post and you will join our XMPP muc (if you are not already there) :). +If you would like to help me, contact me via email, xmpp or irc :) + +tags: gru, org-mode, gasm, orsh, meeting, lobste.rs, tilde.news diff --git a/blog/gru-devlog-11---yemu-and-channel-on-liberachat.html b/blog/gru-devlog-11---yemu-and-channel-on-liberachat.html new file mode 100644 index 0000000..9f4ad01 --- /dev/null +++ b/blog/gru-devlog-11---yemu-and-channel-on-liberachat.html @@ -0,0 +1,53 @@ + + + + + + + +GRU Devlog 11 - yemu and channel on libera.chat + +
+
+
+

GRU's blog

+
GRU's blog
+
+
+ +

+GRU Devlog 11 - yemu and channel on libera.chat +

+ +
October 08, 2021 — +G1n +
+ + +

I am making this devlog a bit earlier, because I will be busy on weekends.

+ +

This week I didn’t have plan, but it seems I have done some things to yemu: added loading programs +from binary file and several instructions - TAX, TAY and NOP.

+ +

I think gasm will be made for 6502 firstly, because it is easier then x86 and it would help in +testing yemu.

+ +

I was trying to make some daily notes in Org Roam (and moved devlog notes there), but it wasn’t +very success, but I hope to do it more often :)

+ +

Also I have registered #gru channel on libera, so you can join us also on libera.chat :)

+ +

Hope you liked this post :). If you would like to help me, contact me via email, xmpp or irc :)

+ +

tags: gru, yemu, libera, org-mode, org-roam

+ + + + + + +
+ +
+ diff --git a/blog/gru-devlog-11---yemu-and-channel-on-liberachat.md b/blog/gru-devlog-11---yemu-and-channel-on-liberachat.md new file mode 100644 index 0000000..f03a15c --- /dev/null +++ b/blog/gru-devlog-11---yemu-and-channel-on-liberachat.md @@ -0,0 +1,18 @@ +GRU Devlog 11 - yemu and channel on libera.chat + +I am making this devlog a bit earlier, because I will be busy on weekends. + +This week I didn't have plan, but it seems I have done some things to yemu: added loading programs +from binary file and several instructions - TAX, TAY and NOP. + +I think gasm will be made for 6502 firstly, because it is easier then x86 and it would help in +testing yemu. + +I was trying to make some daily notes in Org Roam (and moved devlog notes there), but it wasn't +very success, but I hope to do it more often :) + +Also I have registered #gru channel on libera, so you can join us also on libera.chat :) + +Hope you liked this post :). If you would like to help me, contact me via email, xmpp or irc :) + +tags: gru, yemu, libera, org-mode, org-roam diff --git a/blog/gru-devlog-13---ocpu-thoughts-and-some-elecronics.html b/blog/gru-devlog-13---ocpu-thoughts-and-some-elecronics.html new file mode 100644 index 0000000..7f8e75c --- /dev/null +++ b/blog/gru-devlog-13---ocpu-thoughts-and-some-elecronics.html @@ -0,0 +1,50 @@ + + + + + + + +GRU Devlog 13 - ocpu thoughts and some elecronics + +
+
+
+

GRU's blog

+
GRU's blog
+
+
+ +

+GRU Devlog 13 - ocpu thoughts and some elecronics +

+ +
October 24, 2021 — +G1n +
+ + +

This week was very busy week at school and I had no time for programming.

+ +

But in the start of week I was thinking about making ocpu specs more Turing-complete. +I still think it is not done but maybe it will in some time (and of course more description required).

+ +

But I had time to buy some transistors and other electronics. Currently I am trying to make half-adder.

+ +

I have created tiny log page - lolcpu. I am going to post there some of my +electronic ideas, circuits and progress in doing some electronic things.

+ +

Hope you liked this post! If you would like to help me, contact me via email, xmpp or irc :)

+ +

tags: gru, lolcpu, ocpu, transistors, electonics

+ + + + + + +
+ +
+ diff --git a/blog/gru-devlog-13---ocpu-thoughts-and-some-elecronics.md b/blog/gru-devlog-13---ocpu-thoughts-and-some-elecronics.md new file mode 100644 index 0000000..800d8b7 --- /dev/null +++ b/blog/gru-devlog-13---ocpu-thoughts-and-some-elecronics.md @@ -0,0 +1,15 @@ +GRU Devlog 13 - ocpu thoughts and some elecronics + +This week was very busy week at school and I had no time for programming. + +But in the start of week I was thinking about making ocpu specs more Turing-complete. +I still think it is not done but maybe it will in some time (and of course more description required). + +But I had time to buy some transistors and other electronics. Currently I am trying to make half-adder. + +I have created tiny log page - [lolcpu](https://g1n.ttm.sh/lolcpu/). I am going to post there some of my +electronic ideas, circuits and progress in doing some electronic things. + +Hope you liked this post! If you would like to help me, contact me via email, xmpp or irc :) + +tags: gru, lolcpu, ocpu, transistors, electonics diff --git a/blog/gru-devlog-13---yemu-gasm-and-ocpu.html b/blog/gru-devlog-13---yemu-gasm-and-ocpu.html new file mode 100644 index 0000000..402397a --- /dev/null +++ b/blog/gru-devlog-13---yemu-gasm-and-ocpu.html @@ -0,0 +1,52 @@ + + + + + + + +GRU Devlog 12 - yemu, gasm and ocpu + +
+
+
+

GRU's blog

+
GRU's blog
+
+
+ +

+GRU Devlog 12 - yemu, gasm and ocpu +

+ +
October 17, 2021 — +G1n +
+ + +

This week I have done several new instructions for yemu. For example all transfer instructions.

+ +

Also I have rewritten gasm to support 6502, published it and it should help me with debugging yemu. +It supports not very a lot instructions but I hope it is good start.

+ +

But I think the coolest what I did this week is ocpu proccessor specification. +Currently it is draft but i have already published it here. +I hope this specifications will be Turing complete and we will try to implement it in real world. +But firstly we need to make this specififcations complete, assembler and emulator for it.

+ +

Also smlckz’s idea was to make translator from ocpu assembler instructions to avr to emulate it on arduino!

+ +

Hope you liked this post! If you would like to help me, contact me via email, xmpp or irc :)

+ +

tags: gru, yemu, gasm, ocpu

+ + + + + + +
+ +
+ diff --git a/blog/gru-devlog-13---yemu-gasm-and-ocpu.md b/blog/gru-devlog-13---yemu-gasm-and-ocpu.md new file mode 100644 index 0000000..ecefb05 --- /dev/null +++ b/blog/gru-devlog-13---yemu-gasm-and-ocpu.md @@ -0,0 +1,17 @@ +GRU Devlog 12 - yemu, gasm and ocpu + +This week I have done several new instructions for yemu. For example all transfer instructions. + +Also I have rewritten gasm to support 6502, published it and it should help me with debugging yemu. +It supports not very a lot instructions but I hope it is good start. + +But I think the coolest what I did this week is ocpu proccessor specification. +Currently it is draft but i have already published it [here](https://g1n.ttm.sh/gru/ocpu). +I hope this specifications will be Turing complete and we will try to implement it in real world. +But firstly we need to make this specififcations complete, assembler and emulator for it. + +Also smlckz's idea was to make translator from ocpu assembler instructions to avr to emulate it on arduino! + +Hope you liked this post! If you would like to help me, contact me via email, xmpp or irc :) + +tags: gru, yemu, gasm, ocpu diff --git a/blog/gru-devlog-14---ocpu-and-yemu.html b/blog/gru-devlog-14---ocpu-and-yemu.html new file mode 100644 index 0000000..b1bbbf3 --- /dev/null +++ b/blog/gru-devlog-14---ocpu-and-yemu.html @@ -0,0 +1,52 @@ + + + + + + + +GRU Devlog 14 - ocpu and yemu + +
+
+
+

GRU's blog

+
GRU's blog
+
+
+ +

+GRU Devlog 14 - ocpu and yemu +

+ +
October 31, 2021 — +G1n +
+ + +

This week I was working on ocpu emulator. So using it we can know if specifications can be implemented. +It helps me adding some description to it.

+ +

First I made yemu a bit modular, so you need to add several lines to main file and then building your emulator +based on template (that should be placed in docs one day). Now if someone would like to add some architecture to +our emulator they won’t need to rewrite it from scratch.

+ +

I also added –system flag to yemu so architecture can be choosen more user-friendly way.

+ +

Currently in ocpu emulator only mov and add instructions are implemented. +We also added some description to commands in specifications, so it is easier to understand what it should do

+ +

Hope you liked this post! If you would like to help me, contact me via email, xmpp or irc :)

+ +

tags: gru, yemu, ocpu

+ + + + + + +
+ +
+ diff --git a/blog/gru-devlog-14---ocpu-and-yemu.md b/blog/gru-devlog-14---ocpu-and-yemu.md new file mode 100644 index 0000000..0bc3385 --- /dev/null +++ b/blog/gru-devlog-14---ocpu-and-yemu.md @@ -0,0 +1,17 @@ +GRU Devlog 14 - ocpu and yemu + +This week I was working on ocpu emulator. So using it we can know if specifications can be implemented. +It helps me adding some description to it. + +First I made yemu a bit modular, so you need to add several lines to main file and then building your emulator +based on template (that should be placed in docs one day). Now if someone would like to add some architecture to +our emulator they won't need to rewrite it from scratch. + +I also added --system flag to yemu so architecture can be choosen more user-friendly way. + +Currently in ocpu emulator only mov and add instructions are implemented. +We also added some description to commands in specifications, so it is easier to understand what it should do + +Hope you liked this post! If you would like to help me, contact me via email, xmpp or irc :) + +tags: gru, yemu, ocpu diff --git a/blog/gru-devlog-15---ocpu-yemu-and-licenses.html b/blog/gru-devlog-15---ocpu-yemu-and-licenses.html new file mode 100644 index 0000000..7affa00 --- /dev/null +++ b/blog/gru-devlog-15---ocpu-yemu-and-licenses.html @@ -0,0 +1,46 @@ + + + + + + + +GRU Devlog 15 - ocpu, yemu and licenses + +
+
+
+

GRU's blog

+
GRU's blog
+
+
+ +

+GRU Devlog 15 - ocpu, yemu and licenses +

+ +
November 07, 2021 — +G1n +
+ + +

This week wasn’t very productive. I was working on one of my personal projects.

+ +

I have added ADD for registers, INC, DEC and NOP instructions.

+ +

Also codeberg informed me that yemu has to have license, and I fast added MIT license to all our projects.

+ +

Hope you liked this post! If you would like to help me, contact me via email, xmpp or irc :)

+ +

tags: gru, ocpu, yemu, license

+ + + + + + +
+ +
+ diff --git a/blog/gru-devlog-15---ocpu-yemu-and-licenses.md b/blog/gru-devlog-15---ocpu-yemu-and-licenses.md new file mode 100644 index 0000000..1e19820 --- /dev/null +++ b/blog/gru-devlog-15---ocpu-yemu-and-licenses.md @@ -0,0 +1,11 @@ +GRU Devlog 15 - ocpu, yemu and licenses + +This week wasn't very productive. I was working on one of my personal projects. + +I have added ADD for registers, INC, DEC and NOP instructions. + +Also codeberg informed me that yemu has to have license, and I fast added MIT license to all our projects. + +Hope you liked this post! If you would like to help me, contact me via email, xmpp or irc :) + +tags: gru, ocpu, yemu, license diff --git a/blog/gru-devlog-16---ormp-and-egg.html b/blog/gru-devlog-16---ormp-and-egg.html new file mode 100644 index 0000000..efd938b --- /dev/null +++ b/blog/gru-devlog-16---ormp-and-egg.html @@ -0,0 +1,50 @@ + + + + + + + +GRU Devlog 16 - ormp and EGG + +
+
+
+

GRU's blog

+
GRU's blog
+
+
+ +

+GRU Devlog 16 - ormp and EGG +

+ +
November 14, 2021 — +G1n +
+ + +

This week i was working on one more new project - ormp. It will be terminal multiplexor. +Currently i am doing it in ncurses. For current time it is not working - can just handle input but not display it.

+ +

Also i have an idea for new projects - EGG (Extended/Exciting GRU GUI). I am planning some proj in this category - eggwm, eggterm, eggmenu and E. +E would be a new display server. We will need to have it for Orion in future. Currently i am planning to do it or on fbdev or on DRM/KMS.

+ +

Also now yemu can be compiled with different compilers, -pedantic flag was added to makefile and all errors fixed.

+ +

And now our channels are bridged via matterbridge: irc on ~chat, irc on libera and xmpp muc.

+ +

Hope you liked this post! If you would like to help us, contact me via email, xmpp or irc :)

+ +

tags: gru, ormp, egg, yemu, xmpp, irc

+ + + + + + +
+ +
+ diff --git a/blog/gru-devlog-16---ormp-and-egg.md b/blog/gru-devlog-16---ormp-and-egg.md new file mode 100644 index 0000000..2d8fb93 --- /dev/null +++ b/blog/gru-devlog-16---ormp-and-egg.md @@ -0,0 +1,15 @@ +GRU Devlog 16 - ormp and EGG + +This week i was working on one more new project - ormp. It will be terminal multiplexor. +Currently i am doing it in ncurses. For current time it is not working - can just handle input but not display it. + +Also i have an idea for new projects - EGG (Extended/Exciting GRU GUI). I am planning some proj in this category - eggwm, eggterm, eggmenu and E. +E would be a new display server. We will need to have it for Orion in future. Currently i am planning to do it or on fbdev or on DRM/KMS. + +Also now yemu can be compiled with different compilers, -pedantic flag was added to makefile and all errors fixed. + +And now our channels are bridged via matterbridge: irc on ~chat, irc on libera and xmpp muc. + +Hope you liked this post! If you would like to help us, contact me via email, xmpp or irc :) + +tags: gru, ormp, egg, yemu, xmpp, irc diff --git a/blog/gru-devlog-17-18---coreutils-egg-and-ideas.html b/blog/gru-devlog-17-18---coreutils-egg-and-ideas.html new file mode 100644 index 0000000..b77343d --- /dev/null +++ b/blog/gru-devlog-17-18---coreutils-egg-and-ideas.html @@ -0,0 +1,52 @@ + + + + + + + +GRU Devlog 17-18 - coreutils, EGG and ideas + +
+
+
+

GRU's blog

+
GRU's blog
+
+
+ +

+GRU Devlog 17-18 - coreutils, EGG and ideas +

+ +
November 28, 2021 — +G1n +
+ + +

Last week I didn’t make devlog because was busy and haven’t done anything useful except +mkdir for coreutils.

+ +

This week I started from try to make something in framebuffer but currently nothing, because +I can’t even understand why my code can’t see size of my display. I think E will require making +something like Elib for easier communicating with E (but it will be in very far future…)

+ +

Then I made echo and very simple ls for coreutils. I am going to add more flags to ls next week. +This week I also have made simple irc bot in python, so I will try to make simple clone of suckless ii +on C (i think name gic is now really good so if you have ideas please suggest them to me). +Currently I don’t reallly understand how to work with sockets but I will try to do something.

+ +

Hope you liked this post! If you would like to help us, contact me via email, xmpp or irc :)

+ +

tags: gru, coreutils, egg

+ + + + + + +
+ +
+ diff --git a/blog/gru-devlog-17-18---coreutils-egg-and-ideas.md b/blog/gru-devlog-17-18---coreutils-egg-and-ideas.md new file mode 100644 index 0000000..967f3eb --- /dev/null +++ b/blog/gru-devlog-17-18---coreutils-egg-and-ideas.md @@ -0,0 +1,17 @@ +GRU Devlog 17-18 - coreutils, EGG and ideas + +Last week I didn't make devlog because was busy and haven't done anything useful except +mkdir for coreutils. + +This week I started from try to make something in framebuffer but currently nothing, because +I can't even understand why my code can't see size of my display. I think E will require making +something like Elib for easier communicating with E (but it will be in very far future...) + +Then I made echo and very simple ls for coreutils. I am going to add more flags to ls next week. +This week I also have made simple irc bot in python, so I will try to make simple clone of suckless ii +on C (i think name gic is now really good so if you have ideas please suggest them to me). +Currently I don't reallly understand how to work with sockets but I will try to do something. + +Hope you liked this post! If you would like to help us, contact me via email, xmpp or irc :) + +tags: gru, coreutils, egg diff --git a/blog/gru-devlog-19---gic-and-several-libs.html b/blog/gru-devlog-19---gic-and-several-libs.html new file mode 100644 index 0000000..5bb1824 --- /dev/null +++ b/blog/gru-devlog-19---gic-and-several-libs.html @@ -0,0 +1,61 @@ + + + + + + + +GRU Devlog 19 - gic and several libs + +
+
+
+

GRU's blog

+
GRU's blog
+
+
+ +

+GRU Devlog 19 - gic and several libs +

+ +
December 05, 2021 — +G1n +
+ + +

This week started with making gic (maybe name will be change). As I have written before +it is going to be suckless ii clone. Also I started making girclib - simple C library for irc +protocol. I think it will be published as separate project, because I would like to make it +for both: client and server. I don’t yet how it will be done but we will see…

+ +

Then I thought that would be cool to have own libc, but have no knowledge how it speaks with OS. +Then I understood that on linux it is working via syscalls. So started making liblinux - +C library for linux syscalls. Using it we won’t need to use assembly a lot in our libc. Currently +write and read syscalls are done and programmer can use it if passed -I, -L and -l flags to compiler. +And it is already published! (check codeberg or tildegit)

+ +

After understanding how to create proper makefile with liblinux, I started making olibc. Currently +it has very tiny number of features. But string.h is mostly done! I don’t know when I will fill that +it will be ready enough to be published, but hope to have useful functions and test suit there till +that time.

+ +

When olibc will be done enough I am going to start making C compiler (already have some code, but it +is old and I not understand how it works, so need to be rewritten). Also I hope that we will have +enough toolchain (or I will have enough knowledge to implement things that are not done faster) +for our own Linux or BSD distribution. But that will be in future…

+ +

Hope you liked this post! If you would like to help us, contact me via email, xmpp or irc :)

+ +

tags: gru, gic, girclib, liblinux, olibc, libs

+ + + + + + +
+ +
+ diff --git a/blog/gru-devlog-19---gic-and-several-libs.md b/blog/gru-devlog-19---gic-and-several-libs.md new file mode 100644 index 0000000..7fe4958 --- /dev/null +++ b/blog/gru-devlog-19---gic-and-several-libs.md @@ -0,0 +1,26 @@ +GRU Devlog 19 - gic and several libs + +This week started with making gic (maybe name will be change). As I have written before +it is going to be suckless ii clone. Also I started making girclib - simple C library for irc +protocol. I think it will be published as separate project, because I would like to make it +for both: client and server. I don't yet how it will be done but we will see... + +Then I thought that would be cool to have own libc, but have no knowledge how it speaks with OS. +Then I understood that on linux it is working via syscalls. So started making liblinux - +C library for linux syscalls. Using it we won't need to use assembly a lot in our libc. Currently +write and read syscalls are done and programmer can use it if passed -I, -L and -l flags to compiler. +And it is already published! (check codeberg or tildegit) + +After understanding how to create proper makefile with liblinux, I started making olibc. Currently +it has very tiny number of features. But string.h is mostly done! I don't know when I will fill that +it will be ready enough to be published, but hope to have useful functions and test suit there till +that time. + +When olibc will be done enough I am going to start making C compiler (already have some code, but it +is old and I not understand how it works, so need to be rewritten). Also I hope that we will have +enough toolchain (or I will have enough knowledge to implement things that are not done faster) +for our own Linux or BSD distribution. But that will be in future... + +Hope you liked this post! If you would like to help us, contact me via email, xmpp or irc :) + +tags: gru, gic, girclib, liblinux, olibc, libs diff --git a/blog/gru-devlog-2---orion.html b/blog/gru-devlog-2---orion.html new file mode 100644 index 0000000..c43a88d --- /dev/null +++ b/blog/gru-devlog-2---orion.html @@ -0,0 +1,52 @@ + + + + + + + +GRU DevLog 2 - Orion + +
+
+
+

GRU's blog

+
GRU's blog
+
+
+ +

+GRU DevLog 2 - Orion +

+ +
August 08, 2021 — +G1n +
+ + +

This week I was developing new OS - Orion.

+ +

I don’t understand very basic osdev thing so I decided to make OS on C and Asm. +Currently that can just output text (with printf arguments) on screen and serial. +Now gros is much cooler than Orion - it has input, interupts and a lot of else. +But maybe I’ll understand OSdev better. +Currently working on GDT (global descriptor table) and than will work on +interrupts and exceptions.

+ +

Of course if you can help me contact me throught email or in other ways!

+ +

tags: gru, orion

+ + + + + + + + + +
+ +
+ diff --git a/blog/gru-devlog-2---orion.md b/blog/gru-devlog-2---orion.md new file mode 100644 index 0000000..0ba6dbd --- /dev/null +++ b/blog/gru-devlog-2---orion.md @@ -0,0 +1,14 @@ +GRU DevLog 2 - Orion + +This week I was developing new OS - Orion. + +I don't understand very basic osdev thing so I decided to make OS on C and Asm. +Currently that can just output text (with printf arguments) on screen and serial. +Now gros is much cooler than Orion - it has input, interupts and a lot of else. +But maybe I'll understand OSdev better. +Currently working on GDT (global descriptor table) and than will work on +interrupts and exceptions. + +Of course if you can help me contact me throught email or in other ways! + +tags: gru, orion diff --git a/blog/gru-devlog-20---olibc.html b/blog/gru-devlog-20---olibc.html new file mode 100644 index 0000000..8571e5d --- /dev/null +++ b/blog/gru-devlog-20---olibc.html @@ -0,0 +1,50 @@ + + + + + + + +GRU Devlog 20 - olibc + +
+
+
+

GRU's blog

+
GRU's blog
+
+
+ +

+GRU Devlog 20 - olibc +

+ +
December 12, 2021 — +G1n +
+ + +

This week I was making olibc. I was implementing <string.h>. Also I was fixing liblinux to +be able to include it without need to use full path in #include. I had several other issues +with it and also fixed them.

+ +

My current goal is to implement <string.h> and after that I am planning to publish it. +Currently most of funcs are implemented. Making strtok now but all other functions need +locale.h and I don’t know yet how I will be implemented. But it is already cool that we +have most of functions that should be in <string.h>!

+ +

Also we now have gru webpage on codeberg! Maybe next week I +will move all devlogs to gru webpage so it will be easier to move.

+ +

Hope you liked this post! If you would like to help us, contact me via email, xmpp or irc :)

+ +

tags: gru, olibc, liblinux

+ + + + +
+ +
+ diff --git a/blog/gru-devlog-20---olibc.md b/blog/gru-devlog-20---olibc.md new file mode 100644 index 0000000..b49dc9d --- /dev/null +++ b/blog/gru-devlog-20---olibc.md @@ -0,0 +1,17 @@ +GRU Devlog 20 - olibc + +This week I was making olibc. I was implementing . Also I was fixing liblinux to +be able to include it without need to use full path in `#include`. I had several other issues +with it and also fixed them. + +My current goal is to implement and after that I am planning to publish it. +Currently most of funcs are implemented. Making strtok now but all other functions need +locale.h and I don't know yet how I will be implemented. But it is already cool that we +have most of functions that should be in ! + +Also we now have [gru webpage on codeberg](https://gru.codeberg.page)! Maybe next week I +will move all devlogs to gru webpage so it will be easier to move. + +Hope you liked this post! If you would like to help us, contact me via email, xmpp or irc :) + +tags: gru, olibc, liblinux diff --git a/blog/gru-devlog-3---orion-and-dreams-about-gru-software-future.html b/blog/gru-devlog-3---orion-and-dreams-about-gru-software-future.html new file mode 100644 index 0000000..3244fc1 --- /dev/null +++ b/blog/gru-devlog-3---orion-and-dreams-about-gru-software-future.html @@ -0,0 +1,81 @@ + + + + + + + +GRU DevLog 3 - Orion and dreams about GRU software future + +
+
+
+

GRU's blog

+
GRU's blog
+
+
+ +

+GRU DevLog 3 - Orion and dreams about GRU software future +

+ +
August 15, 2021 — +G1n +
+ + +

This week I was trying to make interrupts, paging and other memory things working in Orion. +I found this guide and tried to follow it without rewriting the whole project: +http://www.jamesmolloy.co.uk/index.html

+ +

For now only Global Descriptor Table maybe working.

+ +

My current goals/dreams:

+ +
    +
  • make filesystem (the coolest would be make Ext2 driver)

  • +
  • build GCC hosted compiler (this will help GCC understand our OS better)

  • +
+ + +

My very future dreams:

+ +
    +
  • make kernel, libs, ports and soft in different repos

  • +
  • make proper way to make “distros” on our kernel

  • +
  • make some website with mirror of ports scripts (like in Serenity OS but not in one repo with +everything and tool for searching and downloading ports from that mirror)

  • +
  • maybe (if i will work a lot on this projects) I’ll make one more account on tilde.team +for our organisation (domain name - gru.ttm.sh, is cool), but i’ll ask admins about that

  • +
+ + +

Also I think Orion need new name because i found several projects with this name :)

+ +

Some ideas about the GRU name:

+ +
    +
  • GRU rocks (or rocking) UNIX

  • +
  • GloRious UNIX

  • +
  • GloRious Union

  • +
+ + +

If you can help me or have some ideas (name/names or anything else) contact me via email +or any other type of contact (irc: g1n on tilde.chat, xmpp: g1n@hmm.st)

+ +

tags: gru, orion, dreams

+ + + + + + + + + +
+ +
+ diff --git a/blog/gru-devlog-3---orion-and-dreams-about-gru-software-future.md b/blog/gru-devlog-3---orion-and-dreams-about-gru-software-future.md new file mode 100644 index 0000000..4bae210 --- /dev/null +++ b/blog/gru-devlog-3---orion-and-dreams-about-gru-software-future.md @@ -0,0 +1,40 @@ +GRU DevLog 3 - Orion and dreams about GRU software future + +This week I was trying to make interrupts, paging and other memory things working in Orion. +I found this guide and tried to follow it without rewriting the whole project: +[http://www.jamesmolloy.co.uk/index.html](http://www.jamesmolloy.co.uk/index.html) + +For now only Global Descriptor Table maybe working. + +My current goals/dreams: + +- make filesystem (the coolest would be make Ext2 driver) + +- build GCC hosted compiler (this will help GCC understand our OS better) + +My very future dreams: + +- make kernel, libs, ports and soft in different repos + +- make proper way to make "distros" on our kernel + +- make some website with mirror of ports scripts (like in Serenity OS but not in one repo with +everything and tool for searching and downloading ports from that mirror) + +- maybe (if i will work a lot on this projects) I'll make one more account on tilde.team +for our organisation (domain name - gru.ttm.sh, is cool), but i'll ask admins about that + +Also I think Orion need new name because i found several projects with this name :) + +Some ideas about the GRU name: + +- GRU rocks (or rocking) UNIX + +- GloRious UNIX + +- GloRious Union + +If you can help me or have some ideas (name/names or anything else) contact me via email +or any other type of contact (irc: g1n on tilde.chat, xmpp: g1n@hmm.st) + +tags: gru, orion, dreams diff --git a/blog/gru-devlog-4---more-projects-started-webpage-for-gru-and-organizations-on-tildegitcodeberg.html b/blog/gru-devlog-4---more-projects-started-webpage-for-gru-and-organizations-on-tildegitcodeberg.html new file mode 100644 index 0000000..68d2dff --- /dev/null +++ b/blog/gru-devlog-4---more-projects-started-webpage-for-gru-and-organizations-on-tildegitcodeberg.html @@ -0,0 +1,59 @@ + + + + + + + +GRU Devlog 4 - more projects started, webpage for GRU and organizations on tildegit/codeberg + +
+
+
+

GRU's blog

+
GRU's blog
+
+
+ +

+GRU Devlog 4 - more projects started, webpage for GRU and organizations on tildegit/codeberg +

+ +
August 22, 2021 — +G1n +
+ + +

In first days of this week I thought it will be not very productive. +But I was wrong.

+ +

We now have webpage and organizations on tildegit/codeberg:

+ +

https://g1n.ttm.sh/gru/

+ +

Also I am working on some new projects:

+ +
    +
  • orcc - GRU/Orion Compilers Collection (but currently I am working only on lexer so it is not published yet)

  • +
  • gasm - GRU assembler (maybe will be part of GRU binutils. Also not published yet)

  • +
  • hexutils - I think hexdump, xxd and some other utils will be in this project

  • +
+ + +

Also I tryed to advertize GRU on ~chat, some users liked us, +so maybe soon someone will help me with all this.

+ +

And of course if you can help me please contact me in someway! :)

+ +

tags: gru, orcc, gasm, hexutils, webpage

+ + + + + + +
+ +
+ diff --git a/blog/gru-devlog-4---more-projects-started-webpage-for-gru-and-organizations-on-tildegitcodeberg.md b/blog/gru-devlog-4---more-projects-started-webpage-for-gru-and-organizations-on-tildegitcodeberg.md new file mode 100644 index 0000000..e1841d5 --- /dev/null +++ b/blog/gru-devlog-4---more-projects-started-webpage-for-gru-and-organizations-on-tildegitcodeberg.md @@ -0,0 +1,23 @@ +GRU Devlog 4 - more projects started, webpage for GRU and organizations on tildegit/codeberg + +In first days of this week I thought it will be not very productive. +But I was wrong. + +We now have webpage and organizations on tildegit/codeberg: + +[https://g1n.ttm.sh/gru/](https://g1n.ttm.sh/gru/) + +Also I am working on some new projects: + +- orcc - GRU/Orion Compilers Collection (but currently I am working only on lexer so it is not published yet) + +- gasm - GRU assembler (maybe will be part of GRU binutils. Also not published yet) + +- hexutils - I think hexdump, xxd and some other utils will be in this project + +Also I tryed to advertize GRU on ~chat, some users liked us, +so maybe soon someone will help me with all this. + +And of course if you can help me please contact me in someway! :) + +tags: gru, orcc, gasm, hexutils, webpage diff --git a/blog/gru-devlog-5---first-contribution-from-other-person-coreutils-and-gxt-tui-text-editor.html b/blog/gru-devlog-5---first-contribution-from-other-person-coreutils-and-gxt-tui-text-editor.html new file mode 100644 index 0000000..d4f781c --- /dev/null +++ b/blog/gru-devlog-5---first-contribution-from-other-person-coreutils-and-gxt-tui-text-editor.html @@ -0,0 +1,59 @@ + + + + + + + +GRU Devlog 5 - First contribution from other person, coreutils and gxt (tui text editor) + +
+
+
+

GRU's blog

+
GRU's blog
+
+
+ +

+GRU Devlog 5 - First contribution from other person, coreutils and gxt (tui text editor) +

+ +
August 29, 2021 — +G1n +
+ + +

This week I had a lot of new ideas. But I think we have to work on something that +have already been started. +Also we now have one more coreutils rewrite +(now on C to more easily port it to Orion in future).

+ +

Also i have started working on some +projects that is not ready to be published yet. One of them is gxt - tui text editor.

+ +

Currently it can only move cursor and display files. But I think I’ll publish it next week +when editing will be working.

+ +

Bad news is that my school lessons will start next week so maybe this devlogs won’t be +published every week, because of not enough work done. But I don’t know, maybe I’ll have +enough time.

+ +

Also good news - we have first contribution on codeberg to grsh. I didn’t know this person +(because he is not from tildeverse :) ), so it is cool!

+ +

Hope you liked this devlog! If you can somehow help us, please contribute to our projects +on tildegit/codeberg and/or message me in someway :)

+ +

tags: gru, coreutils, contribution, gxt, grsh

+ + + + + + +
+ +
+ diff --git a/blog/gru-devlog-5---first-contribution-from-other-person-coreutils-and-gxt-tui-text-editor.md b/blog/gru-devlog-5---first-contribution-from-other-person-coreutils-and-gxt-tui-text-editor.md new file mode 100644 index 0000000..e751c72 --- /dev/null +++ b/blog/gru-devlog-5---first-contribution-from-other-person-coreutils-and-gxt-tui-text-editor.md @@ -0,0 +1,24 @@ +GRU Devlog 5 - First contribution from other person, coreutils and gxt (tui text editor) + +This week I had a lot of new ideas. But I think we have to work on something that +have already been started. +Also we now have one more coreutils rewrite +(now on C to more easily port it to Orion in future). + +Also i have started working on some +projects that is not ready to be published yet. One of them is gxt - tui text editor. + +Currently it can only move cursor and display files. But I think I'll publish it next week +when editing will be working. + +Bad news is that my school lessons will start next week so maybe this devlogs won't be +published every week, because of not enough work done. But I don't know, maybe I'll have +enough time. + +Also good news - we have first contribution on codeberg to grsh. I didn't know this person +(because he is not from tildeverse :) ), so it is cool! + +Hope you liked this devlog! If you can somehow help us, please contribute to our projects +on tildegit/codeberg and/or message me in someway :) + +tags: gru, coreutils, contribution, gxt, grsh diff --git a/blog/gru-devlog-6---yemu-published-gxt-and-interrupts-working-in-orion.html b/blog/gru-devlog-6---yemu-published-gxt-and-interrupts-working-in-orion.html new file mode 100644 index 0000000..de72107 --- /dev/null +++ b/blog/gru-devlog-6---yemu-published-gxt-and-interrupts-working-in-orion.html @@ -0,0 +1,50 @@ + + + + + + + +GRU Devlog 6 - yemu, published gxt and interrupts working in Orion + +
+
+
+

GRU's blog

+
GRU's blog
+
+
+ +

+GRU Devlog 6 - yemu, published gxt and interrupts working in Orion +

+ +
September 05, 2021 — +G1n +
+ + +

This week I have published gxt, but it currently works as more (only down scrolling). +Also it has a lot of of runtime error (Segmentation fault and others).

+ +

I have started working on yemu - Yet another EMUlator. It currently supports only 6502 +proccessor with tiny number of instructions (LDA, LDX and LDY)

+ +

Today we have fixed interrupts in Orion and now I can implement timer, paging, keyboard +and a lot of other things (thanks to quinn and smlckz from tilde.chat)

+ +

Hope you liked this post and if you would like to help me, +contact me via email, xmpp or irc :)

+ +

tags: gru, gxt, yemu, orion

+ + + + + + +
+ +
+ diff --git a/blog/gru-devlog-6---yemu-published-gxt-and-interrupts-working-in-orion.md b/blog/gru-devlog-6---yemu-published-gxt-and-interrupts-working-in-orion.md new file mode 100644 index 0000000..a9bb717 --- /dev/null +++ b/blog/gru-devlog-6---yemu-published-gxt-and-interrupts-working-in-orion.md @@ -0,0 +1,15 @@ +GRU Devlog 6 - yemu, published gxt and interrupts working in Orion + +This week I have published gxt, but it currently works as more (only down scrolling). +Also it has a lot of of runtime error (Segmentation fault and others). + +I have started working on yemu - Yet another EMUlator. It currently supports only 6502 +proccessor with tiny number of instructions (LDA, LDX and LDY) + +Today we have fixed interrupts in Orion and now I can implement timer, paging, keyboard +and a lot of other things (thanks to quinn and smlckz from tilde.chat) + +Hope you liked this post and if you would like to help me, +contact me via email, xmpp or irc :) + +tags: gru, gxt, yemu, orion diff --git a/blog/gru-devlog-7---keyboard-paging-and-wip-initrd-in-orion.html b/blog/gru-devlog-7---keyboard-paging-and-wip-initrd-in-orion.html new file mode 100644 index 0000000..d711a6e --- /dev/null +++ b/blog/gru-devlog-7---keyboard-paging-and-wip-initrd-in-orion.html @@ -0,0 +1,51 @@ + + + + + + + +GRU Devlog 7 - keyboard, paging and WIP initrd in Orion + +
+
+
+

GRU's blog

+
GRU's blog
+
+
+ +

+GRU Devlog 7 - keyboard, paging and WIP initrd in Orion +

+ +
September 12, 2021 — +G1n +
+ + +

This week I was improving Orion. First I made keyboard working, next day paging! +Also I have added several new LibC functions. +Today I have made scrolling working.

+ +

Last few days I was trying to make initrd working +(this required heap implementing so I also did that but I don’t know if it works correctly). +Currently it can only output /dev directory.

+ +

But I made something wrong with %x in printf and it can display weird chars first +and then contents of files!

+ +

Hope you liked this post and if you would like to help me, contact me via email, xmpp or irc :)

+ +

tags: gru, orion

+ + + + + + +
+ +
+ diff --git a/blog/gru-devlog-7---keyboard-paging-and-wip-initrd-in-orion.md b/blog/gru-devlog-7---keyboard-paging-and-wip-initrd-in-orion.md new file mode 100644 index 0000000..fe4e162 --- /dev/null +++ b/blog/gru-devlog-7---keyboard-paging-and-wip-initrd-in-orion.md @@ -0,0 +1,16 @@ +GRU Devlog 7 - keyboard, paging and WIP initrd in Orion + +This week I was improving Orion. First I made keyboard working, next day paging! +Also I have added several new LibC functions. +Today I have made scrolling working. + +Last few days I was trying to make initrd working +(this required heap implementing so I also did that but I don't know if it works correctly). +Currently it can only output /dev directory. + +But I made something wrong with %x in printf and it can display weird chars first +and then contents of files! + +Hope you liked this post and if you would like to help me, contact me via email, xmpp or irc :) + +tags: gru, orion diff --git a/blog/gru-devlog-8---orsh-and-published-initrd.html b/blog/gru-devlog-8---orsh-and-published-initrd.html new file mode 100644 index 0000000..e83d31a --- /dev/null +++ b/blog/gru-devlog-8---orsh-and-published-initrd.html @@ -0,0 +1,48 @@ + + + + + + + +GRU Devlog 8 - orsh and published initrd + +
+
+
+

GRU's blog

+
GRU's blog
+
+
+ +

+GRU Devlog 8 - orsh and published initrd +

+ +
September 19, 2021 — +G1n +
+ + +

This week I have published initrd, but it is not working as expected.

+ +

Also I have started one more project - orsh. It is one more shell, but now in C. +Maybe it will be easier to port to Orion. It already supports ; but they are working a bit weird.

+ +

Also in orsh you can work with environment variables. +From today’s morning I am trying to replace bash with it, but still a lot need to be done.

+ +

Hope you liked this post and if you would like to help me, contact me via email, xmpp or irc :)

+ +

tags: gru, orsh, orion

+ + + + + + +
+ +
+ diff --git a/blog/gru-devlog-8---orsh-and-published-initrd.md b/blog/gru-devlog-8---orsh-and-published-initrd.md new file mode 100644 index 0000000..2e1d47e --- /dev/null +++ b/blog/gru-devlog-8---orsh-and-published-initrd.md @@ -0,0 +1,13 @@ +GRU Devlog 8 - orsh and published initrd + +This week I have published initrd, but it is not working as expected. + +Also I have started one more project - orsh. It is one more shell, but now in C. +Maybe it will be easier to port to Orion. It already supports ; but they are working a bit weird. + +Also in orsh you can work with environment variables. +From today's morning I am trying to replace bash with it, but still a lot need to be done. + +Hope you liked this post and if you would like to help me, contact me via email, xmpp or irc :) + +tags: gru, orsh, orion diff --git a/blog/gru-devlog-9---orsh-orion-bootloader-gru-xmpp-room-and-logo.html b/blog/gru-devlog-9---orsh-orion-bootloader-gru-xmpp-room-and-logo.html new file mode 100644 index 0000000..f964356 --- /dev/null +++ b/blog/gru-devlog-9---orsh-orion-bootloader-gru-xmpp-room-and-logo.html @@ -0,0 +1,56 @@ + + + + + + + +GRU Devlog 9 - orsh, orion, bootloader, GRU xmpp room and logo + +
+
+
+

GRU's blog

+
GRU's blog
+
+
+ +

+GRU Devlog 9 - orsh, orion, bootloader, GRU xmpp room and logo +

+ +
September 26, 2021 — +G1n +
+ + +

This week I didn’t commited a lot, but started some new projects. +I made orsh signal handling working (so it won’t exit on ^C) and homedir “handling” +(can replace homedir in prompt with ~, and you can use ‘cd ~’ or just ‘cd’ to change +dir to homedir)

+ +

Also I started making bootloader, but for now it can only detect what CPU is (intel if x86 and amd if x86_64), +some additional instructions (msr) and if apic is avalible.

+ +

I was trying to make something with orion fs, maybe it will use pak files for initrd. Currently i am making archiver +for it, but after that i will need to understand more how vfs working and rewrite initrd to use pak files.

+ +

We now have xmpp room (gru@conference.hmm.st) and logo! Thanks to chunk for it!

+ +

I was thinking about making weekly or monthly “conferences”. We could do it via jitsi tildeverse instance or tilde.tel +(tel.tilde.org.nz) conference. I think jitsi is better, but we should try tilde.tel confernce at least once, why not? :)

+ +

Hope you liked this post and you will join our XMPP muc :). If you would like to help me, contact me via email, xmpp or irc :)

+ +

tags: gru, orion, orsh, xmpp, tilde.tel, jitsi

+ + + + + + +
+ +
+ diff --git a/blog/gru-devlog-9---orsh-orion-bootloader-gru-xmpp-room-and-logo.md b/blog/gru-devlog-9---orsh-orion-bootloader-gru-xmpp-room-and-logo.md new file mode 100644 index 0000000..b429079 --- /dev/null +++ b/blog/gru-devlog-9---orsh-orion-bootloader-gru-xmpp-room-and-logo.md @@ -0,0 +1,21 @@ +GRU Devlog 9 - orsh, orion, bootloader, GRU xmpp room and logo + +This week I didn't commited a lot, but started some new projects. +I made orsh signal handling working (so it won't exit on ^C) and homedir "handling" +(can replace homedir in prompt with ~, and you can use 'cd ~' or just 'cd' to change +dir to homedir) + +Also I started making bootloader, but for now it can only detect what CPU is (intel if x86 and amd if x86_64), +some additional instructions (msr) and if apic is avalible. + +I was trying to make something with orion fs, maybe it will use pak files for initrd. Currently i am making archiver +for it, but after that i will need to understand more how vfs working and rewrite initrd to use pak files. + +We now have xmpp room (gru@conference.hmm.st) and logo! Thanks to chunk for it! + +I was thinking about making weekly or monthly "conferences". We could do it via jitsi tildeverse instance or tilde.tel +(tel.tilde.org.nz) conference. I think jitsi is better, but we should try tilde.tel confernce at least once, why not? :) + +Hope you liked this post and you will join our XMPP muc :). If you would like to help me, contact me via email, xmpp or irc :) + +tags: gru, orion, orsh, xmpp, tilde.tel, jitsi diff --git a/blog/gru-devlog-week-0---grsh-grutils-and-start-of-gros.html b/blog/gru-devlog-week-0---grsh-grutils-and-start-of-gros.html new file mode 100644 index 0000000..a629444 --- /dev/null +++ b/blog/gru-devlog-week-0---grsh-grutils-and-start-of-gros.html @@ -0,0 +1,53 @@ + + + + + + + +GRU DevLog Week 0 - grsh, grutils and start of gros + +
+
+
+

GRU's blog

+
GRU's blog
+
+
+ +

+GRU DevLog Week 0 - grsh, grutils and start of gros +

+ +
July 25, 2021 — +G1n +
+ + +

So I have started new project this week - grsh! It is shell written on Rust. Also, for now, other rewrites of coreutils are there.

+ +

What grsh can do for this moment: echo some variables (pwd, user, home, status of previous command using $?) and text; true, false, : - set status; pwd shows current dir, also comments and cd working, basic piping (thanks to that article and of course executing not builtin command also working.

+ +

Some grutils that I made: ls, touch, mkdir/rmdir, rm, grep, head/tail, yes, cat.

+ +

TODOs exist in grsh repo - so you can read there some of my plans.

+ +

Yesterday i have started GROS - OS on Rust! But I haven’t published code yet because it not have that minimum of funcionality that i want. Thanks for that site for teaching how to make basics - https://os.phil-opp.com

+ +

So it was first of GRU Devlog! Thanks for reading! If you want to contribute to some of that project write me an email - g1n@ttm.sh , or contact me in other ways

+ +

tags: gru, grsh, grutils, gros

+ + + + + + + + + +
+ +
+ diff --git a/blog/gru-devlog-week-0---grsh-grutils-and-start-of-gros.md b/blog/gru-devlog-week-0---grsh-grutils-and-start-of-gros.md new file mode 100644 index 0000000..f4ffb97 --- /dev/null +++ b/blog/gru-devlog-week-0---grsh-grutils-and-start-of-gros.md @@ -0,0 +1,15 @@ +GRU DevLog Week 0 - grsh, grutils and start of gros + +So I have started new project this week - grsh! It is shell written on Rust. Also, for now, other rewrites of coreutils are there. + +What grsh can do for this moment: echo some variables (pwd, user, home, status of previous command using $?) and text; true, false, : - set status; pwd shows current dir, also comments and cd working, basic piping (thanks to [that article](https://www.joshmcguigan.com/blog/build-your-own-shell-rust/) and of course executing not builtin command also working. + +Some grutils that I made: ls, touch, mkdir/rmdir, rm, grep, head/tail, yes, cat. + +TODOs exist in grsh repo - so you can read there some of my plans. + +Yesterday i have started GROS - OS on Rust! But I haven't published code yet because it not have that minimum of funcionality that i want. Thanks for that site for teaching how to make basics - [https://os.phil-opp.com](https://os.phil-opp.com) + +So it was first of GRU Devlog! Thanks for reading! If you want to contribute to some of that project write me an email - [g1n@ttm.sh](mailto:g1n@ttm.sh) , or contact me in other ways + +tags: gru, grsh, grutils, gros diff --git a/blog/index.html b/blog/index.html new file mode 100644 index 0000000..8338c77 --- /dev/null +++ b/blog/index.html @@ -0,0 +1,324 @@ + + + + + + + +GRU's blog + +
+
+
+

GRU's blog

+
GRU's blog
+
+
+

+GRU Devlog 20 - olibc +

+ +
December 12, 2021 — +G1n +
+ + +

This week I was making olibc. I was implementing <string.h>. Also I was fixing liblinux to +be able to include it without need to use full path in #include. I had several other issues +with it and also fixed them.

+ +

My current goal is to implement <string.h> and after that I am planning to publish it. +Currently most of funcs are implemented. Making strtok now but all other functions need +locale.h and I don’t know yet how I will be implemented. But it is already cool that we +have most of functions that should be in <string.h>!

+ +

Also we now have gru webpage on codeberg! Maybe next week I +will move all devlogs to gru webpage so it will be easier to move.

+ +

Hope you liked this post! If you would like to help us, contact me via email, xmpp or irc :)

+ +

tags: gru, olibc, liblinux

+ + + +

+GRU Devlog 19 - gic and several libs +

+ +
December 05, 2021 — +G1n +
+ + +

This week started with making gic (maybe name will be change). As I have written before +it is going to be suckless ii clone. Also I started making girclib - simple C library for irc +protocol. I think it will be published as separate project, because I would like to make it +for both: client and server. I don’t yet how it will be done but we will see…

+ +

Then I thought that would be cool to have own libc, but have no knowledge how it speaks with OS. +Then I understood that on linux it is working via syscalls. So started making liblinux - +C library for linux syscalls. Using it we won’t need to use assembly a lot in our libc. Currently +write and read syscalls are done and programmer can use it if passed -I, -L and -l flags to compiler. +And it is already published! (check codeberg or tildegit)

+ +

After understanding how to create proper makefile with liblinux, I started making olibc. Currently +it has very tiny number of features. But string.h is mostly done! I don’t know when I will fill that +it will be ready enough to be published, but hope to have useful functions and test suit there till +that time.

+ +

When olibc will be done enough I am going to start making C compiler (already have some code, but it +is old and I not understand how it works, so need to be rewritten). Also I hope that we will have +enough toolchain (or I will have enough knowledge to implement things that are not done faster) +for our own Linux or BSD distribution. But that will be in future…

+ +

Hope you liked this post! If you would like to help us, contact me via email, xmpp or irc :)

+ +

tags: gru, gic, girclib, liblinux, olibc, libs

+ + + + + +

+GRU Devlog 17-18 - coreutils, EGG and ideas +

+ +
November 28, 2021 — +G1n +
+ + +

Last week I didn’t make devlog because was busy and haven’t done anything useful except +mkdir for coreutils.

+ +

This week I started from try to make something in framebuffer but currently nothing, because +I can’t even understand why my code can’t see size of my display. I think E will require making +something like Elib for easier communicating with E (but it will be in very far future…)

+ +

Then I made echo and very simple ls for coreutils. I am going to add more flags to ls next week. +This week I also have made simple irc bot in python, so I will try to make simple clone of suckless ii +on C (i think name gic is now really good so if you have ideas please suggest them to me). +Currently I don’t reallly understand how to work with sockets but I will try to do something.

+ +

Hope you liked this post! If you would like to help us, contact me via email, xmpp or irc :)

+ +

tags: gru, coreutils, egg

+ + + + + +

+GRU Devlog 16 - ormp and EGG +

+ +
November 14, 2021 — +G1n +
+ + +

This week i was working on one more new project - ormp. It will be terminal multiplexor. +Currently i am doing it in ncurses. For current time it is not working - can just handle input but not display it.

+ +

Also i have an idea for new projects - EGG (Extended/Exciting GRU GUI). I am planning some proj in this category - eggwm, eggterm, eggmenu and E. +E would be a new display server. We will need to have it for Orion in future. Currently i am planning to do it or on fbdev or on DRM/KMS.

+ +

Also now yemu can be compiled with different compilers, -pedantic flag was added to makefile and all errors fixed.

+ +

And now our channels are bridged via matterbridge: irc on ~chat, irc on libera and xmpp muc.

+ +

Hope you liked this post! If you would like to help us, contact me via email, xmpp or irc :)

+ +

tags: gru, ormp, egg, yemu, xmpp, irc

+ + + + + +

+GRU Devlog 15 - ocpu, yemu and licenses +

+ +
November 07, 2021 — +G1n +
+ + +

This week wasn’t very productive. I was working on one of my personal projects.

+ +

I have added ADD for registers, INC, DEC and NOP instructions.

+ +

Also codeberg informed me that yemu has to have license, and I fast added MIT license to all our projects.

+ +

Hope you liked this post! If you would like to help me, contact me via email, xmpp or irc :)

+ +

tags: gru, ocpu, yemu, license

+ + + + + +

+GRU Devlog 14 - ocpu and yemu +

+ +
October 31, 2021 — +G1n +
+ + +

This week I was working on ocpu emulator. So using it we can know if specifications can be implemented. +It helps me adding some description to it.

+ +

First I made yemu a bit modular, so you need to add several lines to main file and then building your emulator +based on template (that should be placed in docs one day). Now if someone would like to add some architecture to +our emulator they won’t need to rewrite it from scratch.

+ +

I also added –system flag to yemu so architecture can be choosen more user-friendly way.

+ +

Currently in ocpu emulator only mov and add instructions are implemented. +We also added some description to commands in specifications, so it is easier to understand what it should do

+ +

Hope you liked this post! If you would like to help me, contact me via email, xmpp or irc :)

+ +

tags: gru, yemu, ocpu

+ + + + + +

+GRU Devlog 13 - ocpu thoughts and some elecronics +

+ +
October 24, 2021 — +G1n +
+ + +

This week was very busy week at school and I had no time for programming.

+ +

But in the start of week I was thinking about making ocpu specs more Turing-complete. +I still think it is not done but maybe it will in some time (and of course more description required).

+ +

But I had time to buy some transistors and other electronics. Currently I am trying to make half-adder.

+ +

I have created tiny log page - lolcpu. I am going to post there some of my +electronic ideas, circuits and progress in doing some electronic things.

+ +

Hope you liked this post! If you would like to help me, contact me via email, xmpp or irc :)

+ +

tags: gru, lolcpu, ocpu, transistors, electonics

+ + + + + +

+GRU Devlog 12 - yemu, gasm and ocpu +

+ +
October 17, 2021 — +G1n +
+ + +

This week I have done several new instructions for yemu. For example all transfer instructions.

+ +

Also I have rewritten gasm to support 6502, published it and it should help me with debugging yemu. +It supports not very a lot instructions but I hope it is good start.

+ +

But I think the coolest what I did this week is ocpu proccessor specification. +Currently it is draft but i have already published it here. +I hope this specifications will be Turing complete and we will try to implement it in real world. +But firstly we need to make this specififcations complete, assembler and emulator for it.

+ +

Also smlckz’s idea was to make translator from ocpu assembler instructions to avr to emulate it on arduino!

+ +

Hope you liked this post! If you would like to help me, contact me via email, xmpp or irc :)

+ +

tags: gru, yemu, gasm, ocpu

+ + + + + +

+GRU Devlog 11 - yemu and channel on libera.chat +

+ +
October 08, 2021 — +G1n +
+ + +

I am making this devlog a bit earlier, because I will be busy on weekends.

+ +

This week I didn’t have plan, but it seems I have done some things to yemu: added loading programs +from binary file and several instructions - TAX, TAY and NOP.

+ +

I think gasm will be made for 6502 firstly, because it is easier then x86 and it would help in +testing yemu.

+ +

I was trying to make some daily notes in Org Roam (and moved devlog notes there), but it wasn’t +very success, but I hope to do it more often :)

+ +

Also I have registered #gru channel on libera, so you can join us also on libera.chat :)

+ +

Hope you liked this post :). If you would like to help me, contact me via email, xmpp or irc :)

+ +

tags: gru, yemu, libera, org-mode, org-roam

+ + + + + +

+GRU Devlog 10 - orsh now like proper shell and gasm +

+ +
October 03, 2021 — +G1n +
+ + +

Hooray! Today is 10’s GRU Devlog! :)

+ +

This week i was trying to make notes to org document, to not forget something and put TODOs +there for future weeks.

+ +

First several days was the most valuable - readline support and signal handling! +This means you can use emacs-like bindings there (but i think readline also supports vi bindings, +so maybe i will add them too!)

+ +

Also we now have very minimal completion support there :), but still proper function need to be added +for that (currently only filenames completion)

+ +

Orsh also has one session history, so you don’t need to rewrite command from scratch now

+ +

And I have started to use it as my main (but had some problems after chsh, so currently is autostarts after bash +and i can exit from there any time i will need)

+ +

Then I have started making our own assembler - gasm. Currently it only supports NOP, so i haven’t published it yet.

+ +

This week I also registered to ~news and shared devlog there (i think this devlog also will be there ;) ) +If you have lobste.rs account please contact me to invite me, if you can, because it may advertize GRU more!

+ +

Today (Sunday) we had first testing GRU meeting via Jitsi. Thanks to r1k for joining. +We need to make something like plan our schedule (to know about what to speak) and discuss meeting time better.

+ +

Hope you liked this post and you will join our XMPP muc (if you are not already there) :). +If you would like to help me, contact me via email, xmpp or irc :)

+ +

tags: gru, org-mode, gasm, orsh, meeting, lobste.rs, tilde.news

+ + + + + + +
+ +
+ diff --git a/blog/main.css b/blog/main.css new file mode 100644 index 0000000..4e4f37e --- /dev/null +++ b/blog/main.css @@ -0,0 +1,33 @@ +body { + background:#1c1c1c; + color:#a7d129; + margin:0; + padding:0; +} +hr{ + color:#32302f; +} +ul{ + list-style: none; +} +li{ + color:#81b214; +} +a{ + text-decoration:none; + color:#9ede73; +} +h1,h2,h3,h4,h5,h6{color:#a7d129;} +h1{margin-bottom:12px !important;} +h4{margin-left:24px;margin-right:24px;} +img{max-width:100%;} +h3{font-size:20pt;width:100%;font-weight:bold;margin-top:32px;margin-bottom:0;} +.header{width:100%;max-width:800px;margin:0px auto;} +.headerholder{max-height:20%;max-width:100%;width:100%;margin:0;padding:0;} +#footer{padding-top:10px;border-top:solid 1px #666;text-align:center;font-size:small;font-family:"Courier New","Courier",monospace;} +.description{margin-top:10px;border-top:solid 1px #666;padding:10px 0;} +blockquote{background-color:#f9f9f9;border-left:solid 4px #e9e9e9;margin-left:12px;padding:12px 12px 12px 24px;} +blockquote img{margin:12px 0px;} +blockquote iframe{margin:12px 0px;} +#divbodyholder{padding:5px;width:100%;max-width:874px;margin:24px auto;} +#divbody{padding:0px 38px 24px 38px;top:0;} diff --git a/blog/tag_contribution.html b/blog/tag_contribution.html new file mode 100644 index 0000000..b347700 --- /dev/null +++ b/blog/tag_contribution.html @@ -0,0 +1,57 @@ + + + + + + + +GRU's blog — posts tagged "contribution" + +
+
+
+

GRU's blog

+
GRU's blog
+
+
+

+GRU Devlog 5 - First contribution from other person, coreutils and gxt (tui text editor) +

+ +
August 29, 2021 — +G1n +
+ + +

This week I had a lot of new ideas. But I think we have to work on something that +have already been started. +Also we now have one more coreutils rewrite +(now on C to more easily port it to Orion in future).

+ +

Also i have started working on some +projects that is not ready to be published yet. One of them is gxt - tui text editor.

+ +

Currently it can only move cursor and display files. But I think I’ll publish it next week +when editing will be working.

+ +

Bad news is that my school lessons will start next week so maybe this devlogs won’t be +published every week, because of not enough work done. But I don’t know, maybe I’ll have +enough time.

+ +

Also good news - we have first contribution on codeberg to grsh. I didn’t know this person +(because he is not from tildeverse :) ), so it is cool!

+ +

Hope you liked this devlog! If you can somehow help us, please contribute to our projects +on tildegit/codeberg and/or message me in someway :)

+ +

tags: gru, coreutils, contribution, gxt, grsh

+ + + + + +
+ +
+ diff --git a/blog/tag_coreutils.html b/blog/tag_coreutils.html new file mode 100644 index 0000000..c59cd40 --- /dev/null +++ b/blog/tag_coreutils.html @@ -0,0 +1,86 @@ + + + + + + + +GRU's blog — posts tagged "coreutils" + +
+
+
+

GRU's blog

+
GRU's blog
+
+
+

+GRU Devlog 17-18 - coreutils, EGG and ideas +

+ +
November 28, 2021 — +G1n +
+ + +

Last week I didn’t make devlog because was busy and haven’t done anything useful except +mkdir for coreutils.

+ +

This week I started from try to make something in framebuffer but currently nothing, because +I can’t even understand why my code can’t see size of my display. I think E will require making +something like Elib for easier communicating with E (but it will be in very far future…)

+ +

Then I made echo and very simple ls for coreutils. I am going to add more flags to ls next week. +This week I also have made simple irc bot in python, so I will try to make simple clone of suckless ii +on C (i think name gic is now really good so if you have ideas please suggest them to me). +Currently I don’t reallly understand how to work with sockets but I will try to do something.

+ +

Hope you liked this post! If you would like to help us, contact me via email, xmpp or irc :)

+ +

tags: gru, coreutils, egg

+ + + + + +

+GRU Devlog 5 - First contribution from other person, coreutils and gxt (tui text editor) +

+ +
August 29, 2021 — +G1n +
+ + +

This week I had a lot of new ideas. But I think we have to work on something that +have already been started. +Also we now have one more coreutils rewrite +(now on C to more easily port it to Orion in future).

+ +

Also i have started working on some +projects that is not ready to be published yet. One of them is gxt - tui text editor.

+ +

Currently it can only move cursor and display files. But I think I’ll publish it next week +when editing will be working.

+ +

Bad news is that my school lessons will start next week so maybe this devlogs won’t be +published every week, because of not enough work done. But I don’t know, maybe I’ll have +enough time.

+ +

Also good news - we have first contribution on codeberg to grsh. I didn’t know this person +(because he is not from tildeverse :) ), so it is cool!

+ +

Hope you liked this devlog! If you can somehow help us, please contribute to our projects +on tildegit/codeberg and/or message me in someway :)

+ +

tags: gru, coreutils, contribution, gxt, grsh

+ + + + + +
+ +
+ diff --git a/blog/tag_dreams.html b/blog/tag_dreams.html new file mode 100644 index 0000000..8ca4f19 --- /dev/null +++ b/blog/tag_dreams.html @@ -0,0 +1,79 @@ + + + + + + + +GRU's blog — posts tagged "dreams" + +
+
+
+

GRU's blog

+
GRU's blog
+
+
+

+GRU DevLog 3 - Orion and dreams about GRU software future +

+ +
August 15, 2021 — +G1n +
+ + +

This week I was trying to make interrupts, paging and other memory things working in Orion. +I found this guide and tried to follow it without rewriting the whole project: +http://www.jamesmolloy.co.uk/index.html

+ +

For now only Global Descriptor Table maybe working.

+ +

My current goals/dreams:

+ +
    +
  • make filesystem (the coolest would be make Ext2 driver)

  • +
  • build GCC hosted compiler (this will help GCC understand our OS better)

  • +
+ + +

My very future dreams:

+ +
    +
  • make kernel, libs, ports and soft in different repos

  • +
  • make proper way to make “distros” on our kernel

  • +
  • make some website with mirror of ports scripts (like in Serenity OS but not in one repo with +everything and tool for searching and downloading ports from that mirror)

  • +
  • maybe (if i will work a lot on this projects) I’ll make one more account on tilde.team +for our organisation (domain name - gru.ttm.sh, is cool), but i’ll ask admins about that

  • +
+ + +

Also I think Orion need new name because i found several projects with this name :)

+ +

Some ideas about the GRU name:

+ +
    +
  • GRU rocks (or rocking) UNIX

  • +
  • GloRious UNIX

  • +
  • GloRious Union

  • +
+ + +

If you can help me or have some ideas (name/names or anything else) contact me via email +or any other type of contact (irc: g1n on tilde.chat, xmpp: g1n@hmm.st)

+ +

tags: gru, orion, dreams

+ + + + + + + + +
+ +
+ diff --git a/blog/tag_egg.html b/blog/tag_egg.html new file mode 100644 index 0000000..11c2bc1 --- /dev/null +++ b/blog/tag_egg.html @@ -0,0 +1,77 @@ + + + + + + + +GRU's blog — posts tagged "egg" + +
+
+
+

GRU's blog

+
GRU's blog
+
+
+

+GRU Devlog 17-18 - coreutils, EGG and ideas +

+ +
November 28, 2021 — +G1n +
+ + +

Last week I didn’t make devlog because was busy and haven’t done anything useful except +mkdir for coreutils.

+ +

This week I started from try to make something in framebuffer but currently nothing, because +I can’t even understand why my code can’t see size of my display. I think E will require making +something like Elib for easier communicating with E (but it will be in very far future…)

+ +

Then I made echo and very simple ls for coreutils. I am going to add more flags to ls next week. +This week I also have made simple irc bot in python, so I will try to make simple clone of suckless ii +on C (i think name gic is now really good so if you have ideas please suggest them to me). +Currently I don’t reallly understand how to work with sockets but I will try to do something.

+ +

Hope you liked this post! If you would like to help us, contact me via email, xmpp or irc :)

+ +

tags: gru, coreutils, egg

+ + + + + +

+GRU Devlog 16 - ormp and EGG +

+ +
November 14, 2021 — +G1n +
+ + +

This week i was working on one more new project - ormp. It will be terminal multiplexor. +Currently i am doing it in ncurses. For current time it is not working - can just handle input but not display it.

+ +

Also i have an idea for new projects - EGG (Extended/Exciting GRU GUI). I am planning some proj in this category - eggwm, eggterm, eggmenu and E. +E would be a new display server. We will need to have it for Orion in future. Currently i am planning to do it or on fbdev or on DRM/KMS.

+ +

Also now yemu can be compiled with different compilers, -pedantic flag was added to makefile and all errors fixed.

+ +

And now our channels are bridged via matterbridge: irc on ~chat, irc on libera and xmpp muc.

+ +

Hope you liked this post! If you would like to help us, contact me via email, xmpp or irc :)

+ +

tags: gru, ormp, egg, yemu, xmpp, irc

+ + + + + +
+ +
+ diff --git a/blog/tag_electonics.html b/blog/tag_electonics.html new file mode 100644 index 0000000..2d3048e --- /dev/null +++ b/blog/tag_electonics.html @@ -0,0 +1,48 @@ + + + + + + + +GRU's blog — posts tagged "electonics" + +
+
+
+

GRU's blog

+
GRU's blog
+
+
+

+GRU Devlog 13 - ocpu thoughts and some elecronics +

+ +
October 24, 2021 — +G1n +
+ + +

This week was very busy week at school and I had no time for programming.

+ +

But in the start of week I was thinking about making ocpu specs more Turing-complete. +I still think it is not done but maybe it will in some time (and of course more description required).

+ +

But I had time to buy some transistors and other electronics. Currently I am trying to make half-adder.

+ +

I have created tiny log page - lolcpu. I am going to post there some of my +electronic ideas, circuits and progress in doing some electronic things.

+ +

Hope you liked this post! If you would like to help me, contact me via email, xmpp or irc :)

+ +

tags: gru, lolcpu, ocpu, transistors, electonics

+ + + + + +
+ +
+ diff --git a/blog/tag_gasm.html b/blog/tag_gasm.html new file mode 100644 index 0000000..1151fec --- /dev/null +++ b/blog/tag_gasm.html @@ -0,0 +1,129 @@ + + + + + + + +GRU's blog — posts tagged "gasm" + +
+
+
+

GRU's blog

+
GRU's blog
+
+
+

+GRU Devlog 12 - yemu, gasm and ocpu +

+ +
October 17, 2021 — +G1n +
+ + +

This week I have done several new instructions for yemu. For example all transfer instructions.

+ +

Also I have rewritten gasm to support 6502, published it and it should help me with debugging yemu. +It supports not very a lot instructions but I hope it is good start.

+ +

But I think the coolest what I did this week is ocpu proccessor specification. +Currently it is draft but i have already published it here. +I hope this specifications will be Turing complete and we will try to implement it in real world. +But firstly we need to make this specififcations complete, assembler and emulator for it.

+ +

Also smlckz’s idea was to make translator from ocpu assembler instructions to avr to emulate it on arduino!

+ +

Hope you liked this post! If you would like to help me, contact me via email, xmpp or irc :)

+ +

tags: gru, yemu, gasm, ocpu

+ + + + + +

+GRU Devlog 10 - orsh now like proper shell and gasm +

+ +
October 03, 2021 — +G1n +
+ + +

Hooray! Today is 10’s GRU Devlog! :)

+ +

This week i was trying to make notes to org document, to not forget something and put TODOs +there for future weeks.

+ +

First several days was the most valuable - readline support and signal handling! +This means you can use emacs-like bindings there (but i think readline also supports vi bindings, +so maybe i will add them too!)

+ +

Also we now have very minimal completion support there :), but still proper function need to be added +for that (currently only filenames completion)

+ +

Orsh also has one session history, so you don’t need to rewrite command from scratch now

+ +

And I have started to use it as my main (but had some problems after chsh, so currently is autostarts after bash +and i can exit from there any time i will need)

+ +

Then I have started making our own assembler - gasm. Currently it only supports NOP, so i haven’t published it yet.

+ +

This week I also registered to ~news and shared devlog there (i think this devlog also will be there ;) ) +If you have lobste.rs account please contact me to invite me, if you can, because it may advertize GRU more!

+ +

Today (Sunday) we had first testing GRU meeting via Jitsi. Thanks to r1k for joining. +We need to make something like plan our schedule (to know about what to speak) and discuss meeting time better.

+ +

Hope you liked this post and you will join our XMPP muc (if you are not already there) :). +If you would like to help me, contact me via email, xmpp or irc :)

+ +

tags: gru, org-mode, gasm, orsh, meeting, lobste.rs, tilde.news

+ + + + + +

+GRU Devlog 4 - more projects started, webpage for GRU and organizations on tildegit/codeberg +

+ +
August 22, 2021 — +G1n +
+ + +

In first days of this week I thought it will be not very productive. +But I was wrong.

+ +

We now have webpage and organizations on tildegit/codeberg:

+ +

https://g1n.ttm.sh/gru/

+ +

Also I am working on some new projects:

+ +
    +
  • orcc - GRU/Orion Compilers Collection (but currently I am working only on lexer so it is not published yet)

  • +
  • gasm - GRU assembler (maybe will be part of GRU binutils. Also not published yet)

  • +
  • hexutils - I think hexdump, xxd and some other utils will be in this project

  • +
+ + +

Also I tryed to advertize GRU on ~chat, some users liked us, +so maybe soon someone will help me with all this.

+ +

And of course if you can help me please contact me in someway! :)

+ +

tags: gru, orcc, gasm, hexutils, webpage

+ + + + + +
+ +
+ diff --git a/blog/tag_gic.html b/blog/tag_gic.html new file mode 100644 index 0000000..d5f0049 --- /dev/null +++ b/blog/tag_gic.html @@ -0,0 +1,59 @@ + + + + + + + +GRU's blog — posts tagged "gic" + +
+
+
+

GRU's blog

+
GRU's blog
+
+
+

+GRU Devlog 19 - gic and several libs +

+ +
December 05, 2021 — +G1n +
+ + +

This week started with making gic (maybe name will be change). As I have written before +it is going to be suckless ii clone. Also I started making girclib - simple C library for irc +protocol. I think it will be published as separate project, because I would like to make it +for both: client and server. I don’t yet how it will be done but we will see…

+ +

Then I thought that would be cool to have own libc, but have no knowledge how it speaks with OS. +Then I understood that on linux it is working via syscalls. So started making liblinux - +C library for linux syscalls. Using it we won’t need to use assembly a lot in our libc. Currently +write and read syscalls are done and programmer can use it if passed -I, -L and -l flags to compiler. +And it is already published! (check codeberg or tildegit)

+ +

After understanding how to create proper makefile with liblinux, I started making olibc. Currently +it has very tiny number of features. But string.h is mostly done! I don’t know when I will fill that +it will be ready enough to be published, but hope to have useful functions and test suit there till +that time.

+ +

When olibc will be done enough I am going to start making C compiler (already have some code, but it +is old and I not understand how it works, so need to be rewritten). Also I hope that we will have +enough toolchain (or I will have enough knowledge to implement things that are not done faster) +for our own Linux or BSD distribution. But that will be in future…

+ +

Hope you liked this post! If you would like to help us, contact me via email, xmpp or irc :)

+ +

tags: gru, gic, girclib, liblinux, olibc, libs

+ + + + + +
+ +
+ diff --git a/blog/tag_girclib.html b/blog/tag_girclib.html new file mode 100644 index 0000000..5b3b8e8 --- /dev/null +++ b/blog/tag_girclib.html @@ -0,0 +1,59 @@ + + + + + + + +GRU's blog — posts tagged "girclib" + +
+
+
+

GRU's blog

+
GRU's blog
+
+
+

+GRU Devlog 19 - gic and several libs +

+ +
December 05, 2021 — +G1n +
+ + +

This week started with making gic (maybe name will be change). As I have written before +it is going to be suckless ii clone. Also I started making girclib - simple C library for irc +protocol. I think it will be published as separate project, because I would like to make it +for both: client and server. I don’t yet how it will be done but we will see…

+ +

Then I thought that would be cool to have own libc, but have no knowledge how it speaks with OS. +Then I understood that on linux it is working via syscalls. So started making liblinux - +C library for linux syscalls. Using it we won’t need to use assembly a lot in our libc. Currently +write and read syscalls are done and programmer can use it if passed -I, -L and -l flags to compiler. +And it is already published! (check codeberg or tildegit)

+ +

After understanding how to create proper makefile with liblinux, I started making olibc. Currently +it has very tiny number of features. But string.h is mostly done! I don’t know when I will fill that +it will be ready enough to be published, but hope to have useful functions and test suit there till +that time.

+ +

When olibc will be done enough I am going to start making C compiler (already have some code, but it +is old and I not understand how it works, so need to be rewritten). Also I hope that we will have +enough toolchain (or I will have enough knowledge to implement things that are not done faster) +for our own Linux or BSD distribution. But that will be in future…

+ +

Hope you liked this post! If you would like to help us, contact me via email, xmpp or irc :)

+ +

tags: gru, gic, girclib, liblinux, olibc, libs

+ + + + + +
+ +
+ diff --git a/blog/tag_gros.html b/blog/tag_gros.html new file mode 100644 index 0000000..02d0333 --- /dev/null +++ b/blog/tag_gros.html @@ -0,0 +1,88 @@ + + + + + + + +GRU's blog — posts tagged "gros" + +
+
+
+

GRU's blog

+
GRU's blog
+
+
+

+GRU DevLog 1 - gros sources published and add wc to grutils +

+ +
August 01, 2021 — +G1n +
+ + +

I didn’t make a lot work this week, so i think this devlogs should be renamed from “week number” to just “number” +Ok, so what i did this week: +- Add wc to grutils +- Published gros +- Add basic shell and some commands for gros

+ +

I know that is not a lot, but i was reading some osdev articles and books. +Currently I would like to implement basic filesystem but i don’t know what to do.

+ +

Some goals for gros (I will add that to gros readme): +- Filesystem (FAT or Ext2) +- ELF or other executable formats +- LibC (for compiling C programs) +- Maybe basic networking but after all of that

+ +

All code in osdev wiki is for C so I need to implement it myself (or port existing rust code)

+ +

If you can help me somehow please contact me via email (g1n@ttm.sh) or in other ways (~chat irc, xmpp)

+ +

tags: gru, grutils, gros

+ + + + + + + + +

+GRU DevLog Week 0 - grsh, grutils and start of gros +

+ +
July 25, 2021 — +G1n +
+ + +

So I have started new project this week - grsh! It is shell written on Rust. Also, for now, other rewrites of coreutils are there.

+ +

What grsh can do for this moment: echo some variables (pwd, user, home, status of previous command using $?) and text; true, false, : - set status; pwd shows current dir, also comments and cd working, basic piping (thanks to that article and of course executing not builtin command also working.

+ +

Some grutils that I made: ls, touch, mkdir/rmdir, rm, grep, head/tail, yes, cat.

+ +

TODOs exist in grsh repo - so you can read there some of my plans.

+ +

Yesterday i have started GROS - OS on Rust! But I haven’t published code yet because it not have that minimum of funcionality that i want. Thanks for that site for teaching how to make basics - https://os.phil-opp.com

+ +

So it was first of GRU Devlog! Thanks for reading! If you want to contribute to some of that project write me an email - g1n@ttm.sh , or contact me in other ways

+ +

tags: gru, grsh, grutils, gros

+ + + + + + + + +
+ +
+ diff --git a/blog/tag_grsh.html b/blog/tag_grsh.html new file mode 100644 index 0000000..a85af4b --- /dev/null +++ b/blog/tag_grsh.html @@ -0,0 +1,87 @@ + + + + + + + +GRU's blog — posts tagged "grsh" + +
+
+
+

GRU's blog

+
GRU's blog
+
+
+

+GRU Devlog 5 - First contribution from other person, coreutils and gxt (tui text editor) +

+ +
August 29, 2021 — +G1n +
+ + +

This week I had a lot of new ideas. But I think we have to work on something that +have already been started. +Also we now have one more coreutils rewrite +(now on C to more easily port it to Orion in future).

+ +

Also i have started working on some +projects that is not ready to be published yet. One of them is gxt - tui text editor.

+ +

Currently it can only move cursor and display files. But I think I’ll publish it next week +when editing will be working.

+ +

Bad news is that my school lessons will start next week so maybe this devlogs won’t be +published every week, because of not enough work done. But I don’t know, maybe I’ll have +enough time.

+ +

Also good news - we have first contribution on codeberg to grsh. I didn’t know this person +(because he is not from tildeverse :) ), so it is cool!

+ +

Hope you liked this devlog! If you can somehow help us, please contribute to our projects +on tildegit/codeberg and/or message me in someway :)

+ +

tags: gru, coreutils, contribution, gxt, grsh

+ + + + + +

+GRU DevLog Week 0 - grsh, grutils and start of gros +

+ +
July 25, 2021 — +G1n +
+ + +

So I have started new project this week - grsh! It is shell written on Rust. Also, for now, other rewrites of coreutils are there.

+ +

What grsh can do for this moment: echo some variables (pwd, user, home, status of previous command using $?) and text; true, false, : - set status; pwd shows current dir, also comments and cd working, basic piping (thanks to that article and of course executing not builtin command also working.

+ +

Some grutils that I made: ls, touch, mkdir/rmdir, rm, grep, head/tail, yes, cat.

+ +

TODOs exist in grsh repo - so you can read there some of my plans.

+ +

Yesterday i have started GROS - OS on Rust! But I haven’t published code yet because it not have that minimum of funcionality that i want. Thanks for that site for teaching how to make basics - https://os.phil-opp.com

+ +

So it was first of GRU Devlog! Thanks for reading! If you want to contribute to some of that project write me an email - g1n@ttm.sh , or contact me in other ways

+ +

tags: gru, grsh, grutils, gros

+ + + + + + + + +
+ +
+ diff --git a/blog/tag_gru.html b/blog/tag_gru.html new file mode 100644 index 0000000..b533ce6 --- /dev/null +++ b/blog/tag_gru.html @@ -0,0 +1,662 @@ + + + + + + + +GRU's blog — posts tagged "gru" + +
+
+
+

GRU's blog

+
GRU's blog
+
+
+

+GRU Devlog 20 - olibc +

+ +
December 12, 2021 — +G1n +
+ + +

This week I was making olibc. I was implementing <string.h>. Also I was fixing liblinux to +be able to include it without need to use full path in #include. I had several other issues +with it and also fixed them.

+ +

My current goal is to implement <string.h> and after that I am planning to publish it. +Currently most of funcs are implemented. Making strtok now but all other functions need +locale.h and I don’t know yet how I will be implemented. But it is already cool that we +have most of functions that should be in <string.h>!

+ +

Also we now have gru webpage on codeberg! Maybe next week I +will move all devlogs to gru webpage so it will be easier to move.

+ +

Hope you liked this post! If you would like to help us, contact me via email, xmpp or irc :)

+ +

tags: gru, olibc, liblinux

+ + + +

+GRU Devlog 19 - gic and several libs +

+ +
December 05, 2021 — +G1n +
+ + +

This week started with making gic (maybe name will be change). As I have written before +it is going to be suckless ii clone. Also I started making girclib - simple C library for irc +protocol. I think it will be published as separate project, because I would like to make it +for both: client and server. I don’t yet how it will be done but we will see…

+ +

Then I thought that would be cool to have own libc, but have no knowledge how it speaks with OS. +Then I understood that on linux it is working via syscalls. So started making liblinux - +C library for linux syscalls. Using it we won’t need to use assembly a lot in our libc. Currently +write and read syscalls are done and programmer can use it if passed -I, -L and -l flags to compiler. +And it is already published! (check codeberg or tildegit)

+ +

After understanding how to create proper makefile with liblinux, I started making olibc. Currently +it has very tiny number of features. But string.h is mostly done! I don’t know when I will fill that +it will be ready enough to be published, but hope to have useful functions and test suit there till +that time.

+ +

When olibc will be done enough I am going to start making C compiler (already have some code, but it +is old and I not understand how it works, so need to be rewritten). Also I hope that we will have +enough toolchain (or I will have enough knowledge to implement things that are not done faster) +for our own Linux or BSD distribution. But that will be in future…

+ +

Hope you liked this post! If you would like to help us, contact me via email, xmpp or irc :)

+ +

tags: gru, gic, girclib, liblinux, olibc, libs

+ + + + + +

+GRU Devlog 17-18 - coreutils, EGG and ideas +

+ +
November 28, 2021 — +G1n +
+ + +

Last week I didn’t make devlog because was busy and haven’t done anything useful except +mkdir for coreutils.

+ +

This week I started from try to make something in framebuffer but currently nothing, because +I can’t even understand why my code can’t see size of my display. I think E will require making +something like Elib for easier communicating with E (but it will be in very far future…)

+ +

Then I made echo and very simple ls for coreutils. I am going to add more flags to ls next week. +This week I also have made simple irc bot in python, so I will try to make simple clone of suckless ii +on C (i think name gic is now really good so if you have ideas please suggest them to me). +Currently I don’t reallly understand how to work with sockets but I will try to do something.

+ +

Hope you liked this post! If you would like to help us, contact me via email, xmpp or irc :)

+ +

tags: gru, coreutils, egg

+ + + + + +

+GRU Devlog 16 - ormp and EGG +

+ +
November 14, 2021 — +G1n +
+ + +

This week i was working on one more new project - ormp. It will be terminal multiplexor. +Currently i am doing it in ncurses. For current time it is not working - can just handle input but not display it.

+ +

Also i have an idea for new projects - EGG (Extended/Exciting GRU GUI). I am planning some proj in this category - eggwm, eggterm, eggmenu and E. +E would be a new display server. We will need to have it for Orion in future. Currently i am planning to do it or on fbdev or on DRM/KMS.

+ +

Also now yemu can be compiled with different compilers, -pedantic flag was added to makefile and all errors fixed.

+ +

And now our channels are bridged via matterbridge: irc on ~chat, irc on libera and xmpp muc.

+ +

Hope you liked this post! If you would like to help us, contact me via email, xmpp or irc :)

+ +

tags: gru, ormp, egg, yemu, xmpp, irc

+ + + + + +

+GRU Devlog 15 - ocpu, yemu and licenses +

+ +
November 07, 2021 — +G1n +
+ + +

This week wasn’t very productive. I was working on one of my personal projects.

+ +

I have added ADD for registers, INC, DEC and NOP instructions.

+ +

Also codeberg informed me that yemu has to have license, and I fast added MIT license to all our projects.

+ +

Hope you liked this post! If you would like to help me, contact me via email, xmpp or irc :)

+ +

tags: gru, ocpu, yemu, license

+ + + + + +

+GRU Devlog 14 - ocpu and yemu +

+ +
October 31, 2021 — +G1n +
+ + +

This week I was working on ocpu emulator. So using it we can know if specifications can be implemented. +It helps me adding some description to it.

+ +

First I made yemu a bit modular, so you need to add several lines to main file and then building your emulator +based on template (that should be placed in docs one day). Now if someone would like to add some architecture to +our emulator they won’t need to rewrite it from scratch.

+ +

I also added –system flag to yemu so architecture can be choosen more user-friendly way.

+ +

Currently in ocpu emulator only mov and add instructions are implemented. +We also added some description to commands in specifications, so it is easier to understand what it should do

+ +

Hope you liked this post! If you would like to help me, contact me via email, xmpp or irc :)

+ +

tags: gru, yemu, ocpu

+ + + + + +

+GRU Devlog 13 - ocpu thoughts and some elecronics +

+ +
October 24, 2021 — +G1n +
+ + +

This week was very busy week at school and I had no time for programming.

+ +

But in the start of week I was thinking about making ocpu specs more Turing-complete. +I still think it is not done but maybe it will in some time (and of course more description required).

+ +

But I had time to buy some transistors and other electronics. Currently I am trying to make half-adder.

+ +

I have created tiny log page - lolcpu. I am going to post there some of my +electronic ideas, circuits and progress in doing some electronic things.

+ +

Hope you liked this post! If you would like to help me, contact me via email, xmpp or irc :)

+ +

tags: gru, lolcpu, ocpu, transistors, electonics

+ + + + + +

+GRU Devlog 12 - yemu, gasm and ocpu +

+ +
October 17, 2021 — +G1n +
+ + +

This week I have done several new instructions for yemu. For example all transfer instructions.

+ +

Also I have rewritten gasm to support 6502, published it and it should help me with debugging yemu. +It supports not very a lot instructions but I hope it is good start.

+ +

But I think the coolest what I did this week is ocpu proccessor specification. +Currently it is draft but i have already published it here. +I hope this specifications will be Turing complete and we will try to implement it in real world. +But firstly we need to make this specififcations complete, assembler and emulator for it.

+ +

Also smlckz’s idea was to make translator from ocpu assembler instructions to avr to emulate it on arduino!

+ +

Hope you liked this post! If you would like to help me, contact me via email, xmpp or irc :)

+ +

tags: gru, yemu, gasm, ocpu

+ + + + + +

+GRU Devlog 11 - yemu and channel on libera.chat +

+ +
October 08, 2021 — +G1n +
+ + +

I am making this devlog a bit earlier, because I will be busy on weekends.

+ +

This week I didn’t have plan, but it seems I have done some things to yemu: added loading programs +from binary file and several instructions - TAX, TAY and NOP.

+ +

I think gasm will be made for 6502 firstly, because it is easier then x86 and it would help in +testing yemu.

+ +

I was trying to make some daily notes in Org Roam (and moved devlog notes there), but it wasn’t +very success, but I hope to do it more often :)

+ +

Also I have registered #gru channel on libera, so you can join us also on libera.chat :)

+ +

Hope you liked this post :). If you would like to help me, contact me via email, xmpp or irc :)

+ +

tags: gru, yemu, libera, org-mode, org-roam

+ + + + + +

+GRU Devlog 10 - orsh now like proper shell and gasm +

+ +
October 03, 2021 — +G1n +
+ + +

Hooray! Today is 10’s GRU Devlog! :)

+ +

This week i was trying to make notes to org document, to not forget something and put TODOs +there for future weeks.

+ +

First several days was the most valuable - readline support and signal handling! +This means you can use emacs-like bindings there (but i think readline also supports vi bindings, +so maybe i will add them too!)

+ +

Also we now have very minimal completion support there :), but still proper function need to be added +for that (currently only filenames completion)

+ +

Orsh also has one session history, so you don’t need to rewrite command from scratch now

+ +

And I have started to use it as my main (but had some problems after chsh, so currently is autostarts after bash +and i can exit from there any time i will need)

+ +

Then I have started making our own assembler - gasm. Currently it only supports NOP, so i haven’t published it yet.

+ +

This week I also registered to ~news and shared devlog there (i think this devlog also will be there ;) ) +If you have lobste.rs account please contact me to invite me, if you can, because it may advertize GRU more!

+ +

Today (Sunday) we had first testing GRU meeting via Jitsi. Thanks to r1k for joining. +We need to make something like plan our schedule (to know about what to speak) and discuss meeting time better.

+ +

Hope you liked this post and you will join our XMPP muc (if you are not already there) :). +If you would like to help me, contact me via email, xmpp or irc :)

+ +

tags: gru, org-mode, gasm, orsh, meeting, lobste.rs, tilde.news

+ + + + + +

+GRU Devlog 9 - orsh, orion, bootloader, GRU xmpp room and logo +

+ +
September 26, 2021 — +G1n +
+ + +

This week I didn’t commited a lot, but started some new projects. +I made orsh signal handling working (so it won’t exit on ^C) and homedir “handling” +(can replace homedir in prompt with ~, and you can use ‘cd ~’ or just ‘cd’ to change +dir to homedir)

+ +

Also I started making bootloader, but for now it can only detect what CPU is (intel if x86 and amd if x86_64), +some additional instructions (msr) and if apic is avalible.

+ +

I was trying to make something with orion fs, maybe it will use pak files for initrd. Currently i am making archiver +for it, but after that i will need to understand more how vfs working and rewrite initrd to use pak files.

+ +

We now have xmpp room (gru@conference.hmm.st) and logo! Thanks to chunk for it!

+ +

I was thinking about making weekly or monthly “conferences”. We could do it via jitsi tildeverse instance or tilde.tel +(tel.tilde.org.nz) conference. I think jitsi is better, but we should try tilde.tel confernce at least once, why not? :)

+ +

Hope you liked this post and you will join our XMPP muc :). If you would like to help me, contact me via email, xmpp or irc :)

+ +

tags: gru, orion, orsh, xmpp, tilde.tel, jitsi

+ + + + + +

+GRU Devlog 8 - orsh and published initrd +

+ +
September 19, 2021 — +G1n +
+ + +

This week I have published initrd, but it is not working as expected.

+ +

Also I have started one more project - orsh. It is one more shell, but now in C. +Maybe it will be easier to port to Orion. It already supports ; but they are working a bit weird.

+ +

Also in orsh you can work with environment variables. +From today’s morning I am trying to replace bash with it, but still a lot need to be done.

+ +

Hope you liked this post and if you would like to help me, contact me via email, xmpp or irc :)

+ +

tags: gru, orsh, orion

+ + + + + +

+GRU Devlog 7 - keyboard, paging and WIP initrd in Orion +

+ +
September 12, 2021 — +G1n +
+ + +

This week I was improving Orion. First I made keyboard working, next day paging! +Also I have added several new LibC functions. +Today I have made scrolling working.

+ +

Last few days I was trying to make initrd working +(this required heap implementing so I also did that but I don’t know if it works correctly). +Currently it can only output /dev directory.

+ +

But I made something wrong with %x in printf and it can display weird chars first +and then contents of files!

+ +

Hope you liked this post and if you would like to help me, contact me via email, xmpp or irc :)

+ +

tags: gru, orion

+ + + + + +

+GRU Devlog 6 - yemu, published gxt and interrupts working in Orion +

+ +
September 05, 2021 — +G1n +
+ + +

This week I have published gxt, but it currently works as more (only down scrolling). +Also it has a lot of of runtime error (Segmentation fault and others).

+ +

I have started working on yemu - Yet another EMUlator. It currently supports only 6502 +proccessor with tiny number of instructions (LDA, LDX and LDY)

+ +

Today we have fixed interrupts in Orion and now I can implement timer, paging, keyboard +and a lot of other things (thanks to quinn and smlckz from tilde.chat)

+ +

Hope you liked this post and if you would like to help me, +contact me via email, xmpp or irc :)

+ +

tags: gru, gxt, yemu, orion

+ + + + + +

+GRU Devlog 5 - First contribution from other person, coreutils and gxt (tui text editor) +

+ +
August 29, 2021 — +G1n +
+ + +

This week I had a lot of new ideas. But I think we have to work on something that +have already been started. +Also we now have one more coreutils rewrite +(now on C to more easily port it to Orion in future).

+ +

Also i have started working on some +projects that is not ready to be published yet. One of them is gxt - tui text editor.

+ +

Currently it can only move cursor and display files. But I think I’ll publish it next week +when editing will be working.

+ +

Bad news is that my school lessons will start next week so maybe this devlogs won’t be +published every week, because of not enough work done. But I don’t know, maybe I’ll have +enough time.

+ +

Also good news - we have first contribution on codeberg to grsh. I didn’t know this person +(because he is not from tildeverse :) ), so it is cool!

+ +

Hope you liked this devlog! If you can somehow help us, please contribute to our projects +on tildegit/codeberg and/or message me in someway :)

+ +

tags: gru, coreutils, contribution, gxt, grsh

+ + + + + +

+GRU Devlog 4 - more projects started, webpage for GRU and organizations on tildegit/codeberg +

+ +
August 22, 2021 — +G1n +
+ + +

In first days of this week I thought it will be not very productive. +But I was wrong.

+ +

We now have webpage and organizations on tildegit/codeberg:

+ +

https://g1n.ttm.sh/gru/

+ +

Also I am working on some new projects:

+ +
    +
  • orcc - GRU/Orion Compilers Collection (but currently I am working only on lexer so it is not published yet)

  • +
  • gasm - GRU assembler (maybe will be part of GRU binutils. Also not published yet)

  • +
  • hexutils - I think hexdump, xxd and some other utils will be in this project

  • +
+ + +

Also I tryed to advertize GRU on ~chat, some users liked us, +so maybe soon someone will help me with all this.

+ +

And of course if you can help me please contact me in someway! :)

+ +

tags: gru, orcc, gasm, hexutils, webpage

+ + + + + +

+GRU DevLog 3 - Orion and dreams about GRU software future +

+ +
August 15, 2021 — +G1n +
+ + +

This week I was trying to make interrupts, paging and other memory things working in Orion. +I found this guide and tried to follow it without rewriting the whole project: +http://www.jamesmolloy.co.uk/index.html

+ +

For now only Global Descriptor Table maybe working.

+ +

My current goals/dreams:

+ +
    +
  • make filesystem (the coolest would be make Ext2 driver)

  • +
  • build GCC hosted compiler (this will help GCC understand our OS better)

  • +
+ + +

My very future dreams:

+ +
    +
  • make kernel, libs, ports and soft in different repos

  • +
  • make proper way to make “distros” on our kernel

  • +
  • make some website with mirror of ports scripts (like in Serenity OS but not in one repo with +everything and tool for searching and downloading ports from that mirror)

  • +
  • maybe (if i will work a lot on this projects) I’ll make one more account on tilde.team +for our organisation (domain name - gru.ttm.sh, is cool), but i’ll ask admins about that

  • +
+ + +

Also I think Orion need new name because i found several projects with this name :)

+ +

Some ideas about the GRU name:

+ +
    +
  • GRU rocks (or rocking) UNIX

  • +
  • GloRious UNIX

  • +
  • GloRious Union

  • +
+ + +

If you can help me or have some ideas (name/names or anything else) contact me via email +or any other type of contact (irc: g1n on tilde.chat, xmpp: g1n@hmm.st)

+ +

tags: gru, orion, dreams

+ + + + + + + + +

+GRU DevLog 2 - Orion +

+ +
August 08, 2021 — +G1n +
+ + +

This week I was developing new OS - Orion.

+ +

I don’t understand very basic osdev thing so I decided to make OS on C and Asm. +Currently that can just output text (with printf arguments) on screen and serial. +Now gros is much cooler than Orion - it has input, interupts and a lot of else. +But maybe I’ll understand OSdev better. +Currently working on GDT (global descriptor table) and than will work on +interrupts and exceptions.

+ +

Of course if you can help me contact me throught email or in other ways!

+ +

tags: gru, orion

+ + + + + + + + +

+GRU DevLog 1 - gros sources published and add wc to grutils +

+ +
August 01, 2021 — +G1n +
+ + +

I didn’t make a lot work this week, so i think this devlogs should be renamed from “week number” to just “number” +Ok, so what i did this week: +- Add wc to grutils +- Published gros +- Add basic shell and some commands for gros

+ +

I know that is not a lot, but i was reading some osdev articles and books. +Currently I would like to implement basic filesystem but i don’t know what to do.

+ +

Some goals for gros (I will add that to gros readme): +- Filesystem (FAT or Ext2) +- ELF or other executable formats +- LibC (for compiling C programs) +- Maybe basic networking but after all of that

+ +

All code in osdev wiki is for C so I need to implement it myself (or port existing rust code)

+ +

If you can help me somehow please contact me via email (g1n@ttm.sh) or in other ways (~chat irc, xmpp)

+ +

tags: gru, grutils, gros

+ + + + + + + + +

+GRU DevLog Week 0 - grsh, grutils and start of gros +

+ +
July 25, 2021 — +G1n +
+ + +

So I have started new project this week - grsh! It is shell written on Rust. Also, for now, other rewrites of coreutils are there.

+ +

What grsh can do for this moment: echo some variables (pwd, user, home, status of previous command using $?) and text; true, false, : - set status; pwd shows current dir, also comments and cd working, basic piping (thanks to that article and of course executing not builtin command also working.

+ +

Some grutils that I made: ls, touch, mkdir/rmdir, rm, grep, head/tail, yes, cat.

+ +

TODOs exist in grsh repo - so you can read there some of my plans.

+ +

Yesterday i have started GROS - OS on Rust! But I haven’t published code yet because it not have that minimum of funcionality that i want. Thanks for that site for teaching how to make basics - https://os.phil-opp.com

+ +

So it was first of GRU Devlog! Thanks for reading! If you want to contribute to some of that project write me an email - g1n@ttm.sh , or contact me in other ways

+ +

tags: gru, grsh, grutils, gros

+ + + + + + + + +
+ +
+ diff --git a/blog/tag_grutils.html b/blog/tag_grutils.html new file mode 100644 index 0000000..2277332 --- /dev/null +++ b/blog/tag_grutils.html @@ -0,0 +1,88 @@ + + + + + + + +GRU's blog — posts tagged "grutils" + +
+
+
+

GRU's blog

+
GRU's blog
+
+
+

+GRU DevLog 1 - gros sources published and add wc to grutils +

+ +
August 01, 2021 — +G1n +
+ + +

I didn’t make a lot work this week, so i think this devlogs should be renamed from “week number” to just “number” +Ok, so what i did this week: +- Add wc to grutils +- Published gros +- Add basic shell and some commands for gros

+ +

I know that is not a lot, but i was reading some osdev articles and books. +Currently I would like to implement basic filesystem but i don’t know what to do.

+ +

Some goals for gros (I will add that to gros readme): +- Filesystem (FAT or Ext2) +- ELF or other executable formats +- LibC (for compiling C programs) +- Maybe basic networking but after all of that

+ +

All code in osdev wiki is for C so I need to implement it myself (or port existing rust code)

+ +

If you can help me somehow please contact me via email (g1n@ttm.sh) or in other ways (~chat irc, xmpp)

+ +

tags: gru, grutils, gros

+ + + + + + + + +

+GRU DevLog Week 0 - grsh, grutils and start of gros +

+ +
July 25, 2021 — +G1n +
+ + +

So I have started new project this week - grsh! It is shell written on Rust. Also, for now, other rewrites of coreutils are there.

+ +

What grsh can do for this moment: echo some variables (pwd, user, home, status of previous command using $?) and text; true, false, : - set status; pwd shows current dir, also comments and cd working, basic piping (thanks to that article and of course executing not builtin command also working.

+ +

Some grutils that I made: ls, touch, mkdir/rmdir, rm, grep, head/tail, yes, cat.

+ +

TODOs exist in grsh repo - so you can read there some of my plans.

+ +

Yesterday i have started GROS - OS on Rust! But I haven’t published code yet because it not have that minimum of funcionality that i want. Thanks for that site for teaching how to make basics - https://os.phil-opp.com

+ +

So it was first of GRU Devlog! Thanks for reading! If you want to contribute to some of that project write me an email - g1n@ttm.sh , or contact me in other ways

+ +

tags: gru, grsh, grutils, gros

+ + + + + + + + +
+ +
+ diff --git a/blog/tag_gxt.html b/blog/tag_gxt.html new file mode 100644 index 0000000..f6f2c60 --- /dev/null +++ b/blog/tag_gxt.html @@ -0,0 +1,84 @@ + + + + + + + +GRU's blog — posts tagged "gxt" + +
+
+
+

GRU's blog

+
GRU's blog
+
+
+

+GRU Devlog 6 - yemu, published gxt and interrupts working in Orion +

+ +
September 05, 2021 — +G1n +
+ + +

This week I have published gxt, but it currently works as more (only down scrolling). +Also it has a lot of of runtime error (Segmentation fault and others).

+ +

I have started working on yemu - Yet another EMUlator. It currently supports only 6502 +proccessor with tiny number of instructions (LDA, LDX and LDY)

+ +

Today we have fixed interrupts in Orion and now I can implement timer, paging, keyboard +and a lot of other things (thanks to quinn and smlckz from tilde.chat)

+ +

Hope you liked this post and if you would like to help me, +contact me via email, xmpp or irc :)

+ +

tags: gru, gxt, yemu, orion

+ + + + + +

+GRU Devlog 5 - First contribution from other person, coreutils and gxt (tui text editor) +

+ +
August 29, 2021 — +G1n +
+ + +

This week I had a lot of new ideas. But I think we have to work on something that +have already been started. +Also we now have one more coreutils rewrite +(now on C to more easily port it to Orion in future).

+ +

Also i have started working on some +projects that is not ready to be published yet. One of them is gxt - tui text editor.

+ +

Currently it can only move cursor and display files. But I think I’ll publish it next week +when editing will be working.

+ +

Bad news is that my school lessons will start next week so maybe this devlogs won’t be +published every week, because of not enough work done. But I don’t know, maybe I’ll have +enough time.

+ +

Also good news - we have first contribution on codeberg to grsh. I didn’t know this person +(because he is not from tildeverse :) ), so it is cool!

+ +

Hope you liked this devlog! If you can somehow help us, please contribute to our projects +on tildegit/codeberg and/or message me in someway :)

+ +

tags: gru, coreutils, contribution, gxt, grsh

+ + + + + +
+ +
+ diff --git a/blog/tag_hexutils.html b/blog/tag_hexutils.html new file mode 100644 index 0000000..dde4885 --- /dev/null +++ b/blog/tag_hexutils.html @@ -0,0 +1,57 @@ + + + + + + + +GRU's blog — posts tagged "hexutils" + +
+
+
+

GRU's blog

+
GRU's blog
+
+
+

+GRU Devlog 4 - more projects started, webpage for GRU and organizations on tildegit/codeberg +

+ +
August 22, 2021 — +G1n +
+ + +

In first days of this week I thought it will be not very productive. +But I was wrong.

+ +

We now have webpage and organizations on tildegit/codeberg:

+ +

https://g1n.ttm.sh/gru/

+ +

Also I am working on some new projects:

+ +
    +
  • orcc - GRU/Orion Compilers Collection (but currently I am working only on lexer so it is not published yet)

  • +
  • gasm - GRU assembler (maybe will be part of GRU binutils. Also not published yet)

  • +
  • hexutils - I think hexdump, xxd and some other utils will be in this project

  • +
+ + +

Also I tryed to advertize GRU on ~chat, some users liked us, +so maybe soon someone will help me with all this.

+ +

And of course if you can help me please contact me in someway! :)

+ +

tags: gru, orcc, gasm, hexutils, webpage

+ + + + + +
+ +
+ diff --git a/blog/tag_irc.html b/blog/tag_irc.html new file mode 100644 index 0000000..e04c514 --- /dev/null +++ b/blog/tag_irc.html @@ -0,0 +1,48 @@ + + + + + + + +GRU's blog — posts tagged "irc" + +
+
+
+

GRU's blog

+
GRU's blog
+
+
+

+GRU Devlog 16 - ormp and EGG +

+ +
November 14, 2021 — +G1n +
+ + +

This week i was working on one more new project - ormp. It will be terminal multiplexor. +Currently i am doing it in ncurses. For current time it is not working - can just handle input but not display it.

+ +

Also i have an idea for new projects - EGG (Extended/Exciting GRU GUI). I am planning some proj in this category - eggwm, eggterm, eggmenu and E. +E would be a new display server. We will need to have it for Orion in future. Currently i am planning to do it or on fbdev or on DRM/KMS.

+ +

Also now yemu can be compiled with different compilers, -pedantic flag was added to makefile and all errors fixed.

+ +

And now our channels are bridged via matterbridge: irc on ~chat, irc on libera and xmpp muc.

+ +

Hope you liked this post! If you would like to help us, contact me via email, xmpp or irc :)

+ +

tags: gru, ormp, egg, yemu, xmpp, irc

+ + + + + +
+ +
+ diff --git a/blog/tag_jitsi.html b/blog/tag_jitsi.html new file mode 100644 index 0000000..294b612 --- /dev/null +++ b/blog/tag_jitsi.html @@ -0,0 +1,54 @@ + + + + + + + +GRU's blog — posts tagged "jitsi" + +
+
+
+

GRU's blog

+
GRU's blog
+
+
+

+GRU Devlog 9 - orsh, orion, bootloader, GRU xmpp room and logo +

+ +
September 26, 2021 — +G1n +
+ + +

This week I didn’t commited a lot, but started some new projects. +I made orsh signal handling working (so it won’t exit on ^C) and homedir “handling” +(can replace homedir in prompt with ~, and you can use ‘cd ~’ or just ‘cd’ to change +dir to homedir)

+ +

Also I started making bootloader, but for now it can only detect what CPU is (intel if x86 and amd if x86_64), +some additional instructions (msr) and if apic is avalible.

+ +

I was trying to make something with orion fs, maybe it will use pak files for initrd. Currently i am making archiver +for it, but after that i will need to understand more how vfs working and rewrite initrd to use pak files.

+ +

We now have xmpp room (gru@conference.hmm.st) and logo! Thanks to chunk for it!

+ +

I was thinking about making weekly or monthly “conferences”. We could do it via jitsi tildeverse instance or tilde.tel +(tel.tilde.org.nz) conference. I think jitsi is better, but we should try tilde.tel confernce at least once, why not? :)

+ +

Hope you liked this post and you will join our XMPP muc :). If you would like to help me, contact me via email, xmpp or irc :)

+ +

tags: gru, orion, orsh, xmpp, tilde.tel, jitsi

+ + + + + +
+ +
+ diff --git a/blog/tag_libera.html b/blog/tag_libera.html new file mode 100644 index 0000000..9a7e671 --- /dev/null +++ b/blog/tag_libera.html @@ -0,0 +1,51 @@ + + + + + + + +GRU's blog — posts tagged "libera" + +
+
+
+

GRU's blog

+
GRU's blog
+
+
+

+GRU Devlog 11 - yemu and channel on libera.chat +

+ +
October 08, 2021 — +G1n +
+ + +

I am making this devlog a bit earlier, because I will be busy on weekends.

+ +

This week I didn’t have plan, but it seems I have done some things to yemu: added loading programs +from binary file and several instructions - TAX, TAY and NOP.

+ +

I think gasm will be made for 6502 firstly, because it is easier then x86 and it would help in +testing yemu.

+ +

I was trying to make some daily notes in Org Roam (and moved devlog notes there), but it wasn’t +very success, but I hope to do it more often :)

+ +

Also I have registered #gru channel on libera, so you can join us also on libera.chat :)

+ +

Hope you liked this post :). If you would like to help me, contact me via email, xmpp or irc :)

+ +

tags: gru, yemu, libera, org-mode, org-roam

+ + + + + +
+ +
+ diff --git a/blog/tag_liblinux.html b/blog/tag_liblinux.html new file mode 100644 index 0000000..627840b --- /dev/null +++ b/blog/tag_liblinux.html @@ -0,0 +1,86 @@ + + + + + + + +GRU's blog — posts tagged "liblinux" + +
+
+
+

GRU's blog

+
GRU's blog
+
+
+

+GRU Devlog 20 - olibc +

+ +
December 12, 2021 — +G1n +
+ + +

This week I was making olibc. I was implementing <string.h>. Also I was fixing liblinux to +be able to include it without need to use full path in #include. I had several other issues +with it and also fixed them.

+ +

My current goal is to implement <string.h> and after that I am planning to publish it. +Currently most of funcs are implemented. Making strtok now but all other functions need +locale.h and I don’t know yet how I will be implemented. But it is already cool that we +have most of functions that should be in <string.h>!

+ +

Also we now have gru webpage on codeberg! Maybe next week I +will move all devlogs to gru webpage so it will be easier to move.

+ +

Hope you liked this post! If you would like to help us, contact me via email, xmpp or irc :)

+ +

tags: gru, olibc, liblinux

+ + + +

+GRU Devlog 19 - gic and several libs +

+ +
December 05, 2021 — +G1n +
+ + +

This week started with making gic (maybe name will be change). As I have written before +it is going to be suckless ii clone. Also I started making girclib - simple C library for irc +protocol. I think it will be published as separate project, because I would like to make it +for both: client and server. I don’t yet how it will be done but we will see…

+ +

Then I thought that would be cool to have own libc, but have no knowledge how it speaks with OS. +Then I understood that on linux it is working via syscalls. So started making liblinux - +C library for linux syscalls. Using it we won’t need to use assembly a lot in our libc. Currently +write and read syscalls are done and programmer can use it if passed -I, -L and -l flags to compiler. +And it is already published! (check codeberg or tildegit)

+ +

After understanding how to create proper makefile with liblinux, I started making olibc. Currently +it has very tiny number of features. But string.h is mostly done! I don’t know when I will fill that +it will be ready enough to be published, but hope to have useful functions and test suit there till +that time.

+ +

When olibc will be done enough I am going to start making C compiler (already have some code, but it +is old and I not understand how it works, so need to be rewritten). Also I hope that we will have +enough toolchain (or I will have enough knowledge to implement things that are not done faster) +for our own Linux or BSD distribution. But that will be in future…

+ +

Hope you liked this post! If you would like to help us, contact me via email, xmpp or irc :)

+ +

tags: gru, gic, girclib, liblinux, olibc, libs

+ + + + + +
+ +
+ diff --git a/blog/tag_libs.html b/blog/tag_libs.html new file mode 100644 index 0000000..ee0eb0b --- /dev/null +++ b/blog/tag_libs.html @@ -0,0 +1,59 @@ + + + + + + + +GRU's blog — posts tagged "libs" + +
+
+
+

GRU's blog

+
GRU's blog
+
+
+

+GRU Devlog 19 - gic and several libs +

+ +
December 05, 2021 — +G1n +
+ + +

This week started with making gic (maybe name will be change). As I have written before +it is going to be suckless ii clone. Also I started making girclib - simple C library for irc +protocol. I think it will be published as separate project, because I would like to make it +for both: client and server. I don’t yet how it will be done but we will see…

+ +

Then I thought that would be cool to have own libc, but have no knowledge how it speaks with OS. +Then I understood that on linux it is working via syscalls. So started making liblinux - +C library for linux syscalls. Using it we won’t need to use assembly a lot in our libc. Currently +write and read syscalls are done and programmer can use it if passed -I, -L and -l flags to compiler. +And it is already published! (check codeberg or tildegit)

+ +

After understanding how to create proper makefile with liblinux, I started making olibc. Currently +it has very tiny number of features. But string.h is mostly done! I don’t know when I will fill that +it will be ready enough to be published, but hope to have useful functions and test suit there till +that time.

+ +

When olibc will be done enough I am going to start making C compiler (already have some code, but it +is old and I not understand how it works, so need to be rewritten). Also I hope that we will have +enough toolchain (or I will have enough knowledge to implement things that are not done faster) +for our own Linux or BSD distribution. But that will be in future…

+ +

Hope you liked this post! If you would like to help us, contact me via email, xmpp or irc :)

+ +

tags: gru, gic, girclib, liblinux, olibc, libs

+ + + + + +
+ +
+ diff --git a/blog/tag_license.html b/blog/tag_license.html new file mode 100644 index 0000000..14a9621 --- /dev/null +++ b/blog/tag_license.html @@ -0,0 +1,44 @@ + + + + + + + +GRU's blog — posts tagged "license" + +
+
+
+

GRU's blog

+
GRU's blog
+
+
+

+GRU Devlog 15 - ocpu, yemu and licenses +

+ +
November 07, 2021 — +G1n +
+ + +

This week wasn’t very productive. I was working on one of my personal projects.

+ +

I have added ADD for registers, INC, DEC and NOP instructions.

+ +

Also codeberg informed me that yemu has to have license, and I fast added MIT license to all our projects.

+ +

Hope you liked this post! If you would like to help me, contact me via email, xmpp or irc :)

+ +

tags: gru, ocpu, yemu, license

+ + + + + +
+ +
+ diff --git a/blog/tag_lobste.rs.html b/blog/tag_lobste.rs.html new file mode 100644 index 0000000..639445b --- /dev/null +++ b/blog/tag_lobste.rs.html @@ -0,0 +1,64 @@ + + + + + + + +GRU's blog — posts tagged "lobste.rs" + +
+
+
+

GRU's blog

+
GRU's blog
+
+
+

+GRU Devlog 10 - orsh now like proper shell and gasm +

+ +
October 03, 2021 — +G1n +
+ + +

Hooray! Today is 10’s GRU Devlog! :)

+ +

This week i was trying to make notes to org document, to not forget something and put TODOs +there for future weeks.

+ +

First several days was the most valuable - readline support and signal handling! +This means you can use emacs-like bindings there (but i think readline also supports vi bindings, +so maybe i will add them too!)

+ +

Also we now have very minimal completion support there :), but still proper function need to be added +for that (currently only filenames completion)

+ +

Orsh also has one session history, so you don’t need to rewrite command from scratch now

+ +

And I have started to use it as my main (but had some problems after chsh, so currently is autostarts after bash +and i can exit from there any time i will need)

+ +

Then I have started making our own assembler - gasm. Currently it only supports NOP, so i haven’t published it yet.

+ +

This week I also registered to ~news and shared devlog there (i think this devlog also will be there ;) ) +If you have lobste.rs account please contact me to invite me, if you can, because it may advertize GRU more!

+ +

Today (Sunday) we had first testing GRU meeting via Jitsi. Thanks to r1k for joining. +We need to make something like plan our schedule (to know about what to speak) and discuss meeting time better.

+ +

Hope you liked this post and you will join our XMPP muc (if you are not already there) :). +If you would like to help me, contact me via email, xmpp or irc :)

+ +

tags: gru, org-mode, gasm, orsh, meeting, lobste.rs, tilde.news

+ + + + + +
+ +
+ diff --git a/blog/tag_lolcpu.html b/blog/tag_lolcpu.html new file mode 100644 index 0000000..8c5f1b3 --- /dev/null +++ b/blog/tag_lolcpu.html @@ -0,0 +1,48 @@ + + + + + + + +GRU's blog — posts tagged "lolcpu" + +
+
+
+

GRU's blog

+
GRU's blog
+
+
+

+GRU Devlog 13 - ocpu thoughts and some elecronics +

+ +
October 24, 2021 — +G1n +
+ + +

This week was very busy week at school and I had no time for programming.

+ +

But in the start of week I was thinking about making ocpu specs more Turing-complete. +I still think it is not done but maybe it will in some time (and of course more description required).

+ +

But I had time to buy some transistors and other electronics. Currently I am trying to make half-adder.

+ +

I have created tiny log page - lolcpu. I am going to post there some of my +electronic ideas, circuits and progress in doing some electronic things.

+ +

Hope you liked this post! If you would like to help me, contact me via email, xmpp or irc :)

+ +

tags: gru, lolcpu, ocpu, transistors, electonics

+ + + + + +
+ +
+ diff --git a/blog/tag_meeting.html b/blog/tag_meeting.html new file mode 100644 index 0000000..ba89ac7 --- /dev/null +++ b/blog/tag_meeting.html @@ -0,0 +1,64 @@ + + + + + + + +GRU's blog — posts tagged "meeting" + +
+
+
+

GRU's blog

+
GRU's blog
+
+
+

+GRU Devlog 10 - orsh now like proper shell and gasm +

+ +
October 03, 2021 — +G1n +
+ + +

Hooray! Today is 10’s GRU Devlog! :)

+ +

This week i was trying to make notes to org document, to not forget something and put TODOs +there for future weeks.

+ +

First several days was the most valuable - readline support and signal handling! +This means you can use emacs-like bindings there (but i think readline also supports vi bindings, +so maybe i will add them too!)

+ +

Also we now have very minimal completion support there :), but still proper function need to be added +for that (currently only filenames completion)

+ +

Orsh also has one session history, so you don’t need to rewrite command from scratch now

+ +

And I have started to use it as my main (but had some problems after chsh, so currently is autostarts after bash +and i can exit from there any time i will need)

+ +

Then I have started making our own assembler - gasm. Currently it only supports NOP, so i haven’t published it yet.

+ +

This week I also registered to ~news and shared devlog there (i think this devlog also will be there ;) ) +If you have lobste.rs account please contact me to invite me, if you can, because it may advertize GRU more!

+ +

Today (Sunday) we had first testing GRU meeting via Jitsi. Thanks to r1k for joining. +We need to make something like plan our schedule (to know about what to speak) and discuss meeting time better.

+ +

Hope you liked this post and you will join our XMPP muc (if you are not already there) :). +If you would like to help me, contact me via email, xmpp or irc :)

+ +

tags: gru, org-mode, gasm, orsh, meeting, lobste.rs, tilde.news

+ + + + + +
+ +
+ diff --git a/blog/tag_ocpu.html b/blog/tag_ocpu.html new file mode 100644 index 0000000..9cf4f1d --- /dev/null +++ b/blog/tag_ocpu.html @@ -0,0 +1,129 @@ + + + + + + + +GRU's blog — posts tagged "ocpu" + +
+
+
+

GRU's blog

+
GRU's blog
+
+
+

+GRU Devlog 15 - ocpu, yemu and licenses +

+ +
November 07, 2021 — +G1n +
+ + +

This week wasn’t very productive. I was working on one of my personal projects.

+ +

I have added ADD for registers, INC, DEC and NOP instructions.

+ +

Also codeberg informed me that yemu has to have license, and I fast added MIT license to all our projects.

+ +

Hope you liked this post! If you would like to help me, contact me via email, xmpp or irc :)

+ +

tags: gru, ocpu, yemu, license

+ + + + + +

+GRU Devlog 14 - ocpu and yemu +

+ +
October 31, 2021 — +G1n +
+ + +

This week I was working on ocpu emulator. So using it we can know if specifications can be implemented. +It helps me adding some description to it.

+ +

First I made yemu a bit modular, so you need to add several lines to main file and then building your emulator +based on template (that should be placed in docs one day). Now if someone would like to add some architecture to +our emulator they won’t need to rewrite it from scratch.

+ +

I also added –system flag to yemu so architecture can be choosen more user-friendly way.

+ +

Currently in ocpu emulator only mov and add instructions are implemented. +We also added some description to commands in specifications, so it is easier to understand what it should do

+ +

Hope you liked this post! If you would like to help me, contact me via email, xmpp or irc :)

+ +

tags: gru, yemu, ocpu

+ + + + + +

+GRU Devlog 13 - ocpu thoughts and some elecronics +

+ +
October 24, 2021 — +G1n +
+ + +

This week was very busy week at school and I had no time for programming.

+ +

But in the start of week I was thinking about making ocpu specs more Turing-complete. +I still think it is not done but maybe it will in some time (and of course more description required).

+ +

But I had time to buy some transistors and other electronics. Currently I am trying to make half-adder.

+ +

I have created tiny log page - lolcpu. I am going to post there some of my +electronic ideas, circuits and progress in doing some electronic things.

+ +

Hope you liked this post! If you would like to help me, contact me via email, xmpp or irc :)

+ +

tags: gru, lolcpu, ocpu, transistors, electonics

+ + + + + +

+GRU Devlog 12 - yemu, gasm and ocpu +

+ +
October 17, 2021 — +G1n +
+ + +

This week I have done several new instructions for yemu. For example all transfer instructions.

+ +

Also I have rewritten gasm to support 6502, published it and it should help me with debugging yemu. +It supports not very a lot instructions but I hope it is good start.

+ +

But I think the coolest what I did this week is ocpu proccessor specification. +Currently it is draft but i have already published it here. +I hope this specifications will be Turing complete and we will try to implement it in real world. +But firstly we need to make this specififcations complete, assembler and emulator for it.

+ +

Also smlckz’s idea was to make translator from ocpu assembler instructions to avr to emulate it on arduino!

+ +

Hope you liked this post! If you would like to help me, contact me via email, xmpp or irc :)

+ +

tags: gru, yemu, gasm, ocpu

+ + + + + +
+ +
+ diff --git a/blog/tag_olibc.html b/blog/tag_olibc.html new file mode 100644 index 0000000..069af16 --- /dev/null +++ b/blog/tag_olibc.html @@ -0,0 +1,86 @@ + + + + + + + +GRU's blog — posts tagged "olibc" + +
+
+
+

GRU's blog

+
GRU's blog
+
+
+

+GRU Devlog 20 - olibc +

+ +
December 12, 2021 — +G1n +
+ + +

This week I was making olibc. I was implementing <string.h>. Also I was fixing liblinux to +be able to include it without need to use full path in #include. I had several other issues +with it and also fixed them.

+ +

My current goal is to implement <string.h> and after that I am planning to publish it. +Currently most of funcs are implemented. Making strtok now but all other functions need +locale.h and I don’t know yet how I will be implemented. But it is already cool that we +have most of functions that should be in <string.h>!

+ +

Also we now have gru webpage on codeberg! Maybe next week I +will move all devlogs to gru webpage so it will be easier to move.

+ +

Hope you liked this post! If you would like to help us, contact me via email, xmpp or irc :)

+ +

tags: gru, olibc, liblinux

+ + + +

+GRU Devlog 19 - gic and several libs +

+ +
December 05, 2021 — +G1n +
+ + +

This week started with making gic (maybe name will be change). As I have written before +it is going to be suckless ii clone. Also I started making girclib - simple C library for irc +protocol. I think it will be published as separate project, because I would like to make it +for both: client and server. I don’t yet how it will be done but we will see…

+ +

Then I thought that would be cool to have own libc, but have no knowledge how it speaks with OS. +Then I understood that on linux it is working via syscalls. So started making liblinux - +C library for linux syscalls. Using it we won’t need to use assembly a lot in our libc. Currently +write and read syscalls are done and programmer can use it if passed -I, -L and -l flags to compiler. +And it is already published! (check codeberg or tildegit)

+ +

After understanding how to create proper makefile with liblinux, I started making olibc. Currently +it has very tiny number of features. But string.h is mostly done! I don’t know when I will fill that +it will be ready enough to be published, but hope to have useful functions and test suit there till +that time.

+ +

When olibc will be done enough I am going to start making C compiler (already have some code, but it +is old and I not understand how it works, so need to be rewritten). Also I hope that we will have +enough toolchain (or I will have enough knowledge to implement things that are not done faster) +for our own Linux or BSD distribution. But that will be in future…

+ +

Hope you liked this post! If you would like to help us, contact me via email, xmpp or irc :)

+ +

tags: gru, gic, girclib, liblinux, olibc, libs

+ + + + + +
+ +
+ diff --git a/blog/tag_orcc.html b/blog/tag_orcc.html new file mode 100644 index 0000000..3a9b98e --- /dev/null +++ b/blog/tag_orcc.html @@ -0,0 +1,57 @@ + + + + + + + +GRU's blog — posts tagged "orcc" + +
+
+
+

GRU's blog

+
GRU's blog
+
+
+

+GRU Devlog 4 - more projects started, webpage for GRU and organizations on tildegit/codeberg +

+ +
August 22, 2021 — +G1n +
+ + +

In first days of this week I thought it will be not very productive. +But I was wrong.

+ +

We now have webpage and organizations on tildegit/codeberg:

+ +

https://g1n.ttm.sh/gru/

+ +

Also I am working on some new projects:

+ +
    +
  • orcc - GRU/Orion Compilers Collection (but currently I am working only on lexer so it is not published yet)

  • +
  • gasm - GRU assembler (maybe will be part of GRU binutils. Also not published yet)

  • +
  • hexutils - I think hexdump, xxd and some other utils will be in this project

  • +
+ + +

Also I tryed to advertize GRU on ~chat, some users liked us, +so maybe soon someone will help me with all this.

+ +

And of course if you can help me please contact me in someway! :)

+ +

tags: gru, orcc, gasm, hexutils, webpage

+ + + + + +
+ +
+ diff --git a/blog/tag_org-mode.html b/blog/tag_org-mode.html new file mode 100644 index 0000000..9f013cf --- /dev/null +++ b/blog/tag_org-mode.html @@ -0,0 +1,94 @@ + + + + + + + +GRU's blog — posts tagged "org-mode" + +
+
+
+

GRU's blog

+
GRU's blog
+
+
+

+GRU Devlog 11 - yemu and channel on libera.chat +

+ +
October 08, 2021 — +G1n +
+ + +

I am making this devlog a bit earlier, because I will be busy on weekends.

+ +

This week I didn’t have plan, but it seems I have done some things to yemu: added loading programs +from binary file and several instructions - TAX, TAY and NOP.

+ +

I think gasm will be made for 6502 firstly, because it is easier then x86 and it would help in +testing yemu.

+ +

I was trying to make some daily notes in Org Roam (and moved devlog notes there), but it wasn’t +very success, but I hope to do it more often :)

+ +

Also I have registered #gru channel on libera, so you can join us also on libera.chat :)

+ +

Hope you liked this post :). If you would like to help me, contact me via email, xmpp or irc :)

+ +

tags: gru, yemu, libera, org-mode, org-roam

+ + + + + +

+GRU Devlog 10 - orsh now like proper shell and gasm +

+ +
October 03, 2021 — +G1n +
+ + +

Hooray! Today is 10’s GRU Devlog! :)

+ +

This week i was trying to make notes to org document, to not forget something and put TODOs +there for future weeks.

+ +

First several days was the most valuable - readline support and signal handling! +This means you can use emacs-like bindings there (but i think readline also supports vi bindings, +so maybe i will add them too!)

+ +

Also we now have very minimal completion support there :), but still proper function need to be added +for that (currently only filenames completion)

+ +

Orsh also has one session history, so you don’t need to rewrite command from scratch now

+ +

And I have started to use it as my main (but had some problems after chsh, so currently is autostarts after bash +and i can exit from there any time i will need)

+ +

Then I have started making our own assembler - gasm. Currently it only supports NOP, so i haven’t published it yet.

+ +

This week I also registered to ~news and shared devlog there (i think this devlog also will be there ;) ) +If you have lobste.rs account please contact me to invite me, if you can, because it may advertize GRU more!

+ +

Today (Sunday) we had first testing GRU meeting via Jitsi. Thanks to r1k for joining. +We need to make something like plan our schedule (to know about what to speak) and discuss meeting time better.

+ +

Hope you liked this post and you will join our XMPP muc (if you are not already there) :). +If you would like to help me, contact me via email, xmpp or irc :)

+ +

tags: gru, org-mode, gasm, orsh, meeting, lobste.rs, tilde.news

+ + + + + +
+ +
+ diff --git a/blog/tag_org-roam.html b/blog/tag_org-roam.html new file mode 100644 index 0000000..8b2231f --- /dev/null +++ b/blog/tag_org-roam.html @@ -0,0 +1,51 @@ + + + + + + + +GRU's blog — posts tagged "org-roam" + +
+
+
+

GRU's blog

+
GRU's blog
+
+
+

+GRU Devlog 11 - yemu and channel on libera.chat +

+ +
October 08, 2021 — +G1n +
+ + +

I am making this devlog a bit earlier, because I will be busy on weekends.

+ +

This week I didn’t have plan, but it seems I have done some things to yemu: added loading programs +from binary file and several instructions - TAX, TAY and NOP.

+ +

I think gasm will be made for 6502 firstly, because it is easier then x86 and it would help in +testing yemu.

+ +

I was trying to make some daily notes in Org Roam (and moved devlog notes there), but it wasn’t +very success, but I hope to do it more often :)

+ +

Also I have registered #gru channel on libera, so you can join us also on libera.chat :)

+ +

Hope you liked this post :). If you would like to help me, contact me via email, xmpp or irc :)

+ +

tags: gru, yemu, libera, org-mode, org-roam

+ + + + + +
+ +
+ diff --git a/blog/tag_orion.html b/blog/tag_orion.html new file mode 100644 index 0000000..cca5e4a --- /dev/null +++ b/blog/tag_orion.html @@ -0,0 +1,221 @@ + + + + + + + +GRU's blog — posts tagged "orion" + +
+
+
+

GRU's blog

+
GRU's blog
+
+
+

+GRU Devlog 9 - orsh, orion, bootloader, GRU xmpp room and logo +

+ +
September 26, 2021 — +G1n +
+ + +

This week I didn’t commited a lot, but started some new projects. +I made orsh signal handling working (so it won’t exit on ^C) and homedir “handling” +(can replace homedir in prompt with ~, and you can use ‘cd ~’ or just ‘cd’ to change +dir to homedir)

+ +

Also I started making bootloader, but for now it can only detect what CPU is (intel if x86 and amd if x86_64), +some additional instructions (msr) and if apic is avalible.

+ +

I was trying to make something with orion fs, maybe it will use pak files for initrd. Currently i am making archiver +for it, but after that i will need to understand more how vfs working and rewrite initrd to use pak files.

+ +

We now have xmpp room (gru@conference.hmm.st) and logo! Thanks to chunk for it!

+ +

I was thinking about making weekly or monthly “conferences”. We could do it via jitsi tildeverse instance or tilde.tel +(tel.tilde.org.nz) conference. I think jitsi is better, but we should try tilde.tel confernce at least once, why not? :)

+ +

Hope you liked this post and you will join our XMPP muc :). If you would like to help me, contact me via email, xmpp or irc :)

+ +

tags: gru, orion, orsh, xmpp, tilde.tel, jitsi

+ + + + + +

+GRU Devlog 8 - orsh and published initrd +

+ +
September 19, 2021 — +G1n +
+ + +

This week I have published initrd, but it is not working as expected.

+ +

Also I have started one more project - orsh. It is one more shell, but now in C. +Maybe it will be easier to port to Orion. It already supports ; but they are working a bit weird.

+ +

Also in orsh you can work with environment variables. +From today’s morning I am trying to replace bash with it, but still a lot need to be done.

+ +

Hope you liked this post and if you would like to help me, contact me via email, xmpp or irc :)

+ +

tags: gru, orsh, orion

+ + + + + +

+GRU Devlog 7 - keyboard, paging and WIP initrd in Orion +

+ +
September 12, 2021 — +G1n +
+ + +

This week I was improving Orion. First I made keyboard working, next day paging! +Also I have added several new LibC functions. +Today I have made scrolling working.

+ +

Last few days I was trying to make initrd working +(this required heap implementing so I also did that but I don’t know if it works correctly). +Currently it can only output /dev directory.

+ +

But I made something wrong with %x in printf and it can display weird chars first +and then contents of files!

+ +

Hope you liked this post and if you would like to help me, contact me via email, xmpp or irc :)

+ +

tags: gru, orion

+ + + + + +

+GRU Devlog 6 - yemu, published gxt and interrupts working in Orion +

+ +
September 05, 2021 — +G1n +
+ + +

This week I have published gxt, but it currently works as more (only down scrolling). +Also it has a lot of of runtime error (Segmentation fault and others).

+ +

I have started working on yemu - Yet another EMUlator. It currently supports only 6502 +proccessor with tiny number of instructions (LDA, LDX and LDY)

+ +

Today we have fixed interrupts in Orion and now I can implement timer, paging, keyboard +and a lot of other things (thanks to quinn and smlckz from tilde.chat)

+ +

Hope you liked this post and if you would like to help me, +contact me via email, xmpp or irc :)

+ +

tags: gru, gxt, yemu, orion

+ + + + + +

+GRU DevLog 3 - Orion and dreams about GRU software future +

+ +
August 15, 2021 — +G1n +
+ + +

This week I was trying to make interrupts, paging and other memory things working in Orion. +I found this guide and tried to follow it without rewriting the whole project: +http://www.jamesmolloy.co.uk/index.html

+ +

For now only Global Descriptor Table maybe working.

+ +

My current goals/dreams:

+ +
    +
  • make filesystem (the coolest would be make Ext2 driver)

  • +
  • build GCC hosted compiler (this will help GCC understand our OS better)

  • +
+ + +

My very future dreams:

+ +
    +
  • make kernel, libs, ports and soft in different repos

  • +
  • make proper way to make “distros” on our kernel

  • +
  • make some website with mirror of ports scripts (like in Serenity OS but not in one repo with +everything and tool for searching and downloading ports from that mirror)

  • +
  • maybe (if i will work a lot on this projects) I’ll make one more account on tilde.team +for our organisation (domain name - gru.ttm.sh, is cool), but i’ll ask admins about that

  • +
+ + +

Also I think Orion need new name because i found several projects with this name :)

+ +

Some ideas about the GRU name:

+ +
    +
  • GRU rocks (or rocking) UNIX

  • +
  • GloRious UNIX

  • +
  • GloRious Union

  • +
+ + +

If you can help me or have some ideas (name/names or anything else) contact me via email +or any other type of contact (irc: g1n on tilde.chat, xmpp: g1n@hmm.st)

+ +

tags: gru, orion, dreams

+ + + + + + + + +

+GRU DevLog 2 - Orion +

+ +
August 08, 2021 — +G1n +
+ + +

This week I was developing new OS - Orion.

+ +

I don’t understand very basic osdev thing so I decided to make OS on C and Asm. +Currently that can just output text (with printf arguments) on screen and serial. +Now gros is much cooler than Orion - it has input, interupts and a lot of else. +But maybe I’ll understand OSdev better. +Currently working on GDT (global descriptor table) and than will work on +interrupts and exceptions.

+ +

Of course if you can help me contact me throught email or in other ways!

+ +

tags: gru, orion

+ + + + + + + + +
+ +
+ diff --git a/blog/tag_ormp.html b/blog/tag_ormp.html new file mode 100644 index 0000000..66ff43d --- /dev/null +++ b/blog/tag_ormp.html @@ -0,0 +1,48 @@ + + + + + + + +GRU's blog — posts tagged "ormp" + +
+
+
+

GRU's blog

+
GRU's blog
+
+
+

+GRU Devlog 16 - ormp and EGG +

+ +
November 14, 2021 — +G1n +
+ + +

This week i was working on one more new project - ormp. It will be terminal multiplexor. +Currently i am doing it in ncurses. For current time it is not working - can just handle input but not display it.

+ +

Also i have an idea for new projects - EGG (Extended/Exciting GRU GUI). I am planning some proj in this category - eggwm, eggterm, eggmenu and E. +E would be a new display server. We will need to have it for Orion in future. Currently i am planning to do it or on fbdev or on DRM/KMS.

+ +

Also now yemu can be compiled with different compilers, -pedantic flag was added to makefile and all errors fixed.

+ +

And now our channels are bridged via matterbridge: irc on ~chat, irc on libera and xmpp muc.

+ +

Hope you liked this post! If you would like to help us, contact me via email, xmpp or irc :)

+ +

tags: gru, ormp, egg, yemu, xmpp, irc

+ + + + + +
+ +
+ diff --git a/blog/tag_orsh.html b/blog/tag_orsh.html new file mode 100644 index 0000000..731051d --- /dev/null +++ b/blog/tag_orsh.html @@ -0,0 +1,122 @@ + + + + + + + +GRU's blog — posts tagged "orsh" + +
+
+
+

GRU's blog

+
GRU's blog
+
+
+

+GRU Devlog 10 - orsh now like proper shell and gasm +

+ +
October 03, 2021 — +G1n +
+ + +

Hooray! Today is 10’s GRU Devlog! :)

+ +

This week i was trying to make notes to org document, to not forget something and put TODOs +there for future weeks.

+ +

First several days was the most valuable - readline support and signal handling! +This means you can use emacs-like bindings there (but i think readline also supports vi bindings, +so maybe i will add them too!)

+ +

Also we now have very minimal completion support there :), but still proper function need to be added +for that (currently only filenames completion)

+ +

Orsh also has one session history, so you don’t need to rewrite command from scratch now

+ +

And I have started to use it as my main (but had some problems after chsh, so currently is autostarts after bash +and i can exit from there any time i will need)

+ +

Then I have started making our own assembler - gasm. Currently it only supports NOP, so i haven’t published it yet.

+ +

This week I also registered to ~news and shared devlog there (i think this devlog also will be there ;) ) +If you have lobste.rs account please contact me to invite me, if you can, because it may advertize GRU more!

+ +

Today (Sunday) we had first testing GRU meeting via Jitsi. Thanks to r1k for joining. +We need to make something like plan our schedule (to know about what to speak) and discuss meeting time better.

+ +

Hope you liked this post and you will join our XMPP muc (if you are not already there) :). +If you would like to help me, contact me via email, xmpp or irc :)

+ +

tags: gru, org-mode, gasm, orsh, meeting, lobste.rs, tilde.news

+ + + + + +

+GRU Devlog 9 - orsh, orion, bootloader, GRU xmpp room and logo +

+ +
September 26, 2021 — +G1n +
+ + +

This week I didn’t commited a lot, but started some new projects. +I made orsh signal handling working (so it won’t exit on ^C) and homedir “handling” +(can replace homedir in prompt with ~, and you can use ‘cd ~’ or just ‘cd’ to change +dir to homedir)

+ +

Also I started making bootloader, but for now it can only detect what CPU is (intel if x86 and amd if x86_64), +some additional instructions (msr) and if apic is avalible.

+ +

I was trying to make something with orion fs, maybe it will use pak files for initrd. Currently i am making archiver +for it, but after that i will need to understand more how vfs working and rewrite initrd to use pak files.

+ +

We now have xmpp room (gru@conference.hmm.st) and logo! Thanks to chunk for it!

+ +

I was thinking about making weekly or monthly “conferences”. We could do it via jitsi tildeverse instance or tilde.tel +(tel.tilde.org.nz) conference. I think jitsi is better, but we should try tilde.tel confernce at least once, why not? :)

+ +

Hope you liked this post and you will join our XMPP muc :). If you would like to help me, contact me via email, xmpp or irc :)

+ +

tags: gru, orion, orsh, xmpp, tilde.tel, jitsi

+ + + + + +

+GRU Devlog 8 - orsh and published initrd +

+ +
September 19, 2021 — +G1n +
+ + +

This week I have published initrd, but it is not working as expected.

+ +

Also I have started one more project - orsh. It is one more shell, but now in C. +Maybe it will be easier to port to Orion. It already supports ; but they are working a bit weird.

+ +

Also in orsh you can work with environment variables. +From today’s morning I am trying to replace bash with it, but still a lot need to be done.

+ +

Hope you liked this post and if you would like to help me, contact me via email, xmpp or irc :)

+ +

tags: gru, orsh, orion

+ + + + + +
+ +
+ diff --git a/blog/tag_tilde.news.html b/blog/tag_tilde.news.html new file mode 100644 index 0000000..43ac42a --- /dev/null +++ b/blog/tag_tilde.news.html @@ -0,0 +1,64 @@ + + + + + + + +GRU's blog — posts tagged "tilde.news" + +
+
+
+

GRU's blog

+
GRU's blog
+
+
+

+GRU Devlog 10 - orsh now like proper shell and gasm +

+ +
October 03, 2021 — +G1n +
+ + +

Hooray! Today is 10’s GRU Devlog! :)

+ +

This week i was trying to make notes to org document, to not forget something and put TODOs +there for future weeks.

+ +

First several days was the most valuable - readline support and signal handling! +This means you can use emacs-like bindings there (but i think readline also supports vi bindings, +so maybe i will add them too!)

+ +

Also we now have very minimal completion support there :), but still proper function need to be added +for that (currently only filenames completion)

+ +

Orsh also has one session history, so you don’t need to rewrite command from scratch now

+ +

And I have started to use it as my main (but had some problems after chsh, so currently is autostarts after bash +and i can exit from there any time i will need)

+ +

Then I have started making our own assembler - gasm. Currently it only supports NOP, so i haven’t published it yet.

+ +

This week I also registered to ~news and shared devlog there (i think this devlog also will be there ;) ) +If you have lobste.rs account please contact me to invite me, if you can, because it may advertize GRU more!

+ +

Today (Sunday) we had first testing GRU meeting via Jitsi. Thanks to r1k for joining. +We need to make something like plan our schedule (to know about what to speak) and discuss meeting time better.

+ +

Hope you liked this post and you will join our XMPP muc (if you are not already there) :). +If you would like to help me, contact me via email, xmpp or irc :)

+ +

tags: gru, org-mode, gasm, orsh, meeting, lobste.rs, tilde.news

+ + + + + +
+ +
+ diff --git a/blog/tag_tilde.tel.html b/blog/tag_tilde.tel.html new file mode 100644 index 0000000..609d5e2 --- /dev/null +++ b/blog/tag_tilde.tel.html @@ -0,0 +1,54 @@ + + + + + + + +GRU's blog — posts tagged "tilde.tel" + +
+
+
+

GRU's blog

+
GRU's blog
+
+
+

+GRU Devlog 9 - orsh, orion, bootloader, GRU xmpp room and logo +

+ +
September 26, 2021 — +G1n +
+ + +

This week I didn’t commited a lot, but started some new projects. +I made orsh signal handling working (so it won’t exit on ^C) and homedir “handling” +(can replace homedir in prompt with ~, and you can use ‘cd ~’ or just ‘cd’ to change +dir to homedir)

+ +

Also I started making bootloader, but for now it can only detect what CPU is (intel if x86 and amd if x86_64), +some additional instructions (msr) and if apic is avalible.

+ +

I was trying to make something with orion fs, maybe it will use pak files for initrd. Currently i am making archiver +for it, but after that i will need to understand more how vfs working and rewrite initrd to use pak files.

+ +

We now have xmpp room (gru@conference.hmm.st) and logo! Thanks to chunk for it!

+ +

I was thinking about making weekly or monthly “conferences”. We could do it via jitsi tildeverse instance or tilde.tel +(tel.tilde.org.nz) conference. I think jitsi is better, but we should try tilde.tel confernce at least once, why not? :)

+ +

Hope you liked this post and you will join our XMPP muc :). If you would like to help me, contact me via email, xmpp or irc :)

+ +

tags: gru, orion, orsh, xmpp, tilde.tel, jitsi

+ + + + + +
+ +
+ diff --git a/blog/tag_transistors.html b/blog/tag_transistors.html new file mode 100644 index 0000000..8ff6d8b --- /dev/null +++ b/blog/tag_transistors.html @@ -0,0 +1,48 @@ + + + + + + + +GRU's blog — posts tagged "transistors" + +
+
+
+

GRU's blog

+
GRU's blog
+
+
+

+GRU Devlog 13 - ocpu thoughts and some elecronics +

+ +
October 24, 2021 — +G1n +
+ + +

This week was very busy week at school and I had no time for programming.

+ +

But in the start of week I was thinking about making ocpu specs more Turing-complete. +I still think it is not done but maybe it will in some time (and of course more description required).

+ +

But I had time to buy some transistors and other electronics. Currently I am trying to make half-adder.

+ +

I have created tiny log page - lolcpu. I am going to post there some of my +electronic ideas, circuits and progress in doing some electronic things.

+ +

Hope you liked this post! If you would like to help me, contact me via email, xmpp or irc :)

+ +

tags: gru, lolcpu, ocpu, transistors, electonics

+ + + + + +
+ +
+ diff --git a/blog/tag_webpage.html b/blog/tag_webpage.html new file mode 100644 index 0000000..7ccea79 --- /dev/null +++ b/blog/tag_webpage.html @@ -0,0 +1,57 @@ + + + + + + + +GRU's blog — posts tagged "webpage" + +
+
+
+

GRU's blog

+
GRU's blog
+
+
+

+GRU Devlog 4 - more projects started, webpage for GRU and organizations on tildegit/codeberg +

+ +
August 22, 2021 — +G1n +
+ + +

In first days of this week I thought it will be not very productive. +But I was wrong.

+ +

We now have webpage and organizations on tildegit/codeberg:

+ +

https://g1n.ttm.sh/gru/

+ +

Also I am working on some new projects:

+ +
    +
  • orcc - GRU/Orion Compilers Collection (but currently I am working only on lexer so it is not published yet)

  • +
  • gasm - GRU assembler (maybe will be part of GRU binutils. Also not published yet)

  • +
  • hexutils - I think hexdump, xxd and some other utils will be in this project

  • +
+ + +

Also I tryed to advertize GRU on ~chat, some users liked us, +so maybe soon someone will help me with all this.

+ +

And of course if you can help me please contact me in someway! :)

+ +

tags: gru, orcc, gasm, hexutils, webpage

+ + + + + +
+ +
+ diff --git a/blog/tag_xmpp.html b/blog/tag_xmpp.html new file mode 100644 index 0000000..2317c6d --- /dev/null +++ b/blog/tag_xmpp.html @@ -0,0 +1,81 @@ + + + + + + + +GRU's blog — posts tagged "xmpp" + +
+
+
+

GRU's blog

+
GRU's blog
+
+
+

+GRU Devlog 16 - ormp and EGG +

+ +
November 14, 2021 — +G1n +
+ + +

This week i was working on one more new project - ormp. It will be terminal multiplexor. +Currently i am doing it in ncurses. For current time it is not working - can just handle input but not display it.

+ +

Also i have an idea for new projects - EGG (Extended/Exciting GRU GUI). I am planning some proj in this category - eggwm, eggterm, eggmenu and E. +E would be a new display server. We will need to have it for Orion in future. Currently i am planning to do it or on fbdev or on DRM/KMS.

+ +

Also now yemu can be compiled with different compilers, -pedantic flag was added to makefile and all errors fixed.

+ +

And now our channels are bridged via matterbridge: irc on ~chat, irc on libera and xmpp muc.

+ +

Hope you liked this post! If you would like to help us, contact me via email, xmpp or irc :)

+ +

tags: gru, ormp, egg, yemu, xmpp, irc

+ + + + + +

+GRU Devlog 9 - orsh, orion, bootloader, GRU xmpp room and logo +

+ +
September 26, 2021 — +G1n +
+ + +

This week I didn’t commited a lot, but started some new projects. +I made orsh signal handling working (so it won’t exit on ^C) and homedir “handling” +(can replace homedir in prompt with ~, and you can use ‘cd ~’ or just ‘cd’ to change +dir to homedir)

+ +

Also I started making bootloader, but for now it can only detect what CPU is (intel if x86 and amd if x86_64), +some additional instructions (msr) and if apic is avalible.

+ +

I was trying to make something with orion fs, maybe it will use pak files for initrd. Currently i am making archiver +for it, but after that i will need to understand more how vfs working and rewrite initrd to use pak files.

+ +

We now have xmpp room (gru@conference.hmm.st) and logo! Thanks to chunk for it!

+ +

I was thinking about making weekly or monthly “conferences”. We could do it via jitsi tildeverse instance or tilde.tel +(tel.tilde.org.nz) conference. I think jitsi is better, but we should try tilde.tel confernce at least once, why not? :)

+ +

Hope you liked this post and you will join our XMPP muc :). If you would like to help me, contact me via email, xmpp or irc :)

+ +

tags: gru, orion, orsh, xmpp, tilde.tel, jitsi

+ + + + + +
+ +
+ diff --git a/blog/tag_yemu.html b/blog/tag_yemu.html new file mode 100644 index 0000000..813bc68 --- /dev/null +++ b/blog/tag_yemu.html @@ -0,0 +1,186 @@ + + + + + + + +GRU's blog — posts tagged "yemu" + +
+
+
+

GRU's blog

+
GRU's blog
+
+
+

+GRU Devlog 16 - ormp and EGG +

+ +
November 14, 2021 — +G1n +
+ + +

This week i was working on one more new project - ormp. It will be terminal multiplexor. +Currently i am doing it in ncurses. For current time it is not working - can just handle input but not display it.

+ +

Also i have an idea for new projects - EGG (Extended/Exciting GRU GUI). I am planning some proj in this category - eggwm, eggterm, eggmenu and E. +E would be a new display server. We will need to have it for Orion in future. Currently i am planning to do it or on fbdev or on DRM/KMS.

+ +

Also now yemu can be compiled with different compilers, -pedantic flag was added to makefile and all errors fixed.

+ +

And now our channels are bridged via matterbridge: irc on ~chat, irc on libera and xmpp muc.

+ +

Hope you liked this post! If you would like to help us, contact me via email, xmpp or irc :)

+ +

tags: gru, ormp, egg, yemu, xmpp, irc

+ + + + + +

+GRU Devlog 15 - ocpu, yemu and licenses +

+ +
November 07, 2021 — +G1n +
+ + +

This week wasn’t very productive. I was working on one of my personal projects.

+ +

I have added ADD for registers, INC, DEC and NOP instructions.

+ +

Also codeberg informed me that yemu has to have license, and I fast added MIT license to all our projects.

+ +

Hope you liked this post! If you would like to help me, contact me via email, xmpp or irc :)

+ +

tags: gru, ocpu, yemu, license

+ + + + + +

+GRU Devlog 14 - ocpu and yemu +

+ +
October 31, 2021 — +G1n +
+ + +

This week I was working on ocpu emulator. So using it we can know if specifications can be implemented. +It helps me adding some description to it.

+ +

First I made yemu a bit modular, so you need to add several lines to main file and then building your emulator +based on template (that should be placed in docs one day). Now if someone would like to add some architecture to +our emulator they won’t need to rewrite it from scratch.

+ +

I also added –system flag to yemu so architecture can be choosen more user-friendly way.

+ +

Currently in ocpu emulator only mov and add instructions are implemented. +We also added some description to commands in specifications, so it is easier to understand what it should do

+ +

Hope you liked this post! If you would like to help me, contact me via email, xmpp or irc :)

+ +

tags: gru, yemu, ocpu

+ + + + + +

+GRU Devlog 12 - yemu, gasm and ocpu +

+ +
October 17, 2021 — +G1n +
+ + +

This week I have done several new instructions for yemu. For example all transfer instructions.

+ +

Also I have rewritten gasm to support 6502, published it and it should help me with debugging yemu. +It supports not very a lot instructions but I hope it is good start.

+ +

But I think the coolest what I did this week is ocpu proccessor specification. +Currently it is draft but i have already published it here. +I hope this specifications will be Turing complete and we will try to implement it in real world. +But firstly we need to make this specififcations complete, assembler and emulator for it.

+ +

Also smlckz’s idea was to make translator from ocpu assembler instructions to avr to emulate it on arduino!

+ +

Hope you liked this post! If you would like to help me, contact me via email, xmpp or irc :)

+ +

tags: gru, yemu, gasm, ocpu

+ + + + + +

+GRU Devlog 11 - yemu and channel on libera.chat +

+ +
October 08, 2021 — +G1n +
+ + +

I am making this devlog a bit earlier, because I will be busy on weekends.

+ +

This week I didn’t have plan, but it seems I have done some things to yemu: added loading programs +from binary file and several instructions - TAX, TAY and NOP.

+ +

I think gasm will be made for 6502 firstly, because it is easier then x86 and it would help in +testing yemu.

+ +

I was trying to make some daily notes in Org Roam (and moved devlog notes there), but it wasn’t +very success, but I hope to do it more often :)

+ +

Also I have registered #gru channel on libera, so you can join us also on libera.chat :)

+ +

Hope you liked this post :). If you would like to help me, contact me via email, xmpp or irc :)

+ +

tags: gru, yemu, libera, org-mode, org-roam

+ + + + + +

+GRU Devlog 6 - yemu, published gxt and interrupts working in Orion +

+ +
September 05, 2021 — +G1n +
+ + +

This week I have published gxt, but it currently works as more (only down scrolling). +Also it has a lot of of runtime error (Segmentation fault and others).

+ +

I have started working on yemu - Yet another EMUlator. It currently supports only 6502 +proccessor with tiny number of instructions (LDA, LDX and LDY)

+ +

Today we have fixed interrupts in Orion and now I can implement timer, paging, keyboard +and a lot of other things (thanks to quinn and smlckz from tilde.chat)

+ +

Hope you liked this post and if you would like to help me, +contact me via email, xmpp or irc :)

+ +

tags: gru, gxt, yemu, orion

+ + + + + +
+ +
+