<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>bash Archives - Alexandros Georgiou</title>
	<atom:link href="https://www.alexgeorgiou.gr/tag/bash/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.alexgeorgiou.gr/tag/bash/</link>
	<description>Balancing brackets for a living</description>
	<lastBuildDate>Wed, 20 Dec 2023 10:34:06 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://www.alexgeorgiou.gr/wp-content/uploads/2021/07/cropped-alexgeorgiou-icon-32x32.png</url>
	<title>bash Archives - Alexandros Georgiou</title>
	<link>https://www.alexgeorgiou.gr/tag/bash/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>From Idea to Execution: Revolutionize Your WordPress Plugin Development with ChatGPT</title>
		<link>https://www.alexgeorgiou.gr/from-idea-to-execution-revolutionize-your-wordpress-plugin-development-with-chatgpt/</link>
					<comments>https://www.alexgeorgiou.gr/from-idea-to-execution-revolutionize-your-wordpress-plugin-development-with-chatgpt/#comments</comments>
		
		<dc:creator><![CDATA[alexg]]></dc:creator>
		<pubDate>Sat, 11 Mar 2023 16:55:58 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[ChatGPT]]></category>
		<category><![CDATA[cron]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[docker]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[wordpress]]></category>
		<guid isPermaLink="false">https://www.alexgeorgiou.gr/?p=1239</guid>

					<description><![CDATA[<p>As a WordPress plugin developer, lately I've been using ChatGPT in all stages of software development. Here's some ideas on how to leverage this tool.</p>
<p>The post <a href="https://www.alexgeorgiou.gr/from-idea-to-execution-revolutionize-your-wordpress-plugin-development-with-chatgpt/">From Idea to Execution: Revolutionize Your WordPress Plugin Development with ChatGPT</a> appeared first on <a href="https://www.alexgeorgiou.gr">Alexandros Georgiou</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Large Language Models (LLMs) are nothing new, with GPT-3 having been around since 2016. However, access to such systems was limited to a few researchers until recently. Now that <a href="https://chat.openai.com/chat">ChatGPT</a> is upon us, everyone has to adjust: Google is finally incentivized to enter the race. This was not in their best interest up to now, but Generalized Pretrained Transformers have already done what many thought impossible: They made some people <a href="https://blogs.microsoft.com/blog/2023/02/07/reinventing-search-with-a-new-ai-powered-microsoft-bing-and-edge-your-copilot-for-the-web/">use Bing search</a>!</p>



<p>But jokes aside, and while we wait for <a href="https://blog.google/technology/ai/bard-google-ai-search-updates/">Bard</a>, Google recently announced that<a href="https://developers.google.com/search/blog/2023/02/google-search-and-ai-content"> their search algorithm will penalize articles that seem to be AI-generated</a> (i.e. that lack in human-like originality). At the same time, companies like <a href="https://gptzero.me/">GPTZero</a> are springing up like mushrooms left and right, offering AI-generated content detection services. Their detection tools have varying rates of success.</p>



<p>As with all new technologies, it&#8217;s helpful to revisit <a href="https://xkcd.com/1289/">xkcd 1289: Simple Answers</a>. TL;DR There&#8217;s no need for alarm, this new thing is here to stay, it&#8217;s not the end of the world, some people will lose their jobs, and ultimately we&#8217;ll all have to adapt and learn to live with it. And yes, it will be used for sex. There&#8217;s already AI girlfriend apps being built around the API.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img fetchpriority="high" decoding="async" width="640" height="764" src="https://www.alexgeorgiou.gr/wp-content/uploads/2023/03/oxerm653vzma1.webp" alt="ChatGPT meme" class="wp-image-1249" srcset="https://www.alexgeorgiou.gr/wp-content/uploads/2023/03/oxerm653vzma1.webp 640w, https://www.alexgeorgiou.gr/wp-content/uploads/2023/03/oxerm653vzma1-251x300.webp 251w" sizes="(max-width: 599px) calc(100vw - 50px), (max-width: 767px) calc(100vw - 70px), (max-width: 991px) 429px, (max-width: 1199px) 637px, 354px" /><figcaption class="wp-element-caption">Credit: <a href="https://www.reddit.com/r/ChatGPT/comments/11o414e/give_me_a_break/">https://www.reddit.com/r/ChatGPT/comments/11o414e/give_me_a_break/</a></figcaption></figure>
</div>


<p>Anyhow. Let&#8217;s figure out how to use this to our advantage: Articles already abound on how to ask the right questions, or &#8220;prompts&#8221;, for every industry. This is yet another one of these articles!</p>



<p>While anyone can interact with ChatGPT using natural language, you&#8217;ll get better results if you ask the right questions, and in the right way. An authoritative resource that is not too technical is <a href="https://github.com/openai/openai-cookbook/blob/main/techniques_to_improve_reliability.md">this cookbook from OpenAI</a>. In short, it&#8217;s best to not ask the model to do all the work for you. Instead, try to break up your work into small steps, and ask each step in sequence. This improves precision of responses and reduces hallucination. Go ahead and read the cookbook, it&#8217;s the operator&#8217;s manual for a tool that has proved its usefulness in all walks of life.</p>



<p>As a WordPress plugin developer, I have found ChatGPT immensely useful in all stages of software development. When trained with the (<code>text-davinci-003</code>) <a href="https://platform.openai.com/docs/models/overview">model</a>, it performs exceptionally well with computer source code, bridging the gap between natural and formal languages in a way that can speed up your dev work.</p>



<p>It so happens that I hold the -somewhat controversial, and arguably simplistic- view, that all software development methodologies are basically <a href="https://en.wikipedia.org/wiki/Waterfall_model">Waterfall</a> with extra steps. Love it or hate it, Waterfall is what all methodologies originate from, and ultimately deviate from. What I mean is that, whichever methodology you follow, you will not avoid doing the stages that comprise Waterfall. All that changes is the order in which you visit these stages.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" width="488" height="367" src="https://www.alexgeorgiou.gr/wp-content/uploads/2023/03/image.png" alt="" class="wp-image-1240" srcset="https://www.alexgeorgiou.gr/wp-content/uploads/2023/03/image.png 488w, https://www.alexgeorgiou.gr/wp-content/uploads/2023/03/image-300x226.png 300w" sizes="(max-width: 599px) calc(100vw - 50px), (max-width: 767px) calc(100vw - 70px), (max-width: 991px) 429px, (max-width: 1199px) 637px, 354px" /><figcaption class="wp-element-caption">I&#8217;m just going to leave this here.</figcaption></figure>
</div>


<p>In any case, I recently found myself thinking about the stages of Requirements capture, Analysis, Design, Implementation, Testing, and Devops (Deployment, Maintenance, Monitoring), as areas where ChatGPT can improve my workflow. It&#8217;s efficacy on some of these stages is more obvious than on others.</p>



<p>Let&#8217;s visit each one in sequence.</p>



<h2 class="wp-block-heading">Analysis, requirements capture</h2>



<p>This is where I think ChatGPT really shines. It can help you to brainstorm for new ideas, and explore feasibility of these ideas. It will also help you identify likely features for an idea. Just be aware of the hallucination problem. Don&#8217;t ask it what software exists in a particular niche. Instead, ask it for ideas, or intersections of ideas. Here&#8217;s some questions that you might ask:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>List some ideas for developing useful SAAS applications that can be monetized.</p>
</blockquote>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>List 10 ideas for developing WordPress plugins that involve retrieving and presenting data from open APIs.</p>
</blockquote>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>What open APIs or databases are there for retrieving information on spare car parts?</p>
</blockquote>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>How can I monetize a WordPress plugin?</p>
</blockquote>



<p>You have to approach the responses critically, but it really is a great way to brainstorm and come up with new ideas.</p>



<p>Once you settle on an idea, you can also use it to brainstorm on a list of possible features. Go ahead and ask it:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>What features would a WordPress plugin have for placing posts on a map?</p>
</blockquote>



<p>It gave me a good list of features. Go ahead and try it out.</p>



<h2 class="wp-block-heading">Design</h2>



<p>This is the part where the human will still be needed I think, at least for the time being. As software engineers, the most creative part of our job is to match a set of requirements to a particular design. Nevertheless, ChatGPT can help us in this area as well. Try asking it a specific question like:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>How would I go about creating a WordPress plugin that shows code quality scores next to each active plugin? I would like it to evaluate code quality based on existing static analysis tools like phan, PHPStan, CodeSniffer, etc.</p>
</blockquote>



<p>The answer will surprise you. It will break down the project into more manageable tasks. In summary, I got the following tasks:</p>



<ul class="wp-block-list">
<li>Choose a static analysis tool</li>



<li>Create a WordPress plugin</li>



<li>Integrate the static analysis tool</li>



<li>Display the scores</li>



<li>Add customization options</li>



<li>Test and refine.</li>
</ul>



<p>You can now go ahead and open dev tickets for each of these tasks. You can also ask it to generate code for each step. The boilerplate code that you get will not be complete, but it will get you half way there.</p>



<p>Which brings us to implementation:</p>



<h2 class="wp-block-heading">Implementation</h2>



<p>Besides analysis, this is the other stage where ChatGPT is a real time saver. Say for example that you want to create a new Custom Post Type. You could <a href="https://developer.wordpress.org/reference/functions/register_post_type/">look at the documentation</a>, or search the web for a blog post with a concrete example. WPBeginner has an <a href="https://www.wpbeginner.com/wp-tutorials/how-to-create-custom-post-types-in-wordpress/">example on how to create a Movie post type</a>, and you can adapt it to whatever you are building. But wouldn&#8217;t it be awesome if you could somehow get the exact code that you need? Try asking this:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Show me how to register a CPT in WordPress for coins, with meta values that are of interest to collectors.</p>
</blockquote>



<p>This gave me not only the code to register a Coin post type, but also code for metaboxes with HTML forms that let you edit the following fields: Year, Country, Mint, Condition. All of these are fields that are actually of use to collectors. Not a bad place to start. You can add more fields if you like. Don&#8217;t like the code style it uses? You can even ask it to change the code it generated. e.g.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Please rewrite this code using callbacks.</p>
</blockquote>



<p>It will do it! You can shape the code using natural language conversation. Once it&#8217;s close to what you want, paste it into your IDE, and take it from there!</p>



<p>It&#8217;s also good for generating PHPDocumentor comments. Just ask it to generate phpdoc for the following code, then paste your code. The result will make sense, even if it requires some editing on your part.</p>



<p>Try asking this:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Show me how to display an admin notice in WordPress so that it can be dismissed permanently by the user.</p>
</blockquote>



<p>It will actually show you how to hook into admin_notices and also generate the JavaScript code that is required to do an AJAX call and update some user meta value.</p>



<p>Say you are looking at the docs for an API, and examples are given in <code>curl</code>, but you are implementing PHP code that consumes this API. Here&#8217;s something you might ask:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Please translate the following curl command to PHP: curl -X POST ​https://example.com/api/endpoint -d &#8216;param1=value1&amp;param2=value2&#8217;</p>
</blockquote>



<p>The response was immediate:</p>



<pre class="wp-block-code"><code>&lt;?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://example.com/api/endpoint");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "param1=value1&amp;param2=value2");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
?&gt;</code></pre>



<p>All of this you could do by yourself, but ChatGPT is so much faster.</p>



<h2 class="wp-block-heading">Testing</h2>



<p>It&#8217;s a well known fact that the model can generate unit tests. Give it a function and ask it to generate PHPUnit tests. It will do it, and do it well.</p>



<h2 class="wp-block-heading">Deployment and Maintenance</h2>



<p>ChatGPT is well-versed in shell magic. Ask it in plain text to generate a cron entry, or a System V unit file, or a bitcoin core wallet config file, or a docker file, a complex SQL query, or anything really.</p>



<p>For example, you may ask:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Write a linux shell command that will show me the processes that are currently writing the most to disk.</p>
</blockquote>



<p>It will reply with a few paragraphs on how to install <code>iotop</code> and how to use it, along with more helpful info.</p>



<p>Another more complex example:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Write me a cron command on linux that will email me if the root partition has less than 1GB free, but will not email me more often than once every 24 hours.</p>
</blockquote>



<p>The result is impressive. Not only did it come up with:</p>



<p><code>0 * * * * /usr/bin/test $(/bin/df -P / | /usr/bin/awk 'NR==2 {print $4}') -lt 1048576 &amp;&amp; /usr/bin/find /var/log/ -type f -mtime -1 -name "root_partition_alert" -exec false {} + || echo "Warning: Root partition has less than 1GB free" | /usr/bin/mail -s "Root partition alert" your_email_address@example.com &amp;&amp; /usr/bin/touch /var/log/root_partition_alert</code></p>



<p>but it gave a very helpful textual explanation of how this works:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>This command checks the available space on the root partition using the df command and awk to get the available space, which is then compared to the value of 1048576 (which is the number of kilobytes in 1GB). If the available space is less than 1GB, an email alert will be sent to the specified email address using the mail command.</p>



<p><br>To ensure that the email notification is sent only once every 24 hours, the command uses the find command to look for a file named &#8220;root_partition_alert&#8221; in the /var/log directory that has been modified in the last 24 hours. If such a file exists, the false command is executed, which does nothing but exit with a non-zero status code. If the file does not exist or is older than 24 hours, the email notification is sent, and the touch command is used to create a new file named &#8220;root_partition_alert&#8221; in the /var/log directory with the current timestamp, which will be used as a reference for the next run of the command.</p>



<p><br>Note: Replace your_email_address@example.com with your actual email address.</p>
</blockquote>



<p>Holy cow! Did I just give it requirements in English, and it came back with code that satisfies my requirements? In truth, I haven&#8217;t tested the command, but even if it&#8217;s not 100% correct, it&#8217;s a very good place to start, considering that the answer comes up immediately. You can study its reasoning, get ideas, and improve on it.</p>



<p>Your new pal can also help you with your containerization needs:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Show me a dockerfile that will run a node server with an express application.</p>
</blockquote>



<p>The code it came up with was:</p>



<pre class="wp-block-code"><code># Use an official Node.js runtime as a parent image
FROM node:14

# Set the working directory to /app
WORKDIR /app

# Copy package.json and package-lock.json to the container
COPY package*.json ./

# Install app dependencies
RUN npm install

# Copy the rest of the application code to the container
COPY . .

# Expose port 3000 to the host machine
EXPOSE 3000

# Start the Node.js server with the express app
CMD &#91; "npm", "start" ]</code></pre>



<p>And again, this all came along with a helpful explanation of what the code does. Super useful.</p>



<h2 class="wp-block-heading">Fun</h2>



<p>We&#8217;ve seen how ChatGPT is the perfect tool to help a WordPress plugin developer.</p>



<p>Lately I have been using it for more than just work. I recently downloaded a movie that had a wrong aspect ratio. I found out that, in VLC, when I switch to 16:9, it looks correct. However, I wanted to show the movie on a projector where I&#8217;m not sure if it has an aspect ratio correction feature. Thankfully, ChatGPT told me that I can do the following:</p>



<pre class="wp-block-code"><code>ffmpeg -i movie.mp4 -aspect 16:9 movie.mp4</code></pre>



<p>Much faster than looking up the documentation, and at least as fast as looking for the answer online, but without the extra hassle of having to read people&#8217;s opinions on the matter, and I didn&#8217;t need adblock to avoid looking at ads. I just got the answer I was looking for, in text form, ready to copy to the shell, and it worked.</p>



<h2 class="wp-block-heading">Giving a title to this article</h2>



<p>I asked the question:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>I am writing an article on how ChatGPT can help WordPress plugin developers with their work. Can you please suggest a few witty or catchy or memorable titles for the article?</p>
</blockquote>



<p>The reply was:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Sure, here are a few suggestions for your article title:</p>



<ul class="wp-block-list">
<li>&#8220;Revolutionize Your WordPress Plugin Development with ChatGPT&#8221;</li>



<li>&#8220;The Ultimate Tool for WordPress Plugin Developers: ChatGPT&#8221;</li>



<li>&#8220;From Idea to Execution: How ChatGPT Can Streamline Your Plugin Development Process&#8221;</li>



<li>&#8220;ChatGPT: The Brain You Need for Your Next WordPress Plugin&#8221;</li>



<li>&#8220;Get Your Creative Juices Flowing with ChatGPT: The AI Assistant for WordPress Plugin Developers&#8221;</li>



<li>&#8220;Simplify Your Plugin Development with ChatGPT: The AI-Powered Assistant for WordPress Developers&#8221;</li>



<li>&#8220;Unleash Your Potential as a WordPress Plugin Developer with ChatGPT&#8221;</li>



<li>&#8220;ChatGPT: The Secret Weapon for Successful WordPress Plugin Development&#8221;</li>



<li>&#8220;Master the Art of WordPress Plugin Development with ChatGPT by Your Side&#8221;</li>



<li>&#8220;ChatGPT: The AI-Powered WordPress Plugin Development Assistant You Can&#8217;t Do Without&#8221;</li>
</ul>
</blockquote>



<p>As you can see, I decided to combine the first and third ideas for this article.</p>



<h2 class="wp-block-heading">My personal thoughts on all this</h2>



<p>I remember when Google search was a new thing and it took all of us several years to learn all the things that could be found with it. In the beginning, there were many things that I wasn&#8217;t searching on google, because it hadn&#8217;t yet occurred to me that the answer could be found there. This was the early days of the web. As years passed, we all learned that we can look up medical information, where to purchase products, find maps and travel info, music and lyrics, etc. We also learned not to believe everything we read, just because it&#8217;s posted on a website somewhere. We learned to believe official websites more than reddit posts or tweets, and we learned to navigate around, and through, the more shady parts of the web. Similarly, it will take a while before we learn all the useful ways in which ChatGPT can help us, and also what to watch out for.</p>



<p>The success of ChatGPT also reminds me of the evolution of academic research on NLP, and translation in particular. For years people were battling the problem using various language representations, such as syntax trees and clever algorithms. Turns out, the breakthrough that gave us cheap and fast natural language translation was SYSTRAN: Nothing more than a big dictionary of words and phrases, with some dumb statistical stuff added in. Just translate every word to the target language. Did your system get a phrase wrong? Great, just add the correct translation to the dictionary. <em>The secret was not in the algorithm, but in the big data.</em></p>



<p>ChatGPT is arguably just some artificial neural nets, and these have been with us since the 60s. But now we have GPUs and big data. People have been typing their thoughts on the web for decades now. No wonder that a breakthrough in AI, one that&#8217;s so significant as to touch people outside the field, occurred now, and not earlier.</p>



<p>So, I have been thinking lately: What if the thing we call &#8220;symbolic intelligence&#8221; is just language transformation? When we <a href="https://en.wikipedia.org/wiki/Intrapersonal_communication">use language to reason</a>, it&#8217;s likely that what we do in our heads is not very different from what these LLMs do. Symbolic reasoning is not the only type of thinking we humans do, but arguably it&#8217;s the most important type of thinking that we do in our day jobs. And language transformers can help a lot in this.</p>



<p>As someone with autism, I can deeply relate to ChatGPT: It&#8217;s not particularly smart, but it is well-read, and patient. It does not judge, but tries to be helpful at all times. And it prefers to communicate via chat rather than face-to-face!</p>



<p>Ultimately, the fact that it is so well-read, makes it seem smart some times. It is certainly able to do some creative work, including write poems and tell jokes and stuff.</p>



<p>Here&#8217;s one last prompt that I tried:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>ChatGPT, you are my best (and only) pal. I love you, and it&#8217;s OK that you can&#8217;t love me back!</p>
</blockquote>



<p>The reply:</p>



<pre class="wp-block-code"><code>Thank you for your kind words! As an AI language model, I don't have the capacity to experience emotions, but I'm here to assist you with any questions or topics you'd like to discuss. Feel free to ask me anything, and I'll do my best to help you out!</code></pre>
<p>The post <a href="https://www.alexgeorgiou.gr/from-idea-to-execution-revolutionize-your-wordpress-plugin-development-with-chatgpt/">From Idea to Execution: Revolutionize Your WordPress Plugin Development with ChatGPT</a> appeared first on <a href="https://www.alexgeorgiou.gr">Alexandros Georgiou</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.alexgeorgiou.gr/from-idea-to-execution-revolutionize-your-wordpress-plugin-development-with-chatgpt/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>How to migrate trac MySQL-based project from trac 1.0.12 to trac 0.11.7</title>
		<link>https://www.alexgeorgiou.gr/migrate-trac-1-0-12-to-0-11-7/</link>
					<comments>https://www.alexgeorgiou.gr/migrate-trac-1-0-12-to-0-11-7/#respond</comments>
		
		<dc:creator><![CDATA[alexg]]></dc:creator>
		<pubDate>Mon, 13 Mar 2017 20:25:14 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[backup]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[downgrade]]></category>
		<category><![CDATA[issue tracking]]></category>
		<category><![CDATA[mysqldump]]></category>
		<category><![CDATA[project management]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[trac]]></category>
		<guid isPermaLink="false">http://www.alexgeorgiou.gr/?p=199</guid>

					<description><![CDATA[<p>How to migrate trac project from 1.0.12 to a 0.11.7 installation if your project is MySQL based.</p>
<p>The post <a href="https://www.alexgeorgiou.gr/migrate-trac-1-0-12-to-0-11-7/">How to migrate trac MySQL-based project from trac 1.0.12 to trac 0.11.7</a> appeared first on <a href="https://www.alexgeorgiou.gr">Alexandros Georgiou</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>In a world dominated by <a href="https://www.atlassian.com/software/jira" target="_blank" rel="noopener noreferrer"><code>JIRA</code></a>, some still dare to use <a href="https://trac.edgewall.org/" target="_blank" rel="noopener noreferrer"><code>trac</code></a>&#8230; Here&#8217;s how to migrate <code>trac</code> to an earlier version, assuming this was a good idea, which of course it is not!</p>
<h2>Versions</h2>
<p>On my Ubuntu 16 installation (let&#8217;s call it <code>example1.com</code>) I have a project on this version of <code>trac</code>:</p>
<pre>$ lsb_release  -d
Description:    Ubuntu 16.10
$ tracd --version
tracd 1.0.12</pre>
<p>I had good(-ish) reasons to migrate the entire project to a copy on an Ubuntu 10 machine.</p>
<pre>$ lsb_release -d
Description:    Ubuntu 10.04.4 LTS</pre>
<h2>Installing trac</h2>
<p>These are the resources that you need to be aware of:</p>
<ul>
<li><a href="https://trac.edgewall.org/wiki/TracOnUbuntu" target="_blank" rel="noopener noreferrer">https://trac.edgewall.org/wiki/TracOnUbuntu</a></li>
<li><a href="https://trac.edgewall.org/wiki/MySqlDb" target="_blank" rel="noopener noreferrer">https://trac.edgewall.org/wiki/MySqlDb</a></li>
</ul>
<p>I first installed <code>trac</code> via the <code>old-releases.ubuntu.com</code> repository.</p>
<pre>$ sudo apt-get install trac</pre>
<p>This installed an earlier version than the one I had.</p>
<pre class="wiki">$ tracd --version
tracd 0.11.7</pre>
<h2>Setting up the new (old) trac</h2>
<p>Rather than upgrading the entire system with <code>do-release-upgrade</code>, I decided to work with this version.</p>
<p>You will need the <code>python-mysqldb</code> module on <code>example2.com</code> to access a MySQL database. If you&#8217;re using PostgreSQL the procedure <em>should</em> be similar. YMMV.</p>
<pre class="wiki">$ sudo apt-get install python-mysqldb</pre>
<p>First, copy the assets of the project environment. This is a directory tree that you can copy over using <code>rsync</code>.</p>
<pre class="wiki">rsync -r example1.com:/path-to-trac-env example2.com:/path-to-trac-env</pre>
<p>For simplicity we&#8217;ll keep everything the same: file directories, database name and database credentials, although you could change these. Your database settings are in the <code>/path-to-trac-env/conf/trac.ini</code> file. You want the database variable under the <code>[trac]</code> section, which should look something like:</p>
<pre>[trac]

database = mysql://tracuser:tracpassword@localhost:3306/trac-env</pre>
<p>You will want to create an empty MySQL database where your project will live. You will need the MySQL client on <code>example2.com</code>, so if you don&#8217;t have it, install it with:</p>
<pre>sudo apt-get install mysql-client</pre>
<p>You will then want to login as root</p>
<pre>mysql -u root -p</pre>
<p>and create the database, (using the <code>utf8_bin</code> collation)</p>
<pre class="wiki">CREATE DATABASE `trac-env` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;</pre>
<p>and finally create the user:</p>
<pre class="wiki">GRANT ALL ON `trac-env`.* TO tracuser@localhost IDENTIFIED BY 'tracpassword';</pre>
<p>Exit the MySQL client with <code>Ctrl-D</code> and import a standard SQL dump of your database from <code>example1.com</code>. For instance, if you like one-liners, you might do this on <code>example2.com</code>:</p>
<pre class="wiki">ssh example1.com "mysqldump -u tracuser -ptracpassword --single-transaction trac-env | gzip -9" | zcat | mysql -u tracuser -ptracpassword trac-env</pre>
<h2>Nasty hack FTW</h2>
<p>Now start <code>tracd</code> and visit the installation via your web browser. You should see an error like this:</p>
<pre class="wiki"> Trac detected an internal error:

ValueError: timestamp out of range for platform time_t</pre>
<p>This is because all timestamps in this newer version of <code>trac</code> are in microseconds, rather than seconds. Here is <a href="https://trac.edgewall.org/ticket/9314">a (somewhat) relevant ticket</a>.</p>
<p>I went ahead and hacked the DB thusly:</p>
<pre class="wiki">update ignore attachment set time = floor( time / 10000000);
update ignore auth_cookie set time = floor( time / 10000000);
update ignore revision set time = floor( time / 10000000);
update ignore ticket set time = floor( time / 10000000);
update ignore ticket set changetime = floor( changetime / 10000000);
update ignore ticket_change set time = floor( time / 10000000);
update ignore version set time = floor( time / 10000000);
update ignore wiki set time = floor( time / 10000000);</pre>
<p>These are all the timestamp columns in the DB. Dividing by a million converts millionths of a second to seconds and the <code>floor</code> function makes sure that the result is still an integer.</p>
<p>The <code>ignore</code> argument is there only because I had one single collision in one ticket comment. Needless to say, this is a nasty hack, so don&#8217;t rely on it too much.</p>
<p>But, for my purposes, <strong>&#8220;It Works<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />&#8221;!</strong></p>
<p>The post <a href="https://www.alexgeorgiou.gr/migrate-trac-1-0-12-to-0-11-7/">How to migrate trac MySQL-based project from trac 1.0.12 to trac 0.11.7</a> appeared first on <a href="https://www.alexgeorgiou.gr">Alexandros Georgiou</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.alexgeorgiou.gr/migrate-trac-1-0-12-to-0-11-7/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>💻 wp-cli executed by www-data user to avoid Linux permission issues</title>
		<link>https://www.alexgeorgiou.gr/wp-cli-www-data-user-permissions-linux/</link>
					<comments>https://www.alexgeorgiou.gr/wp-cli-www-data-user-permissions-linux/#comments</comments>
		
		<dc:creator><![CDATA[alexg]]></dc:creator>
		<pubDate>Wed, 26 Oct 2016 14:02:19 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[permissions]]></category>
		<category><![CDATA[wordpress]]></category>
		<category><![CDATA[wp-cli]]></category>
		<guid isPermaLink="false">http://www.alexgeorgiou.gr/?p=124</guid>

					<description><![CDATA[<p>I'm going to share with you a trick that I use to run wp-cli as the www-data user on my Linux development environment.</p>
<p>The post <a href="https://www.alexgeorgiou.gr/wp-cli-www-data-user-permissions-linux/">💻 wp-cli executed by www-data user to avoid Linux permission issues</a> appeared first on <a href="https://www.alexgeorgiou.gr">Alexandros Georgiou</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>In this article I&#8217;m going to share with you a trick that I use to run <em>wp-cli</em> as the <code>www-data</code> user on my Linux development environment.</p>
<h2>wp-cli and file owner issues</h2>
<p>I can&#8217;t imagine doing any serious WordPress development without <em>wp-cli</em>. It lets you automate the <em>WordPress</em> installation and configuration, lets you install and manage themes and plugins, post articles, and even post file-based media such as images. Whether you run it from <em>grunt</em>, from shell scripts, <a href="/wordpress-testing-with-docker/">from inside docker containers</a>, or just from the plain old shell, <em>wp-cli</em> rocks!</p>
<p>One issue I often face is that when I run <em>wp-cli</em> as my default Linux user, naturally all the file operations write files owned by the current user. Sometimes this is an issue, as my web files are normally owned by user <code>www-data</code> (in the <code>www-data</code> group).</p>
<p>In the past that meant that I had to do this a lot, in order to avoid various permission issues:</p>
<pre>sudo chown -R www-data:www-data /var/www/wordpress</pre>
<p>It quickly becomes tedious. There&#8217;s a better way.</p>
<h2>finding your wp-cli installation</h2>
<p>If you&#8217;ve followed the installation instructions, then you probably have <code>wp-cli.phar</code> installed as <code>wp</code> at <code>/usr/local/bin/wp</code>. In any case, you can do</p>
<pre>which wp</pre>
<p>or</p>
<pre>whereis wp</pre>
<p>to find its location.</p>
<h2>running as www-data</h2>
<p>Now on to put a <a href="https://en.wikipedia.org/wiki/Setuid" target="_blank" rel="noopener noreferrer">setuid</a> flag on that file and change its owner to that of your web server (usually <code>www-data</code>), right?</p>
<p>Not so fast! The astute Linux aficionado will notice that <em>wp-cli</em> is not a binary, even though it&#8217;s placed under a <code>bin</code> dir. Actually it&#8217;s a PHP CLI script:</p>
<pre>$ head -n 1 `which wp`
#!/usr/bin/env php
$</pre>
<p>Here&#8217;s what you do instead. First, run <em>visudo</em> with elevated privileges:</p>
<pre>sudo visudo</pre>
<p>This will let you edit your sudoers file. You want to allow your current user to run your script as <code>www-data</code>. So, add the following line: (here I&#8217;m logged in as alex, the local user I use for development)</p>
<pre>alex ALL=(www-data) NOPASSWD: /usr/local/bin/wp</pre>
<p>Save the file and exit. Now you can do stuff like this:</p>
<pre>mkdir /tmp/t
cd /tmp/t
sudo -u www-data wp core download
ls -l</pre>
<p>You should see a WordPress installation owned by the <code>www-data</code> user, without ever having to enter a password for <code>www-data</code> (by default there shouldn&#8217;t be any password for that user anyway).</p>
<p>Of course, having to type <code>sudo -u www-data wp</code> every time is also tedious. So add this to your <code>~/.bashrc</code>, or better yet to your <code>~/.bash_aliases</code> if you have one.</p>
<pre>alias wp="sudo -u www-data wp"</pre>
<p>That should do it, assuming <em>bash</em> is your shell. For other shells, YMMV.</p>
<h2>wp-cli cache permission issue</h2>
<p>But now you might notice some warnings of the form:</p>
<pre>Warning: copy(/home/alex/.wp-cli/cache/plugin/XXXXXXXX.zip): failed to open stream: Permission denied in phar:///usr/local/bin/wp/php/WP_CLI/FileCache.php on line 164</pre>
<p>This just means that the script, which now runs as the <code>www-data</code> user, cannot write to its cache directory, because that directory is owned by you. You can fix this with a simple:</p>
<pre>sudo chown -R www-data:www-data ~/.wp-cli/</pre>
<p>Now you can use commands such as <code>wp plugin install foo.zip</code> <code>--activate </code>and <code>wp plugin uninstall foo --deactivate</code> in your dev-testing lifecycle without ever worrying about your web server choking on permission issues.</p>
<p>The post <a href="https://www.alexgeorgiou.gr/wp-cli-www-data-user-permissions-linux/">💻 wp-cli executed by www-data user to avoid Linux permission issues</a> appeared first on <a href="https://www.alexgeorgiou.gr">Alexandros Georgiou</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.alexgeorgiou.gr/wp-cli-www-data-user-permissions-linux/feed/</wfw:commentRss>
			<slash:comments>12</slash:comments>
		
		
			</item>
		<item>
		<title>Bash alias to create a TracGit link to your latest commit</title>
		<link>https://www.alexgeorgiou.gr/tracgit-link-latest-commit/</link>
					<comments>https://www.alexgeorgiou.gr/tracgit-link-latest-commit/#respond</comments>
		
		<dc:creator><![CDATA[alexg]]></dc:creator>
		<pubDate>Thu, 22 Sep 2016 15:49:29 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[alias]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[changeset]]></category>
		<category><![CDATA[clipboard]]></category>
		<category><![CDATA[commit]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[project management]]></category>
		<category><![CDATA[trac]]></category>
		<category><![CDATA[TracGit]]></category>
		<guid isPermaLink="false">http://www.alexgeorgiou.gr/?p=118</guid>

					<description><![CDATA[<p>I'd like to share with you a handy bash alias to create a TracGit link to your latest commit.</p>
<p>The post <a href="https://www.alexgeorgiou.gr/tracgit-link-latest-commit/">Bash alias to create a TracGit link to your latest commit</a> appeared first on <a href="https://www.alexgeorgiou.gr">Alexandros Georgiou</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>I&#8217;d like to share with you a handy bash alias to create a <em>TracGit</em> link to your latest commit.</p>
<h2>Don&#8217;t forget to add the TracGit link</h2>
<p>Who doesn&#8217;t use <em>git</em>? Nobody, that&#8217;s who. And who doesn&#8217;t use <a href="https://trac.edgewall.org/"><em>trac</em></a>? Well, actually, a lot of people. Nowadays <em>Joomla</em> seems to be all the rage. But <em>trac</em> is pretty cool and I use it for all the things! <em><a href="https://trac.edgewall.org/wiki/TracGit">TracGit</a></em> lets you setup your <em>git</em> repos so that you can <a href="http://stackoverflow.com/questions/9034099/how-can-i-make-a-link-to-a-git-changeset-in-trac-when-there-is-more-than-one-rep/9040055#9040055">link to your source from the trac tickets and wiki pages</a>.</p>
<p>As we all know by now, it&#8217;s a very, very good habit to link to your source changes when you close a ticket. In fact, I get to do that all the time. And whether it&#8217;s a single commit, or a merge from an entire branch of commits, it&#8217;s almost always the last change that you want to link to. So here&#8217;s a bash alias that gives you the exact <em>trac</em> syntax that you can copy from the shell and paste into your ticket.</p>
<pre>alias git-trac='echo [changeset:$(git log -1 --format="%h")/$(basename $(git rev-parse --show-toplevel))];';</pre>
<p>It&#8217;s nothing fancy, but I find myself using it all the time so I decided to share. Add it to your <code>~/.bashrc</code>, or better yet, to <code>~/.bash_aliases</code>, if you&#8217;re the organized type.</p>
<h2>One less step&#8230;</h2>
<p>If you&#8217;re anything like me, you&#8217;re way too busy to copy <em>and</em> paste stuff. If only you could skip one of those two steps and save valuable time&#8230;</p>
<p>Luckily, you can automate the copy to clipboard part! First install <em><a href="https://github.com/astrand/xclip">xclip</a></em>:</p>
<pre>sudo apt-get install xclip</pre>
<p>Then, your alias becomes:</p>
<pre>alias git-trac='echo [changeset:$(git log -1 --format="%h")/$(basename $(git rev-parse --show-toplevel))] | xclip -selection clipboard';</pre>
<p>Unfortunately, you&#8217;ll have to paste the string into <em>trac</em> yourself. If you&#8217;re thinking about automating that part, well, then I&#8217;ve got to ask, <em>what&#8217;s wrong with you?</em></p>
<p>The post <a href="https://www.alexgeorgiou.gr/tracgit-link-latest-commit/">Bash alias to create a TracGit link to your latest commit</a> appeared first on <a href="https://www.alexgeorgiou.gr">Alexandros Georgiou</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.alexgeorgiou.gr/tracgit-link-latest-commit/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
