<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="https://www.w3.org/2005/Atom"><channel><title>Projects | SAJID Lab</title><link>https://sajidbuet.github.io/projects/</link><atom:link href="https://sajidbuet.github.io/projects/index.xml" rel="self" type="application/rss+xml"/><description>Projects</description><generator>Hugo Blox Builder (https://hugoblox.com)</generator><language>en-us</language><lastBuildDate>Wed, 23 Sep 2026 00:00:00 +0000</lastBuildDate><image><url>https://sajidbuet.github.io/media/logo.svg</url><title>Projects</title><link>https://sajidbuet.github.io/projects/</link></image><item><title>OMRFlow</title><link>https://sajidbuet.github.io/projects/omrflow/</link><pubDate>Wed, 23 Sep 2026 00:00:00 +0000</pubDate><guid>https://sajidbuet.github.io/projects/omrflow/</guid><description>&lt;h2 id="motivation"&gt;Motivation&lt;/h2&gt;
&lt;p&gt;Marking multiple-choice examinations by hand is slow, and the commercial OMR
systems that automate it are closed, licence-bound and generally expect the
answer sheets to be uploaded somewhere. A department that wants to keep student
scripts on its own machines needs something it can run locally and inspect.&lt;/p&gt;
&lt;h2 id="what-it-does"&gt;What it does&lt;/h2&gt;
&lt;p&gt;OMRFlow covers the sequence end to end: a template designer defines the
registration markers and bubble grid for a sheet; scans are geometrically
normalised for rotation, translation, scale, skew and perspective; recognition
reports what it found, including blanks, multiple marks and uncertain reads
rather than silently guessing; batches are processed across multiple cores and
can resume after an interruption; a human resolves the uncertain cases, with an
audit trail of every correction; attendance is reconciled; per-set answer keys
are applied and verified; and reports are generated while preserving the custom
formatting of the destination workbook.&lt;/p&gt;
&lt;p&gt;Processing is local. The software is MIT-licensed and the source is on GitHub.&lt;/p&gt;
&lt;h2 id="status"&gt;Status&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Alpha.&lt;/strong&gt; The current installable release is &lt;code&gt;0.1.0-alpha.1&lt;/code&gt;, published for
evaluation and testing. The repository states that real-data qualification is
not complete and that generated results should be independently verified before
operational use. The repository is the place to check the current qualification
status before relying on it for an examination.&lt;/p&gt;</description></item><item><title>Scholar Profile Exporter</title><link>https://sajidbuet.github.io/projects/scholar-profile-exporter/</link><pubDate>Sat, 24 Jan 2026 00:00:00 +0000</pubDate><guid>https://sajidbuet.github.io/projects/scholar-profile-exporter/</guid><description>&lt;h2 id="motivation"&gt;Motivation&lt;/h2&gt;
&lt;p&gt;Keeping per-article citation counts in a CV or publication list is tedious to do
by hand. The Publish or Perish desktop tool used to fill that role, but Google
Scholar increasingly requires a signed-in session or a CAPTCHA, which that
tool does not handle.&lt;/p&gt;
&lt;h2 id="what-it-does"&gt;What it does&lt;/h2&gt;
&lt;p&gt;The script runs as a TamperMonkey userscript on top of a loaded Google Scholar
profile page — so it works within an ordinary signed-in browser session — and
exports the profile in a Publish-or-Perish-style CSV, together with BibTeX
links. That CSV is the input format an existing set of scripts already expects,
so the downstream publication-list and BibTeX update workflow is unchanged.&lt;/p&gt;
&lt;h2 id="status"&gt;Status&lt;/h2&gt;
&lt;p&gt;Active. Source is on GitHub; it requires the TamperMonkey browser extension.&lt;/p&gt;</description></item><item><title>Pi Web Kiosk</title><link>https://sajidbuet.github.io/projects/pi-web-kiosk/</link><pubDate>Wed, 24 Sep 2025 00:00:00 +0000</pubDate><guid>https://sajidbuet.github.io/projects/pi-web-kiosk/</guid><description>&lt;h2 id="motivation"&gt;Motivation&lt;/h2&gt;
&lt;p&gt;A lobby display has to keep showing something sensible when nobody is watching
it: when the network drops, when the site it mirrors is down, when the machine
has been running for a fortnight, and outside the hours anyone is there to see
it. Doing that reliably on a Raspberry Pi is mostly a matter of configuration
rather than code, so the whole system is driven from a JSON file.&lt;/p&gt;
&lt;h2 id="what-it-does"&gt;What it does&lt;/h2&gt;
&lt;p&gt;Two Chromium kiosk windows are placed across an extended dual-display desktop.
Content is mirrored to an offline cache at setup, and the kiosk falls back to
that cache automatically when the network or the live site is unavailable,
switching back to the live URL once connectivity returns. A hard refresh runs
every few hours, the machine reboots daily at a configurable time, and display
hours, active weekdays and holiday handling are all set in the same
configuration file. Startup and recovery are handled by systemd.&lt;/p&gt;
&lt;h2 id="status"&gt;Status&lt;/h2&gt;
&lt;p&gt;Active, and in use: the README records that the kiosk runs the information
display in the main lobby of the Department of Electrical and Electronic
Engineering, BUET. MIT-licensed, with the setup script and systemd unit in the
repository.&lt;/p&gt;</description></item><item><title>CTAdmin</title><link>https://sajidbuet.github.io/projects/ctadmin/</link><pubDate>Sun, 11 May 2025 00:00:00 +0000</pubDate><guid>https://sajidbuet.github.io/projects/ctadmin/</guid><description>&lt;h2 id="motivation"&gt;Motivation&lt;/h2&gt;
&lt;p&gt;Seating students in roll-number order during a class test discourages groups of
students who might otherwise sit together and collaborate. Producing that
seating chart by hand in PowerPoint or Excel before every test is slow and has
to be repeated for each room and each cohort.&lt;/p&gt;
&lt;h2 id="what-it-does"&gt;What it does&lt;/h2&gt;
&lt;p&gt;CTAdmin generates the seat plan from a roll-number list and provides the timing
function needed while the test is running, so both parts of running a class test
are handled by one tool rather than a spreadsheet plus the operating system&amp;rsquo;s
timer app.&lt;/p&gt;
&lt;h2 id="status"&gt;Status&lt;/h2&gt;
&lt;p&gt;Active. Source and documentation are on GitHub.&lt;/p&gt;</description></item></channel></rss>