April 19, 2008

Everything in Texas is absurdly far apart. Like, seriously. The shortest drive is like half an hour/twenty minutes. It’s absurd. Unless you want to go to CVS, the bank, Kroger, the walk-in-hair-cutter’s or the nail salon.

Our subdivision is giant. I do not understand my way around it. Also, the fun part is that there are sections. Some are fancier than others. But for each section, there are certain home builders you can choose from. And they each have plans you can choose from. And each plan has a few different options. Including different versions of the exterior. So it LOOKS like every house isn’t the same, even though they basically are on the inside.

My favorite game is called “Count Our House.” When we are driving to our house I like to count how many of our house there are. Because I know what the other exterior options are. Except we just take this really short route home, but on the short way there are already 4 of our house. It’s a fun game.

I am also thinking about trying to bring a comedian to school for Short Term. She is very pretty and a good team player, if you know what I mean. She is also funny. Though sometimes she is funnier than other times. But that is true of everyone. She has one funny joke that is a metaphor about teaching babies to roller skate that rings very true to my life. But this is something I need to figure out. Except I think the only way to contact her is through her MySpace. Which she does seem to pay attention to. But it just doesn’t seem very professional.

I like thinking that I am being cryptic. I do not think it works very well.

The Frasier on tonight is one with the loud woman. I do not like her. This is sad.


Q:

How to join MySQL data with GIS data using arcpy?

Here is my problem, I have a MySQL database with table in it that has 4 columns: ID, Owner, Address, Legal. And I also have an ArcGIS GDB that has a parcel layer that has in it a PID field. I am looking for a way to join this MySQL table and the ArcGIS GDB into a new GDB with all of the information from both in Python using arcpy. The PID field and the ID field match up, I am just not finding a way to to a join between a MySQL table and the GDB. Any help would be appreciated.

A:

If you're using 10.1 you'll need to add the "Add OLE DB Connection" button to Catalog.  With that tool you can connect to your MySQL DB directly, or through ODBC.  Once you use it to create a connection you can use that in your ArcMap MXD or ArcPY script to join to your GDB.  Here's the manual on the ArcPY syntax for joins:
ArcGIS manual for ArcPy joins


// Created on: 1994-03-23
// Created by: Bruno DUMORTIER
// Copyright (c) 1994-1999 Matra Datavision
// Copyright (c) 1999-2014 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.

#include <Extrema_ExtCC2d.hxx>
#include <Extrema_POnCurv2d.hxx>
#include <Geom2d_Curve.hxx>
#include <Geom2dAdaptor_Curve.hxx>
#include <Geom2dAPI_ExtremaCurveCurve.hxx>
#include <gp_Pnt2d.hxx>
#include <Precision.hxx>
#include <Standard_OutOfRange.hxx>
#include <StdFail_NotDone.hxx>

//=======================================================================
//function : Geom2dAPI_ExtremaCurveCurve
//purpose  :
//=======================================================================
//Geom2dAPI_ExtremaCurveCurve::Geom2dAPI_ExtremaCurveCurve()
//{
//}
//=======================================================================
//function : Geom2dAPI_ExtremaCurveCurve
//purpose  :
//=======================================================================
Geom2dAPI_ExtremaCurveCurve::Geom2dAPI_ExtremaCurveCurve
  (const Handle(Geom2d_Curve)& C1,
   const Handle(Geom2d_Curve)& C2,
   const Standard_Real         U1min,
   const Standard_Real         U1max,
   const Standard_Real         U2min,
   const Standard_Real         U2max)
{
  myC1.Load(C1, U1min, U1max);
  myC2.Load(C2, U2min, U2max);
  Extrema_ExtCC2d theExtCC( myC1, myC2 );

  myExtCC = theExtCC;

  myIsDone = myExtCC.IsDone() && ( myExtCC.NbExt() > 0);

  if ( myIsDone ) {
    // evaluate the lower distance and its index;

    Standard_Real Dist2, Dist2Min = myExtCC.SquareDistance(1);
    myIndex = 1;

    for ( Standard_Integer i = 2; i <= myExtCC.NbExt(); i++) {
      Dist2 = myExtCC.SquareDistance(i);
      if ( Dist2 < Dist2Min) {
	Dist2Min = Dist2;
	myIndex = i;
      }
    }
  }
}

//=======================================================================
//function : NbExtrema
//purpose  :
//=======================================================================

Standard_Integer Geom2dAPI_ExtremaCurveCurve::NbExtrema() const
{
  if ( myIsDone)
    return myExtCC.NbExt();
  else
    return 0;
}

//=======================================================================
//function : Points
//purpose  :
//=======================================================================

void Geom2dAPI_ExtremaCurveCurve::Points
  (const Standard_Integer Index,
         gp_Pnt2d&        P1,
         gp_Pnt2d&        P2) const
{
  Standard_OutOfRange_Raise_if
    (Index<1||Index>NbExtrema(), "Geom2dAPI_ExtremaCurveCurve::Points");

  Extrema_POnCurv2d PC1, PC2;
  myExtCC.Points(Index,PC1,PC2);

  P1 = PC1.Value();
  P2 = PC2.Value();
}

//=======================================================================
//function : Parameters
//purpose  :
//=======================================================================

void Geom2dAPI_ExtremaCurveCurve::Parameters
  (const Standard_Integer Index,
         Standard_Real&   U1,
         Standard_Real&   U2) const
{
  Standard_OutOfRange_Raise_if
    (Index<1||Index>NbExtrema(), "Geom2dAPI_ExtremaCurveCurve::Parameters");

  Extrema_POnCurv2d PC1, PC2;
  myExtCC.Points(Index,PC1,PC2);

  U1 = PC1.Parameter();
  U2 = PC2.Parameter();
}

//=======================================================================
//function : Distance
//purpose  :
//=======================================================================

Standard_Real Geom2dAPI_ExtremaCurveCurve::Distance
  (const Standard_Integer Index) const
{
  Standard_OutOfRange_Raise_if
    (Index<1||Index>NbExtrema(), "Geom2dAPI_ExtremaCurveCurve:Distance");

  return sqrt (myExtCC.SquareDistance(Index));
}

//=======================================================================
//function : NearestPoints
//purpose  :
//=======================================================================

void Geom2dAPI_ExtremaCurveCurve::NearestPoints
  (gp_Pnt2d& P1, gp_Pnt2d& P2) const
{
  StdFail_NotDone_Raise_if
    ( !myIsDone, "Geom2dAPI_ExtremaCurveCurve:NearestPoints");

  Points(myIndex,P1,P2);
}

//=======================================================================
//function : LowerDistanceParameters
//purpose  :
//=======================================================================

void Geom2dAPI_ExtremaCurveCurve::LowerDistanceParameters
  (Standard_Real& U1,
   Standard_Real& U2) const
{
  StdFail_NotDone_Raise_if
    ( !myIsDone, "Geom2dAPI_ExtremaCurveCurve:LowerDistanceParameters");

  Parameters(myIndex,U1,U2);
}

//=======================================================================
//function : LowerDistance
//purpose  :
//=======================================================================

Standard_Real Geom2dAPI_ExtremaCurveCurve::LowerDistance() const
{
  StdFail_NotDone_Raise_if
    (!myIsDone, "Geom2dAPI_ExtremaCurveCurve:LowerDistance");

  return sqrt (myExtCC.SquareDistance(myIndex));
}

//=======================================================================
//function : Standard_Real
//purpose  :
//=======================================================================

Geom2dAPI_ExtremaCurveCurve::operator Standard_Real() const
{
  return LowerDistance();
}

//=======================================================================
//function : Standard_Integer
//purpose  :
//=======================================================================

Geom2dAPI_ExtremaCurveCurve::operator Standard_Integer() const
{
  return myExtCC.NbExt();
}


62% of general counsels use Excel and email to manage contract data: survey - CallMeAL23
https://www.artificiallawyer.com/2020/02/13/62-of-gcs-still-use-excel-sharepoint-email-to-manage-contract-data/
======
vijucat
It seems to me that SQL, C++, and Excel VBA (in that order) are probably the 3
top evergreen skills that folks in the 80s or 90s are still able to utilize in
a career spanning 20+ years! JavaScript is probably the equivalent for this
generation.

~~~
ma2rten
Out of all major programming languages, JavaScript is the language that
changed the most in recent years.

~~~
londons_explore
I tried to teach someone new to programming javascript... I was quite
astonished at how hard it is to learn. Nearly anything you'd want to do, there
are 5 different ways to achieve it, together with 5 more
libraries/abstractions that help solve the issue, and they're all a bit
incompatible.

Have fun trying to integrate the "document.write('hello world')" example you
found from stackoverflow into a react app while being a beginner and not
really knowing why exactly they aren't compatible.

~~~
karatestomp
The inappropriately-leaked abstraction of the event loop is another big hurdle
for newbies in JS-land. Yes we have async/await so it's somewhat less gross
now but then that's another of those "5 ways to achieve it" things.

------
AzuraJergen
Excel, SharePoint and Email all have one thing in common. They are almost
universally used and have a low barrier to entry.

~~~
pier25
Ok, but why not use Google Sheets or Airtable instead of Excel?

~~~
kryptiskt
Privacy concerns. Why would you upload private information to a third party
for no advantage?

~~~
pier25
There are some advantages like version control or everyone working in the same
document with the latest data.

I've seen it dozens of times. Someone shares the wrong excel file then others
keep working with outdated data. Or maybe they all share a file in Dropbox but
someone didn't sync for some reason and kept working and generating changes
over an old file.

------
hateful
I have never met an application that's as easy to maintain as a spreadsheet
is. It's the only thing that feels like you're actually editing what you want
and not being hand cuffed by some constraint. It's the very definition of
WYSIWYG. There's a reason that the shared calendar of choice for my wife and I
is a Google Sheet and not Google Calendar.

~~~
Ididntdothis
If there was only decent version control so you could go back quickly if
something goes wrong.

~~~
alexhutcheson
Google Sheets has this:
[https://support.google.com/docs/answer/190843](https://support.google.com/docs/answer/190843)

------
anodyne33
I'm in eDiscovery, we host trial databases in a really stout and intuitive
review platform. My clients can, after they've done their searching and culled
for relevance and privilege, browse through the document viewer and look at
either the text with highlighted search hits or the native rendering of all
their documents. All of their coding and tagging of documents is right there
in the side panel of the doc viewer. There's hardly a week that goes by that
an attorney or paralegal DOESN'T call and ask us for PDFs of their documents.
Until a few years ago it wasn't unusual for someone to call and ask paper
copies of hundreds of pages at a time to review.

The legal world is outstandingly slow to embrace better solutions in
technology.

~~~
geofft
Can I access your platform / document viewer offline?

~~~
anodyne33
No, and of course, that's the rub.

~~~
joshspankit
Seems like a gap in the market if someone steps in with offline sync (even
just one-way) and the ability to securely access files from a next-day
delivered USB stick.

~~~
anodyne33
We've done that for special case scenarios. The last review tool we used was
in a mixed Linux/Windows environment and we had a client in jail awaiting
trial so we built a laptop to run everything and our PM visited him weekly to
update his copy of the DB locally (no internet access in the pen). The biggest
sticking point is that it's not uncommon to get to 4-6 TB on one of our
databases and it takes a bunch of processors and memory to run the software,
but I smell a development opportunity now that you mention it.

~~~
geofft
One, you can get an external 6 TB hard drive for like $100. At attorney levels
of money, that's entirely reasonable.

Two, clearly in the pre-computer world, attorneys were not reviewing 6
terabytes of actual data for discovery. What makes it so big? Is it that you
have scanned PDFs in image format (such that it's a reasonable number of pages
printed out), or is it that you have new types of data like electronic records
that simply wouldn't have been picked up in the old days?

------
yters
My takeaway is that MS should double down on their office applications and
make them absolutely spectacular.

~~~
jerry1979
I think that Excel is already spectacular. That being said, if a C# or similar
lived inside excel as a first class language (instead of VBA), that would make
Excel unbelievable.

~~~
trobertson
Microsoft is doing basically this, except with Typescript instead of C#:
[https://docs.microsoft.com/en-
us/office/dev/scripts/overview...](https://docs.microsoft.com/en-
us/office/dev/scripts/overview/excel)

------
Alex3917
Keep in mind that their email probably doesn't look like your email. There are
literally thousands of tools that plug into email and/or build on top of it in
some way. Everything they're sending and receiving is going to be searchable
and auditable by multiple entities, both within and outside of the company,
and will stand up in court if challenged.

Just because they're "using email" doesn't mean they aren't also already using
specific tools for this purpose.

------
badrabbit
This way is pretty sane. With O365,they can have azure information protection
and MFA for security and easily share with onedrive(blocking all other
filesharing and USB helps a lot with this) Outlook hosted on O365 also has AIP
to prevent confidential data leakage. As others have noted,excel is great with
managing this kind of data and if you dislike VB macros: embedded python
support will be there this year!

------
_n_b_
I have spent a lot of time on contract negotiation and management for
engineering and EPC contracts. I can confirm that more or less, excel,
SharePoint, and email fits with my experience of how things are done in the
wild. (I do have some home-grown specialized tools I use for things like
claims tracking.) Every big contract is different, and tools with lots of
requirements are often not as adaptable to those nuances as a trusty excel
sheet that you've honed through the years.

However, my experience in utility EPC space is that contracts are negotiated
primarily by sales & supply chain people and reviewed by lawyers, and then
turned over to contract managers, who only get their legal departments
involved for advice or when there is an escalating problem that looks like it
might head for arbitration or court. So asking general counsels about this
seems like the wrong audience--at least out in my little segment of the real
world, it's contract managers who mange contracts, not lawyers.

------
colek42
Those tools are all excellent at getting work done.

------
platz
What's the alternative?

~~~
Ididntdothis
Have an IT department take over. Have things that took five minutes to change
previously now take weeks of writing requirements plus waiting for
implementation only to be told after a year that your request has been
descoped. Now you have a “professional” Solution but also some spreadsheets
because you actually have a job to do and need these changes and Excel is the
only way to do it quickly.

~~~
QuesnayJr
I once had a temp job where I would take data printed out from a mainframe,
and type it into a PC. I asked "Why not download it?" It turned out it was
easier to hire someone to type than to get any useful cooperation out of IT.

------
gmfawcett
Putting aside whether or not this is actually a problem: The survey is only
N=50, not N=10000, in spite of the article's emphasis on the second number.
Large firms are unlikely to use different techniques for managing different
contracts.

This is a white paper report from a legal AI company, not an academic study,
so some selection bias is to be expected.

------
tryitnow
What's wrong with using these products? This "study" doesn't appear to make a
distinction between using the products exclusively and using them in
conjunction with other products.

I'm betting every one of these large companies ALSO use specific contract
management software tools in addition to Excel Sharepoint and email.

I'm actually surprise MORE companies don't use this combination since almost
every large company makes use of MSFT office suite products.

I'm skeptical of any company trying to position itself as some sort of
replacement for products that have been used for decades.

I've drunk that Kool-Aid before and it never works out the way it's intended,
companies always fall back on some class Office suite products.

The sad truth is that you'll probably end up using Excel, Sharepoint, and
email in addition to whatever contract management solution you go with.

------
jmull
You can see the perspective of the authors of this article by the "Leaders"
and "Laggards" lists at the bottom.

E.g., the top "Leader" point is: "Will adopt AI-based contract risk mitigation
technology in the next 12 months."

I mean, who am I to tell "GC"s not to have some fun and fluff up their resumes
at the same time? But if you want to improve your capabilities to manage
contracts, buying AI solutions is not exactly a straight line to success.

------
joshspankit
My instinct says that their data structure is also a _nightmare_.

------
stef-13013
KISS

------
chadlavi
Only 62%?

~~~
oldgradstudent
Only 62% admitted to use Excel in a survey.

------
KineticLensman
GC = General Council, surveyed across 50 large corporate legal departments

~~~
dragonwriter
> GC = General Council

No, General _Counsel_ (Council is a group of people who make decisions,
Counsel is an advisor, especially, as in this context, a lawyer/legal advisor,
or their advice; “counsellor” is also used for a lawyer or advisor.)


Department of Civil Aviation (Thailand)

The Department of Civil Aviation (DCA; ) was a government department of Thailand from 2009 to 2015. Founded in 1933 as a bureau under the Ministry of Commerce's Department of Transport, it was elevated to department status under the new Ministry of Transport in 1963, and was originally called the Department of Commercial Aviation. It was renamed the Department of Air Transport in 2002, before becoming the Department of Civil Aviation in 2009. The department's responsibilities included prescribing, regulating, and auditing Thai civil aviation, as well as the management of Thailand's government-owned civil airports (not including the main international airports operated by the state enterprise Airports of Thailand PCL).

In October 2015, as part of restructuring in response to the ICAO's downgrading of Thailand's aviation safety rating, the DCA was split into two separate entities, the Civil Aviation Authority of Thailand (CAAT), which will conduct aviation regulatory oversight, and the Department of Airports, which will operate airports previously operated by the DCA.

2015 ICAO safety downgrade
In March 2015 the International Civil Aviation Organization's (ICAO) rejected a safety plan put forward by the DCA, which was submitted to ward off an imminent aviation safety downgrade. In January 2015 ICAO had carried out an audit and found serious gaps in safety standards at some Thai budget airlines. "The audit found that the Department of Civil Aviation had overlooked many regulations for the low-cost airlines," said one source. "Simple things like having airline manuals at ground offices, making sure you have two planes ready to relieve mechanical errors were all lacking". The ICAO said it would formally downgrade Thailand's safety ranking in early-June 2015 if the DCA were unable to fix the deficiencies by then. If safety is downgraded, all airlines registered in Thailand, including major carriers like Thai Airways would face possible bans on new routes. Existing routes would continue as normal. Japan and South Korea have already responded to the possible downgrade by banning requests for future flight plans and banning all charter flights from Thailand-registered companies. A source within Thai Airways criticized the Department of Civil Aviation, "Their lack of attention to detail is costing us all,..."

On 2 April 2015 a Thai civil aviation delegation journeyed to Seoul to attempt to deflect Korean sanctions. They failed to convince the Koreans. Three Thai charter carriers will not be permitted to fly to Korea in April. About 10,000 passengers will be affected. Japan had earlier granted Thailand a reprieve on sanctions, in effect allowing Thai charter carriers to continue to fly to Japan over the heavy 11 April–31 May travel season.

The ICAO assesses, among other things, personnel licensing and training, airworthiness assessment and certification, accident investigation, and airline operations oversight. The DCA is responsible for granting operating licenses to airlines operating in Thailand. Among the ICAO's concerns is that the DCA has issued operating licences to 22 airlines in just nine months. To date (March 2015), the DCA has issued operating licences to 70 scheduled and charter airlines. Sixty-one are still operational. Of these, 41 of are charter flight operators.

The prime minister, Gen Prayut, blamed the issue on understaffing, noting that the DCA has only 13 aviation safety inspectors. The DCA employs 1,514.

On 20 April 2015, Transport Minister Air Chief Marshal Prajin Juntong announced that Thailand would be unable to meet the ICAO's June deadline. "It is taking longer than we expected," ACM Prajin told reporters. "Our effort may be completed as late as mid-July 2015." Prime Minister Gen Prayut Chan-o-cha had said earlier that he would invoke emergency powers to "swiftly solve" Thai safety shortcomings. ICAO requirements, at minimum, will necessitate the writing and publication of an aviation safety manual by mid-year and, once that is done, the recertification of 41 airlines—28 foreign and 13 Thai—operating in Thailand.

In May 2015 the DCA announced that it will ask the US Federation Aviation Administration (FAA) to postpone its July 2015 inspection of Thai civil aviation operations until Thailand has tackled all the major safety concerns raised by the International Civil Aviation Organisation (ICAO).

References

Category:Aviation in Thailand
Category:Government departments of Thailand
Category:Defunct government agencies of Thailand
Category:Defunct transport organizations based in Thailand


Q:

How to create SOAP API in Magento2?

Today i have created Magento2 REST API, it's working. similarly how to create soap api in magento2?.
app/etc/config.php
'modules' =>
  array (
    'Learning_CalculatorWebService' => 1,
  ),

app/code/Learning/etc/module.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Module/etc/module.xsd">
    <module name="Learning_CalculatorWebService" schema_version="2.0.0"/>
</config>

app/code/Learning\CalculatorWebService\Api
<?php

namespace Learning\CalculatorWebService\Api;

interface CalculatorInterface
{
    public function add($num1, $num2);
}

app/code/Learning/etc/di.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/ObjectManager/etc/config.xsd">
    <preference for="Learning\CalculatorWebService\Api\CalculatorInterface" type="Learning\CalculatorWebService\Model\Calculator" />
</config>

app/code/Learning/etc/webapi.xml
<?xml version="1.0"?>

<routes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../app/code/Magento/Webapi/etc/webapi.xsd">

    <route url="/V1/calculator/add/:num1/:num2" method="GET">
        <service class="Learning\CalculatorWebService\Api\CalculatorInterface" method="add"/>
        <resources>
            <resource ref="anonymous"/>
        </resources>
    </route>

</routes>

app/code/Learning\CalculatorWebService\Model
<?php
namespace Learning\CalculatorWebService\Model;
use Learning\CalculatorWebService\Api\CalculatorInterface;

class Calculator implements CalculatorInterface
{
    public function add($num1, $num2) {
        return $num1 + $num2;
    }

}

And i have entered url http://192.168.0.52/magento-2/index.php/rest/V1/calculator/add/1/2
it's returning 3 working fine.
Similarly how to create Magento2 SOAP API?
Thanks.

A:

Finally I have acieved to debug getServiceMetadata() function from root/app/code/Magento/Webapi/Model/Soap/Config.php.
/**
     * Retrieve specific service interface data.
     *
     * @param string $serviceName
     * @return array
     * @throws \RuntimeException
     */
    public function getServiceMetadata($serviceName)
    {
        $soapServicesConfig = $this->getSoapServicesConfig();
        \Zend_Debug::dump($soapServicesConfig); exit;
        if (!isset($soapServicesConfig[$serviceName]) || !is_array($soapServicesConfig[$serviceName])) {
            throw new \RuntimeException(__('Requested service is not available: "%1"', $serviceName));
        }
        return $soapServicesConfig[$serviceName];
    }

After writing debug code from above method enter your webservice url from your browser like say http://192.168.0.183/NewMagento2/soap?wsdl&services=customerCustomerRepositoryV1 it will form a wsdl webservices. From this we can find core & custom webservices names.
more information look on Branko Article.


The rapid emergence of a multipolar world and the growing political and economic importance of a range of powers including China, India, Brazil and South Africa is increasingly having a significant impact on support for, and repression of, free expression. Many key international issues, from human rights to climate change and free trade, are no longer dominated either by one particular world view or split simply between two rival powers. While China and Russia remain at the repressive end of the spectrum, how widely free speech is defended internationally depends increasingly on the positions of countries like India and Brazil as much as on the values and practices of the US and Europe. In all these democracies, free speech is still in the ascendant but with too many examples of excessive constraints from internet surveillance and takedown requests to criminalisation of offensive speech.


/* Generated by RuntimeBrowser
   Image: /System/Library/PrivateFrameworks/NewsTransport.framework/NewsTransport
 */

@interface NTPBReportConcern : PBCodable <NSCopying> {
    int  _articleFeedCellHostType;
    int  _articleFeedCellSection;
    NSString * _articleParentFeedId;
    int  _articleParentFeedType;
    int  _backendArticleVersion;
    NSString * _clientId;
    NSString * _concernComments;
    int  _concernReason;
    NSString * _contentId;
    int  _contentType;
    int  _feedFeedType;
    NSString * _feedPresentationSearchString;
    int  _feedViewPresentationReason;
    struct {
        unsigned int articleFeedCellHostType : 1;
        unsigned int articleFeedCellSection : 1;
        unsigned int articleParentFeedType : 1;
        unsigned int backendArticleVersion : 1;
        unsigned int concernReason : 1;
        unsigned int contentType : 1;
        unsigned int feedFeedType : 1;
        unsigned int feedViewPresentationReason : 1;
        unsigned int publisherArticleVersion : 1;
        unsigned int isUserSubscribedToFeed : 1;
    }  _has;
    bool  _isUserSubscribedToFeed;
    int  _publisherArticleVersion;
    NSString * _referencedArticleId;
    int  _reportVersion;
    NSString * _userId;
}

@property (nonatomic) int articleFeedCellHostType;
@property (nonatomic) int articleFeedCellSection;
@property (nonatomic, retain) NSString *articleParentFeedId;
@property (nonatomic) int articleParentFeedType;
@property (nonatomic) int backendArticleVersion;
@property (nonatomic, retain) NSString *clientId;
@property (nonatomic, retain) NSString *concernComments;
@property (nonatomic) int concernReason;
@property (nonatomic, retain) NSString *contentId;
@property (nonatomic) int contentType;
@property (nonatomic) int feedFeedType;
@property (nonatomic, retain) NSString *feedPresentationSearchString;
@property (nonatomic) int feedViewPresentationReason;
@property (nonatomic) bool hasArticleFeedCellHostType;
@property (nonatomic) bool hasArticleFeedCellSection;
@property (nonatomic, readonly) bool hasArticleParentFeedId;
@property (nonatomic) bool hasArticleParentFeedType;
@property (nonatomic) bool hasBackendArticleVersion;
@property (nonatomic, readonly) bool hasClientId;
@property (nonatomic, readonly) bool hasConcernComments;
@property (nonatomic) bool hasConcernReason;
@property (nonatomic, readonly) bool hasContentId;
@property (nonatomic) bool hasContentType;
@property (nonatomic) bool hasFeedFeedType;
@property (nonatomic, readonly) bool hasFeedPresentationSearchString;
@property (nonatomic) bool hasFeedViewPresentationReason;
@property (nonatomic) bool hasIsUserSubscribedToFeed;
@property (nonatomic) bool hasPublisherArticleVersion;
@property (nonatomic, readonly) bool hasReferencedArticleId;
@property (nonatomic, readonly) bool hasUserId;
@property (nonatomic) bool isUserSubscribedToFeed;
@property (nonatomic) int publisherArticleVersion;
@property (nonatomic, retain) NSString *referencedArticleId;
@property (nonatomic) int reportVersion;
@property (nonatomic, retain) NSString *userId;

- (void).cxx_destruct;
- (int)StringAsArticleFeedCellHostType:(id)arg1;
- (int)StringAsArticleFeedCellSection:(id)arg1;
- (int)StringAsArticleParentFeedType:(id)arg1;
- (int)StringAsContentType:(id)arg1;
- (int)StringAsFeedFeedType:(id)arg1;
- (int)StringAsFeedViewPresentationReason:(id)arg1;
- (int)articleFeedCellHostType;
- (id)articleFeedCellHostTypeAsString:(int)arg1;
- (int)articleFeedCellSection;
- (id)articleFeedCellSectionAsString:(int)arg1;
- (id)articleParentFeedId;
- (int)articleParentFeedType;
- (id)articleParentFeedTypeAsString:(int)arg1;
- (int)backendArticleVersion;
- (id)clientId;
- (id)concernComments;
- (int)concernReason;
- (id)contentId;
- (int)contentType;
- (id)contentTypeAsString:(int)arg1;
- (id)copyWithZone:(struct _NSZone { }*)arg1;
- (id)description;
- (id)dictionaryRepresentation;
- (int)feedFeedType;
- (id)feedFeedTypeAsString:(int)arg1;
- (id)feedPresentationSearchString;
- (int)feedViewPresentationReason;
- (id)feedViewPresentationReasonAsString:(int)arg1;
- (bool)hasArticleFeedCellHostType;
- (bool)hasArticleFeedCellSection;
- (bool)hasArticleParentFeedId;
- (bool)hasArticleParentFeedType;
- (bool)hasBackendArticleVersion;
- (bool)hasClientId;
- (bool)hasConcernComments;
- (bool)hasConcernReason;
- (bool)hasContentId;
- (bool)hasContentType;
- (bool)hasFeedFeedType;
- (bool)hasFeedPresentationSearchString;
- (bool)hasFeedViewPresentationReason;
- (bool)hasIsUserSubscribedToFeed;
- (bool)hasPublisherArticleVersion;
- (bool)hasReferencedArticleId;
- (bool)hasUserId;
- (unsigned long long)hash;
- (bool)isEqual:(id)arg1;
- (bool)isUserSubscribedToFeed;
- (void)mergeFrom:(id)arg1;
- (int)publisherArticleVersion;
- (bool)readFrom:(id)arg1;
- (id)referencedArticleId;
- (int)reportVersion;
- (void)setArticleFeedCellHostType:(int)arg1;
- (void)setArticleFeedCellSection:(int)arg1;
- (void)setArticleParentFeedId:(id)arg1;
- (void)setArticleParentFeedType:(int)arg1;
- (void)setBackendArticleVersion:(int)arg1;
- (void)setClientId:(id)arg1;
- (void)setConcernComments:(id)arg1;
- (void)setConcernReason:(int)arg1;
- (void)setContentId:(id)arg1;
- (void)setContentType:(int)arg1;
- (void)setFeedFeedType:(int)arg1;
- (void)setFeedPresentationSearchString:(id)arg1;
- (void)setFeedViewPresentationReason:(int)arg1;
- (void)setHasArticleFeedCellHostType:(bool)arg1;
- (void)setHasArticleFeedCellSection:(bool)arg1;
- (void)setHasArticleParentFeedType:(bool)arg1;
- (void)setHasBackendArticleVersion:(bool)arg1;
- (void)setHasConcernReason:(bool)arg1;
- (void)setHasContentType:(bool)arg1;
- (void)setHasFeedFeedType:(bool)arg1;
- (void)setHasFeedViewPresentationReason:(bool)arg1;
- (void)setHasIsUserSubscribedToFeed:(bool)arg1;
- (void)setHasPublisherArticleVersion:(bool)arg1;
- (void)setIsUserSubscribedToFeed:(bool)arg1;
- (void)setPublisherArticleVersion:(int)arg1;
- (void)setReferencedArticleId:(id)arg1;
- (void)setReportVersion:(int)arg1;
- (void)setUserId:(id)arg1;
- (id)userId;
- (void)writeTo:(id)arg1;

@end


Nespresso VertuoLine by Breville

Experience the revolution of coffee. Meet Nespresso VertuoLine by Breville, a groundbreaking new way to enjoy freshly brewed coffee as well as rich, authentic espresso at the touch of a button. Thanks to completely redesigned capsules and an innovative new ...Read More

Savor freshly brewed coffee and espresso with rich crema.

Description

Experience the revolution of coffee. Meet Nespresso VertuoLine by Breville, a groundbreaking new way to enjoy freshly brewed coffee as well as rich, authentic espresso at the touch of a button. Thanks to completely redesigned capsules and an innovative new brewing system, the Nespresso VertuoLine by Breville brews both genuine drip-style coffee and espresso. Revolutionary Centrifusion technology instantly recognizes each capsule and automatically adjusts brewing to bring out the best of each blend. Customizable cup sizing—from as little as 0.3 ounces up to 17 ounces—allows you to tailor brewing to your needs, whether filling a travel mug or brewing just a little bit more.

Less than one percent of the world’s coffee meets Nespresso’s uncompromising standards, ensuring your cup, whether bold or mild, half-caff or hazelnut-flavored, coffee or espresso, is nothing short of coffee perfection. Full-bodied Nespresso coffee improves on traditional drip coffee with silky, aromatic crema that enhances every cup, and thanks to a wide range of capsules, you’re sure to find the brew that’s right for you. Unmatched convenience, impeccable results—Nespresso VertuoLine by Breville is smarter coffee.

Questions & Answers

Start typing your question and we'll check if it was already asked and answered. Learn More

Do not include HTML, links, references to other stores, pricing or contact info.

My question is about:

If your question is about more than one item, click + to add them.

Browse 1 question
Browse 1 question
and 6 answers

Why did you choose this?

Sur La Table Store

I tried this in Quebec at a market research facility where I was moderating and loved it. I do market research and UX research, so if you ever want to do research in Austin on expanding in the US market, be in touch at Sentier.

I tried this in Quebec at a market research facility where I was moderating and loved it. I do market research and UX research, so if you ever want to do research in Austin on expanding in the US market, be in touch at Sentier.


Signs Of Our Past: Porcelain Enamel Advertising In America

Sale

$62.92

Regular price
$78.94

Condition

Quantity

Attention: For textbook, access codes and supplements are not guaranteed with used items.

The beauty and diverse graphics found on porcelain enamel advertising has garnered interest from collectors worldwide. Here are some of the finest examples of advertising signs for petroleum, automobiles, gasoline, beer, paints and varnishes, telephone, tobacco, soda pop and more. Over 700 porcelain signs are included in this full color, informative book. Price guide included.


Pneumothorax in neonates: Trends, predictors and outcomes.
To examine rates, trends, predictive risk factors, and outcomes associated with pneumothorax in neonates. Retrospective analyses were used to estimate rates and assess trends in pneumothorax among early preterm (GA <32 weeks), moderate-late preterm (GA 32-36), and term (GA ≥37 weeks) neonates admitted to neonatal intensive care units (NICUs) participating in the Canadian Neonatal Network™ from 2005 to 2011. For each GA group, multivariable logistic regression models were derived to predict pneumothorax using risk factors with known clinical relevance. Additional logistic regression analyses assessed associations between pneumothorax and mortality, bronchopulmonary dysplasia, and intraventricular hemorrhage. The study included 71,237 neonates; of them 16,985 (24%) early preterm, 27,709 (39%) moderate-late preterm, and 26,543 (37%) term neonates. The overall rate of pneumothorax by GA was bimodal with estimates of 4.0%, 2.6%, and 6.7% respectively. No significant temporal trends were detected. Risk factors for pneumothorax included: a) for the overall lpopulation- Score for Neonatal Acute Physiology, version II >20, surfactant use, and respiratory distress syndrome; b) for early preterm infants-chorioamnionitis; c) for moderate-late preterm infants-higher birth weight, male sex, rupture of membranes >24 hours, and outborn status; and d) for term infants- male sex, outborn status, and meconium aspiration in term neonates. In early preterm neonates, pneumothorax was associated with mortality, bronchopulmonary dysplasia, severe intraventricular hemorrhage, and prolonged NICU stay. Pneumothorax rates were higher among term and early preterm neonates admitted to the NICU. Predictors of pneumothorax varied between GA groups. Pneumothorax-associated mortality and morbidity were significantly greater in early preterm infants.


Pavimenti Oxyde Stone

Willowbrook Mall located in New Jersey. Willowbrook Mall has received a facelift, using Ceramic Technics’ tile, in the food court and the Macy’s wing of the mall. In the Macy’s Wing, the white-colored tile used is our very own Sienna Stone Block: White Front (Lappato Finish) and the Grey-colored tile used is the Sienna Natural […]


Q:

XSL Basics: showing value of a boolean?

When I have this in xsl:
<xsl:choose>
  <xsl:when test="something > 0">
    <xsl:variable name="myVar" select="true()"/>
  </xsl:when>
  <xsl:otherwise>
    <xsl:variable name="myVar" select="false()"/>
  </xsl:otherwise>
</xsl:choose>

How can I then print out the value of "myVar"? Or more importantly, how can I use this boolean in another choose statement?

A:

<xsl:choose>
  <xsl:when test="something > 0">
    <xsl:variable name="myVar" select="true()"/>
  </xsl:when>
  <xsl:otherwise>
    <xsl:variable name="myVar" select="false()"/>
  </xsl:otherwise>
</xsl:choose>

This is quite wrong and useless, because the variable $myVar goes out of scope immediately.
One correct way to conditionally assign to the variable is:
<xsl:variable name="myVar">
  <xsl:choose>
    <xsl:when test="something > 0">1</xsl:when>
    <xsl:otherwise>0</xsl:otherwise>
  </xsl:choose>
</xsl:variable>

However, you really don't need this  -- much simpler is:
<xsl:variable name="myVar" select="something > 0"/>

How can I then print out the value of "myVar"?

Use:
<xsl:value-of select="$myVar"/>

Or more importantly, how can I use this boolean in another choose
  statement?

Here is a simple example:
<xsl:choose>
  <xsl:when test="$myVar">
   <!-- Do something -->
  </xsl:when>
  <xsl:otherwise>
   <!-- Do something else -->
  </xsl:otherwise>
</xsl:choose>

And here is a complete example:
<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/*/*">
  <xsl:variable name="vNonNegative" select=". >= 0"/>

  <xsl:value-of select="name()"/>: <xsl:text/>

  <xsl:choose>
   <xsl:when test="$vNonNegative">Above zero</xsl:when>
   <xsl:otherwise>Below zero</xsl:otherwise>
  </xsl:choose>
 </xsl:template>
</xsl:stylesheet>

when this transformation is applied on the following XML document:
<temps>
 <Monday>-2</Monday>
 <Tuesday>3</Tuesday>
</temps>

the wanted, correct result is produced:
 Monday: Below zero
 Tuesday: Above zero


const loggerFactory = require('@alias/logger');

const logger = loggerFactory('growi:routes:apiv3:user-group'); // eslint-disable-line no-unused-vars

const express = require('express');

const router = express.Router();

const { body, param, query } = require('express-validator');
const { sanitizeQuery } = require('express-validator');

const mongoose = require('mongoose');

const ErrorV3 = require('../../models/vo/error-apiv3');

const { toPagingLimit, toPagingOffset } = require('../../util/express-validator/sanitizer');

const validator = {};

const { ObjectId } = mongoose.Types;

/**
 * @swagger
 *  tags:
 *    name: UserGroup
 */

module.exports = (crowi) => {
  const loginRequiredStrictly = require('../../middlewares/login-required')(crowi);
  const adminRequired = require('../../middlewares/admin-required')(crowi);
  const csrf = require('../../middlewares/csrf')(crowi);
  const apiV3FormValidator = require('../../middlewares/apiv3-form-validator')(crowi);

  const {
    UserGroup,
    UserGroupRelation,
    User,
    Page,
  } = crowi.models;

  /**
   * @swagger
   *
   *  paths:
   *    /user-groups:
   *      get:
   *        tags: [UserGroup]
   *        operationId: getUserGroup
   *        summary: /user-groups
   *        description: Get usergroups
   *        responses:
   *          200:
   *            description: usergroups are fetched
   *            content:
   *              application/json:
   *                schema:
   *                  properties:
   *                    userGroups:
   *                      type: object
   *                      description: a result of `UserGroup.find`
   */
  router.get('/', loginRequiredStrictly, adminRequired, async(req, res) => {
    // TODO: filter with querystring
    try {
      const page = parseInt(req.query.page) || 1;
      const result = await UserGroup.findUserGroupsWithPagination({ page });
      const { docs: userGroups, totalDocs: totalUserGroups, limit: pagingLimit } = result;
      return res.apiv3({ userGroups, totalUserGroups, pagingLimit });
    }
    catch (err) {
      const msg = 'Error occurred in fetching user group list';
      logger.error('Error', err);
      return res.apiv3Err(new ErrorV3(msg, 'user-group-list-fetch-failed'));
    }
  });

  validator.create = [
    body('name', 'Group name is required').trim().exists({ checkFalsy: true }),
  ];

  /**
   * @swagger
   *
   *  paths:
   *    /user-groups:
   *      post:
   *        tags: [UserGroup]
   *        operationId: createUserGroup
   *        summary: /user-groups
   *        description: Adds userGroup
   *        requestBody:
   *          required: true
   *          content:
   *            application/json:
   *              schema:
   *                properties:
   *                  name:
   *                    type: string
   *                    description: name of the userGroup trying to be added
   *        responses:
   *          200:
   *            description: userGroup is added
   *            content:
   *              application/json:
   *                schema:
   *                  properties:
   *                    userGroup:
   *                      type: object
   *                      description: A result of `UserGroup.createGroupByName`
   */
  router.post('/', loginRequiredStrictly, adminRequired, csrf, validator.create, apiV3FormValidator, async(req, res) => {
    const { name } = req.body;

    try {
      const userGroupName = crowi.xss.process(name);
      const userGroup = await UserGroup.createGroupByName(userGroupName);

      return res.apiv3({ userGroup });
    }
    catch (err) {
      const msg = 'Error occurred in creating a user group';
      logger.error(msg, err);
      return res.apiv3Err(new ErrorV3(msg, 'user-group-create-failed'));
    }
  });

  validator.delete = [
    param('id').trim().exists({ checkFalsy: true }),
    query('actionName').trim().exists({ checkFalsy: true }),
    query('transferToUserGroupId').trim(),
  ];

  /**
   * @swagger
   *
   *  paths:
   *    /user-groups/{id}:
   *      delete:
   *        tags: [UserGroup]
   *        operationId: deleteUserGroup
   *        summary: /user-groups/{id}
   *        description: Deletes userGroup
   *        parameters:
   *          - name: id
   *            in: path
   *            required: true
   *            description: id of userGroup
   *            schema:
   *              type: string
   *          - name: actionName
   *            in: query
   *            description: name of action
   *            schema:
   *              type: string
   *          - name: transferToUserGroupId
   *            in: query
   *            description: userGroup id that will be transferred to
   *            schema:
   *              type: string
   *        responses:
   *          200:
   *            description: userGroup is removed
   *            content:
   *              application/json:
   *                schema:
   *                  properties:
   *                    userGroups:
   *                      type: object
   *                      description: A result of `UserGroup.removeCompletelyById`
   */
  router.delete('/:id', loginRequiredStrictly, adminRequired, csrf, validator.delete, apiV3FormValidator, async(req, res) => {
    const { id: deleteGroupId } = req.params;
    const { actionName, transferToUserGroupId } = req.query;

    try {
      const userGroup = await UserGroup.removeCompletelyById(deleteGroupId, actionName, transferToUserGroupId);

      return res.apiv3({ userGroup });
    }
    catch (err) {
      const msg = 'Error occurred in deleting a user group';
      logger.error(msg, err);
      return res.apiv3Err(new ErrorV3(msg, 'user-group-delete-failed'));
    }
  });

  // return one group with the id
  // router.get('/:id', async(req, res) => {
  // });

  validator.update = [
    body('name', 'Group name is required').trim().exists({ checkFalsy: true }),
  ];

  /**
   * @swagger
   *
   *  paths:
   *    /user-groups/{id}:
   *      put:
   *        tags: [UserGroup]
   *        operationId: updateUserGroups
   *        summary: /user-groups/{id}
   *        description: Update userGroup
   *        parameters:
   *          - name: id
   *            in: path
   *            required: true
   *            description: id of userGroup
   *            schema:
   *              type: string
   *        responses:
   *          200:
   *            description: userGroup is updated
   *            content:
   *              application/json:
   *                schema:
   *                  properties:
   *                    userGroup:
   *                      type: object
   *                      description: A result of `UserGroup.updateName`
   */
  router.put('/:id', loginRequiredStrictly, adminRequired, csrf, validator.update, apiV3FormValidator, async(req, res) => {
    const { id } = req.params;
    const { name } = req.body;

    try {
      const userGroup = await UserGroup.findById(id);
      if (userGroup == null) {
        throw new Error('The group does not exist');
      }

      // check if the new group name is available
      const isRegisterableName = await UserGroup.isRegisterableName(name);
      if (!isRegisterableName) {
        throw new Error('The group name is already taken');
      }

      await userGroup.updateName(name);

      res.apiv3({ userGroup });
    }
    catch (err) {
      const msg = 'Error occurred in updating a user group name';
      logger.error(msg, err);
      return res.apiv3Err(new ErrorV3(msg, 'user-group-update-failed'));
    }
  });

  validator.users = {};

  /**
   * @swagger
   *
   *  paths:
   *    /user-groups/{id}/users:
   *      get:
   *        tags: [UserGroup]
   *        operationId: getUsersUserGroups
   *        summary: /user-groups/{id}/users
   *        description: Get users related to the userGroup
   *        parameters:
   *          - name: id
   *            in: path
   *            required: true
   *            description: id of userGroup
   *            schema:
   *              type: string
   *        responses:
   *          200:
   *            description: users are fetched
   *            content:
   *              application/json:
   *                schema:
   *                  properties:
   *                    users:
   *                      type: array
   *                      items:
   *                        type: object
   *                      description: user objects
   */
  router.get('/:id/users', loginRequiredStrictly, adminRequired, async(req, res) => {
    const { id } = req.params;

    try {
      const userGroup = await UserGroup.findById(id);
      const userGroupRelations = await UserGroupRelation.findAllRelationForUserGroup(userGroup);

      const users = userGroupRelations.map((userGroupRelation) => {
        return userGroupRelation.relatedUser;
      });

      return res.apiv3({ users });
    }
    catch (err) {
      const msg = `Error occurred in fetching users for group: ${id}`;
      logger.error(msg, err);
      return res.apiv3Err(new ErrorV3(msg, 'user-group-user-list-fetch-failed'));
    }
  });

  /**
   * @swagger
   *
   *  paths:
   *    /user-groups/{id}/unrelated-users:
   *      get:
   *        tags: [UserGroup]
   *        operationId: getUnrelatedUsersUserGroups
   *        summary: /user-groups/{id}/unrelated-users
   *        description: Get users unrelated to the userGroup
   *        parameters:
   *          - name: id
   *            in: path
   *            required: true
   *            description: id of userGroup
   *            schema:
   *              type: string
   *        responses:
   *          200:
   *            description: users are fetched
   *            content:
   *              application/json:
   *                schema:
   *                  properties:
   *                    users:
   *                      type: array
   *                      items:
   *                        type: object
   *                      description: user objects
   */
  router.get('/:id/unrelated-users', loginRequiredStrictly, adminRequired, async(req, res) => {
    const { id } = req.params;
    const {
      searchWord, searchType, isAlsoNameSearched, isAlsoMailSearched,
    } = req.query;

    const queryOptions = {
      searchWord, searchType, isAlsoNameSearched, isAlsoMailSearched,
    };

    try {
      const userGroup = await UserGroup.findById(id);
      const users = await UserGroupRelation.findUserByNotRelatedGroup(userGroup, queryOptions);

      return res.apiv3({ users });
    }
    catch (err) {
      const msg = `Error occurred in fetching unrelated users for group: ${id}`;
      logger.error(msg, err);
      return res.apiv3Err(new ErrorV3(msg, 'user-group-unrelated-user-list-fetch-failed'));
    }
  });

  validator.users.post = [
    param('id').trim().exists({ checkFalsy: true }),
    param('username').trim().exists({ checkFalsy: true }),
  ];

  /**
   * @swagger
   *
   *  paths:
   *    /user-groups/{id}/users:
   *      post:
   *        tags: [UserGroup]
   *        operationId: addUserUserGroups
   *        summary: /user-groups/{id}/users
   *        description: Add a user to the userGroup
   *        parameters:
   *          - name: id
   *            in: path
   *            required: true
   *            description: id of userGroup
   *            schema:
   *              type: string
   *        responses:
   *          200:
   *            description: a user is added
   *            content:
   *              application/json:
   *                schema:
   *                  type: object
   *                  properties:
   *                    user:
   *                      type: object
   *                      description: the user added to the group
   *                    userGroup:
   *                      type: object
   *                      description: the group to which a user was added
   *                    userGroupRelation:
   *                      type: object
   *                      description: the associative entity between user and userGroup
   */
  router.post('/:id/users/:username', loginRequiredStrictly, adminRequired, validator.users.post, apiV3FormValidator, async(req, res) => {
    const { id, username } = req.params;

    try {
      const [userGroup, user] = await Promise.all([
        UserGroup.findById(id),
        User.findUserByUsername(username),
      ]);

      // check for duplicate users in groups
      const isRelatedUserForGroup = await UserGroupRelation.isRelatedUserForGroup(userGroup, user);

      if (isRelatedUserForGroup) {
        logger.warn('The user is already joined');
        return res.apiv3();
      }

      const userGroupRelation = await UserGroupRelation.createRelation(userGroup, user);
      await userGroupRelation.populate('relatedUser', User.USER_PUBLIC_FIELDS).execPopulate();

      return res.apiv3({ user, userGroup, userGroupRelation });
    }
    catch (err) {
      const msg = `Error occurred in adding the user "${username}" to group "${id}"`;
      logger.error(msg, err);
      return res.apiv3Err(new ErrorV3(msg, 'user-group-add-user-failed'));
    }
  });

  validator.users.delete = [
    param('id').trim().exists({ checkFalsy: true }),
    param('username').trim().exists({ checkFalsy: true }),
  ];

  /**
   * @swagger
   *
   *  paths:
   *    /user-groups/{id}/users:
   *      delete:
   *        tags: [UserGroup]
   *        operationId: deleteUsersUserGroups
   *        summary: /user-groups/{id}/users
   *        description: remove a user from the userGroup
   *        parameters:
   *          - name: id
   *            in: path
   *            required: true
   *            description: id of userGroup
   *            schema:
   *              type: string
   *        responses:
   *          200:
   *            description: a user was removed
   *            content:
   *              application/json:
   *                schema:
   *                  type: object
   *                  properties:
   *                    user:
   *                      type: object
   *                      description: the user removed from the group
   *                    userGroup:
   *                      type: object
   *                      description: the group from which a user was removed
   *                    userGroupRelation:
   *                      type: object
   *                      description: the associative entity between user and userGroup
   */
  router.delete('/:id/users/:username', loginRequiredStrictly, adminRequired, validator.users.delete, apiV3FormValidator, async(req, res) => {
    const { id, username } = req.params;

    try {
      const [userGroup, user] = await Promise.all([
        UserGroup.findById(id),
        User.findUserByUsername(username),
      ]);

      const userGroupRelation = await UserGroupRelation.findOne({ relatedUser: new ObjectId(user._id), relatedGroup: new ObjectId(userGroup._id) });
      if (userGroupRelation == null) {
        throw new Error(`Group "${id}" does not exist or user "${username}" does not belong to group "${id}"`);
      }

      await userGroupRelation.remove();

      return res.apiv3({ user, userGroup, userGroupRelation });
    }
    catch (err) {
      const msg = `Error occurred in removing the user "${username}" from group "${id}"`;
      logger.error(msg, err);
      return res.apiv3Err(new ErrorV3(msg, 'user-group-remove-user-failed'));
    }
  });

  validator.userGroupRelations = {};

  /**
   * @swagger
   *
   *  paths:
   *    /user-groups/{id}/user-group-relations:
   *      get:
   *        tags: [UserGroup]
   *        operationId: getUserGroupRelationsUserGroups
   *        summary: /user-groups/{id}/user-group-relations
   *        description: Get the user group relations for the userGroup
   *        parameters:
   *          - name: id
   *            in: path
   *            required: true
   *            description: id of userGroup
   *            schema:
   *              type: string
   *        responses:
   *          200:
   *            description: user group relations are fetched
   *            content:
   *              application/json:
   *                schema:
   *                  properties:
   *                    userGroupRelations:
   *                      type: array
   *                      items:
   *                        type: object
   *                      description: userGroupRelation objects
   */
  router.get('/:id/user-group-relations', loginRequiredStrictly, adminRequired, async(req, res) => {
    const { id } = req.params;

    try {
      const userGroup = await UserGroup.findById(id);
      const userGroupRelations = await UserGroupRelation.findAllRelationForUserGroup(userGroup);

      return res.apiv3({ userGroupRelations });
    }
    catch (err) {
      const msg = `Error occurred in fetching user group relations for group: ${id}`;
      logger.error(msg, err);
      return res.apiv3Err(new ErrorV3(msg, 'user-group-user-group-relation-list-fetch-failed'));
    }
  });

  validator.pages = {};

  validator.pages.get = [
    param('id').trim().exists({ checkFalsy: true }),
    sanitizeQuery('limit').customSanitizer(toPagingLimit),
    sanitizeQuery('offset').customSanitizer(toPagingOffset),
  ];

  /**
   * @swagger
   *
   *  paths:
   *    /user-groups/{id}/pages:
   *      get:
   *        tags: [UserGroup]
   *        operationId: getPagesUserGroups
   *        summary: /user-groups/{id}/pages
   *        description: Get closed pages for the userGroup
   *        parameters:
   *          - name: id
   *            in: path
   *            required: true
   *            description: id of userGroup
   *            schema:
   *              type: string
   *        responses:
   *          200:
   *            description: pages are fetched
   *            content:
   *              application/json:
   *                schema:
   *                  properties:
   *                    pages:
   *                      type: array
   *                      items:
   *                        type: object
   *                      description: page objects
   */
  router.get('/:id/pages', loginRequiredStrictly, adminRequired, validator.pages.get, apiV3FormValidator, async(req, res) => {
    const { id } = req.params;
    const { limit, offset } = req.query;

    try {
      const { docs, total } = await Page.paginate({
        grant: Page.GRANT_USER_GROUP,
        grantedGroup: { $in: [id] },
      }, {
        offset,
        limit,
        populate: {
          path: 'lastUpdateUser',
          select: User.USER_PUBLIC_FIELDS,
        },
      });

      const current = offset / limit + 1;

      // TODO: create a common moudule for paginated response
      return res.apiv3({ total, current, pages: docs });
    }
    catch (err) {
      const msg = `Error occurred in fetching pages for group: ${id}`;
      logger.error(msg, err);
      return res.apiv3Err(new ErrorV3(msg, 'user-group-page-list-fetch-failed'));
    }
  });

  return router;
};


The Arabidopsis leaf as a model system for investigating the role of cell cycle regulation in organ growth.
The role of cell cycle regulation and cell division in plant growth and organ development is controversial. Some experimental data are most easily interpreted from the 'cellular perspective' that cell division drives growth, whereas other observations are more consistent with the 'organismal perspective' that cell division is merely a consequence of growth, and to a large extent facultative. Here we develop a model of cell cycle regulation in the context of leaf development based on literature, published kinematic analysis, flow-cytometric and transcriptomic data obtained from growing Arabidopsis leaves. We tested this model by comparing the in silico inhibition of the cell cycle progression with the experimental observations of transgenic plants overexpressing the cell cycle inhibitor Arath;KRP2. The model simulates the behaviour of proliferating cells quite well, but is inadequate in describing the effects on expanding cells. This may point to a difference in the nature of the expansion process during the proliferating and non-dividing phase of leaf development.


Thu Dec 17, 2015 2:39 am

I would also like to understand why you sold factoids rather than allowing federated servers to simply sell entry credits for Bitcoin? Is the obfuscation simply so you could call them software licenses and do a crowdfund, or was there some other reason they were needed for the purpose of consensus?

Yes junseth, we could have built a centralized protocol. The set of servers would have to choose what servers can be in the federation and who cannot not. And they would have to coordinate how they sell entry credits and how they share revenue. If the right to sell entry credits was desired by some other party, they would have to negotiate with the Factom servers, and make arrangements for that process. This is pretty much how the current financial system works, so it is possible. But not without centralized control by one more more parties.But to build a decentralized protocol, the incentive must be paid out by the protocol itself. As we have built it, each server gets paid the factoid token, and they can in fact never hand them to anyone at all, and sell Entry Credits by converting said tokens into Entry Credits as they make their sales. But notice they cannot sell more Entry Credits than they earned, so they cannot abuse the rest of the network by over selling Entry Credits.Furthermore, the protocol can be used to select servers and boot servers out. Because the code is managing all of this, no coordination with the servers is required to participate, and no coordination with the servers is required if a server leaves.But if a server didn't care to go into that business, they can transfer the right to sell Entry Credits to someone else that does. How? By simply selling their factoids to the aspiring Entry Credit store. And again, the store cannot over sell Entry Credits, since the factoids naturally handle the accounting.This is because Factoids neatly represent the right to obligate the protocol.And Entry credits neatly represent the right to use the protocol.Nice, clean, and tidy.: Let me add why we did a crowd sale. Yes we did do it to help raise money. Of the tokens distributed, only 30% went to early contributors (i.e. developers and founders like myself) and the rest were purchased either in the pre sale (20%) or in the crowd sale (50%). The numerical number of tokens everyone actually received was determined by the number sold in the crowd sale, with these percentages fixed.The result was a bit over 4 million tokens sold, so the total supply now stands at a bit over 8 million.This is a more fair way to distribute tokens than doing no sale at all. If you do no sale at all, it will be the parties that are issued the tokens first (like early Bitcoin miners) that will corner the majority of the tokens. In some cases this will be the developers. When this is done today, you get floods of "parasitic" miners that run in to mine early coins for that reason. Well, we don't have mining, so we would have been dictating who got the tokens by the selection of the initial set of Federated Servers. Instead under the current plan, most of the tokens went to people that bought into the project to make it possible. Some tokens went to the developers (like it would have in the mining scenario, only less so). And the Federated Servers get a paid a fixed schedule of tokens from now till forever.The token supply can grow (if speculators drive up the price) until the price stabilizes. And the token supply can fall (if speculators drive the price down) until the price stabilizes. But in both cases, the stable price is when the value of the token matches the money real applications are spending to buy Entry Credits in order to put data into the protocol. That is because the 73K factoids generated each year naturally trends to the value of the factoids drained from the supply to write into the protocol. If people are spending 1 million dollars to put data into factom per year, then 73K factoids should be worth 1 million dollars.This equilibrium is best kickstarted with a reasonable body of tokens to begin with. This is because all tradable commodities are subject to speculation, so that is a fact of life. But if the purpose of the token is to drive a protocol, it is important that its value be tied to that use, and not to speculation.I hope this additional information helps.


1. Field of Endeavor
The present invention relates to the field of combustion technology, especially in connection with gas turbines. It relates to an injection nozzle and to a method for operating such an injection nozzle.
2. Brief Description of the Related Art
For the atomizing injection of liquid fuel into the combustion chamber of a gas turbine, a multiplicity of various injection nozzles, which differ with respect to their internal construction and the type of spray cone which is generated, are known from the prior art.
A fuel nozzle with swirl passage, which includes a sleeve and a pin, is known, for example, from WO 2009/095100. The pin is arranged in the sleeve so that the inner surface of the sleeve is connected in a positive manner to the outer generated surface of the pin. Along the outer generated surface of the pin extends a swirl passage in the form of a recess which winds in a helical manner around the center axis of the pin on the outer generated surface. As a result of the arrangement of the pin in the sleeve, a swirl passage is covered or delimited radially with regard to the center axis of the pin by the inner surface of the sleeve. The sleeve has a discharge orifice in the flow direction of the fuel which leaves the fuel nozzle. The pin is arranged in the sleeve so that the cover surface of the pin is recessed towards the discharge orifice of the sleeve. As a result, a swirl chamber is formed. In the swirl chamber, a mixing of the fuel—that is to say, of the oil in the present exemplary embodiment—with air takes place. As a result of the recessing, a film atomization instead of a jet atomization is furthermore enabled. It is also possible for the cover surface to align with the discharge orifice. In the case of the swirl chamber, the spray cone can only be adjusted with difficulty. If the cover surface aligns with the discharge orifice, the fuel only discharges at the ends of the swirl passages, that is to say is localized to a high degree. Furthermore, the production of the swirl passages is comparatively costly.
A liquid fuel nozzle for the combustion chamber of a gas turbine, which includes a nozzle cap 100, a nozzle insert 101, a pilot insert 102, and a nozzle body 103, is known from EP 1 793 165 (FIG. 1 there). The pilot insert 102 is arranged inside the nozzle insert 101. The nozzle insert 101 is, in turn, arranged inside the nozzle cap 100. The nozzle has a pilot passage 105 which supplies the pilot insert 102 with fuel. The pilot insert 102 has a swirl chamber 110 into which a pilot swirl orifice 107 tangentially leads. Pilot fuel 32 flows via the pilot passage 105 from the vicinity of the pilot insert 102 through the pilot swirl orifice 107 and maintains a swirl there, by which it moves in the swirl chamber 110. The pilot fuel 32 forms a film on the inner wall of the swirl chamber 110 and shoots from the pilot injection orifice 108 in fine droplets.
The construction and function of the pilot arrangement of EP 1 793 165 are comparable with a simplex swirl atomizer which has been described in an article by D. B. Kulshreshtha et al., Variations of Spray Cone Angle and Penetration Length of Pressure Swirl Atomizer Designed for Micro Gas Turbine Engine, Int. J. Dynamics of Fluids, Vol. 5, Number 2, pp. 165-172 (2009). In both cases, the fuel which is pressurized and provided with a swirl discharges from a circular hole. The swirl chamber, into which the fuel flows tangentially and perpendicularly to the nozzle axis, is formed as a simple chamber without devices which promote swirl. Both lead to a non-optimized design of the spray cone which, moreover, has a limited cone angle.


Q:

Regex, how to match everything up to nth occurrence

I'm trying to get everything from a webpage up until the second occurrence of a word matchdate.
(.*?matchdate){2}   is what I'm trying but that's not doing that trick. The page has 14+ matches of "matchdate" and I only want to get everything up to the second one, and then nothing else.
https://regex101.com/r/Cjyo0f/1  <--- my saved regex.
What am I missing here?
Thanks.

A:

There are a couple ways you can do this:
If you can, remove the g flag
Without the global flag, regex will only grab the first instance it encounters.
https://regex101.com/r/Cjyo0f/2
Add a ^ to the front of the regex
A caret will force the regex to match from the beginning of the string, ruling out all other possibilities.
https://regex101.com/r/Cjyo0f/3
If Python is available, use .split() and .join()
If regular python is available, I would recommend:
string = "I like to matchdate, I want to each matchdate for breakfest"
print "matchdate".join(string.split("matchdate")[:2])


For this example, we'll use the same type of flex container we used for the split-screen layout.

So add a container, apply Display: Flex and keep the default alignment options.

Note: in a real-world example, the container needs Height: 100vh to fill the browser window's full height.


Q:

Php: append extension to all files with no extension in a folder

I have a folder called MyFolder with these three files:
file1
file2
file3.gif
file.html
I need to add the extension '.gif' to the files with no extension. Then the first file1 and second file2 files should be targeted.
Result should be:
file1.gif
file2.gif
file3.gif
file.html
The files are gif files, but somehow they lost the extensions. If I add the extension manually (editing its names) then I can load correctly in the browser
I'm trying with this code:
$directory = "http://www.example.com/MyFolder/";
if ($handle = opendir($directory)) {
    while (false !== ($fileName = readdir($handle))) {

        if($fileName['extension'] == ""){

            $fileName = $fileName.".gif";
        }
        rename($directory . $fileName, $directory . $newName);
    }
    closedir($handle);
}

A:

Unfortunately because you can't pass preg_grep into array_walk this had to be split like so, otherwise it could have been a single line.
$dir='./MyFolder/';
$col=preg_grep( '@^((?!gif).)*$@i', glob( $dir . '*' ) );

array_walk( $col , function($f){
    rename( $f, $f.'.gif' );
});

Or, a modified version of the original
if( $handle = opendir( $directory ) ) {
    while( false !== $filename = readdir( $handle ) ) {
        if( !is_dir( $filename ) ) {
            $file = $directory . $filename;
            if( empty( pathinfo( $file, PATHINFO_EXTENSION ) ) ){
                rename( $file, $file . '.gif' );
            }
        }
    }
    closedir($handle);
}

As the original above happily renamed files with extensions other than gif a more simple version without the faulty regex seems to work OK.
$dir='c:/temp/fileuploads/1/';
$col=glob( $dir . '*' );

array_walk( $col, function( $f ){
    if( empty( pathinfo( $f, PATHINFO_EXTENSION ) ) ){
        printf('%s - %s<br />',$f,$f.'.gif');
        rename( $f, $f.'.gif' );
    }
});


Payment Options

When comes to Arduino Prototyping and experimenting with electronics, there are few kits better than the Arduino Mega Proto Shield Kit – which comes with a Mega-sized PCB, an almost excessive amount of connection points, and a few extra components to kick a prototyping project into action.

The components that come with this kit include a row strip of 40 long headers, an 18×2 header block, three coloured LEDs (Red, Green and Yellow), two soft-press buttons, as well as three sets of five resistors of 220 Ohm, 1K Ohm and 10K Ohm. With this basic setup, you can begin your prototyping phase by soldering on two of the LEDs, two of the resistors, as well as one of the buttons and the power source – creating a basic circuit with LEDs indicating on/off status. From here, you can create any circuit you want, and can either choose to build your own microcontroller platform, or perhaps build custom Arduino Shields for already existing projects.

One of the great advantages of the Arduino Mega Proto Shield Kit is that the PCB is natively capable of fitting most large Arduino boards, including the ever-powerful Arduino Mega 2560, making your prototypes very easy to integrate into existing Arduino projects. Simply utilize the header pins along the side to modularly ‘plug in’ to the top of Arduino Boards and get your prototype Shield integrated within moments. You may also want to look at our Arduino Kits, which contain boards and components necessary for getting a running start into electronics, or for bolstering the ever-growing growing toolbox of a veteran Maker.

The Arduino Mega Proto Shield Kit Includes:

1 x Mega Proto Shield PCB

1 x Row Strip of 40 Long Headers

1 X 18×2 Header Block

3 x LEDs (Red, Green, Yellow)

2 x Soft-Press Buttons

5 x 220Ω Resistors

5 x 1KΩ Resistors

5 x 10KΩ Resistors

Typical Applications for the Arduino Mega Proto Shield Kit:

The Arduino Mega Proto Shield Kit was designed specifically for prototyping brand new boards or Shields, with unique and custom-designed functionality. This means that they are often used for a wide range of applications, depending of course on what Makers want to prototype. This list, however, explains a few of the exciting projects you could enjoy with the Mega Proto Shield Kit:

Building your own custom Shield that accomplishes a unique task which other Shields (or your budget) can’t achieve.

Designing a prototype board or Shield that combines a unique set of components, such as a seismograph with a data logger and WiFi capabilities.

Creating a Shield or Breakout Board to cater to your project’s specific needs and eliminate redundancies or remove unnecessary parts within a system.

The applications for this Proto Shield Kit are truly endless in the right hands, which is what makes prototyping of this kind so exciting. If your eager to kick off your prototyping hobby or career with a running start, consider the Arduino Mega Proto Shield Kit or any of our other pre-packaged Arduino Kits.

Why Should You Buy from DIYElectronics?

We are completely committed to supporting and developing the Open-Source community in South Africa. We also offer complete support by engineers and electro-mechanical specialists for all products purchased from us, giving full support throughout the product lifespan via our extremely helpful and responsive support desk.

Additionally, all of our 3D printers come with a 6-month warranty and we always make sure to stock every possible replacement part so that you are never left with a 3D printer that isn't printing.If you would like to find out more about our support or are eager to get some help for your projects, simply get in touch with [email protected] to speak with friendly and professional experts today.


WASHINGTON (Reuters) - The head of the North Atlantic Treaty Organization warned the U.S. Congress on Wednesday of the threat posed by “a more assertive Russia,” including a massive military buildup, threats to sovereign states, the use of nerve agents and cyberattacks.

“We must overcome our differences now because we will need our alliance even more in the future. We face unprecedented challenges - challenges no one nation can face alone,” NATO Secretary General Jens Stoltenberg said.

Saying “time is running out,” Stoltenberg also called on Russia to return to compliance with the Intermediate-range Nuclear Forces Treaty, from which U.S. President Donald Trump plans to withdraw the United States this summer.

“NATO has no intention of deploying land-based nuclear missiles in Europe,” Stoltenberg said. “But NATO will always take the necessary steps to provide credible and effective deterrence.”

Stoltenberg used his speech to give an impassioned defense of the 70-year-old Western alliance, a partnership he called “the most successful alliance in history,” which has often been derided by Trump since he took office in 2017.

Members of Congress, who greeted Stoltenberg with repeated cheers and standing ovations, said they viewed his address to the joint meeting of the House of Representatives and Senate as a chance to reaffirm the American commitment to the NATO alliance.

Stoltenberg was the first leader of an international organization and the first Norwegian to be accorded the rare honor of such an address.

‘GOOD FOR THE UNITED STATES’

“NATO has been good for Europe, but NATO has also been good for the United States,” Stoltenberg said. The invitation to Stoltenberg to speak as the alliance celebrates its 70th anniversary in Washington was widely seen as a way to send a message to Trump about strong bipartisan support for NATO.

Slideshow ( 11 images )

“The strength of a nation is not only measured by the size of its economy or the number of its soldiers, but also by the number of its friends,” Stoltenberg added. “And through NATO the United States has more friends and allies than any other power. This has made the United States stronger, safer and more secure.”

The Senate is due to vote later this year on whether North Macedonia can become NATO’s 30th member.

Slideshow ( 11 images )

Trump has ruffled feathers among European allies by repeatedly saying NATO nations need to pay more for their militaries and ease the burden on the United States.

Earlier this year, before inviting Stoltenberg to Congress, House Speaker Nancy Pelosi led a delegation of her fellow Democrats to Brussels, where they sought to reassure European allies that differences over Trump’s policies were mere “family squabbles” and that transatlantic ties remained strong.

Members of Congress have also introduced legislation expressing support for NATO or seeking to keep any president from withdrawing from the alliance without lawmakers’ approval.

Stoltenberg met on Tuesday with Trump, who said his pressure on NATO nations to pay more for their defense is leading to tens of billions of dollars more in contributions, but the allies may need to boost their budgets even more.

Stoltenberg said NATO member countries are adding billions to their defense spending - $41 billion in the last two years. He expects that figure to rise to $100 billion next year.

“This is making NATO stronger,” he said. “This is good for Europe, and it is good for America.”


Q:

Covering spaces and fibre bundles, using the of $SU(2)$ and $SO(3)$

I understand there are many questions on here that show give an explicit map to show that $SU(2)$ is a double cover of $SO(3)$ (seevia quaternions).
I am trying and use the fact that $SU(2)$ is a double cover of $SO(3)$ to write $SU(2)$ as some fibre bundle. But I seem to encounter some contradictions. I want to know what is incorrect. Here are my ideas:
(1) Since the Lie algebras of $SO(3)$ and $SU(2)$ are isomorphic. They have isomorphic connected components.
(2) Covering spaces can always be thought of as discrete fibre bundles over the base space.
(3) But $SU(2)$ is simply connected.
I think (2) is wrong.
(4) If two is wrong what is the correct way to think about covering spaces. As far as I understand $SU(2)$ has one connected component, and $SO(3)$ has two connected components. So it seems like maybe $SO(3)$ should be a double cover of $SU(2)$?

A:

(1) Is wrong. The kernel of $SU(2)\to SO(3)$ is $\{\pm I\}$. The element $-I$ is central in $SU(2)$, but $SO(3)$ has trivial center, so they cannot be isomorphic. (Both $SU(2)$ and $SO(3)$ are connected.)
(2) True.
(3) True.
(4) It's wrong to say $SO(3)$ has two connected component.
It's true to say $SO(3)$ is the identity component of $O(3)$, the unique other component being comprised of reflections (and "improper reflections").


City Council Discusses Marijuana Regulations And UMC Funding

Can Unalaska afford to build the multi-million dollar Unalaska Marine Center? And how can the city pay for it? Those questions were a focus of last night’s city council meeting.

Port manager Peggy McLaughlin says Unalaska is at a turning point.

“If we don’t do this now, what are those costs going to be to us in the future?" McLaughlin said. "If we do this now, are we truly going to be able to make ends meets? Is the port really going to be able to cover those expenses and what happens if we delay this project? What are those risks?”

The project is estimated to cost more than $40 million. Without sweating – McLaughlin says – there’s $11 million the port department can chip in. But that still leaves about $30 million to scrape together.

Right now, McLaughlin says the city has a lot in its favor: the costs of steel and fuel are down; interest rates are low, but climbing; and contractors are hungry for projects.

It’s a gamble between current cost savings and how comfortable the council is with the risk of a hefty price-tag.

Another risk, McLaughlin says is one of the dock positions – number three – might only make it another couple years.

“If we don’t rebuild that," she said. "If and when the economic diversity comes our way, in terms of arctic shipping, gas and oil, ecotourism, or whatever the new thing is going to be, we’re behind the eight ball.”

Councilor Roger Rowland says he thinks of the project of a $20 million job.

“We either spend $22 million and maintain what we have," Rowland said. "Or we spend another $20 million -- for a total of $42 million -- and we start gaining volumes and we’re positioned for the future.”

He says the city has to do something. McLaughlin says if that dock is not repaired, Unalaska will struggle to maintain a place for the Alaska Marine Highway.

She says the new dock would be expected to last 40 years; 15 more years than it would take to finance it.

Nothing was finalized, but City Manager Dave Martinson stressed there still are two opportunities to bail– once financing has been identified and once bids are in. Both those require council approval to proceed.

In other news, the Council touched on future commercial marijuana regulations.

Overall, the present council members seemed to be in agreement.

For now, they’re ok with the idea of a free market controlling the number of businesses. They’re interested in adding an additional 3% sales tax to marijuana and potentially alcohol and tobacco, too.

Later this month, they’ll look into options for buffer zones – extra restrictions – on where pot-businesses can exist.

Also, the council has filled its last vacant seat. Rachelle Hatfield was appointed to take over seat G – the seat Frank Kelty resigned to become mayor.

Hatfield hasn’t been sworn in yet because she currently works for the city. She plans to resign from her job as a recreation assistant at the PCR and take the oath of office at the next city council meeting. Four others expressed interest in the position, including Killian Baker, Jeff Treannie and Chris Price who all ran for local government positions this fall.

And former mayor and city councilor, Shirley Marquardt was honored for her more than 20 years of service to the community.

The City Council will hold its next meeting -- and last meeting of the year -- December 27th.


/*
 * This file is part of DeepFactors.
 *
 * Copyright (C) 2020 Imperial College London
 *
 * The use of the code within this file and all code within files that make up
 * the software that is DeepFactors is permitted for non-commercial purposes
 * only.  The full terms and conditions that apply to the code within this file
 * are detailed within the LICENSE file and at
 * <https://www.imperial.ac.uk/dyson-robotics-lab/projects/deepfactors/deepfactors-license>
 * unless explicitly stated. By downloading this file you agree to comply with
 * these terms.
 *
 * If you wish to use any of this code for commercial purposes then please
 * email researchcontracts.engineering@imperial.ac.uk.
 *
 */
#ifndef DF_WORK_MANAGER_H_
#define DF_WORK_MANAGER_H_

#include <list>
#include <functional>
#include <glog/logging.h>

#include "work.h"
#include "df_work.h"

namespace df
{
namespace work
{

class WorkManager
{
public:
  typedef Work::Ptr WorkPtr;

  template <typename T, class... Args>
  WorkPtr AddWork(Args&&... args)
  {
    auto work = std::make_shared<T>(std::forward<Args>(args)...);
    return AddWork(work);
  }

  WorkPtr AddWork(WorkPtr work);

  void Bookkeeping(gtsam::NonlinearFactorGraph& new_factors,
                   gtsam::FactorIndices& remove_indices,
                   gtsam::Values& var_init);

  void DistributeIndices(gtsam::FactorIndices indices);
  void Remove(std::function<bool (WorkPtr)> f);
  void Erase(std::function<bool (WorkPtr)> f);

  void Update();
  void SignalNoRelinearize();

  void PrintWork();
  bool Empty() const { return work_.empty(); }
  void Clear();

private:
  std::list<WorkPtr> work_;
  std::map<std::string, WorkPtr> work_map_;
  std::map<std::string, int> last_new_factors_;
};

} // namespace work
} // namespace df

#endif // DF_WORK_MANAGER_H_


Introduction {#S0001}
============

Le schwannome est une tumeur mésenchymateuse bénigne développée exclusivement à partir des cellules de la gaine de Schwann qui entourent les fibres nerveuses du système nerveux périphérique. Les schwannomes sont retrouvés dans 25% des cas au niveau cervical, le plus souvent à partir du nerf pneumogastrique (X) \[[@CIT0001]\]. Ils se caractérisent par leur latence clinique et leur diagnostic difficile et tardif \[[@CIT0001]\]. Le traitement de choix est chirurgical, mais l\'abstention sera toujours discutée avec le patient qui sera informé des risques de séquelle fonctionnelle liés à cette chirurgie. À propos d\'un cas récent de Schwannome du nerf vague cervical, nous proposons à travers une revue de la littérature une mise au point sur les aspects cliniques, radiologiques et thérapeutiques de cette entité anatomo-clinique rare.

Patient et observation {#S0002}
======================

Il s\'agit d\'un patient de 32 ans, sans antécédents pathologiques notables, consultait pour une masse latéro-cervicale droite, augmentant progressivement du volume depuis trois ans. L\'examen physique retrouvait une masse isolée latéro-cervical supérieure droite de 6 x 3 cm, oblongue, ferme, insensible et sans signes inflammatoires en regard, mobile par rapport aux plans profonds et superficiels. Il n\'y avait ni dysphonie, ni dysphagie, ni déficit neurologique. L\'examen endobuccale montrait un refoulement en dedans de la région amygdalienne homolatérale. La tomodensitométrie cervicale (TDM) ([Figure 1](#F0001){ref-type="fig"}) mettait en évidence une masse ovoïde, bien limitée, de contours réguliers occupant les aires IIa et III droites, de densité tissulaire hétérogène en son centre, et mesurant 63 x 50 x 40 mm. Cette masse est située en dedans du muscle sterno-cléido-mastoïdien qui est refoulé ainsi la veine jugulaire interne qui est comprimée mais qui reste perméable. En dedans, elle refoule les vaisseaux carotidiens qui sont perméables. L\'injection du produit de contraste montrait un rehaussement tardif de densité de la partie périphérique de la masse avec son centre qui restait isodense. L\'IRM cervicale ([Figure 2](#F0002){ref-type="fig"}, [Figure 3](#F0003){ref-type="fig"}) montrait une volumineuse masse tissulaire interposée entre les vaisseaux jugulo-carotidiens et muscle sterno-cléido-mastoïdien, de forme grossièrement ovalaire, de contours polycycliques, présentant un hyposignal en T1, un hypersignal hétérogène en T2 et rehaussée de manière tardive et progressive après injection de gadolinium. Cette lésion refoule la carotide commune et sa bifurcation ainsi que la carotide interne et externe en avant, elle refoule la veine jugulaire interne latéralement qu\'elle lamine sans l\'obstruer totalement, elle refoule discrètement le carrefour pharyngo-laryngé sans retentissement significatif sur sa lumière. Elle mesure 58x52x37 mm dans ces plus grands diamètres. Le diagnostic d\'un schwannome du vague a été évoqué. La cytoponction n\'était pas contributive. L\'exploration chirurgicale retrouvait une masse ovoïde homogène, bien encapsulée, refoulant en dehors la veine jugulaire interne et en dedans les vaisseaux carotidiens ([Figure 4](#F0004){ref-type="fig"}). La masse semblait être développée aux dépens du nerf vague. Une exérèse chirurgicale complète extracapsulaire préservant le nerf vague a été réalisée par voie de cervicotomie. L\'examen anatomopathologique a objectivé une prolifération tumorale à cellularité modérée faite de cellules fusiformes à noyau ovoïde parfois allongé, à chromatine fine ou légèrement hétérogène. Certains noyaux sont volumineux polylobés, sans mitoses anormales. Ces cellules sont disposées en faisceaux courts enchevêtrés et en palissade formant des nodules Verocay. Ces nodules sont assez bien limités, parfois encapsulés évoquant un schwannome bénin de type A d\'Antoni ([Figure 5](#F0005){ref-type="fig"}, [Figure 6](#F0006){ref-type="fig"}).

![TDM cervicale avec injection en coupe axiale (A) et en coupe coronale (B): schwannome du nerf vague](PAMJ-14-76-g001){#F0001}

![IRM cervico-faciale en coupe axiale séquence pondérée en T1 après injection de gadolinium: schwanome du nerf vague](PAMJ-14-76-g002){#F0002}

![IRM cervico-faciale en coupe coronale avec injection: schwanome du nerf vague](PAMJ-14-76-g003){#F0003}

![Vue peropératoire, schwannome du nerf vague droite](PAMJ-14-76-g004){#F0004}

![Shwannome du nerf vague. Nodules de Verocay constitués par des zones fibrillaires anucléés, bordées de part et d\'autre d\'une palissade de noyaux de type A d\'Antoni. Coloration HES, grossissement x400](PAMJ-14-76-g005){#F0005}

![Aspect histologique schwannome, forte expression de la PS 100](PAMJ-14-76-g006){#F0006}

Les suites opératoires étaient simples. Aucune prise en charge complémentaire n\'était proposée en dehors d\'une simple surveillance. Le patient était revu à 6 mois et il se présentait totalement asymptomatique.

Discussion {#S0003}
==========

La première observation de schwannome cervical a été rapportée en 1899 par Ritter. Ces tumeurs surviennent au niveau de la tête et du cou dans 25 à 45% des cas \[[@CIT0001], [@CIT0002]\]. La localisation intracrânienne (nerf vestibulaire) est la plus fréquente \[[@CIT0003]\]. La localisation cervicale est moins fréquente. Ces tumeurs peuvent se développer dans l\'espace parapharyngé aux dépens des quatre derniers nerfs crâniens et du sympathique cervical \[[@CIT0004]--[@CIT0006]\].

Les schwannomes du nerf vague s′observent à tous âges avec une fréquence plus élevée chez l′adulte jeune. Le sex-ratio est égal pour la plupart des auteurs \[[@CIT0001], [@CIT0002]\]. Cependant, une prédominance féminine a été rapportée par certains auteurs \[[@CIT0007]\]. La présentation clinique n\'est pas pathognomonique. Il s\'agit le plus souvent d\'une masse latéro-cervicale isolée et asymptomatique, augmentant progressivement de volume \[[@CIT0002], [@CIT0004]\]. Cette masse peut, de par sa taille, entraîner une compression pharyngée et des signes peu spécifiques comme une gêne pharyngée, voire une odynophagie \[[@CIT0002], [@CIT0008]\]. Un Schwannome cervical du nerf vague est plus facilement évoqué quand la masse cervicale est associée à une dysphonie avec une paralysie de la corde vocale homolatérale. Cependant, ce dernier signe est rarement retrouvé au moment du diagnostic car dans ce cas, il est lié à la compression du nerf. En effet, contrairement au neurofibrome, le schwannome est une tumeur encapsulée qui n\'infiltre jamais la gaine nerveuse périneurale et les filets nerveux \[[@CIT0001], [@CIT0004]\].

L\'imagerie joue un rôle primordial dans la prise en charge de ces patients \[[@CIT0001], [@CIT0004], [@CIT0006]\]. L\'échographie est peu spécifique. La TDM et l\'imagerie par résonance magnétique nucléaire permettent de préciser la taille de la tumeur, sa localisation parapharyngée dans le secteur II ou III cervical, son extension et ses rapports vasculaires avec les carotides interne et externe \[[@CIT0006], [@CIT0009]\]. En cas d\'atteinte du X, la tumeur tend à élargir l\'espace entre la carotide interne ou la carotide commune et la veine jugulaire interne, alors que l\'atteinte du sympathique refoule vers l\'avant l\'axe jugulo-carotidien. Dans ces deux cas, la localisation est rétrostylienne.

La TDM élimine une adénopathie non vascularisée, un kyste congénital et un paragangliome du X ou du glomus carotidien, qui prend intensément le contraste dès le temps artériel de l\'injection avec l\'image classique d\'une tumeur au-dessus et au contact de la bifurcation carotidienne élargissant l\'espace entre les carotides interne et externe \[[@CIT0001], [@CIT0002], [@CIT0010]\]. A la TDM, la tumeur est bien limitée et elle présente une densité inférieure à celle des muscles environnants. Après injection de produit de contraste, le rehaussement différé est en général homogène car la vascularisation dépend pour l\'essentiel des capillaires intratumoraux. A l′IRM, en T1 la lésion est hypo ou isointense au muscle devenant hyperintense en T2, le rehaussement au Gadolinium est franc et intense \[[@CIT0002], [@CIT0007]\]. L\'étude cytologique après cytoponction est souvent non contributive \[[@CIT0002], [@CIT0008]\]. Le diagnostic est anatomopathologique sur pièce chirurgicale, devant l\'existence de cellules de schwann de morphologie et d\'organisation différentes, classées selon Antoni en zone A où elles apparaissent en faisceaux, aux noyaux alignés en palissade et en zone B d\'aspect kystique et de nature myxoïde. L\'immunohistochimie montre l\'expression prépondérante de la protéine S100 \[[@CIT0001], [@CIT0011]\].

Le traitement des schwannomes est chirurgical et le seul moyen de diagnostic. L\'exérèse peut être complète du fait qu\'ils sont bien encapsulés. La conservation du nerf d\'origine est souvent possible car la tumeur a un développement extrinsèque par rapport à l\'axe nerveux \[[@CIT0007], [@CIT0012]\]. Dans notre cas, lors de la cervicotomie, nous avons réalisé une exérèse complète extracapsulaire du schwannome préservant le nerf vague. La paralysie recurrentielle est alors la complication post-opératoire la plus fréquente en cas de traumatisme du X. L\'utilisation d\'un neuromonitoring préopératoire peut s\'avérer utile dans la chirurgie des tumeurs nerveuses cervicales pour permettre le cas échéant d\'envisager une résection tumorale partielle, par exemple en cas de diagnostic préopératoire de schwannome du X.

Les schwannomes cervicaux identifiés, de petite taille et de faible évolutivité, doivent faire rediscuter l\'indication opératoire, en particulier ceux développés à partir du pneumogastrique, du grand hypoglosse ou d\'une branche du plexus cervical \[[@CIT0001]\].

Le pronostic des schwannomes est excellent. Les séquelles nerveuses sont exceptionnelles. La récidive locale est rare et est due probablement à une exérèse incomplète \[[@CIT0001], [@CIT0013]\]. La dégénérescence est exceptionnelle et même non admise car un schwannome serait d\'emblée bénin ou malin.

Conclusion {#S0004}
==========

Le schwannome du nerf vague est une tumeur bénigne rare et de croissance lente, mais dont le volume important en l\'absence de diagnostic cytologique doit faire discuter l\'exploration chirurgicale. Une imagerie médicale (TDM et IRM) est indispensable dans le bilan préopératoire. L\'exérèse chirurgicale complète extracapsulaire est possible et est le seul garent de la non récidive et de la préservation du nerf vague. Dans tous les cas, le patient doit être prévenu de la survenue postopératoire d\'une paralysie recurrentielle pour laquelle il faut proposer une rééducation orthophonique et ou une médialisation de la corde vocale paralysée.

Conflits d\'intérêts {#S0005}
====================

Les auteurs ne déclarent aucun conflit d\'intérêts.

Contributions des auteurs {#S0006}
=========================

Tous les auteurs ont participé à la prise en charge de la patiente et à la rédaction du manuscrit. Tous les auteurs ont lu et approuvé la version finale du manuscrit.