Feed aggregator

Russ Allbery: rra-c-util 6.0

Planet Debian - Sun, 08/05/2016 - 01:44

Quite some time ago, I added strlcat and strlcpy functions to my portability C library. I've subsequently become convinced that those functions are a bad idea, and have been moving all of my code to asprintf and other functions. This release completes that change for all the code provided by rra-c-util and removes strlcpy and strlcat from rra-c-util.

network_set_freebind, network_set_reuseaddr, and network_set_v6only, to set various socket options, are now public functions, since INN wanted to use them directly rather than only as part of other interfaces.

This release also has new Autoconf probes for Perl that assist with linking with embedded Perl, checking the Perl version, and checking for Perl modules, and a fix to the OpenSSL Autoconf macros for 1.1.0. It also adds a replacement for gss_oid_equal for older versions of Heimdal that lack it.

Finally, rra-c-util 6.0 implements the transition in C TAP Harness 4.0 from SOURCE and BUILD to C_TAP_SOURCE and C_TAP_BUILD for all the test suite helper code provided by this package.

You can get the latest version from the rra-c-util distribution page.

Categories: Elsewhere

Russ Allbery: C TAP Harness 4.0

Planet Debian - Sun, 08/05/2016 - 01:07

When I originally wrote my test framework for C, I used SOURCE and BUILD as the preprocessor symbols and environment variables that pointed to the source and build directories of the software being tested. Subsequent discussion and thought convinced me that I should have used some sort of prefix on those variables to distinguish from other uses.

This release starts the process of changing to C_TAP_SOURCE and C_TAP_BUILD instead. You now have to use the new names when setting preprocessor directives when building the test harness. For now, the test harness will set all four environment variables, but test code should switch to the new environment variables, since I'll drop the old SOURCE and BUILD variables in a later release.

I also fixed a missing va_end() call in is_double(), thanks to a report from Julien ÉLIE.

You can get the latest release from the C TAP Harness distribution page.

Categories: Elsewhere

DrupalEasy: Summertime, and the hiring is (Drupal)Easy

Planet Drupal - Sun, 08/05/2016 - 00:18

It’s almost summer, and at DrupalEasy, that means it is almost Intern Season! Our Spring Drupal Career Online class is three-fourths of the way to graduation, and we have just three budding Drupalists who are looking for work experience through internships (the others are already spoken for!)  If you’ve got too much to do, and not enough capacity to do it, an intern might be just the ticket through our (Work Experience) WE Drupal Program.

We love sowing the Drupal Community with well-trained new talent, all of whom have already devoted hundreds of hours, thousands of dollars, and more than three months of their lives to learning, practicing, engaging and developing their passions for Drupal in their quest to become professionals.  We’ve found that they have a lot to offer organizations who can use their eager new Drupal passion and help them build really great first Drupal Experience entries on their resumes.  If you need some extra bandwidth, or have some tasks or projects suited to a new site-builder type, why not engage an intern?

Hosting an intern is also a great way to test out talent and take some of the lower-level workload off of senior developers (like taking care of your own site, or those simpler tasks you need to get done for your clients.)  Here’s the deal: you bring on a graduate of our Drupal Career training program, either paid or unpaid in mid-June.  They devote their new Drupal enthusiasm and best-practice foundational skills to your projects for 2 to 3 months while you give them some guidance and experience.  You and the intern then decide if they move on, or continue on as an (already indoctrinated) contractor or employee.

If you’d like to learn more, you can check out how we approach WE Drupal, fill out a Host Application (no commitment, just a way for us to learn what you are looking for)  or email me.  

Summer is just around the corner, so WE hope you don’t delay.

Categories: Elsewhere

DrupalCon News: We are sprinting - come join!

Planet Drupal - Sat, 07/05/2016 - 16:17

Extended sprints have officially kicked off at Launch Pad.  We will be here all day, so stop by and join.

The Extended Sprints are located at 643 Magazine Street.  The front door is set back a little bit.  When you arrive, please send @joelpittet a text so that he can come let you in the front door.

We have breakfast, lots of sunlight and a rooftop deck, so come join!

Thank you for sprinting.


Categories: Elsewhere

Elena 'valhalla' Grandi: Pyra preorders

Planet Debian - Sat, 07/05/2016 - 14:30
Pyra preorders

If you've met me at a conference you may have noticed that instead of a laptop I was using a handeld which looks like a laptop scaled down to nintendo DS size, the https://en.wikipedia.org/wiki/Openpandora.

I've used it as my main computing device while travelling for a few years, even for work (as a programmer)so happily that when EvilDragon announced at FOSDEM (link points to youtube video) https://www.youtube.com/watch?v=4T-w1KqrVsM that he was working on a successor device I started saving money for it even before I knew many details about the specs, other that they would have been way better than the Pandora ones (which is getting painful to use a browser on, because of its 256MB RAM).


Now this successor device is almost ready, they have opened the preorders https://www.dragonbox.de/en/45-pyra, and they have already reached the absolute minimum number of orders for mass production and are almost there for a more reasonable number of 1000 devices, so if you want a chance to get one of the first batch devices now it's time to visit their store.

A few highlights, from my point of view, include:

* It will run Debian with just a custom kernel/bootloader (and a few configuration only packages): most of the kernel mods are being submitted upstream, so maybe one day there won't even be a need for this kernel (but e.g. with Pandora upstream didn't accept the custom way they managed the keyboard; on the Pyra the keyboard is managed in a more standard way, but there may be other similar issues).

* It has been designed with modularity in mind: the CPU board is socketed on the main board and in the future upgrades may require just replacing the CPU board. I haven't read the details on the actual licensing, but it seems that the hardware design will be open enough that 3rd party boards may also be a possibility.

* just like on Pandora: real keyboard. hardware analog volume wheel. Huge user-replaceable battery (I don't think that there are any independent reviews of the pyra battery yet, but the one on the Pandora is still able to go through a day of FOSDEM — i.e. alternating often between on with wifi and suspendend — and only go down to 50% or so charge). Stylus (and 3d-printed quill) friendly touchscreen. Long term support from the producer.

* The 4G version has been designed in such a way that the GSM modem can be actually turned off (just like on the https://neo900.org/)

There are of course a few bad parts:

* PowerVR. The good news is that there is a risk that no 3d drivers will be available at all, and this means that the Pyra has been tested and considered good enough with just (FOSS) software acceleration.

* The price: yes, it is expensive. I'm happy I've saved money in advance for it, otherwise I wouldn't have been able to afford it. Some of it is a problem of small production, some is actual product quality. If you consider that it can take the place of both a laptop (and small ones are getting quite expensive, now that netbooks have disappeared) and a smartphone (I don't do lots of voice calls) it will start going down from "oh so **** high" to "high, but not unreasonably so"

Disclaimer: I have preordered one, so I am interested in the success of the project because it will mean better software and better support for the device.

Edit: forgot the link to the press kit the images comes from http://cloud.openpandora.org/index.php/s/a0Q0TXV8gh5NLAC?path=%2F, which also includes more infos on specs etc.
Categories: Elsewhere

Craig Small: Displaying Linux Memory

Planet Debian - Sat, 07/05/2016 - 14:00

Memory management is hard, but RAM management may be even harder.

Most people know the vague overall concept of how memory usage is displayed within Linux. You have your total memory which is everything inside the box; then there is used and free which is what the system is or is not using respectively. Some people might know that not all used is used and some of it actually is free.  It can be very confusing to understand, even for a someone who maintains procps (the package that contains top and free, two programs that display memory usage).

So, how does the memory display work?

What free shows

The free program is part of the procps package. It’s central goal is to give a quick overview of how much memory is used where. A typical output (e.g. what I saw when I typed “free -h”) could look like this:

total used free shared buff/cache available Mem: 15G 3.7G 641M 222M 11G 11G Swap: 15G 194M 15G

I’ve used the -h option for human-readable output here for the sake of brevity and because I hate typing long lists of long numbers.

People who have good memories (or old computers) may notice there is a missing “-/+ buffers/cache” line. This was intentionally removed in mid-2014 because as the memory management of Linux got more and more complicated, these lines became less relevant. These used to help with the “not used used memory” problem mentioned in the introduction but progress caught up with it.

To explain what free is showing, you need to understand some of the underlying statistics that it works with. This isn’t a lesson on how Linux its memory (the honest short answer is, I don’t fully know) but just enough hopefully to understand what free is doing. Let’s start with the two simple columns first; total and free.

Total Memory

This is what memory you have available to Linux. It is almost, but not quite, the amount of memory you put into a physical host or the amount of memory you allocate for a virtual one. Some memory you just can’t have; either due to early reservations or devices shadowing the memory area. Unless you start mucking around with those settings or the virtual host, this number stays the same.

Free Memory

Memory that nobody at all is using. They haven’t reserved it, haven’t stashed it away for future use or even just, you know, actually using it.  People often obsess about this statistic but its probably the most useless one to use for anything directly. I have even considered removing this column, or replacing it with available (see later what that is) because of the confusion this statistic causes.

The reason for its uselessness is that Linux has memory management where it allocates memory it doesn’t use. This decrements the free counter but it is not truly “used”. If you application needs that memory, it can be given back.

A very important statistic to know for running a system is how much memory have I got left before I either run out or I start to serious swap stuff to swap drives. Despite its name, this statistic will not tell you that and will probably mislead you.

My advice is unless you really understand the Linux memory statistics, ignore this one.

Who’s Using What

Now we come to the components that are using (if that is the right word) the memory within a system.

Shared Memory

Shared memory is often thought of only in the context of processes (and makes working out how much memory a process uses tricky – but that’s another story) but the kernel has this as well. The shared column lists this, which is a direct report from the Shmem field in the meminfo file.


For things used a lot within the kernel, it is inefficient to keep going to get small bits of memory here and there all the time. The kernel has this concept of slabs where it creates small caches for objects or in-kernel data strucutures that slabinfo(5) states  “[such as] buffer heads, inodes and dentries”. So basically kernel stuff for the kernel to do kernelly things with.

Slab memory comes in two flavours. There is reclaimable and unreclaimable. This is important because unreclaimable cannot be “handed back” if your system starts to run out of memory. Funny enough, not all reclaimable is, well, reclaimable. A good estimate is you’ll only get 50% back, top and free ignore this inconvenient truth and assume it can be 100%. All of the reclaimable slab memory is considered part of the Cached statistic. Unreclaimable is memory that is part of Used.

Page Cache and Cached

Page caches are used to read and write to storage, such as a disk drive. These are the things that get written out when you use sync and make the second read of the same file much faster. An interesting quirk is that tmpfs  is part of the page cache. So the Cached column may increase if you have a few of these.

The Cached column may seem like it should only have Page Cache, but the Reclaimable part of the Slab is added to this value. For some older versions of some programs, they will have no or all Slab counted in Cached. Both of these versions are incorrect.

Cached makes up part of the buff/cache column with the standard options for free or has a column to itself for the wide option.


The second component to the buff/cache column (or separate with the wide option) is kernel buffers. These are the low-level I/O buffers inside the kernel. Generally they are small compared to the other components and can basically ignored or just considered part of the Cached, which is the default for free.


Unlike most of the previous statistics that are either directly pulled out of the meminfo file or have some simple addition, the Used column is calculated and completely dependent on the other values. As such it is not telling the whole story here but it is reasonably OK estimate of used memory.

Used component is what you have left of your Total memory once you have removed:

  • Free memory – because free is not used!
  • The Cached value – recall this is made up of the Page Cache plus the Reclaimable part of Slab
  • The buffers

Notice that the unreclaimable part of slab is not in this calculation, which means it is part of the used memory. Also note this seems a bit of a hack because as the memory management gets more complicated, the estimates used become less and less real.


In early 2014, the kernel developers took pity on us toolset developers and gave us a much cleaner, simpler way to work out some of these values (or at least I’d like to think that’s why they did it). The available statistic is the right way to work out how much memory you have left. The commit message explains the gory details about it, but the great thing is that if they change their mind or add some new memory feature the available value should be changed as well. We don’t have to worry about should all of slab be in Cached and are they part of Used or not, we have just a number directly out of meminfo.

What does this mean for free?

Poor old free is now at least 24 years old and it is based upon BSD and SunOS predecessors that go back way before then. People expect that their system tools don’t change by default and show the same thing over and over. On the other side, Linux memory management has changed dramatically over those years. Maybe we’re all just sheep (see I had to mention sheep or RAMs somewhere in this) and like things to remain the same always.

Probably if free was written now; it would only need the total, available and used columns with used merely being total minus available. Possibly with some other columns for the wide option.

The code itself (found in libprocps) is not very hard to maintain so its not like this change will same some time but for me I’m unsure if free is giving the right and useful result for people that use it.


Categories: Elsewhere

Dirk Eddelbuettel: BH 1.60.0-2

Planet Debian - Sat, 07/05/2016 - 05:41

A new minor release of BH is now on CRAN. BH provides a large part of the Boost C++ libraries as a set of template headers for use by R, possibly with Rcpp as well as other packages.

This release uses the same Boost 1.60.0 version of Boost as the last release, but adds three more library: bimap, flyweight and icl.

A brief summary of changes from the NEWS file is below.

Changes in version 1.60.0-2 (2016-05-06)
  • Added Boost bimap via GH pull request #24 by Jim Hester.

  • Added Boost icl via GH pull request #27 by Jay Hesselbert.

  • Added Boost flyweight as requested in GH ticket #26.

Courtesy of CRANberries, there is also a diffstat report for the most recent release.

Comments and suggestions are welcome via the mailing list or the issue tracker at the GitHubGitHub repo.

This post by Dirk Eddelbuettel originated on his Thinking inside the box blog. Please report excessive re-aggregation in third-party for-profit settings.

Categories: Elsewhere

Jay L.ee: Drupal Background Images Formatter Module Configuration Manual

Planet Drupal - Sat, 07/05/2016 - 04:51

Yesterday I wrote a blog post on how to configure a Drupal module called Background Images. Today I'll continue with part 2, and it's a simple one but essential as well, because this module doesn't even come with a README.txt file at all lol.

But before we begin, let's answer the million dollar question of why anyone would want to use this module:

A good example would be my use case where I run a membership website and want my members to be able to upload background images, because the Background Images module only allows people with admin access (specifically to admin/content/background-images) to enable background images at all.

Tags: Drupal 7Drupal Planet
Categories: Elsewhere

Darryl Norris's Blog: 4 New CKEditor Plugins For Drupal 8

Planet Drupal - Sat, 07/05/2016 - 04:40

About a month ago I was testing a pull request (#1999) for Drupal Console that will generate boilerplate code to integrate a button plugin from CKEditor to Drupal 8. So apparently the integration to integrate a CKEditor plugin for Drupal 8 is very simple thanks to the great CKEditor API in Drupal 8. While testing this pull request (#1999) I ended up with 4 plugins in my computer and I decide to share the code in Drupal.org so people can use it.

CKEditor Smiley

CKEditor Loremipsum

  • Project Page: https://www.drupal.org/project/ckeditor_loremipsum
  • Plugin Description: This plugin allows to generate lorem ipsum sentence or paragraph easily, to use in your web content, for example, it can be very useful when you want to demonstrate a website or a portal.

CKEditor Video Detector

Categories: Elsewhere

ActiveLAMP: Adding CKEditor plugins to Drupal 8

Planet Drupal - Sat, 07/05/2016 - 04:00

Drupal 8 has greatly improved editor experience out-of-the-box. It comes shipped with CKEditor for WYSIWYG editing. Although, D8 ships with a custom build of CKEditor and it may not have the plugins that you would like to have or that your client wants to have. I will show you how to add new plugins into the CKEditor that comes with Drupal 8.

Categories: Elsewhere

Drupal Bits at Web-Dev: Drupal: Enable or Disable a View in Deployment.

Planet Drupal - Sat, 07/05/2016 - 03:41

Drupal Hook Update Deploy Tools now (as of v 7.x-1.16) has the ability to enable or disable  a View from within a hook_update_N().  It handles validation to make sure that your request to enable or disable a View actually did what you asked it to do.


Add something like this to a hook_update_N in your custom deploy module.install
to enable some Views.

  $views = array(
  $message =  HookUpdateDeployTools\Views::enable('$views');

  return $message;

To disable some Views, it looks like this:

  $views = array(
  $message =  HookUpdateDeployTools\Views::disable('$views');

  return $message;

Here is an example of what your terminal would show after running the enable method above:

Categories: Elsewhere

DrupalCon News: Scholarship, grant, training proposals open for DrupalCon Dublin

Planet Drupal - Fri, 06/05/2016 - 21:16

DrupalCon Dublin will be here before you know it! Join us this 26-30 September in one of Europe's major centers for technology. We're looking for bright ideas from our amazing community when it comes to training proposals and other programmign content. While registration isn't open just yet, it's never too early to book your hotel room, make your travel plans, and send in your proposals for training, or to apply for a grants or scholarship. Consider it like an early RSVP!

Categories: Elsewhere

myDropWizard.com: myDropWizard is providing Drupal 6 Long-Term Support for 424 sites!

Planet Drupal - Fri, 06/05/2016 - 21:16

We've been pretty busy in the 11 weeks since Drupal 6's End-of-Life on February 24th.

Really, CRAZY busy, in fact!

We're currently responsible for providing Drupal 6 Long-Term Support for 424 sites in total!

For some of our bigger clients with large numbers of sites on a single code-base or those subject to regulation (for example, governments and universities) we had to compromise on not providing "security updates only" service - but some protection is certainly better than no protection.

Going through the sales process (which includes performing an in-depth site audit), on-boarding process and subsequently supporting and maintaining 424 sites in only 11 weeks has been enormously challenging for a small company like ours - but also an amazing learning experience.

Things are finally slowing a bit with regard to Drupal 6 LTS, we're heading out to DrupalCon New Orleans next week, and starting to look at the next phase for our business.

This feels like a good time to stop and reflect on the things we've learned from our experience with providing Drupal 6 LTS: what worked, what didn't and what we can improve for the future!

This isn't a marketing post (unlike most of our posts recently - sorry!) but a look Behind the Veil at our growing startup, what we do and why we do it. And it's about time! The last one I did was back in June, explaining why we we're launching myDropWizard.

So, if you're still interested in my meandering reflections, please read on!

Categories: Elsewhere

Scarlett Clark: Kubuntu: Debian: KDE: Outreachy! Yay! Upcoming changes

Planet Debian - Fri, 06/05/2016 - 20:30

I was approved to participate in Outreachy!

I will be working on the Debian reproducible builds.

Some of you in the Debian community might know me from working with the debian-qt-kde team
as we (Kubuntu) collaborated in packaging for some time.

Will this affect my current volunteer work for my current projects? Absolutely.
I am currently putting in 10-18 hours a day in volunteer work. Obviously, I cannot give up sleep.
I love all of my projects dearly, but after some recent events, I have found that I absolutely must
resurrect my career. AKA I need to make money to be able to stand on my own two feet without relying on
someone else. I do appreciate the donations, but they do not even dent my student loans :-).
So with all of that said, this will be a positive move in my career path.

I have not sorted out how my current projects contributions will change, but I can tell you
Debian reproducible builds will be number one priority come May 20th. This will last for 3 months.
Then my focus will be on getting a paying job.

Please understand, I need this. One needs money to survive, and working for donations is not working.
I feel the Outreachy work will improve my chances at obtaining a paid job in the open source field.
I have been chasing my “dream job” for some time now, and it is time to go get it.

I will post again, when I have sorted out how I will split up my time.
Thank you my friends.

Categories: Elsewhere

Aten Design Group: Drush Tools for Inspecting Configuration

Planet Drupal - Fri, 06/05/2016 - 19:50

I have a confession to make: I don't like clicking through the Drupal admin. Over the course of a project, beit one with content migrations, configuration in code, or just general site building, the information I need the most is field and taxonomy configuration. Typically, this means bouncing betweens tabs for content types and taxonomies which consumes time and precious clicks. Add in custom entities in our new Drupal 8 projects and there's even more time spent in the admin.

After a few dozen repetitions of navigating between field and taxonomy screens, I was ready to build tools to make the pain points of this process go away. I’d like to introduce you to Drush TypeInfo, Drush TaxonomyInfo, and Migrate Inspect. Hopefully, you find these tools helpful in working on your projects. Besides helping with the initial setup of a project, I feel like these tools are excellent when you're dropped into a project later in the process. Even for project with a detailed architectural plan, things change, documentation goes stale, and the only real source of truth is the actual site being built.

Content Types and Entities

Born from the fire of massive migrations, Drush TypeInfo is a Drush command that can provide you with all the information you could want about your content types and entities. The examples below show the full command names, but everything also has short aliases which you can find by running drush --help.

First up, if you need to figure out the machine name of a content type or see if a content type exists, try:

drush typeinfo-list

This will list all the content types and entities on your site:

item_instruction item_instruction item_instruction_type - language_content_settings - menu - menu_link_content - node article node page node testlet node testlet_item taxonomy_term tags taxonomy_term trajectories taxonomy_vocabulary - user - user_role - view -

Pro tip for the list: if you only want a specific entity type, you can specify that as well: drush typeinfo-list node. Next, maybe you need to check out the fields on an article content type:

drush typeinfo article

If you're looking for information about the fields on an entity besides nodes, you can look that up too. For fields on a taxonomy term the command would be:

drush typeinfo tags taxonomy_term

Now we're in business, but what about even more information? Well, field_tags probably relates to a taxonomy, but let's make sure we know exactly which one:

drush typeinfo-field field_tags article

This will show us:

Field info for: field_tags Type: entity_reference Form displays: - node.article.default Widgets (node.article): default: entity_reference_autocomplete_tags Target type: taxonomy_term Target bundles: tags Cardinality: unlimited

We can see that the field is targeting the topic taxonomy and that it accepts unlimited values. If you want to see field instance info (like field widget settings), you can also pass the bundle/entity type:

drush typeinfo-field field_shared_topic event node

This example will show the field_shared_topic information as it relates to the event content type (I'm specifying the node entity type here, but Drush TypeInfo will also make this assumption for you by default if you want to be lazy).

If you want to see raw internal arrays that Drupal uses for a field, you can get extra in-depth details with the --field-info, --display-info, and --widget-info flags.

Drupal 8 note: this is mostly up-to-date with Drupal 8 functionality, but there are likely more things to load (including some of the display and form display information).


Next up: taxonomies. It's common to have several vocabularies complete with their own terms. Accessing a list of vocabularies and their terms used to mean plenty of clicking and tabbing through the UI. Not anymore -- I created Drush TaxonomyInfo to display site-wide taxonomy information with a single command.

To list out the vocabularies on a site:

drush taxonomyinfo-vocab-list

To list terms within the topic taxonomy:

drush taxonomyinfo-term-list topic

Drupal 8 note: this should be updated and ready to go for Drupal 8 with the exception of nested terms, these will not show up as nested (yet).


Several Drupal 7 projects I worked on last year included very large content migrations. The Migrate module has command line tools for core functionality (importing, rolling back, etc.) but what happens with the data once it is imported? Let's check it out with the help of a tool called Migrate Inspect.

If we've imported some legacy events with an Event migration, we may want to open the last node we imported in a browser:

drush migrate-inspect-last Event

Or even a random event we imported (useful when you want to spot check 30,000 nodes you imported!):

drush migrate-inspect-random Event

When you're reviewing your migration, you may notice a source node that didn't get pulled into the destination correctly. In a case where you know the source ID, but you don't know where that content ended up on the new site, you can find that with the command:

drush migrate-inspect-destination Event 100

Or if you know the destination ID on the new site, but want to know the legacy ID from the old site:

drush migrate-inspect-source Event 200

Sometimes you might know a source or destination ID but unsure which migration it came from. This usually happens for me in cases where there are multiple migrations that can put content into a destination node (for example, when the old site has blog posts and news, but they're being combined on the new site). Migrate Inspect comes with two commands to make this easier by searching for you. Again the commands are broken up into source or destination versions, depending on the ID you have at hand:

drush migrate-inspect-find-source 200 drush migrate-inspect-find-destination 100

Drupal 8 note: this has not been updated for Drupal 8 yet.

Categories: Elsewhere

Acquia Developer Center Blog: Faceted Search in Drupal 8: Using Search API Solr and Facets

Planet Drupal - Fri, 06/05/2016 - 15:20

When module authors decide to port their modules to a new major version of Drupal (e.g. 6 to 7, or 7 to 8), they often take the time to rearchitect the module (and sometimes an entire related ecosystem of modules) to make development more efficient, clean up cruft, and improve current features.

Tags: acquia drupal planetsolracquia searchSearch API
Categories: Elsewhere

Tim Millwood: Drupal Deploy demos

Planet Drupal - Fri, 06/05/2016 - 09:32
Single site content staging with Deploy This demo shows creating content on a stage workspace then...
Categories: Elsewhere

Jay L.ee: Drupal Background Images Module Configuration Manual

Planet Drupal - Fri, 06/05/2016 - 08:06

During my San Diego Drupal Users Group lightning talk on March 8, I showed a brief demo of how background images can be made to be clickable via CSS, something that many people consider to be impossible. But as I'll show you over the next few days, it actually is 100% possible, and I had a LOT of fun getting it to finally work exactly the way I want it. Today's tutorial will be part 1 of 3. My next two blog posts will cover the rest of the steps for creating clickable background takeover ads.

Tags: Drupal 7Drupal Planet
Categories: Elsewhere

Russ Allbery: Review: The Language of Power

Planet Debian - Fri, 06/05/2016 - 05:15

Review: The Language of Power, by Rosemary Kirstein

Series: Steerswomen #4 Publisher: Rosemary Kirstein Copyright: 2004, 2014 Printing: April 2014 ISBN: 0-9913546-3-X Format: Kindle Pages: 400

This is the fourth book in the Steerswomen series and definitely not the place to start. It's also a difficult series to review without spoilers, so I won't be able to provide too many details about the plot.

I will say that this is a reunion and a return of sorts to themes from earlier in the series, rather than a direct follow-up to the revelations at the end of The Lost Steersman. Rowan is back in the Inner Lands, continuing to investigate the affairs of wizards. In particular, she's digging into the past of the town of Donner, following up on the report of an earlier steerswoman and investigating a now-dead wizard who seemed to act far different from a typical wizard. And Bel is back at her side again, watching her back.

The first half of The Language of Power goes over somewhat familiar ground. Similar to both The Steerswoman and The Lost Steersman, Rowan is poking around in a city, getting to know unfamiliar people, being a steerswoman, and winning people over with her unique charm. But that's a theme I don't mind seeing repeated, since Rowan is one of my favorite protagonists from any series I've read. She's both ethical and respectful in a way that doesn't feel artificial or constructed. She thinks oddly and dives into sudden fascinations, and she does rely on the conventions for interacting with steerswomen, but the more time one spends with her, the better one likes her. This is true of both the reader and the town inhabitants, and Kirstein is brilliant at writing the gradual getting-to-know and growing-respect process.

Events in The Language of Power slowly build up to another confrontation with wizards, and this one is full of major revelations about the world. Some of the ambiguity of earlier books is firmly resolved, we find out a lot more about how wizards view themselves and their abilities, and tons of new questions are raised. It's not a conclusion in any way, which is a bit unfortunate given that the next book is still being written (twelve years later, although thankfully it's being actively worked on as I write this). But we get the first clear look at the substratum of the world that Kirstein is building in this series.

This sounds satisfying, and to some extent it is, but any regular SFF reader will have guessed at many of the revelations here. I was pretty sure the world was following one of two possible patterns partway through the second book, certain which it was during the third book, and was nodding right along with the revelations in this book. I'm trying to avoid spoilers, but if you read a lot of SFF, chances are you've read about something akin to this background before. That takes a bit of the thrill out of the revelations, unfortunately.

What adds the excitement and thrill back in are Rowan's reactions. It's very difficult to write a character who comes from an entirely different perspective than either the author or the reader, and Kirstein does an amazing job. Not perfect, quite, at least for me: there were a few points where I thought Rowan was more baffled or more upset than it felt like she should have been. But they are few and far between, and it's quite possible my expectations are the ones that wouldn't ring true if written into the story. It's just such a delight to see Rowan analyzing the world, incorporating new revelations into her growing world model, and figuring out how to take the most moral action at any point. I would happily read another dozen books of this (but I wish they were all already written).

If you've read the previous three books, definitely pick up this one as well. For me, it narrowly misses being the best book of the series (I think that's still The Outskirter's Secret because of the difficulty of the perspective change Kirstein pulls off), but it's a close competition. And the final reveal at the very end of this book points to upcoming adventures that I can hardly wait to read.

Rating: 8 out of 10

Categories: Elsewhere


Subscribe to jfhovinne aggregator