text:
package org.apache.rocketmq.console.service.impl;

import com.google.common.base.Predicate;
import com.google.common.base.Throwables;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.common.MQVersion;
import org.apache.rocketmq.common.admin.ConsumeStats;
import org.apache.rocketmq.common.admin.RollbackStats;
import org.apache.rocketmq.common.message.MessageQueue;
import org.apache.rocketmq.common.protocol.ResponseCode;
import org.apache.rocketmq.common.protocol.body.ClusterInfo;
import org.apache.rocketmq.common.protocol.body.Connection;
import org.apache.rocketmq.common.protocol.body.ConsumerConnection;
import org.apache.rocketmq.common.protocol.body.ConsumerRunningInfo;
import org.apache.rocketmq.common.protocol.body.GroupList;
import org.apache.rocketmq.common.protocol.body.SubscriptionGroupWrapper;
import org.apache.rocketmq.common.protocol.route.BrokerData;
import org.apache.rocketmq.common.subscription.SubscriptionGroupConfig;
import org.apache.rocketmq.console.aspect.admin.annotation.MultiMQAdminCmdMethod;
import org.apache.rocketmq.console.model.ConsumerGroupRollBackStat;
import org.apache.rocketmq.console.model.GroupConsumeInfo;
import org.apache.rocketmq.console.model.QueueStatInfo;
import org.apache.rocketmq.console.model.TopicConsumerInfo;
import org.apache.rocketmq.console.model.request.ConsumerConfigInfo;
import org.apache.rocketmq.console.model.request.DeleteSubGroupRequest;
import org.apache.rocketmq.console.model.request.ResetOffsetRequest;
import org.apache.rocketmq.console.service.AbstractCommonService;
import org.apache.rocketmq.console.service.ConsumerService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import static com.google.common.base.Throwables.propagate;

@Service
public class ConsumerServiceImpl extends AbstractCommonService implements ConsumerService {
    private Logger logger = LoggerFactory.getLogger(ConsumerServiceImpl.class);

    @Override
    @MultiMQAdminCmdMethod
    public List<GroupConsumeInfo> queryGroupList() {
        Set<String> consumerGroupSet = Sets.newHashSet();
        try {
            ClusterInfo clusterInfo = mqAdminExt.examineBrokerClusterInfo();
            for (BrokerData brokerData : clusterInfo.getBrokerAddrTable().values()) {
                SubscriptionGroupWrapper subscriptionGroupWrapper = mqAdminExt.getAllSubscriptionGroup(brokerData.selectBrokerAddr(), 3000L);
                consumerGroupSet.addAll(subscriptionGroupWrapper.getSubscriptionGroupTable().keySet());
            }
        }
        catch (Exception err) {
            throw Throwables.propagate(err);
        }
        List<GroupConsumeInfo> groupConsumeInfoList = Lists.newArrayList();
        for (String consumerGroup : consumerGroupSet) {
            groupConsumeInfoList.add(queryGroup(consumerGroup));
        }
        Collections.sort(groupConsumeInfoList);
        return groupConsumeInfoList;
    }

    @Override
    @MultiMQAdminCmdMethod
    public GroupConsumeInfo queryGroup(String consumerGroup) {
        GroupConsumeInfo groupConsumeInfo = new GroupConsumeInfo();
        try {
            ConsumeStats consumeStats = null;
            try {
                consumeStats = mqAdminExt.examineConsumeStats(consumerGroup);
            }
            catch (Exception e) {
                logger.warn("examineConsumeStats exception, " + consumerGroup, e);
            }

            ConsumerConnection consumerConnection = null;
            try {
                consumerConnection = mqAdminExt.examineConsumerConnectionInfo(consumerGroup);
            }
            catch (Exception e) {
                logger.warn("examineConsumerConnectionInfo exception, " + consumerGroup, e);
            }

            groupConsumeInfo.setGroup(consumerGroup);

            if (consumeStats != null) {
                groupConsumeInfo.setConsumeTps((int)consumeStats.getConsumeTps());
                groupConsumeInfo.setDiffTotal(consumeStats.computeTotalDiff());
            }

            if (consumerConnection != null) {
                groupConsumeInfo.setCount(consumerConnection.getConnectionSet().size());
                groupConsumeInfo.setMessageModel(consumerConnection.getMessageModel());
                groupConsumeInfo.setConsumeType(consumerConnection.getConsumeType());
                groupConsumeInfo.setVersion(MQVersion.getVersionDesc(consumerConnection.computeMinVersion()));
            }
        }
        catch (Exception e) {
            logger.warn("examineConsumeStats or examineConsumerConnectionInfo exception, "
                + consumerGroup, e);
        }
        return groupConsumeInfo;
    }

    @Override
    public List<TopicConsumerInfo> queryConsumeStatsListByGroupName(String groupName) {
        return queryConsumeStatsList(null, groupName);
    }

    @Override
    @MultiMQAdminCmdMethod
    public List<TopicConsumerInfo> queryConsumeStatsList(final String topic, String groupName) {
        ConsumeStats consumeStats = null;
        try {
            consumeStats = mqAdminExt.examineConsumeStats(groupName);
        }
        catch (Exception e) {
            throw propagate(e);
        }
        List<MessageQueue> mqList = Lists.newArrayList(Iterables.filter(consumeStats.getOffsetTable().keySet(), new Predicate<MessageQueue>() {
            @Override
            public boolean apply(MessageQueue o) {
                return StringUtils.isBlank(topic) || o.getTopic().equals(topic);
            }
        }));
        Collections.sort(mqList);
        List<TopicConsumerInfo> topicConsumerInfoList = Lists.newArrayList();
        TopicConsumerInfo nowTopicConsumerInfo = null;
        Map<MessageQueue, String> messageQueueClientMap = getClientConnection(groupName);
        for (MessageQueue mq : mqList) {
            if (nowTopicConsumerInfo == null || (!StringUtils.equals(mq.getTopic(), nowTopicConsumerInfo.getTopic()))) {
                nowTopicConsumerInfo = new TopicConsumerInfo(mq.getTopic());
                topicConsumerInfoList.add(nowTopicConsumerInfo);
            }
            QueueStatInfo queueStatInfo = QueueStatInfo.fromOffsetTableEntry(mq, consumeStats.getOffsetTable().get(mq));
            queueStatInfo.setClientInfo(messageQueueClientMap.get(mq));
            nowTopicConsumerInfo.appendQueueStatInfo(queueStatInfo);
        }
        return topicConsumerInfoList;
    }

    private Map<MessageQueue, String> getClientConnection(String groupName) {
        Map<MessageQueue, String> results = Maps.newHashMap();
        try {
            ConsumerConnection consumerConnection = mqAdminExt.examineConsumerConnectionInfo(groupName);
            for (Connection connection : consumerConnection.getConnectionSet()) {
                String clinetId = connection.getClientId();
                ConsumerRunningInfo consumerRunningInfo = mqAdminExt.getConsumerRunningInfo(groupName, clinetId, false);
                for (MessageQueue messageQueue : consumerRunningInfo.getMqTable().keySet()) {
//                    results.put(messageQueue, clinetId + " " + connection.getClientAddr());
                    results.put(messageQueue, clinetId);
                }
            }
        }
        catch (Exception err) {
            logger.error("op=getClientConnection_error", err);
        }
        return results;
    }

    @Override
    @MultiMQAdminCmdMethod
    public Map<String /*groupName*/, TopicConsumerInfo> queryConsumeStatsListByTopicName(String topic) {
        Map<String, TopicConsumerInfo> group2ConsumerInfoMap = Maps.newHashMap();
        try {
            GroupList groupList = mqAdminExt.queryTopicConsumeByWho(topic);
            for (String group : groupList.getGroupList()) {
                List<TopicConsumerInfo> topicConsumerInfoList = queryConsumeStatsList(topic, group);
                group2ConsumerInfoMap.put(group, CollectionUtils.isEmpty(topicConsumerInfoList) ? new TopicConsumerInfo(topic) : topicConsumerInfoList.get(0));
            }
            return group2ConsumerInfoMap;
        }
        catch (Exception e) {
            throw propagate(e);
        }
    }

    @Override
    @MultiMQAdminCmdMethod
    public Map<String, ConsumerGroupRollBackStat> resetOffset(ResetOffsetRequest resetOffsetRequest) {
        Map<String, ConsumerGroupRollBackStat> groupRollbackStats = Maps.newHashMap();
        for (String consumerGroup : resetOffsetRequest.getConsumerGroupList()) {
            try {
                Map<MessageQueue, Long> rollbackStatsMap =
                    mqAdminExt.resetOffsetByTimestamp(resetOffsetRequest.getTopic(), consumerGroup, resetOffsetRequest.getResetTime(), resetOffsetRequest.isForce());
                ConsumerGroupRollBackStat consumerGroupRollBackStat = new ConsumerGroupRollBackStat(true);
                List<RollbackStats> rollbackStatsList = consumerGroupRollBackStat.getRollbackStatsList();
                for (Map.Entry<MessageQueue, Long> rollbackStatsEntty : rollbackStatsMap.entrySet()) {
                    RollbackStats rollbackStats = new RollbackStats();
                    rollbackStats.setRollbackOffset(rollbackStatsEntty.getValue());
                    rollbackStats.setQueueId(rollbackStatsEntty.getKey().getQueueId());
                    rollbackStats.setBrokerName(rollbackStatsEntty.getKey().getBrokerName());
                    rollbackStatsList.add(rollbackStats);
                }
                groupRollbackStats.put(consumerGroup, consumerGroupRollBackStat);
            }
            catch (MQClientException e) {
                if (ResponseCode.CONSUMER_NOT_ONLINE == e.getResponseCode()) {
                    try {
                        ConsumerGroupRollBackStat consumerGroupRollBackStat = new ConsumerGroupRollBackStat(true);
                        List<RollbackStats> rollbackStatsList = mqAdminExt.resetOffsetByTimestampOld(consumerGroup, resetOffsetRequest.getTopic(), resetOffsetRequest.getResetTime(), true);
                        consumerGroupRollBackStat.setRollbackStatsList(rollbackStatsList);
                        groupRollbackStats.put(consumerGroup, consumerGroupRollBackStat);
                        continue;
                    }
                    catch (Exception err) {
                        logger.error("op=resetOffset_which_not_online_error", err);
                    }
                }
                else {
                    logger.error("op=resetOffset_error", e);
                }
                groupRollbackStats.put(consumerGroup, new ConsumerGroupRollBackStat(false, e.getMessage()));
            }
            catch (Exception e) {
                logger.error("op=resetOffset_error", e);
                groupRollbackStats.put(consumerGroup, new ConsumerGroupRollBackStat(false, e.getMessage()));
            }
        }
        return groupRollbackStats;
    }

    @Override
    @MultiMQAdminCmdMethod
    public List<ConsumerConfigInfo> examineSubscriptionGroupConfig(String group) {
        List<ConsumerConfigInfo> consumerConfigInfoList = Lists.newArrayList();
        try {
            ClusterInfo clusterInfo = mqAdminExt.examineBrokerClusterInfo();
            for (String brokerName : clusterInfo.getBrokerAddrTable().keySet()) { //foreach brokerName
                String brokerAddress = clusterInfo.getBrokerAddrTable().get(brokerName).selectBrokerAddr();
                SubscriptionGroupConfig subscriptionGroupConfig = mqAdminExt.examineSubscriptionGroupConfig(brokerAddress, group);
                if (subscriptionGroupConfig == null) {
                    continue;
                }
                consumerConfigInfoList.add(new ConsumerConfigInfo(Lists.newArrayList(brokerName), subscriptionGroupConfig));
            }
        }
        catch (Exception e) {
            throw propagate(e);
        }
        return consumerConfigInfoList;
    }

    @Override
    @MultiMQAdminCmdMethod
    public boolean deleteSubGroup(DeleteSubGroupRequest deleteSubGroupRequest) {
        try {
            ClusterInfo clusterInfo = mqAdminExt.examineBrokerClusterInfo();
            for (String brokerName : deleteSubGroupRequest.getBrokerNameList()) {
                logger.info("addr={} groupName={}", clusterInfo.getBrokerAddrTable().get(brokerName).selectBrokerAddr(), deleteSubGroupRequest.getGroupName());
                mqAdminExt.deleteSubscriptionGroup(clusterInfo.getBrokerAddrTable().get(brokerName).selectBrokerAddr(), deleteSubGroupRequest.getGroupName());
            }
        }
        catch (Exception e) {
            throw propagate(e);
        }
        return true;
    }

    @Override
    public boolean createAndUpdateSubscriptionGroupConfig(ConsumerConfigInfo consumerConfigInfo) {
        try {
            ClusterInfo clusterInfo = mqAdminExt.examineBrokerClusterInfo();
            for (String brokerName : changeToBrokerNameSet(clusterInfo.getClusterAddrTable(),
                consumerConfigInfo.getClusterNameList(), consumerConfigInfo.getBrokerNameList())) {
                mqAdminExt.createAndUpdateSubscriptionGroupConfig(clusterInfo.getBrokerAddrTable().get(brokerName).selectBrokerAddr(), consumerConfigInfo.getSubscriptionGroupConfig());
            }
        }
        catch (Exception err) {
            throw Throwables.propagate(err);
        }
        return true;
    }

    @Override
    @MultiMQAdminCmdMethod
    public Set<String> fetchBrokerNameSetBySubscriptionGroup(String group) {
        Set<String> brokerNameSet = Sets.newHashSet();
        try {
            List<ConsumerConfigInfo> consumerConfigInfoList = examineSubscriptionGroupConfig(group);
            for (ConsumerConfigInfo consumerConfigInfo : consumerConfigInfoList) {
                brokerNameSet.addAll(consumerConfigInfo.getBrokerNameList());
            }
        }
        catch (Exception e) {
            throw Throwables.propagate(e);
        }
        return brokerNameSet;

    }

    @Override
    public ConsumerConnection getConsumerConnection(String consumerGroup) {
        try {
            return mqAdminExt.examineConsumerConnectionInfo(consumerGroup);
        }
        catch (Exception e) {
            throw Throwables.propagate(e);
        }
    }

    @Override
    public ConsumerRunningInfo getConsumerRunningInfo(String consumerGroup, String clientId, boolean jstack) {
        try {
            return mqAdminExt.getConsumerRunningInfo(consumerGroup, clientId, jstack);
        }
        catch (Exception e) {
            throw Throwables.propagate(e);
        }
    }
}

redpajama_set_name: RedPajamaGithub


text:
Q: My SwiftUI List won't update when my @Published array of NSManagedObjects changes I'm building a basic notes app where the main page of my app should display a list of the user's notes. A note is represented with the Note class, a Core Data-generated class. (My ultimate goal is a notes app that syncs with CloudKit via NSPersistentCloudKitContainer.)
So far, when a user loads the app, the List displays the correct notes data. However, when I attempt to create a new note by tapping my newNoteButton, the array of Notes changes, but my UI doesn't change. I have to reload the app to see the new note. What could I be doing wrong? Sorry for the messy code below:
NoteList.swift
struct NoteList: View {

  @EnvironmentObject var userNotes: UserNotes

  var newNoteButton: some View {
    Button(action: {
      self.userNotes.createNewNote()
      self.userNotes.objectWillChange.send()
    }) {
      Image(systemName: "plus")
        .imageScale(.large)
        .accessibility(label: Text("New Note"))
    }
  }

  var body: some View {
    NavigationView {
      List {
        ForEach(self.userNotes.notes) { note in
          NavigationLink(destination: NoteDetail(note: self.$userNotes.notes[self.userNotes.notes.firstIndex(of: note)!])) {
            Text(note.unsecuredContent!)
          }
        }
      }
      .navigationBarTitle(Text("Notes"), displayMode: .inline)
      .navigationBarItems(trailing: newNoteButton)
    }
  }

}

UserNotes.swift
class UserNotes: NSObject, ObservableObject {

  @Published var notes: [Note] = []

  var managedObjectContext: NSManagedObjectContext? = nil

  var fetchedResultsController: NSFetchedResultsController<Note> {
    if _fetchedResultsController != nil {
      return _fetchedResultsController!
    }

    let fetchRequest: NSFetchRequest<Note> = Note.fetchRequest()

    // Set the batch size to a suitable number.
    fetchRequest.fetchBatchSize = 20

    // Edit the sort key as appropriate.
    let sortDescriptor = NSSortDescriptor(key: "unsecuredContent", ascending: false)

    fetchRequest.sortDescriptors = [sortDescriptor]

    // Edit the section name key path and cache name if appropriate.
    // nil for section name key path means "no sections".
    let aFetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest,
                                                               managedObjectContext: self.managedObjectContext!,
                                                               sectionNameKeyPath: nil, cacheName: "Master")
    aFetchedResultsController.delegate = self
    _fetchedResultsController = aFetchedResultsController

    do {
      try _fetchedResultsController!.performFetch()
    } catch {
      // Replace this implementation with code to handle the error appropriately.
      // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
      let nserror = error as NSError
      fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
    }

    return _fetchedResultsController!
  }
  var _fetchedResultsController: NSFetchedResultsController<Note>? = nil

  override init() {
    super.init()
    managedObjectContext = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
    notes = fetchedResultsController.sections![0].objects as! [Note]
  }

  func createNewNote() {
    let newNote = Note(context: managedObjectContext!)

    // If appropriate, configure the new managed object.
    newNote.unsecuredContent = "New CloudKit note"

    // Save the context.
    do {
      try managedObjectContext!.save()
    } catch {
      // Replace this implementation with code to handle the error appropriately.
      // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
      let nserror = error as NSError
      fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
    }
  }

}

extension UserNotes: NSFetchedResultsControllerDelegate {

  func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
    notes = controller.sections![0].objects as! [Note]
  }

}

Note.swift (generated by Core Data)
//  This file was automatically generated and should not be edited.
//

import Foundation
import CoreData

@objc(Note)
public class Note: NSManagedObject {

}

Note.swift (extension)
extension Note: Identifiable {}

A: With @dfd's help (see here) I was able to resolve this issue by importing Combine to my UserNotes class, adding a objectWillChange, and calling objectWillChange.send():
import Foundation
import UIKit
import CoreData
import Combine

class UserNotes: NSObject, ObservableObject {

  var objectWillChange = PassthroughSubject<Void, Never>()

  @Published var notes: [Note] = [] {
    willSet {
      objectWillChange.send()
    }
  }

  var managedObjectContext: NSManagedObjectContext? = nil

  var fetchedResultsController: NSFetchedResultsController<Note> {
    if _fetchedResultsController != nil {
      return _fetchedResultsController!
    }

    let fetchRequest: NSFetchRequest<Note> = Note.fetchRequest()

    // Set the batch size to a suitable number.
    fetchRequest.fetchBatchSize = 20

    // Edit the sort key as appropriate.
    let sortDescriptor = NSSortDescriptor(key: "unsecuredContent", ascending: false)

    fetchRequest.sortDescriptors = [sortDescriptor]

    // Edit the section name key path and cache name if appropriate.
    // nil for section name key path means "no sections".
    let aFetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest,
                                                               managedObjectContext: self.managedObjectContext!,
                                                               sectionNameKeyPath: nil, cacheName: "Master")
    aFetchedResultsController.delegate = self
    _fetchedResultsController = aFetchedResultsController

    do {
      try _fetchedResultsController!.performFetch()
    } catch {
      // Replace this implementation with code to handle the error appropriately.
      // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
      let nserror = error as NSError
      fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
    }

    return _fetchedResultsController!
  }
  var _fetchedResultsController: NSFetchedResultsController<Note>? = nil

  override init() {
    super.init()
    managedObjectContext = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
    notes = fetchedResultsController.sections![0].objects as! [Note]
  }

  func createNewNote() {
    let newNote = Note(context: managedObjectContext!)

    // If appropriate, configure the new managed object.
    newNote.unsecuredContent = UUID().uuidString // Just some random crap

    // Save the context.
    do {
      try managedObjectContext!.save()
    } catch {
      // Replace this implementation with code to handle the error appropriately.
      // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
      let nserror = error as NSError
      fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
    }
  }

}

extension UserNotes: NSFetchedResultsControllerDelegate {

  func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
    notes = controller.sections![0].objects as! [Note]
  }

}

A: With SwiftUI the fetched results controller goes in the View like this:
@Environment(\.managedObjectContext) var moc
@FetchRequest(entity: Note.entity(), sortDescriptors: []) var notes: FetchedResults<Note>

var body: some View {
    VStack{
        List{
            ForEach(notes, id: \.self) { note in
            ...
            }
        }
    }
}

You can also do Note(self.moc) to create your new notes right in the View e.g. in a button handler, without the need of that helper class.

redpajama_set_name: RedPajamaStackExchange


Place your tins of polish in a pan with about half an inch of water just to cover the bottom. Bring this to the lowest simmer you possibly can for about 10 minutes. Turn off the heat and leave to cool.
When cool, open up your tins to find the polish looking as good as the day you bought it!
Not much use to me,I don't wear shoes. However would the same method work for an old jar of Marmite?
Ah now, Marmite's a different thing altogether. It might work. An investigation opportunity for the South Croydon Tinktank, maybe?


Something rippled in my spirit. And in God's loving way, while I told my daughter a story, He told His daughter a story, too.
"The great hall was beyond Mephibosheth's imagination. As he dragged his feet along with crutches you could hear the sound echo — tap, slide, tap, slide, tap, slide. Closer and closer the cripple came to the throne, and his death. When he finally dared to lift his eyes to the king, instead of judgment and fury, he saw arms spread wide open and a broad smile. Then David spoke.
My voice caught in my throat as I said it.
Two days later I was worshipping and listening to one of my favorite team of artists, Shane and Shane. The song, Carry Away randomly came on. I have heard that song a thousand times. But this day I heard for the first time the line, "and I dine with you…only you, Lord." I thought my rejoicing spirit was going to blow the cars off the interstate like some kind of super power blast.
Oh crippled woman that I was, to be pursued out in the desert, only to dine at the King's table and be called His daughter.
did i know that i would be around?
did i know that i would be found?


Robinsons Removals (Oxford) in Nuffield Way, England: opening hours, driving directions, official site, phone numbers & customer reviews.
Robinsons Removals (Oxford) in Nuffield Way, England: consumer reviews, opening hours, driving directions, photos etc.
Wanted to say thank you so much to all of you for exemplary service, patience when I had (probably meaningless) questions and finally the delivery of my belongings on Friday 12th January. I had a busy weekend getting everything unpacked and arranged and am delighted that there was absolutely no damage to anything. Thanks ever so much for your service, I truly appreciate everything you did to make my move smooth.
Oxford to Chelmsford, no problem. Great experience from survey to offload with a great team of people making it all stress free. Thanks guys and highly recommended.
Good collection from the NW, but a dire delivery experience down at Didcot. Only a small proportion of contents arrived on the agreed delivery date, leaving us with no beds to sleep in. We had to find a hotel, paying rack rate for the night at our own cost. We then had to take emergency work days off on the following day. No apology, no refund of costs. Pretty disastrous experience. If you do opt to use, double check whether they are actually delivering on that date, or intend to deliver on the following day, so you can plan for the extra disruption.
Robinsons Removals (Oxford) is business services based in England.
Robinsons Removals (Oxford) is located at Nuffield Way, Abingdon, England. You can find Robinsons Removals (Oxford) opening hours, address, driving directions and map, phone numbers and photos. Find helpful customer reviewsand write your own review to rate the business service.


text:
The tax increase decreased demand for peat more than anticipated
VAPO OY'S FINANCIAL STATEMENTS (extended to 16 months) 1 January 2013–30 April 2014
January–April
Group turnover in the January–April period was EUR 230.7 million (EUR 251.2 million in the same period in 2013).
The operating result was EUR 18.4 million, or 8.0% of turnover (EUR 24.3 million, 9.7%). The operating result includes one-off items of EUR -7.5 million (EUR 1.1 million).
Gross investments were EUR 17.8 million (EUR 4.2 million).
Net investments were EUR 6.6 million (EUR 3.7 million).
January 2013–April 2014
Group turnover in the financial year 1 January 2013–30 April 2014 was EUR 847.4 million (EUR 652.9 million in 1 January–31 December 2012).
Operating margin (EBITDA) was EUR 110.9 million, or 13.1% of turnover (EUR 52.2 million, 7.5%).
The operating result was EUR 50.1 million, or 5.9% of turnover (EUR 9.2 million, 1.4%). The operating result includes one-off items of EUR -9.7 million (EUR 15.3 million).
The pre-tax return on invested capital (ROIC, previous 12 months) was 3.9% (1.4%).
Gross investments were EUR 65.0 million, ratio to depreciation 1.2 (EUR 48.0 million, 1.1).
Net investments were EUR 29.1 million, ratio to depreciation 0.5 (EUR 26.9 million, 0.6).
The equity ratio on 30 April 2014 was 39.4% (36.9%).
Interest-bearing net debt on 30 April 2014 was EUR 329.0 million (EUR 355.9 million).
The ratio of interest-bearing net debt to operating margin (net debt / EBITDA, previous 12 months) on 30 April 2014 was 4.4 (6.8).
15.9 TWh of energy peat was delivered (14.8 TWh).
Tomi Yli-Kyyny, CEO: The company's solvency has strengthened and responsibility measures in peat production have been effective
Vapo Oy's financial year was changed from the traditional calendar year to 1 May–30 April. The change was made because it allows the key factors affecting the Group's result, namely the peat production season and the following heating season, to be allocated to the same financial year. This review reports the figures of the extended financial year 1 January 2013–30 April 2014 and presents the figures of the previous verified financial year 1 January–31 December 2012 as comparison.
We have resolutely strengthened our balance sheet by disposing of non-core holdings, enhancing the recycling of capital and improving operational profitability. We will continue to invest in water treatment and sustainable peat production to ensure continuity of operations. We seek a pre-tax ROIC of more than seven per cent. In the past financial year, the return on invested capital was 3.9 per cent (1.4%).
All of Vapo Oy's business areas, with the exception of Peat Products, improved both their absolute and relative profitability. All of the Group's businesses reported profit in the last tertial of the financial year.
The Group's turnover in the extended financial year was EUR 847.4 million (EUR 652.9 million in 1 January–31 December 2012) and the operating profit was EUR 50.1 million (EUR 9.2 million). The most significant changes affecting the volumes and profitability of the business areas took place in the Peat Products and Vapo Timber Oy business areas.
In summer 2013, peat production was successful in terms of both quality and quantity. Nevertheless, demand for energy peat was exceptionally low during the financial year. Despite the fact that the reporting period was four months longer, the sales of energy peat remained at the same level as in the shorter reference period. At the end of the financial year, Vapo had more than seven TWh of unsold energy peat stocked. The most significant reason for this was the energy tax on peat that increased dramatically at the beginning of 2013. Due to this, coal was a more competitive fuel than peat on the coast and in many inland locations as well. This applies especially to electricity generation and partly to combined heat and power generation.
The past winter was exceptionally warm, which clearly decreased demand for heat and also kept the market prices for electricity at a low level.
In the sawn timber market, the demand in Finland still remained weak, but the export of sawn timber clearly picked up as of the end of 2013, which also increased Vapo Timber Oy's volumes and improved profitability.
During the past financial year, we carried out two significant corporate arrangements on the grounds of operational synergies made possible by them. In January 2014, Vapo Timber Oy sold the Hankasalmi sawmill to Versowood Oy. After the transaction, Vapo Timber Oy continues to develop the operations of the Lieksa and Nurmes sawmills. Synergies between the Hankasalmi sawmill and the sawmills of North Karelia were not extensive enough, whereas Versowood estimates to gain synergy benefits as a result of the transaction. In Sweden, Vapo and the Lantmännen group merged their pellet business operations. The new company is the market leader in wood pellet production in Sweden. The operations transferred to the joint venture included our subsidiary Neova AB's pellet operations in Sweden and the corresponding Lantmännen Agroenergi AB business operations in Sweden and Latvia. Vapo Group has a 50% share in the joint venture. The merger was approved by the EU's competition authorities in May 2014. Synergies yielded by the merger promote our competitiveness in the Swedish market.
The strengthening of the balance sheet and the improved operational efficiency are reflected especially in the net debt/EBITDA ratio. Despite there being much more capital tied up in peat stocks than in the reference period and despite having paid a dividend of EUR 10 million, our equity ratio at the end of the period was 39.4 per cent (36.9% on 31 December 2012) and the net debt / EBITDA ratio was 4.4 (6.8).
With regard to profitability over a longer term, we face two major challenges. In case the price of coal remains at its current low level, peat taxation must be decreased in order for this domestic form of energy, together with wood, to be able to compete with imported fuels. The decision to refrain from the future tax increase, made in the Government discussion on spending limits in spring 2014, is not enough – instead, peat taxation must be returned to the 2012 level. Another factor affecting the sector significantly is the ongoing amendments to the legislation that regulates permits. The legislation must be clear and unambiguous and make permit processes smoother in order to enable Finland's adequate self-sufficiency in energy in future. Vapo is committed to responsible peat production by investing significantly in the reduction of reducing emissions to watercourses. In new production areas, Vapo is committed to reducing the load on watercourses when compared to the situation before peat production was started.
1/2013–4/2014
Return on invested capital % *)
Return on invested capital % before impairments *)
Return on equity % *
Equity ratio %
Interest-bearing net debt/operating margin
Average number of employees
The business area includes the energy and environmental peat business operations in Finland, Sweden and the Baltic countries.
The turnover of the Peat Products business area in the extended financial year 1 January 2013–30 April 2014 was EUR 264.2 million (EUR 220.5 million in 1 January–31 December 2012). The operating result for the period was EUR 56.8 million (EUR 32.4 million). The operating result includes one-off items of EUR 8.0 million. Gross investments totalled EUR 38.6 million (EUR 25.4 million).
The energy peat tax increase from EUR 1.90 to EUR 4.90 per MWh at the beginning of 2013 decreased demand by nearly a third. Turnover from energy peat was EUR 235.5 million (EUR 183.2 million) and the operating result was EUR 52.1 million (EUR 32.0 million). Energy peat deliveries totalled 15.9 TWh (14.8 TWh). Of this, deliveries in Finland were 14.1 TWh (13.0 TWh), in Sweden 1.4 TWh (1.3 TWh) and in the Baltic countries 0.4 TWh (0.5 TWh). Illustrative of the decrease in the demand for energy peat is that the financial year reported here includes 1.5 heating seasons whereas the reference period includes one heating season.
Turnover from environmental peat was EUR 34.9 million (EUR 37.2 million) and the operating result was EUR 4.7 million (EUR 3.7 million).
When compared to the previous season, peat production in summer 2013 was successful as a whole, which improved the operating result and, following a difficult season last year, there is now a sufficient amount of high-quality energy and environmental peat available. Investments focused mainly on improving water treatment systems and on upgrading production areas and production machinery.
The business area includes the forest fuel and pellet business operations in Finland, Sweden, Estonia, Poland and Denmark.
The turnover of the business area in the extended financial year 1 January 2013–30 April 2014 was EUR 182.1 million (EUR 165.4 million in 1 January–31 December 2012). The operating result for the period was EUR 2.8 million (EUR -8.1 million). The operating result includes one-off items of EUR -0.4 million (EUR 3.4 million). Gross investments were EUR 1.3 million (EUR 0.9 million).
Turnover from forest fuels and sawmill industry by-products was EUR 69.5 million (EUR 65.2 million) and the operating result was EUR 1.2 million (EUR -2.7 million). 3,359 GWh of forest fuels were sold (3,183 GWh). Of this, 2,911 GWh was sold in Finland (2,222 GWh) and in the Baltic countries and Sweden a total of 449 GWh (961 GWh).
Turnover from pellets was EUR 113.0 million (EUR 100.2 million) and the operating result was EUR 1.5 million (EUR -5.4 million). The Group's pellet deliveries totalled 603,000 tonnes (560,000 tonnes). Pellet sales during the financial year spread among the market areas as follows: 221,000 tonnes/1,060 GWh were sold in Finland (146,000 tonnes/701 GWh) and 333,000 tonnes/1,600 GWh in Sweden (230,000 tonnes/1,100 GWh). In Poland, pellet sales were 13,000 tonnes (61,000 tonnes) and in Denmark, 36,000 tonnes (123,000 tonnes). When peat pellets were included within the scope of peat taxation, their demand plummeted in Finland.
In Finland, demand for wood fuels is increasing as energy companies are starting to use renewable fuels to an increasing extent. Nevertheless, there are major regional variations in demand and its growth. In the Nordic countries, the consumer segment is not growing whereas growth can be expected in the large-customer segment and industrial heat production.
In Sweden, the pellet business operations of Lantmännen Agroenergi AB and Vapo's subsidiary Neova AB were transferred into a jointly owned company. The joint venture started its operations in June 2014.
The business area has operations in Finland, Sweden and the Baltic countries. During the past financial year, the Polish heating business operations were discontinued.
The turnover of the business area in the extended financial year 1 January 2013–30 April 2014 was EUR 143.9 million (EUR 105.5 million in 1 January–31 December 2012). The operating result for the period was EUR 9.3 million (EUR -0.6 million). The operating result includes one-off items of EUR -2.5 million (EUR -3.0 million). Gross investments totalled EUR 15.1 million (EUR 7.0 million).
The exceptionally warm winter 2013–2014 reduced demand for heat and steam. Deliveries of heat and steam to customers totalled 2,292 GWh (1,795 GWh). Electricity sales were 172 GWh (112 GWh). In Finland, a total of 1,676 GWh of heat and steam were supplied (1,293 GWh) and 172 GWh of electricity was sold (112 GWh). In Sweden, a total of 579 GWh of heat and steam were supplied (475 GWh) and in the Baltic countries, 37 GWh (27 GWh).
Of the heat, steam and electricity produced by the business area, 56% (53%) were produced from wood fuels, 33% (32%) from peat and 11% (14%) from other fuels. The peat tax increase and the lowering of wood chip production subsidies that took place in Finland in 2013 increased the cost level and created pressure to raise the prices of heat and steam. For their part, the low electricity prices impaired profitability.
Kekkilä operates in the international market and has production in Finland, Sweden, Estonia and Norway.
The turnover of the Kekkilä Group in the extended financial year 1 January 2013–30 April 2014 was EUR 125.7 million (pro forma: EUR 92.1 million on 31 December 2012, unaudited). The operating result for the period was EUR 1.8 million (pro forma: EUR 3.8 million). The operating result includes one-off items of EUR -1.7 million (pro forma: EUR 3.9 million). The result for the reference period in 2012 includes a EUR 2.6 million insurance indemnity for the fire at the Eurajoki agricultural peat plant and an increase of EUR 0.4 million in the peatland after-use reserve. The establishment of the Kekkilä Group generated allocated goodwill, and depreciations related to this allocated goodwill impair the result for the period by EUR 1.5 million (EUR 0.0 million). Gross investments totalled EUR 6.3 million (EUR 28.9 million).
During the financial year, the turnover of the consumer business was EUR 65.1 million (EUR 43.7 million), the turnover of the professional growing business was EUR 35.9 million (EUR 26.2 million), the turnover of the landscaping business was EUR 15.1 million (EUR 12.9 million) and the turnover of the environmental management business was EUR 7.8 million (EUR 8.1 million).
The extended financial year includes two consumer business sales seasons, which increases the relative turnover and operating result when compared to a 12-month financial year. The 2013 horticultural season in consumer markets was exceptionally short, which decreased turnover. In spring 2014, the season was unusually early, and consequently, some of the turnover that is normally generated in May was already generated in March–April.
At the beginning of the financial year, the price of peat raw material was exceptionally high due to the poor peat production situation in summer 2012. Peat production in summer 2013 was more successful, which has contributed to offsetting the increase in product costs caused by the previous season. In the Norwegian consumer market, profitability is being eroded by import of finished products
and raw peat from Sweden and Estonia.
Vapo Timber Oy
After Vapo Timber Oy sold the business operations, fixed assets and inventories of the Hankasalmi sawmill unit to Versowood Oy on 1 January 2014, Vapo Timber Oy's business operations include the Kevätniemi and Nurmes sawmills. All of the Hankasalmi sawmill's personnel transferred to the new owner with unchanged terms of employment.
Vapo Timber Oy's turnover in the extended financial year 1 January 2013–30 April 2014 was EUR 179.7 million (EUR 112.5 million in 1 January–31 December 2012). The operating result for the period was EUR -5.2 million (EUR -10.9 million). The operating result includes one-off items of EUR -0.9 million (EUR 1.0 million). Gross investments were EUR 3.2 million (EUR 2.9 million).
Deliveries of sawn timber in the period from January 2013 to April 2014 were 733,000 cubic metres (491,000 m3).
In Finland, the demand for sawn timber is still low, but the fact that construction activity in Europe is picking up and demand in the North African market has remained stable predicts an improvement in the result of the sawmill business. However, this requires the continuation of problem-free raw material supply with regard to both domestic timber and timber imported from Russia.
The impact of group administration and other business activities on the operating result of the extended financial year 1 January 2013–30 April 2014 was EUR -17.0 million (EUR -6.7 million in 1 January–31 December 2012). The operating result includes one-off items of EUR -7.0 million (EUR -0.7 million). Gross investments totalled EUR 3.7 million (EUR 0.7 million).
The targets set in the EU's climate and energy strategy did not contain targets for renewable traffic fuels. Consequently, Vapo Oy's Board of Directors decided to interrupt the preparations for the Kemi biodiesel project in February 2014. The impact of Forest BtL Oy on the result of the period was EUR -5.5 million (EUR -0.6 million).
Mustankorkea Oy's turnover in the extended financial year 1 January 2013–30 April 2014 was EUR 13.4 million (EUR 9.8 million in 1 January–31 December 2012) and the operating result was EUR 2.9 million (EUR 2.1 million).
Turnover by segment includes internal sales to other segments.
Operating result by segment
When calculating the operating result for a segment, the Group's internal business transactions have been valued at market price.
Cash flow, investments and financing
Free cash flow before taxes was EUR 54.2 million (EUR 64.2 million). The operating margin (EBITDA) was EUR 110.9 million (EUR 52.2 million), and working capital increased, reducing cash flow by EUR 27.5 million (in 2012, working capital decreased by EUR 38.9 million). Net investments were EUR 29.1 million (EUR 26.9 million).
Gross investments in the past financial year were EUR 65.0 million or 120 per cent of the amount of depreciation (EUR 48.0 million, 114%). The year's most significant investments were related to reducing emissions to watercourses by peat production. The gross investments are broken down as follows: the Peat Products business area EUR 38.6 million, the Wood Fuels business area EUR 1.3 million, the Heat and Power business area EUR 15.1 million, Vapo Timber Oy EUR 3.2 million and the Kekkilä Group EUR 6.3 million. Other investments by the Group were EUR 3.7 million.
Interest-bearing net debt at the end of the financial year was EUR 329.0 million (EUR 355.9 million). Interest-bearing net debt includes a EUR 5 million convertible bond issued by Vapo's subsidiary. The ratio of interest-bearing net debt to operating margin (net debt/EBITDA) on 30 April 2014 was 4.4 (6.8 on 31 December 2012). Short-term interest-bearing debt was EUR 92.0 million (EUR 124.2 million). The equity ratio at the end of the financial year was 39.4 per cent (36.9% on 31 December 2012) and the gearing ratio was 110.3 per cent (123.4%). The consolidated balance sheet total was EUR 786.9 million (EUR 801.7 million). Group net financing items were EUR -17.2 million
(EUR -6.4 million). Net financing items were 2.0 per cent of turnover (1.0%).
Changes in the organisation
The new operating model was adopted at the beginning of the financial year 2013. In the new organisation, Vapo Oy has three business areas: Vapo Peat Products, headed by Pasi Koivisto, Vapo Wood Fuels, headed by Juhani Ylä-Sahra, and Vapo Heat and Power, headed by Markus Hassinen.
Jyrki Vainionpää was appointed Vapo Oy's Chief Operating Officer as of 1 April 2014. He is responsible for Vapo Oy's regional organisation. Vainionpää is also a member of Vapo Oy's Management Team. Before his current position, he worked as Vapo Oy's Chief Financial Officer.
Suvi Kupiainen was appointed Vapo Oy's Chief Financial Officer as of 1 April 2014. She is also a member of Vapo Oy's Management Team. Kupiainen joined Vapo from Vapo Timber Oy.
Changes in the Group structure and internal restructuring
In February 2014, Vapo Oy's Board of Directors decided to freeze the Kemi biodiesel project, and Forest BtL Oy's operations have been interrupted.
The merger of Neova AB's wood pellet business operations and Lantmännen Agroenergi AB, a company operating in Sweden and Latvia, was set out in February 2014 and approved by the EU's competition authorities in May 2014. The company started its operations at the beginning of June 2014. In future, the result of the joint venture will be included in Vapo's financial statements as an associated company.
In January 2014, Vapo Timber Oy sold the Hankasalmi sawmill to Versowood Oy.
In November 2013, Vapo Oy sold Seda AS, its Latvian subsidiary, to Kalloveen BVBA, a Belgian/Dutch company. Seda AS is one of the largest producers of agricultural peat in Latvia.
In Norway, Hasselfors Garden AS acquired Høstekompaniet DA, a limited partnership owning peat production rights, with an agreement signed on 17 October 2013. Hasselfors Garden AS acquired 99 per cent of the company and Andøytorv AS one per cent of the company. The company acquired has peat production rights to a total area of 22 hectares.
On 3 October 2013, the Group's Swedish subsidiary Neova AB acquired Brostorpsmossen AB, a company owning peat production rights. The company acquired has peat production rights to a total area of 225 hectares.
On 1 March 2013, Vapo Oy turned the Salo power plant into an independent company, Salon Energiatuotanto Oy.
In May 2012, Vapo Oy agreed the sale of Mustankorkea Oy to the City of Jyväskylä. On the consolidated balance sheet, the external assets and debts of Mustankorkea Oy have been separated out as assets and available-for-sale assets and debts in line with IFRS. The transaction has been appealed and it has not yet been concluded.
In line with the Group's strategic policies, Vapo Oy has decided to withdraw from the Polish market and has placed its subsidiary Vapo SP zo.o. in liquidation in January 2014.
Change in the financial year
In October, the Extraordinary General Meeting approved the proposal about changing the financial year and extending the current financial year to a 16-month period ending on 30 April 2014. The financial year will change from the current calendar year to the period 1 May–30 April and the company will also move from quarterly reporting to tertial reporting. Thanks to the change in the financial year, production in the core businesses, production costs and the proceeds from products and services sold are now allocated to the same financial year, which clarifies operative and financial management of operations.
In future, the first tertial of the year will begin on 1 May and end on 31 August. This period includes peat production and preparations for the heating season. The second tertial of the year (1 September–31 December) and the third tertial of the year (1 January–30 April) cover the heating season. This change in the financial year and the tertial reporting support the seasonal fluctuations in the businesses.
Natural seasonal fluctuation in activities
The sales volumes of the Peat Products and Heat and Power business areas are heavily dependent on seasonal temperatures. Changes in the weather also have a significant impact on the Kekkilä Group's consumer business in the consumer sector. This results in seasonal fluctuations in sales.
The warm weather during the financial year and low electricity prices have decreased demand for district heat, energy peat and electricity. The Kekkilä Group's result is improved by the fact that there were two consumer business sales seasons in the same financial year.
Thanks to good weather conditions, the start of peat production was record-breaking early in April.
On 30 April 2014, Vapo Group employed 1,091 persons (1,154 persons on 31 December 2012). Vapo Oy sold its equipment production unit in Haukineva, Seinäjoki to Peatmax Oy of Tampere in October 2013, and 13 of the unit's 15 employees transferred to Peatmax Oy with unchanged terms of employment. In January 2014, Vapo Oy sold Vapo Timber Oy's Hankasalmi sawmill to Versowood Oy, and the 89 employees of the sawmill transferred to the new owner with unchanged terms of employment.
During the financial year 1 January 2013–30 April 2014, the Group's codetermination committee convened three times and the company-specific codetermination committees convened two times each. The Supervisory Board, in which the personnel has three representatives, convened five times during the financial year.
Financial Statements and Board of Directors' Report (pdf)
Tomi Yli-Kyyny, CEO, Vapo Oy, tel. +358 20 790 5605
Suvi Kupiainen, CFO, Vapo Oy, tel. +358 20 790 5516
Ahti Martikainen, Director, Communications and Public Affairs, Vapo Oy, tel. +358 20 790 5608

redpajama_set_name: RedPajamaCommonCrawl


text:
SOURCE: LAT
Jon Wiener: You're Mistaken If You Think Declassifying Government Documents Means Making Them Available
Roundup: Historians' Take
[Jon Wiener is a contributing editor of The Nation and professor of history at UC Irvine.]
ON DEC. 31 at midnight, hundreds of millions of pages of secret government documents were automatically declassified ˜ the result of President Bush's Executive Order on Declassification, which covers all national security documents 25 years old or older.
They included 270 million pages of FBI files, according to the New York Times, covering, among other topics, the civil rights movement, 1960s anti-war protests and organized crime up to 1981. In all of American history, there has never been anything like this avalanche of information.
But if you called the National Archives on Wednesday, as I did (it was closed Tuesday for the national day of mourning for President Ford), you would have been told that none of these newly declassified documents are available ˜ and won't be, maybe for years.
Automatic declassification is a wonderful idea. "Our democratic principles require that the American people be informed of the activities of their Government" ˜ that's what President Clinton wrote when he ordered 25-year automatic declassification in 1995. The target date for compliance was extended several times, but then, in 2003, Bush surprised his critics by setting a firm deadline. Over the years, some documents were released in anticipation of the deadline.
But the obstacles to actually seeing the vast majority of these documents anytime soon are huge. Declassification, it turns out, is not the same as release. Some documents will remain classified, and others will be declassified but still withheld. Bush's executive order specifies nine grounds for exemptions, and dozens of other existing laws restrict the release of certain kinds of information.
Many restrictions are reasonable: The Privacy Act, for instance, prohibits release to a third party of any government information on a living person ˜ so I can't get your FBI file, and you can't get mine. The Atomic Energy Act protects information on how to build nuclear weapons.
Some of the exemptions, however, are more troublesome and can easily provide excuses to agencies that want to keep secrets. One, for instance, covers information that might "reveal the identity of a confidential human source."
Obviously, people who have been promised confidentiality should not have their names released. But the FBI has extended that principle (which is also part of the Freedom of Information Act) to cover not just the names of sources but also the information they provided. The bureau argued that release of the information might lead a knowledgeable person to figure out the source's identity. On this basis, all information provided by all confidential sources could be withheld.
Also exempt: information that might reveal the FBI's "sources and methods." In the past, the FBI has claimed this exemption for information obtained through wiretaps ˜ because a wiretap is a "source and method" ˜ even though it's not exactly a secret that the FBI uses wiretaps. But if you withhold all the information provided by informants and wiretaps, not much is left except for newspaper clippings.
Then there's the exemption for information provided by a foreign government. This is the one that tripped me up in my 23-year battle to get John Lennon's FBI files. The last 10 documents were released last month ˜ but rather than revealing sensitive foreign intelligence that would compromise an allied government, they contained only innocuous information about Lennon's antiwar activities in London in 1971 that had always been publicly known.
Thus the policy known as "automatic declassification" does not in fact mean that 25-year-old national security information will be automatically declassified. It means that the material must be, in the words of the Justice Department, "reviewed for declassification, exemption, and/or referral to other government agencies."
The last phrase, "referral to other government agencies" sounds benign but in fact provides a huge loophole. The Justice Department, for example, reported that in 2006 it reviewed 57 million pages, of which 11 million ˜ 20% ˜ were declassified, while 46 million pages, or 80%, were referred to other agencies.
Virtually all important documents involve multiple agencies. If you wanted to look, say, at Reagan-era memos about U.S. support for Saddam Hussein, those meetings probably involved the CIA, the National Security Council and the Defense and State departments. If even one of those agencies wanted to withhold a document, it would be withheld. (There is a deadline for the processing of the material that has been referred to other agencies ˜ three more years.)
And there is one more huge obstacle. Documents that are deemed releasable are to be sent to the National Archives, which is then supposed to make them available to the public. But the National Archives already has a backlog of 400 million pages. Oh, and its budget for next year has been cut.
Congress needs to appropriate additional funds for the National Archives if the 25-year automatic-declassification policy is to have any meaning. This may not be on the agenda for the Democrats' first 100 hours ˜ but it ought to be in their first 100 days. Rep. Henry Waxman of Los Angeles and Sen. Joe Lieberman of Connecticut chair the responsible House and Senate committees. They should take the lead because the American people should be informed about the activities of their government.
Read entire article at LAT


Schedule your donation online. Fill out the form below.
Tickets are on sale for Habitat for Humanity Moncton's second annual Chairs For Charity fundraising event! WHERE TO BUY? Habitat for Humanity ReStore – Moncton Eventbrite.com At the event: 331 Acadie Ave, Dieppe Get more details by visiting habitatmoncton.com/chairsforcharity or checking out our Facebook event.


I had never heard the word myofascial. I had been going thru something new these last two months. Laying in bed I struggled to find a comfortable place for my legs. Every 30 to 40 seconds I'd feel so much discomfort I had to move and try another position. I was so dismayed. When I looked at the clock it said I've been doing this for 40 minutes! I felt I would never get to sleep. Something had to change. At this point I had only read about chronic myofascial pain.
-ee-uhl] pain with fibromyalgia but only in the context of it being a double whammy in the pain department. I knew my fascia were hurting, but now this was unbearable.
My doctor had tried a compounded cream when she had planter fascitis. She said, 'this works!' So she ordered some for me. I was anxious for it to come in the mail.
I followed the directions and rubbed in it for two minutes at each place. Continuing with the rest of my day, I felt wonderful relief when I rubbed it in all over both legs! It was a lot of work but it was worth it. I'm so sorry that I don't remember the name of it.
Myofascia is the thin and almost translucent film that wraps around muscles. You can see this sticky white film covering some of the chicken parts you buy at the grocery. It supports and gives shape to your musculature. This pain over this web like system can be diagnosed as Chronic Myofascial Pain.
Fibromyalgia and chronic myofascial pain (CMP) share muscle pain as a symptom. There is no cure for fibromyalgia, but we know there is a lot we can do to ease that pain. But CMP is a condition that is potentially curable, with thoughtful treatment of the specific trigger points, and corrective action to prevent their recurrence. This can only happen if there are no perpetuating factors, a fixed uncorrectable underlying cause.
Fascia can became attached to muscles, but massage is the best treatment.
Fibromyalgia and CMP have similar symptoms. Patients with widespread muscle pain have been diagnosed with fibromyalgia, but in fact their pain is from CMP or some other source. Even fibromyalgia literature is repleat with references to myofascial pain and symptoms.
If your doctor tells you he's never seen a patient with just FM or just CMP, so they must be the same condition. Right? Nope. It takes a great deal of training and experiences to palpate trigger points. We need more doctors trained in this area! It is important for your medical team members to understand that complex overlapping pain patterns exist in chronic pain patients. One patient could have FMS and CMP as well as joint problems and other factors causing pain. Each of these should be treated separately. Treatment must proceed carefully.
Dr. Gerwin was one of the first doctors who studied these conditions separately. He grasped and recognized the study of Dr. Travell and Simon's advanced work on trigger point therapy. The fascia causes pain by tightening around muscle. Fascia also can began to harden. This is only one reason that movement is so important. Be careful not to over exercise, but stretching and walking is favored amoung doctors.
I savor the taste and breathe of life. I embrace life and all its colors, sounds, and textures. I gather my dreams and give them wings. I am filled with joy and wonder.
Comments have been closed because of spam.


text:
Q: Compiler/Hardware optimizations of code and relaxed atomics I've been listening to Herb Sutter's Atomic Weapons talk and there's a slide where he discusses released atomic variables and optimizations on code. My question has more to do with what compiler optimizations are allowed to do and what they are not. Memory_order_relaxed is this magic that allows atomic operations to float about inside the function they are used in.
Consider the following snippet (count is an atomic variable) (assume that all uses of count have been shown)-
//threaded function
// function start
...
while(...)
{
    ...
    if(...)
         ++count.fetch_add(1,memory_order_relaxed);
    ...
}
...
// function end

//main thread
int main()
{
   launch_threads();

   join_threads()
   cout<<count.load(memory_order_relaxed);
}

Specifically, in the thread function, count is allowed to be moved anywhere in the function. In this context, please clarify if my assumptions are right-

*

*Logically, this means that the if(...) should also move along with it and hence the conditional can be placed anywhere within the while(...).

*Since the while(...) contains the relaxed variable, it should be able to move up and down inside the function block with no restrictions.

*Can the count variable be moved out of the if(...)/while(...) and be replaced with a register of some sort?

If there are any links that can help me better understand the scope of compiler optimizations, do add them.


I've said it before and I'll say it again – one of the perks of academia is the exotic locations chosen for conferences. No-one ever says "Hey, yeah, woah, let's have the 34th International Symposium on Body Lice in Ringwood East". In fact, organising committees collude to go to the most interesting places (for them) that they can. For example, the 2010 International Nuclear Physics conference was in Vancouver. Awesome. The 2013 edition was in Florence. Awesome. As the ethos is to go from continent to continent, the next was to be in Asia, and with three submissions from countries in the region, the committee decided on... Australia, because the committee saw it is more exotic than China or Japan. Even though there are 3 tenured professors of nuclear physics in Australia, as compared to the giant labs in Japan teaming with professors. They committee did, however, stuff up slightly – it will be in Adelaide, which may as well be Ringwood East.
But I digress. The point I was coming too was that the 13th International Conference on Nuclear Reaction Mechanisms (as with, I believe the 1st to 12th) was in a villa at the tiny lakeside town of Varenna, where that lake is Lake Como, from June 11 to 15 in 2012.
Luciano, my boss, his son, Matteo, and I drove there and were put up across the lake at a Bed and Breakfast in a slightly less tiny town called Vignola, which belonged to friends of Luciano's cousin, who lived in another of the little towns dotted along the shore. Each morning Luciano and I would drive from Vignola to Menaggio and then catch the ferry to work, while Matteo went out on the lake with the the B&B owners on their boat (indeed, Luciano skipped a day of the conference to join them).
In a free afternoon we marched up to the Castello de Vezio at the top of the hill overlooking the town, which housed medieval weapons and armour, plaster 'ghosts', various tethered birds of prey, physics professors with limited social skills (which, I've been rightly, is a problem that isn't 'going to go away') and fossils of a type of small dinosaur unique to the lake, whose progenitors were trapped when an avalanche originally turned the river into a lake. Good times. One of the professors with social skills, who happens to be the leader in the field, met us on the way down and we went through the usual routine of her trying to remember where I'm from – the first guess is that I'm a New Zealander, because that is where we first met. It's somewhat like the younger kids at school knowing the older kids, but not vice-versa.
The most interesting part of this trip, however, was not a location, however, but a person; a person I shall write about in the next instalment.


text:
Keywords: Newstart
Election is done, now to focus on what matters
Andrew Hamilton
It is time to return to the more important question of what matters for the future good of Australia. This is what governments and political parties are bound by tradition and by their own official rhetoric to serve. This, not electoral success or failure, should govern their actions and our response as citizens to their governance.
Politics of shame
John Falzon
I do not believe that most people do accept these violations of dignity, these instigations of shame. But the fact that we as a nation have tolerated these settings for so long makes it look like neoliberalism has crept into our souls, that we accept the institutionalisation of fear and shame.
Wake me up when the election is over
Eliza Berlage
A recent survey found one in three women under 30 are reconsidering having children because of fears of climate change. There are young people telling their parents they have a choice between voting for the Coalition, and getting grandkids. Yet the public is not waiting with bated breath for the result on election night. They are just be waiting.
My Newstart conundrum
Andrew McAlister
My JAP informed me I was required to do 21 hours per week of Mutual Obligation activity, in addition to looking for work. They assured me the 21 hours would help me remain focused on the task of finding work. I replied I would now have to stop doing the things that were keeping me motivated to satisfy my Mutual Obligation requirements.
Budget 2019-20 and the way forward for welfare
Joe Zabar
A proposal to take decisions around welfare payments out of politicians' hands is the best way forward. If the major parties are going to put supporting the most vulnerable in the 'too hard' basket, let an independent commission determine the rates at which various welfare payments can allow people to live a dignified life.
Budget 2019 boosts inequality
The much trumpeted projected budget surplus is built on the backs of people who are left out and often made to feel that they are left over, surplus to the economy: people on low pay or no pay, young people, sole parents, people experiencing homelessness, people living with a disability.
Election sweeteners a family affair
Both Labor and the Coalition would be wise to consider revisiting the Howard-era Family Tax Benefits to provide targeted relief to families. Both have taken their share out of the FTB bucket as a way to balance the budget. By doing so, they have left many families worse off. The restoration of some of the cuts to FTB would be a good a start.
Supporting those on the margins
'We can do this better by breaking down the silos and binding together our concern for nature, justice for the poor, commitment to society, and interior peace.' Opening Keynote Address by Fr Frank Brennan SJ at the Catholic Social Services Australia National Conference, Port Macquarie 19 February 2019.
Time to stop punishing the unemployed
El Gibbs
Australia's income support system and employment services have shifted to an ever harsher regime of compliance and penalty, while failing to find work for hundreds of thousands of people.
Being sick in Australia is harder than ever
I first got sick when I was 19. I am now in my 40s and still sick. I have tried myriad medications and treatments, and live with a now permanent disability. The public systems I have engaged with over this time have become increasingly adversarial. The gaps between systems are getting wider, and the expenses higher.
Stigmatising those in need is a grubby game
These initiatives are sideshows, grubby and voyeuristic. They mask the simple truth: that governments have the duty to respect people as human beings and not ciphers, to provide benefits that help people to live with self-respect, to take responsibility for the disadvantage of Indigenous Australians and to involve them in its healing.
Whose health matters?
Health spending takes up a significant amount of federal and state government spending. But is this to keep Australians healthy, or to treat us when we get sick? The budget was a missed opportunity to invest in preventative health measures, and to fix health inequalities through policies informed by the social determinants of health.


After 7 long months Neil Rogers, and Jorge return to the airwaves on WQAM. His take on Paxson, Clear Channel, and Huizenga. Henry Barrow from WAXY, Jeff Hy, fans, chronics, and Stem call. TV stations show up. Some former WIOD people including Bob Green drop by. Ellie Brecher gives Neil some tongue. Crossovers with the First Team, and Hank Goldberg. Thanks to Tony Simon for the great recording.


text:
Email and Forum Questions Profiles in IT: Charles Simonyi Grand Opening: Stratford's Richmond Campus Astronomers Watch Star Torn Apart by Black Hole RSA Details SecurID Attack Mechanics Facebook Opens Up Datacenter Design Website of the Week: OpenCompute Superconductivity Discovered 100 Years Ago
Email from Ron Krieger: Dear Tech Talk. First, regarding your interesting discussion about flash cookies last Saturday, I would appreciate your informed opinion about the inexpensive "Flash Cookie Cop" utility offered by PC Magazine:
Second, shy is it that downloaded or streamed videos (TV episodes and movies) usually strip out the closed captions or English subtitles that are typically included in the DVD or Blu-ray discs for the same shows? Is this a technical issue or just a cost-saving stratagem? Either way, it makes these downloads largely useless to hard-of-hearing friends and relatives who rely on CC or SDH. Thanks for your help and for your always-informative and enjoyable broadcasts. Ron Kreiger.
Tech Talk Responds: The trouble with Flash Cookie Cop is that they are charging $7.95 for it. I have since discovered that CCleaner, which is free, clears flash cookies. They are listed under the cookies section, which I previously thought were only browser cookies. The only advantage of Flash Cookie Cop it informs you each time a flash cookie is saved and gives you chance to block it. Of course, you can set your reader to block all Flash cookies using the Global Storage Settings panel that I discussed last week.
Email from Lauren: Dr. Richard Shurtz, I have recently moved from Outlook Express to Windows Live Mail. I have several verizon.net email addresses that are all being delivered into my WLM inbox. I am using Windows XP OS. I believe at some point during the set of WLM I was prompted to/forced to establish a hotmail acct/email address for WLM. I did. Now, what I am unclear about is, are my hotmail emails automatically being delivered into my WLM inbox? I see a 'sign in' option when I first open up WLM daily. Is that the ONLY way I can read my @hotmail emails or are they automatically able to be dumped into WLM with the rest of my @verizon.net emails. I have multiple email addresses and it is just not always clear to me where the hotmail emails are going. Appreciate your program and all your insights into IT. Thanks, Lauren
Tech Talk Responds: Windows Live Mail is the latest email client from Microsoft and is meant to replace two older programs – Outlook Express and Windows Mail Vista. Windows live mail can consolidate many email accounts into one client. It supports POP or IMAP protocol to access and download the emails. You can still go to the individual accounts and access them directly, if you wish. Multiple email accounts can be added on Windows Live Mail one by one.
Select Tools/Accounts/Add an e-mail account
The login details – username and password.
Incoming email server address and type
Outgoing email server address
Whether the outgoing email server requires authentication.
Check the Remember password box.
When a new email account is added on Windows Live Mail, the program creates 5 new folders – The Inbox, Drafts, Sent items, Junk e-mail and Deleted items – refer image below.
The last step is to modify the properties of the newly set up email account.
Right-click on the account in the left panel and select "Properties".
Under the generals tab, enter the reply email address and then shift your attention to the Advanced tab.
Uncheck the "Leave a copy of messages on server" unless you really want to store your emails online too.
If you are facing problems in sending emails from accounts added to Windows Live Mail, you simply need to change the settings for the Outgoing email server to match your ISP outgoing mails servers. Authentication may be required.
Email from Tung: Dear Dr. Shurtz, I have a friend in New Jersey who sends me jokes which are fun to read. I have not received any in two weeks even though she has been sending them. Why haven't I received any? Thanks, Tung
Tech Talk Respond: The email is probably being marked as spam. While jokes might not sound like spam, there may be other characteristics of the email that cause it to be treated as such.
First, it is probably a broadcast message:
Second, emails about sex, politics and religion are commonly labeled as spam.
When a filter evaluates a message as spam, it may also place weight on words and phrases that are common to spam.
Or perhaps other recipients have called it spam and your email provider has taken their recommendation.
About the only thing that you can do is find the message in your email provider's spam folder. If the message is there, mark it as "This is NOT spam", or whatever your provider uses for that determination. You might also have them send it to multiple email account and see which ones get through.
Profiles in IT: Charles Simonyi
Charles Simonyi is a computer software executive who, as head of Microsoft's application software group, oversaw the creation of Microsoft Office.
Charles Simonyi was born September 10, 1948 in Budapest, Hungary.
While in high school he worked part-time as a night watchman at a computer laboratory, overseeing a large Soviet Ural II mainframe.
He took an interest in computing and learned to program from one of the engineers.
By the time he left high school, he had learned to develop compilers and sold one of these to a government department and was hired by A/S Regnecentralen in 1966.
In 1968 he moved to the US to attend UC Berkeley where he earned a BSEE in 1972.
Simonyi enrolled in the Stanford graduate program and was hired by Xerox PARC
He and Butler Lampson developed Bravo, the first WYSIWYG document preparation program, which became operational in 1974.
He received his PhD in computer science from Stanford in 1977 with a dissertation on a software project management technique called "metaprogramming".
This approach sought to defeat Brooks' law by requiring all programmers to communicate through the manager rather than directly.
In 1981, he applied directly to Bill Gates for a job at Microsoft.
Simonyi oversaw the development of Word and Excel.
Simonyi introduced the techniques of object-oriented programming that he had learned at Xerox to Microsoft.
He developed the Hungarian notation convention for naming variables.
He left in 2002 to co-found Intentional Software Inc. with Gregor Kiczales.
This company markets the intentional programming concepts, where a programmer first builds a toolbox specific to a given problem domain.
Domain experts, aided by the programmer, then describe the program's intended behavior in a WYSIWYG-like manner.
An automated system uses the program description and the toolbox to generate the final program. Successive changes are only done at the WYSIWYG level.
In 2004, Simonyi received the Wharton Infosys Business Transformation Award for the industry-wide impact of his innovative work in information technology.
He dated Martha Stewart for 15 years until February 2008.
On November 2, 2008, Simonyi married a Swedish millionaire's daughter, Lisa Persdotter, who was 32 years his junior. He was 60; she was 28.
Simonyi spends six months per year on his 233-foot super yacht named Skat.
In early 2006, Simonyi expressed interest in becoming a space tourist.
He launched on April 7, 2007 on board Soyuz TMA-10. He returned from the International Space Station aboard Soyuz TMA-9 on April 21, 2007.
Charles Simonyi is a licensed amateur radio operator with the call sign KE7KDP.
On April 11, 2007 the American Radio Relay League reported that Simonyi was making ham radio contacts from space.
On March 26, 2009 he returned to space returning April 8, 2009.
Forbes estimated net work is $1B.
Grand Opening: Stratford's Richmond Campus
On April 6, 2011, we hosted the Grand Opening Ceremony for the Richmond campus.
The Keynote speaker was the Virginia Secretary of Education, Dr. Gerard Robinson.
The Greater Richmond Association for Commercial Real Estate awarded Stratford University and Thalheimer Real Estate, the GRACE award for the best renovation and reuse project for 2010.
The facility is 53,000 square feet and is located in Shortpump at the intersection of Interstate 64 and Broad Street.
It includes a full restaurant facility, culinary arts kitchens, health science labs, nursing labs, computer labs, circular library surrounded by glass, and a tied lecture hall that seats 80. It features several study work areas and a snack area with an outside picnic area.
The facility will support 2,200 students and employ 150 staff and faculty.
Classes began October 12, 2010. Enrollment is currently at 140 students and growing rapidly.
Astronomers Watch Star Torn Apart by Black Hole
On March 28, 2011, NASA's Swift satellite caught a flash of high-energy X-rays pouring in from deep space.
Swift is designed to do this, and since its launch in 2004 has seen hundreds of such things, usually caused by stars exploding at the ends of their lives.
This time it saw a star getting torn apart as it fell too close to a black hole
The event was labeled GRB 110328A (Gamma Ray Burst 03/28/2011).
Normal gamma-ray bursts are when supermassive stars collapse (or ultra-dense neutron stars merge) to form a black hole.
Although initially cataloged as a GRB, follow-up observations indicated this was no usual event.
The way the light grew and faded seemed to fit better with a star getting torn apart.
The observations indicate the black hole in question may have as much as half a million times the mass of the Sun, meaning it's very probably a supermassive black hole in the very center of a distant galaxy.
Hubble Space Telescope observations also place the event very near the center of a galaxy.
The center of every large galaxy (including our own Milky Way) lies a supermassive black hole, some with millions or even billions of times the Sun's mass.
Some of these, like our own, are sitting there quietly. Without matter falling into them, black holes are pretty calm.
In the case of GRB 110328A, something else happened.
Black holes have incredibly strong gravity, of course, but that gravity gets weaker with distance.
Stars are big, a million or more kilometers across, and that means one side of the star was substantially closer to the black hole than the other, so the near side feels a stronger pull of gravity than the far side of the star. This has the effect of stretching the star in a process called tides.
A star is held together by its own gravity. As the star in question here inched closer to the black hole, the force stretching the star got stronger, and at some point overcame its internal gravity. The star got literally torn apart by the black hole!
The material swirled around the black hole, forming a small and temporary accretion disk. Observations indicate that for a short time, two beams of matter and energy called jets erupted from the black hole, and it was the flash of tremendous energy from this that triggered Swift, and a flurry of observations from other telescopes cascaded from that.
RSA Details SecurID Attack Mechanics
EMC's RSA division has that it was compromised by a phishing attack — aka spoof emails — that used a zero-day Adobe Flash vulnerability.
But RSA still offered no details on the information the attacker stole.
Here's how the attack succeeded, according to what RSA:
The attacker sent two small batches of emails with "2011 Recruitment Plan" as the subject line to two small groups of EMC employees with an Excel spreadsheet attached, which at least some recipients executed.
But the spreadsheet included an embedded Flash file that executed malicious code via a zero-day vulnerability, enabling the attacker to gain full access to the PC and install software to more easily control it remotely.
The attacker in this case installed a customized remote administration tool known as Poison Ivy RAT variant.
Rather than receiving commands from a control server, tools such as Poison Ivy pull commands from an external server.
This connectivity method makes them more difficult to detect, as the PC reaches out to the command and control rather than the other way around.
Poison Ivy has been used in numerous other attacks, including the Operation Aurora attack against Google in late 2009.
After penetrating EMC's network, the attacker targeted credentials for people with access to high-value information, aggregated that information, and then exported it via FTP to an external Web site.
RSA's offered no additional information on exactly what the attackers stole, saying only that "RSA made it clear that certain information was extracted."
Adobe has since patched the vulnerability exploited by the RSA attacker.
Facebook Opens Up Datacenter Design
Just weeks before switching on a massive, super-efficient data center in rural Oregon.
Facebook is giving away the designs and specifications to the whole thing online.
In doing so, the company is breaking a long-established unwritten rule for Web companies: don't share the secrets of your server-stuffed data warehouses.
Most of those secret servers rely heavily on open source or free software, for example the Linux operating system and the Apache webserver.
Facebook's move—dubbed the Open Compute Project—aims to kick-start a similar trend with hardware.
Mark Zuckerberg was able to start Facebook in his dorm room because PHP and Apache and other free and open-source software existed.
Facebook wants to encourage that for hardware and release enough information about its data center and servers that someone else could go and actually build them.
Typically, companies like Google or Microsoft won't tell you anything about their designs.
Zuckerberg believes a more open approach could help the Web as a whole become more efficient.
The open hardware designs are for a new data center in Prineville, Oregon, that will be switched on later this month.
The 147,000-square-foot building will increase Facebook's overall computing capacity by around half; the social network already processes some 100 million new photos every day, and its user base of over 500 million is growing fast.
Website of the Week: OpenCompute
Web Address: http://www.opencompute.org
Facebook's energy consumption per unit of computing power has declined by 38%2.
The new data center has a PUE (Power Usage Effectiveness) of 1.073, well below the EPA-defined state-of-the-art industry average of 1.51. This means 93% of the energy from the grid makes it into every Open Compute server.
They have removed centralized chillers, eliminated traditional inline UPS systems and removed a 480V to 208V transformation.
Ethernet-powered LED lighting and passive cooling infrastructure reduce energy spent on running the facility.
Website includes complete server specs and data center center.
They hope others will copy the design and improve on it, releasing their improvements like open source software.
Superconductivity Discovered 100 Years Ago
On April 8, 1911, at the Leiden Cryogenic Laboratory in the Netherlands, Heike Onnes and his collaborators immersed a mercury capillary in liquid helium and saw the mercury's electrical resistance drop to nothing once the temperature reached about 3K or 3 degrees above absolute zero (around –270 Celsius).
This phenomenon of "superconductivity" was one of the first quantum phenomena to be discovered, although back then quantum theory did not exist.
In subsequent decades theoreticians were able to put quantum physics on a solid foundation and explain superconductivity.
Since then, researchers have discovered new families of materials that superconduct at higher and higher temperatures: the current record-holder works at a balmy 138 K.
Indeed, the promise of superconductors—power grids that waste no energy, computers that run at untold gigahertz of speed without overheating and, yes, trains that levitate over magnetic fields—has not fully materialized.
Still, superconductors have made it possible to build the strong magnets that power magnetic resonance imaging machines, which are the most important commercial application of the phenomenon to this day.
And scientists use superconductors in advanced experiments every day. For instance, particle accelerators at the Large Hadron Collider in Geneva rely on superconducting coils to generate magnetic fields that steer and focus beams of protons.
Some of the most accurate measurements in all of science are done thanks to superconducting quantum interference devices, or SQUIDs.
And finally, superconducting electrical transmission lines are here. Wires based on high-temperature superconductors (with liquid nitrogen–based cryogenics, which are technically simpler and much cheaper than liquid helium–based ones) have recently become commercially available.
A South Korean utility plans to install them on a large scale. Some U.S. scientists now say that it may be easier to get permits for and build a national superconducting supergrid than construct a conventional high-voltage system.
Previous articleShow of 4-2-2011
Next articleShow of 4-16-2011
Profiles in IT: Marian Rogers Croak
The Morris Worm turns 30
The real-life Mario has died
Next Generation Smart Glasses May Be Accepted
Radio Controlled Clocks (or Atomic Clocks)
Tim Cook wants Bloomberg to retract its spy chip story
Two Botnets Control Thousands Android Devices


Fusion Software Services Limited is a private limited company located at 51 Roman Paddock, Harrold, Bedford MK43 7FR. This 9 months-old company, incorporated on 2018-07-16 is run by 1 director.
Director Julie S., appointed on 16 July 2018.
The company is officially categorised as "information technology consultancy activities" (Standard Industrial Classification code: 62020), "business and domestic software development" (SIC: 62012).
The list of PSCs that own or control the company is made up of 1 name. As BizStats found, there is Julie S. This PSC has 75,01-100% voting rights and has 75,01-100% shares.


Extraterrestrial Abductions Day March 20th History and Photo #ExtraterrestrialAbductionsDay – Happy Extraterrestrial Abductions Day images and download free pictures. Extraterrestrial Abductions Day is today. Keep one eye on the sky. And, be ready to duck, dodge, and to hide. UFO's may be everywhere, looking to abduct humans. If you are not careful, perhaps they will find you! Of course, there are more than a few people out there who are looking to be abducted by aliens, so they can travel to another planet.
Our research did not find the creator, or the origin of this day. From what we have gathered, we believe the creator has been abducted. The suspects are believed to have have fled the area in a very high speed vehicle.


There is normal aging of the body with gradual changes and signs. Aging of the body depends on the genetic way but one's way of living has a powerful effect in showing signs of aging. Changes can be made in the lifestyle choice to slow down the process of aging.
Dark spots on the skin, otherwise known as hyper skin color, may be brought on by sun harm, Inflammation, or maybe other skin tone injuries, including those in connection with acne.
Dryness is usually exacerbated simply by wind, extreme conditions of heat and air-conditioning, all of which cause your skin layer to flake, chap along with feel restricted.
Ageing and the act of losing along with gaining pounds can reduce the tautness of skin along with result within the appearance of loose skin along with a persistently tired check out the face.
Dry skin may be uncomfortable along with unsightly developing scaly collections and lines. Fortunately, most dried out skin outcomes from environment friendly factors that could be wholly or maybe partially governed.
They can be a natural section of ageing. On the other hand, even younger looking skin may develop lines if it's broken by an excessive amount of sun or maybe by smoking.
Patchy discoloration on the skin may be caused simply by variations inside pigment (melanin) solidity, blood yacht (vascular) alterations, or expansion of overseas organisms on the skin.
Open pores are sometimes called a "strawberry nose". They can take place anywhere on the face, back again, chest or maybe upper hands.
Healthy aging shows some common signs of aging which can be delayed by leading a healthy lifestyle.
The skin loses its elasticity and appears lined and wrinkled. The growth of the fingernails slows down. The skin glands fail to produce oil which makes the skin dry and rough. Skin aging can be minimized by regular use of moisturizers and sunscreen lotion to protect the skin from the harsh rays of the sun. Hat and caps are also helpful accessories to protect the skin from the harmful rays of the sun.
The hair on the scalp, pubic area, and armpits gradually become thin. The growth of grey hair increases as the number of pigment cells in the hair tends to decline.
Hearing— a person tends to become hard of hearing because of the changes in the ear.
Vision changes take place normally by the age of 40. There is difficulty in reading and night vision reduces.
The pattern of sleep changes with age. One tends to sleep less and be awake for some time at night.
Red eyes are also associated with the aging process. It can be caused by chronic inflammation caused by arthritis in old age. But it can also be a result of seasonal allergies, long hours on computer screen or TV. The inflammation, pain and stiffness in the joints can be reduced by an alkaline diet that is rich in antioxidants. These include ripe fruits, greens, cucumber, almonds, garlic and sweet potatoes.
Droopy eyelids are fatty deposits around the eyes which can be due to several reasons like tiredness, allergy or fluid retention. The free radicals collect and damage the cells around the eyes and lead to droopy eyelids due to oxidative stress. This takes place normally on taking a poor diet that is full of processed foods. Hence chips etc. must be substituted with raw fruits and vegetables. Celery is found to reduce the puffiness around the eyes and make them look healthier.
Wrinkles and sagging skin is an unavoidable sign of aging. Sometimes this problem is faced by people in their twenties. This is the time bring drastic changes in the lifestyle to cope with the problem of sagging skin. Beauty foods consisting of vegetables and fruits will help in detoxing the body of the toxins. The stomach and liver can be cleansed well by drinking lemon in hot water early in the morning. Pears contain high fibres which help to cleanse the colon and so must be included in the daily diet. Cabbage is a good blood cleanser and is also rich in fibre. Turmeric is another agent that helps in enhancing the circulation of the blood which can improve the condition of the skin.
Skin tone or texture makes a remarkable change with age. The skin tends to look dry and scaly which can be due to malfunctioning of the thyroids or adrenal glands. Certain hormonal changes take place in the glands by age which can be result of insufficient waste product removal from the body. Soy and caffeine must be avoided as it can cause damage to the thyroid hormones. Millets contain manganese which helps to retain the colour of the hair. Some of the foods that cleanse the liver and kidneys are onions, lemons and carrots.
Stressed out feeling leads to faster aging. Stress can come from several physical, emotional problems and tension. Stress can make a person feel much older than his or her actual age. This can further lead to several health problems like weight gain, high blood pressure, heart attack and insomnia. One can easily keep a control on stress by taking a healthy diet, doing some exercises, connecting with people and following a regulated lifestyle.
The sign of aging is something you can get when you get the fine lines and wrinkles over your face. You need to find out the signs with this regard and go ahead with the correction process. The patches over your skin are really very unattractive when you are going through the public exposure. Only makeup will not work or make your wrinkles and fine lines get away. You actually need to get corrected from inside. Let us find some tips.
Sometimes the stress can also be a reason behind getting early signs of aging. In order to get free from stress you must go ahead with the process of meditation on a regular basis. All you have to do is, sit on a floor with a mat below you. Now sit by folding your legs from both the side to make a padmasana. Now close your eyes and concentrate on a particular subject. This will draw your concentration somewhere else and you will be free from stress. This will reduce your lines from forehead.
The naturally obtained Aloe Vera gel from the natural Aloe Vera plant would also work in a wonderful way. You need to cut a leaf from Aloe Vera plant. Now cut it from the middle and take out the gel portion from the same. Now apply the gel over your face and cover every portion of your face. Keep this for 10 minutes till it becomes completely dry. Once it has become dry you can wash it with water. This will help remove the dark spots from face.
For this remedy, you have to break an egg and make separation between the egg white and the yolk portion of egg. You need the egg white portion for your remedial action. Take the egg white and apply it evenly over your face. You need to let it dry for 15 minutes. Then you can wash it with water and see the difference. You also need to apply a moisturizer otherwise your skin will stay unprotected.


Clarets fans can now have Turf Moor in their living room after one Lego-mad supporter recreated every top level ground in the country out of the little plastic bricks.
Cardiff fan Jules Richards began building the replica stadiums in February 2015 when he knocked together his beloved Bluebirds' Cardiff City Stadium.
"A Sheffield Wednesday fan then asked for a Hillsborough one so I made that for him and then I thought why not build some more," he said.
Jules has gone on to build the grounds for all 92 teams appearing in this season's Premier League and EFL.
He has built four Turf Moors in that time – each comprising 1,300 bricks – all of which have been sold on to Clarets fans.
"Each Turf took me about 12 hours to do over the course of a few evenings," said Jules, who can be found on Twitter under the name 'Brick Stadiums of the 92'. "They cost about £190 for anyone who wants one.
"I've slowed down doing them now as my new job doesn't allow me as much time but I make a few here and there if I can for people."


text:
Miley Cyrus Joins Borgore For Topless Dance Party
'Special guest' Miley helped the DJ sing 'Decisions' during L.A. performance Saturday.
Miley Cyrus returned to the stage over the weekend for what might be one of her most risqué performances. The singer, looking particularly sexy in a buzz cut, crop top, skin-tight pants and over-the-knee snakeskin boots, performed alongside Israeli DJ Borgore Saturday night.
The DJ took the stage at the Music Box in Los Angeles and the singer joined him at around 1:30 a.m. to perform their track, "Decisions." It wasn't just Cyrus' look that was sexy — it how she was performing.
In footage posted online, Borgore told the room, "I promised you a special guest. Who's ready for my special guest? Make some noise!" and as soon as the track started playing, Borgore came out from behind his ice cream truck DJ booth and joined the scantily clad Miley onstage.
While onstage, Miley grinded, head banged and danced alongside a topless dancer onstage with the twosome. As she walked off stage, Borgore told the room, "Make some noise for f---ing Miley Cyrus!"
"I really wanted her here, really," he told Rolling Stone about asking the former Disney princess to join him at the show. He added that he never questioned his decision to work with Cyrus, "I didn't think twice before I did this. I was so certain this is gonna work."
Cyrus appeared alongside Borgore (and fiancé Liam Hemsworth) in a video for the track back in November. It features the twosome partying the night away, covered in cake — an allusion to the chorus of the track where Cyrus sings "Decisions, but I want it all so I get it all/ I wanna eat the whole cake/ I'm not sharing, I'm not sharing/ You should have learned how to bake."
The 20-year-old isn't just lending her voice to the Borgore track. She's also hard at work on her next album, hitting the studio with Pharrell and Mac Miller, Usmagazine.com reports. "I'm really proud of the album," Cyrus said. "It's my favorite thing I've done probably ever. It's all really different."
What do you think of Miley's new direction? Tell us in the comments!


20% Off Any Order of 2+ Bottles.
Looking for the best discount codes at Zytenz that can save your time and money this April? Now check out these popular deals and codes at spsklaf.org. You will find whatever you need here and all conpons are tested by our experts every day. Receive up to 35% with these current coupon codes when buying your most wanted products at Zytenz. Shop now and get extra savings on your orders with our current top discounts. It is a great time to buy, prices like this won't stay long!