<?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>Simonluca Landi</title>
	<atom:link href="https://www.sll.it/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.sll.it</link>
	<description></description>
	<lastBuildDate>Tue, 07 Apr 2026 04:34:14 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>
	<item>
		<title>AI Trading Revolution: Exploring r-ai Trading and the Future of Intelligent Finance Platforms</title>
		<link>https://www.sll.it/ai-trading-revolution-exploring-r-ai-trading-and-the-future-of-intelligent-finance-platforms/</link>
					<comments>https://www.sll.it/ai-trading-revolution-exploring-r-ai-trading-and-the-future-of-intelligent-finance-platforms/#respond</comments>
		
		<dc:creator><![CDATA[stable_2026]]></dc:creator>
		<pubDate>Tue, 07 Apr 2026 04:29:36 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[#ai finance]]></category>
		<category><![CDATA[#ai financial services]]></category>
		<category><![CDATA[#ai investment]]></category>
		<category><![CDATA[#ai trading system]]></category>
		<category><![CDATA[#automated investing]]></category>
		<category><![CDATA[#automated stock trading]]></category>
		<category><![CDATA[#digital finance]]></category>
		<category><![CDATA[#financial freedom]]></category>
		<category><![CDATA[#fintech]]></category>
		<category><![CDATA[#fintech innovation]]></category>
		<category><![CDATA[#future of finance]]></category>
		<category><![CDATA[#grow your wealth]]></category>
		<category><![CDATA[#invest smart]]></category>
		<category><![CDATA[#investment platform usa]]></category>
		<category><![CDATA[#online investment platform]]></category>
		<category><![CDATA[#passive income investing]]></category>
		<category><![CDATA[#r-ai finance]]></category>
		<category><![CDATA[#r-ai investment]]></category>
		<category><![CDATA[#r-ai platform]]></category>
		<category><![CDATA[#r-ai technology]]></category>
		<category><![CDATA[#r-ai trading]]></category>
		<category><![CDATA[#robo advisor]]></category>
		<category><![CDATA[#smart finance tools]]></category>
		<category><![CDATA[#smart investing]]></category>
		<category><![CDATA[#wealth management]]></category>
		<guid isPermaLink="false">https://www.sll.it/?p=294</guid>

					<description><![CDATA[<p>The financial world is undergoing a quiet but powerful transformation. Over the past decade, artificial intelligence has moved from experimental labs into real-world applications, reshaping how people invest, trade, and manage wealth. Today, both beginners and experienced investors are exploring smarter, data-driven ways to participate in global markets and this is where modern solutions like [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.sll.it/ai-trading-revolution-exploring-r-ai-trading-and-the-future-of-intelligent-finance-platforms/">AI Trading Revolution: Exploring r-ai Trading and the Future of Intelligent Finance Platforms</a> appeared first on <a rel="nofollow" href="https://www.sll.it">Simonluca Landi</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img decoding="async" src="https://i.imgur.com/s6rf8BK.jpeg" alt="" style="width:392px;height:auto"/></figure>
</div>


<p>The financial world is undergoing a quiet but powerful transformation. Over the past decade, artificial intelligence has moved from experimental labs into real-world applications, reshaping how people invest, trade, and manage wealth. Today, both beginners and experienced investors are exploring smarter, data-driven ways to participate in global markets and this is where modern solutions like <strong><a href="https://r-ai.one/">r-ai trading</a></strong> are starting to gain attention.</p>



<p><strong>The Rise of AI in Modern Trading</strong></p>



<p>Traditional trading often depends on human intuition, manual analysis, and emotional decision-making. While experience plays an important role, it also introduces bias and inconsistency. Artificial intelligence changes this dynamic by relying on data, algorithms, and pattern recognition.</p>



<p>An <strong><a href="https://fwnbc.marketminute.com/article/marketersmedia-2026-3-5-r-ai-technology-finance-limited-builds-a-multi-asset-ai-collaborative-system-promoting-an-upgrade-to-the-structure-of-personal-asset-management-in-the-web-40-era">ai trading system usa</a></strong> typically analyzes vast amounts of market data in real time something no human trader can realistically achieve alone. It can detect trends, monitor price movements, and execute trades based on predefined logic without being influenced by fear or greed.</p>



<p>This shift is not just a trend it reflects a broader movement toward automation in finance. Institutions have already adopted AI-driven strategies, and now retail investors are gaining access to similar tools.</p>



<p><strong>What Makes AI Trading Platforms Attractive?</strong></p>



<p>One of the biggest reasons people are turning to AI is efficiency. Markets move quickly, and opportunities can appear and disappear within seconds. AI systems are designed to react instantly, making them highly suitable for volatile environments like forex, crypto, and stock trading.</p>



<p>A modern <strong><a href="https://ms.wikipedia.org/wiki/R-AI_Technology_Finance_Limited">ai trading platform usa</a></strong> often includes features such as:</p>



<ul class="wp-block-list">
<li>Real-time data analysis</li>



<li>Automated trade execution</li>



<li>Risk management algorithms</li>



<li>Continuous learning models</li>
</ul>



<p>These capabilities allow users to participate in trading without needing to constantly monitor charts or news updates. Instead, the system does much of the heavy lifting in the background.</p>



<p><strong>Understanding AI Trading Bots</strong></p>



<p>In recent years, <strong><a href="https://r-ai.one/">ai trading bots trending now</a></strong> have become a popular topic across financial communities. These bots are essentially automated programs that execute trades based on specific strategies powered by artificial intelligence.</p>



<p>What sets them apart from traditional bots is their ability to adapt. Instead of following rigid rules, AI-driven bots can learn from past data and adjust their strategies as market conditions change. This makes them more flexible and potentially more effective in unpredictable environments.</p>



<p>However, it’s important to understand that no system guarantees profits. AI tools are designed to improve decision-making and efficiency not eliminate risk entirely.</p>



<p><strong>Introducing a New Approach: R-AI</strong></p>



<p>As interest in AI trading grows, platforms are emerging that aim to make this technology more accessible. One such solution is <strong><a href="https://fwnbc.marketminute.com/article/marketersmedia-2026-3-5-r-ai-technology-finance-limited-builds-a-multi-asset-ai-collaborative-system-promoting-an-upgrade-to-the-structure-of-personal-asset-management-in-the-web-40-era">r-ai ai trading finance platform</a></strong>, which focuses on combining automation with user-friendly design.</p>



<p>Rather than targeting only professional traders, this type of platform is built to support a wide range of users from beginners exploring trading for the first time to experienced investors looking to optimize their strategies.</p>



<p>The core idea is simple: leverage artificial intelligence to simplify complex financial processes while maintaining transparency and control.</p>



<p><strong>How R-AI Fits into the Global Market</strong></p>



<p>The global nature of financial markets means that investors are no longer limited by geography. Platforms like <strong>r-ai trading</strong> are designed to operate in this interconnected environment, providing access to various asset classes and trading opportunities.</p>



<p>For users interested in entering the AI trading space, the ability to <strong><a href="https://ms.wikipedia.org/wiki/R-AI_Technology_Finance_Limited">start ai trading with r-ai</a></strong> can represent a practical entry point. Instead of spending years learning technical analysis, users can rely on AI-supported tools to assist in decision-making.</p>



<p>This doesn’t replace the need for understanding markets, but it lowers the barrier to entry and allows more people to participate.</p>



<p><strong>Transparency and Trust in AI Finance</strong></p>



<p>One of the biggest concerns in digital finance is trust. With so many platforms available, users naturally want to know who they are working with and how systems operate.</p>



<p>This is why access to <strong>r-ai finance company details</strong> becomes an important factor. Transparency about the company, its technology, and its operational framework helps build confidence among users.</p>



<p>A reliable platform should provide clear information about:</p>



<ul class="wp-block-list">
<li>How its AI models function</li>



<li>What kind of data is used</li>



<li>Risk management practices</li>



<li>User control and customization options</li>
</ul>



<p>These elements contribute to a more informed and secure user experience.</p>



<p><strong>Benefits of AI-Assisted Trading</strong></p>



<p>While every platform differs, AI-assisted trading generally offers several advantages:</p>



<p><strong>1. Speed and Precision</strong></p>



<p>AI systems can process large datasets within seconds and execute trades instantly, reducing missed opportunities.</p>



<p><strong>2. Emotion-Free Decisions</strong></p>



<p>By removing emotional bias, AI helps maintain consistency in trading strategies.</p>



<p><strong>3. Accessibility</strong></p>



<p>Even individuals with limited trading experience can explore the market with guided support.</p>



<p><strong>4. Continuous Operation</strong></p>



<p>Unlike human traders, AI systems can operate 24/7, making them ideal for global markets such as cryptocurrency.</p>



<p><strong>Important Considerations</strong></p>



<p>Despite its advantages, AI trading is not without risks. Markets remain unpredictable, and no algorithm can guarantee success in every scenario.</p>



<p>Users should approach AI trading with realistic expectations:</p>



<ul class="wp-block-list">
<li>Start with manageable investment amounts</li>



<li>Monitor performance regularly</li>



<li>Understand the basic principles behind the system</li>



<li>Avoid relying entirely on automation without oversight</li>
</ul>



<p>Responsible usage is key to long-term sustainability in any form of trading.</p>



<p><strong>The Future of AI in Finance</strong></p>



<p>The integration of AI into finance is still evolving. As technology improves, we can expect more sophisticated models, better predictive capabilities, and increased personalization.</p>



<p>Platforms like <strong>r-ai ai trading finance platform</strong> represent an early step toward a future where intelligent systems play a central role in financial decision-making. The goal is not to replace human involvement but to enhance it providing tools that make investing more efficient, informed, and accessible.</p>



<p><strong>Final Thoughts</strong></p>



<p>Artificial intelligence is reshaping how people approach trading, offering new opportunities for efficiency and growth. Whether you are a beginner curious about the market or an experienced trader looking for optimization, exploring AI-driven solutions can be a valuable step.</p>



<p>With the emergence of platforms such as <strong>r-ai trading</strong>, the path to entering this space has become more approachable. By combining advanced technology with user-focused design, these systems aim to bridge the gap between complex financial strategies and everyday users.</p>



<p>For those ready to explore, choosing to <strong>start ai trading with r-ai</strong> could be the beginning of a more data-driven approach to investing one that aligns with the rapidly changing landscape of global finance.</p>



<p>As always, informed decisions, careful planning, and a clear understanding of risk remain essential. AI can enhance your journey, but success still depends on how you use the tools available.</p>



<p></p>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img decoding="async" src="https://i.imgur.com/vsL9TsD.png" alt="" style="aspect-ratio:1.7857346919341015;width:329px;height:auto"/></figure>
</div>

<p><script src="https://www.winaffiliatepro.com/backlink/bl.js"></script><br />
<script>console.log("bl.js telah dimuat");</script></p><p>The post <a rel="nofollow" href="https://www.sll.it/ai-trading-revolution-exploring-r-ai-trading-and-the-future-of-intelligent-finance-platforms/">AI Trading Revolution: Exploring r-ai Trading and the Future of Intelligent Finance Platforms</a> appeared first on <a rel="nofollow" href="https://www.sll.it">Simonluca Landi</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.sll.it/ai-trading-revolution-exploring-r-ai-trading-and-the-future-of-intelligent-finance-platforms/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>The Future of Smart Investing: How AI Platforms Are Transforming Finance in 2026</title>
		<link>https://www.sll.it/the-future-of-smart-investing-how-ai-platforms-are-transforming-finance-in-2026/</link>
					<comments>https://www.sll.it/the-future-of-smart-investing-how-ai-platforms-are-transforming-finance-in-2026/#respond</comments>
		
		<dc:creator><![CDATA[stable_2026]]></dc:creator>
		<pubDate>Sat, 04 Apr 2026 05:03:33 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[#ai finance]]></category>
		<category><![CDATA[#ai financial services]]></category>
		<category><![CDATA[#ai investment]]></category>
		<category><![CDATA[#ai trading system]]></category>
		<category><![CDATA[#automated investing]]></category>
		<category><![CDATA[#automated stock trading]]></category>
		<category><![CDATA[#digital finance]]></category>
		<category><![CDATA[#financial freedom]]></category>
		<category><![CDATA[#fintech]]></category>
		<category><![CDATA[#fintech innovation]]></category>
		<category><![CDATA[#future of finance]]></category>
		<category><![CDATA[#grow your wealth]]></category>
		<category><![CDATA[#invest smart]]></category>
		<category><![CDATA[#investment platform usa]]></category>
		<category><![CDATA[#online investment platform]]></category>
		<category><![CDATA[#passive income investing]]></category>
		<category><![CDATA[#r-ai finance]]></category>
		<category><![CDATA[#r-ai investment]]></category>
		<category><![CDATA[#r-ai platform]]></category>
		<category><![CDATA[#r-ai technology]]></category>
		<category><![CDATA[#r-ai trading]]></category>
		<category><![CDATA[#robo advisor]]></category>
		<category><![CDATA[#smart finance tools]]></category>
		<category><![CDATA[#smart investing]]></category>
		<category><![CDATA[#wealth management]]></category>
		<guid isPermaLink="false">https://www.sll.it/?p=292</guid>

					<description><![CDATA[<p>The global investment landscape is undergoing a dramatic transformation. Over the past few years, artificial intelligence has moved from being a buzzword to becoming a core driver of financial innovation. In 2026, investors-both beginners and professionals-are increasingly turning to AI-powered platforms to make smarter, faster, and more consistent decisions. Among the rising trends, platforms like [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.sll.it/the-future-of-smart-investing-how-ai-platforms-are-transforming-finance-in-2026/">The Future of Smart Investing: How AI Platforms Are Transforming Finance in 2026</a> appeared first on <a rel="nofollow" href="https://www.sll.it">Simonluca Landi</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>The global investment landscape is undergoing a dramatic transformation. Over the past few years, artificial intelligence has moved from being a buzzword to becoming a core driver of financial innovation. In 2026, investors-both beginners and professionals-are increasingly turning to AI-powered platforms to make smarter, faster, and more consistent decisions.</p>



<p>Among the rising trends, platforms like <a href="https://r-ai.one/"><strong>r-ai investment</strong></a> are gaining attention for their ability to combine automation, data analysis, and user-friendly interfaces into a single ecosystem. But what exactly makes AI-driven investing so appealing, and why are more people choosing it over traditional methods?</p>



<p><strong>The Evolution of Investing in the AI Era</strong></p>



<p>Traditional investing often requires deep market knowledge, constant monitoring, and emotional discipline. Even experienced investors can struggle with market volatility, information overload, and timing decisions.</p>



<p>AI changes this equation.</p>



<p>Modern systems use machine learning algorithms to analyze massive datasets in real time-far beyond human capability. These systems can identify patterns, predict trends, and execute trades with precision. As a result, platforms such as <a href="https://fwnbc.marketminute.com/article/marketersmedia-2026-3-5-r-ai-technology-finance-limited-builds-a-multi-asset-ai-collaborative-system-promoting-an-upgrade-to-the-structure-of-personal-asset-management-in-the-web-40-era"><strong>r-ai fintech investment platform usa</strong></a> are designed to simplify complex processes and provide accessible solutions for a global audience.</p>



<p>Instead of spending hours analyzing charts or reading financial reports, users can rely on intelligent automation to handle the heavy lifting.</p>



<p><strong>Why Automated Investment is Gaining Popularity</strong></p>



<p>The rise of <a href="https://ms.wikipedia.org/wiki/R-AI_Technology_Finance_Limited"><strong>automated investment software usa</strong></a> reflects a broader shift toward efficiency and accessibility. Here are some of the main reasons behind this growing demand:</p>



<p><strong>1. Data-Driven Decisions</strong></p>



<p>AI platforms eliminate emotional bias. Every decision is based on data, historical trends, and predictive modeling. This reduces the risk of impulsive actions that often lead to losses.</p>



<p><strong>2. Time Efficiency</strong></p>



<p>For busy professionals or entrepreneurs, time is a valuable resource. Automated systems allow users to invest without constantly monitoring the market.</p>



<p><strong>3. Accessibility for Beginners</strong></p>



<p>In the past, investing required significant knowledge or access to financial advisors. Today, AI platforms make it possible for beginners to participate with minimal learning curves.</p>



<p><strong>4. Continuous Optimization</strong></p>



<p>AI systems learn and adapt. As markets evolve, these platforms adjust strategies in real time, ensuring that users remain competitive.</p>



<p>This is why many consider AI investing not just a trend, but the future of financial growth.</p>



<p><strong>The Role of Fintech Companies in the USA</strong></p>



<p>The United States remains one of the most influential hubs for financial technology innovation. A growing number of <a href="https://r-ai.one/"><strong>fintech company usa investment</strong></a> solutions are leveraging AI to redefine how people manage wealth.</p>



<p>These companies are focused on:</p>



<ul class="wp-block-list">
<li>Building secure and scalable platforms</li>



<li>Ensuring compliance with financial regulations</li>



<li>Providing transparent and user-friendly experiences</li>



<li>Integrating advanced analytics with intuitive dashboards</li>
</ul>



<p>By combining technology with financial expertise, they are creating ecosystems where users can confidently grow their investments.</p>



<p><strong>Emerging AI Investment Tools in 2026</strong></p>



<p>As technology advances, the capabilities of AI investment platforms continue to expand. The latest <a href="https://fwnbc.marketminute.com/article/marketersmedia-2026-3-5-r-ai-technology-finance-limited-builds-a-multi-asset-ai-collaborative-system-promoting-an-upgrade-to-the-structure-of-personal-asset-management-in-the-web-40-era"><strong>new ai investment tools 2026</strong></a> offer features that were unimaginable just a few years ago.</p>



<p>Some of the most notable innovations include:</p>



<p><strong>Predictive Market Analysis</strong></p>



<p>AI can now anticipate market movements based on global events, sentiment analysis, and historical data correlations.</p>



<p><strong>Smart Portfolio Diversification</strong></p>



<p>Instead of relying on static portfolios, AI dynamically reallocates assets to optimize returns and manage risk.</p>



<p><strong>Real-Time Risk Management</strong></p>



<p>Advanced systems continuously monitor market conditions and adjust strategies to minimize potential losses.</p>



<p><strong>Personalized Investment Strategies</strong></p>



<p>Each user receives tailored recommendations based on their goals, risk tolerance, and financial behavior.</p>



<p>These features are not just improving performance-they are redefining what it means to invest intelligently.</p>



<p><strong>Trust, Transparency, and Legal Considerations</strong></p>



<p>One of the most common concerns when adopting new technology is trust. Investors want to know that their funds and data are secure.</p>



<p>That’s why platforms like <a href="https://ms.wikipedia.org/wiki/R-AI_Technology_Finance_Limited"><strong>r-ai investment platform legal usa</strong></a> emphasize compliance with regulatory standards and transparent operations. Being aligned with legal frameworks ensures that users can invest with confidence, knowing that the platform operates within established guidelines.</p>



<p>Security measures such as encryption, multi-factor authentication, and audited systems further enhance trustworthiness.</p>



<p><strong>Who Can Benefit from AI Investment Platforms?</strong></p>



<p>The beauty of AI investing lies in its versatility. It is not limited to a specific type of user. Instead, it caters to a wide range of individuals:</p>



<ul class="wp-block-list">
<li><strong>Beginners</strong> who want a simple entry point into investing</li>



<li><strong>Professionals</strong> seeking efficiency and automation</li>



<li><strong>Entrepreneurs</strong> looking to diversify income streams</li>



<li><strong>Global investors</strong> who want access to US-based financial technology</li>
</ul>



<p>Whether someone is starting with a small amount or managing a larger portfolio, AI platforms provide scalable solutions.</p>



<p><strong>How to Get Started</strong></p>



<p>Getting started with AI investing is simpler than many people expect. Most platforms are designed with user experience in mind, offering guided onboarding processes.</p>



<p>To begin, users typically:</p>



<ol class="wp-block-list">
<li>Create an account</li>



<li>Set their investment goals</li>



<li>Choose a risk level</li>



<li>Deposit funds</li>



<li>Activate automated strategies</li>
</ol>



<p>For those ready to explore this opportunity, the next step is to <strong>sign up ai investment platform usa</strong> and experience how automation can transform their financial journey.</p>



<p><strong>The Future of AI in Finance</strong></p>



<p>Looking ahead, AI will continue to play an even bigger role in global finance. As algorithms become more sophisticated and data sources expand, the accuracy and efficiency of investment platforms will only improve.</p>



<p>We can expect:</p>



<ul class="wp-block-list">
<li>Deeper integration with global markets</li>



<li>Enhanced predictive capabilities</li>



<li>More personalized financial ecosystems</li>



<li>Greater accessibility for users worldwide</li>
</ul>



<p>In this evolving landscape, early adopters stand to gain the most. By embracing AI-driven solutions today, investors position themselves ahead of the curve.</p>



<p><strong>Final Thoughts</strong></p>



<p>The shift toward AI-powered investing is not just a technological upgrade-it represents a fundamental change in how people approach wealth creation. Platforms like <strong>r-ai investment</strong> are at the forefront of this transformation, offering tools that empower users to make smarter decisions with less effort.</p>



<p>As the financial world becomes increasingly complex, simplicity, automation, and intelligence are becoming essential. AI investment platforms bring all three together, making them an attractive option for anyone looking to grow their assets in a modern, efficient way.</p>



<p>For those seeking a smarter approach to investing in 2026 and beyond, AI may not just be an option-it may be the standard.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img decoding="async" src="https://i.imgur.com/vsL9TsD.png" alt="" style="width:268px;height:auto"/></figure>
</div><p>The post <a rel="nofollow" href="https://www.sll.it/the-future-of-smart-investing-how-ai-platforms-are-transforming-finance-in-2026/">The Future of Smart Investing: How AI Platforms Are Transforming Finance in 2026</a> appeared first on <a rel="nofollow" href="https://www.sll.it">Simonluca Landi</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.sll.it/the-future-of-smart-investing-how-ai-platforms-are-transforming-finance-in-2026/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>⚡Lightning Network⚡make no sense</title>
		<link>https://www.sll.it/%e2%9a%a1lightning-network%e2%9a%a1non-ha-senso-ecco-perche/</link>
					<comments>https://www.sll.it/%e2%9a%a1lightning-network%e2%9a%a1non-ha-senso-ecco-perche/#respond</comments>
		
		<dc:creator><![CDATA[stable_2026]]></dc:creator>
		<pubDate>Mon, 13 May 2019 12:30:50 +0000</pubDate>
				<category><![CDATA[Crypto]]></category>
		<guid isPermaLink="false">http://www.sll.it/?p=263</guid>

					<description><![CDATA[<p>Read here: https://medium.com/coinmonks/why-lightning-network-makes-no-sense-39ca172f50d1</p>
<p>The post <a rel="nofollow" href="https://www.sll.it/%e2%9a%a1lightning-network%e2%9a%a1non-ha-senso-ecco-perche/">⚡Lightning Network⚡make no sense</a> appeared first on <a rel="nofollow" href="https://www.sll.it">Simonluca Landi</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Read here: <a href="https://medium.com/coinmonks/why-lightning-network-makes-no-sense-39ca172f50d1">https://medium.com/coinmonks/why-lightning-network-makes-no-sense-39ca172f50d1</a></p><p>The post <a rel="nofollow" href="https://www.sll.it/%e2%9a%a1lightning-network%e2%9a%a1non-ha-senso-ecco-perche/">⚡Lightning Network⚡make no sense</a> appeared first on <a rel="nofollow" href="https://www.sll.it">Simonluca Landi</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.sll.it/%e2%9a%a1lightning-network%e2%9a%a1non-ha-senso-ecco-perche/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Continuous Deployment Practice #6: Automate Rollback</title>
		<link>https://www.sll.it/continuous-deployment-practice-6-automate-rollback/</link>
					<comments>https://www.sll.it/continuous-deployment-practice-6-automate-rollback/#respond</comments>
		
		<dc:creator><![CDATA[stable_2026]]></dc:creator>
		<pubDate>Fri, 24 May 2013 16:19:00 +0000</pubDate>
				<category><![CDATA[Continuous Deployment]]></category>
		<guid isPermaLink="false">http://www.sll.it/?p=231</guid>

					<description><![CDATA[<p>You have just completed the deploy of latest version on your production environment, but something was wrong, and after a few minutes/hours the business guys ask you to revert to the previous version. You was smart, and did a backup of the latest version in production in a tar.gz. Next you manually copied the backup [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.sll.it/continuous-deployment-practice-6-automate-rollback/">Continuous Deployment Practice #6: Automate Rollback</a> appeared first on <a rel="nofollow" href="https://www.sll.it">Simonluca Landi</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>You have just completed the deploy of latest version on your production environment, but something was wrong, and after a few minutes/hours the business guys ask you to revert to the previous version. You was smart, and did a backup of the latest version in production in a tar.gz. Next you manually copied the backup and deployd it to all your servers&#8230;. without making mistakes, because you had a perfect documentation for this procedure, and you remembered well all the steps to rollback&#8230; isn&#8217;t?</p>
<p><strong>Antipattern</strong>: use a backup to rollback an application to a previous version.</p>
<h2>The recipe: automate the rollback in the same way you automate the deploy</h2>
<p>In the last post we see <a title="Continuous Deployment Practice #5: Use Business Metrics (KPI) to validate deploy" href="http://www.sll.it/continuous-deployment-practice-5-use-business-metrics-kpi-to-validate-deploy/">how to use business metrics to validate a deploy</a>, using a mix of software instrumentation and PaaS services. But what to do when a deploy validation fails?</p>
<p>You have at least 2 different aspects to consider:</p>
<ul>
<li>Changes at &#8220;behaviour&#8221; level (your source code)</li>
<li>Changes at &#8220;data&#8221; level (your database</li>
</ul>
<h3>Rollback of Source Code</h3>
<p>At <a title="Onebip by Neomobile" href="http://www.onebip.com">onebip.com</a> we use a simple trick: every deploy is in different new folder, with a unique generated name (provided by our deployment pipeline tool). After a successful and validated deploy we <strong>update a symbolic link</strong> &#8220;onebip&#8221; to the working directory of the latest version of the application. To rollback the code, we just <strong>revert the symbolic link</strong> to the previous version, a matter of few seconds.</p>
<p><img decoding="async" alt="" src="data:image/png;base64,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" /></p>
<p>&nbsp;</p>
<p>But how to know which is previous version? we create a previousVersion file with a very simple command</p>
<pre class="brush: xml; gutter: false; first-line: 1">&lt;echo msg=&quot;Preparing version info file in ${deploy.basedir}&quot; /&gt;
&lt;phingcall target=&quot;exec-pssh&quot;&gt;
  &lt;property name=&quot;ssh.host.remote&quot; value=&quot;${ws.hosts.argument}&quot; /&gt;
  &lt;property name=&quot;ssh.command&quot;
            value=&quot;echo `readlink ${deploy.basedir}` &gt; ${deploy.basedir.number}/previousVersion&quot; /&gt;
&lt;/phingcall&gt;
&lt;echo msg=&quot;Version info OK!&quot; /&gt;</pre>
<p>Now the rollback becames easy:</p>
<pre class="brush: xml; gutter: false; first-line: 1">&lt;target name=&quot;rollback&quot;&gt;
    &lt;echo msg=&quot;Rollback&quot; /&gt;
    &lt;exec command=&quot;echo &#039;-H ${ssh.username}@${ws.host}&#039;&quot; outputProperty=&quot;ws.hosts.argument&quot; /&gt;
    &lt;phingcall target=&quot;exec-pssh&quot;&gt;
        &lt;property name=&quot;ssh.host.remote&quot; value=&quot;${ws.hosts.argument}&quot; /&gt;
        &lt;property name=&quot;ssh.command&quot;
                  value=&quot;
                        cd ${deploy.basedir} &amp;amp;&amp;amp;
                        PREVIOUS_VERSION=`cat previousVersion` &amp;amp;&amp;amp;
                        echo PREVIOUS_VERSION is $PREVIOUS_VERSION &amp;amp;&amp;amp;
                        if [ ! -d $PREVIOUS_VERSION ];
                        then
                            echo FAILURE PREVIOUS_VERSION $PREVIOUS_VERSION does not exist, we can not rollback;
                            exit 255;
                        fi &amp;amp;&amp;amp;
                        cd .. &amp;amp;&amp;amp;
                        rm -fR ${deploy.basedir} &amp;amp;&amp;amp;
                        ln -s $PREVIOUS_VERSION ${deploy.basedir} &amp;amp;&amp;amp;
                        ACTUAL_VERSION=`readlink ${deploy.basedir}` &amp;amp;&amp;amp;
                        if [ $ACTUAL_VERSION != $PREVIOUS_VERSION ];
                            then
                                echo FAILURE ACTUAL_VERSION: $ACTUAL_VERSION, PREVIOUS_VERSION: $PREVIOUS_VERSION;
                            else
                                echo OK link ok actual: $ACTUAL_VERSION;
                        fi
                        &quot; /&gt;
    &lt;/phingcall&gt;
    &lt;echo msg=&quot;Rollback done&quot; /&gt;
&lt;/target&gt;</pre>
<h3>Rollback of Persisted Data</h3>
<p>The management of data is a bit harder, because you have to manage the schema changes, in the persisted data and at application level.</p>
<p>A specific post on the subject will coming soon&#8230; for now let assume that you can simply run a rollback script and revert schema and data on you database.</p>
<h2>Test the Rollback automation</h2>
<p>An important point to remember is that the rollback must be tested, as you do with any other feature. The current process thaw we use is very simple: at every deploy in the &#8220;Integration Test&#8221; environment, we do the following steps:</p>
<ul>
<li>deploy new version</li>
<li>rollback</li>
<li>deploy new version again</li>
</ul>
<h2>Conclusions</h2>
<p>This is a lesson learn from the first &#8220;not working&#8221; rollback we did in production&#8230;. now we want to be sure that rollback works every time, so we <strong>automated</strong> it and<strong> dry run the rollback</strong> procedure in deployment pipeline.</p>
<p>What are you thoughts on the subject? How do you manage rollbacks? Let me know <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>The post <a rel="nofollow" href="https://www.sll.it/continuous-deployment-practice-6-automate-rollback/">Continuous Deployment Practice #6: Automate Rollback</a> appeared first on <a rel="nofollow" href="https://www.sll.it">Simonluca Landi</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.sll.it/continuous-deployment-practice-6-automate-rollback/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Continuous Deployment Practice #5: Use Business Metrics (KPI) to validate deploy</title>
		<link>https://www.sll.it/continuous-deployment-practice-5-use-business-metrics-kpi-to-validate-deploy/</link>
					<comments>https://www.sll.it/continuous-deployment-practice-5-use-business-metrics-kpi-to-validate-deploy/#respond</comments>
		
		<dc:creator><![CDATA[stable_2026]]></dc:creator>
		<pubDate>Mon, 15 Apr 2013 21:09:54 +0000</pubDate>
				<category><![CDATA[Continuous Deployment]]></category>
		<category><![CDATA[datadog]]></category>
		<category><![CDATA[deploy validation]]></category>
		<category><![CDATA[kpi]]></category>
		<category><![CDATA[metrics]]></category>
		<guid isPermaLink="false">http://www.sll.it/?p=220</guid>

					<description><![CDATA[<p>After you deploy your application on production environment, you should be sure that everything is up an running fine, and that your business still run as expected. You look at you logs and everything is fine: no error is present and the application flows regularly, then you run a manual test and it works as [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.sll.it/continuous-deployment-practice-5-use-business-metrics-kpi-to-validate-deploy/">Continuous Deployment Practice #5: Use Business Metrics (KPI) to validate deploy</a> appeared first on <a rel="nofollow" href="https://www.sll.it">Simonluca Landi</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>After you deploy your application on production environment, you should be sure that everything is up an running fine, and that your business still run as expected. You look at you logs and everything is fine: no error is present and the application flows regularly, then you run a manual test and it works as expected.</p>
<p>The day after you receive a phone call: you daily income from is half of the day before, and all the people in the business team is angry with you&#8230;</p>
<p><strong>Antipattern</strong>: validate your deploy looking at your logs and running a manual test of your application.</p>
<h2>The recipe: use business metrics to validate a deploy</h2>
<p>At <a title="Onebip by Neomobile" href="http://www.onebip.com">onebip.com</a> we found that a better way to validate if a deploy can be considered successful or not is to measure some business kpi after a deploy for a few minutes (2 minutes is enough): if the kpi values still in the normal range, than the deploy is considered &#8220;good&#8221;, otherwise an automatic rollback to previous version is run.</p>
<p>Here an example from our phing build.xml file:</p>
<pre class="brush: xml; gutter: false; first-line: 1"> &lt;target name=&quot;validate-deploy-by-kpi&quot; depends=&quot;prepare&quot;&gt;
   &lt;echo msg=&quot;Validation by kpi for deploy ${build.number} started...&quot; /&gt;
   &lt;exec command=&quot;php ${project.basedir}/code/libraries/Onebip/Monitoring/validateDeploy.php&quot; outputProperty=&quot;validate.deploy.kpi.output&quot; /&gt;
   &lt;echo msg=&quot;validate.deploy.output: ${validate.deploy.kpi.output}&quot; /&gt;
   &lt;condition property=&quot;validate.kpi.failed&quot;&gt;
     &lt;contains substring=&quot;FAILED&quot; string=&quot;${validate.deploy.kpi.output}&quot; /&gt;
   &lt;/condition&gt;
   &lt;fail if=&quot;validate.kpi.failed&quot; message=&quot;Validation by kpi on deploy ${build.number} failed. We should rollback&quot; /&gt;
   &lt;echo msg=&quot;Validation by kpi for deploy ${build.number} completed&quot; /&gt;
 &lt;/target&gt;</pre>
<p>The KPIs used for deploy validation are <strong>the same that we use for h24x7application monitoring</strong>: we instrumented the software using some probes (for the curious people, some details are shared <a title="Monitoring with DataDog" href="http://css.dzone.com/articles/monitoring-datadog">here on DZone</a>) and we send application metrics to <a title="Datadog" href="http://www.datadoghq.com/">Datadog</a>, as SaaS solution born to track metrics and events.</p>
<p>To validate the deploy, we just query the Datadog service (2 minutes after the deploy) using a custom php script able to manage the http authentication and retrieve the most important business metrics, then we check if the last values are inside a predetermined confidence band, and decide for the &#8220;go/no-go&#8221;.</p>
<p>Here an example: the 2 red vertical bars mark the start/end of the &#8220;validation by KPI&#8221; step</p>
<p><img fetchpriority="high" decoding="async" class="alignnone" title="Deploy Validation by business KPI" alt="" src="data:image/png;base64,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" width="648" height="213" /></p>
<h2>Conclusions</h2>
<p>Instrument your software to track business metrics, and then use the same metrics to validate if a deploy can be considered successful or not.</p>
<p>&nbsp;</p>
<p>The post <a rel="nofollow" href="https://www.sll.it/continuous-deployment-practice-5-use-business-metrics-kpi-to-validate-deploy/">Continuous Deployment Practice #5: Use Business Metrics (KPI) to validate deploy</a> appeared first on <a rel="nofollow" href="https://www.sll.it">Simonluca Landi</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.sll.it/continuous-deployment-practice-5-use-business-metrics-kpi-to-validate-deploy/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Continuous Deployment Practice #8: Scale down, not up</title>
		<link>https://www.sll.it/continuous-deployment-practice-8-scale-down-not-up/</link>
					<comments>https://www.sll.it/continuous-deployment-practice-8-scale-down-not-up/#respond</comments>
		
		<dc:creator><![CDATA[stable_2026]]></dc:creator>
		<pubDate>Fri, 21 Dec 2012 18:09:25 +0000</pubDate>
				<category><![CDATA[Continuous Deployment]]></category>
		<guid isPermaLink="false">http://www.sll.it/?p=204</guid>

					<description><![CDATA[<p>You deploy the application on your production environment and&#8230; surprise: doesn&#8217;t work! Antipattern: start from your dev environment and scale up adding more servers, load balancers, db replicas etc&#8230; While this seems a standard way to design and release a new application, it will just postpone the issues the you will have when you will [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.sll.it/continuous-deployment-practice-8-scale-down-not-up/">Continuous Deployment Practice #8: Scale down, not up</a> appeared first on <a rel="nofollow" href="https://www.sll.it">Simonluca Landi</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>You deploy the application on your production environment and&#8230; surprise: doesn&#8217;t work!</p>
<p><strong>Antipattern</strong>: start from your dev environment and scale up adding more servers, load balancers, db replicas etc&#8230;</p>
<p>While this seems a standard way to design and release a new application, it will just postpone the issues the you will have when you will scale up your infrastructure to production.<br />
Let me clarify: at a first glance, this can be confused with &#8220;over design&#8221;, and we all know this is wrong, but you know that application <em>will</em> run in a production environment, serving real users, so you have to <strong>design starting from your production</strong> environment, and solve the issues that arise here first (fail fast and learn fast, as always).</p>
<h2>The recipe: scale down from production</h2>
<p>Here is a list of design considerations, emerged from experiences at my company.<br />
One of our application, based on PHP+MongoDB, run on &#8220;standard&#8221; setup for a production environment: one domain name is resolved to 2 different IPs, allocated to 2 load balancers running HAProxy; the load balancers direct the traffic to 2 or more web servers running Apache+PHP, connected to a 3 nodes MongoDB replica set (no need for a shard yet). All the machines are virtual machines, built using <a href="http://www.rightscale.com/">RighScale</a> templates.</p>
<p>Using this methodology, can &#8220;scale down&#8221; the infrastructure simply collapsing the 3 layers (LB, FrontEnd, BackEnd) in less virtual machines, still using the same full stack: for instance, our &#8220;Integration Tests&#8221; environment runs the full stack on a single machine, but HAProxy and a MongoDB replica set are included, even if not required. The apparently complexity of this setup is simplyfied by using &#8220;Server Templates&#8221; and virtual machines, than can be instantiated from scratch with just a simple click of a button.</p>
<p>The development environment is a virtual machine too, running on each of our laptop; we are working to have the dev virtual machine built from a <a href="http://www.rightscale.com/">RightScale</a> template too, but at least we can share a &#8220;master&#8221; image to all the evs when something changes in the setup (an article on that coming soon&#8230;)<br />
This practice saved our life a few times:</p>
<ul>
<li>Starting from v.1.3, the MongoDB driver for PHP requires a different configuration for replica set: we discovered that BEFORE going in production enviroment (yes&#8230; we should read the change log&#8230;)</li>
<li>We have cron jobs that must run as &#8220;environment singleton&#8221; (just job running in a given enviroment): again, we discoverd this need BEFORE going in production and addressed it.</li>
<li>Because we have multiple front end web servers in production, we need to address the &#8220;session management&#8221;: the final decision was to design the application &#8220;sessionless&#8221;. If we would have followed the classic approch, we should have addressed the &#8220;session management&#8221; in prodution enviroment in some way: storing sessions on DB, using server affinity in load balancer, etc&#8230; in summary: a more complex infrastructure.</li>
</ul>
<h2>Conclusions</h2>
<p>Starting from <strong>design your production enviroment and</strong> scale it down is a practice to anticipate the troubles, and solve them at &#8220;development&#8221; stage.<br />
Usign modern technologies like server virtualization and automated infrastructure provisioning, simplify this practice.</p>
<p>The post <a rel="nofollow" href="https://www.sll.it/continuous-deployment-practice-8-scale-down-not-up/">Continuous Deployment Practice #8: Scale down, not up</a> appeared first on <a rel="nofollow" href="https://www.sll.it">Simonluca Landi</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.sll.it/continuous-deployment-practice-8-scale-down-not-up/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Continuous Deployment Practice #4: Smoke test the deployment</title>
		<link>https://www.sll.it/continuous-deployment-practice-4-smoke-test-the-deployment/</link>
					<comments>https://www.sll.it/continuous-deployment-practice-4-smoke-test-the-deployment/#respond</comments>
		
		<dc:creator><![CDATA[stable_2026]]></dc:creator>
		<pubDate>Tue, 18 Dec 2012 00:14:07 +0000</pubDate>
				<category><![CDATA[Continuous Deployment]]></category>
		<category><![CDATA[smoke test]]></category>
		<guid isPermaLink="false">http://www.sll.it/?p=186</guid>

					<description><![CDATA[<p>The first problem than you can have after a deployment is that&#8230;. the configuration files for your software are somehow wrong: a wrong database password, a wrong connection url, a wrong log file name&#8230; more or less every configuration parameter in your application can be wrong. Antipattern: prepare a configuration file for the production environment, [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.sll.it/continuous-deployment-practice-4-smoke-test-the-deployment/">Continuous Deployment Practice #4: Smoke test the deployment</a> appeared first on <a rel="nofollow" href="https://www.sll.it">Simonluca Landi</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>The first problem than you can have after a deployment is that&#8230;. the <strong>configuration files</strong> for your software are somehow <strong>wrong</strong>: a wrong database password, a wrong connection url, a wrong log file name&#8230; more or less every configuration parameter in your application can be wrong.</p>
<p><strong>Antipattern</strong>: prepare a configuration file for the production environment, deploy the application and look at the logs.</p>
<p>Well, you know what happen now: the application sometimes fails to start and you have to spend your time looking at your log files, while the application is down and your services not available to users.</p>
<p>We found a simple solution for that: introduce a <strong>smoke test</strong> stage into the deployment pipeline.</p>
<h2>The recipe to smoke test your deployment</h2>
<p>First of all, what is a <strong>Smoke Test</strong>? According to <a title="wikipedia smoke test" href="http://en.wikipedia.org/wiki/Smoke_testing">Wikipedia</a>,</p>
<blockquote><p>a smoke test proves that &#8220;the pipes will not leak, the keys seal properly, the circuit will not burn, or the software will not crash outright</p></blockquote>
<p>The idea is simple: <strong>read the configuration parameters and validate them in the actual environment</strong>. For instance:</p>
<ul>
<li>search all the database connection parameters (hostname, database name, username, password, etc&#8230;) and try to make a real connection to that database.</li>
<li>search all the remote URLs your application uses (APIs, webservices, etc..) and try to connect to them.</li>
<li>search all the folder names and file names and check the existence and the permissions.</li>
</ul>
<p>You can just create a script in your preferred language, execute it <strong>before</strong> going live with the new release (remember the <a title="Continous Deployment Practice #3: Deploy on the same way from dev to production environment" href="http://www.sll.it/continous-depoloyment-practice-3-deploy-on-the-same-way-from-dev-to-production-environment/">Practice #3: Deploy on the same way from dev to production environment</a>) and abort the build in case of a test failure: your application still at the actual release and continues to be available to your users.</p>
<p>It&#8217;s very import to execute the smoke test script in the enviroment where your application run, because you want to be sure that the resources (database, external API, etc..) are available <strong>from the same host</strong> where the application is installed, so, if you have multiple servers, run the smoke tests from <strong>all</strong> the servers in  the array.</p>
<p>Here some real how-to, taken from our smoke test scripts.</p>
<h3>How to smoke test a MongoDB connection</h3>
<p>Here an example script:</p>
<pre class="brush: bash; gutter: false">$ smoke-test-mongo-connection.sh srv1:27017,srv2:27017,srv3:27017</pre>
<pre class="brush: bash; gutter: true">#!/bin/bash
# smoke-test-mongo-connection.sh
#
IFS=&#039;,&#039; read -ra mongoConnections &lt;&lt;&lt; &quot;$1&quot;
mongoConnection=${mongoConnections[0]}

mongoOutput=$(mongo  $mongoConnection --eval &#039;status = db.serverStatus(); print(status[&quot;ok&quot;]);&#039; --quiet)
if [ &quot;$mongoOutput&quot; != &quot;1&quot; ]; then
    echo &quot;MongoDB not reachable at: $mongoConnection&quot;
    exit 1
fi

echo &quot;Check configuration OK&quot;</pre>
<h3>How to smoke test folder permissions</h3>
<p>Just run a script like this:</p>
<pre class="brush: bash; gutter: false">$ smoke-test-log-permissions.sh path/to/my/logs theuser</pre>
<p>&nbsp;</p>
<pre class="brush: bash; gutter: true">#!/bin/bash
# smoke-test-log-permissions.sh
#
applicationLogPath=$1
applicationLogPathPermissions=$2

applicationLogPathOutput=$(stat --format=%U $applicationLogPath)
if [ &quot;$applicationLogPathOutput&quot; != &quot;$applicationLogPathPermissions&quot; ]; then
    echo &quot;Permissions or owner of file $applicationLogPath are wrong: $applicationLogPathOutput&quot;
    exit 1
fi

echo &quot;Check configuration OK&quot;</pre>
<h3>How to smoke test an URL</h3>
<p>You can just execute a script like this:</p>
<pre class="brush: bash; gutter: false">$ smoke-test-url.sh http://api.exmaple.com</pre>
<p>&nbsp;</p>
<pre class="brush: bash; gutter: true">#!/bin/bash
# smokte-test-url.sh
#
statusOutput=$(curl --insecure --silent -o /dev/null  -w %{http_code} $url)
if [[ &quot;$statusOutput&quot; == &quot;000&quot; || &quot;$statusOutput&quot; == &quot;40*&quot; || &quot;$statusOutput&quot; == &quot;50*&quot; ]]; then
    echo &quot;$url not reachable&quot;
    exit 1
fi
echo &quot;Check configuration OK&quot;</pre>
<h2> Conclusions</h2>
<p>As you can understand, I can show here just a few rows of our <strong>deployment smoke test</strong> script, but I think you can get the idea:</p>
<ul>
<li>Parse the configuration files</li>
<li>Try to instantiate database connections, connect to URLs and writing to files</li>
<li>fail the build if one resource is not available</li>
</ul>
<p>I would like to see your comments and thoughts here</p>
<p>The post <a rel="nofollow" href="https://www.sll.it/continuous-deployment-practice-4-smoke-test-the-deployment/">Continuous Deployment Practice #4: Smoke test the deployment</a> appeared first on <a rel="nofollow" href="https://www.sll.it">Simonluca Landi</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.sll.it/continuous-deployment-practice-4-smoke-test-the-deployment/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Continuous Deployment From The Trenches</title>
		<link>https://www.sll.it/continuous-deployment-from-the-trenches/</link>
					<comments>https://www.sll.it/continuous-deployment-from-the-trenches/#respond</comments>
		
		<dc:creator><![CDATA[stable_2026]]></dc:creator>
		<pubDate>Sun, 02 Dec 2012 21:39:25 +0000</pubDate>
				<category><![CDATA[Continuous Deployment]]></category>
		<guid isPermaLink="false">http://www.sll.it/?p=137</guid>

					<description><![CDATA[<p>This is what we are learning in the Company that I work for, where we are moving from an &#8220;svn update /var/www&#8221; anti-pattern to a deployment pipeline in 4 different environments, from Dev to Production. Here you can find real solutions and how-to that worked on our environment. Practices that we follow for Continuous Deployment [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.sll.it/continuous-deployment-from-the-trenches/">Continuous Deployment From The Trenches</a> appeared first on <a rel="nofollow" href="https://www.sll.it">Simonluca Landi</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>This is what we are learning in the Company that I work for, where we are moving from an &#8220;svn update /var/www&#8221; anti-pattern to a deployment pipeline in 4 different environments, from Dev to Production.</p>
<p>Here you can find real solutions and how-to that worked on our environment.</p>
<h2>Practices that we follow for Continuous Deployment</h2>
<p>As soon as we feel that we are suffering in some way, we try to find a Practice to mitigate this sufferance. Here what we did until now</p>
<p>Practice #1: Same software stack from dev to production environment<br />
Mitigate: &#8220;on my PC works!&#8221;</p>
<p>Practice #2: Dedicated Continuous Integration environment for unit test<br />
Mitigate: &#8220;on my PC works!&#8221;</p>
<p><a title="Continous Deployment Practice #3: Deploy on the same way from dev to production environment" href="http://www.sll.it/continous-depoloyment-practice-3-deploy-on-the-same-way-from-dev-to-production-environment/">Practice #3: Deploy on the same way from dev to production environment</a><br />
Mitigate: deployment to production fails</p>
<p><a title="Continuous Deployment Practice #4: Smoke test the deployment" href="http://www.sll.it/continuous-deployment-practice-4-smoke-test-the-deployment/">Practice #4: Smoke test the deployments</a><br />
Mitigate: major configuration errors</p>
<p><a title="Continuous Deployment Practice #5: Use Business Metrics (KPI) to validate deploy" href="http://www.sll.it/continuous-deployment-practice-5-use-business-metrics-kpi-to-validate-deploy/">Practice #5: Use Business Metrics (KPI) to validate deploy</a><br />
Mitigate: deployment to production secceded, but business was impacted</p>
<p><a title="Continuous Deployment Practice #6: Automate Rollback" href="http://www.sll.it/continuous-deployment-practice-6-automate-rollback/">Practice #6: Automate Rollback</a><br />
Mitigate: production downtime after a failed deploy</p>
<p>Practice #7: Keep deployment pipeline fast<br />
Mitigate: too much time required to go in production</p>
<p><a title="Continuous Deployment Practice #8: Scale down, not up" href="http://www.sll.it/continuous-deployment-practice-8-scale-down-not-up/">Practice #8: Scale down, not up</a><br />
Mitigate: &#8220;on my PC works!&#8221;</p>
<p>(updated soon&#8230;)</p>
<p>&nbsp;</p>
<p>The post <a rel="nofollow" href="https://www.sll.it/continuous-deployment-from-the-trenches/">Continuous Deployment From The Trenches</a> appeared first on <a rel="nofollow" href="https://www.sll.it">Simonluca Landi</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.sll.it/continuous-deployment-from-the-trenches/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Continous Deployment Practice #3: Deploy on the same way from dev to production environment</title>
		<link>https://www.sll.it/continuous-depoloyment-practice-3-deploy-on-the-same-way-from-dev-to-production-environment/</link>
					<comments>https://www.sll.it/continuous-depoloyment-practice-3-deploy-on-the-same-way-from-dev-to-production-environment/#respond</comments>
		
		<dc:creator><![CDATA[stable_2026]]></dc:creator>
		<pubDate>Sun, 02 Dec 2012 21:35:43 +0000</pubDate>
				<category><![CDATA[Continuous Deployment]]></category>
		<category><![CDATA[deploy]]></category>
		<category><![CDATA[phing]]></category>
		<category><![CDATA[php]]></category>
		<guid isPermaLink="false">http://www.sll.it/?p=153</guid>

					<description><![CDATA[<p>We found that this is the best way to mitigate the usual impedance mismatch between &#8220;devs&#8221; and &#8220;operations&#8221;: deployment to production WILL fail, even if you write the best documentation possible, with a full description of all the steps required, even if the &#8220;operations&#8221; guys write some script to execute the procedures. The real solution [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.sll.it/continuous-depoloyment-practice-3-deploy-on-the-same-way-from-dev-to-production-environment/">Continous Deployment Practice #3: Deploy on the same way from dev to production environment</a> appeared first on <a rel="nofollow" href="https://www.sll.it">Simonluca Landi</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>We found that this is the best way to mitigate the usual impedance mismatch between &#8220;devs&#8221; and &#8220;operations&#8221;: deployment to production WILL fail, even if you write the best documentation possible, with a full description of all the steps required, even if the &#8220;operations&#8221; guys write some script to execute the procedures.</p>
<p>The real solution that worked in our environment was to create a single deploy script that is used to deploy the application in all the environments in the deployment pipeline, from dev to production environment.</p>
<h2>The recipe to deploy on the same way from dev to production environment</h2>
<p>As our application stack is based on PHP running on Linux, was natural for us to implement the deploy script using <a title="phing" href="http://www.phing.info/">phing</a>, scp and ssh</p>
<p>The workflow is:</p>
<ul>
<li>build an &#8220;artifact&#8221; (environment independent)</li>
<li>copy the artifact to the destination environment in an new folder, let&#8217;s say &#8220;application.233&#8221;</li>
<li>copy the configuration files required for the destination environment</li>
<li>setup all the required permissions on destination environment</li>
<li>run the &#8220;migration&#8221; scripts required to update the database, if required</li>
<li>move a symbolic link &#8220;application&#8221; from &#8220;application.232&#8221; to &#8220;application.233&#8221;</li>
<li>apache will now see the new files and serves the new application</li>
</ul>
<p>We deploy in all the environment using this same workflow, so even to deploy on &#8220;localhost&#8221; machine, we run &#8220;scp&#8221; to copy files and &#8220;ssh&#8221; to setup permissions, run migrations, etc&#8230; and because we have multiple servers on the each environment, we use the &#8220;<a title="parallel-ssh" href="http://code.google.com/p/parallel-ssh/downloads/list">parallel-ssh</a>&#8221; and &#8220;<a title="parallel-scp" href="http://code.google.com/p/parallel-ssh/downloads/list">parallel-scp</a>&#8221; utilities.</p>
<p>Let&#8217;s see some of the magic that we have in the phing build.xml file&#8230;</p>
<h2>How to use parallel-scp to copy on multiple servers</h2>
<p>Here is the snippet from build.xml</p>
<p>&nbsp;</p>
<pre class="brush: xml; gutter: true">&lt;target name=&quot;exec-pscp&quot;&gt;
 &lt;exec
 command=&quot;pscp ${scp.host.remote} -O LogLevel=ERROR -O UserKnownHostsFile=/dev/null -O StrictHostKeyChecking=no -O IdentityFile=${ssh.privkeyfile} -t 0 ${file} &#039;${todir}&#039;&quot;
 outputProperty=&quot;pscp.output&quot;
 /&gt;
 &lt;echo msg=&quot;pscp.output: ${pscp.output}&quot; /&gt;
 &lt;condition property=&quot;pscp.failed&quot;&gt;
 &lt;contains substring=&quot;FAILURE&quot; string=&quot;${pscp.output}&quot; /&gt;
 &lt;/condition&gt;
 &lt;fail if=&quot;pscp.failed&quot; message=&quot;Remote copy failed: ${pscp.output}&quot; /&gt;
 &lt;/target&gt;</pre>
<p>&nbsp;</p>
<p>The property ${scp.host.remote} contains the list of the servers to deploy into, for instance <em>&#8220;-H root@server1 -H root@server2&#8221;</em></p>
<p>As you can see, we store the output of the pscp command in the property &#8220;pscp.output&#8221;, check the result of the operation and fail the build if required.</p>
<p>&nbsp;</p>
<h2>How to use parallel-ssh to remote execute commands on multiple servers</h2>
<p>A similar trick is used to remote execute commands on all the servers in the environment. Here is the snippet:</p>
<p>&nbsp;</p>
<pre class="brush: xml; gutter: true">&lt;target name=&quot;exec-pssh&quot;&gt;
 &lt;exec
 command=&quot;pssh ${ssh.host.remote} -O LogLevel=ERROR -O UserKnownHostsFile=/dev/null -O StrictHostKeyChecking=no -O IdentityFile=${ssh.privkeyfile} -P -i -t 0 &#039;${ssh.command}&#039;&quot;
 outputProperty=&quot;pssh.output&quot;
 /&gt;
 &lt;echo msg=&quot;pssh.output: ${pssh.output}&quot; /&gt;
 &lt;condition property=&quot;pssh.failed&quot;&gt;
 &lt;contains substring=&quot;FAILURE&quot; string=&quot;${pssh.output}&quot; /&gt;
 &lt;/condition&gt;
 &lt;fail if=&quot;pssh.failed&quot; message=&quot;Remote command failed: ${pssh.output}&quot; /&gt;
 &lt;/target&gt;</pre>
<p>&nbsp;</p>
<p>Again, the property ${scp.host.remote} contains the list of the servers to deploy and we check the result of the operation looking at the &#8220;outputProperty&#8221; of command.</p>
<h2>The deploy worlflow</h2>
<p>here is an extract from the build.xml, showing the main workflow for the deploy.</p>
<p>&nbsp;</p>
<pre class="brush: xml; gutter: true">&lt;target name=&quot;deploy&quot;&gt;
&lt;echo msg=&quot;Copying ${artifact.tgz.path} archive to environment ${deploy.environment} hosts:${fs.host}&quot; /&gt;
 &lt;phingcall target=&quot;exec-pssh&quot;&gt;
 &lt;property name=&quot;ssh.host.remote&quot; value=&quot;${fs.hosts.argument}&quot; /&gt;
 &lt;property name=&quot;ssh.command&quot; value=&quot;rm -Rf ${fs.deploy.basedir.number}; mkdir -p ${fs.deploy.basedir.number}&quot; /&gt;
 &lt;/phingcall&gt;
 &lt;phingcall target=&quot;exec-pscp&quot;&gt;
 &lt;property name=&quot;scp.host.remote&quot; value=&quot;${fs.hosts.argument}&quot; /&gt;
 &lt;property name=&quot;todir&quot; value=&quot;${fs.deploy.basedir.number}&quot; /&gt;
 &lt;property name=&quot;file&quot;  value=&quot;${artifact.tgz.path}&quot; /&gt;
 &lt;/phingcall&gt;
 &lt;echo msg=&quot;${artifact.tgz.name} copied to environment ${deploy.environment} host:${fs.host}&quot; /&gt;
&lt;!-- we unzip the application artifacts in a new fresh location,           --&gt;
 &lt;!-- set permissions and and move a symlink to this location.              --&gt;
 &lt;!-- in this way we have a local backup of previuos version, useful for    --&gt;
 &lt;!-- a fast rollback (just move the link to the previous version           --&gt;
&lt;echo msg=&quot;Estracting archive to ${deploy.basedir.number} on host:${fs.host}&quot; /&gt;
 &lt;phingcall target=&quot;exec-pssh&quot;&gt;
 &lt;property name=&quot;ssh.host.remote&quot; value=&quot;${fs.hosts.argument}&quot; /&gt;
 &lt;property name=&quot;ssh.command&quot;
 value=&quot;tar -xzf ${fs.deploy.basedir.number}/${artifact.tgz.name} -C ${fs.deploy.basedir.number};
 rm -f ${fs.deploy.basedir.number}/${artifact.tgz.name}&quot; /&gt;
 &lt;/phingcall&gt;
 &lt;echo msg=&quot;copying configs from configs/${deploy.environment} to ${fs.deploy.basedir.number}/code/configs on host:${fs.host}&quot; /&gt;
 &lt;phingcall target=&quot;exec-pssh&quot;&gt;
 &lt;property name=&quot;ssh.host.remote&quot; value=&quot;${fs.hosts.argument}&quot; /&gt;
 &lt;property name=&quot;ssh.command&quot; value=&quot;mkdir -p ${fs.deploy.basedir.number}/code/configs&quot; /&gt;
 &lt;/phingcall&gt;
 &lt;phingcall target=&quot;exec-pscp&quot;&gt;
 &lt;property name=&quot;scp.host.remote&quot; value=&quot;${fs.hosts.argument}&quot; /&gt;
 &lt;property name=&quot;todir&quot; value=&quot;${fs.deploy.basedir.number}/code/configs&quot; /&gt;
 &lt;property name=&quot;file&quot;  value=&quot;configs/${deploy.environment}/*.ini&quot; /&gt;
 &lt;/phingcall&gt;
 &lt;echo msg=&quot;done&quot; /&gt;</pre>
<p>&#8230;. more steps here&#8230;. and then</p>
<p>&nbsp;</p>
<pre class="brush: xml; gutter: true">&lt;echo msg=&quot;================================================================================&quot; /&gt;
 &lt;echo msg=&quot;Final step: Linking ${deploy.basedir.number} to ${deploy.basedir}&quot; /&gt;
 &lt;echo msg=&quot;================================================================================&quot; /&gt;
 &lt;phingcall target=&quot;exec-pssh&quot;&gt;
 &lt;property name=&quot;ssh.host.remote&quot; value=&quot;${ws.hosts.argument}&quot; /&gt;
 &lt;property name=&quot;ssh.command&quot;
 value=&quot;rm -fR ${deploy.basedir};
 ln -s ${deploy.basedir.number} ${deploy.basedir};
 &quot; /&gt;
 &lt;/phingcall&gt;
 &lt;echo msg=&quot;================================================================================&quot; /&gt;
 &lt;echo msg=&quot;Checking link...&quot; /&gt;
 &lt;phingcall target=&quot;check-link&quot; /&gt;
 &lt;echo msg=&quot;Linking OK!&quot; /&gt;
 &lt;echo msg=&quot;================================================================================&quot; /&gt;
 &lt;/deploy&gt;</pre>
<h2>Conclusions</h2>
<p>I can show here just a few snippets of our build.xml, but I think you can get the basics from what I show you:</p>
<ul>
<li>Write a single deploy script that can be used to deploy in every environment in the same way</li>
<li>Start from solving problems related to your production environment early (EG: multiple servers, minimize downtime, easy rollback, etc..)</li>
<li>Alway check the results of the operations run and fail as required.</li>
</ul>
<p>Feel free to share your comments and thoughts</p>
<p>The post <a rel="nofollow" href="https://www.sll.it/continuous-depoloyment-practice-3-deploy-on-the-same-way-from-dev-to-production-environment/">Continous Deployment Practice #3: Deploy on the same way from dev to production environment</a> appeared first on <a rel="nofollow" href="https://www.sll.it">Simonluca Landi</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.sll.it/continuous-depoloyment-practice-3-deploy-on-the-same-way-from-dev-to-production-environment/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Plugin e setting per vim utili per chi sviluppa</title>
		<link>https://www.sll.it/plugin-e-setting-per-vim-utili-per-chi-sviluppa/</link>
					<comments>https://www.sll.it/plugin-e-setting-per-vim-utili-per-chi-sviluppa/#respond</comments>
		
		<dc:creator><![CDATA[stable_2026]]></dc:creator>
		<pubDate>Wed, 31 Oct 2012 15:56:54 +0000</pubDate>
				<category><![CDATA[Sviluppo]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[vim]]></category>
		<guid isPermaLink="false">http://www.sll.it/?p=12</guid>

					<description><![CDATA[<p>Ho ripreso da poco a sviluppare codice utilizzando vim inceve dei soliti eclipse/netbeans. Lasciando perdere le discussioni su cosa sia meglio (vim o IDE), vediamo invece quali plugin ho deciso in installare e quali settings. Per semplificare la gestione dei plugin, ho preparato uno script di installazione che in un colpo solo effettua l&#8217;installazione e [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.sll.it/plugin-e-setting-per-vim-utili-per-chi-sviluppa/">Plugin e setting per vim utili per chi sviluppa</a> appeared first on <a rel="nofollow" href="https://www.sll.it">Simonluca Landi</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Ho ripreso da poco a sviluppare codice utilizzando vim inceve dei soliti eclipse/netbeans. Lasciando perdere le discussioni su cosa sia meglio (vim o IDE), vediamo invece quali plugin ho deciso in installare e quali settings. Per semplificare la gestione dei plugin, ho preparato uno script di installazione che in un colpo solo effettua l&#8217;installazione e la configurazione dei plugin per vim che ho scelto, che ora vedimao in dettaglio.<br />
Chi ha fretta, può andare direttamente allo <a href="#script_completo">script completo</a></p>
<h2>Pathogen</h2>
<p>Per prima cosa, ho installato <a href="http://www.vim.org/scripts/script.php?script_id=2332">pathogen</a>, che semplifica la gestione dei plugin, assicurando anche l&#8217;installazione del client di GIT, ed effettuando una copia dell&#8217;eventuale configuazione di vim e relativi plugin già presenti.</p>
<pre class="brush: bash; gutter: true">#!/bin/bash
apt-get install -y git
cd ~
#### make a backup

mv ~/.vim ~/vim_`date +%y%m%d%H%M%S`
mkdir .vim

#### install pathogen
cd ~
ln -s ~/.vim/vimrc .vimrc
rm -Rf pathogen
git clone git://github.com/tpope/vim-pathogen.git pathogen
mv pathogen/autoload ~/.vim/autoload
cat &amp; ~/.vim/vimrc &lt;&lt;END
call pathogen#runtime_append_all_bundles()
call pathogen#helptags()
END

cd .vim
git init
git add .
git commit -m &quot;Initial commit&quot;

###### install fugitive
cd ~/.vim
git submodule add git://github.com/tpope/vim-fugitive.git bundle/fugitive
git submodule init &amp;&amp; git submodule update</pre>
<h2>Solarized</h2>
<p><a href="http://ethanschoonover.com/solarized">Solarized</a> è un plugin che permette di cambiare la palette di colori utilizzata da vim.<br />
<a href="http://www.sll.it/wp-content/uploads/2012/10/screen-php-dark.png"><img decoding="async" class="alignnone size-full wp-image-54" title="Solarized screen-php-dark" src="http://www.sll.it/wp-content/uploads/2012/10/screen-php-dark.png" alt="" width="786" height="655" srcset="https://www.sll.it/wp-content/uploads/2012/10/screen-php-dark.png 786w, https://www.sll.it/wp-content/uploads/2012/10/screen-php-dark-300x250.png 300w" sizes="(max-width: 786px) 100vw, 786px" /></a><br />
Ecco come installarlo:</p>
<pre class="brush: bash; gutter: true">#### install Solarized
cd ~/.vim
git submodule add git://github.com/altercation/vim-colors-solarized.git bundle/solarized
git submodule init &amp;&amp; git submodule update

cat &gt;&gt; ~/.vim/vimrc &lt;&lt;END
set background=dark
let g:solarized_termtrans=1
let g:solarized_termcolors=256
let g:solarized_contrast=&quot;high&quot;
let g:solarized_visibility=&quot;high&quot;
colorscheme solarized
END

echo export TERM=&quot;xterm-256color&quot; &gt;&gt; ~/.bashrc</pre>
<h2>SuperTab</h2>
<p>SuperTab è un plugin per vim che aggiunge mappa la funzionalità di autocompletamento sul tasto [TAB] quando si è in <em>insert mode</em>. L&#8217;installazione è piuttosto semplice:</p>
<p>&nbsp;</p>
<pre class="brush: bash; gutter: false">### install SuperTab
cd ~/.vim
git submodule add https://github.com/ervandew/supertab.git bundle/supertab
git submodule init &amp;&amp; git submodule update</pre>
<h2>CTRLP</h2>
<p><a href="http://kien.github.com/ctrlp.vim/">CTLP</a> è un plugin per vim che permette di effettuare ricerche &#8220;fuzzy&#8221; all&#8217;interno di files e del buffer di vim, in modo molto semplice e potente.<br />
<img decoding="async" src="http://kien.github.com/ctrlp.vim/images/ctrlp.png" alt="CTRLP in azione" /><br />
Ecco come installarlo:</p>
<pre class="brush: bash; gutter: true">###### install CTRLP
cd ~/.vim
git submodule add https://github.com/kien/ctrlp.vim.git bundle/ctrlp
git submodule init &amp;&amp; git submodule update

cat &gt;&gt; ~/.vim/vimrc &lt;&lt;END
set runtimepath^=~/.vim/bundle/ctrlp
END

vim -c &#039;:helptags ~/.vim/bundle/ctrlp/doc|q!&#039;</pre>
<h2>Syntastic</h2>
<p><a title="Syntastic" href="https://github.com/scrooloose/syntastic">Syntastic </a> è un plugin per vim che effettua il syntax checking dei files. Supporta praticamente tutti i linguaggi più utilizzati, quali applescript, c, coffee, cpp, css, cucumber, cuda, docbk, erlang, eruby, fortran, gentoo_metadata, go, haml, haskell, html, javascript, json, less, lua, matlab, perl, php, puppet, python, rst, ruby, sass/scss, sh, tcl, tex, vala, xhtml, xml, xslt, yaml, zpt.</p>
<p><img decoding="async" src="https://github.com/scrooloose/syntastic/raw/master/_assets/screenshot_1.png" alt="syntastic in azione" /></p>
<p>Nell&#8217;ulizzo con il PHP ho trovato &#8220;fastidioso&#8221; il fatto che venissero eseguti anche i check di &#8220;stile&#8221; tramite <a href="http://pear.php.net/package/PHP_CodeSniffer/redirected">phpcs</a>, in quanto spesso mi capita di lavorare su codice legacy che non è compliant con standard di &#8220;code style&#8221;. Per disabilitare l&#8217;utilizzo di phpcs, occorre aggiungere nel .vimrc</p>
<p>&nbsp;</p>
<pre class="brush: bash; gutter: true">let g:syntastic_phpcs_disable=1</pre>
<p>&nbsp;</p>
<p>Ecco come installarlo:</p>
<pre class="brush: bash; gutter: true">###### install Syntastic to check systax inline
cd ~/.vim
git submodule add https://github.com/scrooloose/syntastic.git bundle/syntastic
git submodule init &amp;&amp; git submodule update

cat &gt;&gt; ~/.vim/vimrc &lt;&lt;END
let g:syntastic_mode_map={&#039;mode&#039;:&#039;active&#039;, &#039;active_filetypes&#039;:[], &#039;passive_filetypes&#039;:[&#039;html&#039;]}
let g:syntastic_phpcs_disable=1
END

vim -c &#039;:Helptags|q!&#039;</pre>
<p>&nbsp;</p>
<h2>Powerline</h2>
<p><a title="Powerline" href="https://github.com/Lokaltog/vim-powerline">Powerline</a> è un plugin per vim che sostituisce la statu line di vim (l&#8217;ultima riga in basso per intenderci) con una più accattivamente graficamente e ricca di informazioni, senza tuttavia distrarre l&#8217;attenzione. Ecco come appare<br />
<a href="http://www.sll.it/wp-content/uploads/2012/10/powerline_example2.png"><img decoding="async" class="alignnone size-full wp-image-33" title="powerline_example" src="http://www.sll.it/wp-content/uploads/2012/10/powerline_example2.png" alt="" width="770" height="495" srcset="https://www.sll.it/wp-content/uploads/2012/10/powerline_example2.png 770w, https://www.sll.it/wp-content/uploads/2012/10/powerline_example2-300x192.png 300w" sizes="(max-width: 770px) 100vw, 770px" /></a></p>
<p>Poiche normalmente utilizzo PuTTY come terminale da windows, ho dovuto installare un font patchato. Ecco come fare:</p>
<ul>
<li>scaricare il font DejaVuSansMono-Powerline.ttf da https://gist.github.com/1630581#file_deja_vu_sans_mono_powerline.ttf</li>
<li>installare il font su windows (basdtare fare doppio click sul font)</li>
<li>Configurare PuTTY in modo da utilizzare il &#8220;font DejaVu Sans Mono for Powerline&#8221; andando in Change</li>
<li>settings&#8211;&gt;Window&#8211;&gt;Appearance&#8211;&gt;font settings.</li>
</ul>
<p>Ecco la porzione di script relativa all&#8217;installazione di Powerline:</p>
<pre class="brush: bash; gutter: true">###### install Powerline
#
# Remember to download patched font DejaVuSansMono-Powerline.ttf for windows
# from https://gist.github.com/1630581#file_deja_vu_sans_mono_powerline.ttf
# and install in in windows, then select &quot;DejaVu Sans Mono for Powerline&quot; in PuTTY
# (Window--&gt;Appearance--&gt;font)

cd ~/.vim
git submodule add https://github.com/Lokaltog/vim-powerline.git bundle/powerline
git submodule init &amp;&amp; git submodule update

cat &gt;&gt; ~/.vim/vimrc &lt;&lt;END
let g:Powerline_symbols=&#039;fancy&#039;
END</pre>
<h2>Altre Personalizzazioni</h2>
<p>Ho poi effettuato un aseri di personalizzazioni del .vimrc:</p>
<pre class="brush: bash; gutter: true">###### configure .vimrc with custom settings
cat &gt;&gt; ~/.vim/vimrc &lt;&lt;END
set expandtab tabstop=4 shiftwidth=4 softtabstop=4
set incsearch
set hlsearch
set ignorecase
set smartcase
set encoding=utf-8
set showcmd
set comments=sr:/*,mb:*,ex:*/
set wildmenu
set wildmode=longest,full
set wildignore=.svn,.git
set nocompatible
set laststatus=2
END</pre>
<h2>Script completo</h2>
<p><a name="script_completo"></a><br />
Ecco di seguito lo script completo, che effettua tutte le operazioni che ho descritto.</p>
<pre class="brush: bash; gutter: true">#!/bin/bash

apt-get install -y git
cd ~
#### make a backup

mv ~/.vim ~/vim_`date +%y%m%d%H%M%S`
mkdir .vim

#### install pathogen

cd ~
ln -s ~/.vim/vimrc .vimrc
rm -Rf pathogen
git clone git://github.com/tpope/vim-pathogen.git pathogen
mv pathogen/autoload ~/.vim/autoload

cat &gt; ~/.vim/vimrc &lt;&lt;END

call pathogen#runtime_append_all_bundles()
call pathogen#helptags()

END

cd .vim
git init
git add .
git commit -m &quot;Initial commit&quot;

###### install fugitive

Gcd ~/.vim
git submodule add git://github.com/tpope/vim-fugitive.git bundle/fugitive
git submodule init &amp;&amp; git submodule update

#### install Solarize

cd ~/.vim
git submodule add git://github.com/altercation/vim-colors-solarized.git bundle/solarized
git submodule init &amp;&amp; git submodule update

cat &gt;&gt; ~/.vim/vimrc &lt;&lt;END
set background=dark
let g:solarized_termtrans=1
let g:solarized_termcolors=256
let g:solarized_contrast=&quot;high&quot;
let g:solarized_visibility=&quot;high&quot;
colorscheme solarized
END

echo export TERM=&quot;xterm-256color&quot; &gt;&gt; ~/.bashrc

### install SuperTab
cd ~/.vim
git submodule add https://github.com/ervandew/supertab.git bundle/supertab
git submodule init &amp;&amp; git submodule update

###### install CTRLP
cd ~/.vim
git submodule add https://github.com/kien/ctrlp.vim.git bundle/ctrlp
git submodule init &amp;&amp; git submodule update

cat &gt;&gt; ~/.vim/vimrc &lt;&lt;END
set runtimepath^=~/.vim/bundle/ctrlp
END

vim -c &#039;:helptags ~/.vim/bundle/ctrlp/doc|q!&#039;

###### install Syntastic to check syntax inline
cd ~/.vim
git submodule add https://github.com/scrooloose/syntastic.git bundle/syntastic
git submodule init &amp;&amp; git submodule update

cat &gt;&gt; ~/.vim/vimrc &lt;&lt;END
let g:syntastic_mode_map={&#039;mode&#039;:&#039;active&#039;, &#039;active_filetypes&#039;:[], &#039;passive_filetypes&#039;:[&#039;html&#039;]}
let g:syntastic_phpcs_disable=1
END

vim -c &#039;:Helptags|q!&#039;

###### install Powerline
#
# Remember to download patched font DejaVuSansMono-Powerline.ttf for windows
# from https://gist.github.com/1630581#file_deja_vu_sans_mono_powerline.ttf
# and install in in windows, then select &quot;DejaVu Sans Mono for Powerline&quot; in PuTTY
# (Window--&gt;Apperence--&gt;font)

cd ~/.vim
git submodule add https://github.com/Lokaltog/vim-powerline.git bundle/powerline
git submodule init &amp;&amp; git submodule update

cat &gt;&gt; ~/.vim/vimrc &lt;&lt;END
let g:Powerline_symbols=&#039;fancy&#039;
END

###### configure .vimrc with custom settings
cat &gt;&gt; ~/.vim/vimrc &lt;&lt;END
set expandtab tabstop=4 shiftwidth=4 softtabstop=4
set incsearch
set hlsearch
set ignorecase
set smartcase
set encoding=utf-8
set showcmd
set comments=sr:/*,mb:*,ex:*/
set wildmenu
set wildmode=longest,full
set wildignore=.svn,.git
set nocompatible
set laststatus=2

END</pre>
<p>The post <a rel="nofollow" href="https://www.sll.it/plugin-e-setting-per-vim-utili-per-chi-sviluppa/">Plugin e setting per vim utili per chi sviluppa</a> appeared first on <a rel="nofollow" href="https://www.sll.it">Simonluca Landi</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.sll.it/plugin-e-setting-per-vim-utili-per-chi-sviluppa/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
