text:
// -----------------------------------------------------------------------------------------
// <copyright file="CloudFileShareTest.cs" company="Microsoft">
//    Copyright 2013 Microsoft Corporation
//
//    Licensed under the Apache License, Version 2.0 (the "License");
//    you may not use this file except in compliance with the License.
//    You may obtain a copy of the License at
//      http://www.apache.org/licenses/LICENSE-2.0
//
//    Unless required by applicable law or agreed to in writing, software
//    distributed under the License is distributed on an "AS IS" BASIS,
//    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//    See the License for the specific language governing permissions and
//    limitations under the License.
// </copyright>
// -----------------------------------------------------------------------------------------

using Microsoft.VisualStudio.TestPlatform.UnitTestFramework;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Threading.Tasks;

#if ASPNET_K
using System.Globalization;
#else
using Windows.Globalization;
#endif

namespace Microsoft.WindowsAzure.Storage.File
{
    [TestClass]
    public class CloudFileShareTest : FileTestBase
#if XUNIT
, IDisposable
#endif
    {

#if XUNIT
        // Todo: The simple/nonefficient workaround is to minimize change and support Xunit,
        // removed when we support mstest on projectK
        public CloudFileShareTest()
        {
            MyTestInitialize();
        }
        public void Dispose()
        {
            MyTestCleanup();
        }
#endif
        //
        // Use TestInitialize to run code before running each test
        [TestInitialize()]
        public void MyTestInitialize()
        {
            if (TestBase.FileBufferManager != null)
            {
                TestBase.FileBufferManager.OutstandingBufferCount = 0;
            }
        }
        //
        // Use TestCleanup to run code after each test has run
        [TestCleanup()]
        public void MyTestCleanup()
        {
            if (TestBase.FileBufferManager != null)
            {
                Assert.AreEqual(0, TestBase.FileBufferManager.OutstandingBufferCount);
            }
        }

        [TestMethod]
        [Description("Validate share references")]
        [TestCategory(ComponentCategory.File)]
        [TestCategory(TestTypeCategory.UnitTest)]
        [TestCategory(SmokeTestCategory.NonSmoke)]
        [TestCategory(TenantTypeCategory.DevFabric), TestCategory(TenantTypeCategory.Cloud)]
        public void CloudFileShareReference()
        {
            CloudFileClient client = GenerateCloudFileClient();
            CloudFileShare share = client.GetShareReference("share");
            CloudFileDirectory rootDirectory = share.GetRootDirectoryReference();
            CloudFileDirectory directory = rootDirectory.GetDirectoryReference("directory4");
            CloudFile file = directory.GetFileReference("file2");

            Assert.AreEqual(share, file.Share);
            Assert.AreEqual(share, rootDirectory.Share);
            Assert.AreEqual(share, directory.Share);
            Assert.AreEqual(share, directory.Parent.Share);
            Assert.AreEqual(share, file.Parent.Share);
        }

        [TestMethod]
        [Description("Create and delete a share")]
        [TestCategory(ComponentCategory.File)]
        [TestCategory(TestTypeCategory.UnitTest)]
        [TestCategory(SmokeTestCategory.NonSmoke)]
        [TestCategory(TenantTypeCategory.DevFabric), TestCategory(TenantTypeCategory.Cloud)]
        public async Task CloudFileShareCreateAsync()
        {
            CloudFileShare share = GetRandomShareReference();
            await share.CreateAsync();
            try
            {
                OperationContext operationContext = new OperationContext();
                Assert.ThrowsException<AggregateException>(
                    () => share.CreateAsync(null, operationContext).Wait(),
                    "Creating already exists share should fail");
                Assert.AreEqual((int)HttpStatusCode.Conflict, operationContext.LastResult.HttpStatusCode);
            }
            finally
            {
                share.DeleteAsync().Wait();
            }
        }

        [TestMethod]
        [Description("Try to create a share after it is created")]
        [TestCategory(ComponentCategory.File)]
        [TestCategory(TestTypeCategory.UnitTest)]
        [TestCategory(SmokeTestCategory.NonSmoke)]
        [TestCategory(TenantTypeCategory.DevFabric), TestCategory(TenantTypeCategory.Cloud)]
        public async Task CloudFileShareCreateIfNotExistsAsync()
        {
            CloudFileShare share = GetRandomShareReference();
            try
            {
                Assert.IsTrue(await share.CreateIfNotExistsAsync());
                Assert.IsFalse(await share.CreateIfNotExistsAsync());
            }
            finally
            {
                share.DeleteIfExistsAsync().Wait();
            }
        }

        [TestMethod]
        [Description("Try to delete a non-existing share")]
        [TestCategory(ComponentCategory.File)]
        [TestCategory(TestTypeCategory.UnitTest)]
        [TestCategory(SmokeTestCategory.NonSmoke)]
        [TestCategory(TenantTypeCategory.DevFabric), TestCategory(TenantTypeCategory.Cloud)]
        public async Task CloudFileShareDeleteIfExistsAsync()
        {
            CloudFileShare share = GetRandomShareReference();
            Assert.IsFalse(await share.DeleteIfExistsAsync());
            await share.CreateAsync();
            Assert.IsTrue(await share.DeleteIfExistsAsync());
            Assert.IsFalse(await share.DeleteIfExistsAsync());
        }

        [TestMethod]
        [Description("Check a share's existence")]
        [TestCategory(ComponentCategory.File)]
        [TestCategory(TestTypeCategory.UnitTest)]
        [TestCategory(SmokeTestCategory.NonSmoke)]
        [TestCategory(TenantTypeCategory.DevFabric), TestCategory(TenantTypeCategory.Cloud)]
        public async Task CloudFileShareExistsAsync()
        {
            CloudFileShare share = GetRandomShareReference();
            CloudFileShare share2 = share.ServiceClient.GetShareReference(share.Name);

            try
            {
                Assert.IsFalse(await share2.ExistsAsync());

                await share.CreateAsync();

                Assert.IsTrue(await share2.ExistsAsync());
                Assert.IsNotNull(share2.Properties.ETag);
            }
            finally
            {
                share.DeleteIfExistsAsync().Wait();
            }

            Assert.IsFalse(await share2.ExistsAsync());
        }

        [TestMethod]
        [Description("Create a share with metadata")]
        [TestCategory(ComponentCategory.File)]
        [TestCategory(TestTypeCategory.UnitTest)]
        [TestCategory(SmokeTestCategory.NonSmoke)]
        [TestCategory(TenantTypeCategory.DevFabric), TestCategory(TenantTypeCategory.Cloud)]
        public async Task CloudFileShareCreateWithMetadataAsync()
        {
            CloudFileShare share = GetRandomShareReference();
            try
            {
                share.Metadata.Add("key1", "value1");
                await share.CreateAsync();

                CloudFileShare share2 = share.ServiceClient.GetShareReference(share.Name);
                await share2.FetchAttributesAsync();
                Assert.AreEqual(1, share2.Metadata.Count);
                Assert.AreEqual("value1", share2.Metadata["key1"]);

                Assert.IsTrue(share2.Properties.LastModified.Value.AddHours(1) > DateTimeOffset.Now);
                Assert.IsNotNull(share2.Properties.ETag);
            }
            finally
            {
                share.DeleteIfExistsAsync().Wait();
            }
        }

        [TestMethod]
        [Description("Create a share with metadata")]
        [TestCategory(ComponentCategory.File)]
        [TestCategory(TestTypeCategory.UnitTest)]
        [TestCategory(SmokeTestCategory.NonSmoke)]
        [TestCategory(TenantTypeCategory.DevFabric), TestCategory(TenantTypeCategory.Cloud)]
        public async Task CloudFileShareSetMetadataAsync()
        {
            CloudFileShare share = GetRandomShareReference();
            try
            {
                await share.CreateAsync();

                CloudFileShare share2 = share.ServiceClient.GetShareReference(share.Name);
                await share2.FetchAttributesAsync();
                Assert.AreEqual(0, share2.Metadata.Count);

                share.Metadata.Add("key1", "value1");
                await share.SetMetadataAsync();

                await share2.FetchAttributesAsync();
                Assert.AreEqual(1, share2.Metadata.Count);
                Assert.AreEqual("value1", share2.Metadata["key1"]);

                ShareResultSegment results = await share.ServiceClient.ListSharesSegmentedAsync(share.Name, ShareListingDetails.Metadata, null, null, null, null);
                CloudFileShare share3 = results.Results.First();
                Assert.AreEqual(1, share3.Metadata.Count);
                Assert.AreEqual("value1", share3.Metadata["key1"]);

                share.Metadata.Clear();
                await share.SetMetadataAsync();

                await share2.FetchAttributesAsync();
                Assert.AreEqual(0, share2.Metadata.Count);
            }
            finally
            {
                share.DeleteIfExistsAsync().Wait();
            }
        }

        [TestMethod]
        [Description("Create a share with metadata")]
        [TestCategory(ComponentCategory.File)]
        [TestCategory(TestTypeCategory.UnitTest)]
        [TestCategory(SmokeTestCategory.NonSmoke)]
        [TestCategory(TenantTypeCategory.DevFabric), TestCategory(TenantTypeCategory.Cloud)]
        public async Task CloudFileShareRegionalSetMetadataAsync()
        {
#if ASPNET_K
            //CultureInfo currentCulture = CultureInfo.CurrentCulture;
            //CultureInfo.CurrentCulture = new CultureInfo("sk-SK");
#else
            string currentPrimaryLanguage = ApplicationLanguages.PrimaryLanguageOverride;
            ApplicationLanguages.PrimaryLanguageOverride = "sk-SK";
#endif

            CloudFileShare share = GetRandomShareReference();
            try
            {
                share.Metadata.Add("sequence", "value");
                share.Metadata.Add("schema", "value");
                await share.CreateAsync();
            }
            finally
            {
#if ASPNET_K
                //CultureInfo.CurrentCulture = currentCulture;
#else
                ApplicationLanguages.PrimaryLanguageOverride = currentPrimaryLanguage;
#endif
                share.DeleteIfExistsAsync().Wait();
            }
        }

        [TestMethod]
        [Description("List files")]
        [TestCategory(ComponentCategory.File)]
        [TestCategory(TestTypeCategory.UnitTest)]
        [TestCategory(SmokeTestCategory.NonSmoke)]
        [TestCategory(TenantTypeCategory.DevFabric), TestCategory(TenantTypeCategory.Cloud)]
        public async Task CloudFileShareListFilesAndDirectoriesAsync()
        {
            CloudFileShare share = GetRandomShareReference();
            try
            {
                await share.CreateAsync();
                List<string> fileNames = await CreateFilesAsync(share, 3);
                CloudFileDirectory rootDirectory = share.GetRootDirectoryReference();

                IEnumerable<IListFileItem> results = await ListFilesAndDirectoriesAsync(rootDirectory, null, null, null);
                Assert.AreEqual(fileNames.Count, results.Count());
                foreach (IListFileItem fileItem in results)
                {
                    Assert.IsInstanceOfType(fileItem, typeof(CloudFile));
                    Assert.IsTrue(fileNames.Remove(((CloudFile)fileItem).Name));
                }
            }
            finally
            {
                share.DeleteIfExistsAsync().Wait();
            }
        }

        [TestMethod]
        [Description("List files")]
        [TestCategory(ComponentCategory.File)]
        [TestCategory(TestTypeCategory.UnitTest)]
        [TestCategory(SmokeTestCategory.NonSmoke)]
        [TestCategory(TenantTypeCategory.DevFabric), TestCategory(TenantTypeCategory.Cloud)]
        public async Task CloudFileShareListFilesAndDirectoriesSegmentedAsync()
        {
            CloudFileShare share = GetRandomShareReference();
            try
            {
                await share.CreateAsync();
                List<string> fileNames = await CreateFilesAsync(share, 3);
                CloudFileDirectory rootDirectory = share.GetRootDirectoryReference();

                FileContinuationToken token = null;
                do
                {
                    FileResultSegment results = await rootDirectory.ListFilesAndDirectoriesSegmentedAsync(1, token, null, null);
                    int count = 0;
                    foreach (IListFileItem fileItem in results.Results)
                    {
                        Assert.IsInstanceOfType(fileItem, typeof(CloudFile));
                        Assert.IsTrue(fileNames.Remove(((CloudFile)fileItem).Name));
                        count++;
                    }
                    Assert.AreEqual(1, count);
                    token = results.ContinuationToken;
                }
                while (token != null);
                Assert.AreEqual(0, fileNames.Count);
            }
            finally
            {
                share.DeleteIfExistsAsync().Wait();
            }
        }

        [TestMethod]
        [Description("Set share permissions")]
        [TestCategory(ComponentCategory.File)]
        [TestCategory(TestTypeCategory.UnitTest)]
        [TestCategory(SmokeTestCategory.NonSmoke)]
        [TestCategory(TenantTypeCategory.DevStore), TestCategory(TenantTypeCategory.DevFabric), TestCategory(TenantTypeCategory.Cloud)]
        public async Task CloudFileShareSetPermissionsAsync()
        {
            CloudFileShare share = GetRandomShareReference();
            try
            {
                await share.CreateAsync();

                FileSharePermissions permissions = await share.GetPermissionsAsync();
                Assert.AreEqual(0, permissions.SharedAccessPolicies.Count);

                // We do not have precision at milliseconds level. Hence, we need
                // to recreate the start DateTime to be able to compare it later.
                DateTime start = DateTime.UtcNow;
                start = new DateTime(start.Year, start.Month, start.Day, start.Hour, start.Minute, start.Second, DateTimeKind.Utc);
                DateTime expiry = start.AddMinutes(30);

                permissions.SharedAccessPolicies.Add("key1", new SharedAccessFilePolicy()
                {
                    SharedAccessStartTime = start,
                    SharedAccessExpiryTime = expiry,
                    Permissions = SharedAccessFilePermissions.List,
                });
                await share.SetPermissionsAsync(permissions);
                await Task.Delay(30 * 1000);

                CloudFileShare share2 = share.ServiceClient.GetShareReference(share.Name);
                permissions = await share2.GetPermissionsAsync();
                Assert.AreEqual(1, permissions.SharedAccessPolicies.Count);
                Assert.IsTrue(permissions.SharedAccessPolicies["key1"].SharedAccessStartTime.HasValue);
                Assert.AreEqual(start, permissions.SharedAccessPolicies["key1"].SharedAccessStartTime.Value.UtcDateTime);
                Assert.IsTrue(permissions.SharedAccessPolicies["key1"].SharedAccessExpiryTime.HasValue);
                Assert.AreEqual(expiry, permissions.SharedAccessPolicies["key1"].SharedAccessExpiryTime.Value.UtcDateTime);
                Assert.AreEqual(SharedAccessFilePermissions.List, permissions.SharedAccessPolicies["key1"].Permissions);
            }
            finally
            {
                share.DeleteIfExistsAsync().Wait();
            }
        }

        [TestMethod]
        [Description("Set share permissions")]
        [TestCategory(ComponentCategory.File)]
        [TestCategory(TestTypeCategory.UnitTest)]
        [TestCategory(SmokeTestCategory.NonSmoke)]
        [TestCategory(TenantTypeCategory.DevStore), TestCategory(TenantTypeCategory.DevFabric), TestCategory(TenantTypeCategory.Cloud)]
        public async Task CloudFileShareSetPermissionsOverloadAsync()
        {
            CloudFileShare share = GetRandomShareReference();
            try
            {
                await share.CreateAsync();

                FileSharePermissions permissions = await share.GetPermissionsAsync();
                Assert.AreEqual(0, permissions.SharedAccessPolicies.Count);

                // We do not have precision at milliseconds level. Hence, we need
                // to recreate the start DateTime to be able to compare it later.
                DateTime start = DateTime.UtcNow;
                start = new DateTime(start.Year, start.Month, start.Day, start.Hour, start.Minute, start.Second, DateTimeKind.Utc);
                DateTime expiry = start.AddMinutes(30);

                KeyValuePair<String, SharedAccessFilePolicy> sharedAccessPolicy = new KeyValuePair<string, SharedAccessFilePolicy>("key1", new SharedAccessFilePolicy()
                {
                    SharedAccessStartTime = start,
                    SharedAccessExpiryTime = expiry,
                    Permissions = SharedAccessFilePermissions.List,
                });
                permissions.SharedAccessPolicies.Add(sharedAccessPolicy);
                await share.SetPermissionsAsync(permissions);
                await Task.Delay(30 * 1000);

                CloudFileShare share2 = share.ServiceClient.GetShareReference(share.Name);
                permissions = await share2.GetPermissionsAsync();
                Assert.AreEqual(1, permissions.SharedAccessPolicies.Count);
                Assert.IsTrue(permissions.SharedAccessPolicies["key1"].SharedAccessStartTime.HasValue);
                Assert.AreEqual(start, permissions.SharedAccessPolicies["key1"].SharedAccessStartTime.Value.UtcDateTime);
                Assert.IsTrue(permissions.SharedAccessPolicies["key1"].SharedAccessExpiryTime.HasValue);
                Assert.AreEqual(expiry, permissions.SharedAccessPolicies["key1"].SharedAccessExpiryTime.Value.UtcDateTime);
                Assert.AreEqual(SharedAccessFilePermissions.List, permissions.SharedAccessPolicies["key1"].Permissions);
            }
            finally
            {
                share.DeleteIfExistsAsync().Wait();
            }
        }

        [TestMethod]
        [Description("Clear share permissions")]
        [TestCategory(ComponentCategory.File)]
        [TestCategory(TestTypeCategory.UnitTest)]
        [TestCategory(SmokeTestCategory.NonSmoke)]
        [TestCategory(TenantTypeCategory.DevStore), TestCategory(TenantTypeCategory.DevFabric), TestCategory(TenantTypeCategory.Cloud)]
        public async Task CloudFileShareClearPermissionsAsync()
        {
            CloudFileShare share = GetRandomShareReference();
            try
            {
                await share.CreateAsync();

                FileSharePermissions permissions = await share.GetPermissionsAsync();
                Assert.AreEqual(0, permissions.SharedAccessPolicies.Count);

                // We do not have precision at milliseconds level. Hence, we need
                // to recreate the start DateTime to be able to compare it later.
                DateTime start = DateTime.UtcNow;
                start = new DateTime(start.Year, start.Month, start.Day, start.Hour, start.Minute, start.Second, DateTimeKind.Utc);
                DateTime expiry = start.AddMinutes(30);

                KeyValuePair<String, SharedAccessFilePolicy> sharedAccessPolicy = new KeyValuePair<string, SharedAccessFilePolicy>("key1", new SharedAccessFilePolicy()
                {
                    SharedAccessStartTime = start,
                    SharedAccessExpiryTime = expiry,
                    Permissions = SharedAccessFilePermissions.List,
                });

                permissions.SharedAccessPolicies.Add(sharedAccessPolicy);
                await share.SetPermissionsAsync(permissions);
                await Task.Delay(3 * 1000);
                Assert.AreEqual(1, permissions.SharedAccessPolicies.Count);

                Assert.AreEqual(true, permissions.SharedAccessPolicies.Contains(sharedAccessPolicy));
                Assert.AreEqual(true, permissions.SharedAccessPolicies.ContainsKey("key1"));
                permissions.SharedAccessPolicies.Clear();
                await share.SetPermissionsAsync(permissions);
                await Task.Delay(3 * 1000);
                permissions = await share.GetPermissionsAsync();
                Assert.AreEqual(0, permissions.SharedAccessPolicies.Count);
            }
            finally
            {
                share.DeleteIfExistsAsync().Wait();
            }
        }

        [TestMethod]
        [Description("Copy share permissions")]
        [TestCategory(ComponentCategory.File)]
        [TestCategory(TestTypeCategory.UnitTest)]
        [TestCategory(SmokeTestCategory.NonSmoke)]
        [TestCategory(TenantTypeCategory.DevStore), TestCategory(TenantTypeCategory.DevFabric), TestCategory(TenantTypeCategory.Cloud)]
        public async Task CloudFileShareCopyPermissionsAsync()
        {
            CloudFileShare share = GetRandomShareReference();
            try
            {
                await share.CreateAsync();

                FileSharePermissions permissions = await share.GetPermissionsAsync();
                Assert.AreEqual(0, permissions.SharedAccessPolicies.Count);

                // We do not have precision at milliseconds level. Hence, we need
                // to recreate the start DateTime to be able to compare it later.
                DateTime start = DateTime.UtcNow;
                start = new DateTime(start.Year, start.Month, start.Day, start.Hour, start.Minute, start.Second, DateTimeKind.Utc);
                DateTime expiry = start.AddMinutes(30);

                KeyValuePair<String, SharedAccessFilePolicy> sharedAccessPolicy = new KeyValuePair<string, SharedAccessFilePolicy>("key1", new SharedAccessFilePolicy()
                {
                    SharedAccessStartTime = start,
                    SharedAccessExpiryTime = expiry,
                    Permissions = SharedAccessFilePermissions.List,
                });

                DateTime start2 = DateTime.UtcNow;
                start2 = new DateTime(start.Year, start.Month, start.Day, start.Hour, start.Minute, start.Second, DateTimeKind.Utc);
                DateTime expiry2 = start.AddMinutes(30);
                KeyValuePair<String, SharedAccessFilePolicy> sharedAccessPolicy2 = new KeyValuePair<string, SharedAccessFilePolicy>("key2", new SharedAccessFilePolicy()
                {
                    SharedAccessStartTime = start2,
                    SharedAccessExpiryTime = expiry2,
                    Permissions = SharedAccessFilePermissions.List,
                });
                permissions.SharedAccessPolicies.Add(sharedAccessPolicy);
                permissions.SharedAccessPolicies.Add(sharedAccessPolicy2);

                KeyValuePair<String, SharedAccessFilePolicy>[] sharedAccessPolicyArray = new KeyValuePair<string, SharedAccessFilePolicy>[2];
                permissions.SharedAccessPolicies.CopyTo(sharedAccessPolicyArray, 0);
                Assert.AreEqual(2, sharedAccessPolicyArray.Length);
                Assert.AreEqual(sharedAccessPolicy, sharedAccessPolicyArray[0]);
                Assert.AreEqual(sharedAccessPolicy2, sharedAccessPolicyArray[1]);
            }
            finally
            {
                share.DeleteIfExistsAsync().Wait();
            }
        }

        [TestMethod]
        [Description("Remove share permissions")]
        [TestCategory(ComponentCategory.File)]
        [TestCategory(TestTypeCategory.UnitTest)]
        [TestCategory(SmokeTestCategory.NonSmoke)]
        [TestCategory(TenantTypeCategory.DevStore), TestCategory(TenantTypeCategory.DevFabric), TestCategory(TenantTypeCategory.Cloud)]
        public async Task CloudFileShareRemovePermissionsAsync()
        {
            CloudFileShare share = GetRandomShareReference();
            try
            {
                await share.CreateAsync();

                FileSharePermissions permissions = await share.GetPermissionsAsync();
                Assert.AreEqual(0, permissions.SharedAccessPolicies.Count);

                // We do not have precision at milliseconds level. Hence, we need
                // to recreate the start DateTime to be able to compare it later.
                DateTime start = DateTime.UtcNow;
                start = new DateTime(start.Year, start.Month, start.Day, start.Hour, start.Minute, start.Second, DateTimeKind.Utc);
                DateTime expiry = start.AddMinutes(30);

                KeyValuePair<String, SharedAccessFilePolicy> sharedAccessPolicy = new KeyValuePair<string, SharedAccessFilePolicy>("key1", new SharedAccessFilePolicy()
                {
                    SharedAccessStartTime = start,
                    SharedAccessExpiryTime = expiry,
                    Permissions = SharedAccessFilePermissions.List,
                });

                DateTime start2 = DateTime.UtcNow;
                start2 = new DateTime(start2.Year, start2.Month, start2.Day, start2.Hour, start2.Minute, start2.Second, DateTimeKind.Utc);
                DateTime expiry2 = start2.AddMinutes(30);
                KeyValuePair<String, SharedAccessFilePolicy> sharedAccessPolicy2 = new KeyValuePair<string, SharedAccessFilePolicy>("key2", new SharedAccessFilePolicy()
                {
                    SharedAccessStartTime = start2,
                    SharedAccessExpiryTime = expiry2,
                    Permissions = SharedAccessFilePermissions.List,
                });
                permissions.SharedAccessPolicies.Add(sharedAccessPolicy);
                permissions.SharedAccessPolicies.Add(sharedAccessPolicy2);
                await share.SetPermissionsAsync(permissions);
                Assert.AreEqual(2, permissions.SharedAccessPolicies.Count);

                permissions.SharedAccessPolicies.Remove(sharedAccessPolicy2);
                await share.SetPermissionsAsync(permissions);
                await Task.Delay(3 * 1000);

                Assert.AreEqual(1, permissions.SharedAccessPolicies.Count);
                permissions = await share.GetPermissionsAsync();
                Assert.AreEqual(1, permissions.SharedAccessPolicies.Count);
                Assert.AreEqual(sharedAccessPolicy.Key, permissions.SharedAccessPolicies.ElementAt(0).Key);
                Assert.AreEqual(sharedAccessPolicy.Value.Permissions, permissions.SharedAccessPolicies.ElementAt(0).Value.Permissions);
                Assert.AreEqual(sharedAccessPolicy.Value.SharedAccessStartTime, permissions.SharedAccessPolicies.ElementAt(0).Value.SharedAccessStartTime);
                Assert.AreEqual(sharedAccessPolicy.Value.SharedAccessExpiryTime, permissions.SharedAccessPolicies.ElementAt(0).Value.SharedAccessExpiryTime);

                permissions.SharedAccessPolicies.Add(sharedAccessPolicy2);
                await share.SetPermissionsAsync(permissions);
                Assert.AreEqual(2, permissions.SharedAccessPolicies.Count);

                permissions.SharedAccessPolicies.Remove("key2");
                await share.SetPermissionsAsync(permissions);
                Assert.AreEqual(1, permissions.SharedAccessPolicies.Count);
                permissions = await share.GetPermissionsAsync();
                Assert.AreEqual(1, permissions.SharedAccessPolicies.Count);
                Assert.AreEqual(sharedAccessPolicy.Key, permissions.SharedAccessPolicies.ElementAt(0).Key);
                Assert.AreEqual(sharedAccessPolicy.Value.Permissions, permissions.SharedAccessPolicies.ElementAt(0).Value.Permissions);
                Assert.AreEqual(sharedAccessPolicy.Value.SharedAccessStartTime, permissions.SharedAccessPolicies.ElementAt(0).Value.SharedAccessStartTime);
                Assert.AreEqual(sharedAccessPolicy.Value.SharedAccessExpiryTime, permissions.SharedAccessPolicies.ElementAt(0).Value.SharedAccessExpiryTime);
            }
            finally
            {
                share.DeleteIfExistsAsync().Wait();
            }
        }

        [TestMethod]
        [Description("TryGetValue for share permissions")]
        [TestCategory(ComponentCategory.File)]
        [TestCategory(TestTypeCategory.UnitTest)]
        [TestCategory(SmokeTestCategory.NonSmoke)]
        [TestCategory(TenantTypeCategory.DevStore), TestCategory(TenantTypeCategory.DevFabric), TestCategory(TenantTypeCategory.Cloud)]
        public async Task CloudFileShareTryGetValuePermissions()
        {
            CloudFileShare share = GetRandomShareReference();
            try
            {
                await share.CreateAsync();

                FileSharePermissions permissions = await share.GetPermissionsAsync();
                Assert.AreEqual(0, permissions.SharedAccessPolicies.Count);

                // We do not have precision at milliseconds level. Hence, we need
                // to recreate the start DateTime to be able to compare it later.
                DateTime start = DateTime.UtcNow;
                start = new DateTime(start.Year, start.Month, start.Day, start.Hour, start.Minute, start.Second, DateTimeKind.Utc);
                DateTime expiry = start.AddMinutes(30);

                KeyValuePair<String, SharedAccessFilePolicy> sharedAccessPolicy = new KeyValuePair<string, SharedAccessFilePolicy>("key1", new SharedAccessFilePolicy()
                {
                    SharedAccessStartTime = start,
                    SharedAccessExpiryTime = expiry,
                    Permissions = SharedAccessFilePermissions.List,
                });

                DateTime start2 = DateTime.UtcNow;
                start2 = new DateTime(start2.Year, start2.Month, start2.Day, start2.Hour, start2.Minute, start2.Second, DateTimeKind.Utc);
                DateTime expiry2 = start2.AddMinutes(30);
                KeyValuePair<String, SharedAccessFilePolicy> sharedAccessPolicy2 = new KeyValuePair<string, SharedAccessFilePolicy>("key2", new SharedAccessFilePolicy()
                {
                    SharedAccessStartTime = start2,
                    SharedAccessExpiryTime = expiry2,
                    Permissions = SharedAccessFilePermissions.List,
                });
                permissions.SharedAccessPolicies.Add(sharedAccessPolicy);
                permissions.SharedAccessPolicies.Add(sharedAccessPolicy2);
                await share.SetPermissionsAsync(permissions);
                await Task.Delay(3 * 1000);
                Assert.AreEqual(2, permissions.SharedAccessPolicies.Count);

                permissions = await share.GetPermissionsAsync();
                SharedAccessFilePolicy retrPolicy;
                permissions.SharedAccessPolicies.TryGetValue("key1", out retrPolicy);
                Assert.AreEqual(sharedAccessPolicy.Value.Permissions, retrPolicy.Permissions);
                Assert.AreEqual(sharedAccessPolicy.Value.SharedAccessStartTime, retrPolicy.SharedAccessStartTime);
                Assert.AreEqual(sharedAccessPolicy.Value.SharedAccessExpiryTime, retrPolicy.SharedAccessExpiryTime);

                SharedAccessFilePolicy retrPolicy2;
                permissions.SharedAccessPolicies.TryGetValue("key2", out retrPolicy2);
                Assert.AreEqual(sharedAccessPolicy2.Value.Permissions, retrPolicy2.Permissions);
                Assert.AreEqual(sharedAccessPolicy2.Value.SharedAccessStartTime, retrPolicy2.SharedAccessStartTime);
                Assert.AreEqual(sharedAccessPolicy2.Value.SharedAccessExpiryTime, retrPolicy2.SharedAccessExpiryTime);
            }
            finally
            {
                share.DeleteIfExistsAsync().Wait();
            }
        }

        [TestMethod]
        [Description("GetEnumerator for share permissions")]
        [TestCategory(ComponentCategory.File)]
        [TestCategory(TestTypeCategory.UnitTest)]
        [TestCategory(SmokeTestCategory.NonSmoke)]
        [TestCategory(TenantTypeCategory.DevStore), TestCategory(TenantTypeCategory.DevFabric), TestCategory(TenantTypeCategory.Cloud)]
        public async Task CloudFileShareGetEnumeratorPermissionsAsync()
        {
            CloudFileShare share = GetRandomShareReference();
            try
            {
                await share.CreateAsync();

                FileSharePermissions permissions = await share.GetPermissionsAsync();
                Assert.AreEqual(0, permissions.SharedAccessPolicies.Count);

                // We do not have precision at milliseconds level. Hence, we need
                // to recreate the start DateTime to be able to compare it later.
                DateTime start = DateTime.UtcNow;
                start = new DateTime(start.Year, start.Month, start.Day, start.Hour, start.Minute, start.Second, DateTimeKind.Utc);
                DateTime expiry = start.AddMinutes(30);

                KeyValuePair<String, SharedAccessFilePolicy> sharedAccessPolicy = new KeyValuePair<string, SharedAccessFilePolicy>("key1", new SharedAccessFilePolicy()
                {
                    SharedAccessStartTime = start,
                    SharedAccessExpiryTime = expiry,
                    Permissions = SharedAccessFilePermissions.List,
                });

                DateTime start2 = DateTime.UtcNow;
                start2 = new DateTime(start2.Year, start2.Month, start2.Day, start2.Hour, start2.Minute, start2.Second, DateTimeKind.Utc);
                DateTime expiry2 = start2.AddMinutes(30);
                KeyValuePair<String, SharedAccessFilePolicy> sharedAccessPolicy2 = new KeyValuePair<string, SharedAccessFilePolicy>("key2", new SharedAccessFilePolicy()
                {
                    SharedAccessStartTime = start2,
                    SharedAccessExpiryTime = expiry2,
                    Permissions = SharedAccessFilePermissions.List,
                });
                permissions.SharedAccessPolicies.Add(sharedAccessPolicy);
                permissions.SharedAccessPolicies.Add(sharedAccessPolicy2);
                Assert.AreEqual(2, permissions.SharedAccessPolicies.Count);

                IEnumerator<KeyValuePair<string, SharedAccessFilePolicy>> policies = permissions.SharedAccessPolicies.GetEnumerator();
                policies.MoveNext();
                Assert.AreEqual(sharedAccessPolicy, policies.Current);
                policies.MoveNext();
                Assert.AreEqual(sharedAccessPolicy2, policies.Current);
            }
            finally
            {
                share.DeleteIfExistsAsync().Wait();
            }
        }

        [TestMethod]
        [Description("GetValues for share permissions")]
        [TestCategory(ComponentCategory.File)]
        [TestCategory(TestTypeCategory.UnitTest)]
        [TestCategory(SmokeTestCategory.NonSmoke)]
        [TestCategory(TenantTypeCategory.DevStore), TestCategory(TenantTypeCategory.DevFabric), TestCategory(TenantTypeCategory.Cloud)]
        public async Task CloudFileShareGetValuesPermissionsAsync()
        {
            CloudFileShare share = GetRandomShareReference();
            try
            {
                await share.CreateAsync();

                FileSharePermissions permissions = await share.GetPermissionsAsync();
                Assert.AreEqual(0, permissions.SharedAccessPolicies.Count);

                // We do not have precision at milliseconds level. Hence, we need
                // to recreate the start DateTime to be able to compare it later.
                DateTime start = DateTime.UtcNow;
                start = new DateTime(start.Year, start.Month, start.Day, start.Hour, start.Minute, start.Second, DateTimeKind.Utc);
                DateTime expiry = start.AddMinutes(30);

                KeyValuePair<String, SharedAccessFilePolicy> sharedAccessPolicy = new KeyValuePair<string, SharedAccessFilePolicy>("key1", new SharedAccessFilePolicy()
                {
                    SharedAccessStartTime = start,
                    SharedAccessExpiryTime = expiry,
                    Permissions = SharedAccessFilePermissions.List,
                });

                DateTime start2 = DateTime.UtcNow;
                start2 = new DateTime(start2.Year, start2.Month, start2.Day, start2.Hour, start2.Minute, start2.Second, DateTimeKind.Utc);
                DateTime expiry2 = start2.AddMinutes(30);
                KeyValuePair<String, SharedAccessFilePolicy> sharedAccessPolicy2 = new KeyValuePair<string, SharedAccessFilePolicy>("key2", new SharedAccessFilePolicy()
                {
                    SharedAccessStartTime = start2,
                    SharedAccessExpiryTime = expiry2,
                    Permissions = SharedAccessFilePermissions.List,
                });
                permissions.SharedAccessPolicies.Add(sharedAccessPolicy);
                permissions.SharedAccessPolicies.Add(sharedAccessPolicy2);
                Assert.AreEqual(2, permissions.SharedAccessPolicies.Count);

                ICollection<SharedAccessFilePolicy> values = permissions.SharedAccessPolicies.Values;
                Assert.AreEqual(2, values.Count);
                Assert.AreEqual(sharedAccessPolicy.Value, values.ElementAt(0));
                Assert.AreEqual(sharedAccessPolicy2.Value, values.ElementAt(1));
            }
            finally
            {
                share.DeleteIfExistsAsync().Wait();
            }
        }

        [TestMethod]
        [Description("Get permissions from string")]
        [TestCategory(ComponentCategory.File)]
        [TestCategory(TestTypeCategory.UnitTest)]
        [TestCategory(SmokeTestCategory.NonSmoke)]
        [TestCategory(TenantTypeCategory.DevStore), TestCategory(TenantTypeCategory.DevFabric), TestCategory(TenantTypeCategory.Cloud)]
        public void CloudFileSharePermissionsFromStringAsync()
        {
            SharedAccessFilePolicy policy = new SharedAccessFilePolicy();
            policy.SharedAccessStartTime = DateTime.UtcNow;
            policy.SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(30);

            policy.Permissions = SharedAccessFilePolicy.PermissionsFromString("rwdl");
            Assert.AreEqual(SharedAccessFilePermissions.Read | SharedAccessFilePermissions.Write | SharedAccessFilePermissions.Delete | SharedAccessFilePermissions.List, policy.Permissions);

            policy.Permissions = SharedAccessFilePolicy.PermissionsFromString("rwl");
            Assert.AreEqual(SharedAccessFilePermissions.Read | SharedAccessFilePermissions.Write | SharedAccessFilePermissions.List, policy.Permissions);

            policy.Permissions = SharedAccessFilePolicy.PermissionsFromString("rw");
            Assert.AreEqual(SharedAccessFilePermissions.Read | SharedAccessFilePermissions.Write, policy.Permissions);

            policy.Permissions = SharedAccessFilePolicy.PermissionsFromString("rd");
            Assert.AreEqual(SharedAccessFilePermissions.Read | SharedAccessFilePermissions.Delete, policy.Permissions);

            policy.Permissions = SharedAccessFilePolicy.PermissionsFromString("wl");
            Assert.AreEqual(SharedAccessFilePermissions.Write | SharedAccessFilePermissions.List, policy.Permissions);

            policy.Permissions = SharedAccessFilePolicy.PermissionsFromString("w");
            Assert.AreEqual(SharedAccessFilePermissions.Write, policy.Permissions);
        }

        /*
        [TestMethod]
        [Description("Test conditional access on a share")]
        [TestCategory(ComponentCategory.File)]
        [TestCategory(TestTypeCategory.UnitTest)]
        [TestCategory(SmokeTestCategory.NonSmoke)]
        [TestCategory(TenantTypeCategory.DevFabric), TestCategory(TenantTypeCategory.Cloud)]
        public async Task CloudFileShareConditionalAccessAsync()
        {
            OperationContext operationContext = new OperationContext();
            CloudFileShare share = GetRandomShareReference();
            try
            {
                await share.CreateAsync();
                await share.FetchAttributesAsync();

                string currentETag = share.Properties.ETag;
                DateTimeOffset currentModifiedTime = share.Properties.LastModified.Value;

                // ETag conditional tests
                share.Metadata["ETagConditionalName"] = "ETagConditionalValue";
                await share.SetMetadataAsync();

                await share.FetchAttributesAsync();
                string newETag = share.Properties.ETag;
                Assert.AreNotEqual(newETag, currentETag, "ETage should be modified on write metadata");

                // LastModifiedTime tests
                currentModifiedTime = share.Properties.LastModified.Value;

                share.Metadata["DateConditionalName"] = "DateConditionalValue";

                await TestHelper.ExpectedExceptionAsync(
                    async () => await share.SetMetadataAsync(AccessCondition.GenerateIfModifiedSinceCondition(currentModifiedTime), null, operationContext),
                    operationContext,
                    "IfModifiedSince conditional on current modified time should throw",
                    HttpStatusCode.PreconditionFailed,
                    "ConditionNotMet");

                share.Metadata["DateConditionalName"] = "DateConditionalValue2";
                currentETag = share.Properties.ETag;

                DateTimeOffset pastTime = currentModifiedTime.Subtract(TimeSpan.FromMinutes(5));
                await share.SetMetadataAsync(AccessCondition.GenerateIfModifiedSinceCondition(pastTime), null, null);

                pastTime = currentModifiedTime.Subtract(TimeSpan.FromHours(5));
                await share.SetMetadataAsync(AccessCondition.GenerateIfModifiedSinceCondition(pastTime), null, null);

                pastTime = currentModifiedTime.Subtract(TimeSpan.FromDays(5));
                await share.SetMetadataAsync(AccessCondition.GenerateIfModifiedSinceCondition(pastTime), null, null);

                await share.FetchAttributesAsync();
                newETag = share.Properties.ETag;
                Assert.AreNotEqual(newETag, currentETag, "ETage should be modified on write metadata");
            }
            finally
            {
                share.DeleteIfExistsAsync().Wait();
            }
        }
        */
    }
}


text:
Q: How do I make a POST request from within a django function to rest api? I have xyz.py file. In this file I have a function
@api_view(['POST'])
def abc(request):

which can be accessible at a url, say /algorithms/abc.
I have another function
def pkr():

I want to make POST request from this function to abc(request). I tried
requests.request('POST', "/algorithms/abc", data=data_input) but the request.data at abc(request) is received as QueryDict (& not dict) & looses some texts that existed in data_input inside pkr() function.

A: Just to clarify what @Daniel_Roseman and @Hugo_Luis_Villalobos_Canto is saying in comment.
We can abstract (refactor out) the logic to process the data in some separate function and then re-use the same function at both places by passing data to it.
Something like this :
def process_data(data):
    # process your data here
    print(data)

@api_view(['POST'])
def abc(request):
    data = request.POST
    process_data(data)

def pkr():
    process_data(data)

redpajama_set_name: RedPajamaStackExchange


Discussion in 'Auto News' started by ProjectWHaT, Apr 16, 2019.
"The Type 130 will be the most dynamically accomplished Lotus in our history," said CEO Phil Popham. "It marks a turning point for our brand and is a showcase of what we are capable of and what is to come from Lotus."
NNnnnnot what i was expecting... Hope it turns out awesome.
They're going to take Hennessey Venoms and put the Lotus badges back in them.
Heldenzeit, SecretAgentZero, Carbon_6 and 7 others like this.
The Chosen One, YukinoSuzuka and OJT6627 like this.
Exactly. Unless this "cross over" is just an Exige with a lift kit, it's gonna be a huge waste of time imho. But who knows, these dumb crossover things sell like hotcakes at Ihop on international pancake day.
sick of electric already and its kinda just getting started, wheres my flippin 8.0 litre twin turbo v12's????????
If you want something like that you should buy it now... because it's in the rear view mirror.
Well, for me as a Lotus driver and fan, it's also not the way I want to see Lotus is going, but I guess they have to and this far Geely is offering them a lot of space to invest and progress to increase production and ambitions.
And like the SUV, which would be a SUV based on the polsestar chassis I guess, will be a car under the 2 tonne (lightest sports utility vehicle) and they won't produce the car unless it would be the fastest suv on the Nurburgring. That's what I remember from the factory tour my husband and I got one year ago. We also spotted a glimpse of an Evora spider and it's about time they are going to release ideas about the next generation Elises and Exiges.
I, personally, would much rather see Lotus use their expertise to make a lightweight, accessible electric sports car.
Thought experiment: Telsa's 85kwh battery pack weighs 1200lbs and the car itself weighs 4200lbs. It has a range of 250 miles, roughly.
The Lotus Elise weights about 2000lbs. Let's say Lotus is able to make a 42.5kwh battery pack that weighs 600lbs. Fluffing the numbers a bit because electric drivetrains are a little lighter than ICE + Accessories, lets say Lotus was able to make a 2500lbs electric car, based on the Elise. That's a good start.
How much electricity would this setup use? Per this calculator and specs I've found on the internet, the Elise has a 0.4Cd (not great) and 1.6m^2 frontal area. Substituting our 2500lbs version, that equates to about 17hp needed to maintain 65mph, steady state. 17hp = 12,700 watts. So if we take a 190v system (half of the P85, again) and 12,700 watts, we end up with a ~67 amp current draw at 65mph. This equates to roughly 195wh/mi electricty usage if you aren't caning it. With our 600lbs, 42.5kwh battery, that would give a maximum range of just shy of 220 miles. Maybe not good for a big sedan, but seemingly perfect for a 'lightweight' sports car. Obviously if you are caning it, it wouldn't go nearly as far.
V x A = watts. If we benchmark Tesla, again, the P100D ludicrous has a maximum current draw of 1600amps. If we apply that to our fictional Lotus, it would be: 190v x 1600a = 300kw = 400hp. 400hp in a 2500lbs car sounds pretty awesome to me.


When we established We The People, we adopted a singular purpose for our studio; to create, inspire and impact the world around us. A big task, sure. But nonetheless, a mantra which we strive towards every day.
It lead us to set out four key values which define how we do, what we do. Because we care about the people we are.
We adopt a mindset of loyal partner, acting with integrity and respect to collaboratively deliver value. We honour the confidence placed in us by our partners.
We swear to a process of constantly asking 'what's next?' We creatively pursue shaping the future our way for the better.
We believe in people. We believe that the greatest results come when diverse minds think together. We value our relationships with our partners, suppliers and each other, above all else.
We are fiercely passionate about what we do and vigorously chase the very best. We exist to make an impact and aren't afraid to be loud about it.


Students typically have a hard time trying to write an admission essay. For one, it is difficult, and also, they generally have no prior experience in writing it. That's why they need assistance from professionals. Paying a nominal fee for a high-quality essay is not a bad deal, especially when it can have a decisive impact on your future.
We offer custom admission essay writing help. We've been in the industry for more than 5 years. Working hard and doing our best, we've managed to successfully get together a team of expert writers who are highly qualified in more than 40 fields. Ever since our inception, they've worked tirelessly to help thousands of students get accepted in the program and college of their dreams.
We only write original essays, fully complying to the customers' requirements, and submit it within the deadline, all at a very reasonable price. The order placement process is very simple. Timely delivery, free unlimited revisions, original content, and your 24/7 access to us is guaranteed. Our testimonials serve as proof of the quality of our service. Its time you allow us to make you a happy customer too.
You need assistance, but you may be skeptical about using the services of an online writing company. We know its hard to entrust somebody with such an important piece of writing as your college admission essay. You don't want to take any chances with it knowing that if it goes wrong, it can jeopardize your whole application. But on a positive note, if it goes right, which it will if you let us write it, it can get you enrolled.
Do you think you can write it yourself? Quite possibly, you have no prior experience of it. Agreed that you wrote a lot of articles during your high-school; some on the benefits of exercise, and others on flora and fauna, but you probably never had to write an admission essay. Students typically need it after high-school when they are applying to a college. It is a fundamental requirement of the application process. Lack of training in it puts you in difficulty because you don't know what's the right structure and content to choose.
If you tend to ask your friends or peers or use different sources for consultation, they give their personal opinions on how it should be. Their views can be right or wrong; you can only tell after trying and finding out whether your application was accepted or rejected. Better not take anybody's advice regarding your admission essay until you are sure of their capability. You need assistance from the best admission essay writing service like ours that has been in this business for years.
There is so much to share in an admission essay to convince the review committee of your eligibility for the program, but what to share, and what to leave, you can't know if you don't have experience of writing it. Plus, the essay has to be very strong academically. It has to be totally free of all sorts of errors of grammar, sentence construction, punctuation, spelling, and formatting. Another very important requirement of colleges is to get the essay written in the required standard of language. So an admission essay for an Australian college has to be written in the Australian English standard. You may not be well-versed in it if you are an American or a British citizen. You may even have a lot of difficulties proofreading your essay. Every time you go through the essay, you may become more confused whether the ideas you discussed were worth sharing or not.
The solution to all these challenges is a professional writing service that deals in admission essays. That's exactly what we do. Unlike other online companies that deal in all sorts of writing projects ranging from building resumes to dissertations, blogs, and articles, we only do admission essays. It makes sense to think that a company that just deals in one kind of work is better for such a project as compared to another company that deals in all sorts of assignments.
In addition to that, our writers are diversely qualified, and we verified their qualification, skills, and experiences. Our mechanism of hiring a writer is very strong and complex. We check writers on several levels before allowing them the opportunity to join our prestigious organization. They have written countless admission essays in their years of service and hence have become very proficient and skilled in it.
Place the instructions for your essay.
Yes, it's all that easy. You place the instructions for the writer using the order form. Some of the things you should consider putting in the instructions include the name of the program as well as college of your choice, the number of words you want in the essay, formatting style, and also your personal details that are relevant to the program. For example, you should tell us of your achievements, aspirations, and goals, volunteering work, hobbies, and education. In case the relevant information is on an account in some website that the writer needs to access, don't forget to provide the login details along with the URL, else access to the account may be denied by the website host.
The more you tell about yourself, the better because this will help the writer synthesize a story using your details. Accordingly, the essay that is produced will perfectly apply to you. After this, you make the payment. Transfer the fee using our safe and secure channels of payment. They include Visa, MasterCard, or PayPal.
Just do this, and your order gets placed. Now starts our job. We instantly assign your order to the writer who is most suitable for the job. The eligibility is determined based on the name of the program and the education, skills, and experience of the writer. We tend to assign the task to somebody who is formally educated in the program you are applying for. This helps us ensure that the essay will carry the depth of knowledge related to that program and contains all the details that can be of interest to the admission board.
After you are done with this process, we advise you to log into your account as frequently as possible. Your writer may leave you a message asking you some question if he/she wants some clarification on the instructions or requires some more details from you. Your timely response will help to complete the task within the deadline.
We commit to you that your essay will be delivered by your deadline. In fact, you may even get it earlier. If that doesn't happen, it won't be later than the time-limit you set in any case.
All content of your paper will be original and written from scratch. It won't be copied from any outside source.
You will be able to get your essay revised, just in case you wanted to, completely free of cost and for unlimited times as long as you ask for revision within a period of 2 weeks after the first deadline.
We won't share your details with any outside person or agency. Also, your work will not be submitted to any other client after you.
You will be able to contact us at any time you want. We remain online for our customers 24/7. You can reach us via live chat or phone.
So what are you waiting for? Place your order now and finally forget about worries.


Thank you for submitting your information. If we have a position available that matches your job specification, we will be in touch with you. If you require any assistance, please email enquiry-bb@rentokil-initial.com.


The New South Wales Under 18s, led by captain and Rabbitohs player Cameron Murray, have hammered the Queensland Under 18s 26 points to nil in the curtain raiser to Origin II at Suncorp Stadium tonight (Wednesday).
The Young Blues scored six tries to nil in a dominant performance.
There were a few familiar faces amongst both teams with NSW fielding three Rabbitohs in captain Murray, prop Emre Guler and replacement forward Keaon Koloamatangi. The yellow short trainers for both sides were also familiar to Rabbitohs Members and supporters with Matt King running water for NSW and Michael Crocker doing the same for Queensland.
Queensland knocked the ball on from the kick off which gave the New South Welshmen the perfect opportunity to post early points. The Young Blues took that opportunity with winger Zac Lomax scoring on the first tackle from the ensuing scrum in the right corner.
The Blues followed up their first effort with a second try in the tenth minute, when winger Isaac Lumelume tapped back a bomb to back rower Samuel Radovu to give NSW an eight-point lead.
Both sides made errors for the rest of the half which saw attacking opportunities go begging, but NSW would cross for their third try in the 39th minute when centre Tui Afualo crossed following a Lumelume break down the left hand touchline.
Halfback Sean O'Sullivan missed all three conversion attempts in the opening 40 minutes, seeing the New South Welshmen lead 12-nil at the half time break.
Captain Murray tackled everything that moved in the first half, cutting down attackers by tackling around the legs. Guler was also making good metres in the middle.
Zac Lomax crossed for the first try of the second half and his second try of the match, dragging in a bomb with a one handed catch, extending the Blues' lead to 16-nil early in the second stanza.
Cameron Murray would set up the next try for the Young Blues, making a bust down the left hand side of the field then putting fullback Ryan Papenhuyzen away under the posts. Lomax kicked the first conversion of the night to give NSW a 22-nil lead.
The Blues extended their lead to 26 points in the 65th minute when Lumelume crossed in the left corner, capping off a dominant performance from the boys in blue.
Murray led from the front, leading the defensive effort for the Young Blues. Guler made good metres with the ball in hand and Koloamatangi made a good contribution to the team with his game time.
Rabbitohs Members and supporters can now look forward to seeing Murray and Koloamatangi continue their development in the Rabbitohs' under 20s outfit throughout the remainder of 2016.


The project of the day was converting more of my music from analog media (cassettes and vinyl) to digital bits. It's an admittedly huge task, given the size of my music collection, so perhaps that's why I've been jumping from one thing to the next without any real plan -- some live in-studio performances by Boston bands taped off the radio, one of my old radio shows, live concert recordings I made (specifically, a 1992 Sebadoh/Luna concert at CBGB's).
The cassettes led me back to the vinyl in that I dug out a couple of particularly great mix tapes circa 1995 that I decided to replicate in my iPod... tapes which contain lots of songs originally from 7" singles or other vinyl. So there's a queue of about fifteen records sitting by the turntable that have been cleaned and are ready to be ripped.
-- It would be much easier to have the computer and the turntable in the same room, if only because the constant scooting back and forth to drop the needle / click the record button / lift the needle / click the stop button gets pretty old pretty fast.
-- It's better to set the input levels extremely low then overshoot the peak level and get nasty digital distortion.
-- Amadeus II is a pretty good shareware sound editor for Mac OS X, though I must admit I still miss using CoolEdit back when I had a PC.
-- I'm going to need to get one of those programs that fixes background noise and crackles from vinyl recordings. Even though I cleaned each record with my vacuum-cleaning machine before playing, some of my old punk/post-punk records in particular are just a bit too worn (or were pressed on lousy quality vinyl to begin with).
-- Even though it's been extremely slow going, this stuff is a lot easier than I thought it would be, thanks in large part to my iMic for USB audio input/output.


Do you want to know the unspoken conversations around you when visiting other countries? Are you someone who likes to travel on your own terms--from finding that special restaurant to negotiating a better price for a prized antique in a local flea market? If so, Decoding China is the hands-on communication guide for you!
Decoding China will teach you the basic "rules of the road" on how to operate in Chinese culture. Like every country, China has its own unique set of cultural "codes," ways of behaving on a daily basis that all Chinese automatically know. These codes frame every personal interaction in China. By learning to recognize these key words and phrases--and use them correctly--everything you do in China will go a lot more smoothly.
In practical chapters organized by topic, Dr. Christensen shows you how to get things done in China, even with very minimal knowledge of the language. Make your China experience work for, rather than against you with "Decoding China."
Dr. Matthew B. Christensen is the Academic Director of the Chinese Flagship Center at Brigham Young University, where he is also a Professor of Chinese in the Department of Asian & Near Eastern Languages. The Flagship program is a partnership among the federal government, education, and business which helps graduates take their place among the next generation of global professionals. His focus on the usefulness of cultural codes results from his frequent observations in China of students' difficulties when they try--and fail!--to use U.S. cultural codes there.
While there is much discussion on Africa-China relations, the focus tends to lean more on the Chinese presence in Africa than on the African presence in China. There are numerous studies on the former but, with the exception of a few articles on the presence of African traders and students in China, little is known of the latter, even though an increasing number of Africans are visiting and settling in China and forming migrant communities there. This is a phenomenon that has never happened before the turn of the century and has thus led to what is often termed Africa's newest Diaspora. This book focuses on analyzing this new Diaspora, addressing the crucial question: What is it like to be an African in China? Africans in China is the first book-length study of the process of Africans travelling to China and forming communities there. Based on innovative intermingling of qualitative and quantitative research methods involving prolonged interaction with approximately 800 Africans across six main Chinese cities--Guangzhou, Yiwu, Shanghai, Beijing, Hong Kong and Macau--sociolinguistic and sociocultural profiles are constructed to depict the everyday life of Africans in China. The study provides insights into understanding issues such as why Africans go to China, what they do there, how they communicate with their Chinese hosts, what opportunities and problems they encounter in their China sojourn, and how they are received by the Chinese state. Beyond these methodological and empirical contributions, the book also makes a theoretical contribution by proposing a crosscultural bridge theory of migrant-indigene relations, arguing that Africans in China act as sociopolitical, socioeconomic, and sociocultural bridges linking Africa to China. This approach to the analysis of Diaspora communities has consequences for crosscultural and crosslinguistic studies in an era of globalization. Africans in China is an important book for African Studies, Asian Studies, Africa-China relations studies, linguistics, anthropology, sociology, international studies, and migration and Diaspora studies in an era of globalization.
As David meditates, he has some unusual experiences. At one point, he is invited to visit an alternate dimension. As a traveler in this dimension, David's awareness of himself grows.
He sees his own life experiences from a different perspective. Curiosity, perseverance, courage, and barriers are understood in a new light. He is exposed to many teaching opportunities, including the energy of romance.
We also visit David at a later time in his life. His damaged heart is ready to shut down when he chooses a new adventure. He is challenged to try a new life-style that confronts him to share what he has learned with an appreciative audience and a wonderfully compatable female partner.
As one of the eighteen field-specific reports comprising the comprehensive scope of the strategic general report of the Chinese Academy of Sciences, this sub-report addresses long-range planning for developing science and technology in the field of advanced materials science. They each craft a roadmap for their sphere of development to 2050. In their entirety, the general and sub-group reports analyze the evolution and laws governing the development of science and technology, describe the decisive impact of science and technology on the modernization process, predict that the world is on the eve of an impending S&T revolution, and call for China to be fully prepared for this new round of S&T advancement. Based on the detailed study of the demands on S&T innovation in China's modernization, the reports draw a framework for eight basic and strategic systems of socio-economic development with the support of science and technology, work out China's S&T roadmaps for the relevant eight basic and strategic systems in line with China's reality, further detail S&T initiatives of strategic importance to China's modernization, and provide S&T decision-makers with comprehensive consultations for the development of S&T innovation consistent with China's reality. Supported by illustrations and tables of data, the reports provide researchers, government officials and entrepreneurs with guidance concerning research directions, the planning process, and investment. Founded in 1949, the Chinese Academy of Sciences is the nation's highest academic institution in natural sciences. Its major responsibilities are to conduct research in basic and technological sciences, to undertake nationwide integrated surveys on natural resources and ecological environment, to provide the country with scientific data and consultations for government's decision-making, to undertake government-assigned projects with regard to key S&T problems in the process of socio-economic development, to initiate personnel training, and to promote China's high-tech enterprises through its active engagement in these areas.


'Nobody knows you better than you do,' and when it comes to dealing with pancreatic cancer, this old saying still rings true. Far too many pancreatic cancer patients are misdiagnosed, and it costs them their life. This was the case for Michelle Lippert's father, Edward Benson, who fought with his doctors for six months before he received the correct diagnosis.
With a five-year pancreatic cancer survival rate of just 9 percent, Benson fought for his life to keep the beautiful relationship he had with his daughter. He lived for an additional four years after receiving his diagnosis.
Lippert shared, "My dad passed away the morning of January 11, 2015. That day was the first time I did any research on pancreatic cancer – I was so desperate for something to grasp on to. I learned about the Pancreatic Cancer Action Network (PanCAN) through my research.
Having worked in high-ranking government jobs for most of his life, Benson was known for his strong work ethic. Lippert strongly holds on to that trait, and it's evident in her efforts to raise awareness about the world's toughest cancer.
Since her father's passing, Lippert has become actively involved in PurpleStride DFW, the walk to end pancreatic cancer, which is celebrating its 10-year anniversary on Nov. 10.
Today, Lippert fights in her father's name through her PurpleStride team, Purple Warriors Movement, with a goal of $10,000. Her efforts are fueled by her desire to beat the odds and raise more funds for pancreatic cancer research.
Lippert believes that it all begins at PurpleStride. She started Purple Warriors Movement because the signature 5K event embodies everything she hopes for – a brighter future for pancreatic cancer patients and an army of supporters to fight for them.
PurpleStride is the vehicle that empowers PanCAN to fund important patient-driven programs like Patient and Caregiver Services, Know Your Tumor® and Clinical Trial Finder. PurpleStride isn't the only thing PanCAN does, but everything they do depends on it.
Visit purplestride.org to learn more about PurpleStride and sign up for an event near you.


Asian Webcam Roulette allows you to spin the roulette and select your favorite Asian Girls age 18+ that are streaming on live webcam.
His son, Buddy, is displeased with the change of locale, primarily because he is unable to use his skateboard on the desert sand.
have to compete with foreign imports and for foreign labor.


text:
Paul-Émilien Dalpé (1919 - April 16, 1994), C.M., also known as Paul-Émile Dalpé, was a Canadian labour unionist and nurse. He was born in Saint-Jérôme, Quebec and was the founding president of the Centrale des syndicats démocratiques (CSD), a Quebec labour central body.

In 1966 he was president of the National Federation of Services, part of the Confederation of National Trade Unions (CSN) which represented hospital workers.

In 1972, he was one of the dissident members of the CSN executive who led the split of the CSN that resulted in the creation of the more politically moderate CSD, and became the CSD's founding president    from 1972 until 1981. After he retired, he became a part-time member of the Economic Council of Canada.

Honours
On December 14, 1981, he was appointed as a  Member of the Order of Canada

References

1919 births
1994 deaths
Members of the Order of Canada
People from Saint-Jérôme
Trade unionists from Quebec

redpajama_set_name: RedPajamaWikipedia


text:
package org.seckill.service;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.seckill.dao.CommandContentMapper;
import org.seckill.entity.CommandContent;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;

/**
 * Date: 2017-04-01
 * Time: 14:07
 * Description:
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:spring/spring-dao.xml",
        "classpath:spring/spring-service.xml"})
public class CommandContentServiceTest {
    @Resource
    private CommandContentMapper mContentMapper;
    @Test
    public void insertCommandContent() throws Exception {
        List<CommandContent> contents=new ArrayList<CommandContent>();
        for (int i = 1; i < 3; i++) {
            CommandContent commandContent = new CommandContent();
            commandContent.setContent("lianxutianja"+i);
            commandContent.setCommandId(i);
            contents.add(commandContent);
        }
        System.out.println(">>>>>>>>>>>>>>>>>>");
        int i = mContentMapper.insertCommandContent(contents);
        System.out.println(i);
        System.out.println(">>>>>>>>>>>>>>>>>>");
    }

}

redpajama_set_name: RedPajamaGithub


The UPA government is working overtime to introduce the the Lokpal Bill in the Lok Sabha next Tuesday so that it can be passed in the ongoing session of Parliament due to conclude on December 22.
The state machinery is geared up for the success of the ruling SAD�s December 18 Moga rally (in Kili Chahal village), which Deputy Chief Minister Sukhbir Singh Badal claims will be the world�s largest.
Facing flak for suggesting policing of the internet, Telecom Minister Kapil Sibal today sought to douse the fire by initiating a dialogue with leading social networking firms Google, Facebook and Twitter.
Pakistan Prime Minister Yousuf Raza Gilani has said that President Asif Ali Zardari was forced to go to Dubai for medical treatment because of "threats" to his life. The government and the President's family convinced Zardari to go to Dubai for treatment because there was a risk he would be attacked if he was admitted to a Pakistani hospital, Gilani said while speaking in the Senate or upper house of parliament yesterday.
Jawans who retire from the armed forces will have the option of joining paramilitary forces such as the CRPF and BSF among others. The Ministry of Home Affairs has agreed to fill 10 per cent of Group �B� posts - up to the level of inspector - in the Central paramilitary forces from ex-servicemen, Defence Minister AK Antony informed the Parliamentary Consultative Committee on Defence today.
War is one of the defining factors that chart the course of history and leaves in its wake some decisive moments that have an everlasting impact on the psyche of the embattled nations as well as individuals who are part of it.
Mahatma Gandhi had tried to save Bhagat Singh from the gallows but a Congress leader, Bhai Gopal Dass of Ludhiana, spilled the beans about Mahatma�s efforts before the media.
The next time when Team Anna members enter the Parliament House complex to meet politicians, they won�t have the liberty of posing for TV cameras and slamming the government.


innovation template free presentation templates powerpoint.
template road to innovation leading upward a light presentation displaying bulb representing imagination creativity innovat.
innovation creative for design agency template presentation big screenshot free powerpoint templates.
innovation templates backgrounds presentation slides template themes and graphics ppt.
open innovation templates presentation template concept free powerpoint.
the best free templates of updated innovation presentation template powerpoint.
innovation presentation template what is a templates for creative free powerpoint.
with gears for innovative ideas template innovation presentation 1 2 ppt.
innovative template innovation presentation creative free multipurpose powerpoint.
template business background with keywords as innovation presentation displaying idea creative corporate present.
innovation process diagrams charts design thinking presentation template slides templates free download.
innovation templates presentation template ambition matrix a gear shapes in light bulb powerpoint.
innovative template innovation presentation process free templates backgrounds slides fre.
innovation presentation template multipurpose nice business templates innovat.
innovation process presentation template by ppt.
innovation multipurpose google slides presentation template templates free drive and premium slide innovati.
innovation multipurpose presentation template by as powerpoint.
flat innovation project template presentation free powerpoint templates.
innovation mind map template by presentation multipurpose powerpoint free download.
innovation template free presentation themes for creative powerpoint templates.
editable templates innovation process presentation template 3 1 innovatio.


It is true that some users like to stick to older versions of the software they have become familiar with. Today, new software features are brought to market quicker than ever before. Due to the rise of cloud computing and mobility, business software development cycles have shortened significantly over the past decade. It is no understatement to say that software expires quickly and clinging to older versions of software can potentially cost your organization both financially and through inefficient operations. However, many facility and real estate managers still struggle with justifying spending money on new software.
The majority of end-users are working on smart phones and tablets in the office on a daily basis. They expect their IWMS vendor to offer the same functionality on their mobile devices as they have on their desktop. Mobile maintenance management software enables engineers to become more effective in their on-site work. It gives them real-time access to work orders and the specific asset details. If your current system isn't ready for mobile, then you might want to consider a replacement.
2. A lack of integration?
IWMS has made a lot of progress in integration. Half a decade ago the facility management team would have their own system, and so would the real estate team. And in some organizations the space management team would have a third system. Sustainability systems were in their infancy and the service desk was often still working exclusively by phone. We have seen the major benefits of bringing these systems together in one suite, including increased efficiency and reduced FM costs.
4. Complicated (or no) Dashboards?
Both IWMS users and the C-suite are faced with an information overload every day. Market leading systems are increasingly turning to easy-to-read dashboards that offer a quick overview of the key information. Investing in a new solution will save a lot of management time and frustration.
Engineers need to be constantly aware and up-to-date on health and safety requirements and legislative maintenance schedules on critical assets. Modern facilities management software enables engineers to read risk assessments and confirm they have done so, which in-turn mitigates the company's exposure to risk. Modern IWMS systems also enable critical compliance issues to be flagged, again, ensuring statutory compliance.
If you have your own warning signs that your software is out of date, please let us know.


text:
Kingswood acquires Admiral Wealth Management
Kingswood Holdings Limited (Kingswood) is to acquire Admiral Wealth Management, a North Lincolnshire based Chartered Financial Planning firm, consolidating, and adding scale to its existing presence across North Lincolnshire and Yorkshire.
The transaction boosts Kingswood's UK client facing advisory team to 66 people and increases UK funds under advice/management to GBP3.5 billion from circa 8,500 active clients.
Kingswood Group AuA now totals over GBP6.2 billion from global retail and institutional clients.
Kingswood Holdings Limited (AIM: KWG), the international, fully integrated wealth and investment management group, is pleased to announce it has agreed to acquire, subject to regulatory approval, Admiral Wealth Management Limited (Admiral) a high quality, established Chartered Financial Planning firm based in North Lincolnshire.
David Lawrence, UK CEO at Kingswood, says: "Since becoming UK CEO at the turn of the year, I have focussed on building momentum in the business and expanding our capabilities to integrate and grow. Our focus on enhancing the client experience is paying dividends and I am delighted that we now have approaching GBP200 million in our internal MPS. I am thrilled to announce our first acquisition under my leadership and look forward to welcoming Mike Biggin, Adam Harrison, and the Admiral team to Kingswood. Admiral is a highly regarded provider of financial advisory services in North Lincolnshire and Yorkshire having consistently delivered a high-quality service to clients for over 30 years.
"The Kingswood model is designed to provide a centralised, efficient support infrastructure to manage the routine, but time consuming tasks required across compliance, finance, human resources, risk and technology, allowing the Admiral team to deliver a superior level of service to their clients. I am delighted that Mike and Adam have agreed to stay with the business as it enters a new phase as part of the Kingswood Group and I very much look forward to working with them.
"We remain absolutely committed to perpetuating our stated growth strategy within the UK and internationally. Whilst this is our first acquisition of 2021, we have a strong pipeline of high-quality UK opportunities under negotiation, four of which are in exclusive due diligence representing pro-forma operating profit in excess of GBP2.5 million as we continue to grow our financial planning and investment management reach across the UK. Our international business under the leadership of Mike Nessim is on a similarly strong growth trajectory and where this week we have agreed exclusivity with a target business that on completion will contribute additional annual pro-forma operating profit of USD1.5 million."

redpajama_set_name: RedPajamaCommonCrawl


text:
search filter All ContentBy SocietyAmerican Mineralogist
Data Supplement Files
Scope and Mission
Open Acces Information
Pre-2000 Articles
Notable Papers
Society Mission
Short Courses and Workshops
Join MSA
MSA Bookstore
Minpubs.org
Open Access Publications
Research Article| September 01, 2001
The occurrence of tinsleyite in the archaeological site of Santana do Riacho, Brazil
Geraldo Magela da Costa;
Geraldo Magela da Costa *
Chemistry Department, Universidade Federal de Ouro Preto, 35400, Ouro Preto, Minas Gerais, Brazil
E-mail: magela@iceb.ufop.br
Rúbia Ribeiro Viana
Geology Department, Universidade Federal de Ouro Preto, 35400, Ouro Preto, Minas Gerais, Brazil
American Mineralogist (2001) 86 (9): 1053–1056.
https://doi.org/10.2138/am-2001-8-911
Geraldo Magela da Costa, Rúbia Ribeiro Viana; The occurrence of tinsleyite in the archaeological site of Santana do Riacho, Brazil. American Mineralogist 2001;; 86 (9): 1053–1056. doi: https://doi.org/10.2138/am-2001-8-911
A second occurrence of tinsleyite, KAl2(PO4)2(OH)·2H2O, is reported. The mineral exists as a thin layer in a quartzite wall partially covered by rock paintings, and was characterized by X-ray diffraction, thermal and chemical analysis, and by Mössbauer spectroscopy. The calculated cell parameters are a = 9.58(6), b = 9.53(4), c = 9.54(6) Å, β = 103.2(4)°. Chemical analysis showed the presence of 3.9% Fe which probably replaces Al in the octahedral site. The Mössbauer spectra from room temperature down to 85 K show the existence of two Fe3+ doublets with ΔEQ1 ~ 0.57 mm/s and ΔEQ2 ~ 1.0 mm/s. At 77 K the spectrum drastically changes, suggesting that a structural transition might have occurred. The formation of tinsleyite might be due to the reaction of phosphate-rich water which runs along the fractures of the wall. The existence of tinsleyite in such a relatively large abundance indicates that this mineral might not be rare as previously thought.
MSA Member Sign In
crystal chemistry
Minas Gerais Brazil
Mossbauer spectra
unit cell
X-ray diffraction data
tinsleyite
Belo Horizonte Brazil
Santana do Riacho Brazil
S23°30'00" - S14°00'00", W51°00'00" - W39°45'00"
Copyright © 2022 Mineralogical Society of America


Energy efficient skf c30/750mb bearing in Suriname are widely used in industrial drive, agriculture, compressors, motors and generators, construction, industrial fan, industrial transmission and other fields. Energy efficient skf c30/750mb bearing in Suriname can ensure high quality for more than 80% raw material of Energy efficient skf c30/750mb bearing in Suriname provided by the steel plant.
Explorer series bearing of Energy efficient skf c30/750mb bearing in Suriname are better than any brand bearings currently in bearing performance , lifetime, design, and the use of performance. Explorer series bearings of Energy efficient skf c30/750mb bearing in Suriname have more advantages ,such as higher meet rated , lower noise, reducing warranty costs greatly, increasing running time of the machine.
C30/850MB* SKF, type . Enter the quantity and click Quote. Search for other items in our catalog.
skf C30/750MB* for sale with high quality and cheap price.Biggest Agent In Asia, Delivery In three Days. Bearing For Sale skf C30/750MB*.
CachedNTN 6306-Z Bearing Details: Bearing Name 6306-Z New Model 6306-Z Old Model 60306 SKF N306E Bearing, 30, 72, 19, SKF, Cylindrical Roller Bearings.


Theresa May's withdrawal agreement is "a deal a nation signs only after having been defeated at war," remarked economist Yanis Varoufakis on Question Time.
He gave his blunt assessment about the Prime Minister's Brexit deal after he was asked who was to blame for the UK's failure to leave the EU on 29 March.
Addressing a young man named Joel, in the Question Time Sheffield audience, who asked the first question on the programme, he said: "Joel, the answer is really very simple. Theresa May. Look, first she triggers Article 50 on the basis of red lines that boxed her into impossibility – and that is a crime against logic.
"Secondly, it failed to recognise that Michel Barnier, when he announced the two-phase process, announced a declaration of hostility against the Government," he continued.
"May never even saw this coming.
"Theresa May started that negotiation, and the result was effectively a deal – I disagree with my fellow panellists here – whether you are a Brexiteer or a Remainer, this is a deal a nation signs only after having been defeated at war.
The economist went on to say he believed "the business model for Britain is broken".
"Britain's business model relies on low wages, zero hours contracts, and little regulation," he said.
"It's based on an ideology of cheapness. That is not a good future for Britain, Brexit or no Brexit," he added.
But Tory peer and Next CEO Simon Wolfson contested Varoufakis' stance, and argued "employment is growing" even though the UK hasn't struck a deal.
"It's a collective failure, just now, of the political class. It's on all of us.
"Collectively, we need to fix this for all of the country. We weren't elected to the country because we have strong views and wanted to express them repeatedly. We were elected to parliament to reach agreement and to get stuff done.
"That's what I believe the people want to happen," he added.


I've been sewing quite a few basic t-shirts at the moment and this is the first of several that I have to write about. Sewing basics can seem like quite a dull task, however I really enjoy sewing things such as t-shirts that I know will get a lot of wear. They're so quick to sew too! I've also experimented with adding extra details onto what would otherwise be standard garments, and I love that a simple addition can really make a garment unique.
This is another make from the fabric that I bought when I visited Higgs and Higgs, and like all of their jerseys this black one was wonderful to sew with. It's actually a ribbing, something that doesn't show up in the photos but is apparent when you see the top in person. I love the extra texture the ribbing gives, and it makes the top super stretchy and therefore really comfortable (always a bonus!). The ribbing also allowed the neckband to go in really smoothly and easily.
The fairly obvious part of this top that makes it into something, is the contrast white 'pleated trim picot edging' that I bought as a slightly spur of the moment addition. I was initially worried it would look too crazy but to be honest I could probably have been able to get away with adding more (not that I want to add more). I absolutely LOVE it! I think it's such a great addition, and as I said turns the top into something more than just a basic black t-shirt. My Mum is entrirely to thank for this, she was the one who noticed it in the shop and pursuaded me to buy it so thank you, Mum!
To attatch the trim I simply topstitched it onto the sleeve at the bottom. I left the hem of the sleeve raw as the fabric doesn't fray and decided to sew it on top of the sleeve as an applique rather than underneath the black. Again, I'm glad I did this as it creates a nice texture and I don't think that it needed to be hidden underneath the black.
The pattern is self drafted and has immediately become a go-to pattern for me for a basic top. The only thing to remember is that this fabric is very stretchy and so needed to be sewn with a larger seam allowance on my overlocker than another t-shirt made out of a less stretchy jersey. I wasn't sure how long I wanted the top but I knew that I wanted it cropped to wear with high-waisted trouseres and skirts, and when I tried it on I found that it was the perfect length so I'm pleased about that too.
Overall, I don't think that such a basic garment has ever made me so happy! This is definitely one of those makes that makes me smile when I put it on, and it's all thanks to taking a risk with a slightly strange white trim.
This look like such a sleek and classic top. It's a perfect fit too!
I have realised after Me-Made-May that I need to sew some more plain coloured basics exactly like this so thanks for the inspiration!
The trim addition is such a great idea! It adds an extra spark to the top, which you look great in!
What a good idea, well spotted mum! You made a really good job of that well done.
The trim elevated that top. You put it to good use!
The trim was such a great addition. Your t-shirt looks very classy.
I love the edging on this t shirt - clever you! I do love a bit of black and white; it's always a stylish look.


The purpose of this study was to investigate the self-assembly of gold nanoparticles to create thin, densely packed structures several monolayers thick for the synthesis of a membrane. Silica membrane synthesis was examined as a support for deposition of the nanoparticles. Pore size formation and thickness were controlled to promote high flux, defect free layer formation while providing for optimum separation. Silica mesoporous membranes were created through the acid-catalyzed hydrolysis of tetraethyl orthosilicate. An ionic block co-polymer was used to control a networked pore formation. The silica sols were dip coated on macroporous alumina supports. The silica membranes were characterized through gas permeance testing and determined to have a pore formation in the mesoporous range. The films were found to be defect free and thin resulting in a high flux through the membrane. Multi-gas testing indicated that flux is inversely proportional to the inverse square root of temperature. Gold Nanoparticles were synthesized at an estimated 15+/-2nm in diameter. The gold nanoparticles were plated in a multi-layered packing arrangement onto the silica membranes using a Langmuir-Blodgett dipping technique. Characterization of the disks was completed. The gold nanoparticle films were found to have a high permeance indicating a thin membrane.
Saucier, Jennifer K., "Self-Assembly of Inorganic Membranes: Attachment of Gold Nanoparticles to a Mesoporous Silica Membrane" (2004). Honors College. 3.


LGS invests on behalf of our members using a responsible investment approach. We believe that this approach minimises risk, generates better long-term returns, and is in line with our members' interests.
Restrict investments in companies in certain industries, such as gambling, armaments, old growth logging and tobacco.
Engage with companies in which we invest on how to improve their operations.
Undertake voting at shareholder meetings to influence company governance.
Collaborate with a number of industry groups on responsible investment practices.
Ensure sustainable practices in properties we own directly. This includes implementing energy efficiency, waste reduction and recycling, health and safety, environmental risk management and water conservation programs.
For more details on our approach, read our Responsible Investment Policy and our latest performance report for 2017.