text:
package nl.basjes.parse.useragent.beam;

import org.apache.beam.sdk.coders.ListCoder;
import org.apache.beam.sdk.coders.RowCoder;
import org.apache.beam.sdk.coders.StringUtf8Coder;
import org.apache.beam.sdk.extensions.sql.SqlTransform;
import org.apache.beam.sdk.schemas.Schema;
import org.apache.beam.sdk.testing.NeedsRunner;
import org.apache.beam.sdk.testing.PAssert;
import org.apache.beam.sdk.testing.TestPipeline;
import org.apache.beam.sdk.testing.ValidatesRunner;
import org.apache.beam.sdk.transforms.Create;
import org.apache.beam.sdk.transforms.DoFn;
import org.apache.beam.sdk.transforms.ParDo;
import org.apache.beam.sdk.values.PCollection;
import org.apache.beam.sdk.values.PCollectionTuple;
import org.apache.beam.sdk.values.Row;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.junit.Rule;
import org.junit.Test;
import org.junit.experimental.categories.Category;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Objects;

@Category(ValidatesRunner.class)
public class TestParseUserAgentSQL implements Serializable {

    private static final Logger LOG = LogManager.getLogger(TestParseUserAgentSQL.class);

    @Rule
    public final transient TestPipeline pipeline = TestPipeline.create();

    public static Row listToRow(List<String> strings, Schema schema) {
        Row.Builder appRowBuilder = Row.withSchema(schema);
        strings.forEach(appRowBuilder::addValues);
        return appRowBuilder.build();
    }

    @Test
    @Category(NeedsRunner.class)
    public void testUserAgentAnalysisSQL() { // NOSONAR java:S2699 Tests should include assertions: Uses PAssert
        // ============================================================

        String agent1 =
            "Mozilla/5.0 (X11; Linux x86_64) " +
            "AppleWebKit/537.36 (KHTML, like Gecko) " +
            "Chrome/48.0.2564.82 Safari/537.36";
        String agent2 =
            "Mozilla/5.0 (Linux; Android 7.0; Nexus 6 Build/NBD90Z) " +
            "AppleWebKit/537.36 (KHTML, like Gecko) " +
            "Chrome/53.0.2785.124 Mobile Safari/537.36";

        // The base test input
        List<List<String>> useragents = Arrays.asList(
            Collections.singletonList(agent1),
            Collections.singletonList(agent2));

        List<List<String>> expectedList = Arrays.asList(
            Arrays.asList(
                agent1,

                "Desktop",

                "Chrome 48.0.2564.82",

                "{\"Useragent\":\"Mozilla\\/5.0 (X11; Linux x86_64) AppleWebKit\\/537.36 (KHTML, like Gecko) Chrome\\/48.0.2564.82 Safari\\/537.36\"," +
                    "\"DeviceClass\":\"Desktop\"," +
                    "\"DeviceName\":\"Linux Desktop\"," +
                    "\"DeviceBrand\":\"Unknown\"," +
                    "\"DeviceCpu\":\"Intel x86_64\"," +
                    "\"DeviceCpuBits\":\"64\"," +
                    "\"DeviceFirmwareVersion\":\"??\"," +
                    "\"DeviceVersion\":\"??\"," +
                    "\"OperatingSystemClass\":\"Desktop\"," +
                    "\"OperatingSystemName\":\"Linux\"," +
                    "\"OperatingSystemVersion\":\"??\"," +
                    "\"OperatingSystemVersionMajor\":\"??\"," +
                    "\"OperatingSystemNameVersion\":\"Linux ??\"," +
                    "\"OperatingSystemNameVersionMajor\":\"Linux ??\"," +
                    "\"OperatingSystemVersionBuild\":\"??\"," +
                    "\"LayoutEngineClass\":\"Browser\"," +
                    "\"LayoutEngineName\":\"Blink\"," +
                    "\"LayoutEngineVersion\":\"48.0\"," +
                    "\"LayoutEngineVersionMajor\":\"48\"," +
                    "\"LayoutEngineNameVersion\":\"Blink 48.0\"," +
                    "\"LayoutEngineNameVersionMajor\":\"Blink 48\"," +
                    "\"LayoutEngineBuild\":\"Unknown\"," +
                    "\"AgentClass\":\"Browser\"," +
                    "\"AgentName\":\"Chrome\"," +
                    "\"AgentVersion\":\"48.0.2564.82\"," +
                    "\"AgentVersionMajor\":\"48\"," +
                    "\"AgentNameVersion\":\"Chrome 48.0.2564.82\"," +
                    "\"AgentNameVersionMajor\":\"Chrome 48\"," +

                    "\"AgentBuild\":\"Unknown\"," +
                    "\"AgentLanguage\":\"Unknown\"," +
                    "\"AgentLanguageCode\":\"Unknown\"," +
                    "\"AgentInformationEmail\":\"Unknown\"," +
                    "\"AgentInformationUrl\":\"Unknown\"," +
                    "\"AgentSecurity\":\"Unknown\"," +
                    "\"AgentUuid\":\"Unknown\"," +
                    "\"WebviewAppName\":\"Unknown\"," +
                    "\"WebviewAppVersion\":\"??\"," +
                    "\"WebviewAppVersionMajor\":\"??\"," +
                    "\"WebviewAppNameVersion\":\"Unknown ??\"," +
                    "\"WebviewAppNameVersionMajor\":\"Unknown ??\"," +
                    "\"FacebookCarrier\":\"Unknown\"," +
                    "\"FacebookDeviceClass\":\"Unknown\"," +
                    "\"FacebookDeviceName\":\"Unknown\"," +
                    "\"FacebookDeviceVersion\":\"??\"," +
                    "\"FacebookFBOP\":\"Unknown\"," +
                    "\"FacebookFBSS\":\"Unknown\"," +
                    "\"FacebookOperatingSystemName\":\"Unknown\"," +
                    "\"FacebookOperatingSystemVersion\":\"??\"," +
                    "\"RemarkablePattern\":\"Nothing remarkable found\"," +
                    "\"HackerAttackVector\":\"Unknown\"," +
                    "\"HackerToolkit\":\"Unknown\"," +
                    "\"KoboAffiliate\":\"Unknown\"," +
                    "\"KoboPlatformId\":\"Unknown\"," +
                    "\"IECompatibilityVersion\":\"??\"," +
                    "\"IECompatibilityVersionMajor\":\"??\"," +
                    "\"IECompatibilityNameVersion\":\"Unknown ??\"," +
                    "\"IECompatibilityNameVersionMajor\":\"Unknown ??\"," +
                    "\"Carrier\":\"Unknown\"," +
                    "\"FederatedSocialNetwork\":\"Unknown\"," +
                    "\"GSAInstallationID\":\"Unknown\"," +
                    "\"NetworkType\":\"Unknown\","+
                    "\"__SyntaxError__\":\"false\"}",

                "{\"OperatingSystemClass\":\"Desktop\"}",

                "{\"OperatingSystemClass\":\"Desktop\"," +
                    "\"OperatingSystemName\":\"Linux\"}",

                "{\"OperatingSystemClass\":\"Desktop\"," +
                    "\"OperatingSystemName\":\"Linux\"," +
                    "\"OperatingSystemVersion\":\"??\"}",

                "{\"OperatingSystemClass\":\"Desktop\"," +
                    "\"OperatingSystemName\":\"Linux\"," +
                    "\"OperatingSystemVersion\":\"??\"," +
                    "\"OperatingSystemVersionMajor\":\"??\"}",

                "{\"OperatingSystemClass\":\"Desktop\"," +
                    "\"OperatingSystemName\":\"Linux\"," +
                    "\"OperatingSystemVersion\":\"??\"," +
                    "\"OperatingSystemVersionMajor\":\"??\"," +
                    "\"OperatingSystemNameVersion\":\"Linux ??\"}",

                "{\"OperatingSystemClass\":\"Desktop\"," +
                    "\"OperatingSystemName\":\"Linux\"," +
                    "\"OperatingSystemVersion\":\"??\"," +
                    "\"OperatingSystemVersionMajor\":\"??\"," +
                    "\"OperatingSystemNameVersion\":\"Linux ??\"," +
                    "\"OperatingSystemNameVersionMajor\":\"Linux ??\"}",

                "{\"OperatingSystemClass\":\"Desktop\"," +
                    "\"OperatingSystemName\":\"Linux\"," +
                    "\"OperatingSystemVersion\":\"??\"," +
                    "\"OperatingSystemVersionMajor\":\"??\"," +
                    "\"OperatingSystemNameVersion\":\"Linux ??\"," +
                    "\"OperatingSystemNameVersionMajor\":\"Linux ??\"," +
                    "\"AgentClass\":\"Browser\"}",

                "{\"OperatingSystemClass\":\"Desktop\"," +
                    "\"OperatingSystemName\":\"Linux\"," +
                    "\"OperatingSystemVersion\":\"??\"," +
                    "\"OperatingSystemVersionMajor\":\"??\"," +
                    "\"OperatingSystemNameVersion\":\"Linux ??\"," +
                    "\"OperatingSystemNameVersionMajor\":\"Linux ??\"," +
                    "\"AgentClass\":\"Browser\"," +
                    "\"AgentName\":\"Chrome\"}",

                "{\"OperatingSystemClass\":\"Desktop\"," +
                    "\"OperatingSystemName\":\"Linux\"," +
                    "\"OperatingSystemVersion\":\"??\"," +
                    "\"OperatingSystemVersionMajor\":\"??\"," +
                    "\"OperatingSystemNameVersion\":\"Linux ??\"," +
                    "\"OperatingSystemNameVersionMajor\":\"Linux ??\"," +
                    "\"AgentClass\":\"Browser\"," +
                    "\"AgentName\":\"Chrome\"," +
                    "\"AgentVersion\":\"48.0.2564.82\"}",

                "{\"OperatingSystemClass\":\"Desktop\"," +
                    "\"OperatingSystemName\":\"Linux\"," +
                    "\"OperatingSystemVersion\":\"??\"," +
                    "\"OperatingSystemVersionMajor\":\"??\"," +
                    "\"OperatingSystemNameVersion\":\"Linux ??\"," +
                    "\"OperatingSystemNameVersionMajor\":\"Linux ??\"," +
                    "\"AgentClass\":\"Browser\"," +
                    "\"AgentName\":\"Chrome\"," +
                    "\"AgentVersion\":\"48.0.2564.82\"," +
                    "\"AgentVersionMajor\":\"48\"}"
                ),

            Arrays.asList(
                agent2,

               "Phone",

               "Chrome 53.0.2785.124",

               "{\"Useragent\":\"Mozilla\\/5.0 (Linux; Android 7.0; Nexus 6 Build\\/NBD90Z) AppleWebKit\\/537.36 (KHTML, like Gecko) Chrome\\/53.0.2785.124 Mobile Safari\\/537.36\"," +
                   "\"DeviceClass\":\"Phone\"," +
                   "\"DeviceName\":\"Google Nexus 6\"," +
                   "\"DeviceBrand\":\"Google\"," +
                   "\"DeviceCpu\":\"Unknown\"," +
                   "\"DeviceCpuBits\":\"Unknown\"," +
                   "\"DeviceFirmwareVersion\":\"??\"," +
                   "\"DeviceVersion\":\"??\"," +
                   "\"OperatingSystemClass\":\"Mobile\"," +
                   "\"OperatingSystemName\":\"Android\"," +
                   "\"OperatingSystemVersion\":\"7.0\"," +
                   "\"OperatingSystemVersionMajor\":\"7\"," +
                   "\"OperatingSystemNameVersion\":\"Android 7.0\"," +
                   "\"OperatingSystemNameVersionMajor\":\"Android 7\"," +
                   "\"OperatingSystemVersionBuild\":\"NBD90Z\"," +
                   "\"LayoutEngineClass\":\"Browser\"," +
                   "\"LayoutEngineName\":\"Blink\"," +
                   "\"LayoutEngineVersion\":\"53.0\"," +
                   "\"LayoutEngineVersionMajor\":\"53\"," +
                   "\"LayoutEngineNameVersion\":\"Blink 53.0\"," +
                   "\"LayoutEngineNameVersionMajor\":\"Blink 53\"," +
                   "\"LayoutEngineBuild\":\"Unknown\"," +
                   "\"AgentClass\":\"Browser\"," +
                   "\"AgentName\":\"Chrome\"," +
                   "\"AgentVersion\":\"53.0.2785.124\"," +
                   "\"AgentVersionMajor\":\"53\"," +
                   "\"AgentNameVersion\":\"Chrome 53.0.2785.124\"," +
                   "\"AgentNameVersionMajor\":\"Chrome 53\"," +
                   "\"AgentBuild\":\"Unknown\"," +
                   "\"AgentLanguage\":\"Unknown\"," +
                   "\"AgentLanguageCode\":\"Unknown\"," +
                   "\"AgentInformationEmail\":\"Unknown\"," +
                   "\"AgentInformationUrl\":\"Unknown\"," +
                   "\"AgentSecurity\":\"Unknown\"," +
                   "\"AgentUuid\":\"Unknown\"," +
                   "\"WebviewAppName\":\"Unknown\"," +
                   "\"WebviewAppVersion\":\"??\"," +
                   "\"WebviewAppVersionMajor\":\"??\"," +
                   "\"WebviewAppNameVersion\":\"Unknown ??\"," +
                   "\"WebviewAppNameVersionMajor\":\"Unknown ??\"," +
                   "\"FacebookCarrier\":\"Unknown\"," +
                   "\"FacebookDeviceClass\":\"Unknown\"," +
                   "\"FacebookDeviceName\":\"Unknown\"," +
                   "\"FacebookDeviceVersion\":\"??\"," +
                   "\"FacebookFBOP\":\"Unknown\"," +
                   "\"FacebookFBSS\":\"Unknown\"," +
                   "\"FacebookOperatingSystemName\":\"Unknown\"," +
                   "\"FacebookOperatingSystemVersion\":\"??\"," +
                   "\"RemarkablePattern\":\"Nothing remarkable found\"," +
                   "\"HackerAttackVector\":\"Unknown\"," +
                   "\"HackerToolkit\":\"Unknown\"," +
                   "\"KoboAffiliate\":\"Unknown\"," +
                   "\"KoboPlatformId\":\"Unknown\"," +
                   "\"IECompatibilityVersion\":\"??\"," +
                   "\"IECompatibilityVersionMajor\":\"??\"," +
                   "\"IECompatibilityNameVersion\":\"Unknown ??\"," +
                   "\"IECompatibilityNameVersionMajor\":\"Unknown ??\"," +
                   "\"Carrier\":\"Unknown\"," +
                   "\"FederatedSocialNetwork\":\"Unknown\"," +
                   "\"GSAInstallationID\":\"Unknown\"," +
                   "\"NetworkType\":\"Unknown\"," +
                   "\"__SyntaxError__\":\"false\"}",

               "{\"OperatingSystemClass\":\"Mobile\"}",

               "{\"OperatingSystemClass\":\"Mobile\"," +
                   "\"OperatingSystemName\":\"Android\"}",

               "{\"OperatingSystemClass\":\"Mobile\"," +
                   "\"OperatingSystemName\":\"Android\"," +
                   "\"OperatingSystemVersion\":\"7.0\"}",

               "{\"OperatingSystemClass\":\"Mobile\"," +
                   "\"OperatingSystemName\":\"Android\"," +
                   "\"OperatingSystemVersion\":\"7.0\"," +
                   "\"OperatingSystemVersionMajor\":\"7\"}",

               "{\"OperatingSystemClass\":\"Mobile\"," +
                   "\"OperatingSystemName\":\"Android\"," +
                   "\"OperatingSystemVersion\":\"7.0\"," +
                   "\"OperatingSystemVersionMajor\":\"7\"," +
                   "\"OperatingSystemNameVersion\":\"Android 7.0\"}",

               "{\"OperatingSystemClass\":\"Mobile\"," +
                   "\"OperatingSystemName\":\"Android\"," +
                   "\"OperatingSystemVersion\":\"7.0\"," +
                   "\"OperatingSystemVersionMajor\":\"7\"," +
                   "\"OperatingSystemNameVersion\":\"Android 7.0\"," +
                   "\"OperatingSystemNameVersionMajor\":\"Android 7\"}",

               "{\"OperatingSystemClass\":\"Mobile\"," +
                   "\"OperatingSystemName\":\"Android\"," +
                   "\"OperatingSystemVersion\":\"7.0\"," +
                   "\"OperatingSystemVersionMajor\":\"7\"," +
                   "\"OperatingSystemNameVersion\":\"Android 7.0\"," +
                   "\"OperatingSystemNameVersionMajor\":\"Android 7\"," +
                   "\"AgentClass\":\"Browser\"}",

               "{\"OperatingSystemClass\":\"Mobile\"," +
                   "\"OperatingSystemName\":\"Android\"," +
                   "\"OperatingSystemVersion\":\"7.0\"," +
                   "\"OperatingSystemVersionMajor\":\"7\"," +
                   "\"OperatingSystemNameVersion\":\"Android 7.0\"," +
                   "\"OperatingSystemNameVersionMajor\":\"Android 7\"," +
                   "\"AgentClass\":\"Browser\"," +
                   "\"AgentName\":\"Chrome\"}",

               "{\"OperatingSystemClass\":\"Mobile\"," +
                   "\"OperatingSystemName\":\"Android\"," +
                   "\"OperatingSystemVersion\":\"7.0\"," +
                   "\"OperatingSystemVersionMajor\":\"7\"," +
                   "\"OperatingSystemNameVersion\":\"Android 7.0\"," +
                   "\"OperatingSystemNameVersionMajor\":\"Android 7\"," +
                   "\"AgentClass\":\"Browser\"," +
                   "\"AgentName\":\"Chrome\"," +
                   "\"AgentVersion\":\"53.0.2785.124\"}",

               "{\"OperatingSystemClass\":\"Mobile\"," +
                   "\"OperatingSystemName\":\"Android\"," +
                   "\"OperatingSystemVersion\":\"7.0\"," +
                   "\"OperatingSystemVersionMajor\":\"7\"," +
                   "\"OperatingSystemNameVersion\":\"Android 7.0\"," +
                   "\"OperatingSystemNameVersionMajor\":\"Android 7\"," +
                   "\"AgentClass\":\"Browser\"," +
                   "\"AgentName\":\"Chrome\"," +
                   "\"AgentVersion\":\"53.0.2785.124\"," +
                   "\"AgentVersionMajor\":\"53\"}"
            )
        );

        List<Row> expectedRows = new ArrayList<>(expectedList.size());
        Schema expectedSchema = Schema
            .builder()
            .addStringField("userAgent")
            .addStringField("deviceClass")
            .addStringField("agentNameVersion")
            .addStringField("parsedUserAgentJson0")
            .addStringField("parsedUserAgentJson1")
            .addStringField("parsedUserAgentJson2")
            .addStringField("parsedUserAgentJson3")
            .addStringField("parsedUserAgentJson4")
            .addStringField("parsedUserAgentJson5")
            .addStringField("parsedUserAgentJson6")
            .addStringField("parsedUserAgentJson7")
            .addStringField("parsedUserAgentJson8")
            .addStringField("parsedUserAgentJson9")
            .addStringField("parsedUserAgentJson10")
            .build();

        for (List<String> expectedStrings: expectedList) {
            expectedRows.add(listToRow(expectedStrings, expectedSchema));
        }

        // ============================================================
        // Convert into a PCollection<Row>
        Schema inputSchema = Schema
            .builder()
            .addStringField("userAgent")
            .build();

        PCollection<Row> input = pipeline
            .apply(Create.of(useragents))
            .setCoder(ListCoder.of(StringUtf8Coder.of()))
            .apply(ParDo.of(new DoFn<List<String>, Row>() {
                @SuppressWarnings("unused") // Called via the annotation
                @ProcessElement
                public void processElement(ProcessContext c) {
                    c.output(listToRow(Objects.requireNonNull(c.element()), inputSchema));
                }
            }))
            .setCoder(RowCoder.of(inputSchema));

        // ============================================================

        // Create and apply the PTransform representing the query.
        // Register the UDFs used in the query by calling '.registerUdf()' with
        // either a class which implements BeamSqlUdf or with
        // an instance of the SerializableFunction;
        PCollection<Row> result =
            PCollectionTuple
                // This way we give a name to the input stream for use in the SQL
                .of("InputStream", input)
                // Apply the SQL with the UDFs we need.
                .apply("Execute SQL",
                    SqlTransform
                    // The SQL query that needs to be applied.
                    .query(
                        "SELECT" +
                        "    userAgent                                            AS userAgent, " +
                        "    ParseUserAgentField(userAgent, 'DeviceClass')        AS deviceClass, " +
                        "    ParseUserAgentField(userAgent, 'AgentNameVersion')   AS agentNameVersion, " +

                        "    ParseUserAgentJson(userAgent" +
                        "                      ) AS parsedUserAgentJson0, " +

                        "    ParseUserAgentJson(userAgent," +
                        "                       'OperatingSystemClass'" +
                        "                      ) AS parsedUserAgentJson1, " +

                        "    ParseUserAgentJson(userAgent," +
                        "                       'OperatingSystemClass'," +
                        "                       'OperatingSystemName'" +
                        "                      ) AS parsedUserAgentJson2, " +

                        "    ParseUserAgentJson(userAgent," +
                        "                       'OperatingSystemClass'," +
                        "                       'OperatingSystemName'," +
                        "                       'OperatingSystemVersion'" +
                        "                      ) AS parsedUserAgentJson3, " +

                        "    ParseUserAgentJson(userAgent," +
                        "                       'OperatingSystemClass'," +
                        "                       'OperatingSystemName'," +
                        "                       'OperatingSystemVersion'," +
                        "                       'OperatingSystemVersionMajor'" +
                        "                      ) AS parsedUserAgentJson4, " +

                        "    ParseUserAgentJson(userAgent," +
                        "                       'OperatingSystemClass'," +
                        "                       'OperatingSystemName'," +
                        "                       'OperatingSystemVersion'," +
                        "                       'OperatingSystemVersionMajor'," +
                        "                       'OperatingSystemNameVersion'" +
                        "                      ) AS parsedUserAgentJson5, " +

                        "    ParseUserAgentJson(userAgent," +
                        "                       'OperatingSystemClass'," +
                        "                       'OperatingSystemName'," +
                        "                       'OperatingSystemVersion'," +
                        "                       'OperatingSystemVersionMajor'," +
                        "                       'OperatingSystemNameVersion'," +
                        "                       'OperatingSystemNameVersionMajor'" +
                        "                      ) AS parsedUserAgentJson6, " +

                        "    ParseUserAgentJson(userAgent," +
                        "                       'OperatingSystemClass'," +
                        "                       'OperatingSystemName'," +
                        "                       'OperatingSystemVersion'," +
                        "                       'OperatingSystemVersionMajor'," +
                        "                       'OperatingSystemNameVersion'," +
                        "                       'OperatingSystemNameVersionMajor'," +
                        "                       'AgentClass'" +
                        "                      ) AS parsedUserAgentJson7, " +

                        "    ParseUserAgentJson(userAgent," +
                        "                       'OperatingSystemClass'," +
                        "                       'OperatingSystemName'," +
                        "                       'OperatingSystemVersion'," +
                        "                       'OperatingSystemVersionMajor'," +
                        "                       'OperatingSystemNameVersion'," +
                        "                       'OperatingSystemNameVersionMajor'," +
                        "                       'AgentClass'," +
                        "                       'AgentName'" +
                        "                      ) AS parsedUserAgentJson8, " +

                        "    ParseUserAgentJson(userAgent," +
                        "                       'OperatingSystemClass'," +
                        "                       'OperatingSystemName'," +
                        "                       'OperatingSystemVersion'," +
                        "                       'OperatingSystemVersionMajor'," +
                        "                       'OperatingSystemNameVersion'," +
                        "                       'OperatingSystemNameVersionMajor'," +
                        "                       'AgentClass'," +
                        "                       'AgentName'," +
                        "                       'AgentVersion'" +
                        "                      ) AS parsedUserAgentJson9, " +

                        "    ParseUserAgentJson(userAgent," +
                        "                       'OperatingSystemClass'," +
                        "                       'OperatingSystemName'," +
                        "                       'OperatingSystemVersion'," +
                        "                       'OperatingSystemVersionMajor'," +
                        "                       'OperatingSystemNameVersion'," +
                        "                       'OperatingSystemNameVersionMajor'," +
                        "                       'AgentClass'," +
                        "                       'AgentName'," +
                        "                       'AgentVersion'," +
                        "                       'AgentVersionMajor'" +
                        "                      ) AS parsedUserAgentJson10 " +

                        "FROM InputStream")
                    // Register each of the custom functions that must be available
                    .registerUdf("ParseUserAgentJson",  ParseUserAgentJson.class)
                    .registerUdf("ParseUserAgentField", ParseUserAgentField.class)
                );

        // Just to see the output of the query while debugging
        result.apply(ParDo.of(new RowPrinter()));

        // Assert on the results.
        PAssert.that(result)
            .containsInAnyOrder(expectedRows);

        pipeline.run().waitUntilFinish();
    }

    public static class RowPrinter extends DoFn<Row, Void> {
        @SuppressWarnings("unused") // Called via the annotation
        @ProcessElement
        public void processElement(ProcessContext c) {
            final Row row = c.element();
            LOG.info("ROW: {}", row);
        }
    }

}

redpajama_set_name: RedPajamaGithub


Great write up on sizing brass but I have a question.
What am I missing ? Am I doing something wrong ?
I used to neck size and now I partial neck size. The idea of bumping the shoulder seems like it would not give the greatest accuracy compared to a fire formed case.
You stated: "It has been my experience that when it comes to shooting a match with a match grade (read "tight tolerence") weapons and the match is hot and fast for generally 66++ rounds- you will start having issues with "fitted" cases."
You mentioned that you fired 66 plus round and started having issues. Are you saying that the reason you bump the shoulder is for competition reasons - when you fire 50 rounds or more and the gun is hot - the bumping helps the rounds chamber? If that is true, what are the other advantages of bumping the shoulder over a fire formed or fitted case?
I read through the remainder of your posts on reloading and you have some really good information. If I lived closer to you, I would video tape these lessons for you. There a few things that get a little complex and a video might be easier. Thanks for all the good stuff you are putting out. Is this part of a book or article you are writing?
My Sinclair flash hole deburring tool, bought in the 1980s and still going strong, has built-in depth control at the drill/countersink end.
The end at the case mouth is cone-shaped and serves only to keep that end of the tool centered.
It was brand new back then. I was expecting the other system you describe.
So, no such worries for me.
Wow, great info, worth 20 years of diy reloading, thank you kindly!
This is very good information. Thank You, but how can I load 500-700 rounds per hour taking all these steps? Is Knoxville in Knox county?
No you can't load 500-700 HIGHLY PRECISE rounds in an hour...period.
You can't even sort 700 projectiles in an hour for uniformity, and you still have'nt even touched a piece of brass..
In time you'll find your personal compromise of speed/precision that your okay with.
P Pepper: No no book, but nor am I looking for the articles to be bought/published.
While I was already a short and long range rifle competitor, this website is where I learned quite of bit of expedient field shooting math as well as technique for unimproved real world long range hunting in unimproved/crude at best shooting positions.
I have learned a lot from the generous people on this website. My reloading articles and what little I know being shared in general is my version of giving something back.
As I was deburring necks last night I was wondering how others keep that process as consistent and repeatable as possible. Good information here - going to try it on next batch and some of you other tricks as well.
AWESOME question C. Your thinking precision & consistency in every detail.
is it safe to resize with the tempilaq still inside the mouth of the case or should you clean it out before bumping the shoulder back?
It's certainly safe, but not a good idea if your looking for best consistency/accuracy.
ok. thanks for taking the time to put this together and answer questions.
Not only it speeds up my trimming, chamfering, and deburing process (all 3 actions at once), it also cuts very consistently and square.
Just thought I share it and hope others can be benefit from it too.
T.I.S., Thanks for putting the link up!
My question is about deburring the inside of the case mouth. I have always followed the typical reloading manual's advice of lightly chamferring the inside and outside, trying not to convert the case mouth into a cookie cutter. However, your technique cuts the bevel on the inside of the case until it goes almost to the to the outside edge of the case.
Why is this please ?
Because the standard reloading manual assumes the average reader/loader is going to shoot an average bullet- a flat base or a minor boat tail.
Excellent information here, read 5 of your posts here in one sitting, trying to fill in the gaps of what I thought I knew about load development.
Annealing is something I have just started doing, but am confused about throwing the hot brass in a pan or bucket of water as many people describe in their process. I remember a science experiment we did in school where we took hair pins and heated the tightly curved end in a Bunsen burner. One we heated for five seconds or so and then quickly dunked in water to cool it rapidly. The other, we heated for the same time, but then moved it up away from the flame to allow it to cool very slowly. We then pulled the ends to straighten the pins. The one cooled rapidly (tempered), snapped in two almost instantly. The one we cooled slowly (annealed), bent apart and had to be bent back and forth more times than a non-heated pin before it finally broke.
You have much more experience in this than I do, but wouldn't it be better to withdraw the brass from the flame slowly and allow it to cool in the ambient air?
Thanks again for posting these articles, I think the information here is going to help me a lot.
I appreciate you writing and your analagy.
But you must compare apples to apples. Brass is an apple and steel is a baboon.
Brass in several areas does the exact opposite of steel. Heat steel and it will get hard/brittle. Heat brass and it will get softer and softer and softer.
As far as I know the whole heat brass and throw it in water deal is to protect the body of the case as well as the head of the case form being softened. You only want the neck/shoulder to soften. For the head to soften is quite dangerous, not to mention it will burp out the primer upon firing.
I imagine the whole dump it in water is 1. a legal disclaimer & 2.- brass is a great conductor. it will draw(wick) the heat applied to the neck towards the head of the case- so I imagine if annealing the necks of tiny cases, say 22 hornet? sufficient heat could be drawn from the neck to soften the head as well. Dunking in water would prevent this.
However when I anneal my .223 cases and bigger, the heat dissipates to the air faster than it travels to the head- so I have never had a problem with air cooling for .223 cases and bigger. And I prefer to let them air cool so as to not shock the just softened neck of the case.
So, if you go through the process of sorting your brass by weight, you end up with many small piles. I sorted 500 rounds of Lapua 6.5x47 and was surprised at the variance in weights. I can get together a shootable number of cartridges of the most common weights, but what do you do with the rest? Do you just arrange in the cartridge box by weight and get ready to adjust your aim when you move to a new weight?
The other day I shot a group where the cases weighed 160.0 grains, followed by a group of 160.6 grain cases. The second group placed a good 6 inches over the first. I presume that the heavier cases (from the same lot) had less interior room and thus a higher pressure.
Yeah you can load all the brass, just keep the ammo in segregated lots according to brass weight.
I do it and just shoot 1 batch of ammo per string of the match.
The local 1000 yard matches typically have you shoot three strings or relays.
I shoot one weight sort of brass per string. You get sighter shots prior to shooting for score- so that compensates the zero shift.
Nice info that I will put to use. Thanks for the time/effort!
I am new to reloading but have never heard anyone say...to develop a load for your rifle can you use new brass or is it best to use once fired?
I have a question. Once I have my headspace measurement from my once fired brass, how do I set my neck sizing die to bump the shoulder back that .003"?
great write up sir. Appreciate the time taken to pass this on. Ill have to add this to my favorites for reference.

Originally Posted By: Rebel

I am new to reloading but have never heard anyone say...to develop a load for your rifle can you use new brass or is it best to use once fired?

 I have this same question. I've been using new Lapua brass in my bolt .308. I'm new to reloading but a friend told me not to size the new brass that its a waste of time. After reading this I gather I should full length new brass and then neck size thereafter. And I'm going to get more accurate loads after the new brass has been fired once? Is this right or am I off base? Thanks.
Yeah, work up a load with brass that is fire formed to the particular rifles chamber.
I noticed after firing cases that I did essentially what the original post said except I did not weight sort that when I was checking them on a redding gauge for neck wall thickness and runout that only half had the same neck tension. I had neck turned these cases after running them thru a mandrell but after firing cleaning and realizing the interior neck size was not the same so I turned the necks on half of them again.
Hopefully it will not be raining next time I shoot and I can see if the chronograph and my shooting confirm the importance of getting the necks uniform so the tension is the same on the bullet. I can tell that lapua new brass is easily the most consistent by my measurements and although my rifles all love federal rounds that brass is not as consistent as lapua. My measurements would indicate Winchester is next best to Lapua with Federal and Remington far behind.
I can also confirm that the shooter is critical as this new rifle gives great feedback and in retrospect I probably should have used the money to buy lots of bullets and shoot rather than the new rifle. Jason and the instructors on the teaching videos are great and I hope to get some non video based instruction someday.
I too had that question. I thought about buying the shims, but I didn't want to wait for them to get here. So, I grabbed my high tech machining tools and materials (scissors and tin foil) and made some. Tin foil is .001" thick. My fired cases measured 1.556" to datum and my resizing die was spitting them out at 1.547". So I needed to adjust my die out .006" so I used six pieces of tin foil as a spacer between the shell holder and the bottom of my die. I loosened the die and backed it out, raised the ram with my fancy shims, and then screwed the die down on the shims. After about 20 min of trial and error I've got my die set up to bump .003" on the dot. By the way it was Reynolds Wrap Heavy Duty Match VLD Foil. Thanks Tres for such an awesome set of articles. I've got everyone of them printed off and saved.
You adjust your dies as per normal to get the correct shoulder bump back. Loosen the lock screw on the die ring, adjust the die in and out to get correct bump back and snug the lock ring. it -may- have moved the setting a thou or two when you snug the lock ring down so it might take 2-3 times to get it right.
1. so people who sell retail reloading stuff can eat steak for dinner instead of pasta.
3. a pain in the neck to remember what thicknesses of shims went under what die for which setting???
Just set your dies lock ring right, once and your GTG.
What tool do you recommend for case trimming?
I use a Forster. Really though a case trimmer is rarely used and so long as it is piloted and indexes in the neck of the case you should be good to go with any of the most common brands.
So are you saying you do not trim your brass each time you reload?
Tres, thanks so much for the post. Really good information.
I continue to refer to this post on a routine basis. Thanks for all your efforts TresMon.
Great series of posts, thanks a bunch for taking the time to help others out. I have a question about head-space. For the last few years I've been targeting once fired case dimensions to set up my Redding body die in 308 for a bolt gun. You suggest bumping the shoulder a few thousandths back from this point. I always thought that a once fired case will not exactly match the chamber since the brass has some elasticity and it will "spring back" a bit after firing. Hence a once fired case has the necessary clearance for reliable feeding and extraction. So I don't start bumping the cases until after the second firing. Up till now I haven't experienced any problems with this SOP but you are obviously way more experienced at this than I am.
So my question is: Do you think it's OK to continue this practice since I haven't had feeding or extraction issues OR even so would it be better to bump the shoulder back a bit more? Are there any other issues besides feeding and extraction, like accuracy maybe that might be in play here?
To become a fisherman you have to think like a fish.
This is my attempt to think like a shell casing.
When a shell is fired, the brass expands to fill the chamber, the web section of the brass is unsupported by the chamber to a large degree so the strength of the case does all the work there. After the pressure is released the case springs back slightly, say a thou or 2, which allows the casing or brass to be extracted. You can neck size, reload and fire the shell again and again and if pressures are not excessive this can be repeated quite often. If you full length resize after each firing the die will size or squeeze the brass to the shape of the die and when the brass is removed from the die it will spring back by a thou or 2. The shoulder may not be set back at all, it may in fact be pushed forward depending on the die dimensions and the fired brass dimensions.
If, for instance you have a rifle with a snug or min headspace and a shell chambers with some resistance it will come out shorter (headspace dimension) after firing. If, a low pressure load is fired it will also come out shorter. If, you have a rifle with generous headspace (still safe, after all nobody would want to knowingly fire a rifle that had excessive or service headspace) the brass will be longer than it went in.
For the most part, if you buy a new gun or 2 and buy good quality reloading equipment and supplies you will in all likelihood never have any problems and really won't understand what all the fuss is about. But if you buy a fair number of gunshow rifles or used ones you will get an education. I've had the fun of experiencing first hand excessive headspace, oval chambers, dimensionally small dies, short dies, crooked barrels, barrels installed crooked, stepped and improperly machined bolt faces, oversized firing pin holes, sharp primer piercing firing pins and some stuff I have forgotten.
The 101 and 201 posts in this section are a good read, they explain all this better than I can.
okay so i just got in my chamber length guage.
thats ALOT longer than the max case length.
so should i not trim until i get close to 2.05?
Thank you so much for the needed information. Can't wait to read the next part.


text:
LEGO Star Wars The Force Awakens announced
Sony surprises PewDiePie with birthday cake and custom PS4 controller
Game of the Month: Overwatch
Deponia (Console) Review
Nintendo Podcast Episode 10
Xbox One S bundles revealed for pre-order
Christopher Graf
While the Xbox One has been released for some time, almost 3 years actually, it is about time something new came on the market for fans of Microsoft. With that, we have the Xbox One S. Announced at E3 2016, this console will have more power than its predecessor, giving players 4K Resolution Streaming and Blu-ray. If you're still skeptical, just take a look at these newly announced bundles from Major Nelson.
The first of these bundles is for the sports fans out there. The Xbox One S Madden NFL 17 Bundle comes with a 1TB hard drive, a copy of Madden NFL 17 and much more. To give you an edge on the competition, included are seven Madden Ultimate Team Pro Packs and one month of EA Access. This bundle is priced at $349.
The next bundle is for anyone looking to go on one of the most well known journeys in gaming world. The Xbox One S Halo Collection Bundle comes as either a 1TB or 500GB hard drive, a copy of Halo 5: Guardians, and Halo: The Master Chief Collection. That is every Halo game of the main series in one great package. The 1TB and 500GB versions of this bundle are $299 and $349, respectively.
While both of these Xbox One S bundles will be released on August 23rd, they are available for pre-order right now. You better act fast, especially if you are looking to get the Madden bundle. For a limited time, those who purchase this one will get a promo code for %20 off their next purchase at NFL.com.
Microsoftxbox oneXbox One S
Christopher is a passionate gamer who believes video games will help change the future of entertainment as we know it. He hopes to a part of this change some day as a designer himself.

redpajama_set_name: RedPajamaCommonCrawl


text:
Home > Blog > Songs
7 Great Songs About David
How many Davids do you know?
Do they have anything in common?
For the Davids near and dear to our hearts, it's hard to find the right words to tell them how much they mean to us.
There isn't really a lot of media specified towards Davids but still, we let them know our appreciation however we can.
If you're someone looking to show your David some love, take a look at this list of songs:
1. Dave's Song – Whitney
2. David's Song – Robbie Williams
3. David – GusGus
4. Play Little David – Joni Mitchell
5. Remember David – A Flock of Seagulls
6. David – Viva Brothers
7. David's Song – Joan Baez
While the name doesn't explicitly say David, we're going to count this one for Davids everywhere.
Whitney sings about wishing Dave was around because they're such a good friend and was there for them in the past.
The song is also about royally screwing up and wanting Dave's forgiveness so if that scenario is also true, this is the song for you.
This is a beautifully sad song.
The premise is we are on our death bed looking back on life and not wanting to change things because we lived our life with David (who is holding us in his arms as we sing).
The ambiance of the song is somber yet so light, just a great song to listen to in general.
David isn't technically name-dropped in the song but the title should be enough.
This is technically not a David appreciation song but it's a high-tempo house music bop that will get any Davids you know up and dancing.
And when they inevitably ask you "hey, what song is this? It's great!" You'll blow their minds with the answer.
The unmistakable vocals of Joni Mitchell give just the right tone for a little David to play his tune.
The song is technically about David from the Bible when he plays his instruments (most notably, the harp) but if you have any musically inclined Davids in your life, Joni Mitchell has you covered.
This upbeat rock song from A Flock of Seagulls serves almost as a memoir.
The song talks about his eyes, his dreams, his plans, and his smile.
You'd think David is dead based on the tone and lyrics but there is a point made to say "he's gone away but we don't know where" so it's open to interpretation.
Either he left to pursue something new or he died and it's a commentary on what comes next. Either way, a nice appreciation song for David.
Viva Brothers probably have the least-known song on our list.
The song circulated on the radio briefly but never really got traction, which is a shame because the beat and melody are quite catchy and for the early 2010s it was a perfect vocal match as well.
The song rags on the brother David a bit but in the end still loves him all the same.
Joan Baez completes the list with an absolutely gorgeous love song to David.
Again, the name isn't mentioned outside the title but the life shared and love given through the stars and hills and home and family, all waiting for David wherever he is and whenever he comes home, are really as pure as it gets for love songs.
Davids really don't get enough love but we can do our part to make them feel appreciated nonetheless.
Yes, there are songs out there without names associated that you can send to your Davids but hopefully this list has given you a personal touch to send to that special David in your life.
25 Great Songs About Family
43 Great Songs About Falling Out of Love
31 Great Songs About Snakes
25 Great Songs About Missing a Friend
Categories Songs
25 Great Songs About Friendship
11 Great Songs About Brown Eyes


text:
By Fred Pearce
GLOBAL warming is causing a worldwide resurgence in mosquito-borne diseases
such as malaria and dengue fever, resulting in epidemics among people who have
no immunity to them.
From Kenya to New Guinea and South America, the diseases are spreading from
lowland enclaves to higher altitudes as winter temperatures increase, warns a
study in the current issue of the Bulletin of the American Meteorological
Society (vol 78, p 409).
In the paper, Paul Epstein of the Harvard Medical School in Boston predicts
the imminent arrival of malaria in upland Kenya, including the capital Nairobi.
But John Githure, a specialist in human disease at the International Centre of
Insect Physiology and Ecology in Duduville, outside Nairobi, told New
Scientist that the disease is already being transmitted in the city 60
years after being banished by public health measures. In the 1930s, appalling
conditions allowed mosquitoes to thrive. Now rising temperature is the main
factor behind their return. "Climate change is increasingly pushing malaria into
highland areas," says Githure.
Until recently, malaria cases in Nairobi, which is 1650 metres above sea
level, were confined to people who had recently travelled to lowland areas.
"Physicians are now regularly reporting cases among people who have not left the
city," says Githure. "Thousands of people died after the unusually heavy rains
in January and February this year."
Malaria is generally confined to areas with minimum winter temperatures of 16
°C and a humidity of at least 55 per cent. But climate change—most
scientists accept that global temperatures have risen by about 0.6 °C this
century—combined with the effects of the short-term weather phenomenon El
Niño, is allowing the disease to spread to new areas.
Late last month, Ferenc Mayer of the International Committee for the Red
Cross in Geneva returned from Irian Jaya, western New Guinea. "Thousands of
people who have never been exposed to the disease are being affected," he says.
"In some villages I went to every resident had malaria."
Other mosquito-borne diseases may also be spreading. Jonathan Patz of the
Johns Hopkins School of Public Health in Baltimore warns that global warming
will increase the risk of dengue fever, a flu-like disease that is often fatal,
occurring in temperate regions such as Europe and the US. "Climate change may
have a substantial global impact on the spread of dengue fever," he says.
Brazil reported an upsurge in dengue fever this month, with a new case every
ten minutes in the state of Rio de Janeiro. And Epstein says there is growing
evidence that the disease is spreading. It is normally restricted to regions
where temperatures stay above 10 °C in winter, which used to confine it to
tropical areas less than 1000 metres above sea level.
But during the 1990s, Epstein says, cases of the disease have been reported
in areas at an altitude of 1700 metres in Mexico and 2200 metres in the
Colombian Andes.
Le clone est mort
Divided they fall


text:
Or stream audio live from anywhere on WICR Online!
You can listen to recent shows by clicking the podcast links below, or check out our extensive archive of past shows available as podcasts.
Ask Nelson and Charlie Hyde about Benjamin Harrison, the 1892 cholera epidemic and more
Click here to listen to the podcast.
For another show in our periodic series that offers listeners an opportunity to call with questions about Indiana's heritage, our host, author and historian Nelson Price, will be joined by Charlie Hyde, CEO of the Benjamin Harrison Presidential Site.
In between phone calls from listeners, Nelson and Charlie will interview each other about an array of topics, including how Benjamin Harrison, the only president elected from Indiana, handled an epidemic in 1892, his final year in the White House. Because of the Covid-19 pandemic, the 1892 cholera epidemic has been the focus of recent articles in the national press.
During our show, Charlie will explain how President Harrison responded when a ship from Hamburg, Germany, one of the epicenters of the epidemic, was en route to the United States. The cholera epidemic began in April 1892 in India and quickly spread to Europe, all while Harrison was dealing with a health crisis in his own family: First Lady Caroline Scott Harrison was gravely ill with tuberculosis and would die later in 1892 in the White House.
In between insights from Charlie and Nelson about this episode and others, listeners are invited to phone the WICR-FM (88.7) studio at 317-788-3314 and pose questions about any aspect of the state's history; typically on Hoosier History Live, questions from listeners are limited to the final 20 minutes of the show.
As we continue to salute Black History Month, Nelson will also discuss the 28th U.S. Colored Troops, an African-American regiment from Indiana during the Civil War. Even before the regiment was formed in 1864, Black soldiers from Indiana had been fighting for the Union Army in an infantry unit from Massachusetts; that legendary regiment was depicted in the movie Glory (1989) starring Denzel Washington.
Benjamin Harrison (1833-1901), who became a brigadier general during the Civil War, initiated attempts during his subsequent political career to expand civil rights for African Americans; Charlie will describe these attempts during our show.
Charlie also will discuss the reaction in Indianapolis in 1888 when Harrison, a Republican, was nominated as a presidential candidate. It is the focus of a current exhibit at the presidential site titled The Night Indianapolis Roared.
Another topic during our show will relate to the recent dedication in Carmel of a sculpture and interactive kiosks in honor of Hoagy Carmichael (1899-1981). The famous composer, who grew up in Bloomington and Indianapolis, is profiled in Nelson's book Indiana Legends, 4th edition (Hawthorne Publishing, 2005). Nelson had several interviews with Hoagy's son, Randy Carmichael, who died in 2018; Randy had been a Hoosier History Live guest seven years earlier. The sculpture and kiosks honoring Hoagy are near the Center for the Performing Arts, which includes the Great American Songbook Foundation.
Your donation helps keep Hoosier History Live on the air, on the web and in your inbox!
Roadtrip: Lincoln speech site in downtown Indianapolis
Guest Roadtripper and historic reenactor Danny Russel invites us to travel back in time 160 years to witness a moment in history that occurred on the corner of Washington and Missouri Streets in downtown Indianapolis.
Precisely at 5 pm on February 11th, 1861, and after a long secessionist winter, President Elect Abraham Lincoln made a stirring speech about the pitfalls that lay ahead for those seeking to preserve the Union. He made the stop while on his way to Washington D.C. to take office as our 16th president. The speech was met with deafening cheers and a 34-gun salute ordered by Governor Oliver P. Morton - a blast for every state in the nation.
Danny, who portrays Lincoln (and other famous Hoosiers) in schools and other educational settings, shares a few lines that the soon-to-be president spoke as he tried to convince his audience of the challenges that were coming:
"Do the lovers of the Union contend that they will resist coercion or invasion of any state? If they do, then it occurs to me that the means for the preservation of the Union they so greatly love, in their own estimation, is of a very thin and airy character. If sick, they would consider the little pills too large to swallow. In their view, the Union would not be anything like a regular marriage at all, but only as a sort of free-love arrangement!"
Danny will share the Indianapolis crowd's reaction to president elect's speech - as well as details from his stay at the Bates House hotel and his breakfast the following morning with Governor Morton, which happened to fall on Lincoln's 52nd birthday - when he leads us on this Roadtrip back in time to a pivotal moment in the nation's history.
Benjamin Harrison, the only U.S. president elected from Indiana, was short of stature, standing just 5' 6" tall. Only one other president has been shorter than Harrison.
Question: Who was the shortest president in U.S. history?
Hint: He served in the White House before the Civil War.
The call-in number is (317) 788-3314. Please do not call in to the show until you hear Nelson pose the question on the air, and please do not try to win if you have won any other prize on WICR during the last two months. You must be willing to give your first name to our engineer, you must answer the question correctly on the air and you must be willing to give your mailing address to our engineer so we can mail the prize pack to you.
This weeks prizes are two tickets to the Eiteljorg Museum, courtesy of the Eiteljorg Museum, and two two tickets to Indy's Teeny Statue of Liberty Museum, courtesy of Tim and Julie's Another Fine Mess.
Hoosier History Live salutes broadcast journalist Jill Ditmire, 1964-2021
The recent death of veteran central Indiana journalist and arts and wine enthusiast Jill Ditmire saddens us all.
Jill called herself an "OmniMedia Specialist," and she shared her bubbly wit, talent, and knowledge pretty much everywhere: WFYI, WICR, Indianapolis Star and Village Sampler were just a few of the media outlets to which she lent her abundant expertise.
Jill was occasionally a part of the Hoosier History Live team as well, both as guest host and as co-host with Nelson Price on a 2013 show titled Wine Heritage in Indiana. Their guests were Richard Vine, a professor emeritus at Purdue University specializing in enology (that's the study and making of wine), along with Mark Easley of Easley Winery in downtown Indianapolis.
And if the Hoosier state seems like an odd place to specialize in wine, recall that America's first commercially successful winery was in Switzerland County in the small town of Vineyard, which now exists only on antiquated maps of southeastern Indiana.
Jill was also a regular talent on another Molly Head-produced show that aired on WICR. Too Many Cooks! was a food, cooking and wine show that featured Jill as a call-in wine reporter known by fans as the "Wine Maven." Other show talents included Patti Denton, Gary BraVard and Jo Ellen Meyers Sharp.
Her obituary and other information are available here.
Nelson Price, host and historian
Molly Head, producer/general manager, (317) 927-9101
Mick Armbruster, associate producer
Cheryl Lamb, administrative manager
Richard Sullivan, senior tech consultant
Garry Chilluffo, consultant
Please tell our sponsors that you appreciate their support!
For organizational sponsorship, which includes logos, links, and voiced credits in the show and in podcasts, email molly@hoosierhistorylive.org, or call (317) 927-9101 for information. Our podcast listens are increasing and we are being distributed on Indiana Memory and the National Digital Public Library. Grow with us as our podcast and internet presence expands! Thanks also to Visit Indy, Fraizer Designs, WICR-FM, Henri Pensis, Genesis Brown, Kielynn Tally, Heather McIntyre, Justin Clark, and many other individuals and organizations.
We'd like to thank the following recent, new and renewal contributors whose donations help make this show possible!
Tim and Meg Shelly
Connor & Company, Inc.
Georgia Cravey and Jim Lingenfelter
Ann Frick
Yetta Wolen
In memory of William G. "Bill" Mihay
Dr. William McNiece
Michael Freeland and Sharon Butsch Freeland
David E. and Lynne J. Steele
Stacia Gorge
Rachel Perry
Tom and Linda Castaldi
February 27, 2021 - coming up
Migration of African Americans during 20th century to Northern states
As Hoosier History Live salutes Black History Month, our focus will be on a massive movement of an estimated 6 million people during a span of nearly 60 years. Beginning during the World War I era, African Americans migrated in unprecedented numbers from the South to cities in Northern states, including Indiana.
According to an article published in Smithsonian magazine, the waves of 20th century migration began with a move of Black families during the winter of 1916 from Selma, Alabama, to the North, a little-noticed start to powerful demographic shift that also encompassed a transition from agriculture to factory work. By the time it ended in the early 1970s, "a rural people had become urban."
Some historians use the term Great Migration to apply to the entire span. Others refer to the era from the 1910s to 1940 as the First Great Migration, and describe the 1940s to 1970 movement as the Second Great Migration.
To explore a range of factors and ramifications associated with this consequential migration, Nelson will be joined by Jakobi Williams, Ruth N. Halls Professor in the Department of African American and African Diasporas Studies and the Department of History at Indiana University.
Jakobi, who was born and grew up on the south side of Chicago, will discuss ways that state and local governments in the South attempted to restrict African Americans from leaving. He also will describe the challenges that confronted them in Northern cities after they resettled.
Since the early 1970s, demographers have documented a "reverse migration" among the U.S. Black population. As USA Today explained in a 2015 analysis, in recent years more African Americans have moved to the South than left it, returning to metro areas such as Atlanta and Charlotte.
Our guest Jakobi Williams, the author of From the Bullet to the Ballot (University of North Carolina Press, 2013) , suggests the PBS series Eyes on the Prize as a resource for those who want to learn more about the Great Migration.
Share this email
Manage your preferences | Opt out using TrueRemove®
Got this as a forward? Sign up to receive our future emails.
View this email online.
[% account_rsvp_address_1 %] [% account_rsvp_address_2 %]
[% account_rsvp_city %], [% account_rsvp_state %] | [% account_rsvp_zip_code %] [% account_rsvp_country %]
This email was sent to [% member:email %].
Continue receiving our emails, add us to your address book.


Aren't we missing some back vocals in some parts?
Well spotted. It appears that we don't have the backing harmony line during the second verse. I'll chase it up with the band and post a link as soon as it's available. As far as I can tell that's the only thing that's missing, though, so otherwise you should be good to go.
Here's some more information from the band for everyone. It's a list of commercial reference tracks that they like the sound of, and which will help you reference your mix. I've provided Youtube links, but they will only work in some territories of course, so you may have to track down these songs yourselves.
Thanks for the info, saves on some guess work.
Ok, thanks! Can we know who did the orignal mix?


Another UK Shopping Centre installation for Archer Electrical saw us undertake the full electrical installation within St David's Centre, Cardiff for MAC cosmetics. MAC is an iconic beauty range featuring cosmetics, skincare and make-up accessories.
Adding to our extending client list, this was our first project for 2013 Retail Week Shopfitter of the Year Cumberland Construction.
The entire electrical installation was completed in accordance with MAC's innovative electrical design concept in accordance with the St David's Centre fit-out Manual.


Cast your mind back to June this year– we'd had a spell of the most beautiful weather and we were all feeling a little complacent and were beginning to assume that all would be well for a BBQ or indeed ….. a wedding. I could hardly bear it as I left home to present Andy and Sarah's ceremony at Wonward Barton. It was pouring and I mean properly pouring with rain.
Wonward Barton is a cosy, rustic wedding venue with fantastic views towards Cornwall. In prime position taking full advantage of the said view, was a beautiful ceremonial arch made especially for the day by Andy's uncle. Indeed he wasn't the only family member who had been hard at work preparing for the day. This really was a family affair. Everyone had helped to make this special day the very best for this incredibly kind, fun and busy couple. The beautiful marquee was festooned with literally miles of bunting made by Andy's Mum. The garden was full of outside games. How dare the weather turn on my nurse and paramedic?
But there is a God up there after all and the rain did stop and although still very unsettled I was delighted when Andy decided five minutes before the ceremony was due to start that Yes, we were going to have it outside. All of us set to and within minutes the chairs were in place and we were ready to go.
Their's was a lovely story to tell and their love and friendship are worthy of great celebration. Having met with them, got to know them and laughed with them, we collaborated and created a script that reflected their relationship and love. This ceremony was truly personal. Everyone who attended knew them well, loved them a lot and recognised them in the story we told.
The rain was never going to dim the light at this wedding. Simply because it was shining bright in Andy and Sarah's eyes and I was lucky enough to be a part of it.


text:
<?php

namespace Cmf\PhpPm\Bridge;

use Cmf\PhpPm\Bootstrap\CustomCmfBootstrap;
use PHPPM\Bridges\BridgeInterface;
use React\Http\Request;
use React\Http\Response;

/**
 * This file is bridge for Custom CMF
 * Example:
 * <code>
 * ./bin/ppm start /path/to/CustomCMF/ --bridge="CustomCmf"
 * </code>
 * @author Vital Leshchyk <vitalleshchyk@gmail.com>
 */
class CustomCmfBridge implements BridgeInterface
{
    /** @var \Cmf\System\Application */
    protected $application;

    /**
     * @param string $appBootstrap
     * @param string $appEnv
     */
    public function bootstrap($appBootstrap, $appEnv)
    {
        $bootstrap = new CustomCmfBootstrap($appEnv);
        $this->application = $bootstrap->getApplication();
    }

    /**
     * @param \React\Http\Request $request
     * @param \React\Http\Response $response
     * @param array $postData
     */
    public function onRequest(Request $request, Response $response, array $postData)
    {
        if (null === ($app = $this->application)) {
            return;
        }

        $_POST = $postData;

        $_SERVER['SERVER_PROTOCOL'] = 'HTTP' . $request->getHttpVersion();
        $_SERVER['REQUEST_URI'] = $request->getPath();
        $_SERVER['SERVER_NAME'] = explode(':', $request->getHeaders()['Host'])[0];
        $_SERVER['REQUEST_METHOD'] = $request->getMethod();
        $_SERVER['REMOTE_ADDR'] = getenv('REMOTE_ADDR');

        try {
            $result = $this->application
                ->resetRequest()
                ->killWww()
                ->dispatch();
        } catch (\Exception $exception) {
            return;
        }

        $response->writeHead(200, []);
        $response->end($result);
    }
}


Although CA State regulates private property towing, it gives each city the freedom to write more restrictive municipal codes. Some cities require the properties to pay for permits to allow them to tow vehicle using permitted tow companies, who also pay for their permits. Even before the car is towed, the cost for the private property tow is adding up in the way of permits and license fees to the city. It is not fair to blame the property manager or the tow company for all of the outrageous fees to claim a vehicle, but it is fair to say the vehicle driver controls the outcome from where they park their car.


This communication is being made in respect of the proposed merger transaction involving Sirius XM Holdings Inc. ("Sirius") and Pandora Media, Inc. ("Pandora"). Sirius intends to file a registration statement on Form S-4 with the SEC, which will include a proxy statement of Pandora and a prospectus of Sirius and each party will file other documents regarding the proposed transaction with the SEC. Any definitive proxy statement(s)/prospectus(es) will also be sent to the stockholders of Pandora seeking any required stockholder approval. This communication does not constitute an offer to sell or the solicitation of an offer to buy any securities or a solicitation of any vote or approval. Before making any voting or investment decision, investors and stockholders of Pandora are urged to carefully read the entire registration statement and proxy statement/prospectus, when they become available, and any other relevant documents filed with the SEC, as well as any amendments or supplements to these documents, because they will contain important information about the proposed transaction. The documents filed by Sirius and Pandora with the SEC may be obtained free of charge at the SEC's website at www.sec.gov. In addition, the documents filed by Sirius may be obtained free of charge from Sirius at www.siriusxm.com, and the documents filed by Pandora may be obtained free of charge from Pandora at www.Pandora.com. Alternatively, these documents, when available, can be obtained free of charge from Sirius upon written request to Sirius,1290 Avenue of the Americas, 11th Floor, New York, New York 10104, Attn: Investor Relations, or by calling (212) 584-5100, or from Pandora upon written request to Pandora, 2101 Webster Street, Suite 1650, Oakland, California 94612 Attn: Investor Relations or by calling (510) 451-4100.
Sirius and Pandora and certain of their respective directors and executive officers may be deemed to be participants in the solicitation of proxies from the stockholders of Pandora in favor of the approval of the merger. Information regarding Sirius' directors and executive officers is contained in Sirius' Annual Report on Form 10-K for the year ended December 31, 2017, its Quarterly Reports on Form 10-Q for the quarterly periods ended March 31, 2018 and June 30, 2018 and its Proxy Statement on Schedule 14A, dated April 23, 2018, which are filed with the SEC. Information regarding Pandora's directors and executive officers is contained in Pandora's Annual Report on Form 10-K for the year ended December 31, 2017, its Quarterly Reports on Form 10-Q for the quarterly periods ended March 31, 2018 and June 30, 2018 and its Proxy Statement on Schedule 14A, dated April 10, 2018, which are filed with the SEC. Additional information regarding the interests of those participants and other persons who may be deemed participants in the transaction may be obtained by reading the registration statement(s) and the proxy statement(s)/prospectus(es) when they become available. Free copies of these documents may be obtained as described in the preceding paragraph.
In addition to factors previously disclosed in Sirius' and Pandora's reports filed with the SEC and those identified elsewhere in this communication, the following factors, among others, could cause actual results and the timing of events to differ materially from the anticipated results or other expectations expressed in the forward-looking statements: ability to meet the closing conditions to the merger, including the approval of Pandora's stockholders on the expected terms and schedule and the risk that regulatory approvals required for the merger are not obtained or are obtained subject to conditions that are not anticipated; delay in closing the merger; failure to realize the expected benefits from the proposed transaction; risks related to disruption of management time from ongoing business operations due to the proposed transaction; Sirius' or Pandora's substantial competition, which is likely to increase over time; Sirius' or Pandora's ability to retain subscribers or increase the number of subscribers is uncertain; Sirius' or Pandora's ability to profitably attract and retain subscribers; failing to protect the security of the personal information about Sirius' or Pandora's customers; interference to Sirius' or Pandora's service from wireless operations; Sirius and Pandora engage in substantial marketing efforts and the continued effectiveness of those efforts are an important part of Sirius' and Pandora's business; consumer protection laws and their enforcement; Sirius' or Pandora's failure to realize benefits of acquisitions or other strategic initiatives; unfavorable outcomes of pending or future litigation; the market for music rights, which is changing and subject to uncertainties; Sirius' dependence upon the auto industry; general economic conditions; existing or future government laws and regulations could harm Sirius' or Pandora's business; failure of Sirius' satellites would significantly damage its business; the interruption or failure of Sirius' or Pandora's information technology and communications systems; rapid technological and industry changes; failure of third parties to perform; Sirius' failure to comply with FCC requirements; modifications to Sirius' or Pandora's business plan; Sirius' or Pandora's indebtedness; Sirius' studios, terrestrial repeater networks, satellite uplink facilities or Sirius' or Pandora's other ground facilities could be damaged by natural catastrophes or terrorist activities; Sirius' principal stockholder has significant influence over its affairs and over actions requiring stockholder approval and its interests may differ from interests of other holders of Sirius' common stock; Sirius is a "controlled company" within the meaning of the NASDAQ listing rules; impairment of Sirius' or Pandora's business by third-party intellectual property rights; changes to Sirius' dividend policies which could occur at any time; and risks related to the inability to realize cost savings or revenues or to implement integration plans and other consequences associated with mergers, acquisitions and divestitures. The information set forth herein speaks only as of the date hereof, and Sirius and Pandora disclaim any intention or obligation to update any forward looking statements as a result of developments occurring after the date of this communication.


The cover pattern on the Summer 2009 issue of Vogue Knitting has me intrigued. After my first foray into lace knitting in the round, Amanda suggested that I try the Medallion piece since it uses circular lace. After reading through the related instructions, I discovered that it's an amazing piece that uses a variety of stitches to make the outer border. The different stitches compensate for the difference in the circumference rather than growing by adding more stitches each row. I am planning to make the vest in a combination of two tones so that I can use some white Tahki cotton that's in my stash.
I stopped using Vogue patterns since they tended to be very simplistic designs but, to my pleasant surprise, this issue has several patterns that I can't wait to knit.
As with any pattern I knit these days, I always check out the comments on Ravelry. This medallion top has almost 100 projects already. I also found out that (no surprise here!) there are corrections to the pattern.


text:
A longer ride and a look to the future.
This morning I walked my dog, Freddie, and on the way home I saw a somewhat older gentleman who walks and runs whilst keeping a hula hoop continually twirling around his waist. I thought for a brief moment that I could acquire a hula hoop and try to do the same. Then I saw sense and decided on a mountain bike ride.
With my wife at home I could afford to be out for a little longer, knowing that Freddie wouldn't be alone so I chose to ride to Dean Mills reservoir, high on the moors. I rode beyond the reservoir, to the Egg Hillock, earlier in the year when the ground was dry but was unsure how the trails would be today. I emptied around 5 inches of rain water from some buckets in the garden this morning, which is an awful lot of rain to have accumulated in just a few days. I took a road route of 4 miles to Rivington Village in the area which is considered a real mountain bike Mecca. I then had over 10 miles of off road trail ahead of me where I'd climb to around 1,500 feet on Winter Hill. There were a lot of walkers as soon as I started on the trails, enjoying what could be one of the last fairly warm and sunny days of the autumn, if you consider 15 celcius to be warm. I'd already climbed on the road and now needed to accept that I'd have little other than climbing to occupy me for the next 50 minutes. There are some uneventful downhill sections which I'd avoid if I could so I didn't lose any height and fortunately there are some technical parts which require a some skill and determination to get up without walking. I could have ridden the very hard way via Crooked Edge which I rode earlier in the year. I'd set it as a target last year but after several attempts I accepted that I couldn't do it any more. This year my fitness has definitely improved so I was delighted to make it all the way up. I thought it would be too muddy today so used Wilders Moor which had one really hard part which I got up non stop.
Riding up the access road to the TV transmitters I was overtaken by 2 Ebikes with their whirring electric motors. I turned off to the right at the transmitter to ride the long Smithills Moor downhill. It's a fast decent and this was assisted today by a tailwind which had been against me on the climb. I knew the importance of keeping both wheels in the same groove on the badly rutted and slippery surface. At speed I failed in this mission and the bike swung wildly as the front wheel went right and the rear left. I expected to hit the ground but fought it back into control, resolving to be more careful for the rest of the drop. I crossed a small but steep valley over a stream and started the climb to my objective. It never fails to surprise me when the reservoir burst into view.
Nothing but ground and sky but moving forwards 5 yards to where my backpack is……….
Suddenly a 400 yard long stretch of water appears.
To the east I could see the hills north of Bury where I rode the Mary Towneley Loop in September. Having had a tyre split with only one hill left to climb I can't stop thinking about the ride and have already decided to try again next year. From the opposite end of the water a good, twisty downhill begins. It was slippery but good fun, ending on a small segment of tarmac. Then it's back to climbing but I changed my planned route which made the climb back to Wilders Moor a little easier. The way back down the trail I'd climbed earlier was exciting and I was careful to ensure the ruts didn't catch me out. Next came the downhill which was my very favourite in the late 1990s. It runs down the side of Wilderswood and I used to try to maximise my speed. The gradient is never especially steep but there's plenty of speed available on the twisting trail with it's ever changing surface of rocks, grit, gravel and mud. I rode back to Rivington on trail then back home by road, reversing my outward journey. I'd ridden 18.78 miles in 2 hours and 14 minutes, climbing 2,042 feet of ascent. I enjoyed riding somewhere different today and think I should ride this area more often.


text:
TV Bandeirantes Paraná (também conhecida como Band Paraná) é uma emissora de televisão brasileira sediada em Curitiba, capital do estado do Paraná. Opera no canal 2 (38 UHF digital) e é uma emissora própria da Rede Bandeirantes. Pertence ao Grupo Bandeirantes de Comunicação, em sociedade com o Grupo JMalucelli, e sua cobertura abrange 67 municípios do estado.

História
A concessão para a quarta emissora de televisão de Curitiba foi outorgada pelo presidente João Figueiredo em 24 de outubro de 1979, após concorrência pública, a uma sociedade entre o Grupo Bandeirantes de Comunicação e o empresário João Milanez, proprietário da TV Tarobá de Cascavel. Uma vez que a Rede Bandeirantes já tinha como afiliada a TV Paraná, pertencente às Organizações Martinez, a rede decidiu prosseguir com a parceria e firmou um acordo especial para o uso de suas instalações, em especial, de um transmissor preparado para uso apenas no canal 2 VHF. Isso levou os proprietários a requererem junto ao DENTEL a alteração de características técnicas da estação, que havia sido aprovada originalmente para o canal 9 VHF (este por sua vez, só veio a ser utilizado a partir de 1987 pela atual TV Paraná Turismo).

A TV Curitiba foi inaugurada em 22 de julho de 1982, às 19h, com um coquetel para vários convidados no Buffet Cormoran, dentre eles autoridades como o político Ney Braga, que descerrou a fita de inauguração da emissora com João Milanez, o prefeito Jaime Lerner, o governador José Hosken de Novais, o ministro das comunicações Euclides Quandt de Oliveira, além de deputados federais e estaduais. A emissora tinha uma programação independente, com sobras da programação da Rede Bandeirantes e programas educativos produzidos pela TV Cultura e pela TVE. Em abril de 1984, passou a retransmitir a programação da Rede Manchete, afiliação que durou até 13 de julho de 1986, quando a rede passou a ser repetida pela TV Independência, e a TV Curitiba voltou a ter uma programação independente a partir do dia seguinte.

Em 1990, Milanez vendeu a sua parte na TV Curitiba para o empresário Joel Malucelli, proprietário do Grupo JMalucelli. A nova gestão promoveu diversas modificações na emissora, como a construção de estúdios próprios, deixando a condição de inquilina da TV Paraná. Com o fim do contrato entre a Rede Bandeirantes e a TV Paraná, que migrou para a Rede Record, a TV Curitiba pôde enfim assumir a condição de emissora própria da rede em 2 de junho de 1991, tornando-se TV Bandeirantes Curitiba.

A emissora passou a retransmitir a nova programação desde as primeiras horas do dia, simultaneamente com o canal 6, mas sua estreia oficial se deu às 21h, com a reprise do programa Crítica & Autocrítica, que teve como convidado o então governador paranaense Roberto Requião. A entrevista havia sido exibida uma semana antes pela Rede Bandeirantes, mas foi censurada por sua antiga afiliada devido a desavenças políticas entre Requião e seu proprietário, José Carlos Martinez. Na mesma semana, em 7 de junho, foi inaugurada a sede própria da emissora no bairro do Pilarzinho.

Em janeiro de 2015, a RPC (afiliada Rede Globo) sublicenciou os direitos de transmissão do Campeonato Paranaense para a Band. Em 19 de junho de 2019, a emissora passou a se chamar TV Bandeirantes Paraná.

Sinal digital

A emissora inciou suas transmissões digitais em 11 de junho de 2010, dia da abertura da Copa do Mundo FIFA de 2010, pelo canal 38 UHF para Curitiba e áreas próximas. Desde 2014, a emissora passou a exibir 100% da sua programação local em alta definição.

 Transição para o sinal digital
Com base no decreto federal de transição das emissoras de TV brasileiras do sinal analógico para o digital, a então TV Bandeirantes Curitiba, bem como as outras emissoras de Curitiba, cessou suas transmissões pelo canal 2 VHF em 31 de janeiro de 2018, seguindo o cronograma oficial da ANATEL.

Programas
Além de retransmitir a programação nacional da Band, atualmente a Band Paraná produz e exibe os seguintes programas:

 AgroBand: Jornalístico sobre agronegócio, com Ana Chu;
 Acontece Paraná: Jornalístico, com Alessandra Consoli;
 Bora Paraná: Telejornal, com Cristiano Santos;
 Os Donos da Bola: Jornalístico esportivo, com Hassan Neto;
 Band Cidade 1.ª edição: Telejornal, com Alessandra Consoli;
 Boa Tarde Paraná: Jornalístico, com Laércio André;
 Vida Alheia: Programa de variedades, com Ender Love;
 Band Mulher: Programa de variedades, com Ana Chu;
 Brasil Urgente PR:  Jornalístico policial, com Val Santos;
 Band Cidade 2.ª edição: Telejornal, com José Wille;
 Paraná Querido: Programa musical, com Cláudio Peixoto;
 Band Litoral: Jornalístico, com Samyr Assad;
 Top Fighters Overall: Programa de variedades, com Rodrigo Silva

Diversos outros programas compuseram a grade da emissora e foram descontinuados:

 Band Entrevista
 Band Motores
 Conversa de Boteco
 Esporte Total Paraná
 Galo na Band
 Entrevista Coletiva
 Instante Digital
 Jogo Aberto Paraná
 Jornal de Curitiba
 Laércio André na Band
 O Grito da Cidade
 Primeiro Jornal Paraná
 Val Santos na Band''

Retransmissoras

 Almirante Tamandaré - 2.1 digital
 Antonina - 5.1 digital
 Arapoti - 36 analógico
 Araucária - 2.1 digital
 Balsa Nova - 2.1 digital
 Campina Grande do Sul - 2.1 digital
 Campo Largo - 2.1 digital
 Campo do Tenente - 52 analógico
 Castro - 8 analógico
 Carambeí - 22.1 digital
 Colombo - 2.1 digital
 Contenda - 2.1 digital
 Fazenda Rio Grande - 2.1 digital
 Guaratuba - 56.1 digital
 Itapoá - 56.1 digital
 Lapa - 38.1 digital
 Matinhos - 2.1 digital
 Morretes - 5.1 digital
 Paranaguá - 5.1 digital
 Pinhais - 2.1 digital
 Piraquara - 2.1 digital
 Ponta Grossa - 22.1 digital
 Pontal do Paraná - 2.1 digital
 Rio Branco do Sul - 2.1 digital
 São José dos Pinhais - 2.1 digital
 Siqueira Campos - 39 analógico / 46.1 digital
 Teixeira Soares - 22.1 digital
 Tibagi - 17 analógico

Ligações externas

Grupo JMalucelli
Bandeirantes Paraná
Bandeirantes Paraná
Canais de televisão fundados em 1982
Fundações no Paraná em 1982

redpajama_set_name: RedPajamaWikipedia


Las Verandas offers spa services through the La Piña Spa and Wellness Center. This conveniently located spa is just minutes away from Las Verandas and offers the total spa experience. The guest services coordinator at Las Verandas will be happy to arrange the perfect spa day for you.
For more information on services offered by La Piña, please visit their website.


We, at Aarsun Woods, have 30+ Years of Experience in promoting Wood Handicrafts and Hand-carved Furniture holding global clients with roots in Saharanpur - a world famous city for its handicrafts. Though the name Aarsun (TM) is registered adapting to the dynamic Global market however our parent firm still exists catering our old clients with the same zeal.
People across globe love Saharanpur wood Handicrafts and Saharanpur Wood Furniture and Aarsun loves when people call to check "Are you from Saharanpur".
Aarsun Woods, an ISO 9001:2015 Certified Company, has been awarded Global Excellence Award 2018 being the best handicrafts and furniture manufacturer in state of UP. We have delivered our hand-carved products in all corners of India and to many countries globally.
Wood Carving is a fine art that is developed with years of experience and knowledge about the quality of wood.
From small jewellery boxes, kitchen spatulas to home temples, partition screens, handcrafted home furniture viz bedroom sets, sofa sets, dining sets, wardrobe, settees, bar cabinets and chairs, wall decor items to a range of export items, Aarsun has supplied our artisitc products globally.
Selection of right type of wood and use of seasoned woods improves the life of the product and the right polishing gives the enriched look to the product as required by the client. Our artisans have created masterpieces time and again for made to order products as required by our customers, be it the corporate gifts with carved Names or the grand looking furniture sets used by the royal families. Each unit is hand-made and thoroughly inspected before it is sent to the customer to bring the satisfaction of our customers.
Being our family business and three generations of expertise we have always taken pride in delivering what is required by our clients. Our business solely depends on the quality of our products as most of our clients have been associated with us for more than a decade. Our business theme always suggest the satisfaction of our clients for the money they have paid.
Aarsun Woods is now doing business with all major e-retailers and providing high quality wooden products under the brand name of Aarsun. With thousands of happy customers from our online stores in last few years our customers have appreciated our art and quality time and again. With an aim to make "Aarsun", the brand and Saharanpur as synonyms, we have taken our best foot forward and wishes to engage with people world-over to showcase the talent of the cottage Industry of Saharanpur for Wood Handicrafts and Wood Furniture. Some of our work is displayed on the website and we would constantly update our work to keep the art alive and not to be taken over by automation through robotics & CNC machines.


Michael Jackson is still setting records and making history even in passing. According to the Recording Industry Association of America, the "P.Y.T." singer's Thriller album has reportedly become certified platinum a total of 33 times in the United States. The project is already the highest certified album in history, but this news only extends that record.
Billboard reports that the sum of 33 million equivalent albums being sold blends "traditional album sales (one album sale equals one unit), tracks sold from an album (10 tracks sold equals one unit) and on-demand audio and/or video streams (1,500 streams equals one unit)."
Earlier this weekend, the plaque was presented at L.A. Reid's home, where Sony Music CEO Doug Morris, Columbia Records chairman and incoming Sony Music CEO Rob Stringer, Sony president, commercial group Richard Storey, attorneys Karen Langford and John Branca were present for the mini-ceremony.
Second in line to Thriller on the highest-certified albums list is The Eagles' Their Greatest Hits 1971-1975, which is at 29 million sold as of 2006.


Enhance your 1991-Current Ford Explorer or Mercury Mountaineer's factory fuel door by adding this awesome "easy-to-install" aluminum Billet style door decal. Manufactured with a Simulated Carbon Fiber and Silver Metallic composite look, this three dimensional looking graphic looks like it's fastened on with Stainless Steel Hex Head style fasteners!
This decal is specifically fit for any 1991-2000 two (2) Door Ford Explorer or 1991-Current four (4) door Ford Explorer or Mercury Mountaineer's existing factory fuel door and is not a "generic" decal.


text:
package org.apache.ignite.internal.portable;

import org.apache.ignite.internal.portable.streams.PortableOutputStream;
import org.apache.ignite.portable.PortableException;
import org.apache.ignite.portable.PortableRawWriter;
import org.jetbrains.annotations.Nullable;

/**
 * Extended writer interface.
 */
public interface PortableRawWriterEx extends PortableRawWriter, AutoCloseable {
    /**
     * @param obj Object to write.
     * @throws PortableException In case of error.
     */
    public void writeObjectDetached(@Nullable Object obj) throws PortableException;

    /**
     * @return Output stream.
     */
    public PortableOutputStream out();

    /**
     * Cleans resources.
     */
    @Override public void close();

    /**
     * Reserve a room for an integer.
     *
     * @return Position in the stream where value is to be written.
     */
    public int reserveInt();

    /**
     * Write int value at the specific position.
     *
     * @param pos Position.
     * @param val Value.
     * @throws PortableException If failed.
     */
    public void writeInt(int pos, int val) throws PortableException;
}


text:
Spaceworks Artists in the News
Cinotto's studio mates, Nigel and Mimsey Frost. Photo: L. Cinotto
A sea of hand-made objects by Laurie Cinotto
Tacoma crafting wizard Laurie Cinotto is on her way to New York. Cinotto won a coveted spot at the Martha Stewart Holiday Craft Sale in New York City, garnering the most votes out of eight finalists along the way. Cinotto's meticulous handmades, including witty corsages and boutonnières, and beautiful crepe paper bouquets, secured her a slot at the famous showcase. When she's not creating fabulous adornments for jacket lapels, or for tabletops, the artist runs a local feline adoption program, The Itty Bitty Kitty Committee (and she raised a whopping $49,000 for the Humane Society last summer). See how Cinotto's furry studio mates contribute to the creative process at www.lalalaurie.com.
The War Experience Project, an exhibition organized by artist and Iraq veteran, Rick Lawson, was the subject of a special edition of the KBTC program, Northwest Now, recorded earlier this month (check listings for rebroadcast times). Because of its unique mission of helping veterans to tell their stories through art (using uniforms as a canvas), and its relevance to the Puget Sound military community, the WEP has received extensive media coverage since it opened on Nov. 11. More than 50 uniforms are on display at the gallery at 906 Broadway. Lawson will conduct on-site painting workshops for vets through mid-Feb. 2011. Hours: Wed. – Sat., 10am – 5pm; Sun., noon – 5pm. Information at (347) 927-3708, or contact rick@warep.com.
First-round Spaceworks artist Gretchen Bennett, who created a dusky tribute to Tacoma at the Woolworth Building, was shortlisted in Sept. for a Genius Award by the Seattle alternative weekly, The Stranger. It was Bennett's second nomination for the $5,000 award, and only the latest recognition in a year that has included a showing of drawings in the Seattle Art Museum exhibition, Kurt, an homage to Kurt Cobain.
"Jack's Epitaph" (detail), by Lisa Kinoshita
Lisa Kinoshita's sculpture, What You Own, Owns You, is on view at the Tacoma Art Museum through Jan. 16, 2011. The Tacoma artist has been nominated for the Portland Art Museum's second Contemporary Northwest Art Awards (formerly the Oregon Biennial). Five to eight artists working in Oregon, Washington, Idaho, Montana or Wyoming, will be honored with a museum exhibition and catalog next year. Recipients will be announced in Jan. 2011.
Two Spaceworks artists whose work deals with our increasingly dystopic relationship to the planet, are recipients of 2010 Artist Trust GAP grants. Walla Walla artist Michelle Acuff received a $1,500 award to publish a catalog of sculptural works that explore "our tenuous liaison to the natural world." Acuff's work addresses the high price of consumer consumption as measured in the ubiquitous, poisonous substances used in industrial mass production. Her distortions of the natural world, such as in the blue deer (at right), inhabit a plane that is both saccharine and surreal.
Shelton-based artist Barbara De Pirro has been Resident Artist at the Museum of Glass in 2008, 2009 and 2010. Her 2010 Artist Trust GAP Grant, in the amount of $1,500, is providing support for new projects and public works. Artist Trust describes De Pirro's work as "biomorphic sculptural forms and installations that subtlety express her ecological concerns. Designs conceived in her observations of nature are constructed reusing unnatural, reclaimed materials, and then placed in the world where they can be investigated and contemplated. This deliberate juxtaposition between form and material opens the door for subtle but infinite metaphorical meaning." Find out more at depirro.com.
A Ben Hirschkoff cloudscape made of construction materials.
Artists Ben Hirschkoff and Alyson Piskorowski have been selected to create installations for the pilot program of Storefronts Seattle, a project of Shunpike modeled after Spaceworks Tacoma, and implemented in Pioneer Square and the International District. Hirschkoff will enliven his storefront exhibit with existing building materials, utilizing the vernacular of construction to create a large-scale sculpture. Piskorowski continues her elegant investigations into the geometry of space with the creation of flowing patterns in paper that engage passersby. Both installations will be on display from Dec. 2010 to Feb. 2011.
Posted in Artscapes, Incubator, Spaceworks Tacoma, Tacoma ArtistsTagged Alyson Piskorowski, Barbara De Pirro, Ben Hirschkoff, Laurie Cinotto, Lisa Kinoshita, Michelle Acuff, Models for Success, Pop-Up Retail, Rick Lawson, War Experience Project
Drawing on Water
Two Views of Thanksgiving


text:
Michael Rock
On this week's episode, I talk with the designer and writer Michael Rock. Michael is the co-founder and creative director at 2x4, teaches at Yale and Columbia, and writes for The New York Times T Magazine. This summer, I visited Michael at 2x4's New York headquarters to talk about his own history, how he thinks about his roles as a designer and writer, the importance of theory in design practice, and writing about design for a general audience.
Michael's Essays
@2x4
@microcritique
The Self-righteous vs. the self-serving
Sheila Levrant de Bretteville
Human Emotion: The One Things the Internet Can't Buy
The Ever-Evolving Typographic Life of the Arabic Language
The Metallic Muse: Fashion's Sci-Fi Obsession
When the Shop Looks a Lot Like Home
I, Fembot
2x4 - The Line
OMA - Fondazione Prada
What is this thing called graphic design criticism?
A Cautious Prometheus? - Bruno Latour
On the new Google logo
Nelson Goodman
Michael Rock at Bloomberg Businessweek Conference
Michael Rock's RISD Talk
05. Michael Bierut
03. Steven Heller


country kitchen lighting perfect country kitchen light fixture french country.
country kitchen lighting country kitchen light fixture french lighting fixtures awesome home.
country kitchen lighting light country kitchen lighting bathroom ceiling lights track.
country kitchen lighting new french country kitchen lighting decor with outdoor room design.
country kitchen lighting kitchen aesthetic country kitchen lighting light inspiration french.
country kitchen lighting pendant lights astounding country kitchen lighting intended for.
country kitchen lighting modern country kitchen lighting large size of pendant lights.
country kitchen lighting french country kitchen lighting kitchen chandelier design french.
country kitchen lighting french country kitchen lighting s fixtures over island experience.
country kitchen lighting french country kitchen lighting fascinating french country lighting.
country kitchen lighting country lighting for kitchen home ideas.
country kitchen lighting french country kitchen lighting lamp farmhouse style ceiling lights.
country kitchen lighting endearing country kitchen lighting at accent for a contemporary blog.
country kitchen lighting interior country kitchen lighting astonishing with regard to.
country kitchen lighting country kitchen light fixtures country kitchen lights style lighting.
country kitchen lighting pendant lights astounding country kitchen pendant lighting french.
country kitchen lighting modest french country kitchen lighting fixtures set new at office.
country kitchen lighting charming country island lighting french country kitchen island.
country kitchen lighting kitchen island amazing graceful kitchen pendant lighting over.
country kitchen lighting interior country kitchen lighting stunning pertaining to interior.
country kitchen lighting country kitchen lights french country kitchen pendant lights french.
country kitchen lighting country kitchen lighting fixtures country kitchen light fixture.
country kitchen lighting country kitchen lights kitchen ceiling lights ideas best country.
country kitchen lighting country kitchen lighting fixtures.
country kitchen lighting country kitchen ceiling lights french kitchen lighting french.
country kitchen lighting french country kitchen lighting.
country kitchen lighting 8 pendant lights to brighten your country kitchen ideal home.
country kitchen lighting country kitchen lighting fixtures french country kitchen lighting.
country kitchen lighting country kitchen light fixtures french country kitchen lighting.
country kitchen lighting rustic kitchen light fixture country kitchen chandelier lighting.
country kitchen lighting awesome kitchen lighting ideas kitchen pendants pendants and.
country kitchen lighting the french country ceiling light french country.