Industry Buzz

Browsing A Safer Web: A Google Update

HostGator India Blog -

A new ecommerce site shows up and the first thing it needs to do is assure users that it’s safe to transact. Online shoppers (for obvious reasons), are super weary of transacting with new/unheard websites. To address this, every ecommerce site places tags/padlocks and other information to assure their customers that shopping here is safe. But is it? A couple weeks ago, Google announced that it’s going pick up the tab to make browsing a whole lot safer. It implemented a new update to Chrome that actively marks a website as ‘Secure’ or ‘Not Secure’, as the case may be. Chrome does this by checking if a website that collects passwords or financial information is using HTTPS connection or just plain HTTP. If the connection is not over HTTPS then the site is tagged as ‘Not Secure’. Simple, yet effective. Data acquired by Google suggests that over 50% of all desktop page loads are now served over HTTPS. This means more than half the web has been secured using SSL certificates. Google plans on pushing further updates to this and label pages as ‘Not Secure’ even while browsing in Incognito Mode. This is a huge step towards securing the web in our opinion and we totally support creating a safer web. We suggest that if you’re an ecommerce website or if your users are required to sign up on you site, you go ahead and get yourself a SSL certificate asap and let your users know that you’ve got them covered. We’ve even created this quick checklist for you to get moving. Get SSL Generate Private/Public Key Enroll your certificate with the provider Upload it Install it That’s it! Easy Peasy isn’t it.

How to Prepare for the Future of Content and Site Management

Acquia -

This is part one of a four part series on Acquia Cloud Site Factory and Acquia Lift. You can no longer think of your website as a summary of what your organization has to offer; it's less about you -- your products, services, etc. -- and more about the experience you are creating for your customers via unique, personalized content. If you are to succeed, you need to break out of the traditional website experience and focus on the digital experience. There’s no shortage of open source and proprietary software that aims to make it easier to build sites and manage a proliferation of content. Some also make it easy to deliver and govern a large number of websites in your organization. Enterprises and brands are increasingly focused on other types of digital experiences beyond the website or mobile site. Many digital experience platform vendors have struggled with this; it’s a myth that content and presentation must be tightly coupled. In reality, there are tools that offer flexible presentation and content distribution models. These tools decrease time associated with site deployments and manual content updates, reduce security and compliance concerns, and mitigate the risk of out-of-date or inconsistent content across sites. Standalone, a multisite management tools or a content syndication service is helpful, but together, you have both flexibility and control. Acquia Cloud Site Factory Paired with Acquia Lift A multisite digital experience management platform allows you to deliver and govern multiple sites that share a common range of functionality or architectural pattern instead of having to manage each site individually. For global companies, lack of governance makes security, compliance and brand consistency nearly impossible to achieve. With Acquia Cloud Site Factory, organizations can manage and govern all of their sites compliantly through a centralized digital site management console and shared Drupal platform. By taking advantage of a common multisite code base and management platform, an organization will have a unified view across all of their sites with a standard process for configuring and managing multisite delivery. Built on Acquia’s scalable cloud platform, Acquia Cloud Site Factory allows you to manage multiple digital sites at scale, with features such as: A centralized, role-based site management console for managing digital sites built with Drupal tuned to specific content and site governance requirements. Multisite Stacks delivery and governance, for building multiple sites from dedicated codebases and deploying new updates across a collection of sites. Open integrations with REST-based APIs. Powerful delivery automation to eliminate error-prone manual processes. Acquia Cloud platform services, including DevOps services and tools, a guaranteed SLA, remote administration, security and monitoring. In addition to Acquia Cloud Site Factory, Acquia offers Acquia Lift, a single cloud-based solution that unifies content and customer data to deliver contextual, personalized experiences. Platform agnostic, Acquia Lift integrates into your existing technology stack and enables the secure discovery and syndication of content across your many sites, different departments, and various technologies. One of Acquia Lift’s key features is content discovery and syndication. Acquia Lift aggregates rich, structured, reusable content from multiple sources including websites, commerce systems, and mobile apps. Powerful discovery tools equipped with customizable filters, empower your marketers to quickly identify and repurpose existing materials to maximize their value and ensure no efforts are wasted. You can also automate and syndicate content updates in order to ensure consistency while eliminating manual content duplication. This central view of content streamlines the content distribution process while also delivering the most relevant content to customers. More than just a content repository, Acquia Lift features a robust set of capabilities, including: Intuitive, visual, data-rich, drag-and-drop, card-based UI Bi-directional content sharing across heterogeneous sources Decoupled content distribution and experience delivery Central management and mapping of content Open, well-documented APIs Platform agnostic Smart filters and faceted search Automated content subscription updates Creation and collection of unified visitor profiles Merging of anonymous & known visitor profiles Real-time, adaptive segmentation Behavioral targeting and A/B/n testing Pre-built and custom reporting & analytics Acquia Cloud Site Factory and Acquia Lift together can increase efficiencies for building, deploying and updating sites within your organization and across your network, so you can mitigate risk, maintain brand consistency, and easily manage multilingual and/or global sites. The Benefits of ACSF + Acquia Lift The more platforms, systems, and tools you have to manage your digital properties, the more resources you need to maintain them. Not all technology is created equal; some of those resources might end up spending time supporting outdated software rather than building and deploying new sites. By using Acquia Cloud Site Factory, you can consolidate your websites into one system that allows you to build reusable themes and templates, improving deployment time and reducing cost. Faster Time to Market: Valuable time can be saved during the content creation and discovery processes. Acquia Lift lets you easily distribute new pieces of content across your network, instead of having to either send it via email to your network or update each site manually. In addition, the combination of bidirectional functionality and automation allows you to pull in content from your network or trusted external sources, and distribute it automatically based on your search filters. Content and personalization rules can be added onto pages with easy drag and drop functionality to deliver data-driven personalized digital experiences. For existing pieces of content, the faster you are able to determine if the type of content you need already exists, the faster you can repurpose that content, because you’re not duplicating work or wasting time searching for relevant content. Lower Cost: Running multiple legacy technologies is costly; there’s no two ways about it. By using a multisite delivery and management platform like Acquia Cloud Site Factory, you lower your costs by increasing reuse and reducing duplication and complexity while eliminating legacy systems. This also saves on incurring cost from the resources dedicated to each legacy technology, as well as license fees and maintenance retainers associated with those technologies. With Acquia Lift, cost is saved by not having to build and manage your own “homegrown” content distribution solution. Resources that would have been used on painstaking maintenance can now focus on using the open API to integrate with different technologies. And for content authors and marketers, using a system like Acquia Lift eliminates the time associated with searching for, managing, and duplicating content and building personalized digital experiences across a portfolio of sites. If you are to succeed in creating multiple digital experiences you need to break out of the traditional website experience by effectively managing your sites and allowing your content to shine. Acquia Cloud Site Factory and Acquia Lift not only help you manage today’s multisite and content demands, but prepare you for the API revolution on the horizon.

Bottoms Rupp | Another two domains for $0.99 each Blog -

Coming back from a long weekend is always tough, but there’s nothing that can lift the spirits quite like a great deal. That’s why we have another incredible sale headed your way for this week’s Bottoms Rupp Domain Happy Hour. Join us this Thursday, Feb. 23 from 3 to 5 p.m. MST (10 p.m. to 12 […] The post Bottoms Rupp | Another two domains for $0.99 each appeared first on Blog.

Tips to Increase Traffic to Your Blog

Everything Typepad -

Of course, you want to increase the reach of your blog. We have some tips for you! Even if you have an established blog and audience, it is a good idea to check every once...      Related StoriesBe Discovered: 3 Sites to Help You Be the Next Big BloggerA few of our favorite thingsShare Your Blog Posts With Shareaholic  Jen

Storage Vendor StorPool Broadens Reach with Web Hosting Partners

The Hosting News -

Storage vendor StorPool recently announced that upon reviewing its 2016 revenue, it has found that its revenue has increased almost 350% year over year. StorPool executives attribute the increases to their decision to partner with web hosting providers in the U.S. and internationally. A StorPool representative stated: “Demand for software-defined storage coupled with strategic sales has helped its worldwide installed data storage capacity reach to over 5 petabytes.” With the addition of web hosting partners, StorPool has added many more customers from North America, Asia, and Australia during 2016. U.S. growth was bolstered by its partnership with eApps Hosting. Asian growth was due to a partnership with vHost. Read more here.

Plugged In: Comment Plugins

WP Engine -

Welcome to Plugged In, where we take a look at some of the most popular WordPress plugins in various categories. This week, we look into the best WordPress plugins for enabling comments on your site or blog. (For more information on WordPress plugins, download our ultimate guide.) The comment section is one of the most interesting parts of the internet and is another way to interact with your audience. In order to have these interactions, you must equip the proper plugins to create a comment thread. Here are some comment plugins that can help assist you with this. wpDiscuz Integration is one of WordPress’ greatest assets, and the comment plugin wpDiscuz is a testament to that. WpDiscuz provides full integration with AntiSpam plugins like Akismet, WordPress Zero Spam, and WPBruiser as well as social network login plugins. The plugin acts as a clean and simple interface of a comment stream ordered from newest to oldest and most voted comments. These are just some of the 30-plus features listed in the WordPress plugin directory. Subscribe To Comments Reloaded With Subscribe To Comments Reloaded, your commenters can sign up for email notifications and includes a full-featured subscription manager. It even carries a one-click unsubscribe feature and sends subscribers a confirmation email, allowing them to confirm their subscription by clicking on a provided link. Facebook comments WordPress This plugin is created for showing your site visitors’ Facebook comments. Facebook comments WordPress is a useful tool to improve your website traffic from Facebook. The plugin is also completely customizable. You fan choose a text color, font size, title and display position, width, comments ordering, background color, animation effects, and comment language. What are your favorite email plugins? Let us know in the comment section below. And be sure to check out our list of the 10 most popular plugins our customers use on our platform. The post Plugged In: Comment Plugins appeared first on WP Engine.

OpenStack and Virtualization: What’s the Difference?

The Rackspace Blog & Newsroom -

If you’re confused about the differences between OpenStack and virtualization, you’re not alone. They are indeed different, and this post will describe how, review some practical ‘good fit’ use cases for OpenStack, and finally dispel a few myths about this growing open source cloud platform. To get started, a few basics: Virtualization has its roots in partitioning, which divides The post OpenStack and Virtualization: What’s the Difference? appeared first on The Official Rackspace Blog.

Three Web Trends That Will Shape 2017

Liquid Web Official Blog -

The New Year is now in full swing, and it seems the perfect time to think about how things might soon change in the web space. 2016 was, after all, a momentous year for the web, both on the development side and the marketing side. Mobile optimization and graphic media rose to the fore of […] The post Three Web Trends That Will Shape 2017 appeared first on Liquid Web Official Blog.

Well met! Introducing Mickey.

cPanel Blog -

Greetings! Hello everyone!  My name is Mickey and I’m the latest Community Manager to join the team at cPanel.  I’m incredibly excited to start and I can’t wait to meet you all. Unlike my partner benny, I’m brand new to the Web Hosting field, but I’ve been working in the online media industry for 10 years. You can find me spending most of my free time at my computer desk, playing the latest games as ...

Motion to Dismiss from Facebook Thrown Out in Data Center Design Lawsuit

The Hosting News -

A Silicon Valley judge ruled against Facebook last week in the motion to dismiss the lawsuit. The suit was filed by a British Data Center builder back in 2015 stating that Facebook misappropriated their trade secrets. The secrets the lawsuit is all about have to do with the modular data center designs and methods. BladeRoom is one of the two companies filing the suit, which claims Emerson Electric and Facebook, lured BladeRoom and Bripco into disclosing data center methods and designs, and then used them for a data center they built in Sweden on their own. Read the full story here.

How the Freelance Generation is Redefining Professional Norms

LinkedIn Official Blog -

The world of work is changing — you can see it in the numbers. Freelancers who made up a mere 6% of the workforce in 1989 are expected to represent 43% of the workforce by 2020. This meteoric rise of the freelance workforce can be traced to a number of compounding economic and workforce factors emerging over the past several decades: Average length of unemployment extends. The average duration of unemployment in America has extended from 8.5 weeks in 1980, to 12 weeks in 2000, to 25.1 weeks... .

Share It Again: New Social Media Features for Premium and Business Users News -

Sharing your posts on social media is a great way to ensure your site or blog gets traffic. Our Publicize feature makes it easy to automatically share your new posts on Facebook, Twitter, and other social media networks. But what about your previously published posts? For posts that are always relevant or valuable to new readers, you may want to share them again — weeks, months, or even years later. That’s why we’re excited to introduce a new re-sharing feature for our Premium and Business users. Now, you can share your previously published posts on social networks — with custom messaging for each social network too. Just go to the Blog Posts section of your site, select Share, and you’ll see the new sharing menu for reposting to your social accounts: Then you’re all set! A brief word on social media strategy: Make sure your posting schedule and frequency of posts take into account your followers’ needs and expectations. For example: with social media accounts on Facebook and Twitter, we do not recommend sharing the same post over and over — your account should contain a mix of links to your blog, your thoughts, and comments, all spaced apart. People around the world browse social media 24 hours a day,  so repeating content in distant time zones helps widen your audience, but know that users may not appreciate seeing the same link multiple times. You can learn more about growing your audience and specific tips for highlighting your archives in Blogging University. We’re excited about these new features, and we hope you enjoy it. Filed under: Social

LuaJIT Hacking: Getting next() out of the NYI list

CloudFlare Blog -

At Cloudflare we’re heavy users of LuaJIT and in the past have sponsored many improvements to its performance. LuaJIT is a powerful piece of software, maybe the highest performing JIT in the industry. But it’s not always easy to get the most out of it, and sometimes a small change in one part of your code can negatively impact other, already optimized, parts. One of the first pieces of advice anyone receives when writing Lua code to run quickly using LuaJIT is “avoid the NYIs”: the language or library features that can’t be compiled because they’re NYI (not yet implemented). And that means they run in the interpreter. CC BY-SA 2.0 image by Dwayne Bent Another very attractive feature of LuaJIT is the FFI library, which allows Lua code to directly interface with C code and memory structures. The JIT compiler weaves these memory operations in line with the generated machine language, making it much more efficient than using the traditional Lua C API. Unfortunately, if for any reason the Lua code using the FFI library has to run under the interpreter, it takes a very heavy performance hit. As it happens, under the interpreter the FFI is usually much slower than the Lua C API or the basic operations. For many people, this means either avoiding the FFI or committing to a permanent vigilance to maintain the code from falling back to the interpreter. Optimizing LuaJIT Code Before optimizing any code, it’s important to identify which parts are actually important. It’s useless to discuss what’s the fastest way to add a few numbers before sending some data, if the send operation will take a million times longer than that addition. Likewise, there’s no benefit avoiding NYI features in code like initialization routines that might run only a few times, as it’s unlikely that the JIT would even try to optimize them, so they would always run in the interpreter. Which, by the way, is also very fast; even faster than the first version of LuaJIT itself. But optimizing the core parts of a Lua program, like any deep inner loops, can yield huge improvements in the overall performance. In similar situations, experienced developers using other languages are used to inspecting the assembly language generated by the compiler, to see if there’s some change to the source code that can make the result better. The command line LuaJIT executable provides a bytecode list when running with the -jbc option, a statistical profiler, activated with the -jp option, a trace list with -jv, and finally a detailed dump of all the JIT operations with -jdump. The last two provide lots of information very useful for understanding what actually happens with the Lua code while executing, but it can be a lot of work to read the huge lists generated by -jdump. Also, some messages are hard to understand without a fairly complete understanding of how the tracing compiler in LuaJIT actually works. One very nice feature is that all these JIT options are implemented in Lua. To accomplish this the JIT provides ‘hooks’ that can execute a Lua function at important moments with the relevant information. Sometimes the best way to understand what some -jdump output actually means is to read the code that generated that specific part of the output. CC BY 2.0 image by Kevan Introducing Loom After several rounds there, and being frustrated by the limitations of the sequentially-generated dump, I decided to write a different version of -jdump, one that gathered more information to process and add cross-references to help see how things are related before displaying. The result is loom, which shows roughly the same information as -jdump, but with more resolved references and formatted in HTML with tables, columns, links and colors. It has helped me a lot to understand my own code and the workings of LuaJIT itself. For example, let's consider the following code in a file called twoloops.lua: for i=1,1000 do for j=1,1000 do end end With the -jv option: $ luajit -jv twoloops.lua [TRACE 1 twoloops.lua:2 loop] [TRACE 2 (1/3) twoloops.lua:1 -> 1] This tells us that there were two traces, the first one contains a loop, and the second one spawns from exit #3 of the other (the “(1/3)” part) and it’s endpoint returns to the start of trace #1. Ok, let’s get more detail with -jdump: $ luajit -jdump twoloops.lua ---- TRACE 1 start twoloops.lua:2 0009 FORL 4 => 0009 ---- TRACE 1 IR 0001 int SLOAD #5 CI 0002 + int ADD 0001 +1 0003 > int LE 0002 +1000 0004 ------ LOOP ------------ 0005 + int ADD 0002 +1 0006 > int LE 0005 +1000 0007 int PHI 0002 0005 ---- TRACE 1 mcode 47 0bcbffd1 mov dword [0x40db1410], 0x1 0bcbffdc cvttsd2si ebp, [rdx+0x20] 0bcbffe1 add ebp, +0x01 0bcbffe4 cmp ebp, 0x3e8 0bcbffea jg 0x0bcb0014 ->1 ->LOOP: 0bcbfff0 add ebp, +0x01 0bcbfff3 cmp ebp, 0x3e8 0bcbfff9 jle 0x0bcbfff0 ->LOOP 0bcbfffb jmp 0x0bcb001c ->3 ---- TRACE 1 stop -> loop ---- TRACE 2 start 1/3 twoloops.lua:1 0010 FORL 0 => 0005 0005 KSHORT 4 1 0006 KSHORT 5 1000 0007 KSHORT 6 1 0008 JFORI 4 => 0010 ---- TRACE 2 IR 0001 num SLOAD #1 I 0002 num ADD 0001 +1 0003 > num LE 0002 +1000 ---- TRACE 2 mcode 81 0bcbff79 mov dword [0x40db1410], 0x2 0bcbff84 movsd xmm6, [0x41704068] 0bcbff8d movsd xmm5, [0x41704078] 0bcbff96 movsd xmm7, [rdx] 0bcbff9a addsd xmm7, xmm6 0bcbff9e ucomisd xmm5, xmm7 0bcbffa2 jb 0x0bcb0014 ->1 0bcbffa8 movsd [rdx+0x38], xmm6 0bcbffad movsd [rdx+0x30], xmm6 0bcbffb2 movsd [rdx+0x28], xmm5 0bcbffb7 movsd [rdx+0x20], xmm6 0bcbffbc movsd [rdx+0x18], xmm7 0bcbffc1 movsd [rdx], xmm7 0bcbffc5 jmp 0x0bcbffd1 ---- TRACE 2 stop -> 1 This tells us... well, a lot of things. If you look closely, you’ll see the same two traces, one is a loop, the second starts at 1/3 and returns to trace #1. Each one shows some bytecode instructions, an IR listing, and the final mcode. There are several options to turn on and off each listing, and more info like the registers allocated to some IR instructions, the “snapshot” structures that allow the interpreter to continue when a compiled trace exits, etc. Now using loom: There’s the source code, with the corresponding bytecodes, and the same two traces, with IR and mcode listings. The bytecode lines on the traces and on the top listings are linked, hovering on some arguments on the IR listing highlights the source and use of each value, the jumps between traces are correctly labeled (and colored), finally, clicking on the bytecode or IR column headers reveals more information: excerpts from the source code and snapshot formats, respectively. Writing it was a great learning experience, I had to read the dump script’s Lua sources and went much deeper in the LuaJIT sources than ever before. And then, I was able to use loom not only to analyze and optimize Cloudflare’s Lua code, but also to watch the steps the compiler goes through to make it run fast, and also what happens when it’s not happy. The code is the code is the code is the code LuaJIT handles up to four different representation of a program’s code: First comes the source code, what the developer writes. The parser analyzes the source code and produces the Bytecode, which is what the interpreter actually executes. It has the same flow of the source code, grouped in functions, with all the calls, iterators, operations, etc. Of course, there’s no nice formatting, comments, the local variable names are replaced by indices, and all constants (other than small numbers) are stored in a separate area. When the interpreter finds that a given point of the bytecode has been repeated several times, it’s considered a “hot” part of the code, and interprets it once again but this time it records each bytecode it encounters, generating a “code trace” or just “a trace”. At the same time, it generates an “intermediate representation”, or IR, of the code as it’s executed. The IR doesn’t represent the whole of the function or code portion, just the actual options it actually takes. A trace is finished when it hits a loop or a recursion, returns to a lower level than when started, hits a NYI operation, or simply becomes too long. At this point, it can be either compiled into machine language, or aborted if it has reached some code that can’t be correctly translated. If successful, the bytecode is patched with an entry to the machine code, or “mcode”. If aborted, the initial trace point is “penalized” or even “blacklisted” to avoid wasting time trying to compile it again. What’s next()? One of the most visible characteristics of the Lua language is the heavy use of dictionary objects called tables. From the Lua manual: “Tables are the sole data structuring mechanism in Lua; they can be used to represent ordinary arrays, symbol tables, sets, records, graphs, trees, etc.” To iterate over all the elements in a table, the idiomatic way is to use the standard library function pairs() like this: for k, v in pairs(t) do -- use the key in ‘k’ and the value in ‘v’ end In the standard Lua manual, pairs() is defined as “Returns three values: the next function, the table t, and nil”, so the previous code is the same as: for k, v in next, t, nil do -- use the key in ‘k’ and the value in ‘v’ end But unfortunately, both the next() and pairs() functions are listed as “not compiled” in the feared NYI list. That means that any such code runs on the interpreter and is not compiled, unless the code inside is complex enough, and has other inner loops (loops that doesn’t use next() or pairs(), of course). Even in that case, the code would have to fall back to the interpreter at each loop end. This sad news creates a tradeoff: for performance sensitive parts of the code, don’t use the most Lua-like code style. That motivates people to come up with several contortions to be able to use numerical iteration (which is compiled, and very efficient), like replacing any key with a number, storing all the keys in a numbered array, or store both keys and values at even/odd numeric indices. Getting next() out of the NYI list So, I finally have a non-NYI next() function! I'd like to say "a fully JITtable next() function", but it wouldn't be totally true; as it happens, there's no way to avoid some annoying trace exits on table iteration. The purpose of the IR is to provide a representation of the execution path so it can be quickly optimized to generate the final mcode. For that, the IR traces are linear and type-specific; creating some interesting challenges for iteration on a generic container. Traces are linear Being linear means that each trace captures a single execution path, it can't contain conditional code or internal jumps. The only conditional branches are the "guards" that make sure that the code to be executed is the appropriate one. If a condition changes and it must now do something different, the trace must be exited. If it happens several times, it will spawn a side trace and the exit will be patched into a conditional branch. Very nice, but this still means that there can be at most one loop on each trace. The implementation of next() has to internally skip over empty slots in the table to only return valid key/value pairs. If we try to express this in IR code, this would be the "inner" loop and the original loop would be an "outer" one, which doesn't have as much optimization opportunities. In particular, it can't hoist invariable code out of the loop. The solution is to do that slot skipping in C. Not using the Lua C API, of course, but the inner IR CALL instruction that is compiled into a "fast" call, using CPU registers for arguments as much as possible. The IR is in Type-specific SSA form The SSA form (Static Single Assignment) is key for many data flow analysis heuristics that allow quick optimizations like dead code removal, allocation sinking, type narrowing, strength reduction, etc. In LuaJIT's IR it means every instruction is usable as a value for subsequent instructions and has a declared type, fixed at the moment when the trace recorder emits this particular IR instruction. In addition, every instruction can be a type guard, if the arguments are not of the expected type the trace will be exited. Lua is dynamically typed, every value is tagged with type information so the bytecode interpreter can apply the correct operations on it. This allows us to have variables and tables that can contain and pass around any kind of object without changing the source code. Of course, this requires the interpreter to be coded very "defensively", to consider all valid ramifications of every instruction, limiting the possibility of optimizations. The IR traces, on the other hand, are optimized for a single variation of the code, and deal with only the value types that are actually observed while executing. For example, this simple code creates a 1,000 element array and then copies to another table: local t,t2 = {},{} for i=1,1000 do t[i] = i end for i,v in ipairs(t) do t2[i]=v end resulting in this IR for the second loop, the one that does the copy: 0023 ------------ LOOP ------------ 0024 num CONV 0017 0025 > int ABC 0005 0017 0026 p32 AREF 0007 0017 0027 num ASTORE 0026 0022 0028 rbp + int ADD 0017 +1 0029 > int ABC 0018 0028 0030 p32 AREF 0020 0028 0031 xmm7 >+ num ALOAD 0030 0032 xmm7 num PHI 0022 0031 0033 rbp int PHI 0017 0028 0034 rbx nil RENAME 0017 #3 0035 xmm6 nil RENAME 0022 #2 Here we see the ALOAD in instruction 0031 assures that the value loaded from the table is in effect a number. If it happens to be any other value, the guard fails and the trace is exited. But if we do an array of strings instead of numbers? a small change: local t,t2 = {},{} for i=1,1000 do t[i] = 's'..i end for i,v in ipairs(t) do t2[i]=v end gives us this: 0024 ------------ LOOP ------------ 0025 num CONV 0018 0026 > int ABC 0005 0018 0027 p32 AREF 0007 0018 0028 str ASTORE 0027 0023 0029 rbp + int ADD 0018 +1 0030 > int ABC 0019 0029 0031 p32 AREF 0021 0029 0032 rbx >+ str ALOAD 0031 0033 rbx str PHI 0023 0032 0034 rbp int PHI 0018 0029 0035 r15 nil RENAME 0018 #3 0036 r14 nil RENAME 0023 #2 It's the same code, but the type that ALOAD is guarding is now a string (and it now uses a different register, I guess a vector register isn't appropriate for a string pointer). And if the table has a values of a mix of types? local t,t2={},{} for i=1,1000,2 do t[i], t[i+1] = i, 's'..i end for i,v in ipairs(t) do t2[i]=v end 0031 ------------ LOOP ------------ 0032 num CONV 0027 0033 > int ABC 0005 0027 0034 p32 AREF 0007 0027 0035 str ASTORE 0034 0030 0036 r15 int ADD 0027 +1 0037 > int ABC 0019 0036 0038 p32 AREF 0021 0036 0039 xmm7 > num ALOAD 0038 0040 > int ABC 0005 0036 0041 p32 AREF 0007 0036 0042 num ASTORE 0041 0039 0043 rbp + int ADD 0027 +2 0044 > int ABC 0019 0043 0045 p32 AREF 0021 0043 0046 rbx >+ str ALOAD 0045 0047 rbx str PHI 0030 0046 0048 rbp int PHI 0027 0043 Now there are two ALOADs, (and two ASTOREs), one for 'num' and one for 'str'. In other words, the JIT unrolled the loop and found that that made the types constant. =8-O Of course, this would happen only on very simple and regular patterns. In general, it's wiser to avoid unpredictable type mixing; but polymorphic code will be optimized for each type that it's actually used with. Back to next() First let's see the current implementation of next() as used by the interpreter: lj_tab.c /* Advance to the next step in a table traversal. */ int lj_tab_next(lua_State *L, GCtab *t, TValue *key) { uint32_t i = keyindex(L, t, key); /* Find predecessor key index. */ for (i++; i < t->asize; i++) /* First traverse the array keys. */ if (!tvisnil(arrayslot(t, i))) { setintV(key, i); copyTV(L, key+1, arrayslot(t, i)); return 1; } for (i -= t->asize; i <= t->hmask; i++) { /* Then traverse the hash keys. */ Node *n = &noderef(t->node)[i]; if (!tvisnil(&n->val)) { copyTV(L, key, &n->key); copyTV(L, key+1, &n->val); return 1; } } return 0; /* End of traversal. */ } It takes the input key as a TValue pointer and calls keyindex(). This helper function searches for the key in the table and returns an index; if the key is an integer in the range of the array part, the index is the key itself. If not, it performs a hash query and returns the index of the Node, offset by the array size, if successful, or signals an error if not found (it's an error to give a nonexistent key to next()). Back at lj_tab_next(), the index is first incremented, and if it's still within the array, it's iterated over any hole until a non-nil value is found. If it wasn't in the array (or there’s no next value there), it performs a similar "skip the nils" on the Node table. The new lj_record_next() function in lj_record.c, like some other record functions there, first checks not only the input parameters, but also the return values to generate the most appropriate code for this specific iteration, assuming that it will likely be optimal for subsequent iterations. Of course, any such assumption must be backed by the appropriate guard. For next(), we choose between two different forms, if the return key is in the array part, then it uses lj_tab_nexta(), which takes the input key as an integer and returns the next key, also as an integer, in the rax register. We don't do the equivalent to the keyindex() function, just check (with a guard) that the key is within the bounds of the array: lj_tab.c /* Get the next array index */ MSize LJ_FASTCALL lj_tab_nexta(GCtab *t, MSize k) { for (k++; k < t->asize; k++) if (!tvisnil(arrayslot(t, k))) break; return k; } The IR code looks like this: 0014 r13 int FLOAD 0011 tab.asize 0015 rsi > int CONV 0012 int.num 0017 rax + int CALLL lj_tab_nexta (0011 0015) 0018 > int ABC 0014 0017 0019 r12 p32 FLOAD 0011 tab.array 0020 p32 AREF 0019 0017 0021 [8] >+ num ALOAD 0020 Clearly, the CALL itself (at 0017) is typed as 'int', as natural for an array key; and the ALOAD (0021) is 'num', because that's what the first few values happened to be. When we finish with the array part, the bounds check (instruction ABC on 0018) would fail and soon new IR would be generated. This time we use the lj_tab_nexth() function. lj_tab.c LJ_FUNCA const Node *LJ_FASTCALL lj_tab_nexth(lua_State *L, GCtab *t, const Node *n) { const Node *nodeend = noderef(t->node)+t->hmask; for (n++; n <= nodeend; n++) { if (!tvisnil(&n->val)) { return n; } } return &G(L)->nilnode; } But before doing the "skip the nils", we need to do a hash query to find the initial Node entry. Fortunately, the HREF IR instruction does that: This is the IR: 0014 rdx p32 HREF 0011 0012 0016 r12 p32 CALLL lj_tab_nexth (0011 0014) 0017 rax >+ str HKLOAD 0016 0018 [8] >+ num HLOAD 0016 There's a funny thing here: HREF is supposed to return a reference to a value in the hash table, and the last argument in lj_tab_nexth() is a Node pointer. Let's see the Node definition: lj_obj.h /* Hash node. */ typedef struct Node { TValue val; /* Value object. Must be first field. */ TValue key; /* Key object. */ MRef next; /* Hash chain. */ #if !LJ_GC64 MRef freetop; /* Top of free elements (stored in t->node[0]). */ #endif } Node; Ok... the value is the first field, and it says right there "Must be first field". Looks like it's not the first place with some hand-wavy pointer casts. The return value of lj_tab_next() is a Node pointer, which can likewise be implicitly cast by HLOAD to get the value. To get the key, I added the HKLOAD instruction. Both are guarding for the expected types of the value and key, respectively. Let's take it for a spin So, how does it perform? These tests do a thousand loops over a 10,000 element table, first using next() and then pairs(), with a simple addition in the inner loop. To get pairs() compiled, I just disabled the ISNEXT/ITERN optimization, so it actually uses next(). In the third test the variable in the addition is initialized to 0ULL instead of just 0, triggering the use of FFI. First test is with all 10,000 elements on sequential integers, making the table a valid sequence, so ipairs() (which is already compiled) can be used just as well: So, compiled next() is quite a lot faster, but the pairs() optimization in the interpreter is very fast. On the other hand, the smallest smell of FFI completely trashes interpreter performance, while making compiled code slightly tighter. Finally, ipairs() is faster, but a big part of it is because it stops on the first nil, while next() has to skip over every nil at the end of the array, which by default can be up to twice as big as the sequence itself. Now with 5,000 (sequential) integer keys and 5,000 string keys. Of course, we can't use ipairs() here: Roughly the same pattern: the compiled next() performance is very much the same on the three forms (used directly, under pairs() and with FFI code), while the interpreter benefits from the pairs() optimization and almost dies with FFI. In this case, the interpreted pairs() actually surpasses the compiled next() performance, hinting that separately optimizing pairs() is still desirable. A big factor in the interpreter pairs() is that it doesn't use next(); instead it directly drives the loop with a hidden variable to iterate in the Node table without having to perform a hash lookup on every step. Repeating that in a compiled pairs() would be equally beneficial; but has to be done carefully to maintain compatibility with the interpreter. On any trace exit the interpreter would kick in and must be able to seamlessly continue iterating. For that, the rest of the system has to be aware of that hidden variable. The best part of this is that we have lots of very challenging, yet deeply rewarding, work ahead of us! Come work for us on making LuaJIT faster and more.

How to Verify a Facebook Page for a Local Business

Social Media Examiner -

Is your local business on Facebook? Wondering how to make your Facebook page official? Verifying a local business page adds a layer of legitimacy to your presence and can help customers feel more confident when they engage with you on Facebook. In this article, you’ll discover how to get your local Facebook page verified. Benefits [...] This post How to Verify a Facebook Page for a Local Business first appeared on . - Your Guide to the Social Media Jungle

wholesale lingerie

Drupal News & Announcements -

“We got the opportunity to showcase our product. They did a runway show,” wholesale lingerie, she said. “We were trying to get a sense of whether our product is something that would work in a boutique setting.” Her other marketing strategies include launching home parties and making items in school colors to appeal to the co-ed market. “I have two young teenage daughters myself. I wanted to start a home party element to the business so that mother and daughter can come and shop in a more intimate, comfortable setting,” Field-Alvarez said.Drupal version: Drupal 5.x

Storage: What does the customer need nowadays?

1&1 Online Success Center -

The use of cloud technology is strongly connected to storing, processing and managing data. What do customers expect from storage solutions and what does this mean for cloud computing requirements? In the age of digitalization, huge amounts of data are generated by businesses due to the large number of channels linked to the internet. It is important for them to have quick access to this data, both for further processing and protection from data loss. This is why they count on the agility, scalability and cost efficiency of the cloud, which on-site solutions cannot compete with. Thus, there is a need for a hybrid solution which connects a company’s in-house infrastructure with cloud applications from an external provider. This way, businesses can use more powerful resources for their web projects and at the same time have access to their data, whenever and wherever they need to. But why does data storage only play a small part in efficient data management? Peter Wuest, Senior Director New Platforms & Solutions EMEA NetApp, explained it to us at the Cloud Expo Europe in Frankfurt. Watch the video below for the full interview: Image: 1&1

WordPress Weekly Digest: 2/20/17

WP Engine -

Every week brings fresh news and updates in the world of WordPress. Here we recap some of the biggest stories in the WordPress community provided by Torque. Dedicated to informing new and advanced WordPress users about the industry, Torque is a hub for WordPress news, business, and community. This week’s WordPress Digest features stories on Scott Arciszewski’s Medium post, how to install a WordPress plugin, using VueJS components, and more. Doc Pop’s News Drop: Do We Need Key Signed Updates? Scott Arciszewski, an open source security aficionado, wrote a blog post on Medium about WordPress’ auto-update feature. This prompted a response from Matt Mullenweg. Build a Site With Me: How to Install a Plugin On this week’s Build a Site With Me, Torque teaches how to install a plugin on your WordPress site. Using VueJS Components With The WordPress REST API This one is for the coders. With the code language VueJS, you can create reusable components and build a post list and a single post component. How your Business can Benefit from a WordPress Website There are many reasons WordPress is perfect for enterprise grade. It can scale with your business, is highly customizable, and looks great on mobile devices. Find out more reasons why here. 8 WAYS TO FALL IN LOVE WITH WORDPRESS ALL OVER AGAIN After a while, relationships will lose romanticism. However, on Valentine’s Day, Torque gave some ways to rekindle your flame with WordPress. Stay tuned for more feature stories and WordPress news from! The post WordPress Weekly Digest: 2/20/17 appeared first on WP Engine.

6 Low-Cost Ways to Increase Traffic to Your Website

Bluehost Blog -

One of the easiest ways to attract new business is getting more visitors to your website. Increasing traffic to your website can be the most cost-effective way to increase your sales, which means you need a solid strategy for growing your online audience. In that spirit, I wanted to explain some of the best ways to drive traffic to your website. For those of you who’ve been in business for a while, you may know several of these options, but even experienced online entrepreneurs can learn how to optimize these promotional techniques. We’re going to break your options down into two categories — free and paid — and give you some of the pros and cons of each. 3 Free Ways to Increase Traffic to Your Website Evergreen Content Creating and posting evergreen content helps you establish your authority in a particular subject, which is critical for attracting new customers. Blogging not only keeps your website fresh for visitors, but every page you add to your site helps increase your visibility on Google. To further help your SEO, you should be embedding links and keywords specific to your industry in all of your content.   A word of warning: Many businesses go too far with keywords, serving up content that’s nothing more than marketing jargon. That’s an easy way to turn off visitors. Social Media It’s pretty obvious that many small businesses now use social media to help drive traffic to their websites, with many businesses using Facebook as their channel of choice. While organic social growth doesn’t necessarily require money, it does take time and patience. When using social media to drive traffic, make sure you keep a consistent posting schedule and share content from other pages as well as your own. Too many small businesses refuse to share any info that doesn’t directly relate to their business. Guest Posting In addition to creating evergreen content for your own site, take the time to write for someone else’s. This can give you a large sudden boost in traffic (since you’re tapping into an entirely new audience) but can require lots of work to set up. You’ll need to network with and earn the trust of the outlet you’re trying to write for.   If you’re just looking for another place to post content, many businesses choose, which is easy to write for but can leave your content buried. Creating a relationship with someone in your field and guest writing for his or her audience is much more fruitful. 3 Paid Ways to Increase Traffic to Your Website Paid Ads If you’re looking to generate traffic as quickly as possible, paid ads can be a great option. Generating organic traffic can take weeks or months, whereas paid ads, if done correctly, can create an immediate influx of visitors. That said, there are a few pieces of advice to keep in mind. For example, you should never pay for banner ads. Banner ads have a notoriously low rate of return, and most people only click on them by accident at this point. For small businesses, Facebook advertising is the best place to get an easy return on investment. Or try an email newsletter directed to an audience that closely matches your customer base. Both of these options will allow you to easily measure results and adjust your ads on the fly. If you want to dip your toe into social media ads, see if you can get some free ad coupons to start and avoid paying money for your early mistakes.   Press Releases Distributing press releases can help you build brand awareness and generate traffic to your site, since they are still widely used by news outlets looking for stories to cover. If done correctly, your press release can be picked up by multiple outlets, which means more eyes on your business and your content. In addition to attracting visitors, your release may also lead to contact with a  reporter or two, which can certainly help with marketing down the line. Depending on the distribution service you use, your press release can be sent to vastly different outlets. While the distributed press release may not have much SEO value, it does generate great exposure for your story. Affiliate Programs An affiliate program is a deal between a marketer and a content publisher and is sometimes referred to as “performance marketing.” Why? Because you can set the terms of engagement, paying the publisher who is promoting your content based on the number of clicks or sales he or she sends your way. Usually these are partnerships are set up through a network, such as CJ Affiliate or the Google Affiliate network. The network will help ensure your promotions get in front of an interested audience, but you should vet the options thoroughly to see if they’re a good match for your business. By using a combination of these marketing techniques, you can begin to drive more traffic to your website. So go ahead. See which options work best for your business and run with it. Marc Prosser Marc Prosser is the co-founder and publisher of Fit Small Business, a website that reaches over 600,000 small business readers a month. Started in 2013, Fit Small Business serves as the “Consumer Reports” for small business owners. Prior to starting Fit Small Business, Marc was the CMO of FXCM for ten years. He joined as FXCM’s first employee and grew the company to over 700 employees. The post 6 Low-Cost Ways to Increase Traffic to Your Website appeared first on Official Bluehost Blog.


Recommended Content

Subscribe to Complete Hosting Guide aggregator