Big Win For Fair Use: Jury Says Google’s Use Of Java API’s Was Fair Use… On To The Appeal

This is somewhat surprising, but good: after a few days of deliberation, the jury in the redo of the Oracle v. Google case concerning Google’s use of Java’s APIs in Android has resulted in a jury verdict finding that Google’s use was allowed as fair use. There’s not much to unpack here beyond what we’ve already written about the case. The jury form was a simple question of whether or not the use was covered by fair use, with a "Yes" check box meaning "finding for Google" and a "No" check box finding for Oracle The jury checked yes.

So, a few quick thoughts:

  1. All things considered this is a good ruling in that it doesn’t lead to a crazy situation that undermines the reimplementation of APIs and other structures in different software, so *phew*.
  2. This still sucks because fair use was the wrong vehicle. The APIs never should have been considered copyright-eligible in the first place, just as the judge in the original trial explained in his very detailed opinion. It’s only because an excessively confused federal circuit appeals court mucked things up, that the case had to go back down and be redone over fair use.
  3. The trial itself was a weird one, because they weren’t really allowed to talk about the first trial and how a very large number of people in the tech industry didn’t think that APIs were covered by copyright at all. So that resulted in some weird conversations to explain why no one really thought this was infringing. They couldn’t say no one thought APIs were covered by copyright, so they had to talk about "open" and "free" in ways that were slightly misleading.
  4. If anything, this may the most important fair use case to turn on factor 2, "the nature of the copyrighted work." That’s a factor that rarely is a very big deal, but without being able to (re)challenge the copyrightability, the focus was mostly on the nature of APIs and how the tech industry viewed them as free to be reused.
  5. Of course, no matter what the verdict was there would be an appeal, and that’s absolutely true. Oracle will appeal. But it does make it more difficult to appeal. Oracle will have to challenge specific aspects of things, and will likely focus on the jury instructions, which it will argue unfairly biased the jury or something along those lines.
  6. The Court of Appeals of the Federal Circuit (CAFC) is still a disaster, and while I hope they don’t, there’s still a decent chance they’ll end up siding with Oracle on appeal. Remember, CAFC is a court that normally focuses on patent laws and has a long and disgraceful history of loving to expand intellectual property and believing, incorrectly, that any kind of use is "theft."
  7. But, in the meantime, this at least lifts something of a cloud over the industry, and we can hope that (1) CAFC will get it right and if they don’t (2) that the Supreme Court will fix it, rather than ignore it, next time around.

Overall, a good result of a bad process and a confused judicial system. For now.

Permalink | Comments | Email This Story


via Techdirt.
Big Win For Fair Use: Jury Says Google’s Use Of Java API’s Was Fair Use… On To The Appeal

The Importance of Leadership in Fostering Organizational Innovation

Any expert on the driving forces behind organizational innovation will tell you that leadership is one of the most important. In fact, I’ve discovered it to be one of the 7 Immutable Laws of Innovation, and a necessity for any institution looking to prioritize leadership.
Over the next few weeks, I will dive into leadership’s effect on innovation, using examples in which management either helped or hurt innovation. I’ll also look at the steps leaders can take to make their organizations more forward-thinking.…
via Phil McKinney
The Importance of Leadership in Fostering Organizational Innovation

Watch: City “Lumberjacks” Try to Use Chainsaw and Bucksaw

Any true outdoorsman knows what it means to grab a saw and go to work cutting trees… and then there are the skinny-jeans-wearing hipsters who sprout some whiskers, don a pair of flaccid leather boots and a too-tight plaid shirt, and wander around looking like lumberjacks.

In these videos, which are actually commercials for Dinty Moore, these pseudo-lumberjacks are called out and asked to use saws, as would a real lumberjack.

The first one features chainsaws. The last guy was the funniest, to me.

While it’s pretty funny — and this next video cracks me up — it’s clear that these are actors pretending to be “lumbersexuals.” But not all of their ineptitude can be faked… and as I said, it’s certainly amusing.

Enjoy.

The post Watch: City “Lumberjacks” Try to Use Chainsaw and Bucksaw appeared first on AllOutdoor.com.

via AllOutdoor.com
Watch: City “Lumberjacks” Try to Use Chainsaw and Bucksaw

Those Lame Fire Snakes Get Way More Impressive When You Super-Size Them

Aside from sparklers, the most least piece of fireworks kids have access to are black snakes, those tiny pucks that grow into long ashen serpents as they burn. As far as pyrotechnics go, black snakes incredibly lame, except when YouTube’s NightHawkInLight super-sizes them. Once the mix powdered sugar and baking soda ignites, it becomes a miniature active volcano that appears out of nowhere.


via Gizmodo
Those Lame Fire Snakes Get Way More Impressive When You Super-Size Them

The NEW UPDATED Army Rifle & Carbine Training Circular, FREE for Download

7The Department of the Army has recently released a gold mine including the updated Rifle & Carbine Training Circular Training Circular. This manual was last updated was 8 years ago in 2008.   I’m sure that you – just like me – have spent a small fortune on firearms, optics, accessories and so much ammunition.  How often do we train “right” […]

Read More …

The post The NEW UPDATED Army Rifle & Carbine Training Circular, FREE for Download appeared first on The Firearm Blog.


via The Firearm Blog
The NEW UPDATED Army Rifle & Carbine Training Circular, FREE for Download

Ruger 10/22 Takedown Lite

Ruger Takedown LiteSturm, Ruger & Co. announced a new line of rimfire rifles called the 10/22 Takedown Lite. The new rimfire long guns are designed with a lighter weight barrel assembly, a modular stock and take down easily for compact storage and transportation. The new Takedown Lite rifles use a tensioned target barrel assembly that place a […]

Read More …

The post Ruger 10/22 Takedown Lite appeared first on The Firearm Blog.


via The Firearm Blog
Ruger 10/22 Takedown Lite

Two DIY Air Conditioners Put to the Test

DIY air conditioners may seem like a cheap way to beat the heat, but they aren’t perfect. This video puts two homemade versions to the test and compares them to real AC units.

In this video from the Consumer Reports YouTube channel, air conditioning specialist Chris Regan built two homemade AC units that cost around $30 to see how they actually perform. Over the span of an hour, both DIY units were only able to bring the testing room’s temperature down about three degrees. And half an hour of running, the temp began to rise back up. When they tested spot cooling with the DIY units, however, they found the air to be about 15 degrees cooler. So, best case scenario, you have to sit right next to your DIY AC to get any sort of benefit from it. A homemade unit is better than nothing, but you’ll be much better off with a real AC unit that can cool entire rooms and maintain the temperature.

Putting a Homemade Air Conditioner to the Test | YouTube

via Lifehacker
Two DIY Air Conditioners Put to the Test

The Only Three Types of Sandpaper You Really Need

When you’re laboring away on a woodworking project you’ll likely need multiple types of sandpaper, from a course grit for rough surfaces to a finer grit as you finish. But sandpaper is available in a wide spectrum of grit, so how do you know which to buy? Here are the only three types you’ll really need.

Steve Ramsey of Woodworking for Mere Mortals simplifies it down into the three basic grades of grit that you’ll need for the vast majority of your projects: 120, 80, and 220.

120 grit is his primary workhorse for the majority of work. The lower the grit the rougher the paper, so Steve recommends you have 80 grit paper on hand for more aggressive shaping. And as you’d expect, the finer 220 grit is for finishing and surfacing a project. Watch his video for more sandpaper fundamentals and tips.

The Only 3 Sandpapers You Really Need via Popular Mechanics

via Lifehacker
The Only Three Types of Sandpaper You Really Need

Looking inside the MySQL 5.7 document store

MySQL 5.7 Document Store

MySQL 5.7 Document StoreIn this blog, we’ll look at the MySQL 5.7 document store feature, and how it is implemented.

Document Store

MySQL 5.7.12 is a major new release, as it contains quite a number of new features:

  1. Document store and “MongoDB” like NoSQL interface to JSON storage
  2. Protocol X / X Plugin, which can be used for asynchronous queries (I will write about it as well)
  3. New MySQL shell

Peter already wrote the document store overview; in this post, I will look deeper into the document store implementation. In my next post, I will demonstrate how to use document store for Internet of Things (IoT) and event logging.

Older MySQL 5.7 versions already have a JSON data type, and an ability to create virtual columns that can be indexed. The new document store feature is based on the JSON datatype.

So what is the document store anyway? It is an add-on to a normal MySQL table with a JSON field. Let’s take a deep dive into it and see how it works.

First of all: one can interface with the document store’s collections using the X Plugin (default port: 33060). To do that:

  1. Enable X Plugin and install MySQL shell.
  2. Login to a shell:
    mysqlsh --uri root@localhost
  3. Run commands (JavaScript mode, can be switched to SQL or Python):
    mysqlsh --uri root@localhost
    Creating an X Session to root@localhost:33060
    Enter password:
    No default schema selected.
    Welcome to MySQL Shell 1.0.3 Development Preview
    Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    Type 'help', 'h' or '?' for help.
    Currently in JavaScript mode. Use sql to switch to SQL mode and execute queries.
    mysql-js> db = session.getSchema('world_x')                                                                                                                                                                 <Schema:world_x>
    mysql-js> db.getCollections()
    {
        "CountryInfo": <Collection:CountryInfo>
    }

Now, how is the document store’s collection different from a normal table? To find out, I’ve connected to a normal MySQL shell:

mysql world_x
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Welcome to the MySQL monitor.  Commands end with ; or g.
Your MySQL connection id is 2396
Server version: 5.7.12 MySQL Community Server (GPL)
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
mysql> show create table CountryInfo
*************************** 1. row ***************************
       Table: CountryInfo
Create Table: CREATE TABLE `CountryInfo` (
  `doc` json DEFAULT NULL,
  `_id` varchar(32) GENERATED ALWAYS AS (json_unquote(json_extract(`doc`,'$._id'))) STORED NOT NULL,
  PRIMARY KEY (`_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
mysql> show tables;
+-------------------+
| Tables_in_world_x |
+-------------------+
| City              |
| Country           |
| CountryInfo       |
| CountryLanguage   |
+-------------------+
4 rows in set (0.00 sec)

So the document store is actually an InnoDB table with one field: doc json + Primary key, which is a generated column.

As we can also see, there are four tables in the world_x database, but db.getCollections() only shows one. So how does MySQL distinguish between a “normal” table and a “document store” table? To find out, we can enable the general query log and see which query is being executed:

$ mysql -e 'set global general_log=1'
$ tail /var/log/general.log
2016-05-17T20:53:12.772114Z  186 Query  SELECT table_name, COUNT(table_name) c FROM information_schema.columns WHERE ((column_name = 'doc' and data_type = 'json') OR (column_name = '_id' and generation_expression = 'json_unquote(json_extract(`doc`,''$._id''))')) AND table_schema = 'world_x' GROUP BY table_name HAVING c = 2
2016-05-17T20:53:12.773834Z  186 Query  SHOW FULL TABLES FROM `world_x`

As you can see, every table that has a specific structure (doc JSON or specific generation_expression) is considered to be a JSON store. Now, how does MySQL translate the .find or .add constructs to actual MySQL queries? Let’s run a sample query:

mysql-js> db.getCollection("CountryInfo").find('Name= "United States"').limit(1)
[
    {
        "GNP": 8510700,
        "IndepYear": 1776,
        "Name": "United States",
        "_id": "USA",
        "demographics": {
            "LifeExpectancy": 77.0999984741211,
            "Population": 278357000
        },
        "geography": {
            "Continent": "North America",
            "Region": "North America",
            "SurfaceArea": 9363520
        },
        "government": {
            "GovernmentForm": "Federal Republic",
            "HeadOfState": "George W. Bush",
            "HeadOfState_title": "President"
        }
    }
]
1 document in set (0.02 sec)

and now look at the slow query log again:

2016-05-17T21:02:21.213899Z  186 Query  SELECT doc FROM `world_x`.`CountryInfo` WHERE (JSON_EXTRACT(doc,'$.Name') = 'United States') LIMIT 1

We can verify that MySQL translates all document store commands to SQL. That also means that it is 100% transparent to the existing MySQL storage level and will work with other storage engines. Let’s verify that, just for fun:

mysql> alter table CountryInfo engine=MyISAM;
Query OK, 239 rows affected (0.06 sec)
Records: 239  Duplicates: 0  Warnings: 0
mysql-js> db.getCollection("CountryInfo").find('Name= "United States"').limit(1)
[
    {
        "GNP": 8510700,
        "IndepYear": 1776,
        "Name": "United States",
        "_id": "USA",
        "demographics": {
            "LifeExpectancy": 77.0999984741211,
            "Population": 278357000
        },
        "geography": {
            "Continent": "North America",
            "Region": "North America",
            "SurfaceArea": 9363520
        },
        "government": {
            "GovernmentForm": "Federal Republic",
            "HeadOfState": "George W. Bush",
            "HeadOfState_title": "President"
        }
    }
]
1 document in set (0.00 sec)
2016-05-17T21:09:21.074726Z 2399 Query  alter table CountryInfo engine=MyISAM
2016-05-17T21:09:41.037575Z 2399 Quit
2016-05-17T21:09:43.014209Z  186 Query  SELECT doc FROM `world_x`.`CountryInfo` WHERE (JSON_EXTRACT(doc,'$.Name') = 'United States') LIMIT 1

Worked fine!

Now, how about the performance? We can simply take the SQL query and run

explain

:

mysql> explain SELECT doc FROM `world_x`.`CountryInfo` WHERE (JSON_EXTRACT(doc,'$.Name') = 'United States') LIMIT 1
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: CountryInfo
   partitions: NULL
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 239
     filtered: 100.00
        Extra: Using where
1 row in set, 1 warning (0.00 sec)

Hmm, it looks like it is not using an index. That’s because there is no index on Name. Can we add one? Sure, we can add a virtual column and then index it:

mysql> alter table CountryInfo add column Name varchar(255)
    -> GENERATED ALWAYS AS (json_unquote(json_extract(`doc`,'$.Name'))) VIRTUAL;
Query OK, 0 rows affected (0.12 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> alter table CountryInfo add key (Name);
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> explain SELECT doc FROM `world_x`.`CountryInfo` WHERE (JSON_EXTRACT(doc,'$.Name') = 'United States') LIMIT 1
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: CountryInfo
   partitions: NULL
         type: ref
possible_keys: name
          key: name
      key_len: 768
          ref: const
         rows: 1
     filtered: 100.00
        Extra: NULL
1 row in set, 1 warning (0.00 sec)

That is really cool! We have added an index, and now the original query starts using it. Note that we do not have to reference the new field, the MySQL optimizer is smart enough to translate the

(JSON_EXTRACT(doc,'$.Name') = 'United States'

 to an index scan on the virtual column.

But please note: JSON attributes are case-sensitive. If you will use

(doc,'$.name')

 instead of

(doc,'$.Name')

 it will not generate an error, but will simply break the search and all queries looking for “Name” will return 0 rows.

Finally, if you looked closely at the output of

db.getCollection("CountryInfo").find('Name= "United States"').limit(1)

 , you noticed that the database has outdated info:

"government": {
            "GovernmentForm": "Federal Republic",
            "HeadOfState": "George W. Bush",
            "HeadOfState_title": "President"
        }

Let’s change “George W. Bush” to “Barack Obama” using the .modify clause:

mysql-js> db.CountryInfo.modify("Name = 'United States'").set("government.HeadOfState", "Barack Obama" );
Query OK, 1 item affected (0.02 sec)
mysql-js> db.CountryInfo.find('Name= "United States"')
[
    {
        "GNP": 8510700,
        "IndepYear": 1776,
        "Name": "United States",
        "_id": "USA",
        "demographics": {
            "LifeExpectancy": 77.0999984741211,
            "Population": 278357000
        },
        "geography": {
            "Continent": "North America",
            "Region": "North America",
            "SurfaceArea": 9363520
        },
        "government": {
            "GovernmentForm": "Federal Republic",
            "HeadOfState": "Barack Obama",
            "HeadOfState_title": "President"
        }
    }
]
1 document in set (0.00 sec)

Conclusion

Document store is an interesting concept and a good add-on on top of the existing MySQL JSON feature. Using the new .find/.add/.modify methods instead of the original SQL statements can be convenient in some cases.

Some might ask, “why do you want to use document store and store information in JSON inside the database if it is relational anyway?” Storing data in JSON can be quite useful in some cases, for example:

  • You already have a JSON (i.e., from external feeds) and need to store it anyway. Using the JSON datatype will be more convenient and more efficient.
  • You have a flexible schema, typical for the Internet of Things for example, where some sensors might only send temperature data, some might send temperature/humidity/light (but light information is only recorded during the day), etc. Storing it in the JSON format can be more convenient so that you do not have to declare all possible fields in advance, and do not have to run “alter table” if a new sensor starts sending new types of data.

In the next two blog posts, I will show how to use document store for Internet of Things / event streaming, and how to use X Protocol for asynchronous queries in MySQL.

via Percona Database Performance Blog
Looking inside the MySQL 5.7 document store

Watch Star Wars: A New Hope by Simply Scrolling Through a Website

You probably can’t get away with watching movies at your desk all day at work. But since most websites are still totally acceptable, warm up your scrolling finger, and go to town on this incredible fan tribute that sees the entire original Star Wars: A New Hope turned into one long scrollable schematic.

The site’s making of is even more incredible. The artist, illustrator and graphic novelist Martin Panchaud, created 157 images in Adobe Illustrator that together measure over 400 feet in length.

Panchaud didn’t skimp on the detailing, either. Every last line in the movie is included, as is every last nook and cranny on ships like the Millennium Falcon. The site is as much a Star Wars reference tool as it is a way to while away the hours on a boring Tuesday afternoon.

[SWANH.net via Twitter – iA Inc.]


via Gizmodo
Watch Star Wars: A New Hope by Simply Scrolling Through a Website