tag:blogger.com,1999:blog-52897760453390026092024-03-26T01:40:23.734-05:00IT engineering and a little bit of hackingHoping that others won't have to re-solve problems I've already figured out, and a few laughs along the way.Ehttp://www.blogger.com/profile/09983873340191399802noreply@blogger.comBlogger197125tag:blogger.com,1999:blog-5289776045339002609.post-32898749460490899922022-01-30T12:31:00.007-06:002022-01-30T12:35:02.522-06:002022 Economic Predictions<p><span style="background-color: white;">Let me introduce some of yall to the inverted yield curve and my predictions for the US economy.</span></p><p><span style="background-color: white;">The yield curve is just a graph answering the question "If the government wants to borrow money for a short time or long time, what are the interest rates loaners will agree to?"</span></p><p><span style="background-color: white;">Normally, the graph looks like this. Loaners have a good idea what's gonna happen this year, so on the left, it's a relatively lower interest rate (a one year loan). But loaners don't know what will happen in 30 years, so they want a higher interest rate if they're gonna have their money tied up the whole time. Usually longer loans = riskier for the loaner, because they could have done lots of other stuff with that money.</span></p><p><span style="background-color: white;"></span></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgXUu4lhGaWBoI6GXORim0fJVzVeUu-3efEhJMfcS1yLIe1sGNfRaxa-9s-nQreYeZgNNqaGhT6vDoyMktSOD7z4Kn00pUuJo0cQtoXYzDpUYDhPV0-BzU3whJn3NNroOi6k5xdsAHuAg4HcpuoQRDO7GXSUYeXZTS4VjQevmbptq_2KFGyA0NaPPHVlg" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="540" data-original-width="600" height="240" src="https://blogger.googleusercontent.com/img/a/AVvXsEgXUu4lhGaWBoI6GXORim0fJVzVeUu-3efEhJMfcS1yLIe1sGNfRaxa-9s-nQreYeZgNNqaGhT6vDoyMktSOD7z4Kn00pUuJo0cQtoXYzDpUYDhPV0-BzU3whJn3NNroOi6k5xdsAHuAg4HcpuoQRDO7GXSUYeXZTS4VjQevmbptq_2KFGyA0NaPPHVlg" width="267" /></a></div><br /><div>Now, over the past 40 years, interest rates keep getting brought lower by the federal reserve. You can see that every time there's a financial crisis or recession, the fed lowers interest rates and gives everyone more money. You might ask "well, why doesn't the economy recover and then interest rates return to normal?"<br /><br /></div><div>The answer is the American people don't want reality, they want free stuff. From hedge fund managers to retirees to welfare queens, everyone wants more money for less work. And lowering interest rates is one way to do that.<br /><br /></div><div>So every time interest rates go lower, when the federal reserve tries to move them back to normal levels, people freak out, the stock market crashes, a recession happens, people get laid off, and politicians yell at the fed, who lower interest rates again.</div><div>You can see that we are running out of room to keep playing this game.</div><div><br /></div><div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEh_ZMBqTTm9n2wTfFd0t_GYG0ts5u4hd2km-P1_30sekfVXB3Apx8u6bPzFwh0zTpGAAJGZzNjjGZU5Ytl4CtcqgC1RS-YMC_YuT20r48MzhSVXE6CPWwJO9nJ328pRsRBqS7gqGXna4tPh-XrUIflzSQRWUZbjgt2xHdTIEn5eWVgoXbqb3y0PbkVdTQ" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="776" data-original-width="903" height="240" src="https://blogger.googleusercontent.com/img/a/AVvXsEh_ZMBqTTm9n2wTfFd0t_GYG0ts5u4hd2km-P1_30sekfVXB3Apx8u6bPzFwh0zTpGAAJGZzNjjGZU5Ytl4CtcqgC1RS-YMC_YuT20r48MzhSVXE6CPWwJO9nJ328pRsRBqS7gqGXna4tPh-XrUIflzSQRWUZbjgt2xHdTIEn5eWVgoXbqb3y0PbkVdTQ" width="279" /></a></div><div>The inverted yield curve is what usually happens right before a recession. Remember, on the left is "How high is the interest rate when the government wants to borrow money for a year" and on the right is "How high is the interest rate when the government wants to borrow for 3 years."<br /><br /></div><div>When people think there is a recession coming, they think the federal reserve will have to reduce interest rates. So they figure "Interest on long term loans should be lower, because rates are going to go down." It's called inverted because the left side is higher than the right side, which is the opposite of normal (see 1st graph).</div><div><br /></div><div><div class="separator" style="clear: both; text-align: center;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhtLW90HiHGsE_E5jnG3u_DEsWMqNH45JC2_TeBFmkgKvrbM3oWCCgKe9piS8tBiqcR9Wvk98LGYM_Mg8Ca-h9ce6KOV_swY866bzOU3hcd6Or-BEYLpfHq_BVIYGyG4NsBDEEzfdFnm2s6_w8YstQ9dUoMiifMo9oXsz50UmemwbuiqL-4kg_w5qWz8w" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="797" data-original-width="902" height="240" src="https://blogger.googleusercontent.com/img/a/AVvXsEhtLW90HiHGsE_E5jnG3u_DEsWMqNH45JC2_TeBFmkgKvrbM3oWCCgKe9piS8tBiqcR9Wvk98LGYM_Mg8Ca-h9ce6KOV_swY866bzOU3hcd6Or-BEYLpfHq_BVIYGyG4NsBDEEzfdFnm2s6_w8YstQ9dUoMiifMo9oXsz50UmemwbuiqL-4kg_w5qWz8w" width="272" /></a></div></div>In 1979, they had inflation so high (13%) that everyone knew interest rates would go up (12%->18%) and also that this would cause a recession. That's why you see the blue line in chart 3 - left side of the graph is higher than the right.</div><div><div class="separator" style="clear: both; text-align: center;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhQm8Q8bLbIVR-ZGmVoPL-q5bGrBbNfpsY887kxbEJJPGNmOtsJBigcPkJRPS8pwjsful-WrBgTv8JNLpDgovPvg0wFL3JxzasiGdxcEsvpZhKknd4AYQ6doKasuz26PuURXWhmBmx6c7o7cx-vihrrvKOZh5Sae09Vp3p-NLuOVlelClPlSEUNcXX3Eg" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="1422" data-original-width="640" height="240" src="https://blogger.googleusercontent.com/img/a/AVvXsEhQm8Q8bLbIVR-ZGmVoPL-q5bGrBbNfpsY887kxbEJJPGNmOtsJBigcPkJRPS8pwjsful-WrBgTv8JNLpDgovPvg0wFL3JxzasiGdxcEsvpZhKknd4AYQ6doKasuz26PuURXWhmBmx6c7o7cx-vihrrvKOZh5Sae09Vp3p-NLuOVlelClPlSEUNcXX3Eg" width="108" /></a></div><br /></div></div>We are in the same boat now. Left side of the graph is 0.675%. Right side is about 2%. What we've seen so far is the left side shooting up and the right side staying the same. This indicates a recession is coming.</div><div><div class="separator" style="clear: both; text-align: center;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEjyeNORBdrtPtv3yVUFO7pKvNHCXHQl56NONAgAcMeBnafohCLu9A_AtkDUGxuQl7heAekcI3brxlECPvlDI28TEdeHCz0uBIpvB9vyMfbZUTTUPt6ae-0MO-gU4aDrjgHmQBPSOEWkhL7WIhYPBxQctN-eXoVU77AamfJtOGtwI9OJnXi6pAqBHqYsBg" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="864" data-original-width="1179" height="235" src="https://blogger.googleusercontent.com/img/a/AVvXsEjyeNORBdrtPtv3yVUFO7pKvNHCXHQl56NONAgAcMeBnafohCLu9A_AtkDUGxuQl7heAekcI3brxlECPvlDI28TEdeHCz0uBIpvB9vyMfbZUTTUPt6ae-0MO-gU4aDrjgHmQBPSOEWkhL7WIhYPBxQctN-eXoVU77AamfJtOGtwI9OJnXi6pAqBHqYsBg" width="320" /></a></div></div><br /><div>It's been true for a while that all of our economic growth was imaginary and just a result of free money from the fed. Tons of people are unemployed (see chart) but asset prices were skyrocketing. It's all fake. And we could keep it going until something (inflation) forced the federal reserve to turn off QE and raise rates. And here we are.</div><div><br /></div><div>So the fed is turning off the printers and raising rates. This crashes the stock market and causes a recession. It won't be enough to immediately stop inflation from increasing.</div></div><div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgoxRTg5-0Dm2j3rRVIFUw54UhkgxHKmnqtEwjrPdNbKiSvYuUMFeXUAR87UYPCo0p_2buVQeEtCc_7ZPEc-wXXkqb2AiRgQaKc2P6OLU3uNO_CvERa5svn7sxEIaTXjml6Doix44Ks63TVRtBtD_xPE5do7un-XM1RXTOr6cp6xk5Wdtg6FGbXr6885Q" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="600" data-original-width="1437" height="134" src="https://blogger.googleusercontent.com/img/a/AVvXsEgoxRTg5-0Dm2j3rRVIFUw54UhkgxHKmnqtEwjrPdNbKiSvYuUMFeXUAR87UYPCo0p_2buVQeEtCc_7ZPEc-wXXkqb2AiRgQaKc2P6OLU3uNO_CvERa5svn7sxEIaTXjml6Doix44Ks63TVRtBtD_xPE5do7un-XM1RXTOr6cp6xk5Wdtg6FGbXr6885Q" width="320" /></a></div></div><br /><div>It's possible that the fed will be able to raise rates slowly enough, and sell assets slowly enough, that they are able to deflate the bubble and reduce inflation without causing a full blown freakout recession. But I don't think that'll happen, for a few reasons:<br /><br /></div><div>1) Every time there's a recession, the rate ceiling for how high interest rates can go before the market freaks out gets lower. Right now, folks think it's like 2%, and we can't get 10% inflation under control without rates far higher than that.<br /><br /></div><div>2) The federal debt is fucking huge (see chart), and it gets worse every day. As interest rates go up, the federal debt goes up (obviously nobody wants to raise taxes in a recession), so there's a limit to how high interest rates can go. Basically, in a democracy, inflation is harder to blame on the government than tax hikes or spending cuts. So we will get a basket of the worst of all worlds - high inflation, cut spending, higher interest rates, probably higher taxes etc.<br /><br /></div><div>3) If we don't cut spending and raise taxes, it sends us further down the road toward an economic crisis like we've never seen, caused by the world losing faith in the US dollar as our debt to GDP ratio heads towards 3:1. A that point the government's interest rates skyrocket, the fed loses control, and hyperinflation is the only way to pay off the government debt and stabilize the situation.</div></div><div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEj_DJ12tDBsOvX-o_ljObA-OPPVDkRs48lZ8CmCnv8qaaX6FYrf7byA3YgRgbopScD9ZtvYrhsa4-C3LvKGmq1BHfCoPRMUWsasKt2LyvM8YKbwFR1sPj81isV5zgAayiN1-vnHLsVKjcPftD27qyc0O3kFwzDutT4LZ80mTSI8qTB9-0lryzM7V6V-rg" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="154" data-original-width="261" height="189" src="https://blogger.googleusercontent.com/img/a/AVvXsEj_DJ12tDBsOvX-o_ljObA-OPPVDkRs48lZ8CmCnv8qaaX6FYrf7byA3YgRgbopScD9ZtvYrhsa4-C3LvKGmq1BHfCoPRMUWsasKt2LyvM8YKbwFR1sPj81isV5zgAayiN1-vnHLsVKjcPftD27qyc0O3kFwzDutT4LZ80mTSI8qTB9-0lryzM7V6V-rg" width="320" /></a></div><br /><div>Some of my recommendations for this year:</div><div>1) Some amazing tech stocks are down 50% already. Maybe scoop them up and hold for the long haul.</div><div>2) Stay as liquid as you can, but don't hold any cash at all. If you want something safe, VTIPS or STIP are inflation protected and are a good bet.</div><div>3) In a recession, utilities and insurance perform well. Everyone keeps paying. However, I'm unsure if utilities will be able to raise rates to keep up with inflation.</div><div>4) Do not panic sell. Just hang on through the ride.</div><div>5) Commodities tend to do well, because they can easily raise prices to keep up with inflation. But I don't know much about this space.</div><div>6) Cut your spending NOW and prepare. Turn off/pause all those monthly subscriptions, stop eating out, save your money. There are layoffs and brutal interest rates in the future.</div><div>7) Get the hell out of cryptocurrencies. They are not a hedge against inflation, they're a place that excess money goes. And pretty soon, there won't be any excess money.</div><div>8)This is the time to buy a house, before interest rates skyrocket. But there's reason to think house values will decline over the next few years. So you're gonna overpay and might be underwater at first.</div><div>9) Get out of small cap stocks. They get crushed during modern recessions because people sell mutual funds and there just aren't enough buyers.<br /><br /></div><div>All of this assumes the fed doesn't freak out and cut rates/resume QE. Which I just don't think they can do. But short term thinking has been the name of the game for so long, perhaps they'll find a way to forestall the inevitable again.</div></div><p></p>Ehttp://www.blogger.com/profile/09983873340191399802noreply@blogger.com0tag:blogger.com,1999:blog-5289776045339002609.post-84099703126409408722019-12-23T14:05:00.002-06:002019-12-23T14:05:20.694-06:00Mountains!<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAG5e8D-s_bAJqAIhL6ErcrSOYeDjyc20cy70aO2IYXWC2TRoHSTtUy3E72bVrSLW5Ml2f2iv18XqJhnpks1KaX7FVEsp7yw8NbPEXOdy1inWTXJn8kkRNg4v7DNHONPIb_P5VgBJ9pd90/s1600/mountain.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1200" data-original-width="1600" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAG5e8D-s_bAJqAIhL6ErcrSOYeDjyc20cy70aO2IYXWC2TRoHSTtUy3E72bVrSLW5Ml2f2iv18XqJhnpks1KaX7FVEsp7yw8NbPEXOdy1inWTXJn8kkRNg4v7DNHONPIb_P5VgBJ9pd90/s320/mountain.jpg" width="320" /></a></div>
<br /></div>
Ehttp://www.blogger.com/profile/09983873340191399802noreply@blogger.com0tag:blogger.com,1999:blog-5289776045339002609.post-61295130968159949662019-03-02T14:43:00.001-06:002019-03-02T14:50:15.969-06:00Tensorbook Premium Review<div dir="ltr" style="text-align: left;" trbidi="on">
<span style="font-size: small;"><span style="font-family: inherit;"><br /></span></span>
<span style="font-size: small;"><span style="font-family: inherit;">For a lightweight work laptop, I've been using a Surfacebook 1 for a long time. It has a great keyboard and display, plus it's light. But I've had some serious problems with it, for one the performance is so bad that sometimes outlook just crashes. The other problem is storage performance: the surfacebook has an awful SSD, just terrible latencies and throughput.</span></span><br />
<br />
<span style="font-size: small;"><span style="font-family: inherit;">The bigger issue has been that the tablet-to-keyboard connection frequently disconnects, leaving you unable to control your laptop until it re-connects. Sometimes that would happen a lot. I had this issue with the first two Surfacebooks MS sent - the third has not had it, to my relief. </span></span><br />
<span style="font-size: small;"><span style="font-family: inherit;"><br /></span></span>
<span style="font-size: small;"><span style="font-family: inherit;">Now that I'm really getting into ML for my graduate degree, I've found the Surfacebook just fails out of some of the notebooks I'm running, and others take 20+ minutes. So I decided it was time for an upgrade!</span></span><br />
<span style="font-size: small;"><span style="font-family: inherit;"><br /></span></span>
<span style="font-size: small;"><span style="font-family: inherit;">I settled on the Tensorbook Premium, since it had the best specs I could find anywhere at the $2800 price range, and I wanted to gain more Linux experience. It matched the hardware and price of the MSI system and comes with a pre-installed Ubuntu system, with all the drivers, CUDA, etc validated and worked out. I had spent hours trying to get my Surfacebook to work correctly with CUDA and Tensorflow, to no avail. Here are my gripes so far:</span></span><br />
<ul style="text-align: left;">
<li><span style="font-size: small;"><span style="font-family: inherit;">hard drive doesn't come encrypted? And if you want to encrypt it, you'd have to wipe the image in order to do so.</span></span></li>
</ul>
<ul style="text-align: left;">
<li><span style="font-size: small;"><span style="font-family: inherit;">no jupyter, anaconda, python installed</span></span></li>
</ul>
<ul style="text-align: left;">
<li><span style="font-size: small;"><span style="font-family: inherit;">battery lasts 2 hours at best</span></span></li>
<li><span style="font-size: small;"><span style="font-family: inherit;">It has a numberpad, so you spend 90% of your time on the left hand side of the screen, where the actual keyboard is. Why is this so wide?</span></span></li>
<li><span style="font-size: small;"><span style="font-family: inherit;">Capslock has a delay, so typing is a giant pain. Typing a case-sensitive password is a nightmare (and no, I will never learn to use the shift key! Old habits die hard). </span></span></li>
<li><span style="font-size: small;"><span style="font-family: inherit;">The capslock key doesn't have a light to indicate on or off.</span></span></li>
</ul>
<ul style="text-align: left;">
<li><span style="font-size: small;"><span style="font-family: inherit;">battery drivers have no idea how much time is left, and the % does not match the time</span></span></li>
</ul>
<ul style="text-align: left;">
<li><span style="font-size: small;"><span style="font-family: inherit;">gets hot and loud</span></span></li>
</ul>
<span style="font-size: small;"><span style="font-family: inherit;">Performance:</span></span><br />
<span style="font-size: small;"><span style="font-family: inherit;"> To test performance I used a <a href="https://github.com/rileynjohnson/PML_Cats_And_Dogs/blob/master/PML-Assignment7-Walkthrough.ipynb">Jupyter notebook from my grad school class</a> that grabs 2000 pictures of cats and dogs, converts them to greyscale arrays, and then trains a DNN and a CNN. The Tensorbook did it in 62 seconds and hit 1.6GB/s write to disk. WOW!</span></span><br />
<span style="font-size: small;"><span style="font-family: inherit;"><br /></span></span>
<span style="font-size: small;"><span style="font-family: inherit;">Here are the Tensorbook Premium results:</span></span><br />
<span style="font-size: small;"><span style="font-family: inherit;">Processing image files to 512x512 color or grayscale arrays </span></span><br />
<ul style="text-align: left;">
<li><span style="font-size: small;"><span style="font-family: inherit;">Image processing run time: 44.2s </span></span></li>
<li><span style="font-size: small;"><span style="font-family: inherit;">Image processing CPU/GPU/RAM bottleneck time: 35.7s </span></span></li>
<li><span style="font-size: small;"><span style="font-family: inherit;">Image processing Disk IO bottleneck time: 8.5s</span></span></li>
</ul>
<span style="font-size: small;"><span style="font-family: inherit;">Overall notebook run time:<b> 62.2s</b></span></span><br />
<br />
<span style="font-size: small;"><span style="font-family: inherit;">And here are the Surfacebook results:</span></span><br />
<span style="font-size: small;"><span style="font-family: inherit;">Processing image files to 512x512 color or grayscale arrays </span></span><br />
<ul style="text-align: left;">
<li><span style="font-size: small;"><span style="font-family: inherit;">Image processing run time: 401.3s </span></span></li>
<li><span style="font-size: small;"><span style="font-family: inherit;">Image processing CPU/GPU/RAM bottleneck time: 129.5s </span></span></li>
<li><span style="font-size: small;"><span style="font-family: inherit;">Image processing Disk IO bottleneck time: 271.8.5s</span></span></li>
</ul>
<span style="font-size: small;"><span style="font-family: inherit;"><br />Overall notebook run time: <b>1,078s (18 minutes)</b></span></span><br />
<span style="font-size: small;"><span style="font-family: inherit;"><br /></span></span>
<span style="font-size: small;"><span style="font-family: inherit;">Surfacebook hit 200MB/s read at one point. And 60MB/s write while it's doing np.save on all those scaled files. Tensorbook hit 1,600MB/s write during the saves and only tapped out the GPU during the NN training.</span></span><br />
<br />
<span style="font-size: small;"><span style="font-family: inherit;">Implications for data storage</span></span><br />
<span style="font-size: small;"><span style="font-family: inherit;">1) 1.6GB/s from a local NVMe SSD is amazing</span></span><br />
<span style="font-size: small;"><span style="font-family: inherit;">2) Lots of metadata ops (read file names, edit file names, list directory)...these types of ops might run into scale issues on servers linux file systems.</span></span><br />
<span style="font-size: small;"><span style="font-family: inherit;">3) For the image processing, there is a lot of read and write to disk. It represented about 1/4 of the runtime for my Tensorbook and 3/4 of the time on my Surfacebook. Throughput matters!</span></span><br />
<span style="font-size: small;"><span style="font-family: inherit;"><br /></span></span>
<span style="font-size: small;"><span style="font-family: inherit;"><br /></span></span>
<span style="font-size: small;"><span style="font-family: inherit;"><br /></span></span>
<span style="font-size: small;"><span style="font-family: inherit;"><br /></span></span>
<span style="font-size: small;"><span style="font-family: inherit;"><br /></span></span>
<span style="font-size: small;"><span style="font-family: inherit;"><br /></span></span>
<span style="font-size: small;"><span style="font-family: inherit;"><br /></span></span>
<span style="font-size: small;"><span style="font-family: inherit;"><br /></span></span></div>
Ehttp://www.blogger.com/profile/09983873340191399802noreply@blogger.com1tag:blogger.com,1999:blog-5289776045339002609.post-69501016589832742322019-01-07T23:14:00.000-06:002019-01-26T11:21:04.641-06:00Pandas Part 2 (Ongoing)<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
If you want to print the name of a column, just do df.columns[]<br />
<br />
To print a column, try df.columns[<"name of column">]<br />
<br />
To print the number of rows/columns, len(df.rows) or len(df.columns)<br />
<br />
to identify the class/type of object, type()<br />
<br />
Simple iteration: for i in range (, )<br />
<br />
df_python=survey_df[['column name1', 'column name 2']] <br />
<br />
to print out unique values in a column: int df[col].unique()<br />
<br />
If you want to manually create a dataframe, do this:<br />
<br />
df= pd.DataFrame(columns=['col1', 'col2'])<br />
df['col1']=['data','data2','data3'] or<br />
df['col1']=[84,253,3] <br />
<br />
If you want to create a new column that transforms existing text values into a numeric value, do this:<br />
<br />
=pd.merge(,[["name of column 1 to bring", "name of column 2 to bring"]],left_on="which column from df 1 to match",right_on="which column from df 2 to match",how='left')<br />
<br />
Get rid of columns that aren't helpful: del df['column_name'] <br />
<br />
to assign a value to a specific cell in a df, df.ix[0, 'COL_NAME'] = x <br />
<column number.="" p=""><begin><end></end></begin></column><column number.="" p=""><begin><end></end></begin></column><column number.="" p=""><begin><end></end></begin></column><column number.="" p=""><begin><end></end></begin></column></div>
Ehttp://www.blogger.com/profile/09983873340191399802noreply@blogger.com0tag:blogger.com,1999:blog-5289776045339002609.post-58810080919049252462018-05-21T11:03:00.000-05:002018-05-22T21:23:06.312-05:00Ethical Journalism in an Age of Mass Murder<div dir="ltr" style="text-align: left;" trbidi="on">
<span style="color: blue;">For a long time, there has been<span style="color: black;"><span style="color: blue;"> </span></span><span style="color: blue;"><a href="https://journalistsresource.org/studies/society/news-media/media-impacts-suicide-research"><span style="color: blue;"><span style="color: black;">strong (overwhelming?) evidence</span></span><span style="color: black;"> </span></a></span>that the media has influence over the number of people who commit suicide. Called the "copycat effect" or "<span style="color: blue;"><span style="color: blue;"><a href="https://journalistsresource.org/studies/society/public-health/mass-shooters-suicide-bombers-journalism">media contagion</a></span></span>," it's basically the idea that when when the media reports on suicide, they<span style="color: blue;"> <span style="color: blue;"><span style="color: blue;"><span style="color: blue;"><a href="https://theconversation.com/no-one-is-censoring-the-media-about-suicide-were-just-asking-for-sensitivity-30535">influence more people</a></span></span></span> </span>to kill themselves. </span><br />
<span style="color: blue;"><br /></span>
<span style="color: blue;">"Research into suicide coverage worldwide by journalism ethics charity MediaWise <span style="color: blue;"><span style="color: blue;"><a href="http://www.mediawise.org.uk/suicide/">found clear evidence</a>
</span></span> that the attention given to the circumstances surrounding a celebrities
who kill themselves is more likely to incite copy cat suicides."</span><br />
<span style="color: blue;"><br /></span>
<span style="color: blue;">For this reason, the media has <a href="http://reportingonsuicide.org/">best practices</a> for suicide reporting: don't even cover suicides unless it's a noteworthy person, don't glamorize or romanticize it, etc. This dedication to language best practice is fairly sophisticated - for example, the Associated Press even recently <span style="color: blue;"><a href="https://www.cjr.org/first_person/dont_forget_these_changes_to_the_ap_stylebook.php">recommended against</a> </span>using the phrase "committed suicide."</span><br />
<span style="color: blue;"><br /></span>
<span style="color: blue;">---</span><br />
<span style="color: blue;"><br /></span>
<span style="color: blue;">Three years ago, Malcolm Gladwell <span style="color: blue;"><a href="https://www.newyorker.com/magazine/2015/10/19/thresholds-of-violence">published an article</a></span> that posited a similarly intuitive (even obvious) theory on mass shootings. I'll just quote his main point here:</span><br />
<span style="color: blue;"><br /></span>
<span style="color: blue;">"But Granovetter thought it was a mistake to focus on the decision-making
processes of each rioter in isolation. In his view, a riot was not a
collection of individuals, each of whom arrived independently at the
decision to break windows. A riot was a social process, in which people
did things in reaction to and in combination with those around them.
Social processes are driven by our <i>thresholds</i>—which he defined
as the number of people who need to be doing some activity before we
agree to join them. In the elegant theoretical model Granovetter
proposed, riots were started by people with a threshold of
zero—instigators willing to throw a rock through a window at the
slightest provocation. Then comes the person who will throw a rock if
someone else goes first. He has a threshold of one. Next in is the
person with the threshold of two. His qualms are overcome when he sees
the instigator and the instigator’s accomplice. Next to him is someone
with a threshold of three, who would never break windows and loot stores
unless there were three people right in front of him who were already
doing that—and so on up to the hundredth person, a righteous upstanding
citizen who nonetheless could set his beliefs aside and grab a camera
from the broken window of the electronics store if <i>everyone</i> around him was grabbing cameras from the electronics store."</span><br />
<span style="color: blue;"><br /></span>
<span style="color: blue;">The media's endless coverage of every mass murder is driving copycats...and no one is doing anything about it. It's not that journalists individually know this and are OK with it - they're just trapped in a system that is designed to drive clicks and views, and endless coverage of mass murder is a profitable way to do that. A better summary of this situation is made <span style="color: blue;"><a href="https://www.youtube.com/watch?v=K3VQULyT390&app=desktop">here</a></span>.</span><br />
<span style="color: blue;"><br /></span>
<span style="color: blue;">We now have a stack of voices naming this out loud in the <span style="color: blue;"><a href="https://www.washingtonpost.com/lifestyle/style/explaining-or-exploiting-a-mass-shooting-raises-questions-about-media-coverage/2018/02/15/18a00da6-1274-11e8-9065-e55346f6de81_story.html?utm_term=.a2ecbd26d955">Washington Post</a></span>, <span style="color: blue;"><a href="http://thefederalist.com/2018/02/16/want-prevent-mass-shootings-stop-wall-wall-national-media-coverage/">Federalist</a></span>, <span style="color: blue;"><a href="https://journalistsresource.org/studies/society/public-health/mass-shooters-suicide-bombers-journalism">Criminologists</a></span>, <span style="color: black;"><span style="color: blue;"><a href="http://According to UNESCO, “the publication aims to raise journalists’ awareness of the need to exercise caution and examine carefully who they quote, what messages they relay and how they contextualize the information they give, despite the pressures to win readers, viewers and listeners. With numerous examples taken from recent events, the handbook also addresses issues pertaining to the way journalists report on the victims of terror, handle rumours, report on the authorities’ investigations, conduct interviews with terrorists and report on their trials.”"><span style="color: black;">Ethical Journalism Network</span></a></span></span>, etc.</span><br />
<span style="color: blue;"><br /></span>
<span style="color: blue;">---</span><br />
<span style="color: blue;"><br /></span>
<span style="color: blue;">So, what to do? There are many great, thoughtful proposals out there - here's one from the<span style="color: black;"> </span><a href="https://www.cjr.org/criticism/mass-shootings-media-coverage.php"><span style="color: black;"><span style="color: blue;">Columbia Journalism Review</span></span>.</a> The gist is that we can still responsibly cover mass murder - driving awareness, resources, policy change, prevention, and free flow of information in our democracy - but limit the media contagion. We can do this by not printing the person's name, picture, manifestos/ravings/message, or comparing kill counts. Phrases like "deadliest shooting spree" or "gunman" create a morbid romanticism, even a gamification in a dark mind.</span><br />
<span style="color: blue;"><br /></span>
<span style="color: blue;">Another proposal is to call on the media to de-monetize coverage of mass murders. Selling ads by spreading media contagion is a bit like selling soup prepared by Typhoid Mary.</span><br />
<span style="color: blue;"><br /></span>
<span style="color: blue;">We need a website written by respected authorities in journalism laying out these proposals. We need politicians to use their voice to raise the issue, we need grassroots boycotts for advertisers who buy ads on media that refuse to report responsibly.</span><br />
<span style="color: blue;"><br /></span>
<span style="color: blue;">Our journalists generally feel their work is a vocation, not just a job. They're proud of the role they play in the nation's well-being and advancement, and I'm sure it's horrifying for a person to realize they're part of this morbid feedback loop - more murders, more coverage, more murders. Just conjecture here, perhaps part of the reason journalists are so ardent in their support of gun control as a solution to mass murder is that they're aware of their role, and are looking for a scapegoat to restore their feeling of "the good guy." </span><br />
<span style="color: blue;"><br /></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<span style="color: blue;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzLD4sUg74MMsVlhldB7AByHvN6iUzTm8TJ79WSqKbpnIusfN3Luu3ot-tEaWRawDx9l6p3DfRGF-YgqxIl5EFKRkbz5t7NMLYj__woBRdtkL-KWq3zjDIlEybVifhlaGJ4xXpGOzKGS-Z/s1600/Fear-of-terrorism.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="301" data-original-width="460" height="261" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzLD4sUg74MMsVlhldB7AByHvN6iUzTm8TJ79WSqKbpnIusfN3Luu3ot-tEaWRawDx9l6p3DfRGF-YgqxIl5EFKRkbz5t7NMLYj__woBRdtkL-KWq3zjDIlEybVifhlaGJ4xXpGOzKGS-Z/s400/Fear-of-terrorism.jpg" width="400" /></a></span></div>
<span style="color: blue;"><br /></span>
<span style="color: blue;"><br /></span></div>
Ehttp://www.blogger.com/profile/09983873340191399802noreply@blogger.com0tag:blogger.com,1999:blog-5289776045339002609.post-36667167640329564072018-05-07T12:48:00.003-05:002018-05-07T12:48:30.242-05:00Poverty and Geography in Minneapolis<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
It's an open secret that <a href="https://www.citylab.com/equity/2015/08/americas-biggest-problem-is-concentrated-poverty-not-inequality/400892/">concentrated poverty</a> is at record levels and getting worse. This has been occurring in tandem (it's a feedback loop) with a new <a href="https://economix.blogs.nytimes.com/2013/08/27/explaining-the-labor-force-dropouts/?ref=us&_r=2&">structural unemployment</a> that have stayed at bleak 40-year highs since 2012.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIQ7RJ2Xpz1tlm4m5uNFSDyuIbDzKKKZCmYuYbUvuCplmoEQfsI4A_uU-kB12Viv1uhcM7DJgmWmtXzqNpPYi-REwgNSJseTkqU3Bw22A8LsEltQkb8yVGJpboRSTDhEa8E-Shf7WEYtf5/s1600/1950s+lfpr.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="790" data-original-width="1167" height="270" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIQ7RJ2Xpz1tlm4m5uNFSDyuIbDzKKKZCmYuYbUvuCplmoEQfsI4A_uU-kB12Viv1uhcM7DJgmWmtXzqNpPYi-REwgNSJseTkqU3Bw22A8LsEltQkb8yVGJpboRSTDhEa8E-Shf7WEYtf5/s400/1950s+lfpr.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
The short story is that even as our economy has improved and Americans in general have gotten wealthier, the bottom 20% or so have been left behind. You can see that from 2000 to 2018, 5% of workers dropped off the face of the Earth. This is awful. </div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Concentrated poverty is a big contributor to this - clustering poor people together means, as Ed Sheeran's song says, "the worst things in life come free to us." Poor communities have higher crime, substance addiction, worse public services, less social capital, less opportunity, worse education, basically a basket of awful variables that form a Feedback Loop of Awful (let's call it FLA). </div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
This blog post is about geographic isolation - one of the variables in the FLA. Of course, access to the rest of the city is valuable, so the cheapest housing is the least accessible. I've now lived in the poorest, most violent, and highest minority part of Minneapolis for a year, and a few things have become empirically obvious to me. </div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Take a look at this map. To the bottom left you have the richest suburbs with the corporate jobs. To the bottom right you have the airport. To the right of the S in Minneapolis you have the U of MN, and to the left of the M in Minneapolis you have "the hood," North Minneapolis. </div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhNrLX_5EkSw7O2XmLWdY_OP3Nh41x-kMwvra5T2o0YpflyU1Qf9v6_YMOIBg6OQWjOi8XCigZZNOlCLkbYiDi2BbFHojyud1F-1jQA8bvo2eN-vDikpZSvXAIg8YnnN_Nwyf7CYEFf4rU/s1600/North+Map.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1415" data-original-width="1154" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhNrLX_5EkSw7O2XmLWdY_OP3Nh41x-kMwvra5T2o0YpflyU1Qf9v6_YMOIBg6OQWjOi8XCigZZNOlCLkbYiDi2BbFHojyud1F-1jQA8bvo2eN-vDikpZSvXAIg8YnnN_Nwyf7CYEFf4rU/s640/North+Map.png" width="520" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Here's a closer look at the city and North:</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRbpMD0zW-0fc2GoPPOsZJ6C_wZ3DdaYHrl0_8poe749hpxc9W2blOqnbGmT6ny7QtZe3tpFEe8Ttu76UZUNJvljAimwyRPZYNnIbDFfhC4Nd5LHK6agkZBcBhblZvSiov8H2PLhE0sB9d/s1600/North+Map+2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1480" data-original-width="1600" height="592" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRbpMD0zW-0fc2GoPPOsZJ6C_wZ3DdaYHrl0_8poe749hpxc9W2blOqnbGmT6ny7QtZe3tpFEe8Ttu76UZUNJvljAimwyRPZYNnIbDFfhC4Nd5LHK6agkZBcBhblZvSiov8H2PLhE0sB9d/s640/North+Map+2.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Above the words "Near North," and to the west of 94, is where the hood begins. We affectionately refer to it as the "North." It takes up the entire area to the northwest. A few local knowledge things to note:</div>
<div class="separator" style="clear: both; text-align: left;">
</div>
<ul style="text-align: left;">
<li>To the east of the river there are tons of resources, amenities, culture. The North is separated by both a 10-lane highway and the Mississippi River. </li>
<li>There is a train that goes from downtown to the airport. It never reaches North.</li>
<li>94, between the words "North Loop" and the junction with 35W, is forever deadlocked. This short stretch of highway adds 15 minutes to your trip, every time. This means any trip from the North to anywhere south or east is at least a half hour - cutting North off from the south and east of the state. This is not true of land east of the river, where 35W runs north and south smoothly. </li>
<li>There is a stretch of no-man's land between 94 and the Mississippi that is in hospitable. It's industrial and ugly. It's basically a DMZ to separate the rich and poor.</li>
<li>To get from the closest part of North to downtown is eminently unwalkable. First you have to cross an intimidating, rusty concrete bridge (take a look below...yikes) across 10 lanes of I-94, and then 7 blocks of nasty, noisy, windswept industrial buildings before you reach downtown. Again, a DMZ to separate the rich and poor.</li>
</ul>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNbqSHNVj3jCnAwGAyQ_b6wCMZiwfpNPLoX5GyLhXs4xKYYkinTRBAM8dk5Tz5jnpdf66byFWlrvci4EJK7PKSEMqBfpu5VbzKbJ-A7ymxBnAHOoP3D2e2rY8Ihw7TsdzVFw7uIjJ__rGQ/s1600/bridge.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="723" data-original-width="1600" height="288" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNbqSHNVj3jCnAwGAyQ_b6wCMZiwfpNPLoX5GyLhXs4xKYYkinTRBAM8dk5Tz5jnpdf66byFWlrvci4EJK7PKSEMqBfpu5VbzKbJ-A7ymxBnAHOoP3D2e2rY8Ihw7TsdzVFw7uIjJ__rGQ/s640/bridge.png" width="640" /></a></div>
<div>
What all of this combines to is isolation - concentration of poverty. Some suggestions:</div>
<div style="text-align: left;">
<ol style="text-align: left;">
<li>Beautify the overpass bridge and the trip to downtown. This would be cheap and easy...protect the pedestrians from the wind and noise of the overpass, repair the sidewalks, plant trees, set lighting, and incent those who own the industrial buildings to slap on a new coat of paint every once in awhile.</li>
<li>Finish the train track across, into North.</li>
<li>Incent walkable business and retail in the no-man's land. </li>
<li>Improve and expand local streets with a north/south traverse in mind. </li>
<li>Figure out some way to improve the deadlock on 94!</li>
</ol>
</div>
<div>
<br /></div>
<br />
<br /></div>
Ehttp://www.blogger.com/profile/09983873340191399802noreply@blogger.com0tag:blogger.com,1999:blog-5289776045339002609.post-31007625326333715472018-02-18T17:43:00.000-06:002018-02-18T17:43:44.187-06:00R Syntax Explained<div dir="ltr" style="text-align: left;" trbidi="on">
<b>Aggregate:</b> This is used to apply a function (like mean) across a data set that is subset according to your needs. For example, if you have a table of car sales details and prices (called mydata) and you want to know average sale prices, you can't just average the entire price column: you need the average price for each type of car. Let's say your table has these columns: make, model, and price. <br />
<br />
Aggregate takes a few inputs. The first item is the dataset you care about: in this case, the table mydata, but specifically the price column. Second item is a list of what subsets you'd like to create. For example, we want to subset every row that matches "Ford" and "F150" and average their price. So our second item is what categories we want to break the data out into: in this case, we want to see every unique combination of make and model. The last item is the function we want to apply to the subset: average, median, etc.<br />
<br />
result <- aggregate="" by="list(mydata$MAKE," mean="" mydata="" p=""><br />
<br />
<b>Filter and Select: </b>One of my favorite combinations. <br />
Filter takes two inputs: your dataset, and how you'd like to subset it. So first input is our table mydata, easy enough. Second input is a test: we give it the column Make, and test the values to see if they equal (==) Ford. If the row's Make column contains Ford, filter will keep that row. Otherwise, it's tossed. <br />
<br />
Select then is being given the result from filter. Filter has snagged every row from our original table (mydata) and includes every column. In other words, mydata started with columns make, model, and price, and filter also has all those columns. <br />
<br />
Select takes two inputs: one is your complete data set, the other is the column(s) you want to keep. In this case, we want to keep the price column. So this command eliminates every row that isn't a Ford sale and gives you a 1-column table of the prices of those Fords. <br />
<br />
In other words, the command below answers the question "give me just the prices from every Ford sale in the table."<br />
<br />
select(filter(mydata, Make=='Ford'), Price)<br />
<br />
<br />
<b>Native dataframe manipulation: </b>Sometimes you don't need to use commands like filter or aggregate to get the subset of data you want. Let's say you have a 1-column table (let's call it car_returns) of the prices of all the cars that were brought back from a customer and had to be refunded. How would you identify the make and model of the cars that were returned, just from the price? So let's say the question is "give me all the rows (including make, model, and price) from my original table (mydata) that match these prices."<br />
<br />
In general, you can subset a dataframe with a [] after the name: mydata[]. Inside the bracket, we'll need to pass two pieces of information: first, what column in mydata will correspond to the values in car_returns? Obviously, price. Now, we aren't comparing mydata's price column to a single price: we need to compare it to all prices that are in the car_returns table. So we will use %in% to say "we want all the rows from mydata where Price equals one of the values from car_returns." <br />
<br />
mydata[mydata$PRICE %in% car_returns, ]<br />
<br />
The other thing you'll notice is the comma after car_returns. What's going on there is that we are comparing all the values of the column Price. If we wanted to compare and subset based a row, we would put that after the comma. For example, if we just wanted the Make of the car, we could do this:<br />
<br />
mydata[mydata$PRICE %in% car_returns, mydata$MAKE]</-></div>
Ehttp://www.blogger.com/profile/09983873340191399802noreply@blogger.com1tag:blogger.com,1999:blog-5289776045339002609.post-60520430626032212622018-01-23T12:25:00.001-06:002018-01-27T13:40:02.504-06:00Dahua IP Cam Setup<div dir="ltr" style="text-align: left;" trbidi="on">
<ol style="text-align: left;">
<li>Power: this thing doesn't come with a power source. Seriously</li>
<ol>
<li>PoE or 12V input. Do not do both!</li>
<li>If your camera is outside, do PoE. Look for something like this to boost your power: Single Gigabit Port PoE+ Injector – 30W – 802.3at https://www.amazon.com/gp/product/B00B4H00EO/ref=oh_aui_detailpage_o00_s00?ie=UTF8&psc=1 </li>
<li>If you're going to do 12V</li>
<ol>
<li>BV-Tech DC12V 1A UL-Listed Switching Power Supply Adapter for CCTV - 5 Pack - Black</li>
</ol>
</ol>
<li>Connecting to your camera</li>
<ol>
<li>Connect the camera via ethernet to your router/switch</li>
<li>IE works OK but has issues. Use chrome, it will prompt you to download and use a specific app.</li>
<li>There appears to be no default IP - it's DHCP. So log into your router and see what IP's are connected to it. Mine always landed at 192.168.1.14 or .15.</li>
<li>Open a browser to http://<your address="" here="" ip=""></your></li>
<li>Default password is admin/admin</li>
</ol>
</ol>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIKhEjqVx5ycaNY3dcOFPC0xS_MdcxmhQPYfPdubH9Al9cb1E1FgmUMzqooTH8qnnfgXtHweEnYZo9V72sQDzrsu32_ntuVNfU2WX0tj0cH2KqnlPBM1R5C3NJJkYIr1TC-s47vY_1Tl4s/s1600/dahua+password.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1211" data-original-width="1600" height="483" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIKhEjqVx5ycaNY3dcOFPC0xS_MdcxmhQPYfPdubH9Al9cb1E1FgmUMzqooTH8qnnfgXtHweEnYZo9V72sQDzrsu32_ntuVNfU2WX0tj0cH2KqnlPBM1R5C3NJJkYIr1TC-s47vY_1Tl4s/s640/dahua+password.png" width="640" /></a></div>
<div>
<br /></div>
<ol style="text-align: left;">
<li>Basic Setup</li>
<ol>
<li>Change the password:</li>
<ol>
<li>System | Account | click the pencil under "modify" | check "modify password"</li>
</ol>
<li>Connect to wifi:</li>
<ol>
<li>Network | wifi | check "enable" | double click the correct network and put in password</li>
</ol>
<li>Set the wifi IP address:</li>
<ol>
<li>Network | TCP/IP | At "ethernet card" click the dropdown and select "Wireless" | click the "static" button" | enter an IP address that you would like this camera to live on permanently | Click Save</li>
<li>Set a new name for your device - something like "garage" or "front door" | click Save</li>
<li>open the browser to your new IP address</li>
<li>Unplug the ethernet cable</li>
</ol>
<li>Upgrade to latest code (very important if you don't want to get hacked)</li>
<ol>
<li>Find your device's latest firmware at https://dahuawiki.com/Firmware_Search_Tool/IP_Camera</li>
<li>Unzip the package</li>
<li>My firmware file was called DH_IPC-ACK-Themis_EngSpnFrn_N_V2.400.0000.15.R.20170804.bin</li>
<li>System | Upgrade | Browse | Select the firmware file</li>
<li>Click upgrade</li>
</ol>
<li>Set System Time</li>
<ol>
<li>System | General | Date&Time | Set your GMT time | Save</li>
<li>Set DST here if you want.</li>
</ol>
</ol>
<li>Advanced Setup</li>
<ol>
<li>Enable HTTPS (this is really important, it encrypts your connection to your camera)</li>
<ol>
<li>Network | Create | fill in all the boxes | change duration to 5000 days | click save</li>
<li>Click install | Click download | Click save</li>
<li>Check the box for "enable HTTPS" | Click save</li>
</ol>
<li>I set frame rate from 30 to 10 and enabled smart codec. https://www.dahuawiki.com/News/H.264_Plus_vs._H.264</li>
</ol>
</ol>
</div>
Ehttp://www.blogger.com/profile/09983873340191399802noreply@blogger.com3tag:blogger.com,1999:blog-5289776045339002609.post-87525829793887851312017-12-18T15:49:00.003-06:002017-12-18T15:51:10.109-06:00Bandcamp, Music and Android<div dir="ltr" style="text-align: left;" trbidi="on">
Here's a quick walkthrough on how to download music from bandcamp.com into your android phone. First, you'll need to download an unzip app - Easy Unrar is free. Find it in the app store (Google Play) and download it.<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6VBVbSDFtpnVKY_oGWHtK8jkMzXhBTYvlHbOJsSVZmVPzZzI32NdRjdETNglc_XgOnUYC72wzxC0m7O9yr-DFpcAALrBUjIqrOGsG8k7TXkeYNhZKZzu6sr7rfCtyqLGcnmn53Wu_wnYI/s1600/first+.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="1600" data-original-width="900" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6VBVbSDFtpnVKY_oGWHtK8jkMzXhBTYvlHbOJsSVZmVPzZzI32NdRjdETNglc_XgOnUYC72wzxC0m7O9yr-DFpcAALrBUjIqrOGsG8k7TXkeYNhZKZzu6sr7rfCtyqLGcnmn53Wu_wnYI/s320/first+.png" width="180" /></a>I'll throw red dots on these screenshots to make it easy for you to follow along.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiiZh-S0Ppg-Sj3M5WTBeZdSgEp9FpWgEbInM4_XRHs6QGvgCIO2C4aS1R_QaiD6-quiEJ5SetEB3NBgkrOp5E96J3ro5d0wRmqF0JIy8GZL2DdWlKTLIIFY_GhkYbx-LXHAzxYbgInO2WJ/s1600/second.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="1600" data-original-width="900" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiiZh-S0Ppg-Sj3M5WTBeZdSgEp9FpWgEbInM4_XRHs6QGvgCIO2C4aS1R_QaiD6-quiEJ5SetEB3NBgkrOp5E96J3ro5d0wRmqF0JIy8GZL2DdWlKTLIIFY_GhkYbx-LXHAzxYbgInO2WJ/s320/second.png" width="179" /></a><br />
Next, get your download code and click on the link - for example, <a data-saferedirecturl="https://www.google.com/url?hl=en&q=https://hopehymns.bandcamp.com/yum&source=gmail&ust=1513719117045000&usg=AFQjCNFYhvvD2Cm15V0mgOcgEJ-LNRjSkw" href="https://hopehymns.bandcamp.com/yum" target="_blank">https://hopehymns.bandcamp<wbr></wbr>.com/yum</a>. Input your code and click next.<br />
<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnYV4S2WO872wy5-8ip5K_pTGPmGdWCrRmt3rEiE7eW75yP02qRUDWFFtqWx55XO_AgEmtu6HoQfxYLnJ7oeDeBmFuij-xA4oTzoPUisuBI2ElJmYJUlf0Z9EQyczKSkx70eZGItShlqxx/s1600/third.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="1600" data-original-width="900" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnYV4S2WO872wy5-8ip5K_pTGPmGdWCrRmt3rEiE7eW75yP02qRUDWFFtqWx55XO_AgEmtu6HoQfxYLnJ7oeDeBmFuij-xA4oTzoPUisuBI2ElJmYJUlf0Z9EQyczKSkx70eZGItShlqxx/s320/third.png" width="180" /></a></div>
<br />
Now click "here's how"<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHvQ0U4YJGbbKEKXlfZyxl8FLrZFXdmS20AIu1fcnSkU0jKW4efjhlabdEH9sGhD9oP6BVMmrbheFZpRUWBzX53O8E7acBKqr1zSEbjUw23yfxiqMIgOV8ypraXwJlhsOW84WAMHPEqi46/s1600/fourth.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="1600" data-original-width="900" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHvQ0U4YJGbbKEKXlfZyxl8FLrZFXdmS20AIu1fcnSkU0jKW4efjhlabdEH9sGhD9oP6BVMmrbheFZpRUWBzX53O8E7acBKqr1zSEbjUw23yfxiqMIgOV8ypraXwJlhsOW84WAMHPEqi46/s320/fourth.png" width="180" /></a></div>
<br />
Click the second "Here's how", then select your file type (I used MP3 220, but I'm not a music expert so YMMV). Then click download.<br />
<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtlmimiZwrq5MYkMBaocEe2WT6axiQu3tEQtezYBODtjHhSdKjq0EagLrU3rzAPCk0L3Uft7jFtA6k3m_Yj_K86rPYq4s-BtA4jGHGENHNQEcV_lVCGB4ApFQYmgWwAupIWQj45QQGW0Zq/s1600/10th+to+last.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="1600" data-original-width="900" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtlmimiZwrq5MYkMBaocEe2WT6axiQu3tEQtezYBODtjHhSdKjq0EagLrU3rzAPCk0L3Uft7jFtA6k3m_Yj_K86rPYq4s-BtA4jGHGENHNQEcV_lVCGB4ApFQYmgWwAupIWQj45QQGW0Zq/s320/10th+to+last.png" width="179" /></a></div>
<br />
Great! Your music is downloaded. Now we need to unzip it. Open Easy Unrar and click the "Download" folder.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5yA7cfe0btFPMmHAwHH-TBi2l5NBAz7QyYP7EO9KkdzattIUgFVEQEewrT14eEwRQ7tyMIFUrauMD8d2C46HTFuD0r6DtGQNAbJO-vgtDhyLkYvOJXawQxN_M37V2n8lt007gIrgv8tpP/s1600/9th+to+last.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="1600" data-original-width="900" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5yA7cfe0btFPMmHAwHH-TBi2l5NBAz7QyYP7EO9KkdzattIUgFVEQEewrT14eEwRQ7tyMIFUrauMD8d2C46HTFuD0r6DtGQNAbJO-vgtDhyLkYvOJXawQxN_M37V2n8lt007gIrgv8tpP/s320/9th+to+last.png" width="180" /></a></div>
<br />
If you've had your phone awhile, it might be tough to wade through all the downloads and find your album. So click on the sort button on the upper right.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJ57cnynN5zgXDjUaNex994q4-Z0F44VHeDb5SsJJlbZVpa2kZSmD8WPHZVQh2BDfXRHxbC-fNoXmHMvy39pqTLIIoiD8g_pqHmvZQyQ5t3f-R_PV5dqal2vyETuAAntdPCXwXPKOJGUN7/s1600/8th+to+last.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="1600" data-original-width="900" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJ57cnynN5zgXDjUaNex994q4-Z0F44VHeDb5SsJJlbZVpa2kZSmD8WPHZVQh2BDfXRHxbC-fNoXmHMvy39pqTLIIoiD8g_pqHmvZQyQ5t3f-R_PV5dqal2vyETuAAntdPCXwXPKOJGUN7/s320/8th+to+last.png" width="180" /></a></div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCkHlflsSkiJk4aZdSdPs3kxVZJrYwH88xq8FWTTf39Q5cIjLhnui_xr7hf7QtgusUYH2sBIfr7klKv9GfrSUKh1XTnAdO5eEesqYMFWmbHc680EAG63b0AbSb-O9TcbsnItUzSJlJLkA6/s1600/7th+to+last.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="1600" data-original-width="900" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCkHlflsSkiJk4aZdSdPs3kxVZJrYwH88xq8FWTTf39Q5cIjLhnui_xr7hf7QtgusUYH2sBIfr7klKv9GfrSUKh1XTnAdO5eEesqYMFWmbHc680EAG63b0AbSb-O9TcbsnItUzSJlJLkA6/s320/7th+to+last.png" width="180" /></a><br />
Choose sort by file size, large to small.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Since your album is probably more than 100MB, it should be near the top. Here you can see Hope Hymns, the album i want. Check the box and click Extract.<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjRQJdCjiidocbiUl_WsmmZe-2EV2OIi-HOuNSaRlMZjKcIqndrT3ScNN83-FodP4rVr4MUpMSgS0w4lTkLt4Rz_fRM8-CCOohHLKY6TcCEL4AiXPlcjR7nfGdmkiW1n-X4gIufJrVShxi/s1600/6th+to+last.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="1600" data-original-width="900" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjRQJdCjiidocbiUl_WsmmZe-2EV2OIi-HOuNSaRlMZjKcIqndrT3ScNN83-FodP4rVr4MUpMSgS0w4lTkLt4Rz_fRM8-CCOohHLKY6TcCEL4AiXPlcjR7nfGdmkiW1n-X4gIufJrVShxi/s320/6th+to+last.png" width="180" /></a></div>
<br />
<br />
Check this box and click extract as well.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOh4QC5UEFokeE0EnpQhkGYOVkYnV6FwPvk2D-1hw0TszmDlBifLdI1iTvJGEDsgMAiVJ2l5gTYqSCH5yvYnaIoWcDA1_Si6KVaH2TYgkt1c8r_seENV4lzplUobobwSRAfgHGZkfFo0hx/s1600/5th+to+last.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="1600" data-original-width="900" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOh4QC5UEFokeE0EnpQhkGYOVkYnV6FwPvk2D-1hw0TszmDlBifLdI1iTvJGEDsgMAiVJ2l5gTYqSCH5yvYnaIoWcDA1_Si6KVaH2TYgkt1c8r_seENV4lzplUobobwSRAfgHGZkfFo0hx/s320/5th+to+last.png" width="180" /></a></div>
<br />
OK - good news and bad news. Bad news is you're not done, good news is you're almost done. Now we need Google Music to rescan and discover your unzipped album files. Open up the Settings app and click on Applications.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzZvQYjDhn-TdxK7jAxKq5OXDI8b9ZhT_Qg2kg2cd9Wf81XNgnL7q2YWLN0_f4oyDPp-FtwolTTXeiy5G5u4SOiVvz1VVKmkFWpD0xCo9Gg5nH2WS2xNZzpqyOyhg8fSO-16dBjez40Ki8/s1600/4th+to+last.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="1600" data-original-width="900" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzZvQYjDhn-TdxK7jAxKq5OXDI8b9ZhT_Qg2kg2cd9Wf81XNgnL7q2YWLN0_f4oyDPp-FtwolTTXeiy5G5u4SOiVvz1VVKmkFWpD0xCo9Gg5nH2WS2xNZzpqyOyhg8fSO-16dBjez40Ki8/s320/4th+to+last.png" width="180" /></a></div>
<br />
Now find and click Google Play Music<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOrb8MYneGNbblnqATuPRICq4dMZH-kA-17THsOz5WINq3H2-dYIYahogGTvSbw2BF7e5EQqgL7ZLDWo61pDyXgABomc02RaqbwqmwdrPN7tfqN6a0YS3JLfVYc31V9VhpNGTjGt3-OG1s/s1600/3rd+to+last.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="1600" data-original-width="900" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOrb8MYneGNbblnqATuPRICq4dMZH-kA-17THsOz5WINq3H2-dYIYahogGTvSbw2BF7e5EQqgL7ZLDWo61pDyXgABomc02RaqbwqmwdrPN7tfqN6a0YS3JLfVYc31V9VhpNGTjGt3-OG1s/s320/3rd+to+last.png" width="180" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwFngljS5hLvez6faBGYOuUTqe8u08qjuDRKCSpiYquTnDJ_3UH4TbD3UEzwImDJCHcQi8cnS9DtYACFwhdeokES5ARTDWed9DipdcB-6ev7LjtMb7GSbxEsU4EGZR1vOpWOx6skRWwKkf/s1600/2nd+to+last.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="1600" data-original-width="900" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwFngljS5hLvez6faBGYOuUTqe8u08qjuDRKCSpiYquTnDJ_3UH4TbD3UEzwImDJCHcQi8cnS9DtYACFwhdeokES5ARTDWed9DipdcB-6ev7LjtMb7GSbxEsU4EGZR1vOpWOx6skRWwKkf/s320/2nd+to+last.png" width="180" /></a></div>
<br />
Almost done! Click Storage<br />
<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpRK1halSq4yMTfaff2hrW4teFIB00HcnynKqmad8MQ17O_JCWlRsQCdrv_cPA-nGq6KejzkV2JXyjEhWO6Tlnq5xt3GfHRtcnaSbWgAoGrI2wtjMzRTCUBMRv2XFHtDkBQ3CG26xSw85o/s1600/1st+to+last.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="1600" data-original-width="900" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpRK1halSq4yMTfaff2hrW4teFIB00HcnynKqmad8MQ17O_JCWlRsQCdrv_cPA-nGq6KejzkV2JXyjEhWO6Tlnq5xt3GfHRtcnaSbWgAoGrI2wtjMzRTCUBMRv2XFHtDkBQ3CG26xSw85o/s320/1st+to+last.png" width="180" /></a><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
!Important! <b><span style="color: red;">DO NOT click "Clear Data."</span></b> DO click "Clear Cache"<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Now reboot your phone, open up Google Play Music, and you're done! Enjoy.</div>
Ehttp://www.blogger.com/profile/09983873340191399802noreply@blogger.com1tag:blogger.com,1999:blog-5289776045339002609.post-23251746618222101032017-09-21T21:34:00.001-05:002019-01-20T15:48:45.608-06:00Pandas<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
</div>
This is just a running list of useful things about Pandas as I learn.<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMgyumuaRnHutus44LXsyKShSTuuPGjK0N-jM3epbAJDiMGO-MN8hxqjNFKsMaXgpcSFFz3xFTp3P2WJcdfhKR2IoEiIn3KWeidoJFN658cYh3LCfuNvAgZZA7r-CPgeCwO76jY_2458Vz/s1600/pandas.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="196" data-original-width="374" height="167" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMgyumuaRnHutus44LXsyKShSTuuPGjK0N-jM3epbAJDiMGO-MN8hxqjNFKsMaXgpcSFFz3xFTp3P2WJcdfhKR2IoEiIn3KWeidoJFN658cYh3LCfuNvAgZZA7r-CPgeCwO76jY_2458Vz/s320/pandas.jpg" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
If you have data coming in from a .csv, use this: <i>df=pd.read_csv('file.csv')</i></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
If your dataframe has strings and you want them to be numbers, use this: <i>df.column = pd.to_numeric(df.column, errors='coerce')</i></div>
<br />
If you have date/time in linux epoch format, you can convert using this: <i>df['date'] = pd.to_datetime(df['date'],unit='s')</i><br />
<i><br /></i>
If you want to index on select columns: <i>df.ix[:,:2]</i><br />
<br />
<i>df.describe()</i> gives you min, max, avg, mean, percentiles, and std<br />
<br />
df.groupby([column.other]).mean()<br />
<br />
df[column.other == <value>]</value><br />
<i><br /></i>
<br />
Grab specific columns by name:<i> df1 = df[['a','b']]</i><br />
<i><br /></i>
<i>data.iloc[:, 0:2] # </i>first two columns of data frame with all rows<br />
<br />
this will square each cell, skipping the first column<i>. df.iloc[:,1:7]=df.iloc[:,1:7].apply(numpy.square, axis=0)</i><br />
<br />
great link on managing jupyter: https://www.datacamp.com/community/tutorials/tutorial-jupyter-notebook<br />
<br />
Great guide to pandas: http://www.lining0806.com:1234/pandas/Pandas%20DataFrame%20Notes.pdf<br />
<br />
<i>https://www.shanelynn.ie/select-pandas-dataframe-rows-and-columns-using-iloc-loc-and-ix/</i><br />
<i>https://www.youtube.com/watch?v=POe1cufDWFs</i>
<i><br /></i>
<br />
<i>Some images you can ignore:</i><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfGwDNiBtsh2889n2nVhf7awnJvWLw0YtWuxN2yvaiendMVpWs65zscT2T3ODdYpoBcxOREW8cFYDGunyqm5iB5hSUtZWa55vUUU5AxcScco_jCVuCaYOvzd7W47VVpU_SpgIXbOC8sQON/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="676" data-original-width="948" height="228" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfGwDNiBtsh2889n2nVhf7awnJvWLw0YtWuxN2yvaiendMVpWs65zscT2T3ODdYpoBcxOREW8cFYDGunyqm5iB5hSUtZWa55vUUU5AxcScco_jCVuCaYOvzd7W47VVpU_SpgIXbOC8sQON/s320/1.png" width="320" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGeV33pucYY2me2trklLoevfFc11pVNZUwH_Wpb4oH_NHVTMwBaWcfyKPqE6BqzhLzDx_0UWbnn9Bji4g_VVGRzW0sQLKNhs3Rfl2-FEni3YrefuZ5zKEI0_ALI34KuqDy1gmhyPiyHMtr/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="760" data-original-width="1344" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGeV33pucYY2me2trklLoevfFc11pVNZUwH_Wpb4oH_NHVTMwBaWcfyKPqE6BqzhLzDx_0UWbnn9Bji4g_VVGRzW0sQLKNhs3Rfl2-FEni3YrefuZ5zKEI0_ALI34KuqDy1gmhyPiyHMtr/s320/2.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<i><br /></i>
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<br /></div>
Ehttp://www.blogger.com/profile/09983873340191399802noreply@blogger.com0tag:blogger.com,1999:blog-5289776045339002609.post-5510039913795690492017-03-30T14:00:00.001-05:002017-03-31T23:47:07.217-05:00Rancher Setup Basics<div dir="ltr" style="text-align: left;" trbidi="on">
A client asked recently how SolidFire can integrate with Rancher. I had a few RHEL servers available, so I'm going to set up Rancher on RHEL. Here are the first steps:<br />
<div>
<br /></div>
<div>
Install a supported version of Docker (align compatibility for Docker, K8s, and Rancher): <span style="background-color: rgba(0 , 0 , 0 , 0.0470588); color: #444444; font-family: monospace , monospace; font-size: 11.25px;">curl https://releases.rancher.com/install-docker/1.12.sh | sh</span></div>
<div>
<span style="background-color: rgba(0 , 0 , 0 , 0.0470588); color: #444444; font-family: monospace , monospace; font-size: 11.25px;"><br /></span></div>
<div>
sudo service docker start<br />
<br />
<span style="background-color: #2b2b2b; color: #ecf0f1; font-family: monospace , monospace; font-size: 13px; white-space: pre;">sudo docker run -d --restart</span><span class="o" style="box-sizing: inherit; color: #ecf0f1; font-family: monospace , monospace; font-size: 13px; font-weight: bold; transition: all 0.1s ease-in-out; white-space: pre;">=</span><span style="background-color: #2b2b2b; color: #ecf0f1; font-family: monospace , monospace; font-size: 13px; white-space: pre;">unless-stopped -p 8080:8080 rancher/server</span></div>
<div>
<br /></div>
<div>
Alright, let's pause here. What did we just do? First, we installed Docker. Docker is the software that enables you to easily download, create, run, and manage containers. Next we made sure the docker service was running. Last we downloaded a container that will run the Rancher software. At this point, you should be able to reach rancher's gui at <ip address="">:8080.</ip><br />
<br />
So let's get K8s and Trident up! First we need a place to deploy K8s. Click Infrastructure | Hosts.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlUN0sXds8KYik6-sVgocohO5XeRVWvk0ys18tAsgc0LAR-bmOfPqRoBfXD6u3ciFr6vXw-2-VFFqTMZz92Mith4qaMjIcXhWkSzkIPSnu3vpRGkbqJHsohpX9hHnt0JDf2YfZF6q64U7C/s1600/rancher+1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="236" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlUN0sXds8KYik6-sVgocohO5XeRVWvk0ys18tAsgc0LAR-bmOfPqRoBfXD6u3ciFr6vXw-2-VFFqTMZz92Mith4qaMjIcXhWkSzkIPSnu3vpRGkbqJHsohpX9hHnt0JDf2YfZF6q64U7C/s640/rancher+1.png" width="640" /></a></div>
<br />
Click add host.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdY-uIPvUEP8v0L_1i7F9XeqanrHAXQg_Cg6cytg3Uf07FemF14bEgXCrRKAAbPh9jUtJ_0Vzm-EpoktJhS9-YXOPShZ13nIgOOC3sS8go3CoV9aWgWlAUJmEWZPqNBEcuBQOgL_s5W7-D/s1600/rancher+2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="203" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdY-uIPvUEP8v0L_1i7F9XeqanrHAXQg_Cg6cytg3Uf07FemF14bEgXCrRKAAbPh9jUtJ_0Vzm-EpoktJhS9-YXOPShZ13nIgOOC3sS8go3CoV9aWgWlAUJmEWZPqNBEcuBQOgL_s5W7-D/s640/rancher+2.jpg" width="640" /></a></div>
<br />
And then save<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhN8R5t656RLXXlewAEXmF8itHC_9SioEKgjygRbKDWjmGOAfS_CxL6EWFfg19WJoSbiUWt9fWnMrJ2T5rhfo7bcWM9VxMCdzR_ZNXzzeiPcJa2vuyDdbPOGLPjpxi6Ye68p-ZiGXzyhkq1/s1600/rancher+3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="482" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhN8R5t656RLXXlewAEXmF8itHC_9SioEKgjygRbKDWjmGOAfS_CxL6EWFfg19WJoSbiUWt9fWnMrJ2T5rhfo7bcWM9VxMCdzR_ZNXzzeiPcJa2vuyDdbPOGLPjpxi6Ye68p-ZiGXzyhkq1/s640/rancher+3.png" width="640" /></a></div>
<br />
Then enter the IP address of the server that will function as a host for containers. Follow the instructions to copy-paste the command into a console on your new host server.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijlNAegVfrrtTArcYjGP44GADoXPtqahFrTpCnjhioaA9NmAQ2xRZIkVoJKtuReV7TrS4b9qlcWvTgrR6AU71udveSpkjonln5ZVKRvJlbSjaLSlQFp3nO8EU-yd9UjOPpALMRHnGC27Ej/s1600/rancher+4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="482" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijlNAegVfrrtTArcYjGP44GADoXPtqahFrTpCnjhioaA9NmAQ2xRZIkVoJKtuReV7TrS4b9qlcWvTgrR6AU71udveSpkjonln5ZVKRvJlbSjaLSlQFp3nO8EU-yd9UjOPpALMRHnGC27Ej/s640/rancher+4.png" width="640" /></a></div>
<br />
Done!<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheGY72xBdgFTZv0vuEsqQcVA841sGl4RyTOWDgZ4OkOn-CHT3VZzzQud-Il796HnfEpysNAHqvSEp7g5m9p9D0f0pOAxxR5p35AfaGzjVrQ0OKyykM916nkjtihhGloDqd37WqxoW_BqVb/s1600/rancher+5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="482" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheGY72xBdgFTZv0vuEsqQcVA841sGl4RyTOWDgZ4OkOn-CHT3VZzzQud-Il796HnfEpysNAHqvSEp7g5m9p9D0f0pOAxxR5p35AfaGzjVrQ0OKyykM916nkjtihhGloDqd37WqxoW_BqVb/s640/rancher+5.png" width="640" /></a></div>
<br />
<br />
https://docs.rancher.com/rancher/v1.5/en/installing-rancher/installing-server/#single-container</div>
<div>
<br /></div>
<div>
Why Rancher: http://rancher.com/beyond-kubernetes/ </div>
</div>
Ehttp://www.blogger.com/profile/09983873340191399802noreply@blogger.com0tag:blogger.com,1999:blog-5289776045339002609.post-42361082227122125682017-03-28T15:19:00.000-05:002017-03-31T23:47:40.659-05:00Understanding SolidFire Capacity<div dir="ltr" style="text-align: left;" trbidi="on">
To calculate the effective capacity available, follow this formula:<br />
<br />
<ul style="text-align: left;">
<li>Error Threshold (#3) minus Used Capacity (#1) = Available physical space</li>
<ul>
<li>In the example below, 86.24TB - 48.41TB = 37.83TB</li>
</ul>
<li>Multiply Redupe Ratio * Compression Ratio, then divide by 2 (for Double Helix)</li>
<ul>
<li>In the example below, (1.81 * 1.79)/2 = 1.62:1</li>
</ul>
<li>Multiply the results of (a) and (b)</li>
<ul>
<li>37.83TB * 1.62 = 61.29TB</li>
</ul>
</ul>
<br />
*This calculation assumes the current rate of dedupe and compression will continue<br />
*This calculates capacity until the Error Threshold is reached, not the Total Capacity.<br />
<br />
<span style="font-family: inherit;">From ActiveIQ, our cloud monitoring tool:</span><br />
<br />
<ol style="text-align: left;">
<li><span style="font-family: inherit;"><b>Used Capacity.</b> This is the capacity physically taken up on disk by data. After dedupe, compression, and double helix occur, this number is the end result.</span></li>
<li><span style="font-family: inherit;"><b>Warning Threshold. </b> This is an adjustable alert threshold to alert that you’re approaching the Error Threshold.</span></li>
<li><span style="font-family: inherit;"><b>Error Threshold. </b> This is the point after which the system cannot rebuild the second copy of data after a node loss. This is calculated by subtracting one node’s physical block capacity from the Total Capacity.</span></li>
<li><span style="font-family: inherit;"><b>Total Capacity. </b>This is the raw physical space on disk. In this example, 1.92TB * 9 SSD’s * 5 nodes = 86.42TB.</span></li>
</ol>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhCSU-9Qt_w9sNXxIIlm80C4cSDcHUklDzTAWSG3LEsDp-rK1T2ct4V1lGC7idCwc0LRvPOb6z6vl3r4Dj4_J0na9M4gqTL-8FIUnRrUpnihyphenhyphenLihlkpDlnyBx8yr_Ey8sd0tDXIq2QmYXr/s1600/capacity+1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="372" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhCSU-9Qt_w9sNXxIIlm80C4cSDcHUklDzTAWSG3LEsDp-rK1T2ct4V1lGC7idCwc0LRvPOb6z6vl3r4Dj4_J0na9M4gqTL-8FIUnRrUpnihyphenhyphenLihlkpDlnyBx8yr_Ey8sd0tDXIq2QmYXr/s640/capacity+1.png" width="640" /></a></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
From the SolidFire GUI:</div>
<div class="MsoNormal">
5. <b>Block Remaining.</b> This is calculated subtracting the Used Capacity (#1) from Total Capacity (#4).</div>
<div class="MsoNormal">
6. <b>Block Capacity until Warning.</b> This is calculated subtracting the Used Capacity (#1) from Warning Threshold (#2).</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1UgJHMBp5QtDWh5bwNYIqk33M5gBU5UR69RFOC_jtyoPqdoeWdI5hfIJszyuXGiNwVY88dQmqt4FOGkg6D_uCPVkUL9H4E1YDCediSKhKfH0BBzYgmvqfbJW1uw0nB2W6J64XMLY9nf4t/s1600/capacity+2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="216" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1UgJHMBp5QtDWh5bwNYIqk33M5gBU5UR69RFOC_jtyoPqdoeWdI5hfIJszyuXGiNwVY88dQmqt4FOGkg6D_uCPVkUL9H4E1YDCediSKhKfH0BBzYgmvqfbJW1uw0nB2W6J64XMLY9nf4t/s640/capacity+2.png" width="640" /></a></div>
<br />
<br />
***Bonus***<br />
<br />
7. In ActiveIQ, under Reporting | Cluster Efficiency, hover over the graph to view the dedupe and compression ratios. In this lab system, 1.81 * 1.79 = 3.24:1<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjonIpGECueGfSRCwC24bvD0yA3VoyzZBWmMLhCCnGWeHTeeDS0v4XS_wefMAMcOZ2_kTfcUuvLnsK7kfWlDeEiitcaH1j9-d4h4Y3DHP61JaR0Ry0mJUsG4PBnoquyu720wkBosmnZuwbr/s1600/capacity+3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="378" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjonIpGECueGfSRCwC24bvD0yA3VoyzZBWmMLhCCnGWeHTeeDS0v4XS_wefMAMcOZ2_kTfcUuvLnsK7kfWlDeEiitcaH1j9-d4h4Y3DHP61JaR0Ry0mJUsG4PBnoquyu720wkBosmnZuwbr/s640/capacity+3.png" width="640" /></a></div>
</div>
Ehttp://www.blogger.com/profile/09983873340191399802noreply@blogger.com0tag:blogger.com,1999:blog-5289776045339002609.post-68382840511334984732017-03-28T12:50:00.001-05:002017-03-31T23:47:54.776-05:00Setting up PowerShell for SolidFire <div dir="ltr" style="text-align: left;" trbidi="on">
<br />
<div>
A simple Guide to setting up PowerShell for SolidFire.</div>
<ol style="text-align: left;">
<li><a href="https://msdn.microsoft.com/en-us/library/ee248590(v=vs.100).aspx"><span style="color: blue;">Enable PowerShell</span></a></li>
<li>Download<span style="color: blue;"> <a href="https://github.com/solidfire/PowerShell">SolidFire PowerShell toolkit</a> </span></li>
<li>Unzip the toolkit</li>
<li>Navigate to PowerShell-master\PowerShell-master\Install\ and run SolidFire_PowerShell_1_3_1_4-install.msi </li>
<li>Done!</li>
</ol>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwzVXg7PaOrXVg1ST_WNFA4ashqsHl6tFAUuCby-1giJSodEBUPL8YTKb05sSorKxOElVVKybiL8NiQRbWCywWUfiNtM7omBCDmr8qiM8xMMfd7oWPB2fERYfABXTQKSH2AeO47Sv6BQ_Q/s1600/Powershell+Tools.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="354" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwzVXg7PaOrXVg1ST_WNFA4ashqsHl6tFAUuCby-1giJSodEBUPL8YTKb05sSorKxOElVVKybiL8NiQRbWCywWUfiNtM7omBCDmr8qiM8xMMfd7oWPB2fERYfABXTQKSH2AeO47Sv6BQ_Q/s640/Powershell+Tools.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://www.youtube.com/watch?v=nvnpzP4-T5I">https://www.youtube.com/watch?v=nvnpzP4-T5I</a></div>
</div>
Ehttp://www.blogger.com/profile/09983873340191399802noreply@blogger.com0tag:blogger.com,1999:blog-5289776045339002609.post-88578161797216216792017-03-07T09:56:00.001-06:002017-03-31T23:48:21.470-05:00Trident in Action<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: left;">
Some screenshots of NetApp's dynamic storage provisioner for K8s! In this case, we're using OpenShift on SolidFire.</div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitsRddWgh3HUZORJ4_siwS9AK0bq1t8xJhys0R2KELa2brq55PLIiWToSU3GV5UKBqxiYwLQDV9QFuqLKnKa10Y-2jvetY0t-3j3TlwHGlOc6JwGKtbGpUNm-fkPUt5UWUxORC5m7qF7lE/s1600/openshift+1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="434" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitsRddWgh3HUZORJ4_siwS9AK0bq1t8xJhys0R2KELa2brq55PLIiWToSU3GV5UKBqxiYwLQDV9QFuqLKnKa10Y-2jvetY0t-3j3TlwHGlOc6JwGKtbGpUNm-fkPUt5UWUxORC5m7qF7lE/s640/openshift+1.jpg" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzfxsYbVPwL5sjByH58QuHIE8Ukj_Fs5RyZcaCpnUYih4Ia6hbU_vyL03H2SP8DGtUEvpmeB5kWRxtI85GIdEq54pYwiaVqtTdh9VPWA0JNc7FilViAKZ8-bOLctpgKVs3-XfY9gfTZ_7H/s1600/openshift+trident+2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="436" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzfxsYbVPwL5sjByH58QuHIE8Ukj_Fs5RyZcaCpnUYih4Ia6hbU_vyL03H2SP8DGtUEvpmeB5kWRxtI85GIdEq54pYwiaVqtTdh9VPWA0JNc7FilViAKZ8-bOLctpgKVs3-XfY9gfTZ_7H/s640/openshift+trident+2.png" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeLN5Ag0HHjoJNBd99K9Cg802cr8rDPqyTq1zaVgGzjCIv5KJVBBp6q08rgs-CoYtS_uX4hwIazSv9erBoEPvabTrhpejWbyHuilcwqmm46M0McZx8Uw1vwL_uAsdCY7Z_ZIEun8MGgqa_/s1600/openshift+trident+3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="452" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeLN5Ag0HHjoJNBd99K9Cg802cr8rDPqyTq1zaVgGzjCIv5KJVBBp6q08rgs-CoYtS_uX4hwIazSv9erBoEPvabTrhpejWbyHuilcwqmm46M0McZx8Uw1vwL_uAsdCY7Z_ZIEun8MGgqa_/s640/openshift+trident+3.jpg" width="640" /></a></div>
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2NhpBq4whI4FusgDj42L7utbxkUv43n_pGskR0kwuvycFHepV1i3YQ71D-mqzE8LSF6w2TyrpmMu22Zr7WSdKXGbiJb_x2gqzG6pJ1h0R0FWwjKa49nEYy4Ddo90PFoNxYaYlBfBWldcA/s1600/openshift+4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="334" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2NhpBq4whI4FusgDj42L7utbxkUv43n_pGskR0kwuvycFHepV1i3YQ71D-mqzE8LSF6w2TyrpmMu22Zr7WSdKXGbiJb_x2gqzG6pJ1h0R0FWwjKa49nEYy4Ddo90PFoNxYaYlBfBWldcA/s640/openshift+4.png" width="640" /></a></div>
<br /></div>
Ehttp://www.blogger.com/profile/09983873340191399802noreply@blogger.com0tag:blogger.com,1999:blog-5289776045339002609.post-72686484203681743272017-03-04T15:16:00.000-06:002017-03-04T15:16:04.398-06:00OpenShift, Docker, and Elasticsearch<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="text-align: left;">
<span style="font-family: inherit;">***This is part of an ongoing series I call "Mode 1 Storage Guy goes to a Mode 2 World." I'm not an expert (yet), YMMV.***</span></div>
<div style="text-align: left;">
<span style="font-family: inherit;"><br /></span></div>
<div style="text-align: left;">
<span style="font-family: inherit;">There are already many good setup docs for Elasticsearch on OpenShift, like <a href="https://blog.openshift.com/searching-with-elasticsearch-on-openshift/"><span style="color: blue;">here</span></a> and <a href="https://medium.com/@happymacaron/how-to-set-up-elasticsearch-on-openshift-405d0460c818#.1wukyya41"><span style="color: blue;">here</span></a>. So what I'm going to do is flush out the concepts so those instructions make more sense.</span></div>
<div style="text-align: left;">
<span style="font-family: inherit;"><br /></span></div>
<div style="text-align: left;">
<u><b><span style="font-family: inherit;">OpenShift</span></b></u></div>
<div style="text-align: left;">
<span style="font-family: inherit;"><br /></span></div>
<div style="text-align: left;">
<span style="font-family: inherit;">OpenShift has a concept of a <b>project</b>. This is how they provide multitenancy.</span></div>
<div style="text-align: left;">
<span style="font-family: inherit;"><br /></span></div>
<div style="text-align: left;">
<span style="font-family: inherit;">Next is <b>namespace</b>, which is similar to a project. </span></div>
<div style="text-align: left;">
<span style="font-family: inherit;"><br /></span></div>
<div style="text-align: left;">
<span style="font-family: inherit;">Next is the <b>image</b>. An image is a pre-packed container probably with an application installed, like MongoDB or JBOSS. You can create new images by installing an application into a container and saving that container. The image concept is analogous to a VM Template: you keep it updated and deploy fresh containers from it.</span></div>
<div style="text-align: left;">
<span style="font-family: inherit;"><br /></span></div>
<div style="text-align: left;">
<span style="font-family: inherit;">A <b>stream </b>seems to be a set of evolving images: for example, when you download the latest CentOS, you're not asking for a specific version, just the latest version. The stream is the set of successive images that you get the latest from.</span></div>
<div style="text-align: left;">
<span style="font-family: inherit;"><br /></span></div>
<div style="text-align: left;">
<span style="font-family: inherit;"><b>Application</b>. This is the normal definition of an application, however in the context of containers, it's good to think about the application as separate from a container</span></div>
<div style="text-align: left;">
<span style="font-family: inherit;"><br /></span></div>
<div style="text-align: left;">
<span style="font-family: inherit;"><b>The catalog</b> is a view, a view of the images held in the registry. </span></div>
<div style="text-align: left;">
<span style="font-family: inherit;"><br /></span></div>
<div style="text-align: left;">
<span style="font-family: inherit;"><b>The registry</b> is merely what OSE calls the collection of images, held in a folder.</span></div>
<div style="text-align: left;">
<span style="font-family: inherit;"><br /></span></div>
<div style="text-align: left;">
<span style="font-family: inherit;">A <b>Pod </b>is the OSE equivalent of a container</span></div>
<div style="text-align: left;">
<span style="font-family: inherit;"><br /></span></div>
<div style="text-align: left;">
<span style="font-family: inherit;">A <a href="https://docs.openshift.com/enterprise/3.0/dev_guide/deployments.html" style="font-weight: bold;">deployment</a> is the mechanism that manages where, how many, and replication on pods for a given application.</span></div>
<div style="text-align: left;">
<span style="font-family: inherit;"><br /></span></div>
<div style="text-align: left;">
<span style="font-family: inherit;"><b>Persistent Volume Claim (PVC)</b>: In OpenShift, this is a request for storage. It can sit unfulfilled.</span></div>
<div style="text-align: left;">
<span style="font-family: inherit;"><br /></span></div>
<div style="text-align: left;">
<span style="font-family: inherit;"><b>Persistent Volume (PV)</b>: When you create a PVC, and then match it to a real LUN/Export, you have a PV.</span></div>
<div style="text-align: left;">
<span style="font-family: inherit;"><br /></span></div>
<div style="text-align: left;">
<span style="font-family: inherit;"><span style="background-color: white;">Don't panic if you see the word "<b>cartridge</b>." That's just British for container.</span></span></div>
<div style="text-align: left;">
<span style="font-family: inherit;"><projectname><br /></projectname></span></div>
<span style="font-family: inherit;"><b>Some notes:</b></span><br />
<span style="font-family: inherit;">openshift's gui is very foreign. Take some time getting used to it.</span><br />
<span style="font-family: inherit;">Unless you're an old linux admin, you're going to need to take the linux learning curve seriously. You'll really need to brush up on vi, ls, cat, curl, and wget.</span><br />
<span style="font-family: inherit;">The & symbol is your friend. For any command that appears hung (but isn't hung, it's actually running) like "docker run <app>", throw an '&' at the end and I betcha it'll give you your prompt back. </app></span><br />
<span style="font-family: inherit;">I had no luck connecting to the OpenShift GUI via chrome, but firefox worked fine (remember, https and 8443)</span><br />
<span style="font-family: inherit;">When deploying images from docker into OpenShift, don't underestimate the <span style="color: blue;"><a href="https://docs.openshift.com/container-platform/3.4/dev_guide/managing_images.html#using-image-pull-secrets">Pull Secrets</a>.</span> OpenShift has to be allowed to pull the images from Docker. This mechanism is intended to prevent unauthorized access of Docker images.</span><br />
<span style="font-family: inherit;"><br /></span><span style="font-family: inherit;"></span></div>
Ehttp://www.blogger.com/profile/09983873340191399802noreply@blogger.com0tag:blogger.com,1999:blog-5289776045339002609.post-18317528384961291652017-03-04T14:48:00.000-06:002017-03-04T15:16:24.824-06:00Declarative State Storage<div dir="ltr" style="text-align: left;" trbidi="on">
***This is part of an ongoing series I call "Mode 1 Storage Guy goes to a Mode 2 World." I'm not an expert (yet), YMMV.***<br />
<br />Anyone working on containers will have heard the term "declarative state" with regards to the number and type of containers. Basically, it just means you have a platform that ensures you always have x number of containers. In other words whenever a container dies/fails for any reason, the platform will recreate one in its place. You're declaring how you want it to be from now on.<br />
<br />
Say Kubernetes you tell it "I want 100 apache webserver containers" on a cluster of 10 hardware servers. It will spread 10 containers onto each server. If you lose 2 servers, Kubernetes will re-create those 20 lost containers and spread them across the 8 remaining.* <br />
<br />
This is very different from a Vmware-type mindset. In Vmware you can say "deploy 100 vm's off this template," but Vmware doesn't watch the vm's, count them, and re-start them if they come down. This is "imperative code" meaning "do what I tell you now," following a single order.<br />
<br />
The existence of declarative state means storage has to change. Previously, the storage layer just creates 10 LUNS, present them to the right servers, and you're done. If the server dies, storage doesn't automatically present those LUNs to a new server, or delete them. It sits, static, until someone comes and manually fixes it.<br />
<br />
Luckily, in Kubernetes 1.5 there is a new concept of<span style="color: blue;"> <a href="https://kubernetes.io/docs/concepts/abstractions/controllers/statefulsets/">StatefulSets</a></span>. StatefulSets are all about enabling stability (i.e. persistence), and when combined with <span style="color: blue;"><a href="https://github.com/NetApp/trident#deploying-in-openshift">NetApp's powerful Trident connector</a></span> it means you can create Declarative State Storage. Which is exciting, because as far as I know I coined the phrase :-)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg671-cMHV4JTRGvqQ23DYxrhKbnDRrE8TzXfedznUHVWKSZfZAqfpoU98ntKqy7PNuvkL6JqpZ0KabZRsyPZJ0f7PhAWMEGSu06FUWTDJsNA5dv6RBb9Pod2k8N0F9e0oI_W4pFw_vK_Ye/s1600/declarative.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="171" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg671-cMHV4JTRGvqQ23DYxrhKbnDRrE8TzXfedznUHVWKSZfZAqfpoU98ntKqy7PNuvkL6JqpZ0KabZRsyPZJ0f7PhAWMEGSu06FUWTDJsNA5dv6RBb9Pod2k8N0F9e0oI_W4pFw_vK_Ye/s640/declarative.jpg" width="640" /></a></div>
<br />
Declarative state storage means when a container is deleted, its corresponding volume is deleted. When a container dies and is recreated, its corresponding volume is connected automatically. When an application is scaled from 10 to 100 containers, the volumes are provisioned automatically.<br />
<br />
More to come!<br />
<br />
*In reality, Kubernetes creates a synchronous copy of each container. So it doesn't actually re-create the container: it switches the secondary copy of the container to be primary (lowering the impact of interruption) and then re-creates a secondary copy elsewhere. Cool stuff.<br />
<span style="font-family: "calibri" , sans-serif; font-size: 11.0pt;"><!--[if gte vml 1]><v:shapetype
id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t"
path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f">
<v:stroke joinstyle="miter"/>
<v:formulas>
<v:f eqn="if lineDrawn pixelLineWidth 0"/>
<v:f eqn="sum @0 1 0"/>
<v:f eqn="sum 0 0 @1"/>
<v:f eqn="prod @2 1 2"/>
<v:f eqn="prod @3 21600 pixelWidth"/>
<v:f eqn="prod @3 21600 pixelHeight"/>
<v:f eqn="sum @0 0 1"/>
<v:f eqn="prod @6 1 2"/>
<v:f eqn="prod @7 21600 pixelWidth"/>
<v:f eqn="sum @8 21600 0"/>
<v:f eqn="prod @7 21600 pixelHeight"/>
<v:f eqn="sum @10 21600 0"/>
</v:formulas>
<v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/>
<o:lock v:ext="edit" aspectratio="t"/>
</v:shapetype><v:shape id="Picture_x0020_1" o:spid="_x0000_i1025" type="#_x0000_t75"
alt="" style='width:446.25pt;height:121.5pt'>
<v:imagedata src="file:///C:/Users/rileyj/AppData/Local/Temp/msohtmlclip1/01/clip_image001.jpg"
o:href="cid:image001.jpg@01D2943B.EB451480"/>
</v:shape><![endif]--><!--[if !vml]--><!--[endif]--></span></div>
Ehttp://www.blogger.com/profile/09983873340191399802noreply@blogger.com0tag:blogger.com,1999:blog-5289776045339002609.post-14514598895940248032017-02-21T18:03:00.001-06:002017-03-04T15:16:48.971-06:00Virtualization, Docker, OpenShift, and Poker<div dir="ltr" style="text-align: left;" trbidi="on">
***This is part of an ongoing series I call "Mode 1 Storage Guy goes to a Mode 2 World." I'm not an expert (yet), YMMV.***<br />
<br />
Let's say you need to see how a poker website looks from CentOS, but you have a windows box. What you do? Probably install hyper-v (or vmplayer), download a .iso image of CentOS, and create a new vm out of that ISO. Contained within that VM is every dll, every file, everything CentOS needs.<br />
<br />
OK, let's say you invented a winning poker algorithm, and you want it to play 500 games of poker simultaneously. You don't have enough hard drive space for 500 vm's - but you have enough for 500 containers. So on that CentOS VM you install Docker and download 1 thin CentOS container image, and Docker knows what files on the CentOS VM each container needs to run. Docker makes it super easy to download an image in docker: <i>docker pull <image name=""></image></i> is all.<br />
<br />
Now let's say you're making tons of money and want to get 10,000 containers playing poker. That many images won't fit in your computer - you need more computers. So you buy a bunch of windows computers, and on each you install hyper-v, get a CentOS VM up, and install docker. You have your 10,000 poker games running...but one computer dies, taking down the VM and 500 containers with it. You lose all the chips you had in those 500 games. What's more, people are starting to copy your algorithm, and you start losing! You improve your algorithm, but how can you change the 9,500 containers in time?<br />
<br />
So you cluster all your computers with hyper-v. Good first step. And then install OpenShift on all the CentOS VMs. Now when a server dies, OpenShift is replicating each container to another VM and you don't lose the poker game. What's more, every time you update the algorithm, you can use docker to create a new image and have OpenShift deploy it in place of the old algorithm container after each poker game. </div>
Ehttp://www.blogger.com/profile/09983873340191399802noreply@blogger.com0tag:blogger.com,1999:blog-5289776045339002609.post-89811542909689383242017-02-17T23:21:00.000-06:002017-03-31T23:48:59.264-05:00OpenShift, Trident, Docker, and SolidFire: Part 1<div dir="ltr" style="text-align: left;" trbidi="on">
***This is part of an ongoing series I call "Mode 1 Storage Guy goes to a Mode 2 World." I'm not an expert (yet), YMMV.***<br />
<br />
We have a group of NetApp/SolidFire customers already live with OpenShift on SolidFire, which is very exciting but a bit scary too. It's a bit scary because many of these clients went live without ever chatting with us! This means they're running into issues like having to manually create hundreds of volumes, because they hadn't heard of our dynamic volume manager, Trident. <br />
<div>
<br /></div>
<div>
So we're partnering with RedHat to get a local OpenShift lab implementation tricked out with all the best SolidFire has to offer. The goal is to get OpenShift running, then move on to containerized Elasticsearch and MongoDB and all sorts of other fun stuff. <br />
<br />
Note: YOU DO NOT need NDVP in order to install/use Trident. We do so here only for experience and demonstration purposes.</div>
<div>
<br /></div>
<div>
Here's the basic layout of the lab: </div>
<div>
1) 3 RHEL servers running as VMs in VMware (1 master, 2 other nodes)</div>
<div>
2) <a href="https://github.com/NetApp/netappdvp"><span style="color: blue;">NetApp Docker Volume</span></a> Plugin installed</div>
<div>
3) SolidFire for persistent storage (great API, all flash performance)</div>
<div>
4) <span style="color: blue;"><a href="https://github.com/NetApp/trident"><span style="color: blue;">Trident</span></a> </span>for the automatic volume management</div>
<div>
5) OpenShift Enterprise (<a href="https://docs.openshift.com/enterprise/3.0/install_config/install/quick_install.html"><span style="color: blue;">instructions</span></a>) as our container platform, installed on the RHEL servers.</div>
<div>
6) OSE has <a href="https://docs.openshift.com/enterprise/3.0/install_config/install/prerequisites.html#install-config-install-prerequisites"><span style="color: blue;">several requirements</span></a>, such as Docker as our container engine</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
The instructions for each of these are actually really good, so I'll just elaborate on a few things for this specific workflow.</div>
<div style="text-align: left;">
<ul style="text-align: left;">
<li>Start with the <a href="https://docs.openshift.com/enterprise/3.0/install_config/install/prerequisites.html#install-config-install-prerequisites"><span style="color: blue;">OSE requirements</span></a> instructions. You need to make sure you have the correct RHEL licensing to access the OSE repos or you'll hit a roadblock in a real hurry!</li>
<ul>
<li>Once you get to "Configuring Docker Storage" I recommend you detour over to the NDVP instructions, where you see "iSCSI RHEL/CentOS." </li>
<li>Complete those steps, then continue with the "Configuring Docker Storage" instructions and complete through the rest of the page. I used option 1, presenting a LUN for docker to use as the storage pool.</li>
</ul>
<li>You can then install the NetApp Docker Volume Plugin (NDVP). </li>
<ul>
<li>Note that this is where the storage expertise comes in. You'll need to know the management and storage IP's for the SolidFire, you'll need to setup iSCSI on the RHEL servers, and you'll need to present targets from the SolidFire to your RHEL servers. </li>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-3E0svqLGzEqzbgVNKuXOdiv7c4fAbmnU17_axlVw8B_B040acxMj9qvYpORTB1bdo8U5Jnujsm870J96R9PlUKKAnSfyZFEdpcupD7NrGGu5HYgUAPTp35WJhxmj9G_jTl2i0tuUBAsD/s1600/2017-02-17+21_19_13-d1-sfcl01+_+management-accessGroups.png" imageanchor="1" style="margin-left: auto; margin-right: auto; text-align: center;"><img border="0" height="420" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-3E0svqLGzEqzbgVNKuXOdiv7c4fAbmnU17_axlVw8B_B040acxMj9qvYpORTB1bdo8U5Jnujsm870J96R9PlUKKAnSfyZFEdpcupD7NrGGu5HYgUAPTp35WJhxmj9G_jTl2i0tuUBAsD/s640/2017-02-17+21_19_13-d1-sfcl01+_+management-accessGroups.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Create an access group with all the IQNs.</td></tr>
</tbody></table>
<li>If you need help, I recommend <a href="https://www.youtube.com/watch?v=8qTj-LuuCQI"><span style="color: blue;">this video</span></a>. You can find your iSCSI IQN with <i>cat /etc/iscsi/initiatorname.iscsi </i>and then create an access group on the solidfire for it:</li>
</ul>
</ul>
</div>
<div class="separator" style="clear: both; text-align: left;">
</div>
<ul style="text-align: left;"><ul>
<li>Don't forget to add the port (3260) to the iscsiadm discover command</li>
<li>sudo iscsiadm -m discoverydb -t st -p 172.21.40.X:3260 --discover</li>
<li><i>iscsiadm -m node -l</i> to log into all available targets</li>
<li><i>fdisk -l </i>will show whether your mounts were successful and their device names</li>
</ul>
<li>Once your RHEL server has logged into each target, you're able to run <i>netappdvp --config=/etc/netappdvp/solidfire-san.json &</i></li>
<ul>
<li>Don't forget the ampersand. If you just run the command, it'll appear to hang but it's actually running.</li>
</ul>
</ul>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNIPzhCvPZU4WQH5FaBiwEfzM75jT92gWqfVHe01CCETBDwGW_UG5yTD8MZ7IMUjblQGUMDkvaOATRSLOouqkB13lZShqHsYKX4M201Q70WbTzeOxFUKHPbS1aeiGEzjuh9wHK8R65I7Zk/s1600/2017-02-17+21_19_13-d1-sfcl01+_+management-accessGroups.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="145" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNIPzhCvPZU4WQH5FaBiwEfzM75jT92gWqfVHe01CCETBDwGW_UG5yTD8MZ7IMUjblQGUMDkvaOATRSLOouqkB13lZShqHsYKX4M201Q70WbTzeOxFUKHPbS1aeiGEzjuh9wHK8R65I7Zk/s640/2017-02-17+21_19_13-d1-sfcl01+_+management-accessGroups.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">NDVP Ready to Go!</td></tr>
</tbody></table>
<div class="separator" style="clear: both; text-align: left;">
And here we go, all three RHEL servers have the OSE prereqs and NDVP installed. Here's our first NDVP-created volume!</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQfE_HsiS01mPOOYV28fxF5OKMeK5wnJwUPj9hSGWkZZ_d1t54J2uxt7mMVl8mY7VK5ApLVH-U6f99XX4jk01isBPnGoVHLp_p32j2mLuZKaRSlZlH0HnHIz0W500zsx8PUTIbiKE-uM-B/s1600/2017-02-17+21_19_13-d1-sfcl01+_+management-accessGroups.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="252" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQfE_HsiS01mPOOYV28fxF5OKMeK5wnJwUPj9hSGWkZZ_d1t54J2uxt7mMVl8mY7VK5ApLVH-U6f99XX4jk01isBPnGoVHLp_p32j2mLuZKaRSlZlH0HnHIz0W500zsx8PUTIbiKE-uM-B/s640/2017-02-17+21_19_13-d1-sfcl01+_+management-accessGroups.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
</div>
Ehttp://www.blogger.com/profile/09983873340191399802noreply@blogger.com0tag:blogger.com,1999:blog-5289776045339002609.post-13818095751684484312017-01-16T16:56:00.004-06:002017-01-17T22:16:58.778-06:00Social Media Marketing<div dir="ltr" style="text-align: left;" trbidi="on">
Here are a few things I've learned about social media marketing for a small business:<br />
<br />
1) Facebook is the easiest and best platform by far. However, you an expect your first couple posts to get great exposure among your followers, and then a big drop off. It appears they try to incentivize you to pay for exposure by manipulating the algo - several others online have observed this as well. The ability to target age, sex, and interests is very valuable.<br />
<br />
2) Twitter has a ridiculously counter-intuitive UI. It can easily take you 1-2 hours to get a single campaign up and running! The best part of twitter ads is targeting people who follow a specific page: it's a ready-made demographic engine.<br />
<br />
3) Linkedin is almost as complex as Twitter, but I think it's a hidden gem that is underutilized by pubs/restaurants. Particularly the ability to target employees of specific companies is fantastic. ROI is still to be determined...<br />
<br />
4) Yelp is one of the most frustrating things in the world. It's very expensive, low ROI, and very hard to get them to transfer your business to you. It also has an algorithm that (for some mysterious reason) hides good recommendations but not bad ones, which can really damage your business. My suspicion is they drive up bad reviews to incentivize you to pay for a premium membership, which allows you to pin a good review to the top. I recommend this article for Yelp: http://marketingland.com/5-yelp-facts-business-owners-should-know-163054<br />
<br />
5) Google My Business is just an awful UI. It's almost as bad as Twitter. But you absolutely have to focus here: google, and google maps, are the most important to your online presence. I'm still experimenting with AdWords and site analytics to see what kind of results you can get.<br />
<br />
6) TripAdvisor is pretty solid. I haven't done any advertising here yet, but overall they've got the essentials. </div>
Ehttp://www.blogger.com/profile/09983873340191399802noreply@blogger.com0tag:blogger.com,1999:blog-5289776045339002609.post-44878517219571736642017-01-08T14:35:00.000-06:002017-01-08T14:35:13.804-06:00Trident for Kubernetes<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="MsoNormal">
Last week NetApp dropped a huge development in the emerging tech market. It’s called Project Trident,
and it makes storage easier for Kubernetes. Backstory: Kubernetes (also
called k8s) started at google, it’s software that manages containers.
Basically you take a bunch of linux servers with Docker installed and tie them
together with k8s, and it manages which container should live where. If a
container dies, k8s replaces it with a new one, that kind of thing. You
can think of k8s as Vmware for containers, except free and open source.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Most clients aren’t using basic k8s, but rather enterprise
versions of it like RedHat OpenShift or Apprenda for reasons like security,
support, and version management. Trident is compatible with any version
of k8s, which means it solves a big problem for RedHat.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Trident is similar to our vCenter plugin only even smoother:
it allows k8s to ask a storage array for an NFS share or iSCSI LUN instantly,
plus all sorts of LUN management abilities. Better yet it’s free, open
source, and storage vendor agnostic.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<br />
<div class="MsoNormal">
You
can find information about it here: <a href="https://github.com/NetApp/trident">https://github.com/NetApp/trident</a>
and <a href="http://netapp.io/2016/12/23/introducing-trident-dynamic-persistent-volume-provisioner-kubernetes/">http://netapp.io/2016/12/23/introducing-trident-dynamic-persistent-volume-provisioner-kubernetes/</a><o:p></o:p></div>
</div>
Ehttp://www.blogger.com/profile/09983873340191399802noreply@blogger.com0tag:blogger.com,1999:blog-5289776045339002609.post-50688360895065331002016-12-05T00:03:00.001-06:002016-12-05T00:08:50.571-06:00Pub Business: Part 1<div dir="ltr" style="text-align: left;" trbidi="on">
My family and I recently took a massive risk - we purchased an Irish pub. The pub is in downtown Grand Rapids, MI and had been struggling due to a lack of investment, management, and ownership neglect. It was losing money and it wasn't hard to see why: service was awful, the building was dated, the beer was skunky, everything smelled.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXQvdnxT_qhAXUTeMzZhtbABGDNuDkAtOV-GMscgz3r2i__rr3pv1PIgUjdO8KNJeU2H03Wq0tePX12dgcYIhnW0yiqZrYdsZLzuH3uxucstIwwypwdDpvFWty_26D2ZvyWOMhZVez9cv-/s1600/old+bar2.jpeg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="201" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXQvdnxT_qhAXUTeMzZhtbABGDNuDkAtOV-GMscgz3r2i__rr3pv1PIgUjdO8KNJeU2H03Wq0tePX12dgcYIhnW0yiqZrYdsZLzuH3uxucstIwwypwdDpvFWty_26D2ZvyWOMhZVez9cv-/s400/old+bar2.jpeg" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Before</td></tr>
</tbody></table>
We ran the bar for 4 weeks after purchase to get a better understanding of the business, then shut it down for 6 weeks for renovations. We re-opened 2 weeks ago and have endured the trial by fire, and I think we've come out the other side satisfactorily. In this post I'd like to lay out our financial modeling, our business strategy, and the results so far.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnFzN_s7T7cDnycUt69B-yfsMtYYHCbyMcI_11XYtD7oFzirfGWOVRho_3wwQpSuusMn9tGFtImUe-catUlXEf5olTcOpVGCjkIWHIsgMt5pIEwTrPdDqYnCvvc-C1GqbtiMKkVwDRA6dK/s1600/old+bar+4.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnFzN_s7T7cDnycUt69B-yfsMtYYHCbyMcI_11XYtD7oFzirfGWOVRho_3wwQpSuusMn9tGFtImUe-catUlXEf5olTcOpVGCjkIWHIsgMt5pIEwTrPdDqYnCvvc-C1GqbtiMKkVwDRA6dK/s400/old+bar+4.jpg" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Before</td></tr>
</tbody></table>
I composed from the previous owner's tax returns an income statement. What it revealed is that draft costs and liquor costs are higher than industry standard, accounting for $7k in losses. I frankly don't believe either of those numbers: the draft lines were 120ft long and poured pure foam, plus the staff (and their friends) were drinking for free. I'd personally seen bartenders giving away booze! I'm curious to anyone's advice on how (or why) the previous owner could have hid these costs. <br />
<br />
The other thing this reveals is that food costs as a % of food sales are way too high: 43% in contrast with industry-standard 29%. There's $35k disappearing there!<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYTAj3ZLdFuDEOSMb7zBn5UpkBYyH8synxuQftiHbFngJ-3KdxrkmX-peo8VqeJpL_4F4CjefdM11ZfCVORbrtggCqNRcGz6VFOxPT1VvE1EjNLzHfvh0DeGFVGpo8SjvblQ1O_GH2Ay58/s1600/old+bar+3.jpeg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="273" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYTAj3ZLdFuDEOSMb7zBn5UpkBYyH8synxuQftiHbFngJ-3KdxrkmX-peo8VqeJpL_4F4CjefdM11ZfCVORbrtggCqNRcGz6VFOxPT1VvE1EjNLzHfvh0DeGFVGpo8SjvblQ1O_GH2Ay58/s400/old+bar+3.jpeg" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Before</td></tr>
</tbody></table>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<b>Our business plan</b> was pretty simple in concept:<br />
<br />
<ol style="text-align: left;">
<li>$275k in loans and $225k in capital to purchase the bar and completely remodel it.</li>
<li>Tap talent for the NEW bar!</li>
<ol>
<li>Design (logo, artwork, menu)</li>
<li>Construction (floors, ceiling, new bar, new cooler and draft lines, booths, etc)</li>
</ol>
<li>Transform the staff and culture: many of the original team did not make the cut. Anyone whose honesty we questioned or who did not have a customer-centric outlook quickly phased out of the bar, and the pub's great new look attracted better employees. We took a zero tolerance policy to theft, sexual harassment, and set high standards for everyone.</li>
<li>Implement systems of quality: daily and weekly checklists to avoid crises and ensure tasks like ordering and cleaning were completed with accountability, plus replacing aging systems with modern ones with lower TCO.</li>
<li>Advertise: we are developing a strategy that combines media, community involvement, social media, and a ground game to fill our pub during non-peak hours.</li>
<li>Marketing: we tapped a mixologist and chef for parts of our menu. Much of the whiskey, beer, and food selection was made by ownership. And we made big pricing changes: I graphed the COGS and price of every item and created tiers of target margin, and we now only carry items that fit into those tiers.</li>
</ol>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwKfKjaVo5KidF_c7PFWuK57ceDP1x3dv4sKZ0rUmnW16crAmp4D_0R0_DS1g2Zr8pwJIkz41myTSX4cnlcurHFZK8wA2a9mvqbwcC0m96xpLwv5Z6xNI5tSAkT6veKj1ktYvoW2LdcVu2/s1600/Flanagans_Opening.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwKfKjaVo5KidF_c7PFWuK57ceDP1x3dv4sKZ0rUmnW16crAmp4D_0R0_DS1g2Zr8pwJIkz41myTSX4cnlcurHFZK8wA2a9mvqbwcC0m96xpLwv5Z6xNI5tSAkT6veKj1ktYvoW2LdcVu2/s400/Flanagans_Opening.jpg" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Opening Day</td></tr>
</tbody></table>
<div>
<br /></div>
<div>
Along the way, we've learned a few lessons. One is that owning a pub is all-consuming: there are always a million things to be done, and you have to learn time management like none other. Another is having to accept that in the bar business, you're simply going to have some unhappy customers, and you have to figure out what's in your power. And last, uncertainty kills job creation. We'd like to hire several more people, but it's so hard to predict demand and sales that we are just taking the work on ourselves.</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBWoIJ13lrCeAVk1ANAKBmsVXJL-GsKadBxNM97-htfs5kUqIlXqkXkjGCESGGVsAV73O0lJRT1dw0C83zXnBCmdT20XTWrRFN2tzr-TTDetXneh7i0K2vgg_kCcjWPL-gUCXKkFx0cvQu/s1600/bar.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBWoIJ13lrCeAVk1ANAKBmsVXJL-GsKadBxNM97-htfs5kUqIlXqkXkjGCESGGVsAV73O0lJRT1dw0C83zXnBCmdT20XTWrRFN2tzr-TTDetXneh7i0K2vgg_kCcjWPL-gUCXKkFx0cvQu/s400/bar.jpg" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">After</td></tr>
</tbody></table>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div>
I could cover a million large steps we took to drive sales, but let's leave that for Part 2. So how about the results so far - are we going to be miserable failures? For a baseline, I pulled daily sales data from the past two years (2014 sales were better than 2015 sales) and graphed it:</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitZPYOUHQMHGAmH-g4uGDCC10P7ILii3OhhxsrPS-mn-Tr0b1Hj5nPgmt9UqHQ-wzVFa_SVPqh3WCFPQY4KpjwFHywx5J-5baOExdNCWA9qxJX6AB9EqOJJSYp8Dv7g5OTF7mE7HDWMXB0/s1600/Daily+Sales+Comparison.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitZPYOUHQMHGAmH-g4uGDCC10P7ILii3OhhxsrPS-mn-Tr0b1Hj5nPgmt9UqHQ-wzVFa_SVPqh3WCFPQY4KpjwFHywx5J-5baOExdNCWA9qxJX6AB9EqOJJSYp8Dv7g5OTF7mE7HDWMXB0/s400/Daily+Sales+Comparison.jpg" width="400" /></a></div>
<div>
A couple of takeaways here: we are running at 247% of 2015 sales and 153% of 2014 sales. We have not had a single day where we didn't exceed previous years!</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVAGPCtfz0bYZ2bOfTn1sNdlR-fX1UQ0bgkPLwblM4cC-H9T1-KaV3fb7jwdoNr2dWGzHITN1UwYCvsGshGa0TwIwAEzR-MDnhtiZaKyscjmDl7vQVX00nynj0relQEfJNXg2_LhSm1dwr/s1600/Daily+Sales+Comparison2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="233" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVAGPCtfz0bYZ2bOfTn1sNdlR-fX1UQ0bgkPLwblM4cC-H9T1-KaV3fb7jwdoNr2dWGzHITN1UwYCvsGshGa0TwIwAEzR-MDnhtiZaKyscjmDl7vQVX00nynj0relQEfJNXg2_LhSm1dwr/s400/Daily+Sales+Comparison2.jpg" width="400" /></a></div>
<div>
<br /></div>
<div>
We are wildly exceeding our expectations. If this pace continues, we'll have plenty of money to hire a manager and let the pub stand largely on its own operationally. That would give us the ability to focus on business development and efficiency. I've created a calculator to model increased costs with increased sales, but there's a lot of uncertainty - will this trend continue? We can't do 147% better than last year forever right? How much of this is just a new-bar pop, vs how much can we create new business and beat the competition? </div>
<div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdzd4jTtQvmjSGep75wK8lnernu2FvuhvDhRyoSihbsS4gda3m5Cc6ct386gyz1OAqKfZAqNsl1LIxbLG0hdBSV7g_d0PQSpSLcgo73go0a1rbOWzDWY8TsobZ1KxE7uJcK1EmhbSiXDJN/s1600/imagejpeg_0+%25286%2529.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="225" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdzd4jTtQvmjSGep75wK8lnernu2FvuhvDhRyoSihbsS4gda3m5Cc6ct386gyz1OAqKfZAqNsl1LIxbLG0hdBSV7g_d0PQSpSLcgo73go0a1rbOWzDWY8TsobZ1KxE7uJcK1EmhbSiXDJN/s400/imagejpeg_0+%25286%2529.jpg" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">After</td></tr>
</tbody></table>
Part 2 coming soon. In the meanwhile, check out our <a href="http://flanagansgr.com/"><span style="color: blue;">website </span></a>and <a href="https://www.facebook.com/FlanagansGR/"><span style="color: blue;">facebook</span></a>! Or if you find yourself in west Michigan, stop in for a drink :-)</div>
</div>
Ehttp://www.blogger.com/profile/09983873340191399802noreply@blogger.com0tag:blogger.com,1999:blog-5289776045339002609.post-31356491246929263732016-07-23T18:37:00.000-05:002016-07-23T18:43:51.557-05:00SolidFire vs EMC ScaleIO<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
Doing a bit of research and thought I'd write this down for posterity. Disclaimer: I'm a SolidFire engineer.<br />
<br />
SolidFire Pros:<br />
<br />
<ol style="text-align: left;">
<li>All-Flash optimized</li>
<li>Global, inline dedupe and compression</li>
<li>Enterprise data services:</li>
<ol>
<li>Snapshots, cloning, replication (sync, async, snapshot based)</li>
<li>Automation (openstack, api's, etc)</li>
<li>Vvols support and vmware integration</li>
</ol>
<li>QOS</li>
<li>iSCSI or FCP</li>
</ol>
<div>
<br /></div>
<div>
ScaleIO Pros:</div>
<div>
<ol style="text-align: left;">
<li>All flash or hybrid</li>
<li>No dedupe or compression. Never will have global dedupe.</li>
<li>Scales larger (1,000 nodes instead of 100 nodes)</li>
<li>Wider whitebox support</li>
<li>iSCSI only</li>
<li>Can live on top of a compute node, occupying free resources.</li>
</ol>
</div>
<div>
More conversation here: http://www.theregister.co.uk/2015/09/29/scaleio_solidfire_and_vsan/</div>
<div>
<br /></div>
<div>
http://virtualgeek.typepad.com/virtual_geek/2015/05/emc-day-3-scaleio-unleashed-for-the-world.html</div>
</div>
Ehttp://www.blogger.com/profile/09983873340191399802noreply@blogger.com0tag:blogger.com,1999:blog-5289776045339002609.post-58612244267820332562016-06-16T13:45:00.003-05:002016-06-17T09:42:17.939-05:00SolidFire Architecture #1<div dir="ltr" style="text-align: left;" trbidi="on">
It's time I write a long-overdue overview of SolidFire: how it works, how it solves problems, and why service providers love it. So here is Part 1!<br />
<br />
First, SolidFire is not the solution to everything. But it is the best in the world at what it does solve, which is why it won Gartner awards for the last two years. Since this is an engineering blog, let's talk about how it works.<br />
<br />
SolidFire hardware is regular servers with SSD's and no RAID, so you get commodity hardware prices and a truly software-defined architecture. It protects data by writing it in two places using an algorithm we call Double Helix, and then earns space back with inline compression and global inline dedupe. The global inline dedupe allows for much greater dedupe ratios than anything else on the market, because every block of data written is unique. Other storage solutions have silos of dedupe, pools of blocks that are unique locally but duplicated many times throughout the environment.<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><img src="https://whyistheinternetbroken.files.wordpress.com/2016/06/sf-robot.png?w=676" style="margin-left: auto; margin-right: auto;" /></td></tr>
<tr><td class="tr-caption" style="text-align: center;">The SolidFire robot</td></tr>
</tbody></table>
<br />
Today SF is iSCSI and FCP only. When you create a LUN, SF chooses where in the cluster to place the data, removing the enormous complexity of we call the "placement question." Let's spend some time on that: in most traditional storage environments, you have a couple of storage nodes that form capacity and performance silos. When you scale out to 20 or 1000 nodes, your provisioning encounters a complex question: where do I place this data? That spurs hours of performance and capacity analysis, trending and peaks vs average conversations. On SF, the cluster does it for you.<br />
<br />
It also solves the performance question that multi-tenancy brings by allowing you to provision performance. Not just capacity, but performance! SF does this by allowing you to set a minimum, maximum, and burst for each volume, guaranteeing a service level.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjktCizsX-RIrmS0OXfduTEgC7bW1hYuhczmLhe4gVHIdbw6GLOmtHnXZenh0xjFdJomdD5Q0_h_F-RCfLx3Rewrn1ZqA0DqXNWMxR-K4htosG3rPekMslEd22_5gLUn60xug1AG5JOSwmN/s1600/iops.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="263" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjktCizsX-RIrmS0OXfduTEgC7bW1hYuhczmLhe4gVHIdbw6GLOmtHnXZenh0xjFdJomdD5Q0_h_F-RCfLx3Rewrn1ZqA0DqXNWMxR-K4htosG3rPekMslEd22_5gLUn60xug1AG5JOSwmN/s400/iops.jpg" width="400" /></a></div>
<br />
<br />
I've only scratched the surface on this one: we'll save the scale cluster model and more for the next blog post.</div>
Ehttp://www.blogger.com/profile/09983873340191399802noreply@blogger.com0tag:blogger.com,1999:blog-5289776045339002609.post-9135041855019385782016-05-29T14:00:00.001-05:002016-05-29T14:00:26.379-05:00BlackPhone 2 Review<div dir="ltr" style="text-align: left;" trbidi="on">
I've been excited about the Blackphone 2 for quite some time and finally switched over to it. Partially because I want to make it harder for criminals, companies, and the government to intrude on my privacy, partially because I want to encourage the tech industry to implement smart security measures. Why in the world does pandora demand access to my iPhone's calendar? This has gotten out of hand.<br />
<br />
Unfortunately, the Blackphone 2 is not ready for prime time. Here's a short list of why.<br />
<ul style="text-align: left;">
<li>Any attempt to update the OS is met with "Download failed" with no debug data for why it failed.</li>
<li>It's freaking huge. One handed, fully 50% of the screen is out of your thumb's reach. And the weight of it is killing my wrist. And in a world where I need map on my phone while driving or coffee in my hand while texting, a phone this big is basically worthless. </li>
<li>The touch screen is really inaccurate. I'll tap the same icon 5-10 times before it's registered and acted upon. Sometimes I'll tap an button in an app and SilentOS will pass the tap back to the home screen, opening a completely application</li>
<li>Google maps keeps failing to find my location, even though I've given it permission. </li>
<li>Even though I blocked Facebook from accessing my location, it is able to access my location via Google Play Service. So what's the point, Blackphone? It's not granular permission if you're giving them a giant back door.</li>
<li>The volume/power combo for taking a screenshot is very hit or miss.</li>
<li>No built-in visual voicemail. Gotta download your carrier's app.</li>
<li>Notifications take a TON of configuring. Let me put it this way: new applications should not be able to display full notifications on a locked screen. For example, Whatsapp or Facebook Messenger shouldn't default to publishing the entire text. A private-by-design phone should at least only show the name of the contact, but preferably only show that a message exists.</li>
<li>The phone's usability is 5 years behind an iPhone. Some examples:</li>
<ul>
<li>My mom texted me a picture and I wanted to send it to my sister. There's literally no way to copy/save a picture in BlackPhone's text app. </li>
<li>Highlighting text is a real, real pain. But copying it is impossible, because the copy button is at the very top the screen, 4 inches away from your thumb.</li>
<li>The triangle-circle-square buttons at the bottom of the screen are endless torture for me. Apps like outlook have a set of buttons at the bottom of the screen and it's completely counter-intuitive to have two layers of buttons. I accidentally reply to emails several times a day. </li>
<li>To open the camera from a lock screen on an iPhone, you swipe upwards. To do the same on the Blackphone you have to unlock the phone. This is a big deal because I frequently want to record events transpiring around me, and I might miss it while unlocking the phone.</li>
</ul>
<li>It takes forever to reboot.</li>
<li>It's noisy. Why did I just get a notification that I took a screenshot? I know I took a screenshot. Why did the keyboard icon just appear in the upper right? I know I'm using the keyboard. </li>
</ul>
<div>
Some good things:</div>
<div>
<ul style="text-align: left;">
<li>The display is great</li>
<li>Tethering works great</li>
<li>The wifi by GPS feature works great</li>
<li>I love the granular control "security center" where it works. </li>
<li>Apps seem to be compatible and work just fine usually.</li>
</ul>
</div>
<div>
Google play services (as mentioned before) kills the whole point of the phone by handing control over: https://charlescarrollsociety.com/2016/02/03/silentcircle-blackphone2-is-not-secure-patriot-privacy-privacyproject-review-part-3-of-3/</div>
<div>
<br /></div>
<div>
I'm going to be asking Silent Circle if there's a new, smaller version coming out in the next couple months. If not, I'll probably give this to some kid to use as a tablet.</div>
</div>
Ehttp://www.blogger.com/profile/09983873340191399802noreply@blogger.com1tag:blogger.com,1999:blog-5289776045339002609.post-47374282455515463572016-05-06T14:23:00.002-05:002016-05-06T14:23:51.692-05:00Content Delivery Networks<div dir="ltr" style="text-align: left;" trbidi="on">
I've been doing a bit of research into both Data Science and the hyperscalers and a few things have struck me. One is that Google Fiber is incredibly strategic for Google Platform. <br />
<br />
The ability to ensure QOS and cache by controlling the last mile of delivery is a huge advantage. Everything AWS does is dependent on the telcos, because all of their wonderful technology is designed to deliver something (data, a website, a database) from AWS to somewhere, or from somewhere to AWS. And that something almost always goes through Verizon, ATT, Comcast, Time Warner, etc. <br />
<br />
So one of the most innovative, client focused, fast-paced tech giants is completely dependent on the most change resistant, oligopoly, entrenched companies in the US. ATT and Verizon do some good business in the private-cloud enterprise space, but I've seen up close and personal that their company culture is bureaucratic as it comes. And of course, there is cost involved: as all of us commercial users of ISPs know, the oligopoly always gets its money.<br />
<br />
That's why Google Fiber is so forward thinking. They're going to leapfrog AWS on this one, and if Google succeeds in laying a network quickly, in 15-20 years it could give Google Platform a killer competitive edge. </div>
Ehttp://www.blogger.com/profile/09983873340191399802noreply@blogger.com0