<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.scott5.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Scott</id>
	<title>Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.scott5.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Scott"/>
	<link rel="alternate" type="text/html" href="https://wiki.scott5.org/Special:Contributions/Scott"/>
	<updated>2026-04-27T16:55:18Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.1</generator>
	<entry>
		<id>https://wiki.scott5.org/index.php?title=Openclaw&amp;diff=1862</id>
		<title>Openclaw</title>
		<link rel="alternate" type="text/html" href="https://wiki.scott5.org/index.php?title=Openclaw&amp;diff=1862"/>
		<updated>2026-04-17T16:20:14Z</updated>

		<summary type="html">&lt;p&gt;Scott: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Interactive Session ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
openclaw tui&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Routine Maintenance ==&lt;br /&gt;
(as non-root user)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
brew update&lt;br /&gt;
brew upgrade&lt;br /&gt;
openclaw update&lt;br /&gt;
openclaw doctor&lt;br /&gt;
openclaw gateway restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Watching Quotas for Flat-Rate Plans ==&lt;br /&gt;
From the command line:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
openclaw status --usage (or just &amp;quot;openclaw status&amp;quot; for full details)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
From the interactive console:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== List Cron Jobs ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
openclaw cron list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Managing Models ==&lt;br /&gt;
NOTE: I don&#039;t use this any more.  Openclaw allows you to configure a primary and a fallback.  Also, removing the heartbeat.model setting tells openclaw to just use the default model for heartbeats, just as with active sessions.&lt;br /&gt;
current models:&lt;br /&gt;
* openai-codex/gpt-5.4&lt;br /&gt;
* anthropic/claude-opus-4-6&lt;br /&gt;
&lt;br /&gt;
switch model: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
openclaw config set agents.defaults.model.primary openai-codex/gpt-5.4&lt;br /&gt;
openclaw config set agents.defaults.heartbeat.model openai-codex/gpt-5.4&lt;br /&gt;
openclaw gateway restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
openclaw config set agents.defaults.model.primary anthropic/claude-opus-4-6&lt;br /&gt;
openclaw config set agents.defaults.heartbeat.model anthropic/claude-sonnet-4-6&lt;br /&gt;
openclaw gateway restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Scott</name></author>
	</entry>
	<entry>
		<id>https://wiki.scott5.org/index.php?title=Openclaw&amp;diff=1861</id>
		<title>Openclaw</title>
		<link rel="alternate" type="text/html" href="https://wiki.scott5.org/index.php?title=Openclaw&amp;diff=1861"/>
		<updated>2026-04-17T16:18:00Z</updated>

		<summary type="html">&lt;p&gt;Scott: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Interactive Session ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
openclaw tui&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Routine Maintenance ==&lt;br /&gt;
(as non-root user)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
brew update&lt;br /&gt;
brew upgrade&lt;br /&gt;
openclaw update&lt;br /&gt;
openclaw doctor&lt;br /&gt;
openclaw gateway restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Watching Quotas for Flat-Rate Plans ==&lt;br /&gt;
From the command line:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
openclaw status --usage (or just &amp;quot;openclaw status&amp;quot; for full details)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
From the interactive console:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Managing Models ==&lt;br /&gt;
NOTE: I don&#039;t use this any more.  Openclaw allows you to configure a primary and a fallback.  Also, removing the heartbeat.model setting tells openclaw to just use the default model for heartbeats, just as with active sessions.&lt;br /&gt;
current models:&lt;br /&gt;
* openai-codex/gpt-5.4&lt;br /&gt;
* anthropic/claude-opus-4-6&lt;br /&gt;
&lt;br /&gt;
switch model: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
openclaw config set agents.defaults.model.primary openai-codex/gpt-5.4&lt;br /&gt;
openclaw config set agents.defaults.heartbeat.model openai-codex/gpt-5.4&lt;br /&gt;
openclaw gateway restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
openclaw config set agents.defaults.model.primary anthropic/claude-opus-4-6&lt;br /&gt;
openclaw config set agents.defaults.heartbeat.model anthropic/claude-sonnet-4-6&lt;br /&gt;
openclaw gateway restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Scott</name></author>
	</entry>
	<entry>
		<id>https://wiki.scott5.org/index.php?title=Openclaw&amp;diff=1860</id>
		<title>Openclaw</title>
		<link rel="alternate" type="text/html" href="https://wiki.scott5.org/index.php?title=Openclaw&amp;diff=1860"/>
		<updated>2026-04-17T15:53:58Z</updated>

		<summary type="html">&lt;p&gt;Scott: /* Watching Quotas for Flat-Rate Plans */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Interactive Session ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
openclaw tui&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Routine Maintenance ==&lt;br /&gt;
(as non-root user)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
brew update&lt;br /&gt;
brew upgrade&lt;br /&gt;
openclaw update&lt;br /&gt;
openclaw doctor&lt;br /&gt;
openclaw gateway restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Watching Quotas for Flat-Rate Plans ==&lt;br /&gt;
From the command line:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
openclaw status --usage (or just &amp;quot;openclaw status&amp;quot; for full details)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
From the interactive console:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Managing Models ==&lt;br /&gt;
NOTE: I don&#039;t use this any more.  Openclaw allows you to configure a primary and a fallback.  Also, removing the heartbeat.model setting tells openclaw to just use the default model for heartbeats, just as with active sessions.&lt;br /&gt;
current models:&lt;br /&gt;
* openai-codex/gpt-5.4&lt;br /&gt;
* anthropic/claude-opus-4-6&lt;br /&gt;
&lt;br /&gt;
switch model: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
openclaw config set agents.defaults.model.primary openai-codex/gpt-5.4&lt;br /&gt;
openclaw config set agents.defaults.heartbeat.model openai-codex/gpt-5.4&lt;br /&gt;
openclaw gateway restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
openclaw config set agents.defaults.model.primary anthropic/claude-opus-4-6&lt;br /&gt;
openclaw config set agents.defaults.heartbeat.model anthropic/claude-sonnet-4-6&lt;br /&gt;
openclaw gateway restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Scott</name></author>
	</entry>
	<entry>
		<id>https://wiki.scott5.org/index.php?title=Openclaw&amp;diff=1859</id>
		<title>Openclaw</title>
		<link rel="alternate" type="text/html" href="https://wiki.scott5.org/index.php?title=Openclaw&amp;diff=1859"/>
		<updated>2026-04-17T15:39:15Z</updated>

		<summary type="html">&lt;p&gt;Scott: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Interactive Session ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
openclaw tui&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Routine Maintenance ==&lt;br /&gt;
(as non-root user)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
brew update&lt;br /&gt;
brew upgrade&lt;br /&gt;
openclaw update&lt;br /&gt;
openclaw doctor&lt;br /&gt;
openclaw gateway restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Watching Quotas for Flat-Rate Plans ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
openclaw status --usage&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Managing Models ==&lt;br /&gt;
NOTE: I don&#039;t use this any more.  Openclaw allows you to configure a primary and a fallback.  Also, removing the heartbeat.model setting tells openclaw to just use the default model for heartbeats, just as with active sessions.&lt;br /&gt;
current models:&lt;br /&gt;
* openai-codex/gpt-5.4&lt;br /&gt;
* anthropic/claude-opus-4-6&lt;br /&gt;
&lt;br /&gt;
switch model: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
openclaw config set agents.defaults.model.primary openai-codex/gpt-5.4&lt;br /&gt;
openclaw config set agents.defaults.heartbeat.model openai-codex/gpt-5.4&lt;br /&gt;
openclaw gateway restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
openclaw config set agents.defaults.model.primary anthropic/claude-opus-4-6&lt;br /&gt;
openclaw config set agents.defaults.heartbeat.model anthropic/claude-sonnet-4-6&lt;br /&gt;
openclaw gateway restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Scott</name></author>
	</entry>
	<entry>
		<id>https://wiki.scott5.org/index.php?title=Openclaw&amp;diff=1858</id>
		<title>Openclaw</title>
		<link rel="alternate" type="text/html" href="https://wiki.scott5.org/index.php?title=Openclaw&amp;diff=1858"/>
		<updated>2026-04-15T19:35:59Z</updated>

		<summary type="html">&lt;p&gt;Scott: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Managing Models ==&lt;br /&gt;
current models:&lt;br /&gt;
* openai-codex/gpt-5.4&lt;br /&gt;
* anthropic/claude-opus-4-6&lt;br /&gt;
&lt;br /&gt;
switch model: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
openclaw config set agents.defaults.model.primary openai-codex/gpt-5.4&lt;br /&gt;
openclaw config set agents.defaults.heartbeat.model openai-codex/gpt-5.4&lt;br /&gt;
openclaw gateway restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
openclaw config set agents.defaults.model.primary anthropic/claude-opus-4-6&lt;br /&gt;
openclaw config set agents.defaults.heartbeat.model anthropic/claude-sonnet-4-6&lt;br /&gt;
openclaw gateway restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Routine Maintenance ==&lt;br /&gt;
(as non-root user)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
brew update&lt;br /&gt;
brew upgrade&lt;br /&gt;
openclaw update&lt;br /&gt;
openclaw doctor&lt;br /&gt;
openclaw gateway restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Scott</name></author>
	</entry>
	<entry>
		<id>https://wiki.scott5.org/index.php?title=Openclaw&amp;diff=1857</id>
		<title>Openclaw</title>
		<link rel="alternate" type="text/html" href="https://wiki.scott5.org/index.php?title=Openclaw&amp;diff=1857"/>
		<updated>2026-04-15T19:34:38Z</updated>

		<summary type="html">&lt;p&gt;Scott: Created page with &amp;quot;== Managing Models == current models: * openai-codex/gpt-5.4 * anthropic/claude-opus-4-6  switch model:  &amp;lt;pre&amp;gt; openclaw config set agents.defaults.model.primary openai-codex/gpt-5.4 openclaw config set agents.defaults.heartbeat.model openai-codex/gpt-5.4 openclaw gateway restart &amp;lt;/pre&amp;gt; &amp;lt;pre&amp;gt; openclaw config set agents.defaults.model.primary anthropic/claude-opus-4-6 openclaw config set agents.defaults.heartbeat.model anthropic/claude-sonnet-4-6 openclaw gateway restart &amp;lt;...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Managing Models ==&lt;br /&gt;
current models:&lt;br /&gt;
* openai-codex/gpt-5.4&lt;br /&gt;
* anthropic/claude-opus-4-6&lt;br /&gt;
&lt;br /&gt;
switch model: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
openclaw config set agents.defaults.model.primary openai-codex/gpt-5.4&lt;br /&gt;
openclaw config set agents.defaults.heartbeat.model openai-codex/gpt-5.4&lt;br /&gt;
openclaw gateway restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
openclaw config set agents.defaults.model.primary anthropic/claude-opus-4-6&lt;br /&gt;
openclaw config set agents.defaults.heartbeat.model anthropic/claude-sonnet-4-6&lt;br /&gt;
openclaw gateway restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Scott</name></author>
	</entry>
	<entry>
		<id>https://wiki.scott5.org/index.php?title=Main_Page&amp;diff=1856</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.scott5.org/index.php?title=Main_Page&amp;diff=1856"/>
		<updated>2026-04-15T19:32:01Z</updated>

		<summary type="html">&lt;p&gt;Scott: /* Packages and Commands */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
== Programming ==&lt;br /&gt;
{|&lt;br /&gt;
|width=&amp;quot;120px&amp;quot;|&lt;br /&gt;
| |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;bash&#039;&#039;&#039;&lt;br /&gt;
|[[bash|Notes]]&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;C/C++ &#039;&#039;&#039;&lt;br /&gt;
|[[C Basics]] | [[C++ Basics]] | [[C++ I/O]] | [[CUDA C]] | [[Objective C]] | [[iPhone]]&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Go&#039;&#039;&#039;&lt;br /&gt;
|[[Go Basics|Basics]] | [[Go Strings|Strings]]&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;HTML and CSS&#039;&#039;&#039;&lt;br /&gt;
|[[HTML and CSS|Notes]]&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Java&#039;&#039;&#039;&lt;br /&gt;
|[[Java Basics|Basics]] | [[Java I/O|I/O]] | [[Java Objects|Objects]] | [[Java Properties Files|Properties Files]] | [[Java System Calls|System Calls]] | [[log4j]]&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;JavaScript&#039;&#039;&#039;&lt;br /&gt;
|[[JavaScript Basics|Basics]] | [[AngularJS]] | [[jQuery]] | [[JavaScript mailto Trick]] | [[Dojo Basics]] | [[Dojo Data Stores]] | [[E4X]] | [[Prototype]]&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Matlab&#039;&#039;&#039;&lt;br /&gt;
|[[Matlab|Basics]]&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Perl&#039;&#039;&#039;&lt;br /&gt;
|[[Perl Basics|Basics]] | [[Perl I/O|I/O]] | [[Perl Command-Line Arguments|Command-Line Arguments]] | [[Perl Subroutines|Subroutines]] | [[Perl Regular Expressions|Regular Expressions]] | [[Installing Perl Modules|Installing Modules]] | [[Example Perl Scripts|Example Scripts]]&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PHP&#039;&#039;&#039;&lt;br /&gt;
|[[PHP|Basics]]&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Python&#039;&#039;&#039;&lt;br /&gt;
|[[Python Basics|Basics]] | [[Python I/O|I/O]] | [[Python Modules|Modules]] | [[Python Regular Expressions|Regular Expressions]] | [[Python Date and Time|Date and Time]] | [[Python System Calls|System Calls]] | [[matplotlib]] | [[scipy]] | [[Python Curses|curses]]&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Python3&#039;&#039;&#039;&lt;br /&gt;
|[[Python3 Basics|Basics]] | [[Python 3 I/O|I/O]] | [[Python Cryptography Tools]]&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;R&#039;&#039;&#039;&lt;br /&gt;
|[[R Basics|Basics]] | [[R Graphics|Graphics]] | [[R I/O|I/O]] | [[R Packages|Packages]] | [[R Statistics|Statistics]]&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Ruby&#039;&#039;&#039;&lt;br /&gt;
|[[Ruby Basics|Basics]] | [[Ruby Classes and Modules|Classes and Modules]] | [[Ruby Data Structures|Data Structures]] | [[Ruby I/O|I/O]] | [[RVM]]&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Ruby on Rails&#039;&#039;&#039;&lt;br /&gt;
|[[Rails Basics|Basics]] | [[Rails Form Examples]] | [[Rails 4 Notes]] | [[Nginx, Passenger, and Rails]]&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Rails 3&#039;&#039;&#039;&lt;br /&gt;
|[[Rails 3 Basics|Basics]] | [[Rails 3 Model|Model]] | [[Rails 3 View|View]] | [[Rails 3 Controller|Controller]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Packages and Commands ==&lt;br /&gt;
[[7zip]]      |&lt;br /&gt;
[[apache]]    | &lt;br /&gt;
[[autofs]]    | &lt;br /&gt;
[[awk]]       | &lt;br /&gt;
[[awstats]]   |&lt;br /&gt;
[[ccrypt]]    | &lt;br /&gt;
[[certbot]]   |&lt;br /&gt;
[[chkconfig]] | &lt;br /&gt;
[[crontab]]   |&lt;br /&gt;
[[date]]      | &lt;br /&gt;
[[dd]]        | &lt;br /&gt;
[[diff]]      | &lt;br /&gt;
[[dirvish]]   | &lt;br /&gt;
[[docker]]&lt;br /&gt;
&lt;br /&gt;
[[emacs]]     |&lt;br /&gt;
[[fastcgi++]] | &lt;br /&gt;
[[find]]      |&lt;br /&gt;
[[gimp]]      |&lt;br /&gt;
[[git]]       |&lt;br /&gt;
[[gnuplot]]   |&lt;br /&gt;
[[goaccess]]  |&lt;br /&gt;
[[gpg]]       |&lt;br /&gt;
[[iozone]]    | &lt;br /&gt;
[[iptables]]  | &lt;br /&gt;
[[locate]]    |&lt;br /&gt;
[[mail]]        | &lt;br /&gt;
[[mediawiki]]   &lt;br /&gt;
&lt;br /&gt;
[[mercurial]]   | &lt;br /&gt;
[[mtr]]         |&lt;br /&gt;
[[mysql]]       |&lt;br /&gt;
[[netplan]]     |&lt;br /&gt;
[[nfs4]]        |&lt;br /&gt;
[[nginx]]       |&lt;br /&gt;
[[openclaw]]    |&lt;br /&gt;
[[openssl]]     |&lt;br /&gt;
[[pipenv]]      |&lt;br /&gt;
[[postgresql]]  |&lt;br /&gt;
[[ps]]          | &lt;br /&gt;
[[quota]]       |&lt;br /&gt;
[[rbenv]]       |&lt;br /&gt;
[[rsync]]&lt;br /&gt;
&lt;br /&gt;
[[screen]]      |&lt;br /&gt;
[[sed]]         | &lt;br /&gt;
[[smartctl]]    | &lt;br /&gt;
[[sort]]        | &lt;br /&gt;
[[split]]       |&lt;br /&gt;
[[ssh]]         | &lt;br /&gt;
[[Sublime Text|subl]]  |&lt;br /&gt;
[[subversion]]  |&lt;br /&gt;
[[supervisor]]  |&lt;br /&gt;
[[systemd]]  |&lt;br /&gt;
[[tar]]         | &lt;br /&gt;
[[thin]]        | &lt;br /&gt;
[[tr]]&lt;br /&gt;
&lt;br /&gt;
[[ufw]]         |&lt;br /&gt;
[[update-rc.d]] | &lt;br /&gt;
[[usermod]]     |&lt;br /&gt;
[[vi]]          | &lt;br /&gt;
[[virtualbox]]  |&lt;br /&gt;
[[xargs]]       | &lt;br /&gt;
[[xsendfile]]   | &lt;br /&gt;
[[youtube]]     | &lt;br /&gt;
[[yum]]         | &lt;br /&gt;
[[zfs]]         | &lt;br /&gt;
[[zip]]&lt;br /&gt;
&lt;br /&gt;
== Linux How-To ==&lt;br /&gt;
[[How to set up two-factor authentication|2FA (two-factor authentication)]]      |&lt;br /&gt;
[[How to add a new disk drive|add a new disk drive]]                             | &lt;br /&gt;
[[How to back up and restore a partition|back up and restore a partition]]       | &lt;br /&gt;
[[How to burn a DVD|burn a DVD]]                                &lt;br /&gt;
&lt;br /&gt;
[[How to change a server&#039;s hostname|change a server&#039;s hostname]]                 |&lt;br /&gt;
[[Linux file compression|compress/decompress files and directories]]             |&lt;br /&gt;
[[How to create an ISO file from a CD-ROM|create an ISO file from a CD-ROM]]     &lt;br /&gt;
&lt;br /&gt;
[[How to find a MAC address|find a MAC address]]                                 |&lt;br /&gt;
[[How to find an executable|find an executable]]                                 | &lt;br /&gt;
[[How to free kernel memory|free kernel memory]]                                 |&lt;br /&gt;
[[How to interrogate a computer&#039;s hardware|interrogate a computer&#039;s hardware]]&lt;br /&gt;
&lt;br /&gt;
[[How to manage quotas|manage quotas]]                                           |&lt;br /&gt;
[[How to monitor performance|monitor performance]]                               |&lt;br /&gt;
[[How to mount an ISO|mount an ISO]]                                             | &lt;br /&gt;
[[How to mount an LVM partition|mount an LVM partition]]                         |&lt;br /&gt;
[[How to optimize a solid state drive|optimize a solid state drive]]             &lt;br /&gt;
&lt;br /&gt;
[[How to repair GRUB|repair GRUB]]                                               |&lt;br /&gt;
[[How to re-create /dev/null|re-create &amp;lt;code&amp;gt;/dev/null&amp;lt;/code&amp;gt;]]                  |&lt;br /&gt;
[[How to set up Ubuntu Server|set up Ubuntu Server]]                             |&lt;br /&gt;
[[How to set up Ubuntu Desktop|set up Ubuntu Desktop]]                           |&lt;br /&gt;
[[How to set up a VPS|set up VPS]]                                               &lt;br /&gt;
&lt;br /&gt;
[[Ubuntu keyboard shortcuts]]                                                    |&lt;br /&gt;
[[How to use a tape drive|use a tape drive]]                                     |&lt;br /&gt;
[[How to wipe a hard drive|wipe a hard drive]]&lt;br /&gt;
&lt;br /&gt;
== Mac and Windows ==&lt;br /&gt;
&#039;&#039;&#039;Mac&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Mac Orientation]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Windows access control lists|access control lists]] | [[Windows administrative login|administrative login]] | [[Windows file sharing|file sharing]] | [[Windows minimum hardware requirements|minimum hardware requirements]] | [[Windows offline files|offline files]]&lt;br /&gt;
&lt;br /&gt;
[[Recover files from a non-booting Windows PC|recover files]] | [[Windows remote desktop|remote desktop]] | [[Windows security|security]] | [[Windows services|services]] | [[Windows shell programming|shell programming]] | [[Windows troubleshoot network connection|troubleshoot network connection]] | [[Windows wisdom|wisdom]]&lt;br /&gt;
&lt;br /&gt;
== Math ==&lt;br /&gt;
[[Exponential Moving Average]] | [[Statistics]]&lt;br /&gt;
&lt;br /&gt;
== Biology ==&lt;br /&gt;
[[Brain]] | [[MRI]] | [[fMRI]] | [[Bioinformatics]]&lt;br /&gt;
&lt;br /&gt;
== Books ==&lt;br /&gt;
[[Guide to the Good Life]] | [[How We Decide]] | [[Logic of Life]] | [[New Abs Diet]] | [[Parenting]] &lt;br /&gt;
&lt;br /&gt;
[[Power of Habit]] | [[Predictably Irrational]] | [[Run]] | [[Run Faster]] | [[Sapiens]] | [[Spark]] | [[Total Heart Rate Training]]&lt;br /&gt;
&lt;br /&gt;
== Other ==&lt;br /&gt;
[[Wiki Formatting Cheat Sheet]] | [[Recipes]] | [[Diet]] | [[Quotes]] | [[Alberto Salazar&#039;s Ten Golden Rules]]&lt;br /&gt;
| [[Buddhism]] | [[Favorite Booze]]&lt;/div&gt;</summary>
		<author><name>Scott</name></author>
	</entry>
	<entry>
		<id>https://wiki.scott5.org/index.php?title=How_to_set_up_two-factor_authentication&amp;diff=1855</id>
		<title>How to set up two-factor authentication</title>
		<link rel="alternate" type="text/html" href="https://wiki.scott5.org/index.php?title=How_to_set_up_two-factor_authentication&amp;diff=1855"/>
		<updated>2026-02-13T22:12:33Z</updated>

		<summary type="html">&lt;p&gt;Scott: /* Public Key + 2FA */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;https://vrealmatic.com/ubuntu-server/2fa-google-authenticator&lt;br /&gt;
&lt;br /&gt;
OATH-TOTP (Open Authentication Time-Based One-Time Password) is an open protocol that generates a one-time use password, commonly a 6 digit number that is recycled every 30 seconds.&lt;br /&gt;
&lt;br /&gt;
PREREQUISITE: Before setting this up, you need a smartphone or tablet with an OATH-TOTP app installed, like Google Authenticator or Authy.&lt;br /&gt;
&lt;br /&gt;
== Install Google&#039;s PAM ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ sudo apt install libpam-google-authenticator&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
For each user that needs 2FA, run &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ google-authenticator&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Answer &amp;quot;y&amp;quot; for yes to say that &amp;quot;you want authentication tokens to be time-based&amp;quot;.  A QR code will pop up in your terminal.  Use the TOTP app on your phone to take a picture of this to add the account.  Give reasonable answers to the rest of the questions.  You should end up with a hidden &amp;lt;code&amp;gt;.google_authenticator&amp;lt;/code&amp;gt; file in your home directory.&lt;br /&gt;
&lt;br /&gt;
== Configure SSH ==&lt;br /&gt;
Edit &amp;lt;code&amp;gt;/etc/pam.d/sshd&amp;lt;/code&amp;gt; to add this line at the end:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
auth required pam_google_authenticator.so nullok&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
(skip &amp;lt;code&amp;gt;nullok&amp;lt;/code&amp;gt; if ALL users must use 2FA)&lt;br /&gt;
Edit &amp;lt;code&amp;gt;/etc/ssh/sshd_config&amp;lt;/code&amp;gt;.  Look for &amp;lt;code&amp;gt;ChallengeResponseAuthentication&amp;lt;/code&amp;gt; OR &amp;lt;code&amp;gt;KbdInteractiveAuthentication&amp;lt;/code&amp;gt; and set its value to &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
. . .&lt;br /&gt;
# Change to yes to enable challenge-response passwords (beware issues with&lt;br /&gt;
# some PAM modules and threads)&lt;br /&gt;
ChallengeResponseAuthentication yes&lt;br /&gt;
# OR #&lt;br /&gt;
KbdInteractiveAuthentication yes&lt;br /&gt;
. . .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Restart sshd:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo systemctl restart sshd.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
WARNING: Don&#039;t close your existing terminal until you know everything is working!&lt;br /&gt;
&lt;br /&gt;
== Public Key OR Password+2FA ==&lt;br /&gt;
Open a new terminal and attempt to log in via SSH.  If you&#039;ve previously created an SSH key and are using it, you&#039;ll notice you didn&#039;t have to type in your user&#039;s password or the MFA verification code. This is because an SSH key overrides all other authentication options by default. Otherwise, you should have gotten a password and verification code prompt.&lt;br /&gt;
&lt;br /&gt;
== Public Key + 2FA ==&lt;br /&gt;
If your SSH server doesn&#039;t allow passwords (with &amp;lt;code&amp;gt;PasswordAuthentication no&amp;lt;/code&amp;gt; and you want to require BOTH public key AND 2FA:&lt;br /&gt;
&lt;br /&gt;
Edit &amp;lt;code&amp;gt;/etc/pam.d/sshd&amp;lt;/code&amp;gt; to comment out &amp;lt;code&amp;gt;@include common-auth&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
. . .&lt;br /&gt;
# Standard Un*x authentication.&lt;br /&gt;
#@include common-auth&lt;br /&gt;
. . .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Edit &amp;lt;code&amp;gt;/etc/ssh/sshd_config&amp;lt;/code&amp;gt; to add a &amp;lt;code&amp;gt;Match User&amp;lt;/code&amp;gt; section for users that need to use 2FA:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Match User barney&lt;br /&gt;
    AuthenticationMethods publickey,keyboard-interactive&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
(skip the &amp;lt;code&amp;gt;Match User&amp;lt;/code&amp;gt; line if everyone needs to use 2FA)&lt;br /&gt;
Restart sshd:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo systemctl restart sshd.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note: this won&#039;t affect password-use for sudo commands.&lt;/div&gt;</summary>
		<author><name>Scott</name></author>
	</entry>
	<entry>
		<id>https://wiki.scott5.org/index.php?title=How_to_set_up_two-factor_authentication&amp;diff=1854</id>
		<title>How to set up two-factor authentication</title>
		<link rel="alternate" type="text/html" href="https://wiki.scott5.org/index.php?title=How_to_set_up_two-factor_authentication&amp;diff=1854"/>
		<updated>2026-02-13T22:10:18Z</updated>

		<summary type="html">&lt;p&gt;Scott: /* Configure SSH */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;https://vrealmatic.com/ubuntu-server/2fa-google-authenticator&lt;br /&gt;
&lt;br /&gt;
OATH-TOTP (Open Authentication Time-Based One-Time Password) is an open protocol that generates a one-time use password, commonly a 6 digit number that is recycled every 30 seconds.&lt;br /&gt;
&lt;br /&gt;
PREREQUISITE: Before setting this up, you need a smartphone or tablet with an OATH-TOTP app installed, like Google Authenticator or Authy.&lt;br /&gt;
&lt;br /&gt;
== Install Google&#039;s PAM ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ sudo apt install libpam-google-authenticator&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
For each user that needs 2FA, run &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ google-authenticator&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Answer &amp;quot;y&amp;quot; for yes to say that &amp;quot;you want authentication tokens to be time-based&amp;quot;.  A QR code will pop up in your terminal.  Use the TOTP app on your phone to take a picture of this to add the account.  Give reasonable answers to the rest of the questions.  You should end up with a hidden &amp;lt;code&amp;gt;.google_authenticator&amp;lt;/code&amp;gt; file in your home directory.&lt;br /&gt;
&lt;br /&gt;
== Configure SSH ==&lt;br /&gt;
Edit &amp;lt;code&amp;gt;/etc/pam.d/sshd&amp;lt;/code&amp;gt; to add this line at the end:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
auth required pam_google_authenticator.so nullok&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
(skip &amp;lt;code&amp;gt;nullok&amp;lt;/code&amp;gt; if ALL users must use 2FA)&lt;br /&gt;
Edit &amp;lt;code&amp;gt;/etc/ssh/sshd_config&amp;lt;/code&amp;gt;.  Look for &amp;lt;code&amp;gt;ChallengeResponseAuthentication&amp;lt;/code&amp;gt; OR &amp;lt;code&amp;gt;KbdInteractiveAuthentication&amp;lt;/code&amp;gt; and set its value to &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
. . .&lt;br /&gt;
# Change to yes to enable challenge-response passwords (beware issues with&lt;br /&gt;
# some PAM modules and threads)&lt;br /&gt;
ChallengeResponseAuthentication yes&lt;br /&gt;
# OR #&lt;br /&gt;
KbdInteractiveAuthentication yes&lt;br /&gt;
. . .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Restart sshd:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo systemctl restart sshd.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
WARNING: Don&#039;t close your existing terminal until you know everything is working!&lt;br /&gt;
&lt;br /&gt;
== Public Key OR Password+2FA ==&lt;br /&gt;
Open a new terminal and attempt to log in via SSH.  If you&#039;ve previously created an SSH key and are using it, you&#039;ll notice you didn&#039;t have to type in your user&#039;s password or the MFA verification code. This is because an SSH key overrides all other authentication options by default. Otherwise, you should have gotten a password and verification code prompt.&lt;br /&gt;
&lt;br /&gt;
== Public Key + 2FA ==&lt;br /&gt;
If your SSH server doesn&#039;t allow passwords (with &amp;lt;code&amp;gt;PasswordAuthentication no&amp;lt;/code&amp;gt; and you want to require BOTH public key AND 2FA:&lt;br /&gt;
&lt;br /&gt;
Edit &amp;lt;code&amp;gt;/etc/pam.d/sshd&amp;lt;/code&amp;gt; to comment out &amp;lt;code&amp;gt;@include common-auth&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
. . .&lt;br /&gt;
# Standard Un*x authentication.&lt;br /&gt;
#@include common-auth&lt;br /&gt;
. . .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Edit &amp;lt;code&amp;gt;/etc/ssh/sshd_config&amp;lt;/code&amp;gt; to add a &amp;lt;code&amp;gt;Match User&amp;lt;/code&amp;gt; section for users that need to use 2FA:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Match User barney&lt;br /&gt;
    AuthenticationMethods publickey,keyboard-interactive&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Restart sshd:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo systemctl restart sshd.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Scott</name></author>
	</entry>
	<entry>
		<id>https://wiki.scott5.org/index.php?title=How_to_set_up_two-factor_authentication&amp;diff=1853</id>
		<title>How to set up two-factor authentication</title>
		<link rel="alternate" type="text/html" href="https://wiki.scott5.org/index.php?title=How_to_set_up_two-factor_authentication&amp;diff=1853"/>
		<updated>2026-02-13T22:09:33Z</updated>

		<summary type="html">&lt;p&gt;Scott: /* Configure SSH */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;https://vrealmatic.com/ubuntu-server/2fa-google-authenticator&lt;br /&gt;
&lt;br /&gt;
OATH-TOTP (Open Authentication Time-Based One-Time Password) is an open protocol that generates a one-time use password, commonly a 6 digit number that is recycled every 30 seconds.&lt;br /&gt;
&lt;br /&gt;
PREREQUISITE: Before setting this up, you need a smartphone or tablet with an OATH-TOTP app installed, like Google Authenticator or Authy.&lt;br /&gt;
&lt;br /&gt;
== Install Google&#039;s PAM ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ sudo apt install libpam-google-authenticator&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
For each user that needs 2FA, run &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ google-authenticator&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Answer &amp;quot;y&amp;quot; for yes to say that &amp;quot;you want authentication tokens to be time-based&amp;quot;.  A QR code will pop up in your terminal.  Use the TOTP app on your phone to take a picture of this to add the account.  Give reasonable answers to the rest of the questions.  You should end up with a hidden &amp;lt;code&amp;gt;.google_authenticator&amp;lt;/code&amp;gt; file in your home directory.&lt;br /&gt;
&lt;br /&gt;
== Configure SSH ==&lt;br /&gt;
Edit &amp;lt;code&amp;gt;/etc/pam.d/sshd&amp;lt;/code&amp;gt; to add this line at the end:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
auth required pam_google_authenticator.so nullok&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
(skip &amp;quot;nullok&amp;quot; if ALL users must use 2FA)&lt;br /&gt;
Edit &amp;lt;code&amp;gt;/etc/ssh/sshd_config&amp;lt;/code&amp;gt;.  Look for &amp;lt;code&amp;gt;ChallengeResponseAuthentication&amp;lt;/code&amp;gt; OR &amp;lt;code&amp;gt;KbdInteractiveAuthentication&amp;lt;/code&amp;gt; and set its value to &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
. . .&lt;br /&gt;
# Change to yes to enable challenge-response passwords (beware issues with&lt;br /&gt;
# some PAM modules and threads)&lt;br /&gt;
ChallengeResponseAuthentication yes&lt;br /&gt;
# OR #&lt;br /&gt;
KbdInteractiveAuthentication yes&lt;br /&gt;
. . .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Restart sshd:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo systemctl restart sshd.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
WARNING: Don&#039;t close your existing terminal until you know everything is working!&lt;br /&gt;
&lt;br /&gt;
== Public Key OR Password+2FA ==&lt;br /&gt;
Open a new terminal and attempt to log in via SSH.  If you&#039;ve previously created an SSH key and are using it, you&#039;ll notice you didn&#039;t have to type in your user&#039;s password or the MFA verification code. This is because an SSH key overrides all other authentication options by default. Otherwise, you should have gotten a password and verification code prompt.&lt;br /&gt;
&lt;br /&gt;
== Public Key + 2FA ==&lt;br /&gt;
If your SSH server doesn&#039;t allow passwords (with &amp;lt;code&amp;gt;PasswordAuthentication no&amp;lt;/code&amp;gt; and you want to require BOTH public key AND 2FA:&lt;br /&gt;
&lt;br /&gt;
Edit &amp;lt;code&amp;gt;/etc/pam.d/sshd&amp;lt;/code&amp;gt; to comment out &amp;lt;code&amp;gt;@include common-auth&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
. . .&lt;br /&gt;
# Standard Un*x authentication.&lt;br /&gt;
#@include common-auth&lt;br /&gt;
. . .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Edit &amp;lt;code&amp;gt;/etc/ssh/sshd_config&amp;lt;/code&amp;gt; to add a &amp;lt;code&amp;gt;Match User&amp;lt;/code&amp;gt; section for users that need to use 2FA:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Match User barney&lt;br /&gt;
    AuthenticationMethods publickey,keyboard-interactive&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Restart sshd:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo systemctl restart sshd.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Scott</name></author>
	</entry>
	<entry>
		<id>https://wiki.scott5.org/index.php?title=How_to_set_up_a_VPS&amp;diff=1852</id>
		<title>How to set up a VPS</title>
		<link rel="alternate" type="text/html" href="https://wiki.scott5.org/index.php?title=How_to_set_up_a_VPS&amp;diff=1852"/>
		<updated>2026-02-09T18:49:48Z</updated>

		<summary type="html">&lt;p&gt;Scott: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Log in as root via ssh&lt;br /&gt;
* add line to &amp;lt;code&amp;gt;/etc/hosts&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;dpkg-reconfigure tzdata&amp;lt;/code&amp;gt;&lt;br /&gt;
* create user account, add to sudoers:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
useradd --create-home --shell /bin/bash myuser&lt;br /&gt;
usermod -aG sudo myuser&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;apt install emacs-nox nmap postfix mailutils logwatch unzip zip&amp;lt;/code&amp;gt;&lt;br /&gt;
* update ssh to listen on a different port by editing &amp;lt;code&amp;gt;/lib/systemd/system/ssh.socket&amp;lt;/code&amp;gt;, then restart ssh.  Test it!&lt;br /&gt;
* Carefully deny root access &lt;br /&gt;
* set up firewall&lt;br /&gt;
* set up backups&lt;br /&gt;
* apt install nginx mysql-server supervisor&lt;br /&gt;
* install docker-compose: http://docs.docker.com/compose/install/&lt;br /&gt;
* fix [[mysql]], create mysql databases and app accounts&lt;br /&gt;
* schedule nightly database snapshots&lt;br /&gt;
* set up sites in &amp;lt;code&amp;gt;/etc/nginx/sites-available&amp;lt;/code&amp;gt; and activate in &amp;lt;code&amp;gt;/etc/nginx/sites-enabled&amp;lt;/code&amp;gt;&lt;br /&gt;
* set up apps in &amp;lt;code&amp;gt;/etc/supervisor/conf.d&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== after setting up DNS name ==&lt;br /&gt;
* update hostname in /etc/hosts, /etc/hostname, run &amp;quot;hostname -F /etc/hostname&amp;quot;&lt;br /&gt;
* configure postfix&lt;br /&gt;
* make sure you receive nightly log messages&lt;/div&gt;</summary>
		<author><name>Scott</name></author>
	</entry>
	<entry>
		<id>https://wiki.scott5.org/index.php?title=Salt&amp;diff=1851</id>
		<title>Salt</title>
		<link rel="alternate" type="text/html" href="https://wiki.scott5.org/index.php?title=Salt&amp;diff=1851"/>
		<updated>2025-11-13T17:22:42Z</updated>

		<summary type="html">&lt;p&gt;Scott: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Salt Recipe #12 ==&lt;br /&gt;
* 84g table salt&lt;br /&gt;
* 28g potassium citrate&lt;br /&gt;
* 8g magnesium citrate&lt;br /&gt;
&lt;br /&gt;
(100 servings, 1.2g/serving)&lt;br /&gt;
&lt;br /&gt;
== Sports Drink ==&lt;br /&gt;
* 12g salt mix above&lt;br /&gt;
* 88g sucrose&lt;br /&gt;
* 175g dextrose&lt;br /&gt;
&lt;br /&gt;
(10 servings of 27.5g, approx 100 calories)&lt;/div&gt;</summary>
		<author><name>Scott</name></author>
	</entry>
	<entry>
		<id>https://wiki.scott5.org/index.php?title=Git&amp;diff=1850</id>
		<title>Git</title>
		<link rel="alternate" type="text/html" href="https://wiki.scott5.org/index.php?title=Git&amp;diff=1850"/>
		<updated>2025-04-25T22:50:03Z</updated>

		<summary type="html">&lt;p&gt;Scott: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cheat Sheets ==&lt;br /&gt;
https://about.gitlab.com/images/press/git-cheat-sheet.pdf&lt;br /&gt;
&lt;br /&gt;
https://github.com/kenmueller/gitignore&lt;br /&gt;
&lt;br /&gt;
== Initial Setup ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git config --global user.name &amp;quot;Harry Truman&amp;quot;&lt;br /&gt;
git config --global user.email &amp;quot;harry.truman@example.com&amp;quot;&lt;br /&gt;
git config --global --list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
May need to set up SSH-key authentication for gitlab.&lt;br /&gt;
&lt;br /&gt;
== Basics ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git init                  # create git repo inside current directory&lt;br /&gt;
git add .                 # add all changes to staging&lt;br /&gt;
git commit                # commit staged changes to master branch&lt;br /&gt;
git commit --amend        # redo/fix the commit you just did&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Branches ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git branch                # list branches (master is default, HEAD/* represents current)&lt;br /&gt;
git branch mybranch       # create a new branch&lt;br /&gt;
git switch mybranch       # switch to new branch&lt;br /&gt;
git checkout mybranch     # switch to new branch&lt;br /&gt;
git switch -c mybranch    # create new branch and switch to it&lt;br /&gt;
git checkout -b mybranch  # create new branch and switch to it&lt;br /&gt;
git branch -d mybranch    # delete branch&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Merging Branches ==&lt;br /&gt;
Example: To merge the &amp;lt;code&amp;gt;bugfix&amp;lt;/code&amp;gt; branch back into the &amp;lt;code&amp;gt;master&amp;lt;/code&amp;gt; branch, switch to the master branch and then type&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git merge bugfix&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Three possible merge situations&lt;br /&gt;
# Fast-forward: &amp;lt;code&amp;gt;master&amp;lt;/code&amp;gt; hasn&#039;t changed, only &amp;lt;code&amp;gt;bugfix&amp;lt;/code&amp;gt; has&lt;br /&gt;
# No-conflict merge: both have changed, but not in a way that conflicts&lt;br /&gt;
# Conflict merge: the same line of some file has changed in different ways in the two branches.&lt;br /&gt;
Conflict text will appear in the affected file(s).  Edit this as appropriate, then commit the change to master.&lt;br /&gt;
NOTE: the bugfix branch will still be different.&lt;br /&gt;
&lt;br /&gt;
== Clone Repository ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone git@gitlab.com:scottcamacmartin/my_project.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Upload Existing Code Directory as Gitlab Repository ==&lt;br /&gt;
First, creat a new project on gitlab.  Then, on the local dev machine:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone git@gitlab.com:scottcamacmartin/my_project.git&lt;br /&gt;
cd my_project&lt;br /&gt;
# then copy code into new folder my_project&lt;br /&gt;
# DELETE ANY SENSITIVE PASSWORDS, ETC&lt;br /&gt;
# also set up .gitignore file&lt;br /&gt;
git status&lt;br /&gt;
git add .&lt;br /&gt;
git commit -m &amp;quot;initial commit&amp;quot;&lt;br /&gt;
git push -u origin master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Overwrite local from repository ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git fetch --all&lt;br /&gt;
git show-branch   # to see whether branch is &amp;quot;master&amp;quot; or &amp;quot;main&amp;quot;&lt;br /&gt;
git reset --hard origin/master   # (or &amp;quot;origin/main&amp;quot; as above)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Overwrite a single file from repository ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git checkout HEAD~ &amp;lt;filename&amp;gt;&lt;br /&gt;
# or just write out a specific version for comparison&lt;br /&gt;
git show 7f7a8214befd1903260e6c6ae65d9158e4249881:rails/public/faq.html &amp;gt; faq.html.old&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Git Server ==&lt;br /&gt;
https://git-scm.com/book/en/v2/Git-on-the-Server-Setting-Up-the-Server&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/git-server/bin         # refresh-auth command&lt;br /&gt;
/opt/git-server/keys        # ssh keys&lt;br /&gt;
/opt/git-server/repos       # home directory with repos&lt;br /&gt;
/opt/git-server/repos/.ssh  # authorized_users file&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@perth:/etc# grep git /etc/passwd&lt;br /&gt;
git:x:222:222:Git Service User:/opt/git-server/repos:/usr/bin/git-shell&lt;br /&gt;
root@perth:/etc# grep git /etc/group&lt;br /&gt;
git:x:222:&lt;br /&gt;
root@perth:/etc# grep git /etc/shadow&lt;br /&gt;
git:*:17767:0:99999:7:::&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@perth:/opt/git-server/bin# cat refresh-auth &lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
GIT_SERVER_DIR=/opt/git-server&lt;br /&gt;
KEY_DIR=$GIT_SERVER_DIR/keys&lt;br /&gt;
SSH_KEY_FILE=$GIT_SERVER_DIR/repos/.ssh/authorized_keys&lt;br /&gt;
SSH_KEY_PREFIX=&amp;quot;no-pty,no-port-forwarding,no-X11-forwarding,no-agent-forwarding&amp;quot;&lt;br /&gt;
&lt;br /&gt;
find $KEY_DIR -type f -exec grep -v &#039;#&#039; {} \; | awk &#039;$1&#039; | sort -u | sed -e &amp;quot;s/^/${SSH_KEY_PREFIX} /&amp;quot; &amp;gt; $SSH_KEY_FILE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@perth:/opt/git-server/keys# ls -l&lt;br /&gt;
total 16&lt;br /&gt;
drwxr-xr-x 2 root root 4096 Nov 28 16:28 dc&lt;br /&gt;
drwxr-xr-x 2 root root 4096 Nov 30 10:18 martin&lt;br /&gt;
drwxr-xr-x 2 root root 4096 Nov 28 16:28 root&lt;br /&gt;
drwxr-xr-x 2 root root 4096 Nov 28 16:28 statsuser&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@perth:/opt/git-server/keys/martin# cat adelaide &lt;br /&gt;
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDbyBYOnAoKLyNvittK+xyEt01NPnPC2XUFKz4bHeolz martin@adelaide&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Initialize repository ===&lt;br /&gt;
As root on git server:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~git&lt;br /&gt;
mkdir project.git&lt;br /&gt;
cd project.git&lt;br /&gt;
git init --bare&lt;br /&gt;
cd ..&lt;br /&gt;
chown -R git.git project.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
As developer on developer PC:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd project&lt;br /&gt;
emacs .gitignore  # include a line with &amp;quot;**/.hg&amp;quot; to exclude .hg content&lt;br /&gt;
git init&lt;br /&gt;
git add .&lt;br /&gt;
git commit -m &#039;Initial commit&#039;&lt;br /&gt;
git remote add origin git@irc-git-host:project.git&lt;br /&gt;
git push origin master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
As another user:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone git@irc-git-host:project.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Scott</name></author>
	</entry>
	<entry>
		<id>https://wiki.scott5.org/index.php?title=Git&amp;diff=1849</id>
		<title>Git</title>
		<link rel="alternate" type="text/html" href="https://wiki.scott5.org/index.php?title=Git&amp;diff=1849"/>
		<updated>2025-04-25T22:09:00Z</updated>

		<summary type="html">&lt;p&gt;Scott: /* Cheat Sheets */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Initial Setup ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git config --global user.name &amp;quot;Harry Truman&amp;quot;&lt;br /&gt;
git config --global user.email &amp;quot;harry.truman@example.com&amp;quot;&lt;br /&gt;
git config --global --list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
May need to set up SSH-key authentication for gitlab.&lt;br /&gt;
&lt;br /&gt;
== Clone Repository ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone git@gitlab.com:scottcamacmartin/my_project.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Upload Existing Code Directory as Gitlab Repository ==&lt;br /&gt;
First, creat a new project on gitlab.  Then, on the local dev machine:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone git@gitlab.com:scottcamacmartin/my_project.git&lt;br /&gt;
cd my_project&lt;br /&gt;
# then copy code into new folder my_project&lt;br /&gt;
# DELETE ANY SENSITIVE PASSWORDS, ETC&lt;br /&gt;
# also set up .gitignore file&lt;br /&gt;
git status&lt;br /&gt;
git add .&lt;br /&gt;
git commit -m &amp;quot;initial commit&amp;quot;&lt;br /&gt;
git push -u origin master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Overwrite local from repository ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git fetch --all&lt;br /&gt;
git show-branch   # to see whether branch is &amp;quot;master&amp;quot; or &amp;quot;main&amp;quot;&lt;br /&gt;
git reset --hard origin/master   # (or &amp;quot;origin/main&amp;quot; as above)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Overwrite a single file from repository ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git checkout HEAD~ &amp;lt;filename&amp;gt;&lt;br /&gt;
# or just write out a specific version for comparison&lt;br /&gt;
git show 7f7a8214befd1903260e6c6ae65d9158e4249881:rails/public/faq.html &amp;gt; faq.html.old&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Cheat Sheets ==&lt;br /&gt;
https://about.gitlab.com/images/press/git-cheat-sheet.pdf&lt;br /&gt;
&lt;br /&gt;
https://github.com/kenmueller/gitignore&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit --amend        # redo/fix the commit you just did&lt;br /&gt;
git branch                # list branches (master is default, HEAD/* represents current)&lt;br /&gt;
git branch mybranch       # create a new branch&lt;br /&gt;
git branch -d mybranch    # delete branch&lt;br /&gt;
git switch mybranch       # switch to new branch&lt;br /&gt;
git checkout mybranch     # switch to new branch&lt;br /&gt;
git switch -c mybranch    # create new branch and switch to it&lt;br /&gt;
git checkout -b mybranch  # create new branch and switch to it&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Git Server ==&lt;br /&gt;
https://git-scm.com/book/en/v2/Git-on-the-Server-Setting-Up-the-Server&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/git-server/bin         # refresh-auth command&lt;br /&gt;
/opt/git-server/keys        # ssh keys&lt;br /&gt;
/opt/git-server/repos       # home directory with repos&lt;br /&gt;
/opt/git-server/repos/.ssh  # authorized_users file&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@perth:/etc# grep git /etc/passwd&lt;br /&gt;
git:x:222:222:Git Service User:/opt/git-server/repos:/usr/bin/git-shell&lt;br /&gt;
root@perth:/etc# grep git /etc/group&lt;br /&gt;
git:x:222:&lt;br /&gt;
root@perth:/etc# grep git /etc/shadow&lt;br /&gt;
git:*:17767:0:99999:7:::&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@perth:/opt/git-server/bin# cat refresh-auth &lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
GIT_SERVER_DIR=/opt/git-server&lt;br /&gt;
KEY_DIR=$GIT_SERVER_DIR/keys&lt;br /&gt;
SSH_KEY_FILE=$GIT_SERVER_DIR/repos/.ssh/authorized_keys&lt;br /&gt;
SSH_KEY_PREFIX=&amp;quot;no-pty,no-port-forwarding,no-X11-forwarding,no-agent-forwarding&amp;quot;&lt;br /&gt;
&lt;br /&gt;
find $KEY_DIR -type f -exec grep -v &#039;#&#039; {} \; | awk &#039;$1&#039; | sort -u | sed -e &amp;quot;s/^/${SSH_KEY_PREFIX} /&amp;quot; &amp;gt; $SSH_KEY_FILE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@perth:/opt/git-server/keys# ls -l&lt;br /&gt;
total 16&lt;br /&gt;
drwxr-xr-x 2 root root 4096 Nov 28 16:28 dc&lt;br /&gt;
drwxr-xr-x 2 root root 4096 Nov 30 10:18 martin&lt;br /&gt;
drwxr-xr-x 2 root root 4096 Nov 28 16:28 root&lt;br /&gt;
drwxr-xr-x 2 root root 4096 Nov 28 16:28 statsuser&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@perth:/opt/git-server/keys/martin# cat adelaide &lt;br /&gt;
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDbyBYOnAoKLyNvittK+xyEt01NPnPC2XUFKz4bHeolz martin@adelaide&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Initialize repository ===&lt;br /&gt;
As root on git server:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~git&lt;br /&gt;
mkdir project.git&lt;br /&gt;
cd project.git&lt;br /&gt;
git init --bare&lt;br /&gt;
cd ..&lt;br /&gt;
chown -R git.git project.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
As developer on developer PC:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd project&lt;br /&gt;
emacs .gitignore  # include a line with &amp;quot;**/.hg&amp;quot; to exclude .hg content&lt;br /&gt;
git init&lt;br /&gt;
git add .&lt;br /&gt;
git commit -m &#039;Initial commit&#039;&lt;br /&gt;
git remote add origin git@irc-git-host:project.git&lt;br /&gt;
git push origin master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
As another user:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone git@irc-git-host:project.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Scott</name></author>
	</entry>
	<entry>
		<id>https://wiki.scott5.org/index.php?title=Git&amp;diff=1848</id>
		<title>Git</title>
		<link rel="alternate" type="text/html" href="https://wiki.scott5.org/index.php?title=Git&amp;diff=1848"/>
		<updated>2025-04-24T22:13:46Z</updated>

		<summary type="html">&lt;p&gt;Scott: /* Cheat Sheets */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Initial Setup ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git config --global user.name &amp;quot;Harry Truman&amp;quot;&lt;br /&gt;
git config --global user.email &amp;quot;harry.truman@example.com&amp;quot;&lt;br /&gt;
git config --global --list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
May need to set up SSH-key authentication for gitlab.&lt;br /&gt;
&lt;br /&gt;
== Clone Repository ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone git@gitlab.com:scottcamacmartin/my_project.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Upload Existing Code Directory as Gitlab Repository ==&lt;br /&gt;
First, creat a new project on gitlab.  Then, on the local dev machine:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone git@gitlab.com:scottcamacmartin/my_project.git&lt;br /&gt;
cd my_project&lt;br /&gt;
# then copy code into new folder my_project&lt;br /&gt;
# DELETE ANY SENSITIVE PASSWORDS, ETC&lt;br /&gt;
# also set up .gitignore file&lt;br /&gt;
git status&lt;br /&gt;
git add .&lt;br /&gt;
git commit -m &amp;quot;initial commit&amp;quot;&lt;br /&gt;
git push -u origin master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Overwrite local from repository ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git fetch --all&lt;br /&gt;
git show-branch   # to see whether branch is &amp;quot;master&amp;quot; or &amp;quot;main&amp;quot;&lt;br /&gt;
git reset --hard origin/master   # (or &amp;quot;origin/main&amp;quot; as above)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Overwrite a single file from repository ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git checkout HEAD~ &amp;lt;filename&amp;gt;&lt;br /&gt;
# or just write out a specific version for comparison&lt;br /&gt;
git show 7f7a8214befd1903260e6c6ae65d9158e4249881:rails/public/faq.html &amp;gt; faq.html.old&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Cheat Sheets ==&lt;br /&gt;
https://about.gitlab.com/images/press/git-cheat-sheet.pdf&lt;br /&gt;
&lt;br /&gt;
https://github.com/kenmueller/gitignore&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit --amend      # redo/fix the commit you just did&lt;br /&gt;
git branch              # list branches (master is default, HEAD/* represents current)&lt;br /&gt;
git branch mybranch     # create a new branch&lt;br /&gt;
git branch -d mybranch  # delete branch&lt;br /&gt;
git switch mybranch     # switch to new branch&lt;br /&gt;
git switch -c mybranch  # create new branch and switch to it&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Git Server ==&lt;br /&gt;
https://git-scm.com/book/en/v2/Git-on-the-Server-Setting-Up-the-Server&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/git-server/bin         # refresh-auth command&lt;br /&gt;
/opt/git-server/keys        # ssh keys&lt;br /&gt;
/opt/git-server/repos       # home directory with repos&lt;br /&gt;
/opt/git-server/repos/.ssh  # authorized_users file&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@perth:/etc# grep git /etc/passwd&lt;br /&gt;
git:x:222:222:Git Service User:/opt/git-server/repos:/usr/bin/git-shell&lt;br /&gt;
root@perth:/etc# grep git /etc/group&lt;br /&gt;
git:x:222:&lt;br /&gt;
root@perth:/etc# grep git /etc/shadow&lt;br /&gt;
git:*:17767:0:99999:7:::&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@perth:/opt/git-server/bin# cat refresh-auth &lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
GIT_SERVER_DIR=/opt/git-server&lt;br /&gt;
KEY_DIR=$GIT_SERVER_DIR/keys&lt;br /&gt;
SSH_KEY_FILE=$GIT_SERVER_DIR/repos/.ssh/authorized_keys&lt;br /&gt;
SSH_KEY_PREFIX=&amp;quot;no-pty,no-port-forwarding,no-X11-forwarding,no-agent-forwarding&amp;quot;&lt;br /&gt;
&lt;br /&gt;
find $KEY_DIR -type f -exec grep -v &#039;#&#039; {} \; | awk &#039;$1&#039; | sort -u | sed -e &amp;quot;s/^/${SSH_KEY_PREFIX} /&amp;quot; &amp;gt; $SSH_KEY_FILE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@perth:/opt/git-server/keys# ls -l&lt;br /&gt;
total 16&lt;br /&gt;
drwxr-xr-x 2 root root 4096 Nov 28 16:28 dc&lt;br /&gt;
drwxr-xr-x 2 root root 4096 Nov 30 10:18 martin&lt;br /&gt;
drwxr-xr-x 2 root root 4096 Nov 28 16:28 root&lt;br /&gt;
drwxr-xr-x 2 root root 4096 Nov 28 16:28 statsuser&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@perth:/opt/git-server/keys/martin# cat adelaide &lt;br /&gt;
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDbyBYOnAoKLyNvittK+xyEt01NPnPC2XUFKz4bHeolz martin@adelaide&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Initialize repository ===&lt;br /&gt;
As root on git server:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~git&lt;br /&gt;
mkdir project.git&lt;br /&gt;
cd project.git&lt;br /&gt;
git init --bare&lt;br /&gt;
cd ..&lt;br /&gt;
chown -R git.git project.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
As developer on developer PC:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd project&lt;br /&gt;
emacs .gitignore  # include a line with &amp;quot;**/.hg&amp;quot; to exclude .hg content&lt;br /&gt;
git init&lt;br /&gt;
git add .&lt;br /&gt;
git commit -m &#039;Initial commit&#039;&lt;br /&gt;
git remote add origin git@irc-git-host:project.git&lt;br /&gt;
git push origin master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
As another user:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone git@irc-git-host:project.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Scott</name></author>
	</entry>
	<entry>
		<id>https://wiki.scott5.org/index.php?title=Git&amp;diff=1847</id>
		<title>Git</title>
		<link rel="alternate" type="text/html" href="https://wiki.scott5.org/index.php?title=Git&amp;diff=1847"/>
		<updated>2025-04-22T23:50:46Z</updated>

		<summary type="html">&lt;p&gt;Scott: /* Cheat Sheets */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Initial Setup ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git config --global user.name &amp;quot;Harry Truman&amp;quot;&lt;br /&gt;
git config --global user.email &amp;quot;harry.truman@example.com&amp;quot;&lt;br /&gt;
git config --global --list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
May need to set up SSH-key authentication for gitlab.&lt;br /&gt;
&lt;br /&gt;
== Clone Repository ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone git@gitlab.com:scottcamacmartin/my_project.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Upload Existing Code Directory as Gitlab Repository ==&lt;br /&gt;
First, creat a new project on gitlab.  Then, on the local dev machine:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone git@gitlab.com:scottcamacmartin/my_project.git&lt;br /&gt;
cd my_project&lt;br /&gt;
# then copy code into new folder my_project&lt;br /&gt;
# DELETE ANY SENSITIVE PASSWORDS, ETC&lt;br /&gt;
# also set up .gitignore file&lt;br /&gt;
git status&lt;br /&gt;
git add .&lt;br /&gt;
git commit -m &amp;quot;initial commit&amp;quot;&lt;br /&gt;
git push -u origin master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Overwrite local from repository ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git fetch --all&lt;br /&gt;
git show-branch   # to see whether branch is &amp;quot;master&amp;quot; or &amp;quot;main&amp;quot;&lt;br /&gt;
git reset --hard origin/master   # (or &amp;quot;origin/main&amp;quot; as above)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Overwrite a single file from repository ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git checkout HEAD~ &amp;lt;filename&amp;gt;&lt;br /&gt;
# or just write out a specific version for comparison&lt;br /&gt;
git show 7f7a8214befd1903260e6c6ae65d9158e4249881:rails/public/faq.html &amp;gt; faq.html.old&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Cheat Sheets ==&lt;br /&gt;
https://about.gitlab.com/images/press/git-cheat-sheet.pdf&lt;br /&gt;
&lt;br /&gt;
https://github.com/kenmueller/gitignore&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit --amend      # redo/fix the commit you just did&lt;br /&gt;
git branch              # list branches (master is default, HEAD/* represents current)&lt;br /&gt;
git branch mybranch     # create a new branch&lt;br /&gt;
git switch mybranch     # switch to new branch&lt;br /&gt;
git switch -c mybranch  # create new branch and switch to it&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Git Server ==&lt;br /&gt;
https://git-scm.com/book/en/v2/Git-on-the-Server-Setting-Up-the-Server&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/git-server/bin         # refresh-auth command&lt;br /&gt;
/opt/git-server/keys        # ssh keys&lt;br /&gt;
/opt/git-server/repos       # home directory with repos&lt;br /&gt;
/opt/git-server/repos/.ssh  # authorized_users file&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@perth:/etc# grep git /etc/passwd&lt;br /&gt;
git:x:222:222:Git Service User:/opt/git-server/repos:/usr/bin/git-shell&lt;br /&gt;
root@perth:/etc# grep git /etc/group&lt;br /&gt;
git:x:222:&lt;br /&gt;
root@perth:/etc# grep git /etc/shadow&lt;br /&gt;
git:*:17767:0:99999:7:::&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@perth:/opt/git-server/bin# cat refresh-auth &lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
GIT_SERVER_DIR=/opt/git-server&lt;br /&gt;
KEY_DIR=$GIT_SERVER_DIR/keys&lt;br /&gt;
SSH_KEY_FILE=$GIT_SERVER_DIR/repos/.ssh/authorized_keys&lt;br /&gt;
SSH_KEY_PREFIX=&amp;quot;no-pty,no-port-forwarding,no-X11-forwarding,no-agent-forwarding&amp;quot;&lt;br /&gt;
&lt;br /&gt;
find $KEY_DIR -type f -exec grep -v &#039;#&#039; {} \; | awk &#039;$1&#039; | sort -u | sed -e &amp;quot;s/^/${SSH_KEY_PREFIX} /&amp;quot; &amp;gt; $SSH_KEY_FILE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@perth:/opt/git-server/keys# ls -l&lt;br /&gt;
total 16&lt;br /&gt;
drwxr-xr-x 2 root root 4096 Nov 28 16:28 dc&lt;br /&gt;
drwxr-xr-x 2 root root 4096 Nov 30 10:18 martin&lt;br /&gt;
drwxr-xr-x 2 root root 4096 Nov 28 16:28 root&lt;br /&gt;
drwxr-xr-x 2 root root 4096 Nov 28 16:28 statsuser&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@perth:/opt/git-server/keys/martin# cat adelaide &lt;br /&gt;
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDbyBYOnAoKLyNvittK+xyEt01NPnPC2XUFKz4bHeolz martin@adelaide&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Initialize repository ===&lt;br /&gt;
As root on git server:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~git&lt;br /&gt;
mkdir project.git&lt;br /&gt;
cd project.git&lt;br /&gt;
git init --bare&lt;br /&gt;
cd ..&lt;br /&gt;
chown -R git.git project.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
As developer on developer PC:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd project&lt;br /&gt;
emacs .gitignore  # include a line with &amp;quot;**/.hg&amp;quot; to exclude .hg content&lt;br /&gt;
git init&lt;br /&gt;
git add .&lt;br /&gt;
git commit -m &#039;Initial commit&#039;&lt;br /&gt;
git remote add origin git@irc-git-host:project.git&lt;br /&gt;
git push origin master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
As another user:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone git@irc-git-host:project.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Scott</name></author>
	</entry>
	<entry>
		<id>https://wiki.scott5.org/index.php?title=Git&amp;diff=1846</id>
		<title>Git</title>
		<link rel="alternate" type="text/html" href="https://wiki.scott5.org/index.php?title=Git&amp;diff=1846"/>
		<updated>2025-04-22T23:40:34Z</updated>

		<summary type="html">&lt;p&gt;Scott: /* Cheat Sheets */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Initial Setup ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git config --global user.name &amp;quot;Harry Truman&amp;quot;&lt;br /&gt;
git config --global user.email &amp;quot;harry.truman@example.com&amp;quot;&lt;br /&gt;
git config --global --list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
May need to set up SSH-key authentication for gitlab.&lt;br /&gt;
&lt;br /&gt;
== Clone Repository ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone git@gitlab.com:scottcamacmartin/my_project.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Upload Existing Code Directory as Gitlab Repository ==&lt;br /&gt;
First, creat a new project on gitlab.  Then, on the local dev machine:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone git@gitlab.com:scottcamacmartin/my_project.git&lt;br /&gt;
cd my_project&lt;br /&gt;
# then copy code into new folder my_project&lt;br /&gt;
# DELETE ANY SENSITIVE PASSWORDS, ETC&lt;br /&gt;
# also set up .gitignore file&lt;br /&gt;
git status&lt;br /&gt;
git add .&lt;br /&gt;
git commit -m &amp;quot;initial commit&amp;quot;&lt;br /&gt;
git push -u origin master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Overwrite local from repository ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git fetch --all&lt;br /&gt;
git show-branch   # to see whether branch is &amp;quot;master&amp;quot; or &amp;quot;main&amp;quot;&lt;br /&gt;
git reset --hard origin/master   # (or &amp;quot;origin/main&amp;quot; as above)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Overwrite a single file from repository ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git checkout HEAD~ &amp;lt;filename&amp;gt;&lt;br /&gt;
# or just write out a specific version for comparison&lt;br /&gt;
git show 7f7a8214befd1903260e6c6ae65d9158e4249881:rails/public/faq.html &amp;gt; faq.html.old&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Cheat Sheets ==&lt;br /&gt;
https://about.gitlab.com/images/press/git-cheat-sheet.pdf&lt;br /&gt;
&lt;br /&gt;
https://github.com/kenmueller/gitignore&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit --amend      # redo/fix the commit you just did&lt;br /&gt;
git branch              # list branches (master is default, HEAD/* represents current)&lt;br /&gt;
git branch mybranch     # make a new branch&lt;br /&gt;
git switch mybranch     # switch to new branch&lt;br /&gt;
git switch -c mybranch  # create new branch and switch to it&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Git Server ==&lt;br /&gt;
https://git-scm.com/book/en/v2/Git-on-the-Server-Setting-Up-the-Server&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/git-server/bin         # refresh-auth command&lt;br /&gt;
/opt/git-server/keys        # ssh keys&lt;br /&gt;
/opt/git-server/repos       # home directory with repos&lt;br /&gt;
/opt/git-server/repos/.ssh  # authorized_users file&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@perth:/etc# grep git /etc/passwd&lt;br /&gt;
git:x:222:222:Git Service User:/opt/git-server/repos:/usr/bin/git-shell&lt;br /&gt;
root@perth:/etc# grep git /etc/group&lt;br /&gt;
git:x:222:&lt;br /&gt;
root@perth:/etc# grep git /etc/shadow&lt;br /&gt;
git:*:17767:0:99999:7:::&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@perth:/opt/git-server/bin# cat refresh-auth &lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
GIT_SERVER_DIR=/opt/git-server&lt;br /&gt;
KEY_DIR=$GIT_SERVER_DIR/keys&lt;br /&gt;
SSH_KEY_FILE=$GIT_SERVER_DIR/repos/.ssh/authorized_keys&lt;br /&gt;
SSH_KEY_PREFIX=&amp;quot;no-pty,no-port-forwarding,no-X11-forwarding,no-agent-forwarding&amp;quot;&lt;br /&gt;
&lt;br /&gt;
find $KEY_DIR -type f -exec grep -v &#039;#&#039; {} \; | awk &#039;$1&#039; | sort -u | sed -e &amp;quot;s/^/${SSH_KEY_PREFIX} /&amp;quot; &amp;gt; $SSH_KEY_FILE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@perth:/opt/git-server/keys# ls -l&lt;br /&gt;
total 16&lt;br /&gt;
drwxr-xr-x 2 root root 4096 Nov 28 16:28 dc&lt;br /&gt;
drwxr-xr-x 2 root root 4096 Nov 30 10:18 martin&lt;br /&gt;
drwxr-xr-x 2 root root 4096 Nov 28 16:28 root&lt;br /&gt;
drwxr-xr-x 2 root root 4096 Nov 28 16:28 statsuser&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@perth:/opt/git-server/keys/martin# cat adelaide &lt;br /&gt;
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDbyBYOnAoKLyNvittK+xyEt01NPnPC2XUFKz4bHeolz martin@adelaide&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Initialize repository ===&lt;br /&gt;
As root on git server:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~git&lt;br /&gt;
mkdir project.git&lt;br /&gt;
cd project.git&lt;br /&gt;
git init --bare&lt;br /&gt;
cd ..&lt;br /&gt;
chown -R git.git project.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
As developer on developer PC:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd project&lt;br /&gt;
emacs .gitignore  # include a line with &amp;quot;**/.hg&amp;quot; to exclude .hg content&lt;br /&gt;
git init&lt;br /&gt;
git add .&lt;br /&gt;
git commit -m &#039;Initial commit&#039;&lt;br /&gt;
git remote add origin git@irc-git-host:project.git&lt;br /&gt;
git push origin master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
As another user:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone git@irc-git-host:project.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Scott</name></author>
	</entry>
	<entry>
		<id>https://wiki.scott5.org/index.php?title=Git&amp;diff=1845</id>
		<title>Git</title>
		<link rel="alternate" type="text/html" href="https://wiki.scott5.org/index.php?title=Git&amp;diff=1845"/>
		<updated>2025-04-18T22:54:36Z</updated>

		<summary type="html">&lt;p&gt;Scott: /* Cheat Sheets */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Initial Setup ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git config --global user.name &amp;quot;Harry Truman&amp;quot;&lt;br /&gt;
git config --global user.email &amp;quot;harry.truman@example.com&amp;quot;&lt;br /&gt;
git config --global --list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
May need to set up SSH-key authentication for gitlab.&lt;br /&gt;
&lt;br /&gt;
== Clone Repository ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone git@gitlab.com:scottcamacmartin/my_project.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Upload Existing Code Directory as Gitlab Repository ==&lt;br /&gt;
First, creat a new project on gitlab.  Then, on the local dev machine:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone git@gitlab.com:scottcamacmartin/my_project.git&lt;br /&gt;
cd my_project&lt;br /&gt;
# then copy code into new folder my_project&lt;br /&gt;
# DELETE ANY SENSITIVE PASSWORDS, ETC&lt;br /&gt;
# also set up .gitignore file&lt;br /&gt;
git status&lt;br /&gt;
git add .&lt;br /&gt;
git commit -m &amp;quot;initial commit&amp;quot;&lt;br /&gt;
git push -u origin master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Overwrite local from repository ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git fetch --all&lt;br /&gt;
git show-branch   # to see whether branch is &amp;quot;master&amp;quot; or &amp;quot;main&amp;quot;&lt;br /&gt;
git reset --hard origin/master   # (or &amp;quot;origin/main&amp;quot; as above)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Overwrite a single file from repository ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git checkout HEAD~ &amp;lt;filename&amp;gt;&lt;br /&gt;
# or just write out a specific version for comparison&lt;br /&gt;
git show 7f7a8214befd1903260e6c6ae65d9158e4249881:rails/public/faq.html &amp;gt; faq.html.old&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Cheat Sheets ==&lt;br /&gt;
https://about.gitlab.com/images/press/git-cheat-sheet.pdf&lt;br /&gt;
&lt;br /&gt;
https://github.com/kenmueller/gitignore&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit --amend  # redo/fix the commit you just did&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Git Server ==&lt;br /&gt;
https://git-scm.com/book/en/v2/Git-on-the-Server-Setting-Up-the-Server&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/git-server/bin         # refresh-auth command&lt;br /&gt;
/opt/git-server/keys        # ssh keys&lt;br /&gt;
/opt/git-server/repos       # home directory with repos&lt;br /&gt;
/opt/git-server/repos/.ssh  # authorized_users file&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@perth:/etc# grep git /etc/passwd&lt;br /&gt;
git:x:222:222:Git Service User:/opt/git-server/repos:/usr/bin/git-shell&lt;br /&gt;
root@perth:/etc# grep git /etc/group&lt;br /&gt;
git:x:222:&lt;br /&gt;
root@perth:/etc# grep git /etc/shadow&lt;br /&gt;
git:*:17767:0:99999:7:::&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@perth:/opt/git-server/bin# cat refresh-auth &lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
GIT_SERVER_DIR=/opt/git-server&lt;br /&gt;
KEY_DIR=$GIT_SERVER_DIR/keys&lt;br /&gt;
SSH_KEY_FILE=$GIT_SERVER_DIR/repos/.ssh/authorized_keys&lt;br /&gt;
SSH_KEY_PREFIX=&amp;quot;no-pty,no-port-forwarding,no-X11-forwarding,no-agent-forwarding&amp;quot;&lt;br /&gt;
&lt;br /&gt;
find $KEY_DIR -type f -exec grep -v &#039;#&#039; {} \; | awk &#039;$1&#039; | sort -u | sed -e &amp;quot;s/^/${SSH_KEY_PREFIX} /&amp;quot; &amp;gt; $SSH_KEY_FILE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@perth:/opt/git-server/keys# ls -l&lt;br /&gt;
total 16&lt;br /&gt;
drwxr-xr-x 2 root root 4096 Nov 28 16:28 dc&lt;br /&gt;
drwxr-xr-x 2 root root 4096 Nov 30 10:18 martin&lt;br /&gt;
drwxr-xr-x 2 root root 4096 Nov 28 16:28 root&lt;br /&gt;
drwxr-xr-x 2 root root 4096 Nov 28 16:28 statsuser&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@perth:/opt/git-server/keys/martin# cat adelaide &lt;br /&gt;
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDbyBYOnAoKLyNvittK+xyEt01NPnPC2XUFKz4bHeolz martin@adelaide&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Initialize repository ===&lt;br /&gt;
As root on git server:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~git&lt;br /&gt;
mkdir project.git&lt;br /&gt;
cd project.git&lt;br /&gt;
git init --bare&lt;br /&gt;
cd ..&lt;br /&gt;
chown -R git.git project.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
As developer on developer PC:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd project&lt;br /&gt;
emacs .gitignore  # include a line with &amp;quot;**/.hg&amp;quot; to exclude .hg content&lt;br /&gt;
git init&lt;br /&gt;
git add .&lt;br /&gt;
git commit -m &#039;Initial commit&#039;&lt;br /&gt;
git remote add origin git@irc-git-host:project.git&lt;br /&gt;
git push origin master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
As another user:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone git@irc-git-host:project.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Scott</name></author>
	</entry>
	<entry>
		<id>https://wiki.scott5.org/index.php?title=Git&amp;diff=1844</id>
		<title>Git</title>
		<link rel="alternate" type="text/html" href="https://wiki.scott5.org/index.php?title=Git&amp;diff=1844"/>
		<updated>2025-01-01T23:01:18Z</updated>

		<summary type="html">&lt;p&gt;Scott: /* Overwrite local from repository */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Initial Setup ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git config --global user.name &amp;quot;Harry Truman&amp;quot;&lt;br /&gt;
git config --global user.email &amp;quot;harry.truman@example.com&amp;quot;&lt;br /&gt;
git config --global --list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
May need to set up SSH-key authentication for gitlab.&lt;br /&gt;
&lt;br /&gt;
== Clone Repository ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone git@gitlab.com:scottcamacmartin/my_project.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Upload Existing Code Directory as Gitlab Repository ==&lt;br /&gt;
First, creat a new project on gitlab.  Then, on the local dev machine:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone git@gitlab.com:scottcamacmartin/my_project.git&lt;br /&gt;
cd my_project&lt;br /&gt;
# then copy code into new folder my_project&lt;br /&gt;
# DELETE ANY SENSITIVE PASSWORDS, ETC&lt;br /&gt;
# also set up .gitignore file&lt;br /&gt;
git status&lt;br /&gt;
git add .&lt;br /&gt;
git commit -m &amp;quot;initial commit&amp;quot;&lt;br /&gt;
git push -u origin master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Overwrite local from repository ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git fetch --all&lt;br /&gt;
git show-branch   # to see whether branch is &amp;quot;master&amp;quot; or &amp;quot;main&amp;quot;&lt;br /&gt;
git reset --hard origin/master   # (or &amp;quot;origin/main&amp;quot; as above)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Overwrite a single file from repository ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git checkout HEAD~ &amp;lt;filename&amp;gt;&lt;br /&gt;
# or just write out a specific version for comparison&lt;br /&gt;
git show 7f7a8214befd1903260e6c6ae65d9158e4249881:rails/public/faq.html &amp;gt; faq.html.old&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Cheat Sheets ==&lt;br /&gt;
https://about.gitlab.com/images/press/git-cheat-sheet.pdf&lt;br /&gt;
&lt;br /&gt;
https://github.com/kenmueller/gitignore&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Git Server ==&lt;br /&gt;
https://git-scm.com/book/en/v2/Git-on-the-Server-Setting-Up-the-Server&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/git-server/bin         # refresh-auth command&lt;br /&gt;
/opt/git-server/keys        # ssh keys&lt;br /&gt;
/opt/git-server/repos       # home directory with repos&lt;br /&gt;
/opt/git-server/repos/.ssh  # authorized_users file&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@perth:/etc# grep git /etc/passwd&lt;br /&gt;
git:x:222:222:Git Service User:/opt/git-server/repos:/usr/bin/git-shell&lt;br /&gt;
root@perth:/etc# grep git /etc/group&lt;br /&gt;
git:x:222:&lt;br /&gt;
root@perth:/etc# grep git /etc/shadow&lt;br /&gt;
git:*:17767:0:99999:7:::&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@perth:/opt/git-server/bin# cat refresh-auth &lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
GIT_SERVER_DIR=/opt/git-server&lt;br /&gt;
KEY_DIR=$GIT_SERVER_DIR/keys&lt;br /&gt;
SSH_KEY_FILE=$GIT_SERVER_DIR/repos/.ssh/authorized_keys&lt;br /&gt;
SSH_KEY_PREFIX=&amp;quot;no-pty,no-port-forwarding,no-X11-forwarding,no-agent-forwarding&amp;quot;&lt;br /&gt;
&lt;br /&gt;
find $KEY_DIR -type f -exec grep -v &#039;#&#039; {} \; | awk &#039;$1&#039; | sort -u | sed -e &amp;quot;s/^/${SSH_KEY_PREFIX} /&amp;quot; &amp;gt; $SSH_KEY_FILE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@perth:/opt/git-server/keys# ls -l&lt;br /&gt;
total 16&lt;br /&gt;
drwxr-xr-x 2 root root 4096 Nov 28 16:28 dc&lt;br /&gt;
drwxr-xr-x 2 root root 4096 Nov 30 10:18 martin&lt;br /&gt;
drwxr-xr-x 2 root root 4096 Nov 28 16:28 root&lt;br /&gt;
drwxr-xr-x 2 root root 4096 Nov 28 16:28 statsuser&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@perth:/opt/git-server/keys/martin# cat adelaide &lt;br /&gt;
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDbyBYOnAoKLyNvittK+xyEt01NPnPC2XUFKz4bHeolz martin@adelaide&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Initialize repository ===&lt;br /&gt;
As root on git server:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~git&lt;br /&gt;
mkdir project.git&lt;br /&gt;
cd project.git&lt;br /&gt;
git init --bare&lt;br /&gt;
cd ..&lt;br /&gt;
chown -R git.git project.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
As developer on developer PC:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd project&lt;br /&gt;
emacs .gitignore  # include a line with &amp;quot;**/.hg&amp;quot; to exclude .hg content&lt;br /&gt;
git init&lt;br /&gt;
git add .&lt;br /&gt;
git commit -m &#039;Initial commit&#039;&lt;br /&gt;
git remote add origin git@irc-git-host:project.git&lt;br /&gt;
git push origin master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
As another user:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone git@irc-git-host:project.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Scott</name></author>
	</entry>
	<entry>
		<id>https://wiki.scott5.org/index.php?title=Sublime_Text&amp;diff=1843</id>
		<title>Sublime Text</title>
		<link rel="alternate" type="text/html" href="https://wiki.scott5.org/index.php?title=Sublime_Text&amp;diff=1843"/>
		<updated>2024-11-12T18:24:12Z</updated>

		<summary type="html">&lt;p&gt;Scott: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Settings on Mac, Nov 2024:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;font_size&amp;quot;: 16,&lt;br /&gt;
	&amp;quot;ignored_packages&amp;quot;: [&amp;quot;Vintage&amp;quot;,&lt;br /&gt;
	],&lt;br /&gt;
	&amp;quot;hot_exit&amp;quot;: &amp;quot;only_on_quit&amp;quot;,&lt;br /&gt;
	&amp;quot;trim_trailing_white_space_on_save&amp;quot;: &amp;quot;all&amp;quot;,&lt;br /&gt;
	&amp;quot;ensure_newline_at_eof_on_save&amp;quot;: true,&lt;br /&gt;
	&amp;quot;word_wrap&amp;quot;: true,&lt;br /&gt;
	&amp;quot;index_files&amp;quot;: true,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Old ==&lt;br /&gt;
http://www.sublimetext.com/docs/3/index.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Moving around ==&lt;br /&gt;
&lt;br /&gt;
=== Moving the cursor ===&lt;br /&gt;
* to beginning/end of current word: Ctrl-left/Ctrl-right&lt;br /&gt;
&lt;br /&gt;
=== Moving the view ===&lt;br /&gt;
* up/down: Ctrl-up/Ctrl-down&lt;br /&gt;
&lt;br /&gt;
=== Incremental Search ===&lt;br /&gt;
* Ctrl-I&lt;br /&gt;
&lt;br /&gt;
=== Go to Anything ===&lt;br /&gt;
* Go to File (in project): Ctrl-P, type to fuzzy-search&lt;br /&gt;
* Go to Method (Code Outline): Ctrl-R to show code outline, type to fuzzy-search&lt;br /&gt;
* Go to Method in File: Ctrl-P, search for file, type &amp;quot;@&amp;quot;, then search for method&lt;br /&gt;
* Go to Line: Ctrl-G  (or Ctrl-P, type &amp;quot;:&amp;quot;), then line number&lt;br /&gt;
&lt;br /&gt;
== Selecting ==&lt;br /&gt;
&lt;br /&gt;
=== Column Select ===&lt;br /&gt;
* Shift + right-click + drag&lt;br /&gt;
&lt;br /&gt;
=== Select instances of a word (multiple cursors) ===&lt;br /&gt;
* Ctrl-D to select current and next instances of word&lt;br /&gt;
* Ctrl-U to undo last&lt;br /&gt;
* Alt+F3 to select all occurrences&lt;br /&gt;
&lt;br /&gt;
== Tools ==&lt;br /&gt;
* Command Pallette: Ctrl+Shift+P, type to fuzzy-search&lt;br /&gt;
* Code Outline: Ctrl+R&lt;br /&gt;
&lt;br /&gt;
== Projects ==&lt;br /&gt;
http://www.sublimetext.com/docs/3/projects.html&lt;br /&gt;
&lt;br /&gt;
Assume you&#039;ve got a folder full of code called &amp;lt;code&amp;gt;myproject&amp;lt;/code&amp;gt;.  Go to &#039;&#039;&#039;Project -&amp;gt; Save Project As...&#039;&#039;&#039; and save the project just inside that folder.  This will create &amp;lt;code&amp;gt;myproject.sublime-project&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;myproject.sublime-workspace&amp;lt;/code&amp;gt; files.&lt;br /&gt;
As a general rule, the &amp;lt;code&amp;gt;sublime-project&amp;lt;/code&amp;gt; file would be checked into version control, while the &amp;lt;code&amp;gt;sublime-workspace&amp;lt;/code&amp;gt; file would not.&lt;br /&gt;
&lt;br /&gt;
Add subfolders to the project with &#039;&#039;&#039;Project -&amp;gt; Add Folder to Project...&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Package Control ==&lt;br /&gt;
Must install Package Control manually:&lt;br /&gt;
https://sublime.wbond.net/installation&lt;br /&gt;
&lt;br /&gt;
Then install the packages you want:&lt;br /&gt;
&#039;&#039;Ctrl+Shift+P install ...&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Customizing ==&lt;br /&gt;
* Open Default Settings (Preferences -&amp;gt; Settings -- Default) to find and copy the relevant setting.&lt;br /&gt;
* Open User Settings (Preferences -&amp;gt; Settings -- User) and paste in the line you want with the appropriate change.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;color_scheme&amp;quot;: &amp;quot;Packages/Color Scheme - Default/Solarized (Light).tmTheme&amp;quot;,&lt;br /&gt;
	&amp;quot;font_size&amp;quot;: 11,&lt;br /&gt;
	&amp;quot;ignored_packages&amp;quot;:&lt;br /&gt;
	[&lt;br /&gt;
		&amp;quot;Vintage&amp;quot;&lt;br /&gt;
	],&lt;br /&gt;
	&amp;quot;word_wrap&amp;quot;: true,&lt;br /&gt;
	&amp;quot;hot_exit&amp;quot; : false&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Copying your settings to another machine ==&lt;br /&gt;
All of the settings for Sublime Text live in &amp;lt;code&amp;gt;~/.config/sublime-text-3&amp;lt;/code&amp;gt; on Ubuntu.&lt;/div&gt;</summary>
		<author><name>Scott</name></author>
	</entry>
	<entry>
		<id>https://wiki.scott5.org/index.php?title=Pipenv&amp;diff=1842</id>
		<title>Pipenv</title>
		<link rel="alternate" type="text/html" href="https://wiki.scott5.org/index.php?title=Pipenv&amp;diff=1842"/>
		<updated>2024-11-06T20:18:11Z</updated>

		<summary type="html">&lt;p&gt;Scott: /* Install */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Install ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install python-is-python3 python3-pip python3-pkgconfig pipenv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Create Project ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir -p new_project/app; cd new_project/app&lt;br /&gt;
pipenv install Flask  # creates Pipfile, Pipfile.lock&lt;br /&gt;
...add some flask code...&lt;br /&gt;
pipenv run python app/main.py  # to start testing the app&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To run in Docker, add this to the Dockerfile:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pipenv install --deploy --system&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Update Python Packages ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pipenv update&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Scott</name></author>
	</entry>
	<entry>
		<id>https://wiki.scott5.org/index.php?title=Mysql&amp;diff=1841</id>
		<title>Mysql</title>
		<link rel="alternate" type="text/html" href="https://wiki.scott5.org/index.php?title=Mysql&amp;diff=1841"/>
		<updated>2024-11-05T22:12:51Z</updated>

		<summary type="html">&lt;p&gt;Scott: /* Searching on three-character words */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Ubuntu setup ==&lt;br /&gt;
Have a &amp;lt;code&amp;gt;mysql&amp;lt;/code&amp;gt; root password ready to go.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install mysql-server mysql-client libmysqlclient-dev&lt;br /&gt;
apt install python3-mysqldb  # if using python to access mysql&lt;br /&gt;
mysql_secure_installation&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ERROR in UBUNTU 22.04 solved here:&lt;br /&gt;
https://www.nixcraft.com/t/mysql-failed-error-set-password-has-no-significance-for-user-root-localhost-as-the-authentication-method-used-doesnt-store-authentication-data-in-the-mysql-server-please-consider-using-alter-user/4233&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ALTER USER &#039;root&#039;@&#039;localhost&#039; IDENTIFIED WITH mysql_native_password BY &#039;SetRootPasswordHere&#039;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Log in as root to mysql database&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mysql -u root -p mysql&lt;br /&gt;
select * from user;&lt;br /&gt;
delete from user where host = &#039;myserver&#039;;  # not needed if secure installation completed above&lt;br /&gt;
create user barney@localhost identified by &#039;xxxxxxxx&#039;;&lt;br /&gt;
create database bookstore;&lt;br /&gt;
grant all privileges on bookstore.* to barney@localhost;  # regular account&lt;br /&gt;
grant select on bookstore.* to barney@localhost;          # read-only account&lt;br /&gt;
grant lock tables on bookstore.* to barney@localhost;     # need lock tables to run mysqldump&lt;br /&gt;
grant file on *.* to barney@localhost;                    # write output to files&lt;br /&gt;
flush privileges;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Show Permissions ==&lt;br /&gt;
Logged in as root:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
show grants for barney@localhost;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==File I/O==&lt;br /&gt;
You should have already granted &amp;quot;file&amp;quot; privileges to user:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
grant file on *.* to barney@localhost;&lt;br /&gt;
flush privileges;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To execute SQL commands in a text file (from the command line):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mysql -u barney -p bookstore &amp;lt; mycommands.sql&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To execute SQL commands in a text file (from the mysql prompt):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mysql&amp;gt; use bookstore;&lt;br /&gt;
mysql&amp;gt; source /home/barney/sql/mycommands.sql;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To read data out to a file (NOTE: The &amp;lt;code&amp;gt;mysql&amp;lt;/code&amp;gt; user can only write to the &amp;lt;code&amp;gt;/var/lib/mysql-files/&amp;lt;/code&amp;gt; directory): &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
select ... into outfile &amp;quot;/var/lib/mysql-files/goodbooks.txt&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To load a file into a table:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
load data local infile &amp;quot;/home/barney/sql/goodbooks.txt&amp;quot; into table books;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Save into a CSV file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
select * from users into outfile &#039;/tmp/users.csv&#039; fields terminated by &#039;,&#039; &lt;br /&gt;
    optionally enclosed by &#039;&amp;quot;&#039; lines terminated by &#039;\n&#039;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Backing up and restoring a database ==&lt;br /&gt;
To back up the database &amp;quot;bookstore&amp;quot; to a file sq5.sql:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
export MYSQL_PWD=XXXXX&lt;br /&gt;
mysqldump --no-tablespaces --opt bookstore &amp;gt; bookstore.sql&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
To restore a database from backup (overwrites any existing):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mysql -u root -p bookstore &amp;lt; bookstore.sql&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Searching on three-character words ==&lt;br /&gt;
* Edit &amp;lt;code&amp;gt;/etc/mysql/mysql.cnf&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;/etc/mysql/mysql.conf.d/mysqld.cnf&amp;lt;/code&amp;gt; to add this line to the &amp;lt;code&amp;gt;[mysqld]&amp;lt;/code&amp;gt; section (create section if it doesn&#039;t exist): &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[mysqld]&lt;br /&gt;
ft_min_word_len=3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Restart mysql. &lt;br /&gt;
* For each table you are doing a fulltext search on, run this command: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
repair table &amp;lt;table_name&amp;gt; quick;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Restart mysql and any dependent apps.&lt;br /&gt;
&lt;br /&gt;
== Create database/table example ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
drop database if exists edapt_quiz;&lt;br /&gt;
create database edapt_quiz;&lt;br /&gt;
use edapt_quiz;&lt;br /&gt;
&lt;br /&gt;
drop table if exists quizzes;&lt;br /&gt;
create table quizzes (&lt;br /&gt;
    id              int unsigned not null auto_increment,&lt;br /&gt;
    name            varchar(64) not null,&lt;br /&gt;
    primary key (id)&lt;br /&gt;
) engine=innodb;&lt;br /&gt;
insert into quizzes (name) values (&#039;Prodromal Questionnaire – Brief Version&#039;);&lt;br /&gt;
&lt;br /&gt;
drop table if exists questions;&lt;br /&gt;
create table questions (&lt;br /&gt;
    id              int unsigned not null auto_increment,&lt;br /&gt;
    quiz_id         int unsigned not null,&lt;br /&gt;
    sort_order      smallint,&lt;br /&gt;
    text            text,&lt;br /&gt;
    primary key (id),&lt;br /&gt;
    foreign key (quiz_id) references quizzes(id)&lt;br /&gt;
) engine=innodb;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
When attempting to load a database from a mysqldump backup, you get&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;ERROR 1227 (42000) at line 81: Access denied; you need (at least one of) the SUPER privilege(s) for this operation&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
You need to remove all DEFINER lines from the mysqldump file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sed &#039;s/DEFINER=[^*]*\*/\*/g&#039; backup.sql &amp;gt; new_backup.sql&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Scott</name></author>
	</entry>
	<entry>
		<id>https://wiki.scott5.org/index.php?title=IPhone&amp;diff=1840</id>
		<title>IPhone</title>
		<link rel="alternate" type="text/html" href="https://wiki.scott5.org/index.php?title=IPhone&amp;diff=1840"/>
		<updated>2024-10-25T22:31:41Z</updated>

		<summary type="html">&lt;p&gt;Scott: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{lowercase title}}&lt;br /&gt;
==Facts==&lt;br /&gt;
* iPhone Resolution: 320x480&lt;br /&gt;
* top status bar is 20px, bottom tab bar is 44px&lt;br /&gt;
* All images should be png&lt;br /&gt;
&lt;br /&gt;
==Basic Setup==&lt;br /&gt;
* Start by launching &amp;lt;code&amp;gt;/Developer/Applications/Xcode&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;File -&amp;gt; New Project -&amp;gt; View-Based Application&amp;lt;/code&amp;gt;, choose name (e.g. &amp;lt;code&amp;gt;MyProject&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Edit Objective-C code in &amp;lt;code&amp;gt;Groups &amp;amp; FIles -&amp;gt; Classes&amp;lt;/code&amp;gt; with Xcode&lt;br /&gt;
* Edit user interface with &amp;lt;code&amp;gt;Groups &amp;amp; Files -&amp;gt; Resources -&amp;gt; MyProjectViewController.xib&amp;lt;/code&amp;gt; with Interface Builder.  Drag elements from the Library window to the View window.&lt;br /&gt;
* Click Build and Run in Xcode to test.&lt;br /&gt;
&lt;br /&gt;
==Application Icon==&lt;br /&gt;
# Create a 57x57 png file&lt;br /&gt;
# Drag from Finder to Xcode &amp;lt;code&amp;gt;Resources&amp;lt;/code&amp;gt; folder&lt;br /&gt;
# Choose &amp;quot;&amp;lt;code&amp;gt;Copy&amp;lt;/code&amp;gt;&amp;quot; to create a copy in the project directory&lt;br /&gt;
# Click the &amp;lt;code&amp;gt;Resources -&amp;gt; Info.plist&amp;lt;/code&amp;gt; file&lt;br /&gt;
# Next to &amp;quot;&amp;lt;code&amp;gt;Icon File&amp;lt;/code&amp;gt;&amp;quot;, enter the name of the png.&lt;br /&gt;
&lt;br /&gt;
==Interface Builder hints==&lt;br /&gt;
* The MyProjectViewController.xib window has three &amp;quot;View Mode&amp;quot; buttons.  Use the middle one to drill down and select overlapped or hidden View elements.&lt;br /&gt;
* When a View element is selected, double click it or use Command-1 to edit attributes. (Command is the clover-shaped button)&lt;br /&gt;
* Hold the Option key when mousing over View elements to see more properties.&lt;br /&gt;
* If you have an existing element in the View that you want to duplicate, Option-drag it to get a copy.&lt;br /&gt;
&lt;br /&gt;
==Outlet==&lt;br /&gt;
* Communicate from code to view with an IBOutlet.  In header file:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;objc&amp;quot;&amp;gt;&lt;br /&gt;
IBOutlet UILabel *statusText;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* An outlet must be defined in the header file before it can be accessed in Interface Builder.&lt;br /&gt;
* Control-drag from File&#039;s Owner to the element and choose the corresponding outlet.&lt;br /&gt;
&lt;br /&gt;
==Action==&lt;br /&gt;
* Communicate from view to code with an IBAction.  In header file:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;objc&amp;quot;&amp;gt;&lt;br /&gt;
- (IBAction)doSomething:(id)sender;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* Select element and bring up connections inspector (Tools-&amp;gt;Connections or Command-2). &lt;br /&gt;
* Choose the desired event by clicking the circle to the left of it. &lt;br /&gt;
* Drag circle to File&#039;s Owner and select the desired action.&lt;br /&gt;
&lt;br /&gt;
==Basic Interaction Sample App==&lt;br /&gt;
MyProjectViewController.h:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;objc&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;UIKit/UIKit.h&amp;gt;&lt;br /&gt;
@interface MyProjectViewController : UIViewController {&lt;br /&gt;
    IBOutlet UILabel *statusText;&lt;br /&gt;
}&lt;br /&gt;
@property (retain, nonatomic) UILabel *statusText;&lt;br /&gt;
-(IBAction)buttonPressed:(id)sender;&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MyProjectViewController.m:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;objc&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;quot;MyProjectViewController.h&amp;quot;&lt;br /&gt;
@implementation MyProjectViewController&lt;br /&gt;
@synthesize statusText;&lt;br /&gt;
-(IBAction)buttonPressed:(id)sender {&lt;br /&gt;
    NSString *title = [sender titleForState:UIControlStateNormal];&lt;br /&gt;
    NSString *newText = [[NSString alloc] initWithFormat: @&amp;quot;%@ button pressed.&amp;quot;, title];&lt;br /&gt;
    statusText.text = newText;&lt;br /&gt;
    [newText release];&lt;br /&gt;
}&lt;br /&gt;
...boilerplate...&lt;br /&gt;
-(void)dealloc {&lt;br /&gt;
    [statusText release];&lt;br /&gt;
    [super dealloc];&lt;br /&gt;
}&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
======View:======&lt;br /&gt;
&lt;br /&gt;
# Double-click MyProjectViewController.xib in the Resources directory.&lt;br /&gt;
# Create a Label with no text and two RoundRect buttons named &amp;quot;Left&amp;quot; and &amp;quot;Right&amp;quot;.&lt;br /&gt;
# Control-click on &amp;quot;File&#039;s Owner&amp;quot; in the xib window and drag it to the Label object in the view window. Let go of the mouse button and choose &amp;quot;statusText&amp;quot; from the Outlets popup menu.&lt;br /&gt;
# Select the Left button by clicking it; then open the Connection Inspector from Tools menu.&lt;br /&gt;
# Find Events -&amp;gt; TouchUpInside&lt;br /&gt;
# Click the circle next to TouchUpInside and drag to the &amp;quot;File&#039;s Owner&amp;quot; icon.  Select &amp;quot;buttonPressed&amp;quot; from the popup menu.&lt;br /&gt;
# Do the same for the Right button.&lt;br /&gt;
# Build and Run&lt;br /&gt;
&lt;br /&gt;
==User Interface Elements==&lt;br /&gt;
&lt;br /&gt;
======Label======&lt;br /&gt;
&lt;br /&gt;
Has a &amp;quot;text&amp;quot; attribute that you can change with an outlet.  See the example above.&lt;br /&gt;
&lt;br /&gt;
======Image======&lt;br /&gt;
&lt;br /&gt;
# Drag a png file from Finder to the Resources folder in Xcode to import the image.&lt;br /&gt;
# Drag an ImageView element into the View&lt;br /&gt;
# Open attributes and tell it which png file to use&lt;br /&gt;
# Select &amp;quot;Size to Fit&amp;quot; from the Layout menu so the ImageView object is the same size as the imported image.&lt;br /&gt;
# Choose Drawing-&amp;gt;Opaque to speed up drawing if there is no background&lt;br /&gt;
&lt;br /&gt;
======Text field======&lt;br /&gt;
In MyProjectViewController.h:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;objc&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;UIKit/UIKit.h&amp;gt;&lt;br /&gt;
@interface MyProjectViewController : UIViewController {&lt;br /&gt;
    IBOutlet UITextField *nameField;&lt;br /&gt;
}&lt;br /&gt;
@property (nonatomic, retain) UITextField *nameField;&lt;br /&gt;
- (IBAction)textFieldDoneEditing:(id)sender;  // make sure the text field gives up control when done editing&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In MyProjectViewController.m:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;objc&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
@implementation MyProjectViewController&lt;br /&gt;
@synthesize nameField;&lt;br /&gt;
- (IBAction)textFieldDoneEditing:(id)sender {  // make sure the text field gives up control when done editing&lt;br /&gt;
    [sender resignFirstResponder];&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In Interface Builder&lt;br /&gt;
&lt;br /&gt;
Outlet: Control-drag from File&#039;s Owner to the text field and choose the corresponding outlet.&lt;br /&gt;
&lt;br /&gt;
Action: Select text field and bring up connections inspector.  Choose the &amp;quot;Did End on Exit&amp;quot; event.  Drag circle to File&#039;s Owner and select &amp;quot;textFieldDoneEditing&amp;quot; action.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
======Number field======&lt;br /&gt;
&lt;br /&gt;
Same as text field but you need a background click action to allow the user to leave the field when done editing.  Add the method declaration to both header and implementation file.  Here is the implementation:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;objc&amp;quot;&amp;gt;&lt;br /&gt;
- (IBAction)backgroundClick:(id)sender {&lt;br /&gt;
	[numberField resignFirstResponder];&lt;br /&gt;
	// add the same for any other edit fields that should lose focus&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
View:&lt;br /&gt;
# Use a Round Rect Button in the view and drag its edges to cover the entire screen. &lt;br /&gt;
# Use Layout-&amp;gt;Send to Back to put it behind everything else. &lt;br /&gt;
# Then change its Type to Custom to make it disappear altogether.&lt;br /&gt;
# Tie the Touch Up Inside event to File&#039;s Owner backgroundClick action.&lt;br /&gt;
&lt;br /&gt;
======Slider======&lt;br /&gt;
Use the &amp;quot;Value Changed&amp;quot; event to call the sliderChanged action.  Access slider value with slider.value.  Sample code:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;objc&amp;quot;&amp;gt;&lt;br /&gt;
-(IBAction)sliderChanged:(id)sender {&lt;br /&gt;
	UISlider *slider = (UISlider *)sender;&lt;br /&gt;
	int progressAsInt = (int)(slider.value + 0.5f);&lt;br /&gt;
	NSString *newText = [[NSString alloc] initWithFormat:@&amp;quot;%d&amp;quot;, progressAsInt];&lt;br /&gt;
	sliderLabel.text = newText;&lt;br /&gt;
	[newText release];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Switch======&lt;br /&gt;
Get value from &amp;lt;code&amp;gt;switch.isOn&amp;lt;/code&amp;gt;.  Use &amp;quot;Value Changed&amp;quot; event.&lt;br /&gt;
&lt;br /&gt;
======Segmented Control======&lt;br /&gt;
Get value from &amp;lt;code&amp;gt;segmentedControl.selectedSegmentIndex&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======SubView======&lt;br /&gt;
Group elements inside a sub view.  Hide all with &amp;lt;code&amp;gt;subview.hidden = YES&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Action Sheet======&lt;br /&gt;
Modal dialog to force the user to choose an option.  Use UIActionSheetDelegate protocol:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;objc&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
@interface MyProjectViewController : UIViewController &amp;lt;UIActionSheetDelegate&amp;gt; {&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create an Action Sheet in an action method:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;objc&amp;quot;&amp;gt;&lt;br /&gt;
UIActionSheet *actionSheet = [[UIActionSheet alloc]&lt;br /&gt;
	initWithTitle:@&amp;quot;Are you sure?&amp;quot;&lt;br /&gt;
	delegate:self&lt;br /&gt;
	cancelButtonTitle:@&amp;quot;No way!&amp;quot;&lt;br /&gt;
	destructiveButtonTitle:@&amp;quot;Yes, I&#039;m sure!&amp;quot;&lt;br /&gt;
	otherButtonTitles:nil];&lt;br /&gt;
[actionSheet showInView:self.view];&lt;br /&gt;
[actionSheet release];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Handle the action sheet response with this method:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;objc&amp;quot;&amp;gt;&lt;br /&gt;
-(void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex {&lt;br /&gt;
	if (buttonIndex == [actionSheet cancelButtonIndex] { /* do cancel action, if any */ }&lt;br /&gt;
	else { /* do destructive (positive) action */}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Custom Button======&lt;br /&gt;
To get nicer looking buttons, create a Round Rect button and then change its type to Custom.  Download a nice looking button template from the web:&lt;br /&gt;
&lt;br /&gt;
http://developer.apple.com/iphone/library/samplecode/UICatalog/index.html&lt;br /&gt;
&lt;br /&gt;
Then implement the viewDidLoad method of UIViewController:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;objc&amp;quot;&amp;gt;&lt;br /&gt;
-(void)viewDidLoad {&lt;br /&gt;
	jmUIImage *buttonImage = [UIImage imageNamed:@&amp;quot;whiteButton.png&amp;quot;];&lt;br /&gt;
	UIIMage *stretchableButtonImage = [buttonImage stretchableImageWithLeftCapWidth:12 topCapHeight:0];&lt;br /&gt;
	[doSomethingButton setBackgroundImage:stretchableButtonImage forState:UIControlStateNormal];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Can also make the button change when pressed by using a different background image for state &amp;lt;code&amp;gt;UIControlStateHighlighted&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Autorotation==&lt;br /&gt;
Controlled from the&lt;br /&gt;
&amp;lt;source lang=&amp;quot;objc&amp;quot;&amp;gt;&lt;br /&gt;
-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {&lt;br /&gt;
    return (interfaceOrientation == UIInterfaceOrientationPortrait);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Available orientations:&lt;br /&gt;
* UIInterfaceOrientationPortrait&lt;br /&gt;
* UIInterfaceOrientationPortraitUpsideDown&lt;br /&gt;
* UIInterfaceOrientationLandscapeLeft&lt;br /&gt;
* UIInterfaceOrientationLandscapeRight&lt;br /&gt;
&lt;br /&gt;
There are three different approaches to autorotation:&lt;br /&gt;
&lt;br /&gt;
=====Autosize=====&lt;br /&gt;
Give elements autosize properties using the size inspector (command-3).&lt;br /&gt;
&lt;br /&gt;
=====Restructure=====&lt;br /&gt;
Create outlets for each element; then call something like &amp;lt;code&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;objc&amp;quot;&amp;gt;&lt;br /&gt;
element.frame = CGRectMake(x1, y1, width, height)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
to resize/relocate each on rotation in the&lt;br /&gt;
&amp;lt;source lang=&amp;quot;objc&amp;quot;&amp;gt;&lt;br /&gt;
-(void)willAnimateSecondHalfOfRotationFromInterfaceOrientation&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
method using self.interfaceOrientation as the &amp;quot;to&amp;quot; orientation.&lt;br /&gt;
&lt;br /&gt;
======Animating a rotation======&lt;br /&gt;
&amp;lt;source lang=&amp;quot;objc&amp;quot;&amp;gt;&lt;br /&gt;
[UIView beginAnimations:@&amp;quot;move buttons&amp;quot; context:nil];&lt;br /&gt;
... CGRectMake calls to move stuff around ...&lt;br /&gt;
[UIView commitAnimations];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Swap views=====&lt;br /&gt;
* Create portrait and landscape outlets in the .h file.  Save.&lt;br /&gt;
* Delete the default view from the project. &lt;br /&gt;
* Drag two or more View elements from the library and give them names like &amp;quot;portrait&amp;quot; and &amp;quot;landscape&amp;quot;. &lt;br /&gt;
* Use the size inspector to update the geometry (480x300 for landscape with top status bar).&lt;br /&gt;
* Control-drag from File&#039;s Owner to each view and choose the related outlet.&lt;br /&gt;
* Control-drag from File&#039;s Owner to portrait and choose the View outlet to choose it as default&lt;br /&gt;
* Create this method in the .m file:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;objc&amp;quot;&amp;gt;&lt;br /&gt;
-(void)willAnimateFirstHalfOfRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation&lt;br /&gt;
    duration:(NSTimeInterval)duration {&lt;br /&gt;
	if (toOrientation == UIInterfaceOrientationPortrait){&lt;br /&gt;
		self.view = self.portrait;&lt;br /&gt;
		self.view.transform = CGAffineTransformIdentity;&lt;br /&gt;
		self.view.transform = CGAffineTransformMakeRotation(0);  // In radians&lt;br /&gt;
		self.view.bounds = CGRectMake(0, 0, 300, 480);&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Transform angles are:&lt;br /&gt;
** 0 for portrait&lt;br /&gt;
** M_PI/2 for landscape right&lt;br /&gt;
** M_PI for upside down&lt;br /&gt;
** -M_PI/2 for landscape left&lt;br /&gt;
* Link in the CoreGraphics framework to support the transform:&lt;br /&gt;
** Click Frameworks under the Groups and Files pane&lt;br /&gt;
** Project -&amp;gt; Add to Project menu&lt;br /&gt;
** /Developer/Platforms/iPhoneSimulator/Developer/SDKs/iPhoneSimulator3.1.sdk/System/Library/Frameworks/CoreGraphics.framework&lt;br /&gt;
** uncheck &amp;quot;Copy items to destination...&amp;quot;&lt;br /&gt;
** Reference type should be &amp;quot;Relative to current SDK&amp;quot;&lt;/div&gt;</summary>
		<author><name>Scott</name></author>
	</entry>
	<entry>
		<id>https://wiki.scott5.org/index.php?title=IPhone&amp;diff=1839</id>
		<title>IPhone</title>
		<link rel="alternate" type="text/html" href="https://wiki.scott5.org/index.php?title=IPhone&amp;diff=1839"/>
		<updated>2024-10-25T22:31:22Z</updated>

		<summary type="html">&lt;p&gt;Scott: /* Facts */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{lowercase title}}&lt;br /&gt;
==Facts==&lt;br /&gt;
* iPhone Resolution: 320x480&lt;br /&gt;
* top status bar is 20px, bottom tab bar is 44px&lt;br /&gt;
* All images should be png&lt;br /&gt;
* test&lt;br /&gt;
&lt;br /&gt;
==Basic Setup==&lt;br /&gt;
* Start by launching &amp;lt;code&amp;gt;/Developer/Applications/Xcode&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;File -&amp;gt; New Project -&amp;gt; View-Based Application&amp;lt;/code&amp;gt;, choose name (e.g. &amp;lt;code&amp;gt;MyProject&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Edit Objective-C code in &amp;lt;code&amp;gt;Groups &amp;amp; FIles -&amp;gt; Classes&amp;lt;/code&amp;gt; with Xcode&lt;br /&gt;
* Edit user interface with &amp;lt;code&amp;gt;Groups &amp;amp; Files -&amp;gt; Resources -&amp;gt; MyProjectViewController.xib&amp;lt;/code&amp;gt; with Interface Builder.  Drag elements from the Library window to the View window.&lt;br /&gt;
* Click Build and Run in Xcode to test.&lt;br /&gt;
&lt;br /&gt;
==Application Icon==&lt;br /&gt;
# Create a 57x57 png file&lt;br /&gt;
# Drag from Finder to Xcode &amp;lt;code&amp;gt;Resources&amp;lt;/code&amp;gt; folder&lt;br /&gt;
# Choose &amp;quot;&amp;lt;code&amp;gt;Copy&amp;lt;/code&amp;gt;&amp;quot; to create a copy in the project directory&lt;br /&gt;
# Click the &amp;lt;code&amp;gt;Resources -&amp;gt; Info.plist&amp;lt;/code&amp;gt; file&lt;br /&gt;
# Next to &amp;quot;&amp;lt;code&amp;gt;Icon File&amp;lt;/code&amp;gt;&amp;quot;, enter the name of the png.&lt;br /&gt;
&lt;br /&gt;
==Interface Builder hints==&lt;br /&gt;
* The MyProjectViewController.xib window has three &amp;quot;View Mode&amp;quot; buttons.  Use the middle one to drill down and select overlapped or hidden View elements.&lt;br /&gt;
* When a View element is selected, double click it or use Command-1 to edit attributes. (Command is the clover-shaped button)&lt;br /&gt;
* Hold the Option key when mousing over View elements to see more properties.&lt;br /&gt;
* If you have an existing element in the View that you want to duplicate, Option-drag it to get a copy.&lt;br /&gt;
&lt;br /&gt;
==Outlet==&lt;br /&gt;
* Communicate from code to view with an IBOutlet.  In header file:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;objc&amp;quot;&amp;gt;&lt;br /&gt;
IBOutlet UILabel *statusText;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* An outlet must be defined in the header file before it can be accessed in Interface Builder.&lt;br /&gt;
* Control-drag from File&#039;s Owner to the element and choose the corresponding outlet.&lt;br /&gt;
&lt;br /&gt;
==Action==&lt;br /&gt;
* Communicate from view to code with an IBAction.  In header file:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;objc&amp;quot;&amp;gt;&lt;br /&gt;
- (IBAction)doSomething:(id)sender;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* Select element and bring up connections inspector (Tools-&amp;gt;Connections or Command-2). &lt;br /&gt;
* Choose the desired event by clicking the circle to the left of it. &lt;br /&gt;
* Drag circle to File&#039;s Owner and select the desired action.&lt;br /&gt;
&lt;br /&gt;
==Basic Interaction Sample App==&lt;br /&gt;
MyProjectViewController.h:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;objc&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;UIKit/UIKit.h&amp;gt;&lt;br /&gt;
@interface MyProjectViewController : UIViewController {&lt;br /&gt;
    IBOutlet UILabel *statusText;&lt;br /&gt;
}&lt;br /&gt;
@property (retain, nonatomic) UILabel *statusText;&lt;br /&gt;
-(IBAction)buttonPressed:(id)sender;&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MyProjectViewController.m:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;objc&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;quot;MyProjectViewController.h&amp;quot;&lt;br /&gt;
@implementation MyProjectViewController&lt;br /&gt;
@synthesize statusText;&lt;br /&gt;
-(IBAction)buttonPressed:(id)sender {&lt;br /&gt;
    NSString *title = [sender titleForState:UIControlStateNormal];&lt;br /&gt;
    NSString *newText = [[NSString alloc] initWithFormat: @&amp;quot;%@ button pressed.&amp;quot;, title];&lt;br /&gt;
    statusText.text = newText;&lt;br /&gt;
    [newText release];&lt;br /&gt;
}&lt;br /&gt;
...boilerplate...&lt;br /&gt;
-(void)dealloc {&lt;br /&gt;
    [statusText release];&lt;br /&gt;
    [super dealloc];&lt;br /&gt;
}&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
======View:======&lt;br /&gt;
&lt;br /&gt;
# Double-click MyProjectViewController.xib in the Resources directory.&lt;br /&gt;
# Create a Label with no text and two RoundRect buttons named &amp;quot;Left&amp;quot; and &amp;quot;Right&amp;quot;.&lt;br /&gt;
# Control-click on &amp;quot;File&#039;s Owner&amp;quot; in the xib window and drag it to the Label object in the view window. Let go of the mouse button and choose &amp;quot;statusText&amp;quot; from the Outlets popup menu.&lt;br /&gt;
# Select the Left button by clicking it; then open the Connection Inspector from Tools menu.&lt;br /&gt;
# Find Events -&amp;gt; TouchUpInside&lt;br /&gt;
# Click the circle next to TouchUpInside and drag to the &amp;quot;File&#039;s Owner&amp;quot; icon.  Select &amp;quot;buttonPressed&amp;quot; from the popup menu.&lt;br /&gt;
# Do the same for the Right button.&lt;br /&gt;
# Build and Run&lt;br /&gt;
&lt;br /&gt;
==User Interface Elements==&lt;br /&gt;
&lt;br /&gt;
======Label======&lt;br /&gt;
&lt;br /&gt;
Has a &amp;quot;text&amp;quot; attribute that you can change with an outlet.  See the example above.&lt;br /&gt;
&lt;br /&gt;
======Image======&lt;br /&gt;
&lt;br /&gt;
# Drag a png file from Finder to the Resources folder in Xcode to import the image.&lt;br /&gt;
# Drag an ImageView element into the View&lt;br /&gt;
# Open attributes and tell it which png file to use&lt;br /&gt;
# Select &amp;quot;Size to Fit&amp;quot; from the Layout menu so the ImageView object is the same size as the imported image.&lt;br /&gt;
# Choose Drawing-&amp;gt;Opaque to speed up drawing if there is no background&lt;br /&gt;
&lt;br /&gt;
======Text field======&lt;br /&gt;
In MyProjectViewController.h:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;objc&amp;quot;&amp;gt;&lt;br /&gt;
#import &amp;lt;UIKit/UIKit.h&amp;gt;&lt;br /&gt;
@interface MyProjectViewController : UIViewController {&lt;br /&gt;
    IBOutlet UITextField *nameField;&lt;br /&gt;
}&lt;br /&gt;
@property (nonatomic, retain) UITextField *nameField;&lt;br /&gt;
- (IBAction)textFieldDoneEditing:(id)sender;  // make sure the text field gives up control when done editing&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In MyProjectViewController.m:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;objc&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
@implementation MyProjectViewController&lt;br /&gt;
@synthesize nameField;&lt;br /&gt;
- (IBAction)textFieldDoneEditing:(id)sender {  // make sure the text field gives up control when done editing&lt;br /&gt;
    [sender resignFirstResponder];&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In Interface Builder&lt;br /&gt;
&lt;br /&gt;
Outlet: Control-drag from File&#039;s Owner to the text field and choose the corresponding outlet.&lt;br /&gt;
&lt;br /&gt;
Action: Select text field and bring up connections inspector.  Choose the &amp;quot;Did End on Exit&amp;quot; event.  Drag circle to File&#039;s Owner and select &amp;quot;textFieldDoneEditing&amp;quot; action.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
======Number field======&lt;br /&gt;
&lt;br /&gt;
Same as text field but you need a background click action to allow the user to leave the field when done editing.  Add the method declaration to both header and implementation file.  Here is the implementation:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;objc&amp;quot;&amp;gt;&lt;br /&gt;
- (IBAction)backgroundClick:(id)sender {&lt;br /&gt;
	[numberField resignFirstResponder];&lt;br /&gt;
	// add the same for any other edit fields that should lose focus&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
View:&lt;br /&gt;
# Use a Round Rect Button in the view and drag its edges to cover the entire screen. &lt;br /&gt;
# Use Layout-&amp;gt;Send to Back to put it behind everything else. &lt;br /&gt;
# Then change its Type to Custom to make it disappear altogether.&lt;br /&gt;
# Tie the Touch Up Inside event to File&#039;s Owner backgroundClick action.&lt;br /&gt;
&lt;br /&gt;
======Slider======&lt;br /&gt;
Use the &amp;quot;Value Changed&amp;quot; event to call the sliderChanged action.  Access slider value with slider.value.  Sample code:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;objc&amp;quot;&amp;gt;&lt;br /&gt;
-(IBAction)sliderChanged:(id)sender {&lt;br /&gt;
	UISlider *slider = (UISlider *)sender;&lt;br /&gt;
	int progressAsInt = (int)(slider.value + 0.5f);&lt;br /&gt;
	NSString *newText = [[NSString alloc] initWithFormat:@&amp;quot;%d&amp;quot;, progressAsInt];&lt;br /&gt;
	sliderLabel.text = newText;&lt;br /&gt;
	[newText release];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Switch======&lt;br /&gt;
Get value from &amp;lt;code&amp;gt;switch.isOn&amp;lt;/code&amp;gt;.  Use &amp;quot;Value Changed&amp;quot; event.&lt;br /&gt;
&lt;br /&gt;
======Segmented Control======&lt;br /&gt;
Get value from &amp;lt;code&amp;gt;segmentedControl.selectedSegmentIndex&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======SubView======&lt;br /&gt;
Group elements inside a sub view.  Hide all with &amp;lt;code&amp;gt;subview.hidden = YES&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Action Sheet======&lt;br /&gt;
Modal dialog to force the user to choose an option.  Use UIActionSheetDelegate protocol:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;objc&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
@interface MyProjectViewController : UIViewController &amp;lt;UIActionSheetDelegate&amp;gt; {&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create an Action Sheet in an action method:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;objc&amp;quot;&amp;gt;&lt;br /&gt;
UIActionSheet *actionSheet = [[UIActionSheet alloc]&lt;br /&gt;
	initWithTitle:@&amp;quot;Are you sure?&amp;quot;&lt;br /&gt;
	delegate:self&lt;br /&gt;
	cancelButtonTitle:@&amp;quot;No way!&amp;quot;&lt;br /&gt;
	destructiveButtonTitle:@&amp;quot;Yes, I&#039;m sure!&amp;quot;&lt;br /&gt;
	otherButtonTitles:nil];&lt;br /&gt;
[actionSheet showInView:self.view];&lt;br /&gt;
[actionSheet release];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Handle the action sheet response with this method:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;objc&amp;quot;&amp;gt;&lt;br /&gt;
-(void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex {&lt;br /&gt;
	if (buttonIndex == [actionSheet cancelButtonIndex] { /* do cancel action, if any */ }&lt;br /&gt;
	else { /* do destructive (positive) action */}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Custom Button======&lt;br /&gt;
To get nicer looking buttons, create a Round Rect button and then change its type to Custom.  Download a nice looking button template from the web:&lt;br /&gt;
&lt;br /&gt;
http://developer.apple.com/iphone/library/samplecode/UICatalog/index.html&lt;br /&gt;
&lt;br /&gt;
Then implement the viewDidLoad method of UIViewController:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;objc&amp;quot;&amp;gt;&lt;br /&gt;
-(void)viewDidLoad {&lt;br /&gt;
	jmUIImage *buttonImage = [UIImage imageNamed:@&amp;quot;whiteButton.png&amp;quot;];&lt;br /&gt;
	UIIMage *stretchableButtonImage = [buttonImage stretchableImageWithLeftCapWidth:12 topCapHeight:0];&lt;br /&gt;
	[doSomethingButton setBackgroundImage:stretchableButtonImage forState:UIControlStateNormal];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Can also make the button change when pressed by using a different background image for state &amp;lt;code&amp;gt;UIControlStateHighlighted&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Autorotation==&lt;br /&gt;
Controlled from the&lt;br /&gt;
&amp;lt;source lang=&amp;quot;objc&amp;quot;&amp;gt;&lt;br /&gt;
-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {&lt;br /&gt;
    return (interfaceOrientation == UIInterfaceOrientationPortrait);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Available orientations:&lt;br /&gt;
* UIInterfaceOrientationPortrait&lt;br /&gt;
* UIInterfaceOrientationPortraitUpsideDown&lt;br /&gt;
* UIInterfaceOrientationLandscapeLeft&lt;br /&gt;
* UIInterfaceOrientationLandscapeRight&lt;br /&gt;
&lt;br /&gt;
There are three different approaches to autorotation:&lt;br /&gt;
&lt;br /&gt;
=====Autosize=====&lt;br /&gt;
Give elements autosize properties using the size inspector (command-3).&lt;br /&gt;
&lt;br /&gt;
=====Restructure=====&lt;br /&gt;
Create outlets for each element; then call something like &amp;lt;code&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;objc&amp;quot;&amp;gt;&lt;br /&gt;
element.frame = CGRectMake(x1, y1, width, height)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
to resize/relocate each on rotation in the&lt;br /&gt;
&amp;lt;source lang=&amp;quot;objc&amp;quot;&amp;gt;&lt;br /&gt;
-(void)willAnimateSecondHalfOfRotationFromInterfaceOrientation&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
method using self.interfaceOrientation as the &amp;quot;to&amp;quot; orientation.&lt;br /&gt;
&lt;br /&gt;
======Animating a rotation======&lt;br /&gt;
&amp;lt;source lang=&amp;quot;objc&amp;quot;&amp;gt;&lt;br /&gt;
[UIView beginAnimations:@&amp;quot;move buttons&amp;quot; context:nil];&lt;br /&gt;
... CGRectMake calls to move stuff around ...&lt;br /&gt;
[UIView commitAnimations];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Swap views=====&lt;br /&gt;
* Create portrait and landscape outlets in the .h file.  Save.&lt;br /&gt;
* Delete the default view from the project. &lt;br /&gt;
* Drag two or more View elements from the library and give them names like &amp;quot;portrait&amp;quot; and &amp;quot;landscape&amp;quot;. &lt;br /&gt;
* Use the size inspector to update the geometry (480x300 for landscape with top status bar).&lt;br /&gt;
* Control-drag from File&#039;s Owner to each view and choose the related outlet.&lt;br /&gt;
* Control-drag from File&#039;s Owner to portrait and choose the View outlet to choose it as default&lt;br /&gt;
* Create this method in the .m file:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;objc&amp;quot;&amp;gt;&lt;br /&gt;
-(void)willAnimateFirstHalfOfRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation&lt;br /&gt;
    duration:(NSTimeInterval)duration {&lt;br /&gt;
	if (toOrientation == UIInterfaceOrientationPortrait){&lt;br /&gt;
		self.view = self.portrait;&lt;br /&gt;
		self.view.transform = CGAffineTransformIdentity;&lt;br /&gt;
		self.view.transform = CGAffineTransformMakeRotation(0);  // In radians&lt;br /&gt;
		self.view.bounds = CGRectMake(0, 0, 300, 480);&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Transform angles are:&lt;br /&gt;
** 0 for portrait&lt;br /&gt;
** M_PI/2 for landscape right&lt;br /&gt;
** M_PI for upside down&lt;br /&gt;
** -M_PI/2 for landscape left&lt;br /&gt;
* Link in the CoreGraphics framework to support the transform:&lt;br /&gt;
** Click Frameworks under the Groups and Files pane&lt;br /&gt;
** Project -&amp;gt; Add to Project menu&lt;br /&gt;
** /Developer/Platforms/iPhoneSimulator/Developer/SDKs/iPhoneSimulator3.1.sdk/System/Library/Frameworks/CoreGraphics.framework&lt;br /&gt;
** uncheck &amp;quot;Copy items to destination...&amp;quot;&lt;br /&gt;
** Reference type should be &amp;quot;Relative to current SDK&amp;quot;&lt;/div&gt;</summary>
		<author><name>Scott</name></author>
	</entry>
	<entry>
		<id>https://wiki.scott5.org/index.php?title=Main_Page&amp;diff=1838</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.scott5.org/index.php?title=Main_Page&amp;diff=1838"/>
		<updated>2024-10-25T22:00:59Z</updated>

		<summary type="html">&lt;p&gt;Scott: /* Packages and Commands */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
== Programming ==&lt;br /&gt;
{|&lt;br /&gt;
|width=&amp;quot;120px&amp;quot;|&lt;br /&gt;
| |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;bash&#039;&#039;&#039;&lt;br /&gt;
|[[bash|Notes]]&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;C/C++ &#039;&#039;&#039;&lt;br /&gt;
|[[C Basics]] | [[C++ Basics]] | [[C++ I/O]] | [[CUDA C]] | [[Objective C]] | [[iPhone]]&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Go&#039;&#039;&#039;&lt;br /&gt;
|[[Go Basics|Basics]] | [[Go Strings|Strings]]&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;HTML and CSS&#039;&#039;&#039;&lt;br /&gt;
|[[HTML and CSS|Notes]]&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Java&#039;&#039;&#039;&lt;br /&gt;
|[[Java Basics|Basics]] | [[Java I/O|I/O]] | [[Java Objects|Objects]] | [[Java Properties Files|Properties Files]] | [[Java System Calls|System Calls]] | [[log4j]]&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;JavaScript&#039;&#039;&#039;&lt;br /&gt;
|[[JavaScript Basics|Basics]] | [[AngularJS]] | [[jQuery]] | [[JavaScript mailto Trick]] | [[Dojo Basics]] | [[Dojo Data Stores]] | [[E4X]] | [[Prototype]]&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Matlab&#039;&#039;&#039;&lt;br /&gt;
|[[Matlab|Basics]]&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Perl&#039;&#039;&#039;&lt;br /&gt;
|[[Perl Basics|Basics]] | [[Perl I/O|I/O]] | [[Perl Command-Line Arguments|Command-Line Arguments]] | [[Perl Subroutines|Subroutines]] | [[Perl Regular Expressions|Regular Expressions]] | [[Installing Perl Modules|Installing Modules]] | [[Example Perl Scripts|Example Scripts]]&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PHP&#039;&#039;&#039;&lt;br /&gt;
|[[PHP|Basics]]&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Python&#039;&#039;&#039;&lt;br /&gt;
|[[Python Basics|Basics]] | [[Python I/O|I/O]] | [[Python Modules|Modules]] | [[Python Regular Expressions|Regular Expressions]] | [[Python Date and Time|Date and Time]] | [[Python System Calls|System Calls]] | [[matplotlib]] | [[scipy]] | [[Python Curses|curses]]&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Python3&#039;&#039;&#039;&lt;br /&gt;
|[[Python3 Basics|Basics]] | [[Python 3 I/O|I/O]] | [[Python Cryptography Tools]]&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;R&#039;&#039;&#039;&lt;br /&gt;
|[[R Basics|Basics]] | [[R Graphics|Graphics]] | [[R I/O|I/O]] | [[R Packages|Packages]] | [[R Statistics|Statistics]]&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Ruby&#039;&#039;&#039;&lt;br /&gt;
|[[Ruby Basics|Basics]] | [[Ruby Classes and Modules|Classes and Modules]] | [[Ruby Data Structures|Data Structures]] | [[Ruby I/O|I/O]] | [[RVM]]&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Ruby on Rails&#039;&#039;&#039;&lt;br /&gt;
|[[Rails Basics|Basics]] | [[Rails Form Examples]] | [[Rails 4 Notes]] | [[Nginx, Passenger, and Rails]]&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Rails 3&#039;&#039;&#039;&lt;br /&gt;
|[[Rails 3 Basics|Basics]] | [[Rails 3 Model|Model]] | [[Rails 3 View|View]] | [[Rails 3 Controller|Controller]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Packages and Commands ==&lt;br /&gt;
[[7zip]]      |&lt;br /&gt;
[[apache]]    | &lt;br /&gt;
[[autofs]]    | &lt;br /&gt;
[[awk]]       | &lt;br /&gt;
[[awstats]]   |&lt;br /&gt;
[[ccrypt]]    | &lt;br /&gt;
[[certbot]]   |&lt;br /&gt;
[[chkconfig]] | &lt;br /&gt;
[[crontab]]   |&lt;br /&gt;
[[date]]      | &lt;br /&gt;
[[dd]]        | &lt;br /&gt;
[[diff]]      | &lt;br /&gt;
[[dirvish]]   | &lt;br /&gt;
[[docker]]&lt;br /&gt;
&lt;br /&gt;
[[emacs]]     |&lt;br /&gt;
[[fastcgi++]] | &lt;br /&gt;
[[find]]      |&lt;br /&gt;
[[gimp]]      |&lt;br /&gt;
[[git]]       |&lt;br /&gt;
[[gnuplot]]   |&lt;br /&gt;
[[goaccess]]  |&lt;br /&gt;
[[gpg]]       |&lt;br /&gt;
[[iozone]]    | &lt;br /&gt;
[[iptables]]  | &lt;br /&gt;
[[locate]]    |&lt;br /&gt;
[[mail]]        | &lt;br /&gt;
[[mediawiki]]   &lt;br /&gt;
&lt;br /&gt;
[[mercurial]]   | &lt;br /&gt;
[[mtr]]         |&lt;br /&gt;
[[mysql]]       |&lt;br /&gt;
[[netplan]]     |&lt;br /&gt;
[[nfs4]]        |&lt;br /&gt;
[[nginx]]       |&lt;br /&gt;
[[openssl]]     |&lt;br /&gt;
[[pipenv]]      |&lt;br /&gt;
[[postgresql]]  |&lt;br /&gt;
[[ps]]          | &lt;br /&gt;
[[quota]]       |&lt;br /&gt;
[[rbenv]]       |&lt;br /&gt;
[[rsync]]&lt;br /&gt;
&lt;br /&gt;
[[screen]]      |&lt;br /&gt;
[[sed]]         | &lt;br /&gt;
[[smartctl]]    | &lt;br /&gt;
[[sort]]        | &lt;br /&gt;
[[split]]       |&lt;br /&gt;
[[ssh]]         | &lt;br /&gt;
[[Sublime Text|subl]]  |&lt;br /&gt;
[[subversion]]  |&lt;br /&gt;
[[supervisor]]  |&lt;br /&gt;
[[systemd]]  |&lt;br /&gt;
[[tar]]         | &lt;br /&gt;
[[thin]]        | &lt;br /&gt;
[[tr]]&lt;br /&gt;
&lt;br /&gt;
[[ufw]]         |&lt;br /&gt;
[[update-rc.d]] | &lt;br /&gt;
[[usermod]]     |&lt;br /&gt;
[[vi]]          | &lt;br /&gt;
[[virtualbox]]  |&lt;br /&gt;
[[xargs]]       | &lt;br /&gt;
[[xsendfile]]   | &lt;br /&gt;
[[youtube]]     | &lt;br /&gt;
[[yum]]         | &lt;br /&gt;
[[zfs]]         | &lt;br /&gt;
[[zip]]&lt;br /&gt;
&lt;br /&gt;
== Linux How-To ==&lt;br /&gt;
[[How to set up two-factor authentication|2FA (two-factor authentication)]]      |&lt;br /&gt;
[[How to add a new disk drive|add a new disk drive]]                             | &lt;br /&gt;
[[How to back up and restore a partition|back up and restore a partition]]       | &lt;br /&gt;
[[How to burn a DVD|burn a DVD]]                                &lt;br /&gt;
&lt;br /&gt;
[[How to change a server&#039;s hostname|change a server&#039;s hostname]]                 |&lt;br /&gt;
[[Linux file compression|compress/decompress files and directories]]             |&lt;br /&gt;
[[How to create an ISO file from a CD-ROM|create an ISO file from a CD-ROM]]     &lt;br /&gt;
&lt;br /&gt;
[[How to find a MAC address|find a MAC address]]                                 |&lt;br /&gt;
[[How to find an executable|find an executable]]                                 | &lt;br /&gt;
[[How to free kernel memory|free kernel memory]]                                 |&lt;br /&gt;
[[How to interrogate a computer&#039;s hardware|interrogate a computer&#039;s hardware]]&lt;br /&gt;
&lt;br /&gt;
[[How to manage quotas|manage quotas]]                                           |&lt;br /&gt;
[[How to monitor performance|monitor performance]]                               |&lt;br /&gt;
[[How to mount an ISO|mount an ISO]]                                             | &lt;br /&gt;
[[How to mount an LVM partition|mount an LVM partition]]                         |&lt;br /&gt;
[[How to optimize a solid state drive|optimize a solid state drive]]             &lt;br /&gt;
&lt;br /&gt;
[[How to repair GRUB|repair GRUB]]                                               |&lt;br /&gt;
[[How to re-create /dev/null|re-create &amp;lt;code&amp;gt;/dev/null&amp;lt;/code&amp;gt;]]                  |&lt;br /&gt;
[[How to set up Ubuntu Server|set up Ubuntu Server]]                             |&lt;br /&gt;
[[How to set up Ubuntu Desktop|set up Ubuntu Desktop]]                           |&lt;br /&gt;
[[How to set up a VPS|set up VPS]]                                               &lt;br /&gt;
&lt;br /&gt;
[[Ubuntu keyboard shortcuts]]                                                    |&lt;br /&gt;
[[How to use a tape drive|use a tape drive]]                                     |&lt;br /&gt;
[[How to wipe a hard drive|wipe a hard drive]]&lt;br /&gt;
&lt;br /&gt;
== Mac and Windows ==&lt;br /&gt;
&#039;&#039;&#039;Mac&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Mac Orientation]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Windows access control lists|access control lists]] | [[Windows administrative login|administrative login]] | [[Windows file sharing|file sharing]] | [[Windows minimum hardware requirements|minimum hardware requirements]] | [[Windows offline files|offline files]]&lt;br /&gt;
&lt;br /&gt;
[[Recover files from a non-booting Windows PC|recover files]] | [[Windows remote desktop|remote desktop]] | [[Windows security|security]] | [[Windows services|services]] | [[Windows shell programming|shell programming]] | [[Windows troubleshoot network connection|troubleshoot network connection]] | [[Windows wisdom|wisdom]]&lt;br /&gt;
&lt;br /&gt;
== Math ==&lt;br /&gt;
[[Exponential Moving Average]] | [[Statistics]]&lt;br /&gt;
&lt;br /&gt;
== Biology ==&lt;br /&gt;
[[Brain]] | [[MRI]] | [[fMRI]] | [[Bioinformatics]]&lt;br /&gt;
&lt;br /&gt;
== Books ==&lt;br /&gt;
[[Guide to the Good Life]] | [[How We Decide]] | [[Logic of Life]] | [[New Abs Diet]] | [[Parenting]] &lt;br /&gt;
&lt;br /&gt;
[[Power of Habit]] | [[Predictably Irrational]] | [[Run]] | [[Run Faster]] | [[Sapiens]] | [[Spark]] | [[Total Heart Rate Training]]&lt;br /&gt;
&lt;br /&gt;
== Other ==&lt;br /&gt;
[[Wiki Formatting Cheat Sheet]] | [[Recipes]] | [[Diet]] | [[Quotes]] | [[Alberto Salazar&#039;s Ten Golden Rules]]&lt;br /&gt;
| [[Buddhism]] | [[Favorite Booze]]&lt;/div&gt;</summary>
		<author><name>Scott</name></author>
	</entry>
	<entry>
		<id>https://wiki.scott5.org/index.php?title=Mysql&amp;diff=1837</id>
		<title>Mysql</title>
		<link rel="alternate" type="text/html" href="https://wiki.scott5.org/index.php?title=Mysql&amp;diff=1837"/>
		<updated>2024-10-25T20:25:38Z</updated>

		<summary type="html">&lt;p&gt;Scott: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Ubuntu setup ==&lt;br /&gt;
Have a &amp;lt;code&amp;gt;mysql&amp;lt;/code&amp;gt; root password ready to go.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install mysql-server mysql-client libmysqlclient-dev&lt;br /&gt;
apt install python3-mysqldb  # if using python to access mysql&lt;br /&gt;
mysql_secure_installation&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ERROR in UBUNTU 22.04 solved here:&lt;br /&gt;
https://www.nixcraft.com/t/mysql-failed-error-set-password-has-no-significance-for-user-root-localhost-as-the-authentication-method-used-doesnt-store-authentication-data-in-the-mysql-server-please-consider-using-alter-user/4233&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ALTER USER &#039;root&#039;@&#039;localhost&#039; IDENTIFIED WITH mysql_native_password BY &#039;SetRootPasswordHere&#039;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Log in as root to mysql database&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mysql -u root -p mysql&lt;br /&gt;
select * from user;&lt;br /&gt;
delete from user where host = &#039;myserver&#039;;  # not needed if secure installation completed above&lt;br /&gt;
create user barney@localhost identified by &#039;xxxxxxxx&#039;;&lt;br /&gt;
create database bookstore;&lt;br /&gt;
grant all privileges on bookstore.* to barney@localhost;  # regular account&lt;br /&gt;
grant select on bookstore.* to barney@localhost;          # read-only account&lt;br /&gt;
grant lock tables on bookstore.* to barney@localhost;     # need lock tables to run mysqldump&lt;br /&gt;
grant file on *.* to barney@localhost;                    # write output to files&lt;br /&gt;
flush privileges;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Show Permissions ==&lt;br /&gt;
Logged in as root:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
show grants for barney@localhost;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==File I/O==&lt;br /&gt;
You should have already granted &amp;quot;file&amp;quot; privileges to user:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
grant file on *.* to barney@localhost;&lt;br /&gt;
flush privileges;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To execute SQL commands in a text file (from the command line):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mysql -u barney -p bookstore &amp;lt; mycommands.sql&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To execute SQL commands in a text file (from the mysql prompt):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mysql&amp;gt; use bookstore;&lt;br /&gt;
mysql&amp;gt; source /home/barney/sql/mycommands.sql;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To read data out to a file (NOTE: The &amp;lt;code&amp;gt;mysql&amp;lt;/code&amp;gt; user can only write to the &amp;lt;code&amp;gt;/var/lib/mysql-files/&amp;lt;/code&amp;gt; directory): &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
select ... into outfile &amp;quot;/var/lib/mysql-files/goodbooks.txt&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To load a file into a table:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
load data local infile &amp;quot;/home/barney/sql/goodbooks.txt&amp;quot; into table books;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Save into a CSV file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
select * from users into outfile &#039;/tmp/users.csv&#039; fields terminated by &#039;,&#039; &lt;br /&gt;
    optionally enclosed by &#039;&amp;quot;&#039; lines terminated by &#039;\n&#039;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Backing up and restoring a database ==&lt;br /&gt;
To back up the database &amp;quot;bookstore&amp;quot; to a file sq5.sql:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
export MYSQL_PWD=XXXXX&lt;br /&gt;
mysqldump --no-tablespaces --opt bookstore &amp;gt; bookstore.sql&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
To restore a database from backup (overwrites any existing):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mysql -u root -p bookstore &amp;lt; bookstore.sql&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Searching on three-character words ==&lt;br /&gt;
* Edit &amp;lt;code&amp;gt;/etc/mysql/mysql.cnf&amp;lt;/code&amp;gt; to add this line to the &amp;lt;code&amp;gt;[mysqld]&amp;lt;/code&amp;gt; section (create section if it doesn&#039;t exist): &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[mysqld]&lt;br /&gt;
ft_min_word_len=3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Restart mysql. &lt;br /&gt;
* For each table you are doing a fulltext search on, run this command: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
repair table &amp;lt;table_name&amp;gt; quick;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Restart mysql and any dependent apps.&lt;br /&gt;
&lt;br /&gt;
== Create database/table example ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
drop database if exists edapt_quiz;&lt;br /&gt;
create database edapt_quiz;&lt;br /&gt;
use edapt_quiz;&lt;br /&gt;
&lt;br /&gt;
drop table if exists quizzes;&lt;br /&gt;
create table quizzes (&lt;br /&gt;
    id              int unsigned not null auto_increment,&lt;br /&gt;
    name            varchar(64) not null,&lt;br /&gt;
    primary key (id)&lt;br /&gt;
) engine=innodb;&lt;br /&gt;
insert into quizzes (name) values (&#039;Prodromal Questionnaire – Brief Version&#039;);&lt;br /&gt;
&lt;br /&gt;
drop table if exists questions;&lt;br /&gt;
create table questions (&lt;br /&gt;
    id              int unsigned not null auto_increment,&lt;br /&gt;
    quiz_id         int unsigned not null,&lt;br /&gt;
    sort_order      smallint,&lt;br /&gt;
    text            text,&lt;br /&gt;
    primary key (id),&lt;br /&gt;
    foreign key (quiz_id) references quizzes(id)&lt;br /&gt;
) engine=innodb;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
When attempting to load a database from a mysqldump backup, you get&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;ERROR 1227 (42000) at line 81: Access denied; you need (at least one of) the SUPER privilege(s) for this operation&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
You need to remove all DEFINER lines from the mysqldump file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sed &#039;s/DEFINER=[^*]*\*/\*/g&#039; backup.sql &amp;gt; new_backup.sql&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Scott</name></author>
	</entry>
	<entry>
		<id>https://wiki.scott5.org/index.php?title=How_to_set_up_two-factor_authentication&amp;diff=1836</id>
		<title>How to set up two-factor authentication</title>
		<link rel="alternate" type="text/html" href="https://wiki.scott5.org/index.php?title=How_to_set_up_two-factor_authentication&amp;diff=1836"/>
		<updated>2024-10-25T20:15:45Z</updated>

		<summary type="html">&lt;p&gt;Scott: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;https://vrealmatic.com/ubuntu-server/2fa-google-authenticator&lt;br /&gt;
&lt;br /&gt;
OATH-TOTP (Open Authentication Time-Based One-Time Password) is an open protocol that generates a one-time use password, commonly a 6 digit number that is recycled every 30 seconds.&lt;br /&gt;
&lt;br /&gt;
PREREQUISITE: Before setting this up, you need a smartphone or tablet with an OATH-TOTP app installed, like Google Authenticator or Authy.&lt;br /&gt;
&lt;br /&gt;
== Install Google&#039;s PAM ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ sudo apt install libpam-google-authenticator&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
For each user that needs 2FA, run &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ google-authenticator&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Answer &amp;quot;y&amp;quot; for yes to say that &amp;quot;you want authentication tokens to be time-based&amp;quot;.  A QR code will pop up in your terminal.  Use the TOTP app on your phone to take a picture of this to add the account.  Give reasonable answers to the rest of the questions.  You should end up with a hidden &amp;lt;code&amp;gt;.google_authenticator&amp;lt;/code&amp;gt; file in your home directory.&lt;br /&gt;
&lt;br /&gt;
== Configure SSH ==&lt;br /&gt;
Edit &amp;lt;code&amp;gt;/etc/pam.d/sshd&amp;lt;/code&amp;gt; to add this line at the end:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
auth required pam_google_authenticator.so nullok&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Edit &amp;lt;code&amp;gt;/etc/ssh/sshd_config&amp;lt;/code&amp;gt;.  Look for &amp;lt;code&amp;gt;ChallengeResponseAuthentication&amp;lt;/code&amp;gt; OR &amp;lt;code&amp;gt;KbdInteractiveAuthentication&amp;lt;/code&amp;gt; and set its value to &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
. . .&lt;br /&gt;
# Change to yes to enable challenge-response passwords (beware issues with&lt;br /&gt;
# some PAM modules and threads)&lt;br /&gt;
ChallengeResponseAuthentication yes&lt;br /&gt;
# OR #&lt;br /&gt;
KbdInteractiveAuthentication yes&lt;br /&gt;
. . .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Restart sshd:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo systemctl restart sshd.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
WARNING: Don&#039;t close your existing terminal until you know everything is working!&lt;br /&gt;
&lt;br /&gt;
== Public Key OR Password+2FA ==&lt;br /&gt;
Open a new terminal and attempt to log in via SSH.  If you&#039;ve previously created an SSH key and are using it, you&#039;ll notice you didn&#039;t have to type in your user&#039;s password or the MFA verification code. This is because an SSH key overrides all other authentication options by default. Otherwise, you should have gotten a password and verification code prompt.&lt;br /&gt;
&lt;br /&gt;
== Public Key + 2FA ==&lt;br /&gt;
If your SSH server doesn&#039;t allow passwords (with &amp;lt;code&amp;gt;PasswordAuthentication no&amp;lt;/code&amp;gt; and you want to require BOTH public key AND 2FA:&lt;br /&gt;
&lt;br /&gt;
Edit &amp;lt;code&amp;gt;/etc/pam.d/sshd&amp;lt;/code&amp;gt; to comment out &amp;lt;code&amp;gt;@include common-auth&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
. . .&lt;br /&gt;
# Standard Un*x authentication.&lt;br /&gt;
#@include common-auth&lt;br /&gt;
. . .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Edit &amp;lt;code&amp;gt;/etc/ssh/sshd_config&amp;lt;/code&amp;gt; to add a &amp;lt;code&amp;gt;Match User&amp;lt;/code&amp;gt; section for users that need to use 2FA:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Match User barney&lt;br /&gt;
    AuthenticationMethods publickey,keyboard-interactive&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Restart sshd:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo systemctl restart sshd.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Scott</name></author>
	</entry>
	<entry>
		<id>https://wiki.scott5.org/index.php?title=How_to_set_up_a_VPS&amp;diff=1835</id>
		<title>How to set up a VPS</title>
		<link rel="alternate" type="text/html" href="https://wiki.scott5.org/index.php?title=How_to_set_up_a_VPS&amp;diff=1835"/>
		<updated>2024-10-25T18:49:54Z</updated>

		<summary type="html">&lt;p&gt;Scott: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Log in as root via ssh&lt;br /&gt;
* add line to &amp;lt;code&amp;gt;/etc/hosts&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;dpkg-reconfigure tzdata&amp;lt;/code&amp;gt;&lt;br /&gt;
* create user account, add to sudoers:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
useradd --create-home --shell /bin/bash myuser&lt;br /&gt;
usermod -aG sudo myuser&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;apt install emacs-nox nmap ntp postfix mailutils logwatch unzip zip&amp;lt;/code&amp;gt;&lt;br /&gt;
* update ssh to listen on a different port by editing &amp;lt;code&amp;gt;/lib/systemd/system/ssh.socket&amp;lt;/code&amp;gt;, then restart ssh.  Test it!&lt;br /&gt;
* Carefully deny root access &lt;br /&gt;
* set up firewall&lt;br /&gt;
* set up backups&lt;br /&gt;
* apt install nginx mysql-server supervisor&lt;br /&gt;
* install docker-compose: http://docs.docker.com/compose/install/&lt;br /&gt;
* fix [[mysql]], create mysql databases and app accounts&lt;br /&gt;
* schedule nightly database snapshots&lt;br /&gt;
* set up sites in &amp;lt;code&amp;gt;/etc/nginx/sites-available&amp;lt;/code&amp;gt; and activate in &amp;lt;code&amp;gt;/etc/nginx/sites-enabled&amp;lt;/code&amp;gt;&lt;br /&gt;
* set up apps in &amp;lt;code&amp;gt;/etc/supervisor/conf.d&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== after setting up DNS name ==&lt;br /&gt;
* update hostname in /etc/hosts, /etc/hostname, run &amp;quot;hostname -F /etc/hostname&amp;quot;&lt;br /&gt;
* configure postfix&lt;br /&gt;
* make sure you receive nightly log messages&lt;/div&gt;</summary>
		<author><name>Scott</name></author>
	</entry>
	<entry>
		<id>https://wiki.scott5.org/index.php?title=How_to_set_up_a_VPS&amp;diff=1834</id>
		<title>How to set up a VPS</title>
		<link rel="alternate" type="text/html" href="https://wiki.scott5.org/index.php?title=How_to_set_up_a_VPS&amp;diff=1834"/>
		<updated>2024-10-25T18:34:16Z</updated>

		<summary type="html">&lt;p&gt;Scott: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Log in as root via ssh&lt;br /&gt;
* add line to &amp;lt;code&amp;gt;/etc/hosts&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;dpkg-reconfigure tzdata&amp;lt;/code&amp;gt;&lt;br /&gt;
* create user account, add to sudoers:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
useradd --create-home --shell /bin/bash myuser&lt;br /&gt;
usermod -aG sudo myuser&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;apt install emacs-nox nmap ntp postfix mailutils logwatch unzip zip&amp;lt;/code&amp;gt;&lt;br /&gt;
* update ssh to listen on a different port by editing &amp;lt;code&amp;gt;/lib/systemd/system/ssh.socket&amp;lt;/code&amp;gt;, then restart ssh.  Test it!&lt;br /&gt;
* Carefully deny root access &lt;br /&gt;
* set up firewall&lt;br /&gt;
* set up backups&lt;br /&gt;
* apt-get install nginx mysql-server supervisor&lt;br /&gt;
* install docker-compose: http://docs.docker.com/compose/install/&lt;br /&gt;
* fix [[mysql]], create mysql databases and app accounts&lt;br /&gt;
* schedule nightly database snapshots&lt;br /&gt;
* set up sites in &amp;lt;code&amp;gt;/etc/nginx/sites-available&amp;lt;/code&amp;gt; and activate in &amp;lt;code&amp;gt;/etc/nginx/sites-enabled&amp;lt;/code&amp;gt;&lt;br /&gt;
* set up apps in &amp;lt;code&amp;gt;/etc/supervisor/conf.d&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== after setting up DNS name ==&lt;br /&gt;
* update hostname in /etc/hosts, /etc/hostname, run &amp;quot;hostname -F /etc/hostname&amp;quot;&lt;br /&gt;
* configure postfix&lt;br /&gt;
* make sure you receive nightly log messages&lt;/div&gt;</summary>
		<author><name>Scott</name></author>
	</entry>
	<entry>
		<id>https://wiki.scott5.org/index.php?title=How_to_set_up_a_VPS&amp;diff=1833</id>
		<title>How to set up a VPS</title>
		<link rel="alternate" type="text/html" href="https://wiki.scott5.org/index.php?title=How_to_set_up_a_VPS&amp;diff=1833"/>
		<updated>2024-10-25T18:33:14Z</updated>

		<summary type="html">&lt;p&gt;Scott: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Log in as root via ssh&lt;br /&gt;
* add line to &amp;lt;code&amp;gt;/etc/hosts&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;dpkg-reconfigure tzdata&amp;lt;/code&amp;gt;&lt;br /&gt;
* create user account, add to sudoers:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
useradd --create-home --shell /bin/bash myuser&lt;br /&gt;
usermod -aG sudo myuser&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;apt install emacs-nox nmap ntp postfix mailutils logwatch unzip zip&amp;lt;/code&amp;gt;&lt;br /&gt;
* update ssh to listen on a different port by editing &amp;lt;code&amp;gt;/lib/systemd/system/ssh.socket&amp;lt;/code&amp;gt;, then restart ssh.&lt;br /&gt;
and (carefully) to deny root access &lt;br /&gt;
* set up firewall&lt;br /&gt;
* set up backups&lt;br /&gt;
* apt-get install nginx mysql-server supervisor&lt;br /&gt;
* install docker-compose: http://docs.docker.com/compose/install/&lt;br /&gt;
* fix [[mysql]], create mysql databases and app accounts&lt;br /&gt;
* schedule nightly database snapshots&lt;br /&gt;
* set up sites in &amp;lt;code&amp;gt;/etc/nginx/sites-available&amp;lt;/code&amp;gt; and activate in &amp;lt;code&amp;gt;/etc/nginx/sites-enabled&amp;lt;/code&amp;gt;&lt;br /&gt;
* set up apps in &amp;lt;code&amp;gt;/etc/supervisor/conf.d&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== after setting up DNS name ==&lt;br /&gt;
* update hostname in /etc/hosts, /etc/hostname, run &amp;quot;hostname -F /etc/hostname&amp;quot;&lt;br /&gt;
* configure postfix&lt;br /&gt;
* make sure you receive nightly log messages&lt;/div&gt;</summary>
		<author><name>Scott</name></author>
	</entry>
	<entry>
		<id>https://wiki.scott5.org/index.php?title=How_to_set_up_a_VPS&amp;diff=1832</id>
		<title>How to set up a VPS</title>
		<link rel="alternate" type="text/html" href="https://wiki.scott5.org/index.php?title=How_to_set_up_a_VPS&amp;diff=1832"/>
		<updated>2024-10-25T18:31:57Z</updated>

		<summary type="html">&lt;p&gt;Scott: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Log in as root via ssh&lt;br /&gt;
* add line to &amp;lt;code&amp;gt;/etc/hosts&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;dpkg-reconfigure tzdata&amp;lt;/code&amp;gt;&lt;br /&gt;
* create user account, add to sudoers:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
useradd --create-home --shell /bin/bash myuser&lt;br /&gt;
usermod -aG sudo myuser&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;apt install emacs-nox nmap ntp postfix mailutils logwatch unzip zip&amp;lt;/code&amp;gt;&lt;br /&gt;
* update ssh to listen on a different port by editing &amp;lt;code&amp;gt;/lib/systemd/system/ssh.socket&amp;lt;/code&amp;gt;, then &amp;lt;code&amp;gt;systemctl daemon-reload&amp;lt;/code&amp;gt;.&lt;br /&gt;
and (carefully) to deny root access &lt;br /&gt;
* set up firewall&lt;br /&gt;
* set up backups&lt;br /&gt;
* apt-get install nginx mysql-server supervisor&lt;br /&gt;
* install docker-compose: http://docs.docker.com/compose/install/&lt;br /&gt;
* fix [[mysql]], create mysql databases and app accounts&lt;br /&gt;
* schedule nightly database snapshots&lt;br /&gt;
* set up sites in &amp;lt;code&amp;gt;/etc/nginx/sites-available&amp;lt;/code&amp;gt; and activate in &amp;lt;code&amp;gt;/etc/nginx/sites-enabled&amp;lt;/code&amp;gt;&lt;br /&gt;
* set up apps in &amp;lt;code&amp;gt;/etc/supervisor/conf.d&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== after setting up DNS name ==&lt;br /&gt;
* update hostname in /etc/hosts, /etc/hostname, run &amp;quot;hostname -F /etc/hostname&amp;quot;&lt;br /&gt;
* configure postfix&lt;br /&gt;
* make sure you receive nightly log messages&lt;/div&gt;</summary>
		<author><name>Scott</name></author>
	</entry>
	<entry>
		<id>https://wiki.scott5.org/index.php?title=How_to_set_up_a_VPS&amp;diff=1831</id>
		<title>How to set up a VPS</title>
		<link rel="alternate" type="text/html" href="https://wiki.scott5.org/index.php?title=How_to_set_up_a_VPS&amp;diff=1831"/>
		<updated>2024-10-25T18:17:20Z</updated>

		<summary type="html">&lt;p&gt;Scott: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Log in as root via ssh&lt;br /&gt;
* add line to &amp;lt;code&amp;gt;/etc/hosts&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;dpkg-reconfigure tzdata&amp;lt;/code&amp;gt;&lt;br /&gt;
* create user account, add to sudoers:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
useradd --create-home --shell /bin/bash myuser&lt;br /&gt;
usermod -aG sudo myuser&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;apt install emacs-nox nmap ntp postfix mailutils logwatch unzip zip&amp;lt;/code&amp;gt;&lt;br /&gt;
* update ssh to listen on a different port and (carefully) to deny root access &lt;br /&gt;
* set up firewall&lt;br /&gt;
* set up backups&lt;br /&gt;
* apt-get install nginx mysql-server supervisor&lt;br /&gt;
* install docker-compose: http://docs.docker.com/compose/install/&lt;br /&gt;
* fix [[mysql]], create mysql databases and app accounts&lt;br /&gt;
* schedule nightly database snapshots&lt;br /&gt;
* set up sites in &amp;lt;code&amp;gt;/etc/nginx/sites-available&amp;lt;/code&amp;gt; and activate in &amp;lt;code&amp;gt;/etc/nginx/sites-enabled&amp;lt;/code&amp;gt;&lt;br /&gt;
* set up apps in &amp;lt;code&amp;gt;/etc/supervisor/conf.d&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== after setting up DNS name ==&lt;br /&gt;
* update hostname in /etc/hosts, /etc/hostname, run &amp;quot;hostname -F /etc/hostname&amp;quot;&lt;br /&gt;
* configure postfix&lt;br /&gt;
* make sure you receive nightly log messages&lt;/div&gt;</summary>
		<author><name>Scott</name></author>
	</entry>
	<entry>
		<id>https://wiki.scott5.org/index.php?title=Git&amp;diff=1830</id>
		<title>Git</title>
		<link rel="alternate" type="text/html" href="https://wiki.scott5.org/index.php?title=Git&amp;diff=1830"/>
		<updated>2024-06-28T22:42:39Z</updated>

		<summary type="html">&lt;p&gt;Scott: /* Overwrite a single file from repository */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Initial Setup ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git config --global user.name &amp;quot;Harry Truman&amp;quot;&lt;br /&gt;
git config --global user.email &amp;quot;harry.truman@example.com&amp;quot;&lt;br /&gt;
git config --global --list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
May need to set up SSH-key authentication for gitlab.&lt;br /&gt;
&lt;br /&gt;
== Clone Repository ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone git@gitlab.com:scottcamacmartin/my_project.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Upload Existing Code Directory as Gitlab Repository ==&lt;br /&gt;
First, creat a new project on gitlab.  Then, on the local dev machine:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone git@gitlab.com:scottcamacmartin/my_project.git&lt;br /&gt;
cd my_project&lt;br /&gt;
# then copy code into new folder my_project&lt;br /&gt;
# DELETE ANY SENSITIVE PASSWORDS, ETC&lt;br /&gt;
# also set up .gitignore file&lt;br /&gt;
git status&lt;br /&gt;
git add .&lt;br /&gt;
git commit -m &amp;quot;initial commit&amp;quot;&lt;br /&gt;
git push -u origin master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Overwrite local from repository ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git fetch --all&lt;br /&gt;
git reset --hard origin/master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Overwrite a single file from repository ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git checkout HEAD~ &amp;lt;filename&amp;gt;&lt;br /&gt;
# or just write out a specific version for comparison&lt;br /&gt;
git show 7f7a8214befd1903260e6c6ae65d9158e4249881:rails/public/faq.html &amp;gt; faq.html.old&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Cheat Sheets ==&lt;br /&gt;
https://about.gitlab.com/images/press/git-cheat-sheet.pdf&lt;br /&gt;
&lt;br /&gt;
https://github.com/kenmueller/gitignore&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Git Server ==&lt;br /&gt;
https://git-scm.com/book/en/v2/Git-on-the-Server-Setting-Up-the-Server&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/git-server/bin         # refresh-auth command&lt;br /&gt;
/opt/git-server/keys        # ssh keys&lt;br /&gt;
/opt/git-server/repos       # home directory with repos&lt;br /&gt;
/opt/git-server/repos/.ssh  # authorized_users file&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@perth:/etc# grep git /etc/passwd&lt;br /&gt;
git:x:222:222:Git Service User:/opt/git-server/repos:/usr/bin/git-shell&lt;br /&gt;
root@perth:/etc# grep git /etc/group&lt;br /&gt;
git:x:222:&lt;br /&gt;
root@perth:/etc# grep git /etc/shadow&lt;br /&gt;
git:*:17767:0:99999:7:::&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@perth:/opt/git-server/bin# cat refresh-auth &lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
GIT_SERVER_DIR=/opt/git-server&lt;br /&gt;
KEY_DIR=$GIT_SERVER_DIR/keys&lt;br /&gt;
SSH_KEY_FILE=$GIT_SERVER_DIR/repos/.ssh/authorized_keys&lt;br /&gt;
SSH_KEY_PREFIX=&amp;quot;no-pty,no-port-forwarding,no-X11-forwarding,no-agent-forwarding&amp;quot;&lt;br /&gt;
&lt;br /&gt;
find $KEY_DIR -type f -exec grep -v &#039;#&#039; {} \; | awk &#039;$1&#039; | sort -u | sed -e &amp;quot;s/^/${SSH_KEY_PREFIX} /&amp;quot; &amp;gt; $SSH_KEY_FILE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@perth:/opt/git-server/keys# ls -l&lt;br /&gt;
total 16&lt;br /&gt;
drwxr-xr-x 2 root root 4096 Nov 28 16:28 dc&lt;br /&gt;
drwxr-xr-x 2 root root 4096 Nov 30 10:18 martin&lt;br /&gt;
drwxr-xr-x 2 root root 4096 Nov 28 16:28 root&lt;br /&gt;
drwxr-xr-x 2 root root 4096 Nov 28 16:28 statsuser&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@perth:/opt/git-server/keys/martin# cat adelaide &lt;br /&gt;
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDbyBYOnAoKLyNvittK+xyEt01NPnPC2XUFKz4bHeolz martin@adelaide&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Initialize repository ===&lt;br /&gt;
As root on git server:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~git&lt;br /&gt;
mkdir project.git&lt;br /&gt;
cd project.git&lt;br /&gt;
git init --bare&lt;br /&gt;
cd ..&lt;br /&gt;
chown -R git.git project.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
As developer on developer PC:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd project&lt;br /&gt;
emacs .gitignore  # include a line with &amp;quot;**/.hg&amp;quot; to exclude .hg content&lt;br /&gt;
git init&lt;br /&gt;
git add .&lt;br /&gt;
git commit -m &#039;Initial commit&#039;&lt;br /&gt;
git remote add origin git@irc-git-host:project.git&lt;br /&gt;
git push origin master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
As another user:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone git@irc-git-host:project.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Scott</name></author>
	</entry>
	<entry>
		<id>https://wiki.scott5.org/index.php?title=Mysql&amp;diff=1829</id>
		<title>Mysql</title>
		<link rel="alternate" type="text/html" href="https://wiki.scott5.org/index.php?title=Mysql&amp;diff=1829"/>
		<updated>2024-03-28T19:15:13Z</updated>

		<summary type="html">&lt;p&gt;Scott: /* Searching on three-character words */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Ubuntu setup ==&lt;br /&gt;
Have a &amp;lt;code&amp;gt;mysql&amp;lt;/code&amp;gt; root password ready to go.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install mysql-server mysql-client libmysqlclient-dev&lt;br /&gt;
apt install python3-mysqldb  # if using python to access mysql&lt;br /&gt;
mysql_secure_installation&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ERROR in UBUNTU 22.04 solved here:&lt;br /&gt;
https://www.nixcraft.com/t/mysql-failed-error-set-password-has-no-significance-for-user-root-localhost-as-the-authentication-method-used-doesnt-store-authentication-data-in-the-mysql-server-please-consider-using-alter-user/4233&lt;br /&gt;
&lt;br /&gt;
Log in as root to mysql database&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mysql -u root -p mysql&lt;br /&gt;
select * from user;&lt;br /&gt;
delete from user where host = &#039;myserver&#039;;  # not needed if secure installation completed above&lt;br /&gt;
create user barney@localhost identified by &#039;xxxxxxxx&#039;;&lt;br /&gt;
create database bookstore;&lt;br /&gt;
grant all privileges on bookstore.* to barney@localhost;  # regular account&lt;br /&gt;
grant select on bookstore.* to barney@localhost;          # read-only account&lt;br /&gt;
grant lock tables on bookstore.* to barney@localhost;     # need lock tables to run mysqldump&lt;br /&gt;
grant file on *.* to barney@localhost;                    # write output to files&lt;br /&gt;
flush privileges;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Show Permissions ==&lt;br /&gt;
Logged in as root:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
show grants for barney@localhost;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==File I/O==&lt;br /&gt;
You should have already granted &amp;quot;file&amp;quot; privileges to user:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
grant file on *.* to barney@localhost;&lt;br /&gt;
flush privileges;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To execute SQL commands in a text file (from the command line):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mysql -u barney -p bookstore &amp;lt; mycommands.sql&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To execute SQL commands in a text file (from the mysql prompt):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mysql&amp;gt; use bookstore;&lt;br /&gt;
mysql&amp;gt; source /home/barney/sql/mycommands.sql;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To read data out to a file (NOTE: The &amp;lt;code&amp;gt;mysql&amp;lt;/code&amp;gt; user can only write to the &amp;lt;code&amp;gt;/var/lib/mysql-files/&amp;lt;/code&amp;gt; directory): &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
select ... into outfile &amp;quot;/var/lib/mysql-files/goodbooks.txt&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To load a file into a table:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
load data local infile &amp;quot;/home/barney/sql/goodbooks.txt&amp;quot; into table books;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Save into a CSV file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
select * from users into outfile &#039;/tmp/users.csv&#039; fields terminated by &#039;,&#039; &lt;br /&gt;
    optionally enclosed by &#039;&amp;quot;&#039; lines terminated by &#039;\n&#039;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Backing up and restoring a database ==&lt;br /&gt;
To back up the database &amp;quot;bookstore&amp;quot; to a file sq5.sql:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
export MYSQL_PWD=XXXXX&lt;br /&gt;
mysqldump --no-tablespaces --opt bookstore &amp;gt; bookstore.sql&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
To restore a database from backup (overwrites any existing):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mysql -u root -p bookstore &amp;lt; bookstore.sql&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Searching on three-character words ==&lt;br /&gt;
* Edit &amp;lt;code&amp;gt;/etc/mysql/mysql.cnf&amp;lt;/code&amp;gt; to add this line to the &amp;lt;code&amp;gt;[mysqld]&amp;lt;/code&amp;gt; section (create section if it doesn&#039;t exist): &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[mysqld]&lt;br /&gt;
ft_min_word_len=3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Restart mysql. &lt;br /&gt;
* For each table you are doing a fulltext search on, run this command: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
repair table &amp;lt;table_name&amp;gt; quick;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Restart mysql and any dependent apps.&lt;br /&gt;
&lt;br /&gt;
== Create database/table example ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
drop database if exists edapt_quiz;&lt;br /&gt;
create database edapt_quiz;&lt;br /&gt;
use edapt_quiz;&lt;br /&gt;
&lt;br /&gt;
drop table if exists quizzes;&lt;br /&gt;
create table quizzes (&lt;br /&gt;
    id              int unsigned not null auto_increment,&lt;br /&gt;
    name            varchar(64) not null,&lt;br /&gt;
    primary key (id)&lt;br /&gt;
) engine=innodb;&lt;br /&gt;
insert into quizzes (name) values (&#039;Prodromal Questionnaire – Brief Version&#039;);&lt;br /&gt;
&lt;br /&gt;
drop table if exists questions;&lt;br /&gt;
create table questions (&lt;br /&gt;
    id              int unsigned not null auto_increment,&lt;br /&gt;
    quiz_id         int unsigned not null,&lt;br /&gt;
    sort_order      smallint,&lt;br /&gt;
    text            text,&lt;br /&gt;
    primary key (id),&lt;br /&gt;
    foreign key (quiz_id) references quizzes(id)&lt;br /&gt;
) engine=innodb;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
When attempting to load a database from a mysqldump backup, you get&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;ERROR 1227 (42000) at line 81: Access denied; you need (at least one of) the SUPER privilege(s) for this operation&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
You need to remove all DEFINER lines from the mysqldump file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sed &#039;s/DEFINER=[^*]*\*/\*/g&#039; backup.sql &amp;gt; new_backup.sql&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Scott</name></author>
	</entry>
	<entry>
		<id>https://wiki.scott5.org/index.php?title=Mysql&amp;diff=1828</id>
		<title>Mysql</title>
		<link rel="alternate" type="text/html" href="https://wiki.scott5.org/index.php?title=Mysql&amp;diff=1828"/>
		<updated>2024-03-28T19:14:29Z</updated>

		<summary type="html">&lt;p&gt;Scott: /* Searching on three-character words */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Ubuntu setup ==&lt;br /&gt;
Have a &amp;lt;code&amp;gt;mysql&amp;lt;/code&amp;gt; root password ready to go.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install mysql-server mysql-client libmysqlclient-dev&lt;br /&gt;
apt install python3-mysqldb  # if using python to access mysql&lt;br /&gt;
mysql_secure_installation&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ERROR in UBUNTU 22.04 solved here:&lt;br /&gt;
https://www.nixcraft.com/t/mysql-failed-error-set-password-has-no-significance-for-user-root-localhost-as-the-authentication-method-used-doesnt-store-authentication-data-in-the-mysql-server-please-consider-using-alter-user/4233&lt;br /&gt;
&lt;br /&gt;
Log in as root to mysql database&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mysql -u root -p mysql&lt;br /&gt;
select * from user;&lt;br /&gt;
delete from user where host = &#039;myserver&#039;;  # not needed if secure installation completed above&lt;br /&gt;
create user barney@localhost identified by &#039;xxxxxxxx&#039;;&lt;br /&gt;
create database bookstore;&lt;br /&gt;
grant all privileges on bookstore.* to barney@localhost;  # regular account&lt;br /&gt;
grant select on bookstore.* to barney@localhost;          # read-only account&lt;br /&gt;
grant lock tables on bookstore.* to barney@localhost;     # need lock tables to run mysqldump&lt;br /&gt;
grant file on *.* to barney@localhost;                    # write output to files&lt;br /&gt;
flush privileges;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Show Permissions ==&lt;br /&gt;
Logged in as root:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
show grants for barney@localhost;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==File I/O==&lt;br /&gt;
You should have already granted &amp;quot;file&amp;quot; privileges to user:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
grant file on *.* to barney@localhost;&lt;br /&gt;
flush privileges;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To execute SQL commands in a text file (from the command line):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mysql -u barney -p bookstore &amp;lt; mycommands.sql&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To execute SQL commands in a text file (from the mysql prompt):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mysql&amp;gt; use bookstore;&lt;br /&gt;
mysql&amp;gt; source /home/barney/sql/mycommands.sql;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To read data out to a file (NOTE: The &amp;lt;code&amp;gt;mysql&amp;lt;/code&amp;gt; user can only write to the &amp;lt;code&amp;gt;/var/lib/mysql-files/&amp;lt;/code&amp;gt; directory): &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
select ... into outfile &amp;quot;/var/lib/mysql-files/goodbooks.txt&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To load a file into a table:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
load data local infile &amp;quot;/home/barney/sql/goodbooks.txt&amp;quot; into table books;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Save into a CSV file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
select * from users into outfile &#039;/tmp/users.csv&#039; fields terminated by &#039;,&#039; &lt;br /&gt;
    optionally enclosed by &#039;&amp;quot;&#039; lines terminated by &#039;\n&#039;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Backing up and restoring a database ==&lt;br /&gt;
To back up the database &amp;quot;bookstore&amp;quot; to a file sq5.sql:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
export MYSQL_PWD=XXXXX&lt;br /&gt;
mysqldump --no-tablespaces --opt bookstore &amp;gt; bookstore.sql&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
To restore a database from backup (overwrites any existing):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mysql -u root -p bookstore &amp;lt; bookstore.sql&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Searching on three-character words ==&lt;br /&gt;
* Edit &amp;lt;code&amp;gt;/etc/mysql/mysql.cnf&amp;lt;/code&amp;gt; to add this line to the &amp;lt;code&amp;gt;[mysqld]&amp;lt;/code&amp;gt; section (create section if it doesn&#039;t exist): &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[mysqld]&lt;br /&gt;
ft_min_word_len=3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Restart mysql. &lt;br /&gt;
* For each table you are doing a fulltext search on, run this command: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
repair table &amp;lt;table_name&amp;gt; quick;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Create database/table example ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
drop database if exists edapt_quiz;&lt;br /&gt;
create database edapt_quiz;&lt;br /&gt;
use edapt_quiz;&lt;br /&gt;
&lt;br /&gt;
drop table if exists quizzes;&lt;br /&gt;
create table quizzes (&lt;br /&gt;
    id              int unsigned not null auto_increment,&lt;br /&gt;
    name            varchar(64) not null,&lt;br /&gt;
    primary key (id)&lt;br /&gt;
) engine=innodb;&lt;br /&gt;
insert into quizzes (name) values (&#039;Prodromal Questionnaire – Brief Version&#039;);&lt;br /&gt;
&lt;br /&gt;
drop table if exists questions;&lt;br /&gt;
create table questions (&lt;br /&gt;
    id              int unsigned not null auto_increment,&lt;br /&gt;
    quiz_id         int unsigned not null,&lt;br /&gt;
    sort_order      smallint,&lt;br /&gt;
    text            text,&lt;br /&gt;
    primary key (id),&lt;br /&gt;
    foreign key (quiz_id) references quizzes(id)&lt;br /&gt;
) engine=innodb;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
When attempting to load a database from a mysqldump backup, you get&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;ERROR 1227 (42000) at line 81: Access denied; you need (at least one of) the SUPER privilege(s) for this operation&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
You need to remove all DEFINER lines from the mysqldump file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sed &#039;s/DEFINER=[^*]*\*/\*/g&#039; backup.sql &amp;gt; new_backup.sql&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Scott</name></author>
	</entry>
	<entry>
		<id>https://wiki.scott5.org/index.php?title=Mysql&amp;diff=1827</id>
		<title>Mysql</title>
		<link rel="alternate" type="text/html" href="https://wiki.scott5.org/index.php?title=Mysql&amp;diff=1827"/>
		<updated>2024-03-28T19:08:24Z</updated>

		<summary type="html">&lt;p&gt;Scott: /* Searching on three-character words */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Ubuntu setup ==&lt;br /&gt;
Have a &amp;lt;code&amp;gt;mysql&amp;lt;/code&amp;gt; root password ready to go.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install mysql-server mysql-client libmysqlclient-dev&lt;br /&gt;
apt install python3-mysqldb  # if using python to access mysql&lt;br /&gt;
mysql_secure_installation&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ERROR in UBUNTU 22.04 solved here:&lt;br /&gt;
https://www.nixcraft.com/t/mysql-failed-error-set-password-has-no-significance-for-user-root-localhost-as-the-authentication-method-used-doesnt-store-authentication-data-in-the-mysql-server-please-consider-using-alter-user/4233&lt;br /&gt;
&lt;br /&gt;
Log in as root to mysql database&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mysql -u root -p mysql&lt;br /&gt;
select * from user;&lt;br /&gt;
delete from user where host = &#039;myserver&#039;;  # not needed if secure installation completed above&lt;br /&gt;
create user barney@localhost identified by &#039;xxxxxxxx&#039;;&lt;br /&gt;
create database bookstore;&lt;br /&gt;
grant all privileges on bookstore.* to barney@localhost;  # regular account&lt;br /&gt;
grant select on bookstore.* to barney@localhost;          # read-only account&lt;br /&gt;
grant lock tables on bookstore.* to barney@localhost;     # need lock tables to run mysqldump&lt;br /&gt;
grant file on *.* to barney@localhost;                    # write output to files&lt;br /&gt;
flush privileges;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Show Permissions ==&lt;br /&gt;
Logged in as root:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
show grants for barney@localhost;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==File I/O==&lt;br /&gt;
You should have already granted &amp;quot;file&amp;quot; privileges to user:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
grant file on *.* to barney@localhost;&lt;br /&gt;
flush privileges;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To execute SQL commands in a text file (from the command line):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mysql -u barney -p bookstore &amp;lt; mycommands.sql&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To execute SQL commands in a text file (from the mysql prompt):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mysql&amp;gt; use bookstore;&lt;br /&gt;
mysql&amp;gt; source /home/barney/sql/mycommands.sql;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To read data out to a file (NOTE: The &amp;lt;code&amp;gt;mysql&amp;lt;/code&amp;gt; user can only write to the &amp;lt;code&amp;gt;/var/lib/mysql-files/&amp;lt;/code&amp;gt; directory): &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
select ... into outfile &amp;quot;/var/lib/mysql-files/goodbooks.txt&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To load a file into a table:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
load data local infile &amp;quot;/home/barney/sql/goodbooks.txt&amp;quot; into table books;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Save into a CSV file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
select * from users into outfile &#039;/tmp/users.csv&#039; fields terminated by &#039;,&#039; &lt;br /&gt;
    optionally enclosed by &#039;&amp;quot;&#039; lines terminated by &#039;\n&#039;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Backing up and restoring a database ==&lt;br /&gt;
To back up the database &amp;quot;bookstore&amp;quot; to a file sq5.sql:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
export MYSQL_PWD=XXXXX&lt;br /&gt;
mysqldump --no-tablespaces --opt bookstore &amp;gt; bookstore.sql&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
To restore a database from backup (overwrites any existing):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mysql -u root -p bookstore &amp;lt; bookstore.sql&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Searching on three-character words ==&lt;br /&gt;
* Edit &amp;lt;code&amp;gt;/etc/mysql/conf.d/mysql.cnf&amp;lt;/code&amp;gt; to add this line to the &amp;lt;code&amp;gt;[mysqld]&amp;lt;/code&amp;gt; section: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ft_min_word_len=3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Restart mysql. &lt;br /&gt;
* For each table you are doing a fulltext search on, run this command: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
repair table &amp;lt;table_name&amp;gt; quick;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Create database/table example ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
drop database if exists edapt_quiz;&lt;br /&gt;
create database edapt_quiz;&lt;br /&gt;
use edapt_quiz;&lt;br /&gt;
&lt;br /&gt;
drop table if exists quizzes;&lt;br /&gt;
create table quizzes (&lt;br /&gt;
    id              int unsigned not null auto_increment,&lt;br /&gt;
    name            varchar(64) not null,&lt;br /&gt;
    primary key (id)&lt;br /&gt;
) engine=innodb;&lt;br /&gt;
insert into quizzes (name) values (&#039;Prodromal Questionnaire – Brief Version&#039;);&lt;br /&gt;
&lt;br /&gt;
drop table if exists questions;&lt;br /&gt;
create table questions (&lt;br /&gt;
    id              int unsigned not null auto_increment,&lt;br /&gt;
    quiz_id         int unsigned not null,&lt;br /&gt;
    sort_order      smallint,&lt;br /&gt;
    text            text,&lt;br /&gt;
    primary key (id),&lt;br /&gt;
    foreign key (quiz_id) references quizzes(id)&lt;br /&gt;
) engine=innodb;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
When attempting to load a database from a mysqldump backup, you get&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;ERROR 1227 (42000) at line 81: Access denied; you need (at least one of) the SUPER privilege(s) for this operation&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
You need to remove all DEFINER lines from the mysqldump file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sed &#039;s/DEFINER=[^*]*\*/\*/g&#039; backup.sql &amp;gt; new_backup.sql&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Scott</name></author>
	</entry>
	<entry>
		<id>https://wiki.scott5.org/index.php?title=Mediawiki&amp;diff=1826</id>
		<title>Mediawiki</title>
		<link rel="alternate" type="text/html" href="https://wiki.scott5.org/index.php?title=Mediawiki&amp;diff=1826"/>
		<updated>2024-03-24T15:37:30Z</updated>

		<summary type="html">&lt;p&gt;Scott: /* Install on Ubuntu */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{lowercase title}}&lt;br /&gt;
&lt;br /&gt;
== Install on Ubuntu ==&lt;br /&gt;
* ASSUMPTION: MySQL is already installed&lt;br /&gt;
* install the following packages:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install imagemagick php-cli php-fpm php-intl php-mbstring php-mysql php-xml&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* If the web server is running under a separate deploy user, you will need to edit &amp;lt;code&amp;gt;/etc/php/7.?/fpm/pool.d/www.conf&amp;lt;/code&amp;gt; and change the user for &amp;lt;code&amp;gt;listen.owner&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;listen.group&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Upgrade from tarball ==&lt;br /&gt;
* read all Release Notes&lt;br /&gt;
* download new tarball from http://www.mediawiki.org/wiki/Download&lt;br /&gt;
* unpack in deploy@myserver:wiki/&lt;br /&gt;
* copy over LocalSettings.php (which is a pointer to ~/wiki/var/LocalSettings.php)&lt;br /&gt;
* make images point to ../var/images&lt;br /&gt;
* in extensions, make links to folders in ~/wiki/var/extensions&lt;br /&gt;
* make a link to your ../var/my-logo-image.png file (and make sure $wgLogo matches in LocalSettings.php)&lt;br /&gt;
* run the database update script:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
php maintenance/update.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Increase the maximum upload file size ==&lt;br /&gt;
* Edit &amp;lt;code&amp;gt;/etc/php5/apache2/php.ini&amp;lt;/code&amp;gt; to change this line:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
; Maximum allowed size for uploaded files.&lt;br /&gt;
upload_max_filesize = 200M&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* restart apache&lt;br /&gt;
&lt;br /&gt;
== Allow additional file types for upload ==&lt;br /&gt;
* Edit &amp;lt;code&amp;gt;/etc/mediawiki/LocalSettings.php&amp;lt;/code&amp;gt; and add something like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$wgFileExtensions = array(&#039;png&#039;, &#039;gif&#039;, &#039;jpg&#039;, &#039;jpeg&#039;, &#039;doc&#039;, &#039;xls&#039;, &#039;pdf&#039;, &#039;txt&#039;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Add your own logo image ==&lt;br /&gt;
* create a 135x135-pixel logo image and save as png&lt;br /&gt;
* copy the png file to &amp;lt;code&amp;gt;/var/lib/mediawiki1.10/skins/common/images&amp;lt;/code&amp;gt;&lt;br /&gt;
* edit &amp;lt;code&amp;gt;/etc/mediawiki1.10/LocalSettings.php&amp;lt;/code&amp;gt; to include this line:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$wgLogo = &amp;quot;/mediawiki/skins/common/images/mylogo.png&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Clean up the navigation sidebar ==&lt;br /&gt;
* log in as the admin user&lt;br /&gt;
* edit the wiki page http://localhost/mediawiki/index.php/MediaWiki:Sidebar&lt;br /&gt;
&lt;br /&gt;
== Lowercase Page Titles ==&lt;br /&gt;
* This helps you fix the titles of pages like &amp;quot;iPhone&amp;quot; that mediawiki automatically converts to &amp;quot;IPhone&amp;quot;.&lt;br /&gt;
* install and enable the ParserFunctions extension:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get install mediawiki-extensions (if not already installed)&lt;br /&gt;
mwenext ParserFunctions.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* open the page Template:Lowercase_title for editing.&lt;br /&gt;
* add this code:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;span&amp;gt;{{DISPLAYTITLE:{{#if:{{NAMESPACE}}|{{NAMESPACE}}:|}}{{lcfirst:{{PAGENAME}}}}}}&amp;lt;/span&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{documentation}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
This can be found on Wikipedia: http://en.wikipedia.org/w/index.php?title=Template:Lowercase_title&amp;amp;action=edit&lt;br /&gt;
* add this line to the top of each affected page:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{lowercase title}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Syntax highlighting ==&lt;br /&gt;
Use the GeSHi extension included with &amp;lt;code&amp;gt;mediawiki-extensions&amp;lt;/code&amp;gt;: http://www.mediawiki.org/wiki/Extension:SyntaxHighlight_GeSHi&lt;br /&gt;
&lt;br /&gt;
== Custom edit buttons ==&lt;br /&gt;
* download the icons you want to use: http://commons.wikimedia.org/wiki/Mediawiki_edit_toolbar &lt;br /&gt;
* download the icons in the images tree and find out where they ended up&lt;br /&gt;
* open the MediaWiki:Common.js page on your wiki for editing and add something like this&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (mwCustomEditButtons) {&lt;br /&gt;
 &lt;br /&gt;
   mwCustomEditButtons[mwCustomEditButtons.length] = {&lt;br /&gt;
     &amp;quot;imageFile&amp;quot;: &amp;quot;images/2/23/Button_code.png&amp;quot;,&lt;br /&gt;
     &amp;quot;speedTip&amp;quot;: &amp;quot;inline &amp;lt;code&amp;gt; tag&amp;quot;,&lt;br /&gt;
     &amp;quot;tagOpen&amp;quot;: &amp;quot;&amp;lt;code&amp;gt;&amp;quot;,&lt;br /&gt;
     &amp;quot;tagClose&amp;quot;: &amp;quot;&amp;lt;/code&amp;gt;&amp;quot;,&lt;br /&gt;
     &amp;quot;sampleText&amp;quot;: &amp;quot;Insert code here&amp;quot;};&lt;br /&gt;
 &lt;br /&gt;
  mwCustomEditButtons[mwCustomEditButtons.length] = {&lt;br /&gt;
     &amp;quot;imageFile&amp;quot;: &amp;quot;images/3/3c/Button_pre.png&amp;quot;,&lt;br /&gt;
     &amp;quot;speedTip&amp;quot;: &amp;quot;block &amp;lt;pre&amp;gt; tag&amp;quot;,&lt;br /&gt;
     &amp;quot;tagOpen&amp;quot;: &amp;quot;&amp;lt;pre&amp;gt;\n&amp;quot;,&lt;br /&gt;
     &amp;quot;tagClose&amp;quot;: &amp;quot;\n&amp;lt;/pre&amp;gt;&amp;quot;,&lt;br /&gt;
     &amp;quot;sampleText&amp;quot;: &amp;quot;Insert code here&amp;quot;}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* hold down the shift key and hit refresh on the browser to get the page to completely reload&lt;br /&gt;
&lt;br /&gt;
== Delete History ==&lt;br /&gt;
* Make sure the &amp;lt;code&amp;gt;php5-cli&amp;lt;/code&amp;gt; package is installed.&lt;br /&gt;
* cd to &amp;lt;code&amp;gt;/usr/share/mediawiki/maintenance&amp;lt;/code&amp;gt;&lt;br /&gt;
* run this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo php deleteOldRevisions.php --delete&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Back up the wiki ==&lt;br /&gt;
Use a command like this to dump the wiki database to a flat file: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/usr/bin/mysqldump --opt -u barney -pXXXXXXXX wikidb &amp;gt; /backup/wikidb.sql&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
May need this command in &amp;lt;code&amp;gt;mysql&amp;lt;/code&amp;gt; to get it to work: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
grant lock tables on *.* to barney@localhost;&lt;br /&gt;
flush privileges;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== OLD ==&lt;br /&gt;
&lt;br /&gt;
=== Setup ===&lt;br /&gt;
On Ubuntu, install the &amp;lt;code&amp;gt;mediawiki&amp;lt;/code&amp;gt; package. May also want &amp;lt;code&amp;gt;mediawiki-extensions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;mediawiki-math&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
https://help.ubuntu.com/community/MediaWiki&lt;br /&gt;
* uncomment alias line of &amp;lt;code&amp;gt;/etc/apache2/conf.d/mediawiki1.10.conf&amp;lt;/code&amp;gt;&lt;br /&gt;
* restart apache2&lt;br /&gt;
* open a browser window and visit http://localhost/mediawiki&lt;br /&gt;
* fill out installation form&lt;br /&gt;
* move &amp;lt;code&amp;gt;/var/lib/mediawiki1.10/config/LocalSettings.php&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;/etc/mediawiki1.10/&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Scott</name></author>
	</entry>
	<entry>
		<id>https://wiki.scott5.org/index.php?title=Python_Cryptography_Tools&amp;diff=1825</id>
		<title>Python Cryptography Tools</title>
		<link rel="alternate" type="text/html" href="https://wiki.scott5.org/index.php?title=Python_Cryptography_Tools&amp;diff=1825"/>
		<updated>2024-02-09T00:15:08Z</updated>

		<summary type="html">&lt;p&gt;Scott: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Encoding ==&lt;br /&gt;
Integers can be &#039;&#039;&#039;encoded&#039;&#039;&#039; as either binary, decimal, hexadecimal, or Base64 (among others).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; bin(95616)&lt;br /&gt;
&#039;0b10111010110000000&#039;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; hex(95616)&lt;br /&gt;
&#039;0x17580&#039;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; import base64&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; base64.b64encode(95616)&lt;br /&gt;
TypeError: a bytes-like object is required, not &#039;int&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Converting to Bytes ==&lt;br /&gt;
The most straightforward way to convert number-like objects into bytes-like objects seems to involve converting to string first.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; bytes(bin(95616), &#039;ascii&#039;)&lt;br /&gt;
b&#039;0b10111010110000000&#039;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; bytes(hex(95616), &#039;ascii&#039;)&lt;br /&gt;
b&#039;0x17580&#039;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; base64.b64encode(bytes(str(95616), &#039;ascii&#039;))&lt;br /&gt;
b&#039;OTU2MTY=&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/Base64 Base64] uses 64 characters (and a padding symbol) to represent numbers in groups of six bits.  These don&#039;t line up nicely with sequences of bytes.&lt;br /&gt;
&lt;br /&gt;
== XOR ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
decoded_hex1 = bytes.fromhex(&amp;quot;1c0111001f010100061a024b53535009181c&amp;quot;)&lt;br /&gt;
decoded_hex2 = bytes.fromhex(&amp;quot;686974207468652062756c6c277320657965&amp;quot;)&lt;br /&gt;
xor_result = bytes(a ^ b for a, b in zip(decoded_hex1, decoded_hex2))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hamming Distance ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def hammingDistance(bytes1, bytes2):&lt;br /&gt;
	distance = 0&lt;br /&gt;
	for a, b in zip(bytes1, bytes2):&lt;br /&gt;
		xor_result = a ^ b&lt;br /&gt;
		distance += bin(xor_result).count(&amp;quot;1&amp;quot;)&lt;br /&gt;
	return distance&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Scott</name></author>
	</entry>
	<entry>
		<id>https://wiki.scott5.org/index.php?title=Python_Cryptography_Tools&amp;diff=1824</id>
		<title>Python Cryptography Tools</title>
		<link rel="alternate" type="text/html" href="https://wiki.scott5.org/index.php?title=Python_Cryptography_Tools&amp;diff=1824"/>
		<updated>2024-02-09T00:13:05Z</updated>

		<summary type="html">&lt;p&gt;Scott: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Encoding ==&lt;br /&gt;
Integers can be &#039;&#039;&#039;encoded&#039;&#039;&#039; as either binary, decimal, hexadecimal, or Base64 (among others).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; bin(95616)&lt;br /&gt;
&#039;0b10111010110000000&#039;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; hex(95616)&lt;br /&gt;
&#039;0x17580&#039;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; import base64&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; base64.b64encode(95616)&lt;br /&gt;
TypeError: a bytes-like object is required, not &#039;int&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Converting to Bytes ==&lt;br /&gt;
The most straightforward way to convert number-like objects into bytes-like objects seems to involve converting to string first.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; bytes(bin(95616), &#039;ascii&#039;)&lt;br /&gt;
b&#039;0b10111010110000000&#039;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; bytes(hex(95616), &#039;ascii&#039;)&lt;br /&gt;
b&#039;0x17580&#039;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; base64.b64encode(bytes(str(95616), &#039;ascii&#039;))&lt;br /&gt;
b&#039;OTU2MTY=&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/Base64 Base64] uses 64 characters (and a padding symbol) to represent numbers in groups of six bits.  These don&#039;t line up nicely with sequences of bytes.&lt;br /&gt;
&lt;br /&gt;
== XOR ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
decoded_hex1 = bytes.fromhex(&amp;quot;1c0111001f010100061a024b53535009181c&amp;quot;)&lt;br /&gt;
decoded_hex2 = bytes.fromhex(&amp;quot;686974207468652062756c6c277320657965&amp;quot;)&lt;br /&gt;
xor_result = bytes(a ^ b for a, b in zip(decoded_hex1, decoded_hex2))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Scott</name></author>
	</entry>
	<entry>
		<id>https://wiki.scott5.org/index.php?title=Python_Cryptography_Tools&amp;diff=1823</id>
		<title>Python Cryptography Tools</title>
		<link rel="alternate" type="text/html" href="https://wiki.scott5.org/index.php?title=Python_Cryptography_Tools&amp;diff=1823"/>
		<updated>2024-02-08T23:52:45Z</updated>

		<summary type="html">&lt;p&gt;Scott: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Encoding ==&lt;br /&gt;
Integers can be &#039;&#039;&#039;encoded&#039;&#039;&#039; as either binary, decimal, hexadecimal, or Base64 (among others).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; bin(95616)&lt;br /&gt;
&#039;0b10111010110000000&#039;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; hex(95616)&lt;br /&gt;
&#039;0x17580&#039;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; import base64&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; base64.b64encode(95616)&lt;br /&gt;
TypeError: a bytes-like object is required, not &#039;int&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Converting to Bytes ==&lt;br /&gt;
The most straightforward way to convert number-like objects into bytes-like objects seems to involve converting to string first.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; bytes(bin(95616), &#039;ascii&#039;)&lt;br /&gt;
b&#039;0b10111010110000000&#039;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; bytes(hex(95616), &#039;ascii&#039;)&lt;br /&gt;
b&#039;0x17580&#039;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; base64.b64encode(bytes(str(95616), &#039;ascii&#039;))&lt;br /&gt;
b&#039;OTU2MTY=&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/Base64 Base64] uses 64 characters (and a padding symbol) to represent numbers in groups of six bits.  These don&#039;t line up nicely with sequences of bytes.&lt;/div&gt;</summary>
		<author><name>Scott</name></author>
	</entry>
	<entry>
		<id>https://wiki.scott5.org/index.php?title=Python_Cryptography_Tools&amp;diff=1822</id>
		<title>Python Cryptography Tools</title>
		<link rel="alternate" type="text/html" href="https://wiki.scott5.org/index.php?title=Python_Cryptography_Tools&amp;diff=1822"/>
		<updated>2024-02-08T23:51:59Z</updated>

		<summary type="html">&lt;p&gt;Scott: /* Converting to Bytes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Encoding ==&lt;br /&gt;
Integers can be &#039;&#039;&#039;encoded&#039;&#039;&#039; as either binary, decimal, hexadecimal, or Base64 (among others).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; bin(95616)&lt;br /&gt;
&#039;0b10111010110000000&#039;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; hex(95616)&lt;br /&gt;
&#039;0x17580&#039;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; import base64&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; base64.b64encode(95616)&lt;br /&gt;
TypeError: a bytes-like object is required, not &#039;int&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Converting to Bytes ==&lt;br /&gt;
The most straightforward way to convert number-like objects into bytes-like objects seems to involve converting to string first.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; bytes(bin(95616), &#039;ascii&#039;)&lt;br /&gt;
b&#039;0b10111010110000000&#039;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; bytes(hex(95616), &#039;ascii&#039;)&lt;br /&gt;
b&#039;0x17580&#039;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; base64.b64encode(bytes(str(95616), &#039;ascii&#039;))&lt;br /&gt;
b&#039;OTU2MTY=&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Base64 uses 64 characters (and a padding symbol) to represent numbers in groups of six bits.  These don&#039;t line up nicely with sequences of bytes.&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/Base64 Base64 - Wikipedia]&lt;/div&gt;</summary>
		<author><name>Scott</name></author>
	</entry>
	<entry>
		<id>https://wiki.scott5.org/index.php?title=Python_Cryptography_Tools&amp;diff=1821</id>
		<title>Python Cryptography Tools</title>
		<link rel="alternate" type="text/html" href="https://wiki.scott5.org/index.php?title=Python_Cryptography_Tools&amp;diff=1821"/>
		<updated>2024-02-08T23:36:40Z</updated>

		<summary type="html">&lt;p&gt;Scott: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Encoding ==&lt;br /&gt;
Integers can be &#039;&#039;&#039;encoded&#039;&#039;&#039; as either binary, decimal, hexadecimal, or Base64 (among others).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; bin(95616)&lt;br /&gt;
&#039;0b10111010110000000&#039;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; hex(95616)&lt;br /&gt;
&#039;0x17580&#039;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; import base64&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; base64.b64encode(95616)&lt;br /&gt;
TypeError: a bytes-like object is required, not &#039;int&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Converting to Bytes ==&lt;br /&gt;
The most straightforward way to convert number-like objects into bytes-like objects seems to involve converting to string first.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; bytes(bin(95616), &#039;ascii&#039;)&lt;br /&gt;
b&#039;0b10111010110000000&#039;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; bytes(hex(95616), &#039;ascii&#039;)&lt;br /&gt;
b&#039;0x17580&#039;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; base64.b64encode(bytes(str(95616), &#039;ascii&#039;))&lt;br /&gt;
b&#039;OTU2MTY=&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Scott</name></author>
	</entry>
	<entry>
		<id>https://wiki.scott5.org/index.php?title=Python_Cryptography_Tools&amp;diff=1820</id>
		<title>Python Cryptography Tools</title>
		<link rel="alternate" type="text/html" href="https://wiki.scott5.org/index.php?title=Python_Cryptography_Tools&amp;diff=1820"/>
		<updated>2024-02-08T23:18:18Z</updated>

		<summary type="html">&lt;p&gt;Scott: /* Encoding */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Encoding ==&lt;br /&gt;
Integers can be &#039;&#039;&#039;encoded&#039;&#039;&#039; as either binary, decimal, hexadecimal, or Base64 (among others).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; bin(95616)&lt;br /&gt;
&#039;0b10111010110000000&#039;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; hex(95616)&lt;br /&gt;
&#039;0x17580&#039;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; import base64&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; base64.b64encode(95616)&lt;br /&gt;
TypeError: a bytes-like object is required, not &#039;int&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Scott</name></author>
	</entry>
	<entry>
		<id>https://wiki.scott5.org/index.php?title=Python_Cryptography_Tools&amp;diff=1819</id>
		<title>Python Cryptography Tools</title>
		<link rel="alternate" type="text/html" href="https://wiki.scott5.org/index.php?title=Python_Cryptography_Tools&amp;diff=1819"/>
		<updated>2024-02-08T23:17:57Z</updated>

		<summary type="html">&lt;p&gt;Scott: Created page with &amp;quot;== Encoding == Integers can be &amp;#039;&amp;#039;&amp;#039;encoded&amp;#039;&amp;#039;&amp;#039; as either binary, decimal, hexadecimal, or Base64 (among others). &amp;lt;pre&amp;gt; &amp;gt;&amp;gt;&amp;gt; bin(95616) &amp;#039;0b10111010110000000&amp;#039; &amp;gt;&amp;gt;&amp;gt; hex(95616) &amp;#039;0x17580&amp;#039; &amp;gt;&amp;gt;&amp;gt; import base64 &amp;gt;&amp;gt;&amp;gt; base64.b64encode(95616) ... TypeError: a bytes-like object is required, not &amp;#039;int&amp;#039; &amp;lt;/pre&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Encoding ==&lt;br /&gt;
Integers can be &#039;&#039;&#039;encoded&#039;&#039;&#039; as either binary, decimal, hexadecimal, or Base64 (among others).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; bin(95616)&lt;br /&gt;
&#039;0b10111010110000000&#039;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; hex(95616)&lt;br /&gt;
&#039;0x17580&#039;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; import base64&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; base64.b64encode(95616)&lt;br /&gt;
...&lt;br /&gt;
TypeError: a bytes-like object is required, not &#039;int&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Scott</name></author>
	</entry>
	<entry>
		<id>https://wiki.scott5.org/index.php?title=Main_Page&amp;diff=1818</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.scott5.org/index.php?title=Main_Page&amp;diff=1818"/>
		<updated>2024-02-08T23:11:11Z</updated>

		<summary type="html">&lt;p&gt;Scott: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
== Programming ==&lt;br /&gt;
{|&lt;br /&gt;
|width=&amp;quot;120px&amp;quot;|&lt;br /&gt;
| |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;bash&#039;&#039;&#039;&lt;br /&gt;
|[[bash|Notes]]&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;C/C++ &#039;&#039;&#039;&lt;br /&gt;
|[[C Basics]] | [[C++ Basics]] | [[C++ I/O]] | [[CUDA C]] | [[Objective C]] | [[iPhone]]&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Go&#039;&#039;&#039;&lt;br /&gt;
|[[Go Basics|Basics]] | [[Go Strings|Strings]]&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;HTML and CSS&#039;&#039;&#039;&lt;br /&gt;
|[[HTML and CSS|Notes]]&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Java&#039;&#039;&#039;&lt;br /&gt;
|[[Java Basics|Basics]] | [[Java I/O|I/O]] | [[Java Objects|Objects]] | [[Java Properties Files|Properties Files]] | [[Java System Calls|System Calls]] | [[log4j]]&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;JavaScript&#039;&#039;&#039;&lt;br /&gt;
|[[JavaScript Basics|Basics]] | [[AngularJS]] | [[jQuery]] | [[JavaScript mailto Trick]] | [[Dojo Basics]] | [[Dojo Data Stores]] | [[E4X]] | [[Prototype]]&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Matlab&#039;&#039;&#039;&lt;br /&gt;
|[[Matlab|Basics]]&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Perl&#039;&#039;&#039;&lt;br /&gt;
|[[Perl Basics|Basics]] | [[Perl I/O|I/O]] | [[Perl Command-Line Arguments|Command-Line Arguments]] | [[Perl Subroutines|Subroutines]] | [[Perl Regular Expressions|Regular Expressions]] | [[Installing Perl Modules|Installing Modules]] | [[Example Perl Scripts|Example Scripts]]&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PHP&#039;&#039;&#039;&lt;br /&gt;
|[[PHP|Basics]]&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Python&#039;&#039;&#039;&lt;br /&gt;
|[[Python Basics|Basics]] | [[Python I/O|I/O]] | [[Python Modules|Modules]] | [[Python Regular Expressions|Regular Expressions]] | [[Python Date and Time|Date and Time]] | [[Python System Calls|System Calls]] | [[matplotlib]] | [[scipy]] | [[Python Curses|curses]]&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Python3&#039;&#039;&#039;&lt;br /&gt;
|[[Python3 Basics|Basics]] | [[Python 3 I/O|I/O]] | [[Python Cryptography Tools]]&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;R&#039;&#039;&#039;&lt;br /&gt;
|[[R Basics|Basics]] | [[R Graphics|Graphics]] | [[R I/O|I/O]] | [[R Packages|Packages]] | [[R Statistics|Statistics]]&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Ruby&#039;&#039;&#039;&lt;br /&gt;
|[[Ruby Basics|Basics]] | [[Ruby Classes and Modules|Classes and Modules]] | [[Ruby Data Structures|Data Structures]] | [[Ruby I/O|I/O]] | [[RVM]]&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Ruby on Rails&#039;&#039;&#039;&lt;br /&gt;
|[[Rails Basics|Basics]] | [[Rails Form Examples]] | [[Rails 4 Notes]] | [[Nginx, Passenger, and Rails]]&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Rails 3&#039;&#039;&#039;&lt;br /&gt;
|[[Rails 3 Basics|Basics]] | [[Rails 3 Model|Model]] | [[Rails 3 View|View]] | [[Rails 3 Controller|Controller]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Packages and Commands ==&lt;br /&gt;
[[7zip]]      |&lt;br /&gt;
[[apache]]    | &lt;br /&gt;
[[autofs]]    | &lt;br /&gt;
[[awk]]       | &lt;br /&gt;
[[awstats]]   |&lt;br /&gt;
[[ccrypt]]    | &lt;br /&gt;
[[certbot]]   |&lt;br /&gt;
[[chkconfig]] | &lt;br /&gt;
[[crontab]]   |&lt;br /&gt;
[[date]]      | &lt;br /&gt;
[[dd]]        | &lt;br /&gt;
[[diff]]      | &lt;br /&gt;
[[dirvish]]   | &lt;br /&gt;
[[docker]]&lt;br /&gt;
&lt;br /&gt;
[[emacs]]     |&lt;br /&gt;
[[fastcgi++]] | &lt;br /&gt;
[[find]]      |&lt;br /&gt;
[[gimp]]      |&lt;br /&gt;
[[git]]       |&lt;br /&gt;
[[gnuplot]]   |&lt;br /&gt;
[[goaccess]]  |&lt;br /&gt;
[[gpg]]       |&lt;br /&gt;
[[iozone]]    | &lt;br /&gt;
[[iptables]]  | &lt;br /&gt;
[[locate]]    |&lt;br /&gt;
[[mail]]        | &lt;br /&gt;
[[mediawiki]]   &lt;br /&gt;
&lt;br /&gt;
[[mercurial]]   | &lt;br /&gt;
[[mtr]]         |&lt;br /&gt;
[[mysql]]       |&lt;br /&gt;
[[netplan]]     |&lt;br /&gt;
[[nfs4]]        |&lt;br /&gt;
[[nginx]]       |&lt;br /&gt;
[[openssl]]     |&lt;br /&gt;
[[postgresql]]  |&lt;br /&gt;
[[ps]]          | &lt;br /&gt;
[[quota]]       |&lt;br /&gt;
[[rbenv]]       |&lt;br /&gt;
[[rsync]]&lt;br /&gt;
&lt;br /&gt;
[[screen]]      |&lt;br /&gt;
[[sed]]         | &lt;br /&gt;
[[smartctl]]    | &lt;br /&gt;
[[sort]]        | &lt;br /&gt;
[[split]]       |&lt;br /&gt;
[[ssh]]         | &lt;br /&gt;
[[Sublime Text|subl]]  |&lt;br /&gt;
[[subversion]]  |&lt;br /&gt;
[[supervisor]]  |&lt;br /&gt;
[[systemd]]  |&lt;br /&gt;
[[tar]]         | &lt;br /&gt;
[[thin]]        | &lt;br /&gt;
[[tr]]&lt;br /&gt;
&lt;br /&gt;
[[ufw]]         |&lt;br /&gt;
[[update-rc.d]] | &lt;br /&gt;
[[usermod]]     |&lt;br /&gt;
[[vi]]          | &lt;br /&gt;
[[virtualbox]]  |&lt;br /&gt;
[[xargs]]       | &lt;br /&gt;
[[xsendfile]]   | &lt;br /&gt;
[[youtube]]     | &lt;br /&gt;
[[yum]]         | &lt;br /&gt;
[[zfs]]         | &lt;br /&gt;
[[zip]]&lt;br /&gt;
&lt;br /&gt;
== Linux How-To ==&lt;br /&gt;
[[How to set up two-factor authentication|2FA (two-factor authentication)]]      |&lt;br /&gt;
[[How to add a new disk drive|add a new disk drive]]                             | &lt;br /&gt;
[[How to back up and restore a partition|back up and restore a partition]]       | &lt;br /&gt;
[[How to burn a DVD|burn a DVD]]                                &lt;br /&gt;
&lt;br /&gt;
[[How to change a server&#039;s hostname|change a server&#039;s hostname]]                 |&lt;br /&gt;
[[Linux file compression|compress/decompress files and directories]]             |&lt;br /&gt;
[[How to create an ISO file from a CD-ROM|create an ISO file from a CD-ROM]]     &lt;br /&gt;
&lt;br /&gt;
[[How to find a MAC address|find a MAC address]]                                 |&lt;br /&gt;
[[How to find an executable|find an executable]]                                 | &lt;br /&gt;
[[How to free kernel memory|free kernel memory]]                                 |&lt;br /&gt;
[[How to interrogate a computer&#039;s hardware|interrogate a computer&#039;s hardware]]&lt;br /&gt;
&lt;br /&gt;
[[How to manage quotas|manage quotas]]                                           |&lt;br /&gt;
[[How to monitor performance|monitor performance]]                               |&lt;br /&gt;
[[How to mount an ISO|mount an ISO]]                                             | &lt;br /&gt;
[[How to mount an LVM partition|mount an LVM partition]]                         |&lt;br /&gt;
[[How to optimize a solid state drive|optimize a solid state drive]]             &lt;br /&gt;
&lt;br /&gt;
[[How to repair GRUB|repair GRUB]]                                               |&lt;br /&gt;
[[How to re-create /dev/null|re-create &amp;lt;code&amp;gt;/dev/null&amp;lt;/code&amp;gt;]]                  |&lt;br /&gt;
[[How to set up Ubuntu Server|set up Ubuntu Server]]                             |&lt;br /&gt;
[[How to set up Ubuntu Desktop|set up Ubuntu Desktop]]                           |&lt;br /&gt;
[[How to set up a VPS|set up VPS]]                                               &lt;br /&gt;
&lt;br /&gt;
[[Ubuntu keyboard shortcuts]]                                                    |&lt;br /&gt;
[[How to use a tape drive|use a tape drive]]                                     |&lt;br /&gt;
[[How to wipe a hard drive|wipe a hard drive]]&lt;br /&gt;
&lt;br /&gt;
== Mac and Windows ==&lt;br /&gt;
&#039;&#039;&#039;Mac&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Mac Orientation]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Windows access control lists|access control lists]] | [[Windows administrative login|administrative login]] | [[Windows file sharing|file sharing]] | [[Windows minimum hardware requirements|minimum hardware requirements]] | [[Windows offline files|offline files]]&lt;br /&gt;
&lt;br /&gt;
[[Recover files from a non-booting Windows PC|recover files]] | [[Windows remote desktop|remote desktop]] | [[Windows security|security]] | [[Windows services|services]] | [[Windows shell programming|shell programming]] | [[Windows troubleshoot network connection|troubleshoot network connection]] | [[Windows wisdom|wisdom]]&lt;br /&gt;
&lt;br /&gt;
== Math ==&lt;br /&gt;
[[Exponential Moving Average]] | [[Statistics]]&lt;br /&gt;
&lt;br /&gt;
== Biology ==&lt;br /&gt;
[[Brain]] | [[MRI]] | [[fMRI]] | [[Bioinformatics]]&lt;br /&gt;
&lt;br /&gt;
== Books ==&lt;br /&gt;
[[Guide to the Good Life]] | [[How We Decide]] | [[Logic of Life]] | [[New Abs Diet]] | [[Parenting]] &lt;br /&gt;
&lt;br /&gt;
[[Power of Habit]] | [[Predictably Irrational]] | [[Run]] | [[Run Faster]] | [[Sapiens]] | [[Spark]] | [[Total Heart Rate Training]]&lt;br /&gt;
&lt;br /&gt;
== Other ==&lt;br /&gt;
[[Wiki Formatting Cheat Sheet]] | [[Recipes]] | [[Diet]] | [[Quotes]] | [[Alberto Salazar&#039;s Ten Golden Rules]]&lt;br /&gt;
| [[Buddhism]] | [[Favorite Booze]]&lt;/div&gt;</summary>
		<author><name>Scott</name></author>
	</entry>
	<entry>
		<id>https://wiki.scott5.org/index.php?title=Git&amp;diff=1817</id>
		<title>Git</title>
		<link rel="alternate" type="text/html" href="https://wiki.scott5.org/index.php?title=Git&amp;diff=1817"/>
		<updated>2024-01-24T20:02:40Z</updated>

		<summary type="html">&lt;p&gt;Scott: /* Overwrite local from repository */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Initial Setup ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git config --global user.name &amp;quot;Harry Truman&amp;quot;&lt;br /&gt;
git config --global user.email &amp;quot;harry.truman@example.com&amp;quot;&lt;br /&gt;
git config --global --list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
May need to set up SSH-key authentication for gitlab.&lt;br /&gt;
&lt;br /&gt;
== Clone Repository ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone git@gitlab.com:scottcamacmartin/my_project.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Upload Existing Code Directory as Gitlab Repository ==&lt;br /&gt;
First, creat a new project on gitlab.  Then, on the local dev machine:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone git@gitlab.com:scottcamacmartin/my_project.git&lt;br /&gt;
cd my_project&lt;br /&gt;
# then copy code into new folder my_project&lt;br /&gt;
# DELETE ANY SENSITIVE PASSWORDS, ETC&lt;br /&gt;
# also set up .gitignore file&lt;br /&gt;
git status&lt;br /&gt;
git add .&lt;br /&gt;
git commit -m &amp;quot;initial commit&amp;quot;&lt;br /&gt;
git push -u origin master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Overwrite local from repository ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git fetch --all&lt;br /&gt;
git reset --hard origin/master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Overwrite a single file from repository ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git checkout HEAD~ &amp;lt;filename&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Cheat Sheets ==&lt;br /&gt;
https://about.gitlab.com/images/press/git-cheat-sheet.pdf&lt;br /&gt;
&lt;br /&gt;
https://github.com/kenmueller/gitignore&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Git Server ==&lt;br /&gt;
https://git-scm.com/book/en/v2/Git-on-the-Server-Setting-Up-the-Server&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/git-server/bin         # refresh-auth command&lt;br /&gt;
/opt/git-server/keys        # ssh keys&lt;br /&gt;
/opt/git-server/repos       # home directory with repos&lt;br /&gt;
/opt/git-server/repos/.ssh  # authorized_users file&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@perth:/etc# grep git /etc/passwd&lt;br /&gt;
git:x:222:222:Git Service User:/opt/git-server/repos:/usr/bin/git-shell&lt;br /&gt;
root@perth:/etc# grep git /etc/group&lt;br /&gt;
git:x:222:&lt;br /&gt;
root@perth:/etc# grep git /etc/shadow&lt;br /&gt;
git:*:17767:0:99999:7:::&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@perth:/opt/git-server/bin# cat refresh-auth &lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
GIT_SERVER_DIR=/opt/git-server&lt;br /&gt;
KEY_DIR=$GIT_SERVER_DIR/keys&lt;br /&gt;
SSH_KEY_FILE=$GIT_SERVER_DIR/repos/.ssh/authorized_keys&lt;br /&gt;
SSH_KEY_PREFIX=&amp;quot;no-pty,no-port-forwarding,no-X11-forwarding,no-agent-forwarding&amp;quot;&lt;br /&gt;
&lt;br /&gt;
find $KEY_DIR -type f -exec grep -v &#039;#&#039; {} \; | awk &#039;$1&#039; | sort -u | sed -e &amp;quot;s/^/${SSH_KEY_PREFIX} /&amp;quot; &amp;gt; $SSH_KEY_FILE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@perth:/opt/git-server/keys# ls -l&lt;br /&gt;
total 16&lt;br /&gt;
drwxr-xr-x 2 root root 4096 Nov 28 16:28 dc&lt;br /&gt;
drwxr-xr-x 2 root root 4096 Nov 30 10:18 martin&lt;br /&gt;
drwxr-xr-x 2 root root 4096 Nov 28 16:28 root&lt;br /&gt;
drwxr-xr-x 2 root root 4096 Nov 28 16:28 statsuser&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@perth:/opt/git-server/keys/martin# cat adelaide &lt;br /&gt;
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDbyBYOnAoKLyNvittK+xyEt01NPnPC2XUFKz4bHeolz martin@adelaide&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Initialize repository ===&lt;br /&gt;
As root on git server:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~git&lt;br /&gt;
mkdir project.git&lt;br /&gt;
cd project.git&lt;br /&gt;
git init --bare&lt;br /&gt;
cd ..&lt;br /&gt;
chown -R git.git project.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
As developer on developer PC:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd project&lt;br /&gt;
emacs .gitignore  # include a line with &amp;quot;**/.hg&amp;quot; to exclude .hg content&lt;br /&gt;
git init&lt;br /&gt;
git add .&lt;br /&gt;
git commit -m &#039;Initial commit&#039;&lt;br /&gt;
git remote add origin git@irc-git-host:project.git&lt;br /&gt;
git push origin master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
As another user:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone git@irc-git-host:project.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Scott</name></author>
	</entry>
	<entry>
		<id>https://wiki.scott5.org/index.php?title=Git&amp;diff=1816</id>
		<title>Git</title>
		<link rel="alternate" type="text/html" href="https://wiki.scott5.org/index.php?title=Git&amp;diff=1816"/>
		<updated>2024-01-05T23:42:59Z</updated>

		<summary type="html">&lt;p&gt;Scott: /* Git Server */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Initial Setup ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git config --global user.name &amp;quot;Harry Truman&amp;quot;&lt;br /&gt;
git config --global user.email &amp;quot;harry.truman@example.com&amp;quot;&lt;br /&gt;
git config --global --list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
May need to set up SSH-key authentication for gitlab.&lt;br /&gt;
&lt;br /&gt;
== Clone Repository ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone git@gitlab.com:scottcamacmartin/my_project.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Upload Existing Code Directory as Gitlab Repository ==&lt;br /&gt;
First, creat a new project on gitlab.  Then, on the local dev machine:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone git@gitlab.com:scottcamacmartin/my_project.git&lt;br /&gt;
cd my_project&lt;br /&gt;
# then copy code into new folder my_project&lt;br /&gt;
# DELETE ANY SENSITIVE PASSWORDS, ETC&lt;br /&gt;
# also set up .gitignore file&lt;br /&gt;
git status&lt;br /&gt;
git add .&lt;br /&gt;
git commit -m &amp;quot;initial commit&amp;quot;&lt;br /&gt;
git push -u origin master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Overwrite local from repository ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git fetch --all&lt;br /&gt;
git reset --hard origin/master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Cheat Sheets ==&lt;br /&gt;
https://about.gitlab.com/images/press/git-cheat-sheet.pdf&lt;br /&gt;
&lt;br /&gt;
https://github.com/kenmueller/gitignore&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Git Server ==&lt;br /&gt;
https://git-scm.com/book/en/v2/Git-on-the-Server-Setting-Up-the-Server&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/git-server/bin         # refresh-auth command&lt;br /&gt;
/opt/git-server/keys        # ssh keys&lt;br /&gt;
/opt/git-server/repos       # home directory with repos&lt;br /&gt;
/opt/git-server/repos/.ssh  # authorized_users file&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@perth:/etc# grep git /etc/passwd&lt;br /&gt;
git:x:222:222:Git Service User:/opt/git-server/repos:/usr/bin/git-shell&lt;br /&gt;
root@perth:/etc# grep git /etc/group&lt;br /&gt;
git:x:222:&lt;br /&gt;
root@perth:/etc# grep git /etc/shadow&lt;br /&gt;
git:*:17767:0:99999:7:::&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@perth:/opt/git-server/bin# cat refresh-auth &lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
GIT_SERVER_DIR=/opt/git-server&lt;br /&gt;
KEY_DIR=$GIT_SERVER_DIR/keys&lt;br /&gt;
SSH_KEY_FILE=$GIT_SERVER_DIR/repos/.ssh/authorized_keys&lt;br /&gt;
SSH_KEY_PREFIX=&amp;quot;no-pty,no-port-forwarding,no-X11-forwarding,no-agent-forwarding&amp;quot;&lt;br /&gt;
&lt;br /&gt;
find $KEY_DIR -type f -exec grep -v &#039;#&#039; {} \; | awk &#039;$1&#039; | sort -u | sed -e &amp;quot;s/^/${SSH_KEY_PREFIX} /&amp;quot; &amp;gt; $SSH_KEY_FILE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@perth:/opt/git-server/keys# ls -l&lt;br /&gt;
total 16&lt;br /&gt;
drwxr-xr-x 2 root root 4096 Nov 28 16:28 dc&lt;br /&gt;
drwxr-xr-x 2 root root 4096 Nov 30 10:18 martin&lt;br /&gt;
drwxr-xr-x 2 root root 4096 Nov 28 16:28 root&lt;br /&gt;
drwxr-xr-x 2 root root 4096 Nov 28 16:28 statsuser&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@perth:/opt/git-server/keys/martin# cat adelaide &lt;br /&gt;
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDbyBYOnAoKLyNvittK+xyEt01NPnPC2XUFKz4bHeolz martin@adelaide&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Initialize repository ===&lt;br /&gt;
As root on git server:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~git&lt;br /&gt;
mkdir project.git&lt;br /&gt;
cd project.git&lt;br /&gt;
git init --bare&lt;br /&gt;
cd ..&lt;br /&gt;
chown -R git.git project.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
As developer on developer PC:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd project&lt;br /&gt;
emacs .gitignore  # include a line with &amp;quot;**/.hg&amp;quot; to exclude .hg content&lt;br /&gt;
git init&lt;br /&gt;
git add .&lt;br /&gt;
git commit -m &#039;Initial commit&#039;&lt;br /&gt;
git remote add origin git@irc-git-host:project.git&lt;br /&gt;
git push origin master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
As another user:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone git@irc-git-host:project.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Scott</name></author>
	</entry>
	<entry>
		<id>https://wiki.scott5.org/index.php?title=Git&amp;diff=1815</id>
		<title>Git</title>
		<link rel="alternate" type="text/html" href="https://wiki.scott5.org/index.php?title=Git&amp;diff=1815"/>
		<updated>2024-01-05T23:39:04Z</updated>

		<summary type="html">&lt;p&gt;Scott: /* Git Server */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Initial Setup ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git config --global user.name &amp;quot;Harry Truman&amp;quot;&lt;br /&gt;
git config --global user.email &amp;quot;harry.truman@example.com&amp;quot;&lt;br /&gt;
git config --global --list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
May need to set up SSH-key authentication for gitlab.&lt;br /&gt;
&lt;br /&gt;
== Clone Repository ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone git@gitlab.com:scottcamacmartin/my_project.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Upload Existing Code Directory as Gitlab Repository ==&lt;br /&gt;
First, creat a new project on gitlab.  Then, on the local dev machine:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone git@gitlab.com:scottcamacmartin/my_project.git&lt;br /&gt;
cd my_project&lt;br /&gt;
# then copy code into new folder my_project&lt;br /&gt;
# DELETE ANY SENSITIVE PASSWORDS, ETC&lt;br /&gt;
# also set up .gitignore file&lt;br /&gt;
git status&lt;br /&gt;
git add .&lt;br /&gt;
git commit -m &amp;quot;initial commit&amp;quot;&lt;br /&gt;
git push -u origin master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Overwrite local from repository ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git fetch --all&lt;br /&gt;
git reset --hard origin/master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Cheat Sheets ==&lt;br /&gt;
https://about.gitlab.com/images/press/git-cheat-sheet.pdf&lt;br /&gt;
&lt;br /&gt;
https://github.com/kenmueller/gitignore&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Git Server ==&lt;br /&gt;
https://git-scm.com/book/en/v2/Git-on-the-Server-Setting-Up-the-Server&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/git-server/bin         # refresh-auth command&lt;br /&gt;
/opt/git-server/keys        # ssh keys&lt;br /&gt;
/opt/git-server/repos       # home directory with repos&lt;br /&gt;
/opt/git-server/repos/.ssh  # authorized_users file&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@perth:/etc# grep git /etc/passwd&lt;br /&gt;
git:x:222:222:Git Service User:/opt/git-server/repos:/usr/bin/git-shell&lt;br /&gt;
root@perth:/etc# grep git /etc/group&lt;br /&gt;
git:x:222:&lt;br /&gt;
root@perth:/etc# grep git /etc/shadow&lt;br /&gt;
git:*:17767:0:99999:7:::&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@perth:/opt/git-server/bin# cat refresh-auth &lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
GIT_SERVER_DIR=/opt/git-server&lt;br /&gt;
KEY_DIR=$GIT_SERVER_DIR/keys&lt;br /&gt;
SSH_KEY_FILE=$GIT_SERVER_DIR/repos/.ssh/authorized_keys&lt;br /&gt;
SSH_KEY_PREFIX=&amp;quot;no-pty,no-port-forwarding,no-X11-forwarding,no-agent-forwarding&amp;quot;&lt;br /&gt;
&lt;br /&gt;
find $KEY_DIR -type f -exec grep -v &#039;#&#039; {} \; | awk &#039;$1&#039; | sort -u | sed -e &amp;quot;s/^/${SSH_KEY_PREFIX} /&amp;quot; &amp;gt; $SSH_KEY_FILE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Initialize repository ===&lt;br /&gt;
As root on git server:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~git&lt;br /&gt;
mkdir project.git&lt;br /&gt;
cd project.git&lt;br /&gt;
git init --bare&lt;br /&gt;
cd ..&lt;br /&gt;
chown -R git.git project.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
As developer on developer PC:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd project&lt;br /&gt;
emacs .gitignore  # include a line with &amp;quot;**/.hg&amp;quot; to exclude .hg content&lt;br /&gt;
git init&lt;br /&gt;
git add .&lt;br /&gt;
git commit -m &#039;Initial commit&#039;&lt;br /&gt;
git remote add origin git@irc-git-host:project.git&lt;br /&gt;
git push origin master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
As another user:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone git@irc-git-host:project.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Scott</name></author>
	</entry>
	<entry>
		<id>https://wiki.scott5.org/index.php?title=Git&amp;diff=1814</id>
		<title>Git</title>
		<link rel="alternate" type="text/html" href="https://wiki.scott5.org/index.php?title=Git&amp;diff=1814"/>
		<updated>2024-01-05T23:36:47Z</updated>

		<summary type="html">&lt;p&gt;Scott: /* Cheat Sheets */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Initial Setup ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git config --global user.name &amp;quot;Harry Truman&amp;quot;&lt;br /&gt;
git config --global user.email &amp;quot;harry.truman@example.com&amp;quot;&lt;br /&gt;
git config --global --list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
May need to set up SSH-key authentication for gitlab.&lt;br /&gt;
&lt;br /&gt;
== Clone Repository ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone git@gitlab.com:scottcamacmartin/my_project.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Upload Existing Code Directory as Gitlab Repository ==&lt;br /&gt;
First, creat a new project on gitlab.  Then, on the local dev machine:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone git@gitlab.com:scottcamacmartin/my_project.git&lt;br /&gt;
cd my_project&lt;br /&gt;
# then copy code into new folder my_project&lt;br /&gt;
# DELETE ANY SENSITIVE PASSWORDS, ETC&lt;br /&gt;
# also set up .gitignore file&lt;br /&gt;
git status&lt;br /&gt;
git add .&lt;br /&gt;
git commit -m &amp;quot;initial commit&amp;quot;&lt;br /&gt;
git push -u origin master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Overwrite local from repository ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git fetch --all&lt;br /&gt;
git reset --hard origin/master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Cheat Sheets ==&lt;br /&gt;
https://about.gitlab.com/images/press/git-cheat-sheet.pdf&lt;br /&gt;
&lt;br /&gt;
https://github.com/kenmueller/gitignore&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Git Server ==&lt;br /&gt;
https://git-scm.com/book/en/v2/Git-on-the-Server-Setting-Up-the-Server&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/git-server/bin         # refresh-auth command&lt;br /&gt;
/opt/git-server/keys        # ssh keys&lt;br /&gt;
/opt/git-server/repos       # home directory with repos&lt;br /&gt;
/opt/git-server/repos/.ssh  # authorized_users file&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@perth:/etc# grep git /etc/passwd&lt;br /&gt;
git:x:222:222:Git Service User:/opt/git-server/repos:/usr/bin/git-shell&lt;br /&gt;
root@perth:/etc# grep git /etc/group&lt;br /&gt;
git:x:222:&lt;br /&gt;
root@perth:/etc# grep git /etc/shadow&lt;br /&gt;
git:*:17767:0:99999:7:::&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Initialize repository ===&lt;br /&gt;
As root on git server:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~git&lt;br /&gt;
mkdir project.git&lt;br /&gt;
cd project.git&lt;br /&gt;
git init --bare&lt;br /&gt;
cd ..&lt;br /&gt;
chown -R git.git project.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
As developer on developer PC:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd project&lt;br /&gt;
emacs .gitignore  # include a line with &amp;quot;**/.hg&amp;quot; to exclude .hg content&lt;br /&gt;
git init&lt;br /&gt;
git add .&lt;br /&gt;
git commit -m &#039;Initial commit&#039;&lt;br /&gt;
git remote add origin git@irc-git-host:project.git&lt;br /&gt;
git push origin master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
As another user:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone git@irc-git-host:project.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Scott</name></author>
	</entry>
	<entry>
		<id>https://wiki.scott5.org/index.php?title=Git&amp;diff=1813</id>
		<title>Git</title>
		<link rel="alternate" type="text/html" href="https://wiki.scott5.org/index.php?title=Git&amp;diff=1813"/>
		<updated>2024-01-01T16:21:05Z</updated>

		<summary type="html">&lt;p&gt;Scott: /* Cheat Sheets */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Initial Setup ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git config --global user.name &amp;quot;Harry Truman&amp;quot;&lt;br /&gt;
git config --global user.email &amp;quot;harry.truman@example.com&amp;quot;&lt;br /&gt;
git config --global --list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
May need to set up SSH-key authentication for gitlab.&lt;br /&gt;
&lt;br /&gt;
== Clone Repository ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone git@gitlab.com:scottcamacmartin/my_project.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Upload Existing Code Directory as Gitlab Repository ==&lt;br /&gt;
First, creat a new project on gitlab.  Then, on the local dev machine:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone git@gitlab.com:scottcamacmartin/my_project.git&lt;br /&gt;
cd my_project&lt;br /&gt;
# then copy code into new folder my_project&lt;br /&gt;
# DELETE ANY SENSITIVE PASSWORDS, ETC&lt;br /&gt;
# also set up .gitignore file&lt;br /&gt;
git status&lt;br /&gt;
git add .&lt;br /&gt;
git commit -m &amp;quot;initial commit&amp;quot;&lt;br /&gt;
git push -u origin master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Overwrite local from repository ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git fetch --all&lt;br /&gt;
git reset --hard origin/master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Cheat Sheets ==&lt;br /&gt;
https://about.gitlab.com/images/press/git-cheat-sheet.pdf&lt;br /&gt;
&lt;br /&gt;
https://github.com/kenmueller/gitignore&lt;/div&gt;</summary>
		<author><name>Scott</name></author>
	</entry>
</feed>