<?xml version="1.0" encoding="utf-8" standalone="yes"?><?xml-stylesheet href="/rss.xsl" type="text/xsl"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/"><title>Projects on Hyteck</title><link href="https://hyteck.de/categories/projects/"/><generator>Hugo -- gohugo.io</generator><language>en-us</language><id>https://hyteck.de/categories/projects/</id><updated>2022-11-20T04:56:10+02:00</updated><link href="https://hyteck.de/categories/projects/index.xml" rel="self" type="application/rss+xml"/><entry><title>Rules, Terms and Privacy for GoToSocial: gay-pirate-assassins.de</title><link href="https://hyteck.de/gay-pirate-assassins/" type="application/octet-stream"/><updated>2022-11-20T04:56:10+02:00</updated><id>https://hyteck.de/gay-pirate-assassins/</id><author><name>Julian-Samuel Gebühr</name></author><content type="html"> &lt;h1 id="rules">Rules&lt;/h1>
&lt;p>&lt;em>&amp;quot;Be excellent to each other&amp;quot;&lt;/em> is easier said than done, and means
different things to different people.&lt;/p>
&lt;p>The following rules are a (non-exhaustive) list of behaviours that may
lead to deletion of toots, silencing or suspension of accounts, at the
descretion of the instance administrators, as described in our
&lt;a href="#terms-of-service">Terms&lt;/a>&lt;/p>
&lt;p>Please report behaviour that bothers you. We will keep your report
confidential.&lt;/p>
&lt;ul>
&lt;li>We do not tolerate discriminatory behaviour and content promoting or
advocating the oppression of members of marginalised groups. These
groups may be characterised by any of the following (though this
list is naturally incomplete):
&lt;ul>
&lt;li>ethnicity&lt;/li>
&lt;li>gender identity or expression&lt;/li>
&lt;li>sexual identity or expression&lt;/li>
&lt;li>physical characteristics or age&lt;/li>
&lt;li>disability or illness&lt;/li>
&lt;li>nationality, residency, citizen status&lt;/li>
&lt;li>wealth or education&lt;/li>
&lt;li>religious affiliation, agnosticism or atheism&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>We do not tolerate threatening behaviour, stalking, and
&lt;a href="https://en.wikipedia.org/wiki/Doxxing">doxxing&lt;/a>&lt;/li>
&lt;li>We do not tolerate harassment, including brigading, dogpiling, or
any other form of contact with a user who has stated that they do
not wish to be contacted.&lt;/li>
&lt;li>We do not tolerate mobbing, including name-calling, intentional
misgendering or deadnaming.&lt;/li>
&lt;li>We do not tolerate violent nationalist propaganda, Nazi symbolism or
promoting the ideology of National Socialism.&lt;/li>
&lt;li>We do not tolerate conspiracy narratives or other reactionary myths
supporting or leading to the above-mentioned (and/or similar)
behavior.&lt;/li>
&lt;li>Actions intended to damage this instance or its performance may lead
to immediate account suspension.&lt;/li>
&lt;li>Content that is illegal in Germany will be deleted and may lead to
immediate account suspension.&lt;/li>
&lt;/ul>
&lt;h2 id="best-practices">Best practices&lt;/h2>
&lt;p>The list below is a collection of behaviour that we expect to see from
our users. If you see a user go against these best practices in a way
that bothers you, please file a report and we will talk to them. While
these best practices are designed to be guidelines for a good communal
instance, &lt;strong>repeated malicious unwillingness&lt;/strong> to follow the best
practices will be considered just like breaking a rule.&lt;/p>
&lt;ul>
&lt;li>In general, use the tools provided to foster a considerate and
accessible atmosphere. This includes the liberal use of content
warnings (especially on potentially disturbing or controversial
topics), and alt-text captioning of media files.&lt;/li>
&lt;li>When possible, provide credit for creative works in your posts that
are not your own.&lt;/li>
&lt;li>Uninvited comments about another user's personal choices, lifestyle
or family are strongly discouraged and may be considered harassment.
Inappropriate sexual attention, comments about appearance and
implication of physical contact will not be tolerated toward any
non-consenting user.&lt;/li>
&lt;li>If you post sexual content or gore, use content warnings.&lt;/li>
&lt;li>If you post advertisements, use a content warning. Advertisements
should not be excessive or automated.&lt;/li>
&lt;li>Bots may only interact with a user when they're invited by that
user to do so.&lt;/li>
&lt;li>Automated posts and high-frequency posts should be &lt;strong>unlisted&lt;/strong>
(rendering visible to everybody, but not appearing on the local
timeline) to keep the local timeline of our instance a place of
community dialogue and human interaction. This extends to bots, feed
posters, Twitter &amp;quot;retweets&amp;quot; and Twitter crossposts with broken
mentions (&amp;quot;&amp;hellip;@twitter.com&amp;quot;). Crossposter accounts that stop being
active participants in our community may be removed at the
discretion of the moderators.&lt;/li>
&lt;li>In discussions, please remain civil, do not insult the people
you're talking to. Note that irony, sarcasm, or similar modes of
language don't translate well to written language and tend to
escalate discussions or misunderstandings.&lt;/li>
&lt;/ul>
&lt;p>&lt;em>(These best practices were inspired by the Terms of bsd.network. Thank
you!)&lt;/em>&lt;/p>
&lt;h2 id="resources">Resources&lt;/h2>
&lt;p>I am maintaining this instance on my spare time, hardware and nerves.
Don't push either of those.&lt;/p>
&lt;h1 id="terms-of-service">Terms of Service&lt;/h1>
&lt;p>adapted from chaos.social which was in turn adepted by the bsd.network ToS&lt;/p>
&lt;p>It is our intention that you use this service for personal enjoyment and
respectful, friendly interaction. To that end, we hope to foster a
welcoming and inclusive environment.&lt;/p>
&lt;p>The server is privately owned and open to users voluntarily, not a
public space. Users wishing to join this community are expected to act
without malice and in good faith. Doing otherwise may lead to removal
from the service, independent of whether a user violates any rules
outlined below.&lt;/p>
&lt;p>The administrators and moderators of this instance are&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://chaos.social/@moanos">moanos&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>The server hosting the instance is located in Germany.&lt;/p>
&lt;p>The following statements apply regardless of privacy level and instance
of the users involved. In rare cases, public or private offline conduct
or conduct on a separate instance may constitute grounds for removal
from the service.&lt;/p>
&lt;hr>
&lt;h3 id="policies-and-rules">Policies and Rules&lt;/h3>
&lt;p>Our instance is subject to a set of rules governing user behaviour. The
rules are defined above.&lt;/p>
&lt;p>These rules are designed to maintain a friendly and open atmosphere, and
to prevent harassment and discrimination. As such, they are a set of
guidelines, but by necessity incomplete. Users violating the spirit of
these rules will be treated no differently than users violating a
specific rule.&lt;/p>
&lt;p>Please note that our rules contain a section on best practices, and
users who repeatedly and despite warnings disregard these best practices
may be seen to be in violation of our rules.&lt;/p>
&lt;p>The moderators may remove accounts who spam the instance, or are
suspected of camping just to reserve an account name. Violation of the
policies and rules may also lead to account removal at the discretion of
the moderators.&lt;/p>
&lt;h3 id="data-access">Data Access&lt;/h3>
&lt;p>Content on this instance must not be used for the purposes of machine
learning or other &amp;quot;research&amp;quot; purposes without the explicit consent of
the users involved.&lt;/p>
&lt;p>Content on this instance beyond this page must not be archived or
indexed wholesale by automated means by any user or service. Active
users may export their following lists and posts through the export
provided on their settings page, or the API.&lt;/p>
&lt;hr>
&lt;h1 id="privacy">Privacy Policy&lt;/h1>
&lt;h3 id="collect">Information collection&lt;/h3>
&lt;ul>
&lt;li>&lt;em>Mandatory account information&lt;/em>: Username (always public), e-mail
address, and password.&lt;/li>
&lt;li>&lt;em>Optional account information&lt;/em>: Display name, biography, profile
information fields, profile picture, and header image. Display name,
biography, profile picture and header image will always be public.&lt;/li>
&lt;li>&lt;em>Statuses and interactions&lt;/em>: We retain all your posts including
attachments, and other interactions (such as favourites, follows and
reblogs). In addition to the content and people involved, we also
store the timestamps for all of the listed data entries. If these
interactions impact another server (eg. following, boosting, or
messaging a user on a different server), this other server will
receive all required information. Public, unlisted, and pinned posts
are available publicly. Follower-only posts are available to your
followers, and direct messages are available to you and all people
mentioned in the message. Please note that since we cannot control
other servers, this means that we cannot guarantee the privacy
status of your messages as soon as they leave our server.&lt;/li>
&lt;li>&lt;em>Cookies&lt;/em>: We use cookies to keep you logged in and save your
preferences for future visits.&lt;/li>
&lt;li>&lt;em>Other metadata&lt;/em>: We do log and store your IP address.
We retain the name of your browser application to allow you
to review your currently logged in sessions for security reasons.&lt;/li>
&lt;/ul>
&lt;h3 id="use">Information usage&lt;/h3>
&lt;p>Any of the information we collect from you may be used in the following
ways:&lt;/p>
&lt;ul>
&lt;li>To provide the core functionality of GoToSocial. You can only interact
with other people's content and post your own content when you are
logged in. For example, you may follow other people to view their
combined posts in your own personalized home timeline.&lt;/li>
&lt;li>To aid moderation of the community &amp;ndash; when a status or account is
reported, we will look into the matter as part of our moderation
tasks.&lt;/li>
&lt;li>The email address you provide may be used to send you information,
notifications about other people interacting with your content or
sending you messages, and to respond to inquiries, and/or other
requests or questions.&lt;/li>
&lt;li>To aid debugging and reliable providing service.&lt;/li>
&lt;/ul>
&lt;h3 id="protect">Information protection&lt;/h3>
&lt;p>We implement a variety of security measures to maintain the safety of
your personal information when you enter, submit, or access your
personal information. Among other things, your browser session, as well
as the traffic between your applications and the API, are secured with
HTTPS, and your password is hashed using a strong one-way algorithm. You
may enable two-factor authentication to further secure access to your
account.&lt;/p>
&lt;h3 id="data-retention">Information deletion and retention&lt;/h3>
&lt;p>You can request and download an archive of your content, including your
posts, media attachments, profile picture, and header image.&lt;/p>
&lt;p>You may irreversibly delete your account at any time.&lt;/p>
&lt;p>If we judge you to be breaking our instance rules, we may irreversibly
delete your account at any time.&lt;/p>
&lt;h3 id="disclose">Information disclosure&lt;/h3>
&lt;p>Information is not disclosed unless you explicitly permit it. The only
exception is the provider of our server, who is a trusted and
unavoidable third party.&lt;/p>
&lt;p>Contacting or permitting contact from a user from a different instance
implies your consent that the required data is shared with the server in
question.&lt;/p>
&lt;p>Authorization of a third-party application grants information access
depending on the scope of permissions you approve. The application may
access your public profile information, your following list, your
followers, your lists, all your posts, and your favourites. Applications
can never access your e-mail address or password.&lt;/p>
&lt;hr>
&lt;h1 id="attribution-">Attribution &lt;a href="#attribution">¶&lt;/a>&lt;/h1>
&lt;p>This text was adapted from &lt;a href="https://chaos.social/about">https://chaos.social/about&lt;/a> and is free to be
adapted and remixed under the terms of the &lt;a href="https://creativecommons.org/licenses/by/4.0/">CC-BY (Attribution 4.0
International)&lt;/a>.&lt;/p></content></entry><entry><title>Disappearing messages with matrix</title><link href="https://hyteck.de/post/matrix-forget/" type="application/octet-stream"/><updated>2021-12-31T20:00:00+02:00</updated><id>https://hyteck.de/post/matrix-forget/</id><author><name>Julian-Samuel Gebühr</name></author><content type="html"> &lt;h1 id="introduction">Introduction&lt;/h1>
&lt;p>I am a HUGE fan of matrix. It allows me to organize my chats in a sensible way, it works with multiple identities and completly anonymous if I want it to. &lt;a href="https://element.io/blog/spaces-blast-out-of-beta/">Spaces&lt;/a> made Matrix my favourite messenger by far. Yet, there is one feature I have been missing: Disappearing messages!&lt;/p>
&lt;p>Regarding the security and usability, only Signal is comparable to matrix. But: Signal offers the possibilty to define disappearing messages for groups and direct messages ranging from 30 seconds to 4 weeks. No Matrix client (to my knowledge) offers this functionality. Nevertheless, it is possible to configure matrix rooms to have the same feature. This needs a special server configuration and the sending of a special event in the room. This post tries to show both steps. If you do not administer a server you can probably skip to &lt;a href="#room-configuration">Room configuration&lt;/a>&lt;/p>
&lt;p>Be aware that this blogpost was written at the end of 2021 - Matrix develops fast and this could be subejct to changes.&lt;/p>
&lt;h1 id="instance-configuration">Instance configuration&lt;/h1>
&lt;p>To make disappearing messages possible you need to enable retention on your matrix instance.
&lt;a href="https://github.com/matrix-org/matrix-doc/blob/matthew/msc1763/proposals/1763-configurable-retention-periods.md">Retention&lt;/a> allows server and room admins to configure how long messages should be kept in the instances database before being purged from it. It is not part of the matrix specification, yet it is supported by synapse.&lt;/p>
&lt;p>A client SHOULD not display these messages anymore after the max_lifetime is exceeded. This was NOT true for element web an desktop while staying logged in. Nevertheless, a newly logged in client did not have access to the messages.&lt;/p>
&lt;p>To configure Synapse to make use of retention you will need to enable it in your &lt;code>homeserver.yaml&lt;/code>&lt;/p>
&lt;pre tabindex="0">&lt;code>retention:
enabled: true # enables the retention, is enough to enforce it once per day
purge_jobs: # configures a job that delete the events from the database after some tome
- longest_max_lifetime: 3d
interval: 1h
- shortest_max_lifetime: 3d
interval: 1d
&lt;/code>&lt;/pre>&lt;p>The example configuration creates two jobs that delete messages from the database. One only focuses on events that should be deleted after three days or less. These events will be deleted every hour. It is therefore possible for a message that was send in a room with a &lt;code>max_lifetime=7200000&lt;/code> (equals 2h) to be deleted one hour after the maximum lifetime.&lt;/p>
&lt;h2 id="ansible">Ansible&lt;/h2>
&lt;p>If you use the &lt;a href="https://github.com/spantaleev/matrix-docker-ansible-deploy">Ansible/Docker setup&lt;/a> to deploy your server you can add the following to &lt;code>inventory/host_vars/matrix.example.com/vars.yml&lt;/code>&lt;/p>
&lt;pre tabindex="0">&lt;code>matrix_synapse_configuration_extension_yaml: |
retention:
enabled: true
purge_jobs:
- longest_max_lifetime: 1d
interval: 2h
- shortest_max_lifetime: 1d
interval: 1d
&lt;/code>&lt;/pre>&lt;h1 id="room-configuration">Room configuration&lt;/h1>
&lt;p>If you are a user on a server that has retention enabled, you can enable disappearing messages yourself for each room. Sadly, this is still experimental - but managable! You have to craft a &lt;code>m.room.retention&lt;/code> event that defines the maximum lifetime of a message. You will need to access the rooms settings in order to do this.&lt;/p>
&lt;p>First you need to open the developer tools in the rooms settings.
&lt;img src="https://hyteck.de/uploads/matrix-retention/retention_dev.png" alt="Screenshot of the element room settings">&lt;/p>
&lt;p>Then click &amp;ldquo;Send custom event&amp;rdquo; to create your event
&lt;img src="https://hyteck.de/uploads/matrix-retention/retention_event_button.png" alt="Screenshot of element marking the button &amp;ldquo;Send custom event&amp;rdquo; in the developer tools">&lt;/p>
&lt;p>And fill the event with the appropriate &lt;code>max_liftime&lt;/code>. The time is an integer in milliseconds. X hours is therefore a value of &lt;code>X*3 600 000&lt;/code>. Make sure to click the red event button. The &lt;code>State Key&lt;/code> can be left empty nevertheless.
&lt;img src="https://hyteck.de/uploads/matrix-retention/retention_event.png" alt="Screenshot of the creation of creating a custom event. The field event type is filled with m.room.retention the event content is &amp;ldquo;max_lifetime&amp;rdquo;: 3600000 and the button event was clicked">&lt;/p>
&lt;p>Depending on your choosen lifetime the client should not show the messages anymore.&lt;/p>
&lt;h1 id="limitations">Limitations&lt;/h1>
&lt;p>The process of deleting messages can not be enforced. A malicious server or chat partner could ignore the request to delete the messages or they could have saved them elsewere. You should not rely on a deletion actually happening. Nevertheless I think this is a good step to take to improve your security in real life.&lt;/p>
&lt;h1 id="further-information">Further Information&lt;/h1>
&lt;ul>
&lt;li>Relevant part of the Synapse configuration file: &lt;a href="https://github.com/matrix-org/synapse/blob/v1.36.0/docs/sample_config.yaml#L451-L518">https://github.com/matrix-org/synapse/blob/v1.36.0/docs/sample_config.yaml#L451-L518&lt;/a>&lt;/li>
&lt;li>Synapse documenation on message retention policies &lt;a href="https://matrix-org.github.io/synapse/v1.41/message_retention_policies.html">https://matrix-org.github.io/synapse/v1.41/message_retention_policies.html&lt;/a>&lt;/li>
&lt;/ul>
&lt;h1 id="what-else">What else?&lt;/h1>
&lt;p>Thanks to &lt;a href="https://tastytea.de/">Tastytea&lt;/a> for helping me get this to work!&lt;/p>
&lt;h1 id="comments">Comments&lt;/h1>
&lt;p>If you have questions, corrections or want to leave something else, please feel free to use the comments!&lt;/p>
&lt;script type="text/javascript" src="https://latest.cactus.chat/cactus.js">&lt;/script>
&lt;link rel="stylesheet" href="https://latest.cactus.chat/style.css" type="text/css">
&lt;div id="comment-section">&lt;/div>
&lt;script>
initComments({
node: document.getElementById("comment-section"),
defaultHomeserverUrl: "https://matrix.cactus.chat:8448",
serverName: "cactus.chat",
siteName: "hyteck",
commentSectionId: "matrix-disappearing-messages"
})
&lt;/script></content></entry><entry><title>Cactus comments via Matrix</title><link href="https://hyteck.de/post/cactus-chat/" type="application/octet-stream"/><updated>2021-08-25T11:08:55+02:00</updated><id>https://hyteck.de/post/cactus-chat/</id><author><name>Julian-Samuel Gebühr</name></author><content type="html"> &lt;h1 id="integration">Integration&lt;/h1>
&lt;p>Following the &lt;a href="https://cactus.chat/docs/getting-started/quick-start/">quickstart documentation&lt;/a> I tried to add cactus comments to this blog. I currently rely on infrastructure by cactus.chat as I do not host a private synapse server.&lt;/p>
&lt;p>I currently implemented this as a shortcode with hard-coded site title and a variable room name.&lt;/p>
&lt;h1 id="quickstart-with-hugo">Quickstart with HUGO&lt;/h1>
&lt;h2 id="register-your-site">Register your site&lt;/h2>
&lt;p>There is a registration system, that ensures that you are moderater in your comment section(s). I order to register your site you have to send a message to @cactusbot:cactus.chat . First try &lt;code>help&lt;/code> to ensure that the bot answers you, then register your site e.g. &lt;code>register hyteck&lt;/code>. The bot should inform you of success and add you to a moderation room.&lt;/p>
&lt;h2 id="embedd-comment-section-via-shortcode">Embedd comment section via Shortcode&lt;/h2>
&lt;p>HUGO, the static site generator I use, has an option to use &lt;em>shortcodes&lt;/em> that provide a nice interface to hide some HTML, CSS and JavaScript.&lt;/p>
&lt;p>The shortcode &lt;code>chat.html&lt;/code> must be added to &lt;code>layouts/shortcodes/&lt;/code> and looks like this&lt;/p>
&lt;pre tabindex="0">&lt;code>&amp;lt;script type=&amp;#34;text/javascript&amp;#34; src=&amp;#34;https://latest.cactus.chat/cactus.js&amp;#34;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;link rel=&amp;#34;stylesheet&amp;#34; href=&amp;#34;https://latest.cactus.chat/style.css&amp;#34; type=&amp;#34;text/css&amp;#34;&amp;gt;
&amp;lt;div id=&amp;#34;comment-section&amp;#34;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;script&amp;gt;
initComments({
node: document.getElementById(&amp;#34;comment-section&amp;#34;),
defaultHomeserverUrl: &amp;#34;https://matrix.cactus.chat:8448&amp;#34;,
serverName: &amp;#34;cactus.chat&amp;#34;,
siteName: &amp;#34;hyteck&amp;#34;,
commentSectionId: &amp;#34;{{ index .Params 0 }}&amp;#34;
})
&amp;lt;/script&amp;gt;
&lt;/code>&lt;/pre>&lt;p>If you want to use this, replace the site name with the one you registered in the previous step.&lt;/p>
&lt;p>You can then use it as simple as&lt;/p>
&lt;pre tabindex="0">&lt;code>{{&amp;lt; chat cactus-comments &amp;gt;}}
&lt;/code>&lt;/pre>&lt;p>where &lt;code>cactus-comments&lt;/code> is the name of the chatroom. You can decide if you want to create a new one for each post (change the name to somthing like the post title) or if you want to use only one (keep the same name).&lt;/p>
&lt;h1 id="organisation">Organisation&lt;/h1>
&lt;p>I try to make a comment with my main matrix account, so that I am automatically joined to the room (tbh. I don&amp;rsquo;t know if this is necessary). Then I organize the rooms by adding them to a private space.&lt;/p>
&lt;p>&lt;img src="https://hyteck.de/uploads/element_screenshot.PNG" alt="Element screenshot">&lt;/p>
&lt;h1 id="community">Community&lt;/h1>
&lt;p>CW: Homophobia, Slur&lt;/p>
&lt;p>The community in the official chat seemed helpful and nice. Nevertheless I want to mention, that the first time I tried the demo page a user (that does not seem to be associated with the develoipment or involved in the community) insulted me with a homophobic slur. The &amp;ldquo;reason&amp;rdquo; behind this were the prounouns I had in my name. I reported the comment and it was removed by a moderator. The moderator made it clear that this behaviour is agains the &lt;a href="https://cactus.chat/docs/community/coc/">Code of Conduct&lt;/a> and that the user is not active in the community. For me this is a very good indication of a functioning community, cheers!&lt;/p>
&lt;h1 id="comments">Comments&lt;/h1>
&lt;script type="text/javascript" src="https://latest.cactus.chat/cactus.js">&lt;/script>
&lt;link rel="stylesheet" href="https://latest.cactus.chat/style.css" type="text/css">
&lt;div id="comment-section">&lt;/div>
&lt;script>
initComments({
node: document.getElementById("comment-section"),
defaultHomeserverUrl: "https://matrix.cactus.chat:8448",
serverName: "cactus.chat",
siteName: "hyteck",
commentSectionId: "cactus-comments"
})
&lt;/script></content></entry><entry><title>Owncast &amp; Streaming a talk</title><link href="https://hyteck.de/post/owncast/" type="application/octet-stream"/><updated>2021-05-20T16:08:55+02:00</updated><id>https://hyteck.de/post/owncast/</id><author><name>Julian-Samuel Gebühr</name></author><content type="html"> &lt;p>I recently installed an Owncast server and wanted to share my experience. Here it is:&lt;/p>
&lt;h1 id="what-is-owncast">What is owncast?&lt;/h1>
&lt;p>Owncast is a streaming server that you can selfhost, a &lt;em>Twicht in a box&lt;/em> as the developers call it.
You host owncast on your server (a small VM with good downlink is enough) and can stream your own own content like you would do on Twicht, YouTube etc&amp;hellip;&lt;/p>
&lt;p>It has a chat, a admin panel for customization and thats it! You don&amp;rsquo;t need more to e.g. stream while you are playing minecraft or want to share a talk.&lt;/p>
&lt;h1 id="getting-started">Getting started&lt;/h1>
&lt;p>Get the latest release on &lt;a href="https://github.com/owncast/owncast/releases">GitHub&lt;/a> by using&lt;/p>
&lt;pre tabindex="0">&lt;code>$ mkdir owncast
$ cd owncast
$ wget https://github.com/owncast/owncast/releases/download/v0.0.7/owncast-0.0.7-linux-64bit.zip
$ unzip owncast-0.0.7-linux-64bit.zip
$ rm owncast-0.0.7-linux-64bit.zip
&lt;/code>&lt;/pre>&lt;p>And move the webroot to your document root and make sure the permissions fit&lt;/p>
&lt;pre tabindex="0">&lt;code>$ cd ..
$ mv owncast /var/www/owncast
$ cd /var/www/
$ chown -R www-data:www-data owncast
&lt;/code>&lt;/pre>&lt;p>Now create a new NGINX site e.g. &lt;code>/etc/nginx/sites-enabled/owncast&lt;/code> with the following content&lt;/p>
&lt;pre tabindex="0">&lt;code>map $http_upgrade $connection_upgrade {
default upgrade;
&amp;#39;&amp;#39; close;
}
server {
listen [::]:443 ssl ipv6only=on; # managed by Certbot
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/stream.hyteck.de/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/stream.hyteck.de/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
server_name stream.hyteck.de;
# Set header
add_header X-Clacks-Overhead &amp;#34;GNU Terry Pratchett&amp;#34;;
add_header Permissions-Policy interest-cohort=(); #Anti FLoC
location / {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_pass http://127.0.0.1:8080;
}
}
server {
listen 80;
listen [::]:80;
server_name stream.hyteck.de;
return 301 https://$server_name$request_uri;
}
&lt;/code>&lt;/pre>&lt;p>Make sure to adjust the server name and SSL certificats (I will not go into detail on how to obtain them, but &lt;a href="https://hyteck.de/about/">feel free to ask me!&lt;/a>).&lt;/p>
&lt;h1 id="start-server">Start server&lt;/h1>
&lt;p>Now start owncast to test&lt;/p>
&lt;pre tabindex="0">&lt;code>$ cd /var/www/owncast
$ ./owncast/owncast
&lt;/code>&lt;/pre>&lt;p>and visit &lt;a href="https://yourdomain.org">https://yourdomain.org&lt;/a>! If everything works you should see your site now. By visiting &lt;a href="https://yourdomain.org/admin">https://yourdomain.org/admin&lt;/a> you can configure your server. The default credentials are &lt;code>admin&lt;/code> and your stream key which is &lt;code>abc123&lt;/code>. Change this immediately!&lt;/p>
&lt;p>Before you configure, let&amp;rsquo;s make sure this runs whenever your server starts. Goback in the terminal and cancel with &lt;code>Ctrl+C&lt;/code>.&lt;/p>
&lt;h1 id="run-as-system-service">Run as system service&lt;/h1>
&lt;p>You want to install owncast as a system service. Therfore create &lt;code>/etc/systemd/system/owncast.service&lt;/code> with the following content:&lt;/p>
&lt;pre tabindex="0">&lt;code>[Unit]
Description=Owncast
After=network.target
[Service]
Type=simple
Restart=always
RestartSec=1
WorkingDirectory=/var/www/owncast
ExecStart=/var/www/owncast/owncast
[Install]
WantedBy=multi-user.target
&lt;/code>&lt;/pre>&lt;p>Update the daemon with &lt;code>systemctl daemon-reload&lt;/code> enable &lt;code>systemctl enable owncast&lt;/code> and start with &lt;code>systemctl start owncast&lt;/code>. Make sure everything is correct with &lt;code>systemctl status owncast&lt;/code>.&lt;/p>
&lt;h1 id="configuration">Configuration&lt;/h1>
&lt;p>You can now change back to yourdoiman.org/admin and configure, title, logo and more.&lt;/p>
&lt;h2 id="directory">Directory&lt;/h2>
&lt;p>If you start a stream and have directory enabled, Owncast will publish your activity, e.g. in the owncast RocketChat, on Twitter (by mentioning you if you gave Owncast your Twitter Handle) and in the Fediverse. Turn this of for testing!&lt;/p>
&lt;h1 id="streaming">Streaming&lt;/h1>
&lt;p>You can now use &lt;a href="https://obsproject.com/">OBS&lt;/a> or similar software to start streaming. Got to settings and configure your server.&lt;/p>
&lt;p>&lt;img src="https://hyteck.de/uploads/stream_config.png" alt="Configuration in the OBS streaming tab. The service is set to Custom.. and the server to rtmp://stream.hyteck.de/live. The stream key is hidden">&lt;/p>
&lt;h1 id="concept-for-talks">Concept for talks&lt;/h1>
&lt;p>To livestream we have a few important things to take care of:&lt;/p>
&lt;ul>
&lt;li>The speaker&lt;/li>
&lt;li>The presentation&lt;/li>
&lt;li>The streaming software&lt;/li>
&lt;li>The streaming server&lt;/li>
&lt;li>The chat&lt;/li>
&lt;/ul>
&lt;p>I suggest the following setup. Moderation and Speaker are in a BigBlueButton conference. The meet 15 minutes in advance, enough time to upload a presentation. Also in this room is a user called stream. This user does only listen and has OBS configured to record audio and the (fullscreen) window of the BBB room.&lt;/p>
&lt;p>Before the talk starts, it is a good opportunity to play some videos via the stream, or simply put on a picture, saing the talk will start soon.&lt;/p>
&lt;p>When the speaker an moderation are ready they tell the streamer and the scene is switched to the BBB room. The recording is started (if needed).&lt;/p>
&lt;p>A weakness of the setup is the streaner. If they loose their network connection, the stream stops.&lt;/p>
&lt;p>There is a neat &lt;a href="https://github.com/aau-zid/BigBlueButton-liveStreaming">project for live streaming directly from a BBB room&lt;/a>, but it is quite complicated to set up and a crash of the BBB server would make stop the stream. Also the start of the stream is not as beautiful.&lt;/p>
&lt;h1 id="performance">Performance&lt;/h1>
&lt;p>It can be hard to estimate the needed server capacities for a livestream that is why I want to share my experiences. All of this was done on a Strato Linux V40 with 16 GB of RAM, 8 vCPUs and 500 MBit/s.&lt;/p>
&lt;p>On the following screenshots you see the configuration and the monitoring data of a talk with 40 participants. We pplayed high-quality videos from 17:43 to 18:05. At 18:05 we changed to the presentation. You see the decrease in CPU load, as the compression of the videos was easier with a steady picture. At 19:05 we invited the participents to join us in the BBB room, some left the stream.&lt;/p>
&lt;p>The network load scales linear with the participants that are watching. You can simply calculate the needed downlink capacity with&lt;/p>
&lt;pre tabindex="0">&lt;code>Downlink capacity = Num. participants x Outbound Video Stream Rate
&lt;/code>&lt;/pre>&lt;p>Here this was&lt;/p>
&lt;pre tabindex="0">&lt;code>40 participants x 1200 kbps = 48 Mbps
&lt;/code>&lt;/pre>&lt;p>which matches the observed network traffic quite well.&lt;/p>
&lt;p>&lt;img src="https://hyteck.de/uploads/monitoring_vortrag.png" alt="Chart of the CPU load and the network traffic basic. The CPU load was jumpy around 25% from 17:45 to 18:05, after that it was steady around 17.5%. The Network Traffic went up until 18:10 and stayed at 50 Mbps until 19:00" title="Grafana Screenshot">&lt;/p>
&lt;p>The CPU load is determined by the compression the server has to do. The more different stream formats the server has to put out, the higher the load becomes. On the given Screenshot you see that only one downlink format was advertised, so the inbound stream had to be compresse only once. Matching imbound and outbound stream formats help reducing the server load.&lt;/p>
&lt;p>&lt;img src="https://hyteck.de/uploads/vortrag_eg.png" alt="A screenshot of the Owncast admin panel. The outbound stream details are: 1200 kbps, 24 fps and the Input is H.264@2500kbps at 30 fps" title="Screenshot of the owncast admin panel">&lt;/p>
&lt;p>If your bottleneck is the bandwidth you can try to add a second low streamrate, maybe ome clients will take that one.&lt;/p>
&lt;h1 id="final-notes">Final notes&lt;/h1>
&lt;p>Owncast is a great project. Be aware that it is still not in version 1.0 so expect some limitations. This is e.g. the unability to block a user from chat. If you have any questions let me know in the comments below.&lt;/p>
&lt;script type="text/javascript" src="https://latest.cactus.chat/cactus.js">&lt;/script>
&lt;link rel="stylesheet" href="https://latest.cactus.chat/style.css" type="text/css">
&lt;div id="comment-section">&lt;/div>
&lt;script>
initComments({
node: document.getElementById("comment-section"),
defaultHomeserverUrl: "https://matrix.cactus.chat:8448",
serverName: "cactus.chat",
siteName: "hyteck",
commentSectionId: "owncast"
})
&lt;/script></content></entry><entry><title>Transparency</title><link href="https://hyteck.de/transparency/" type="application/octet-stream"/><updated>2021-02-08T15:00:10+02:00</updated><id>https://hyteck.de/transparency/</id><author><name>Julian-Samuel Gebühr</name></author><content type="html"> &lt;h1 id="deutsch">Deutsch&lt;/h1>
&lt;p>Wir haben die bisherigen Kosten für Server-Hardware in der Tabelle unten angegeben. Das beinhaltet nicht die Kosten für die Domain und unseren Monitoring-Server.&lt;/p>
&lt;p>An alle die bisher gespendet habe: Ganz ganz vielen Dank euch!&lt;/p>
&lt;h1 id="english">English&lt;/h1>
&lt;p>We summarized the cost of hardware in the table below. This does not include costs of the domain and our monitoring server.&lt;/p>
&lt;p>To everyone that contributed: Thank you so so much!&lt;/p>
&lt;h1 id="überblickoverview">Überblick/Overview&lt;/h1>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Kosten&lt;/th>
&lt;th>Spenden&lt;/th>
&lt;th>Saldo&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>-321.63 €&lt;/td>
&lt;td>235.5 €&lt;/td>
&lt;td>- 86.13 €&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h1 id="kostenaufstellung--exact-cost">Kostenaufstellung / Exact cost&lt;/h1>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Date&lt;/th>
&lt;th>Cost (€)&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>27.04.2021&lt;/td>
&lt;td>-25&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>1.04.2021&lt;/td>
&lt;td>-25&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>26.02.2021&lt;/td>
&lt;td>-25&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>22.01.2021&lt;/td>
&lt;td>-25&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>22.12.2020&lt;/td>
&lt;td>-24.78&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>25.11.2020&lt;/td>
&lt;td>-24.37&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>22.10.2020&lt;/td>
&lt;td>-24.37&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>22.09.2020&lt;/td>
&lt;td>-24.37&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>22.08.2020&lt;/td>
&lt;td>-24.37&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>22.07.2020&lt;/td>
&lt;td>-24.37&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>22.06.2020&lt;/td>
&lt;td>-25&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>22.05.2020&lt;/td>
&lt;td>-25&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>22.04.2020&lt;/td>
&lt;td>-25&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Total&lt;/strong>&lt;/td>
&lt;td>&lt;strong>-321.63&lt;/strong>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Die wechselnden monatlichen Kosten sind durch die temporär gesenkte Mehrwertsteuer bedingt.&lt;/p>
&lt;p>The altering monthly costs are explained by a decrease in sales tax in Germany.&lt;/p>
&lt;h1 id="spenden--donations">Spenden / Donations&lt;/h1>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Date&lt;/th>
&lt;th>Donation (€)&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>03.05.2021&lt;/td>
&lt;td>7.50&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>06.04.2021&lt;/td>
&lt;td>7.50&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>02.03.2021&lt;/td>
&lt;td>7.50&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>01.03.2021&lt;/td>
&lt;td>100&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>12.02.2021&lt;/td>
&lt;td>33&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>12.02.2021&lt;/td>
&lt;td>20&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>09.02.2021&lt;/td>
&lt;td>50&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>09.02.2021&lt;/td>
&lt;td>10&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Total&lt;/strong>&lt;/td>
&lt;td>&lt;strong>235.5&lt;/strong>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h1 id="letzte-aktualisierung--last-update">Letzte Aktualisierung / Last update&lt;/h1>
&lt;p>21.05.2021&lt;/p>
&lt;h1 id="kontak--contact">Kontak / Contact&lt;/h1>
&lt;p>Bei Fragen meldet euch gerne bei: &lt;a href="mailto:bbb@hyteck.de">bbb@hyteck.de&lt;/a>&lt;/p>
&lt;p>If you have any questions regarding this ask us via: &lt;a href="mailto:bbb@hyteck.de">bbb@hyteck.de&lt;/a>&lt;/p></content></entry><entry><title>Introduction to git</title><link href="https://hyteck.de/post/introduction_to_git/" type="application/octet-stream"/><updated>2019-10-22T19:00:00+02:00</updated><id>https://hyteck.de/post/introduction_to_git/</id><author><name>Julian-Samuel Gebühr</name></author><content type="html"> &lt;p>As you man now I work in a research lab. Nearly everyone in our lab needs to do at least some programming. There are trained software engineers next to people how write their first line of code here.
As we produce a lot of code that is only scripts not many people used git or any other version control system.
For all the good reasons (some are mentioned in the guide) we everybody to learn git in a way that is tradeoff between good version control and fast development.
As most of us work on separate projects there is not so much need to collaborate which is reflected ind this guide as I completely excluded branching and merge conflicts.
Yet I hope this will maybe help some learners of git or some people that need to introduce git to others.&lt;/p>
&lt;p>I will not be updating this guide, for the newest version please visit &lt;a href="https://github.com/GerJuli/introduction-to-git">https://github.com/GerJuli/introduction-to-git&lt;/a>&lt;/p>
&lt;p>Now enjoy the guide!&lt;/p>
&lt;h1 id="installation">Installation&lt;/h1>
&lt;ul>
&lt;li>On Windows: Download git here: &lt;a href="https://git-scm.com/download/win">https://git-scm.com/download/win&lt;/a> and install it&lt;/li>
&lt;li>On Linux: execute &amp;lsquo;sudo apt install git&amp;rsquo; in the terminal&lt;/li>
&lt;/ul>
&lt;h1 id="configuration">Configuration&lt;/h1>
&lt;h2 id="basics">Basics&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>$ git config --global user.name &lt;span style="color:#e6db74">&amp;#34;John Doe&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>$ git config --global user.email johndoe@example.com
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Run these commands without &amp;ndash;global to apply changes only for local repository.&lt;/p>
&lt;h2 id="advanced">Advanced&lt;/h2>
&lt;ul>
&lt;li>
&lt;p>Change from default editor by executing &lt;code>$ git config --global core.editor vim&lt;/code>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Create aliases by:&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;code>git config --global alias.unstage 'reset HEAD --'&lt;/code>:
Introduces new command unstage&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;code>git config --global alias.hist 'log --pretty=format:&amp;quot;%h - %an, %ar : %s&amp;quot; --graph'&lt;/code>:
Is an pretty alternative to git log.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>Check the configuration by &lt;code>$ git config --list&lt;/code>&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h1 id="getting-started">Getting started&lt;/h1>
&lt;h2 id="create-an-directory">Create an directory&lt;/h2>
&lt;p>Select an directory of your choice e.g. ~/Desktop/git-training/,
open the terminal there and type&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>$ git init
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Congratulations you have your first git repository!&lt;/p>
&lt;h2 id="committing-files">Committing files&lt;/h2>
&lt;p>Create some text files e.g. &lt;code>hallo.txt&lt;/code> or &lt;code>hello_world.py&lt;/code>.
To start version-controlling them add the file to git by using the command&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>$ git add filename
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>You can also add multiple files. E.g. you want to add all text files the do&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>$ git add *.txt
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Now we can commit these changes by typing&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>$ git commit
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>This will open your preferred text editor
where you can type in a commit message.&lt;/p>
&lt;h3 id="commit-messages">Commit messages&lt;/h3>
&lt;p>&lt;em>Commit messages are important&lt;/em>&lt;/p>
&lt;p>Why are the so important? Because it is much easier to track bugs with it,
they describe the process of development, make it easier for others to work
with your code (e.g. code review) and will help you in two years to understand what you did.
They extend your labbook in its function.&lt;/p>
&lt;h4 id="how-to-write-commit-messages">How to write commit messages&lt;/h4>
&lt;ul>
&lt;li>Use present tense and use imperative&lt;/li>
&lt;li>Tell why you did changes.&lt;/li>
&lt;li>Limit yourself to 50 characters in the first line.&lt;/li>
&lt;li>Wrap the body at 72 characters&lt;/li>
&lt;/ul>
&lt;h4 id="good-commit-messages">Good commit messages&lt;/h4>
&lt;p>For short commits that need only few explanation it is convenient to use&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>$ git commit -m &lt;span style="color:#e6db74">&amp;#34;Fix typo in introduction to user guide&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>For long commit message you use&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>$ git commit
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>which opens a text editor and lets you describe your changes in detail. Do not forget the line
between header and body of the commit message.&lt;/p>
&lt;pre tabindex="0">&lt;code>Summarize changes in around 50 characters or less
More detailed explanatory text, if necessary. Wrap it to about 72
characters or so. In some contexts, the first line is treated as the
subject of the commit and the rest of the text as the body. The
blank line separating the summary from the body is critical (unless
you omit the body entirely); various tools like `log`, `shortlog`
and `rebase` can get confused if you run the two together.
Explain the problem that this commit is solving. Focus on why you
are making this change as opposed to how (the code explains that).
Are there side effects or other unintuitive consequences of this
change? Here&amp;#39;s the place to explain them.
Further paragraphs come after blank lines.
- Bullet points are okay, too
- Typically a hyphen or asterisk is used for the bullet, preceded
by a single space, with blank lines in between, but conventions
vary here
&lt;/code>&lt;/pre>&lt;h4 id="hall-of-shame">Hall of shame&lt;/h4>
&lt;p>Here you see some examples of bad commit messages.&lt;/p>
&lt;ul>
&lt;li>
&lt;p>“bug fix”, &amp;ldquo;more work”, “minor changes”:
Bad because it contains no useful information&lt;/p>
&lt;/li>
&lt;li>
&lt;p>“Change X constant to be 10”:
Bad as it does not tell why. What was changed is easy to find out by
git diff.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>“super long commit message goes here, something like 100 words and lots of characters woohoo!”:
Bad because it is unreadable.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h2 id="storing-changes-on-remote-server">Storing changes on remote server&lt;/h2>
&lt;p>To store changes on a remote server e.g. Github you need to push your repository there.
If you are doing this for the first time you first need to define where to push your repository to.
Use&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>$ git remote add origin https://github.com/GerJuli/introduction-to-git.git
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The URL can be
replaced with any URL that points to an existing repository. This can even be a USB drive!
Now push by using &lt;code>git push -u origin master&lt;/code>. With this command you created an upstream to your
remote &amp;lsquo;origin&amp;rsquo; where you branch &amp;lsquo;master&amp;rsquo; will be pushed.
As this is set up you can use &lt;code>git push&lt;/code> from now on.&lt;/p>
&lt;h1 id="cloning-existing-repositories">Cloning existing repositories&lt;/h1>
&lt;p>Downloading existing repositories is called &amp;lsquo;cloning&amp;rsquo;. You can do this by using&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>$ git clone https://github.com/GerJuli/introduction-to-git.git
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>That is it. Now you can start working on it.&lt;/p>
&lt;h1 id="workflow">Workflow&lt;/h1>
&lt;h2 id="check-status">Check status&lt;/h2>
&lt;p>With&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>$ git status
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>you can check the status of your current directory.
This will look like this:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>$ git status
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>On branch master
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Your branch is up-to-date with &lt;span style="color:#e6db74">&amp;#39;origin/master&amp;#39;&lt;/span>.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>nothing to commit, working directory clean
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="add-file">Add file&lt;/h2>
&lt;p>If you now add a file to the repository e.g. README then the status changes.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>$ echo &lt;span style="color:#e6db74">&amp;#39;My Project&amp;#39;&lt;/span> &amp;gt; README
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>$ git status
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>On branch master
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Your branch is up-to-date with &lt;span style="color:#e6db74">&amp;#39;origin/master&amp;#39;&lt;/span>.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Untracked files:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">(&lt;/span>use &lt;span style="color:#e6db74">&amp;#34;git add &amp;lt;file&amp;gt;...&amp;#34;&lt;/span> to include in what will be committed&lt;span style="color:#f92672">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> README
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> nothing added to commit but untracked files present &lt;span style="color:#f92672">(&lt;/span>use &lt;span style="color:#e6db74">&amp;#34;git add&amp;#34;&lt;/span> to track&lt;span style="color:#f92672">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>You can also run&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>$ git diff
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>which will show you the changes that where made.&lt;/p>
&lt;p>Now track the file by adding it to the staging area via&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>$ git add README
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>If you want to commit only a part of the changes you made use&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>git add -p
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>git will ask you for every &amp;ldquo;hunk&amp;rdquo;(part of the file) if you want to add it to the staging area.
The main options are:&lt;/p>
&lt;ul>
&lt;li>y stage this hunk for the next commit&lt;/li>
&lt;li>n do not stage this hunk for the next commit&lt;/li>
&lt;li>q quit; do not stage this hunk or any of the remaining hunks&lt;/li>
&lt;/ul>
&lt;h2 id="committing">Committing&lt;/h2>
&lt;p>The changes are now ready to be committed&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>$ git status
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>On branch master
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Your branch is up-to-date with &lt;span style="color:#e6db74">&amp;#39;origin/master&amp;#39;&lt;/span>.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Changes to be committed:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">(&lt;/span>use &lt;span style="color:#e6db74">&amp;#34;git reset HEAD &amp;lt;file&amp;gt;...&amp;#34;&lt;/span> to unstage&lt;span style="color:#f92672">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> new file: README
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Now commit this change with a suitable commit message.
You forgot what you changed and &lt;code>git diff&lt;/code> does not work?
If you already added the file to the staging area you can run&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>$ git diff --staged
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="push-to-remote">Push to remote&lt;/h2>
&lt;p>Push this now to your repository with&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>$ git push
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="show-last-changes">Show last changes&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>$ git log
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>shows you a log of recent commit messages.&lt;/p>
&lt;p>If you want to have a look at the changes source use&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>$ git log -p
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>A much prettier version is&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>$ git log --pretty&lt;span style="color:#f92672">=&lt;/span>format:&lt;span style="color:#e6db74">&amp;#34;%h - %an, %ar : %s&amp;#34;&lt;/span> --graph
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h1 id="get-latest-changes">Get latest changes&lt;/h1>
&lt;p>An amazing thing of git is to work together with others. This guide will not go into the details
of this, yet you will often have to get the latest changes of a project.&lt;/p>
&lt;p>You can do this easily by using&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>$ git pull
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>which is a short version of two different commands. It first executes &lt;code>git fetch&lt;/code> that downloads
the latest changes. Then it runs &lt;code>git merge FETCH_HEAD&lt;/code> which tries to apply the newest changes
to your local repository. This is also the difficulty of this as any file that was changed locally
and in the remote repository will cause a &lt;em>merge conflict&lt;/em> as git does not know which file/parts
of the file to keep. The resolution of such a conflict can be complicated and goes beyond the
intentions of this guide.&lt;/p>
&lt;p>A brief overview can be found
&lt;a href="https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/resolving-a-merge-conflict-using-the-command-line">here&lt;/a>.&lt;/p>
&lt;h2 id="gitignore">Gitignore&lt;/h2>
&lt;p>Sometimes you do not want git to track every file in your repository.
Typically this applies for log files, configuration files (where maybe passwords are stored)
and compiled sources. For this purpose you can create the file &lt;code>.gitignore&lt;/code> in your repository.
This file will be read by git. An example &lt;code>.gitignore&lt;/code> looks like this:&lt;/p>
&lt;pre tabindex="0">&lt;code class="language-gitignore" data-lang="gitignore"># ignore all .log files
*.log
# ignore all files in any directory named config
build/
# but do track sample.log, even though you&amp;#39;re ignoring .log files above
!sample.log
# only ignore the TODO file in the current directory, not subdir/TODO
/TODO
# ignore all files in any directory named build
build/
&lt;/code>&lt;/pre>&lt;p>You can generate gitignore files &lt;a href="https://www.gitignore.io/">here&lt;/a>.&lt;/p>
&lt;h1 id="undoing-things">Undoing things&lt;/h1>
&lt;h2 id="make-changes-to-the-last-commit">Make changes to the last commit&lt;/h2>
&lt;p>You forgot to add one file to your commit?
You are unhappy with your commit message?
Use &lt;code>git --amend&lt;/code>!&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>$ git commit -m &lt;span style="color:#e6db74">&amp;#39;Pretty commit message&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>$ git add forgotten_file
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>$ git commit --amend
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Do not do this if you already pushed to remote.&lt;/p>
&lt;h2 id="unmodifying-a-modified-file">Unmodifying a Modified File&lt;/h2>
&lt;p>You made changes to a file but the changes messed everything up?
You can always go back to the version of the last commit by&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>git checkout -- filename
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;em>Warning&lt;/em>: This is dangerous as you delete all changes that you made locally.
Do NOT use this command unless you are absolutely sure what you are doing.&lt;/p>
&lt;h2 id="time-machine">Time machine&lt;/h2>
&lt;p>Something went terribly wrong. When using git this is no problem.
Just use &lt;code>reflog&lt;/code> and select the commit where still everything was alright.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>$ git reflog
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>9bff138 HEAD@&lt;span style="color:#f92672">{&lt;/span>0&lt;span style="color:#f92672">}&lt;/span>: commit: Document limitations of this guide
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>8d9dac8 HEAD@&lt;span style="color:#f92672">{&lt;/span>1&lt;span style="color:#f92672">}&lt;/span>: commit &lt;span style="color:#f92672">(&lt;/span>amend&lt;span style="color:#f92672">)&lt;/span>: Adjust script to nice print
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">[&lt;/span>...&lt;span style="color:#f92672">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2b66f53 HEAD@&lt;span style="color:#f92672">{&lt;/span>7&lt;span style="color:#f92672">}&lt;/span>: commit: Introduce git log
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>8835c33 HEAD@&lt;span style="color:#f92672">{&lt;/span>8&lt;span style="color:#f92672">}&lt;/span>: commit: Fix of formating of headings
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2f0f500 HEAD@&lt;span style="color:#f92672">{&lt;/span>9&lt;span style="color:#f92672">}&lt;/span>: commit: Improve order of comments on workflow
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>249dc14 HEAD@&lt;span style="color:#f92672">{&lt;/span>10&lt;span style="color:#f92672">}&lt;/span>: commit &lt;span style="color:#f92672">(&lt;/span>amend&lt;span style="color:#f92672">)&lt;/span>: Explain git diff
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>f5ba1d3 HEAD@&lt;span style="color:#f92672">{&lt;/span>11&lt;span style="color:#f92672">}&lt;/span>: commit: Explain git diff
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>0a2ce1c HEAD@&lt;span style="color:#f92672">{&lt;/span>12&lt;span style="color:#f92672">}&lt;/span>: commit: Remove trailing whitspaces
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>735511f HEAD@&lt;span style="color:#f92672">{&lt;/span>13&lt;span style="color:#f92672">}&lt;/span>: commit &lt;span style="color:#f92672">(&lt;/span>initial&lt;span style="color:#f92672">)&lt;/span>: Initial commit
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>$ git reset HEAD@&lt;span style="color:#f92672">{&lt;/span>index_where_everything_was_fine&lt;span style="color:#f92672">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>$ git reset --hard origin/master
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;em>Warning&lt;/em>: This is dangerous as you delete all changes that you made locally.
Do NOT use this command unless you are absolutely sure what you are doing.&lt;/p>
&lt;h1 id="usb-sticks-as-remote">USB sticks as remote&lt;/h1>
&lt;p>Sometimes (e.g. you are working on a machine that is not connected to the internet) it can be
helpful to use an USB drive as remote.&lt;/p>
&lt;h2 id="how-to-prepare-the-drive">How to prepare the drive&lt;/h2>
&lt;p>Go to the USB drive&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>$ cd /media/username/git-stick/
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Create a directory for your repository&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>$ mkdir my-repo
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Initialize the repo&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>$ cd my-repo
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>$ git init --bare
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="how-to-push-to-a-usb-drive">How to push to a USB drive&lt;/h2>
&lt;p>To push to a USB drive you need to add a remote. Go to your local repository and use&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>$ git remote add usb /media/username/git-stick/my-repo/
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Be aware that your stick will have a different name and will be at a different location, depending
on your operating system. You named the remote &amp;ldquo;usb&amp;rdquo; here, of course you can change that name.&lt;/p>
&lt;p>Now push your repo&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>$ git push usb
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>To list all repositories just type&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>$ git remote
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>origin
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>usb
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>If you want to push to the USB drive by default you can use&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>$ git push -u usb master
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Branch &lt;span style="color:#e6db74">&amp;#39;master&amp;#39;&lt;/span> set up to track remote branch &lt;span style="color:#e6db74">&amp;#39;master&amp;#39;&lt;/span> from &lt;span style="color:#e6db74">&amp;#39;usb&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h1 id="what-this-guide-does-not-cover">What this guide does not cover&lt;/h1>
&lt;ul>
&lt;li>Branching
&lt;ul>
&lt;li>Creating branches&lt;/li>
&lt;li>Merging branches (and merge conflicts)&lt;/li>
&lt;li>Remote branches&lt;/li>
&lt;li>Tagging&lt;/li>
&lt;li>Forks&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Usage of Github&lt;/li>
&lt;li>Hooks&lt;/li>
&lt;/ul>
&lt;h1 id="further-reading">Further reading&lt;/h1>
&lt;ul>
&lt;li>Official git website &lt;a href="https://git-scm.com/">Git SCM&lt;/a>: Extensiv documentation&lt;/li>
&lt;li>&lt;a href="https://ohshitgit.com/">Oh shit Git&lt;/a>: Help when you messed up.&lt;/li>
&lt;/ul>
&lt;h1 id="logo">Logo&lt;/h1>
&lt;p>Git Logo by Jason Long&lt;/p>
&lt;script type="text/javascript" src="https://latest.cactus.chat/cactus.js">&lt;/script>
&lt;link rel="stylesheet" href="https://latest.cactus.chat/style.css" type="text/css">
&lt;div id="comment-section">&lt;/div>
&lt;script>
initComments({
node: document.getElementById("comment-section"),
defaultHomeserverUrl: "https://matrix.cactus.chat:8448",
serverName: "cactus.chat",
siteName: "hyteck",
commentSectionId: "git"
})
&lt;/script></content></entry><entry><title>ILMO</title><link href="https://hyteck.de/post/ilmo/" type="application/octet-stream"/><updated>2019-09-15T22:00:55+02:00</updated><id>https://hyteck.de/post/ilmo/</id><author><name>Julian-Samuel Gebühr</name></author><content type="html"> &lt;h1 id="ilmo">ILMO&lt;/h1>
&lt;p>is my first bigger FOSS-project. It aims at managing small libraries as found in a department of a university. You can finde the project on &lt;a href="https://github.com/GerJuli/ILMO">Github&lt;/a>.&lt;/p>
&lt;h2 id="history">History:&lt;/h2>
&lt;p>I started to create ILMO for the (rather small) library in the study rooms of mediacal engineering.
It contains about 300 books, 120 labcoats and safty glasses and some more stuff.
As I was in charge of the lends I started to get annoyed by our paper-based solution.
Especially when a bunch of people was trying to lend things it took to much time. Also reminding people to return stuff was unnecessary complicated.
Therfore I started to programm this library management tool from scratch. I only reused some basic database and session functions.
The project is still a field of learning how to do things for me.
Nevertheless after about half a year of development and many tests the system went live in Winter 2018.
Since then I fill the bugtracker and slowly improve workflows and add functions.&lt;/p>
&lt;h2 id="license">License&lt;/h2>
&lt;p>Of course the program is open-source and licensed under GPLv3.&lt;/p>
&lt;h2 id="demo">Demo&lt;/h2>
&lt;p>Right now there is no public available demo but if you are interested I will lead you the way to my test server.&lt;/p>
&lt;h2 id="using-ilmo">Using ILMO&lt;/h2>
&lt;p>You know someone who could use somthing like this? I would love to see this software in more libraries.
Right now the programm is optimized to the needs of our student union but I would be happy to work more on this.&lt;/p>
&lt;script type="text/javascript" src="https://latest.cactus.chat/cactus.js">&lt;/script>
&lt;link rel="stylesheet" href="https://latest.cactus.chat/style.css" type="text/css">
&lt;div id="comment-section">&lt;/div>
&lt;script>
initComments({
node: document.getElementById("comment-section"),
defaultHomeserverUrl: "https://matrix.cactus.chat:8448",
serverName: "cactus.chat",
siteName: "hyteck",
commentSectionId: "ILMO"
})
&lt;/script></content></entry></feed>