400 A.2d 1070 (1979)
Margaret CUNNINGHAM et al.
v.
KITTERY PLANNING BOARD et al.
Supreme Judicial Court of Maine.
April 24, 1979.
*1071 Lund & Goodall by Clifford H. Goodall, Augusta (orally), for plaintiff.
Verrill & Dana by Michael T. Healy, Portland (orally), for L. J. Davidson, Assn.
McEachern, Winiarski & Thornhill by Duncan A. McEachern, Kittery (orally), for Town of Kittery and Rossiter.
Before McKUSICK, C. J., and POMEROY, WERNICK, ARCHIBALD, GODFREY and NICHOLS, JJ.
GODFREY, Justice.
Fourteen persons owning property in the town of Kittery brought a five-count complaint in Superior Court seeking both judicial review of the Kittery Planning Board's approval of a subdivision application made pursuant to 30 M.R.S.A. § 4956 and injunctive relief against further development of the subdivision. The Superior Court dismissed two counts of the complaint and granted summary judgment for the defendants on the remaining three counts. The property owners have appealed the Superior Court's decision to the Law Court.

*1072 BACKGROUND AND PROCEEDINGS

1. Planning Board

From the pleadings, motions, and accompanying affidavits, the following facts appear to be undisputed. In September of 1976, Mr. L. John Davidson attended a meeting of the Kittery Planning Board on behalf of L. John Davidson Associates, a limited partnership which owns land on Gerrish Island in the town of Kittery. Mr. Davidson presented a rough plan for the development of a residential subdivision on the Gerrish Island property and informed the Board of his intention to present more complete plans for the subdivision in the future. At a meeting of the Board the following March, Mr. Davidson presented extensive drawings and materials concerning the proposed subdivision on Gerrish Island. He completed an application form and paid the necessary fee pursuant to the provisions of 30 M.R.S.A. § 4956. The Board informed him that a preliminary plan and then a final plan must be filed and that a public hearing would be required on each of the plans.
On April 28, 1977, Mr. Davidson presented his preliminary plan to the Board. After questioning Mr. Davidson and discussing the application, the Board unanimously approved the preliminary plan subject to specified conditions. At a Board meeting on June 9, 1977, Mr. Davidson presented his final plan. After considerable questioning and discussion, the Board voted to receive the final plan and scheduled a public hearing on the Davidson subdivision for June 23, 1977.
At the June 23 public hearing, Mr. Davidson brought those present up to date with respect to his plans. Seven of the fourteen plaintiffs attended the hearing. Of the seven, five participated in the hearing, questioning Mr. Davidson and indicating their opposition to the proposed subdivision. The chairman of the Board read a letter opposing the subdivision from a plaintiff who did not attend the hearing.
When there were no further questions, the chairman of the Board closed the public hearing. He announced that there would be open deliberation and that the people were welcome to stay. After a five-minute recess, the Board began to discuss the application, frequently addressing questions to Mr. Davidson, who responded to the inquiries. After considerable discussion, the Board decided that another meeting would be necessary.
The Board's final meeting on the Davidson subdivision was held on June 30, 1977. Five of the seven plaintiffs who had attended the public hearing on June 23 were present. The meeting was a continuation of the open deliberations of the previous meeting. Mr. Davidson continued to provide information to the members of the Board and responded to their questioning. When Mr. Martin, one of the plaintiffs in attendance, requested permission to speak, the chairman reminded him that the public hearing was closed and that the Board was then engaged in deliberation. However, the Board agreed to allow him to speak briefly. Mr. Martin then proposed a compromise. After further deliberation and additional questioning of Mr. Davidson, the members of the Board voted four to one to approve the subdivision application subject to specified conditions. The approved plan was recorded in the York County registry of deeds on July 6, 1977, with a copy of the Board's "Conditions of Approval" and a copy of the site location order and findings of fact issued by the State Department of Environmental Protection approving the subdivision. The Board sent Mr. Davidson a letter dated July 19, 1977, officially notifying him of the approval of the final plan subject to the stated conditions.
During the proceedings before the Board and on the date of approval of the subdivision, the 1960 zoning ordinance of the Town of Kittery was in effect. A new zoning ordinance, under consideration while the application was pending, was adopted by the town on June 13, 1977, to be effective July 13, 1977, two weeks after the Davidson subdivision was approved by the Planning Board. The plaintiffs assert that the lots in the Davidson subdivision are non-conforming under the 1977 zoning ordinance.

*1073 2. Superior Court

On July 27, 1977, the fourteen plaintiffs filed a complaint in Superior Court against the Kittery Planning Board, Richard E. Rossiter, in his capacity as town code enforcement officer, and L. John Davidson Associates. The pleading was labeled a Rule 80B complaint and stated that it was brought "pursuant to Rule 80B of the Maine Rules of Civil Procedure as an appeal for review of the actions of the Kittery Planning Board . . . ." It described the plaintiffs as "property owners of land located on Gerrish Island" but alleged no additional facts either to identify their interests or to show how their interests would be adversely affected by the subdivision.
Counts I, II, and III alleged that the procedures employed by the Planning Board denied the plaintiffs' rights to due process and a fair hearing. The factual allegations of Counts I, II, and III accorded substantially with the statement of facts outlined above. Each of the three counts requested the Superior Court to declare the subdivision permit null and void and to enjoin further development of the subdivision, sale of lots, or issuance of building permits.
Count I asked the court to find that the Board "heard, solicited and considered testimony presented outside of the public hearing; conducted ex parte meeting with the applicant; and denied the Plaintiffs the same rights and privileges granted to the applicant to present evidence and testimony." Count II claimed that the Board "based its decision on evidence and testimony which was presented to it separate from the application and prior to and after the close of the public hearing." Count III alleged that the Board "did not make a written record of its decision which sets forth the reason or reasons for its decision," and that the Board failed to set forth findings of fact as required by 1 M.R.S.A. § 407 (freedom of access law) and 30 M.R.S.A. § 4956(2) (subdivision law).
Counts IV and V directly challenged the legality of the proposed subdivision itself. The plaintiffs asserted that the lots in the Davidson subdivision were non-conforming under the new 1977 zoning ordinance, which became effective two weeks after the Board's approval of the subdivision. Plaintiffs claimed that Richard E. Rossiter, the town code enforcement officer, failed or refused to notify Davidson of the zoning violation, as required by the 1977 zoning ordinance. Count V adds the allegation that the violation of the 1977 zoning ordinance creates a nuisance pursuant to 30 M.R.S.A. §§ 4962(1)(F) and 4964.
Both Counts IV and V requested the Superior Court to find that the lots in the Davidson subdivision violate the minimum-lot-size requirements of the 1977 zoning ordinance and that Mr. Rossiter has failed or refused to enforce such requirements. They also request injunctions prohibiting the further development of the subdivision, sale of lots, or issuance of building permits.
L. John Davidson Associates responded to the complaint by filing on August 18, 1977, a motion to dismiss the five counts for lack of subject-matter jurisdiction and for failure to state a claim upon which relief can be granted. M.R.Civ.P., Rule 12(b)(1) & (6). The other defendants joined in an answer, filed September 15, 1977, which denied most of the allegations of the complaint and prayed that it be dismissed. They also filed a motion for summary judgment on September 16, 1977. The motion was accompanied by an affidavit of the chairman of the Kittery Planning Board. That affidavit summarized the Board's actions and enclosed a copy of the July 19, 1977, notice of the Board's decision, copies of the minutes of the Board meetings in question, a copy of the technical check list of material submitted for use in reviewing the subdivision plans, a copy of the Board's conditions of approval, and the site location order and findings of fact issued by the State of Maine Department of Environmental Protection dated May 25, 1977. John L. Davidson Associates also filed a motion for summary judgment on the same grounds.
The record also contains "Plaintiff's Affidavit in Opposition to Defendants' Motion for Summary Judgment," signed by plaintiff Margaret Cunningham. The affiant *1074 stated that she had attended the Planning Board meetings of June 23 and June 30, 1977, and she related facts consistent with the descriptions, set forth above, of those two meetings.
On September 21, 1977, the plaintiffs filed with the clerk of the Superior Court a motion for leave to amend their complaint by adding the following allegations to the original complaint:
"Gerrish Island is a small coastal island with only one access over a single bridge. The proposed subdivision will substantially increase the population of Gerrish Island and will result in congestion of its bridges, roads, beaches, create traffic hazards, reduce the capacity of the public water system to provide sufficient water, and thereby interfere with the Plaintiffs' enjoyment of their property.
The subdivision and Planning Board's order will damage the Plaintiffs by reducing the value of their property.
The Plaintiffs attended the public hearing conducted by the Planning Board, participated in the hearing. Most of the Plaintiffs also attended public meetings of the Planning Board and were not permitted to participate while the Defendant, L. John Davidson, was permitted to participate in the discussion.
The Plaintiffs include owners of property abutting the Defendant's and all Plaintiffs own land in the vicinity of the Defendant's land."
The clerk of the Superior Court failed to place the motion to amend the complaint on the docket. The plaintiffs took no further action with regard to that motion until January, 1978, after they had appealed from the adverse order and judgment of the trial court.
On September 23, 1977, the Superior Court granted the Davidson motion to dismiss with respect to Counts IV and V of the complaint and denied it with respect to Counts I, II and III. On November 23, 1977, the Superior Court entered an order granting summary judgment for the defendants on all claims raised in Counts I, II and III. The plaintiffs appeal from the Superior Court's order of dismissal of Counts IV and V and summary judgment for the defendants on Counts I, II and III. The record on appeal, which was filed on December 29, 1977, contained no reference to the plaintiffs' motion to file an amended complaint.

3. Law Court

On December 29, 1977, the defendant L. John Davidson Associates filed a motion to dismiss the appeal, alleging (1) that the plaintiffs were not parties "aggrieved" by the judgment of the Superior Court within the meaning of 14 M.R.S.A. § 1851, and that they had no standing to pursue the appeal; and, (2) that the judgment of the Superior Court was not reviewable by the Law Court because the Superior Court did not have jurisdiction under Rule 80B, M.R. Civ.P., to review the Planning Board's actions.
Seeking to remedy the omission with respect to their September motion to amend their complaint, the plaintiffs filed with the Law Court on January 12 and 13, 1978, a "Motion to Correct the Docket Entries" and a "Motion to Remand." The motions were argued before Justice Pomeroy, who issued an order for the Law Court on January 30, 1978, directing the clerk of the Superior Court to correct the docket by inserting the plaintiffs' motion to amend the complaint under the entry date of September 21, 1977. The case was remanded to the Superior Court "to act upon the Plaintiffs' Motion to Amend the Complaint . . . ." The Law Court retained jurisdiction of the appeal for purposes of entertaining Davidson's motion to dismiss, all other aspects of the appeal being held in abeyance until the Superior Court acted on the motion to amend the complaint.
On February 8, 1978, a hearing was held before a justice of the Superior Court on the plaintiffs' motion to amend the complaint. In an order dated February 13, 1978, the Superior Court justice directed the clerk to correct the docket and granted the motion to amend. The justice stated that, although it appeared that the plaintiffs had *1075 waived their motion to amend, the order of the Law Court denied the Superior Court discretion in the matter and required that he grant the motion. On March 2, 1978, the defendant L. John Davidson Associates filed a notice of appeal to the Law Court from the Superior Court's order granting the motion to amend the complaint. This appeal by defendant was consolidated with the plaintiffs' appeal by order of the Chief Justice.
On February 13, 1978, the plaintiffs filed with the Superior Court a "Motion for Relief from Judgment" under Rule 60(b), M.R. Civ.P. They requested relief from the Superior Court's summary judgment "on the grounds of mistake, inadvertence, excusable neglect, and for the reason that justice requires that the Defendants' Motion for Summary Judgment be determined in the light of the amended complaint." On February 27, 1978, the plaintiffs filed with the Law Court a "Motion to Remand to Superior Court" in order that it might rule on their Rule 60(b) motion.
On March 1, 1978, the Davidson motion to dismiss the appeal was argued before the Law Court. The Court reserved decision on the motion to dismiss on the ground that the issues would be better considered after the Court had received briefs and heard oral argument on the plaintiffs' appeal.
On March 27, 1978, the defendant Kittery Planning Board filed with the Law Court a "Motion to Modify the Record, under Rule 74(i) and Supporting Affidavit."[1] The motion stated that on February 27, 1978, the Kittery Town Council had amended the 1977 zoning ordinance to add the following sentence to the provision of the 1977 zoning ordinance relied upon by the plaintiffs in Counts IV and V:
"This subsection shall not apply to any Planning Board approved subdivision for which an approved plan was recorded in the York County Registry of Deeds on or before July 13, 1977."
The amendment carried the effective date of March 29, 1978. On March 30, 1978, the attorneys for the parties on appeal filed a stipulation that the Davidson subdivision was recorded in the York County Registry of Deeds on July 6, 1977. On March 28, 1978, the Chief Justice ordered that the motion to modify the record be argued in the parties' briefs and that oral argument on this motion be had in conjunction with oral argument on the appeals and the motion to dismiss.
The entire case was argued before the Law Court on April 10, 1978.

DISPOSITION OF PROCEDURAL QUESTIONS

1. Plaintiffs' Motions to Amend the Complaint and for Relief from Judgment

This appeal must be decided without reference to plaintiffs' proposed amendments to their original complaint. The Superior Court erred in assuming that our remand to correct the docket and to act on the plaintiffs' motion to amend the complaint required the Superior Court to grant the plaintiffs' motion. Our order of remand did not mandate the granting of the motion. Cf. Cohen v. Maine School Administrative Dist. No. 71, Me., 369 A.2d 624 (1977).
Although the presiding justice granted the motion under the misimpression that our mandate required him to do so, his order set forth the following reasons for concluding that, if he had been able to exercise his discretion, he would have held that plaintiffs must be deemed to have "waived" their motion: first, plaintiffs never requested that the motion be scheduled for hearing before they appealed to the Law Court; second, after entry of the Superior Court's order dismissing Counts IV and V, they did not file a motion under Rule 59(e), M.R.Civ.P., seeking to alter that order so that they might have an opportunity *1076 to amend their complaint; third, they did not file a motion under Rule 59(e) after entry of summary judgment against them on Counts I, II and III. Those reasons are persuasive that the plaintiffs' motion to amend the complaint should have been denied as waived or abandoned. See Jones v. Suhre, Me., 345 A.2d 515, 518 (1975). On the facts of the present case, it would have been an abuse of discretion for the presiding justice to decide otherwise. We must sustain the appeal of defendant Davidson Associates from the order of the Superior Court granting the plaintiffs' motion to amend the complaint.
On February 13, 1978, plaintiffs filed in Superior Court a motion under Rule 60(b), M.R.Civ.P., for relief from the summary judgment of November 23, 1977, on the ground that defendants' motion for summary judgment should have been determined in the light of the amended complaint. Plaintiffs have since moved in the Law Court that the case be remanded to Superior Court for hearing on that motion. Because plaintiffs' motion to amend the complaint must be denied as waived or abandoned, no basis exists under Rule 60(b) for relief from the summary judgment. Accordingly, we deny the motion before us for remand to Superior Court to hear the plaintiffs' application for Rule 60(b) relief.
The Superior Court's order of September 23, 1977, and its summary judgment of November 23, 1977, must therefore be reviewed on the basis of the original complaint and the pleadings and affidavits which were before the Superior Court when it considered the various counts of the complaint in the fall of 1977.

2. Propriety of Equitable Relief: Counts IV and V; Defendants' Motion to Modify the Record

Counts IV and V of the complaint allege that the Davidson subdivision violates the minimum-lot-size requirements of the Kittery zoning ordinance effective July 13, 1977. Counts IV and V allege also that the defendant town code enforcement officer, Mr. Rossiter, had a duty to enforce the ordinance and to notify Davidson Associates of the violation, and that he failed or refused to perform that duty.
Under 30 M.R.S.A. § 4963(1) (1978), a zoning board of appeals may hear appeals "from actions or failure to act of the office charged with the enforcement of the zoning ordinance." If plaintiffs' theory is correct, that the 1977 zoning ordinance was applicable to the Davidson subdivision, the Kittery Zoning Board of Appeals was the agency directly charged with authority to review Mr. Rossiter's decisions with respect to applicability of that 1977 ordinance. Keating v. Zoning Board of Appeals, Me., 325 A.2d 521 (1974). Since plaintiffs were seeking, in effect, collateral judicial review of the substantive merits of their claims of administrative violation of the 1977 Kittery zoning ordinance, their action for equitable relief was barred by the availability of a direct administrative remedy by means of an appeal to the Kittery Zoning Board of Appeals under 30 M.R.S.A. § 4963, subsecs. (1) & (2) (1978). Gagne v. Lewiston Crushed Stone Co., Inc., Me., 367 A.2d 613 (1976).
Plaintiffs have not alleged any facts tending to show that they were excused, by futility or otherwise, from exhausting that administrative remedy. Cf. Walsh v. City of Brewer, Me., 315 A.2d 200 (1974); Stanton v. Trustees of St. Joseph's College, Me., 233 A.2d 718, 724 (1967); Frost v. Lucey, Me., 231 A.2d 441 (1967). It is therefore unnecessary to consider whether the the 1977 ordinance was applicable to the Davidson subdivision, or whether the February, 1978, amendment of the ordinance may be considered by us on appeal, and, if so, whether it should be regarded as mooting the issues raised by Counts IV and V. We therefore dismiss, as moot, the motion of defendant Planning Board to modify the record by including the amendment of the Kittery zoning ordinance effective March 29, 1978.

3. Jurisdiction and Standing

Defendant Davidson Associates has moved in the Law Court to dismiss the *1077 plaintiffs' appeal on two grounds: first, that the judgment of the Superior Court is not reviewable by the Law Court because the Superior Court had no jurisdiction to hear plaintiffs' Rule 80B complaint, and, second, that plaintiffs, having no standing are not parties aggrieved by the judgment of the Superior Court so as to be entitled to appeal pursuant to 14 M.R.S.A. § 1851 (1964).
There being no statutory provision authorizing appeal of a planning board's decision to the Superior Court, that court's jurisdiction to review the decision of the Kittery Planning Board pursuant to a complaint filed under Rule 80B, M.R.Civ.P., depends on whether review is "otherwise available by law."[2] Such review is "otherwise available by law" if it would have been available by means of one of the extraordinary writs, which were formally abolished in 1967 by amendment of Rule 81, M.R. Civ.P., and repeal of cognate statutory provisions. Carlson v. Oliver, Me., 372 A.2d 226 (1977); 2 R. Field, V. McKusick & L. Wroth, Maine Civil Practice 337-41 (2d ed. 1970).
Unless review was otherwise provided by statute, the writ of certiorari was an appropriate method until 1967 for reviewing the action of a government agency performing a quasi-judicial function. Carlson v. Oliver, supra at 229. The action of the Kittery Planning Board in approving the Davidson subdivision must be characterized as "quasi-judicial" because the Board was required, after due notice to the community under 30 M.R.S.A. § 4956(2) (1978), to find facts and, by applying statutory criteria to those facts, reach a decision affecting specific individual interest. See Carlson v. Oliver, supra, at 229; State Board of Education v. Coombs, Me., 308 A.2d 582, 584 (1973); accord, Bienz v. City of Dayton, 29 Or.App. 761, 566 P.2d 904 (1977). In Haskell v. Planning Board, Me., 388 A.2d 100 (1978), a Rule 80B complaint was appropriately used to obtain Superior Court review of quasi-judicial action by a municipal planning board.
In the present case, the main problem with regard to the availability of Rule 80B review arises from the question of plaintiffs' standing. Defendants contend that plaintiffs here were not "parties" to the proceedings before the Kittery Planning Board so as to meet the technical requirement of the former law of certiorari, citing Lord v. County Comm'rs, 105 Me. 556, 75 A. 126 (1909).
Defendants' argument is entwined with another contention; namely, that plaintiffs lack "standing" to challenge the actions complained of either by a Rule 80B complaint or by an action in equity other than under Rule 80B. Since we have already concluded that plaintiffs are barred by failure to exhaust their administrative remedies from obtaining equitable relief under Counts IV and V of their complaint, we need consider the question of their standing only in the context of their demand for judicial review under Rule 80B.
The Maine cases elaborating the law of certiorari required that plaintiff be a "party to the record" or be "interested in the subject matter, upon which the record acts." E. g., Dyer v. Lowell, 30 Me. 217, 220 (1849). The Advisory Committee's Note to the 1967 amendments of Rule 80B observes that the rule, as amended, was designed to simplify review procedure and do away with technicalities of the old prerogative writs. 2 R. Field, V. McKusick, & L. Wroth, Maine Civil Practice, 305-06 (2d ed. 1970). See Warren v. Waterville Urban Renewal Auth., 161 Me. 160, 172, 210 A.2d 41, 48 (1965).[3] However, the basic requirement *1078 cannot be ignored that plaintiffs allege facts sufficient to show that they are "interested in the subject matter" of the hearing before the Board.
We cannot determine from the record whether plaintiffs' standing to maintain Counts I, II and III of the original complaint was ever explicitly challenged in the hearings before the presiding justice in the fall of 1977. The presiding justice appears to have assumed that the plaintiffs, or some of them, had a sufficient interest to seek relief under Rule 80B on those counts, which allege errors in the Board's procedure. We cannot say that the Superior Court erred in proceeding on that assumption. The record without the amended complaint does not support an inference that any of the plaintiffs owned property abutting the Davidson subdivision. Cf. Matter of Lappie, Me., 377 A.2d 441 (1977). Yet, from scrutiny of the pleadings and affidavits we may infer that at least two of the plaintiffs, Mr. and Mrs. Martin, were residents of the Town of Kittery, owned property on Gerrish Island, participated in the Board's "public hearing" on June 23, 1977, and attended the Board's "open meeting" on June 23 and June 30, at which Mr. Martin requested and obtained permission to speak. On such facts, it was not error for the presiding justice to treat at least those two plaintiffs as having a sufficient interest to maintain an 80B action to remedy the violation of any of their constitutional or statutory due process rights that may have occurred as a result of the procedures followed by the Board. See Pride's Corner Concerned Citizens Ass'n v. Westbrook Board of Zoning Appeals, Me., 398 A.2d 415 (1979). They are also parties "aggrieved," entitled to appeal under 14 M.R.S.A. § 1851.
It is not necessary for us to determine whether any plaintiffs besides the Martins have sufficient standing. The Davidson motion in the Law Court to dismiss plaintiffs' appeal must be denied.

COUNTS I, II AND III OF THE COMPLAINT
The presiding justice concluded, after study of the pleadings and affidavits and after hearing oral arguments on the motion for summary judgment, that there was no genuine issue as to any material fact with respect to Counts I, II and III. He ruled that on the facts the defendants were entitled to summary judgment as a matter of law. On Counts I and II, he reasoned as follows:
"The record demonstrates that they were permitted to present their testimony to the Planning Board at the public hearing, and were allowed ample opportunity to draw to the attention of the Planning Board any facts or information they had in regard to the proposed subdivision. The minutes of the Kittery Planning Board, dated June 23, 1977, at page 5 demonstrate that the public hearing was not closed until the proceeding reached a point where there were no further questions. None of the Plaintiffs allege or have shown by affidavit that they had additional evidence to present to the Planning Board for its consideration and the record clearly demonstrates that Plaintiffs did not object to the closing of the public hearing. The Plaintiffs do claim that after the public hearing was closed, the Planning Board in a public meeting continued its deliberations, and made inquiry of Mr. Davidson, a representative of L. John Davidson Associates. Inquiries were made of Mr. Davidson by Planning Board members on June 23, and on June 30, 1977 subsequent to the close of the hearing. The Plaintiffs allege that after the public hearing was closed, they were not given another opportunity to `ask questions, make comments, introduce evidence, or give testimony'. . . .
. . . In view of the fact that the public hearing called by the Planning Board pursuant to Title 30 M.R.S.A. Section 4956 is discretionary with the Planning Board and the obvious purpose of *1079 the public hearing is to give the public an opportunity to present facts to the Planning Board for its consideration in reviewing the subdivision application and not for the purpose of adjudicating private rights, this court is not convinced that the Plaintiffs were entitled as a matter of law to the opportunity to participate in the deliberations of the Planning Board, once the public hearing was adjourned.. . . It is the opinion of this Court that Plaintiffs . . . were given adequate notice, and an opportunity to participate in the proceeding, and that a fundamentally fair hearing was held by the Kittery Planning Board. What constitutes due process in an administrative hearing, particularly one which is not adjudicating disputes between private parties, but is attempting to gather facts for the review of a subdivision depends primarily upon the nature of the proceedings and the possible burden upon that proceeding. Maine Clean Fuels, Inc. 310 A.2d 736, 747 (Me. 1973)."
We concur in the conclusion of the presiding justice and in his reasoning quoted above. See Portland Pipe Line Corp. v. Environmental Improvement Comm'n, Me., 307 A.2d 1 (1973).
In Count III of the complaint, plaintiffs challenge the Board's decision on the ground that the Board did not make the findings of fact required by the last sentence of subsection 2 of 30 M.R.S.A. § 4956 and by 1 M.R.S.A. § 407. Section 4956(2) required the Board, in issuing its decision, to "make findings of fact establishing that the proposed subdivision does or does not meet the foregoing criteria" the criteria referred to being those set forth in subsection (3) of section 4956. To the extent of any application it may have in this case, section 407 of title 1 is less specific than section 4956 of title 30 with respect to required findings, and therefore we need to consider only whether the Board met the findings requirements of section 4956.
The Board's findings were not set forth in the manner in which a court would make findings or even in the manner most desirable for an administrative agency to present its findings and rationale. Cf. Gashgai v. Board of Registration in Medicine, Me., 390 A.2d 1080, 1084-86 (1978). However, the presiding justice properly concluded that, although the form of the findings was unsatisfactory, the documents before him, in their totality, showed that the Board reviewed the subdivision in light of the applicable criteria and complied substantially with the statutory findings requirement.
Plaintiffs do not complain of the absence of any particular factual finding, nor do they assert that the necessary findings are not supported by evidence. As against such general allegations of insufficiency of factual findings, we cannot rule that the Superior Court erred in ordering summary judgment for defendants on Count III. The record as a whole, including the minutes and decision of the Planning Board, the Board's technical checklist and recorded conditions of approval, and the recorded site location order and findings of fact issued by the State Department of Environmental Protection, shows that adequate findings of fact have been made and are available for public examination so as to satisfy the requirements of 30 M.R.S.A. § 4956(2) and, to the extent it may have application, 1 M.R. S.A. § 407. The Superior Court correctly held that defendants were entitled to summary judgment on Counts I, II and III of the complaint.
The entry is:
Motion of defendant Davidson Associates, filed with the Law Court December 29, 1977, to dismiss the plaintiffs' appeal, denied.
Motion of defendant Kittery Planning Board, filed with the Law Court March 27, 1978, to modify the record, dismissed as moot.
Appeal of defendant Davidson Associates from order of Superior Court filed February 15, 1978, granting plaintiffs' motion to amend complaint, sustained; order vacated.
Motion by plaintiffs, filed with the Law Court February 27, 1978, to remand to Superior Court for ruling on plaintiffs' motion *1080 for relief from judgment under Rule 60(b), denied.
Appeal of plaintiffs from order of Superior Court filed September 23, 1977, dismissing Counts IV and V of the complaint, denied.
Appeal of plaintiffs from judgment of Superior Court filed November 23, 1977, granting judgment for defendants on all claims raised in Counts I, II and III of the complaint, denied; judgment affirmed.
DELAHANTY, J., did not sit.
NOTES
[1]  Former subsection (i) of Rule 74, as amended, became subsection (e) effective January 1, 1978.
[2]  The first sentence of Rule 80B provides as follows:

"When review by the Superior Court, whether by appeal or otherwise, of any action or failure or refusal to act by a governmental agency, including any department, board, commission, or officer, is provided by statute or is otherwise available by law, proceedings for such review shall, except as otherwise provided by statute, be governed by these Rules of Civil Procedure as modified by this rule."
[3]  "Plaintiff's attack upon the findings is in the nature of the erstwhile extraordinary and now regulated certiorari process which has been happily simplified and lightened by Rule 80B, M.R.C.P. The serviceful utility and the evolved rationale of certiorari without its technical formularies have been conserved."


Physiological and supraphysiological supplements of triiodothyronine do not influence the primary in vitro antibody response to trinitrophenylated Brucella abortus by spleen cells in serum-containing media.
T3 supplements enhance splenic primary thymus-independent antibody responses in the mouse in vivo. The purpose of the present investigation was to determine whether this effect may be mediated, in part, by direct influences on the lymphocytes and/or accessory cells involved in the response. A range of T3 levels (3 x 10(-10) to 10(-5) mol/l) was tested in microcultures of separated spleen cells from CBA/J mice 33 days of age. The immune reaction examined in vitro was the primary antibody response to trinitrophenylated Brucella abortus (TNP-BA). T3 was without influence, throughout the concentration range tested, on the number of anti-TNP plasma cells generated per culture. This result was obtained using splenocytes either from well-nourished or from malnourished mice, and using both optimal and suboptimal numbers of TNP-BA. On the basis of the present results and a reinterpretation of previous published work, it is concluded that the influence of T3 supplements on splenic antibody responses in vivo is mediated indirectly. Direct influences of T3 on the T-independent antibody response, if such occur, must be maximized by subphysiological levels of the hormone.


I ordered a body kit and when the package came the quality was so poor I returned the kit right away.Upon paying a $280 return shipping fee they refuse to give me a full refund because they claimed two parts were damaged. That is not my problem that is ups fault. There...

Read more

CARiD

CARiD

Dear Client,We are sorry to know, that the full refund was not issued to your account as of this moment. We will be glad to look into your order and to check what is going on ...


Neuhaus, Carinthia

Neuhaus ()  is a small town in the Austrian state of Carinthia southeast of Klagenfurt, in the district of Völkermarkt, about 4 km from the border with Slovenia.

Geography
The Municipality of Neuhaus is located in the extreme east of the Jaun Valley south of the Drava River.

Makeup of the municipality
Neuhaus is part of a cadastral district that includes Neuhaus, Graditschach, Berg ob Leifling, Leifling, Pudlach, Heiligenstadt, and Schwabegg. The municipality includes the following 16 settlements (2001 census):

Neighboring municipalities

History

Neuhaus (Newenhavse) was first mentioned in 1288; the settlement of Leifling first in 1154 as Liwuelich and the settlement of Schwabegg as Castrum Swabec in 1212. The Counts of Heunburg built Neuhaus Castle at the end of the 13th century.

In 1958 the current Municipality of Neuhaus was established by combining the previously independent municipalities of Leifling und Schwabegg.

Population
According to the 2001 census, the Municipality of Neuhaus had 1,236 inhabitants, of which 96.9% are Austrian and 1.0% German citizens. 13.2% are Carinthian Slovenes.

96.5% of the population is Roman Catholic and 1.4% is Lutheran. 1.3% have no religious affiliation.

Sights
 Neuhaus Castle
 Leifling Castle
 Patek-Mühle Farming Museum
 Heiligenstadt Pilgrimage Church

Politics

Municipal council
The municipal council has 15 members and is structured as follows after the 2003 municipal elections:

 Social Democratic Party of Austria - 7
 Austrian People's Party - 5
 Write-in - 2
 Enotna Lista - 1

The mayor, directly elected, is Gerhard Visotschnig (Social Democratic Party).

Coat of Arms
The coat of arms of Neuhaus shows the golden tower of the castle (today’s Neuhaus Castle) and the three golden stars of the Counts of Heunburger, who had these in their coat of arms and had their center of power in the southeast Jaun Valley. The golden plow represents agriculture as the historically and currently most important economic activity in the municipality.

The coat of arms and banner were adopted by the municipality on 2 June 1980. The flag is blue and yellow and bears the coat of arms.

References

External links

 Gemeinde Neuhaus

Category:Cities and towns in Völkermarkt District


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

package com.navercorp.pinpoint.web.service.map;

import com.navercorp.pinpoint.common.trace.ServiceType;
import com.navercorp.pinpoint.web.vo.Application;

import org.junit.Assert;
import org.junit.Test;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * @author emeroad
 * @author HyunGil Jeong
 */
public class LinkVisitCheckerTest {

    @Test
    public void testVisitCaller() throws Exception {
        LinkVisitChecker checker = new LinkVisitChecker();

        Application testApplication = new Application("test", ServiceType.STAND_ALONE);
        Assert.assertFalse(checker.visitCaller(testApplication));
        Assert.assertTrue(checker.visitCaller(testApplication));

        Application newApp = new Application("newApp", ServiceType.STAND_ALONE);
        Assert.assertFalse(checker.visitCaller(newApp));
        Assert.assertTrue(checker.visitCaller(newApp));
    }

    @Test
    public void testVisitCallee() throws Exception {
        LinkVisitChecker checker = new LinkVisitChecker();

        Application testApplication = new Application("test", ServiceType.STAND_ALONE);
        Assert.assertFalse(checker.visitCallee(testApplication));
        Assert.assertTrue(checker.visitCallee(testApplication));

        Application newApp = new Application("newApp", ServiceType.STAND_ALONE);
        Assert.assertFalse(checker.visitCallee(newApp));
        Assert.assertTrue(checker.visitCallee(newApp));
    }

    @Test
    public void testVisitCallerParallel() throws Exception {
        final int concurrency = 10;
        ExecutorService executorService = Executors.newFixedThreadPool(concurrency);

        LinkVisitChecker checker = new LinkVisitChecker();
        CountDownLatch visitedLatch = new CountDownLatch(concurrency);
        CountDownLatch submitLatch = new CountDownLatch(1);
        AtomicInteger firstVisitCount = new AtomicInteger();
        AtomicInteger alreadyVisitedCount = new AtomicInteger();

        LinkVisitor linkVisitor = new LinkCallerVisitor(checker);
        VisitJobContext jobContext = new VisitJobContext(linkVisitor, visitedLatch, submitLatch, firstVisitCount, alreadyVisitedCount);
        final Application testApplication = new Application("test1", ServiceType.STAND_ALONE);

        for (int i = 0; i < concurrency; i++) {
            executorService.submit(new VisitJob(jobContext, testApplication));
        }
        submitLatch.countDown();
        visitedLatch.await();
        Assert.assertEquals(1, firstVisitCount.get());
        Assert.assertEquals(concurrency - 1, alreadyVisitedCount.get());
    }

    @Test
    public void testVisitCallerParallelMultipleApplications() throws Exception {
        final int concurrency = 10;
        ExecutorService executorService = Executors.newFixedThreadPool(concurrency);

        LinkVisitChecker checker = new LinkVisitChecker();
        CountDownLatch visitedLatch = new CountDownLatch(concurrency);
        CountDownLatch submitLatch = new CountDownLatch(1);
        AtomicInteger firstVisitCount = new AtomicInteger();
        AtomicInteger alreadyVisitedCount = new AtomicInteger();

        LinkVisitor linkVisitor = new LinkCallerVisitor(checker);
        VisitJobContext jobContext = new VisitJobContext(linkVisitor, visitedLatch, submitLatch, firstVisitCount, alreadyVisitedCount);
        final Application testApplication1 = new Application("test1", ServiceType.STAND_ALONE);
        final Application testApplication2 = new Application("test2", ServiceType.STAND_ALONE);
        final Application testApplication3 = new Application("test3", ServiceType.STAND_ALONE);

        for (int i = 0; i < concurrency; i++) {
            if (i % 3 == 0) {
                executorService.submit(new VisitJob(jobContext, testApplication1));
            } else if (i % 3 == 1) {
                executorService.submit(new VisitJob(jobContext, testApplication2));
            } else {
                executorService.submit(new VisitJob(jobContext, testApplication3));
            }
        }
        submitLatch.countDown();
        visitedLatch.await();
        Assert.assertEquals(3, firstVisitCount.get());
        Assert.assertEquals(concurrency - 3, alreadyVisitedCount.get());
    }

    private static class VisitJobContext {
        private final LinkVisitor linkVisitor;
        private final CountDownLatch visitLatch;
        private final CountDownLatch submitLatch;
        private final AtomicInteger firstVisitCount;
        private final AtomicInteger alreadyVisistedCount;

        private VisitJobContext(
                LinkVisitor linkVisitor,
                CountDownLatch visitLatch,
                CountDownLatch submitLatch,
                AtomicInteger firstVisitCount,
                AtomicInteger alreadyVisistedCount) {
            this.linkVisitor = linkVisitor;
            this.visitLatch = visitLatch;
            this.submitLatch = submitLatch;
            this.firstVisitCount = firstVisitCount;
            this.alreadyVisistedCount = alreadyVisistedCount;
        }

        private void visit(Application application) {
            boolean alreadyVisited = linkVisitor.visit(application);
            if (alreadyVisited) {
                alreadyVisistedCount.getAndIncrement();
            } else {
                firstVisitCount.getAndIncrement();
            }
        }

        private void waitForInitialization() throws InterruptedException {
            submitLatch.await(1000L, TimeUnit.MILLISECONDS);
        }

        private void markDone() {
            visitLatch.countDown();
        }
    }

    private static class VisitJob implements Runnable {

        private final VisitJobContext jobContext;
        private final Application application;

        private VisitJob(VisitJobContext jobContext, Application application) {
            this.jobContext = jobContext;
            this.application = application;
        }

        @Override
        public void run() {
            try {
                jobContext.waitForInitialization();
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
            jobContext.visit(application);
            jobContext.markDone();
        }
    }

    private interface LinkVisitor {
        boolean visit(Application application);
    }

    private static class LinkCallerVisitor implements LinkVisitor {

        private final LinkVisitChecker linkVisitChecker;

        private LinkCallerVisitor(LinkVisitChecker linkVisitChecker) {
            this.linkVisitChecker = linkVisitChecker;
        }

        @Override
        public boolean visit(Application application) {
            return linkVisitChecker.visitCaller(application);
        }
    }

    private static class LinkCalleeVisitor implements LinkVisitor {

        private final LinkVisitChecker linkVisitChecker;

        private LinkCalleeVisitor(LinkVisitChecker linkVisitChecker) {
            this.linkVisitChecker = linkVisitChecker;
        }

        @Override
        public boolean visit(Application application) {
            return linkVisitChecker.visitCallee(application);
        }
    }
}


[Oxidative Stress and DNA Damage Induced by DEP Exposure in Earthworms].
Diethyl phthalate (DEP) is a plastic additive that entered the soil environment due to the extensive use of plastic products. However, its toxicity to soil animals and the associated toxicity mechanism were not completely understood. Eisenia foetida was selected as the research object and exposed to simulated contaminated soil with different concentrations of DEP. Antioxidant enzyme activity, reactive oxygen species (ROS) content, Glutathione-S-Transferase (GST) activity, Malondialdehyde (MDA) content and amount of DNA damage in the earthworms were used as evaluation parameters for the study. The results showed that under DEP stress, the activities of antioxidant enzymes, GST and ROS in earthworms changed and resulted in gene damage. Under the stress of 0.1-50 mg·kg-1 DEP exposure during the 28 d experiment, the level of ROS increased and there was a "dose-effect" relationship. Excessive ROS gave rise to an increase of MDA content in the body from lipid peroxidation. Under the combined action of ROS and MDA, DNA in the body cavity of earthworm was damaged and there was also a "dose-effect" relationship between the degree of damage and the concentration of DEP. In summary, DEP may cause a certain degree of damage to organisms, with damage to the DNA of earthworms representing fairly strong eco-toxicological effects. Therefore, adequate attention should be paid to DEP disposal.


Q:

How to calculate packet time from latency and bandwidth

I have a link between a host and a switch.
The link has a bandwidth & a latency. How to calculate the time of 2 packets(with size 1KB) to be transferred from Host A to Switch 1?
Here's the diagram(I am talking about the first link)

Note: I just want to calculate it manually for these values, I want to know the principles/laws of calculating these problems.

A:

Propagation time = (Frame Serialization Time)
                  + (Link Media Delay)
                  + (Queueing Delay)
                  + (Node Processing Delay - if known)

Formulas:

Frame Serialization Time = S/R
Link Media Delay = D/p
Queueing Delay = Q / R
Node processing delay is normally specified or measured

Variable decoder:

R: link data rate (bits/second)
S: Packet size (bits)
D: Link distance (meters)
P Processing Delay (seconds)
p: medium propagation speed (meters/second)

speed in copper is 210*10**6
speed in fiber is 300*10**6

Q: Queue depth (bits); note: if the link is not congested, there is no Queue depth

Applying to your question:
I will only calculate information for the link between Host A and Switch 1:
Frame Serialization Time =  Packet_size_bits / Link_data_rate_bps
                         = 2*1024*8 / (2*10**6)
                         = 0.00819 [seconds]
Link Media Delay         = 0.04 seconds [from diagram: 40ms]
Queueing Delay           = 0.0 [assume no congestion]
Node Processing Delay    = 0.0 [Host A had nothing specified for delay]
-----------------------------------------------------------------------
               Total     = 0.00819 + 0.04 + 0.0 + 0.0
                         = 0.04819 seconds
                         = 48.2 milliseconds for two 1KB packets to go from
                                             Host A to Switch 1

A:

Quite roughly, the formula is:
LATENCY + SIZE / THROUGHPUT

In your example:

LATENCY = 40ms = 0.04

SIZE = 1000*2

THGOUGHPUT = 2Mbps = 250,000 Bytes/second

Bottom line:
0.04 + 2000 / 250000 = 0.048 = 48ms

Notice that I converted all units to bytes and seconds, so calculations are meaningful.
This is more accurate for large packets. For small packets, real numbers are larger.


import sys
import os

def main(argv):
  cwd = argv[1]
  os.chdir(cwd)
  os.execv(sys.executable, [sys.executable] + argv[2:])

if __name__ == '__main__':
  main(sys.argv)


Q:

Constructing a colimit

Consider a functor $F: \mathcal{I} \rightarrow \textrm{Sets}$ where $\mathcal{I}$ is small. Then the colimit of $F$ is given by $\amalg_{i \in \textrm{Ob}(\mathcal{I})}F(i)/{\sim}$ where $\sim$ is the equivalence relation generated by: $x \in F(i) \sim y \in F(j)$ if there exist an $\alpha \in \textrm{Mor}_{\mathcal{I}}(i, j)$ such that $F(\alpha)(x) = y$.
I am trying to mimic the same argument to find the colimit of $F$ when $F: \mathcal{I} \rightarrow \textrm{AbelianGrps}$. My first guess was $S := \oplus_{i \in \textrm{Ob}(\mathcal{I})}F(i)/{\sim}$ where $\sim$ is defined as above. The problem is I don't think $S$ is even a group. Suppose $a, b \in S$, then there exists a representative element $r_{1}, r_{2}$ such that $a \sim r_{1}$ and $b \sim r_{2}$. Then there exists $\alpha_{1}, \alpha_{2}$ such that $F(\alpha_{1})(a) = r_{1}$ and $F(\alpha_{2})(b) = r_{2}$. This doesn't seem to tell me anything on what $a + b$ is equivalent to.
My next idea was that maybe the colimit is $\oplus_{i \in \textrm{Ob}(\mathcal{I})}F(i)/H$ for some subgroup $H$. Furthermore, $H$ needs to have the property that $x \in F(i)$, $y \in F(j)$ belong to the same coset of $\oplus_{i \in \textrm{Ob}(\mathcal{I})}F(i)/H$ when there exists an $\alpha \in \textrm{Mor}_{\mathcal{I}}(i, j)$ such that $F(\alpha)(x) = y$. How would I go about constructing such an $H$?

A:

In the construction of the colimit of sets, you have to define $\sim$ as the equivalence relation generated by the relation which you have defined.
Similarly, in order to construct the colimit of algebraic structures of any type, you have to define $\sim$ as the smallest congruence relation generated by the relation (this ensures that the quotient will be again an algebraic structure of the same type). In case of abelian groups, this means that $H$ is generated by elements of the form $y-F(\alpha)(x)$ where $x \in F(i)$ and $y \in F(j)$ and $\alpha : i \to j$. The quotient by $H$ has clearly the desired universal property of a colimit.
Notice that all this is a special case of the general result that colimits may be constructed via coequalizers and coproducts.


Q:

Rails file download using send_data with follow-up action

I am working on a code base where I need to allow the user to download a PDF document that already resides on AWS S3. I have implemented a download concern that was used for a previous feature.
For this feature, I need to update the UI (A progress stepper) after the user has completed the file download. I was initially thinking that this would be as simple as:

User clicks download
API call is made where the file is downloaded using send_data. In this API call, I'd also update the Foo model to change state to indicate that the user has downloaded the file;
Execute a redirect_to request.referer to reload the data. The changed state in Foo will be responsible for showing the updated progress in the UI;

I was mistakenly thinking that this was going to be simple. The reasons for complexity:

send_data is already rendering data, so I can't refresh the page using redirect_to as this triggers a multiple render error;
send_data does not work with the remote: true option, so requesting data via an AJAX link and updating the ERB template is out;
I can write everything into a JS on click function, but this seems like a bit of a hack. I probably need to retrieve the file directly from AWS and skip my api? I'm suspecting that I might run into CORS issues as I don't have control over the server.

This is what my rails download method looks like currently:
def download
  attachment = Attachment.find_by_id(params[:attachment_id])
  content = send_data(
    attachment.file.read,
    filename: "#{attachment.title}.#{attachment.file.file.extension}",
    type: attachment.content_type,
    disposition: "attachment",
  )
end

Th js code that basically worked looks like this where all the relevant paths & filenames are passed on to the JS via data-attributes:
$(document).on("click", "#download", function(e){
  e.preventDefault();
  const data = $('#temp-information').data();
  var req = new XMLHttpRequest();
  req.open("GET", data.path, true);
  req.responseType = "blob";
  const filename = data.title;
  req.onload = function (event) {
    var blob = req.response;
    console.log(blob.size);
    var link=document.createElement('a');
    link.href=window.URL.createObjectURL(blob);
    link.download= filename;
    document.body.appendChild(link);
    link.click();
  };
  if (typeof window.navigator.msSaveBlob !== 'undefined') {
    // Fix to work in IE11
    window.navigator.msSaveBlob(blob, filename);
  } else {
    req.send();
  }
});

What is the most effective & rails'y way of handling a file download & updating the UI after the download has been completed?

A:

It's not 100% clear what you're trying to accomplish. If you're trying to let the user see download progress, I'm not sure that you really need to do anything except send_data, and most browsers will then begin downloading the file, including showing a progress bar.
Since it seems you want to do something after the file download is complete, that's quite a bit trickier. There's nothing Rails-specific about the problem, and the approach you have used looks pretty reasonable to me.
On this SO thread you'll find a lengthy discussion of this problem and various ways that people have tried to solve it. In general the solutions follow the same basic structure, which is to simply poll the server.
In your Rails app you could implement that roughly as follows. Suppose you added a field status to your attachment model...
def download
  attachment = Attachment.find_by_id(params[:attachment_id])
  attachment.update(status: "downloading")
  send_data(
    attachment.file.read,
    filename: "#{attachment.title}.#{attachment.file.file.extension}",
    type: attachment.content_type,
    disposition: "attachment",
  )
  attachment.update(status: "complete")
end

Then you can add an endpoint that returns the status of a file. Thus when the user starts to download the file you begin to poll that endpoint.
def attachment_status
  attachment = Attachment.find_by_id(params[:attachment_id])
  respond_to do |format|
    format.json do
      {status: attachment.status}
    end
  end
end

Then in Javascript, for example using HttpPromise:
var http = new HttpPromise;
function poll(doneFn) {
  http.get("/status.json") // you will need to set your actual status endpoint path here
      .success(function(data,xhr){
        if (data.status == "complete") {
          doneFn();
        }
      });
};
function downloadFinished(){
  // ... do whatever you want on finish here ...
};
setInterval(function(){ poll(downloadFinished) }, 5000);

It's not the most beautiful thing in the world, but it should get the job done.
Good luck!


// // Copyright (c) Microsoft. All rights reserved.
// // Licensed under the MIT license. See LICENSE file in the project root for full license information.

using System;
using System.Diagnostics;
using System.Windows;
using System.Windows.Threading;

namespace SingleThreadedApplication
{
    /// <summary>
    ///     Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public delegate void NextPrimeDelegate();

        private bool _continueCalculating;
        private bool _notAPrime;
        //Current number to check
        private long _num = 3;

        public MainWindow()
        {
            InitializeComponent();
        }

        private void StartOrStop(object sender, EventArgs e)
        {
            if (_continueCalculating)
            {
                _continueCalculating = false;
                startStopButton.Content = "Resume";
            }
            else
            {
                _continueCalculating = true;
                startStopButton.Content = "Stop";
                startStopButton.Dispatcher.BeginInvoke(
                    DispatcherPriority.Normal,
                    new NextPrimeDelegate(CheckNextNumber));
            }
        }

        public void CheckNextNumber()
        {
            var x = new Stopwatch();
            x.Start();

            // Reset flag.
            _notAPrime = false;

            for (long i = 3; i <= Math.Sqrt(_num); i++)
            {
                if (_num%i == 0)
                {
                    // Set not a prime flag to true.
                    _notAPrime = true;
                    break;
                }
            }

            // If a prime number.
            if (!_notAPrime)
            {
                x.Stop();
                elapsed.Text = x.ElapsedMilliseconds.ToString();
                bigPrime.Text = _num.ToString();
            }

            _num += 2;
            if (_continueCalculating)
            {
                startStopButton.Dispatcher.BeginInvoke(
                    DispatcherPriority.SystemIdle,
                    new NextPrimeDelegate(CheckNextNumber));
            }
        }
    }
}


pyArango
========

.. image:: https://pepy.tech/badge/pyarango
   :alt: downloads
   :target: https://pepy.tech/project/pyarango

.. image:: https://pepy.tech/badge/pyarango/month
   :alt: downloads_month
   :target: https://pepy.tech/project/pyarango/month

.. image:: https://pepy.tech/badge/pyarango/week
   :alt: downloads_week
   :target: https://pepy.tech/project/pyarango/week

.. image:: https://travis-ci.org/tariqdaouda/pyArango.svg?branch=1.2.2
    :target: https://travis-ci.org/tariqdaouda/pyArango
.. image:: https://img.shields.io/badge/python-2.7%2C%203.5-blue.svg
.. image:: https://img.shields.io/badge/arangodb-3.0-blue.svg

NoSQL is really cool, but in this harsh world it is impossible to live without field validation.

**WARNING**: The last versions of pyArango are only compatible with ArangoDB 3.X. For the old version checkout the branch ArangoDBV2_

.. _ArangoDBV2: https://github.com/tariqdaouda/pyArango/tree/ArangoDBV2

Key Features
------------
pyArango is geared toward the developer. It's here to help to you develop really cool apps using ArangoDB, really fast.

 - Light and simple interface
 - Built-in validation of fields on seting or on saving
 - Support for all index types
 - Supports graphs, traversals and all types of queries
 - Caching of documents with Insertions and Lookups in O(1)

Collections are treated as types that apply to the documents within. That means you can define
a Collection and then create instances of this Collection in several databases. The same goes for graphs.

In other words, you can have two databases, **cache_db** and **real_db**, each of them with an instance of a
**Users** Collection. You can then be assured that documents of both collections will be subjected to the same
validation rules. Ain't that cool?

You can be 100% permissive or enforce schemas and validate fields on set, on save or both.

Installation
------------

Supports python 2.7 and 3.5.

From PyPi:

.. code:: shell

 pip install pyArango

For the latest version:

.. code:: shell

 git clone https://github.com/tariqdaouda/pyArango.git
 cd pyArango
 python setup.py develop

Full documentation
-------------------

This is the quickstart guide; you can find the full documentation here_.

.. _here: https://pyarango.readthedocs.io/en/stable/

Initialization and document saving
-------------------------------------

.. code:: python

  from pyArango.connection import *

  conn = Connection()

  conn.createDatabase(name="test_db")
  db = conn["test_db"] # all databases are loaded automatically into the connection and are accessible in this fashion
  collection = db.createCollection(name="users") # all collections are also loaded automatically

  # collection.delete() # self explanatory

  for i in xrange(100):
      doc = collection.createDocument()
      doc["name"] = "Tesla-%d" % i
      doc["number"] = i
      doc["species"] = "human"
      doc.save()

  doc = collection.createDocument()
  doc["name"] = "Tesla-101"
  doc["number"] = 101
  doc["species"] = "human"

  doc["name"] = "Simba"
  # doc.save() # overwrites the document
  doc.patch() # updates the modified field
  doc.delete()

Queries : AQL
-------------

.. code:: python

  aql = "FOR c IN users FILTER c.name == @name LIMIT 10 RETURN c"
  bindVars = {'name': 'Tesla-3'}
  # by setting rawResults to True you'll get dictionaries instead of Document objects, useful if you want to result to set of fields for example
  queryResult = db.AQLQuery(aql, rawResults=False, batchSize=1, bindVars=bindVars)
  document = queryResult[0]

Queries : Simple queries by example
-------------------------------------
PyArango supports all types of simple queries (see collection.py for the full list). Here's an example query:

.. code:: python

  example = {'species': "human"}
  query = collection.fetchByExample(example, batchSize=20, count=True)
  print query.count # print the total number or documents

Queries : Batches
------------------

.. code:: python

  for e in query :
      print e['name']

Defining a Collection and field/schema Validation
-------------------------------------------------

PyArango allows you to implement your own field validation.
Validators are simple objects deriving from classes that inherit
from **Validator** and implement a **validate()** method:

.. code:: python

  import pyArango.collection as COL
  import pyArango.validation as VAL
  from pyArango.theExceptions import ValidationError
  import types

  class String_val(VAL.Validator):
   def validate(self, value):
       if type(value) is not types.StringType :
           raise ValidationError("Field value must be a string")
       return True

  class Humans(COL.Collection):

      _validation = {
          'on_save': False,
          'on_set': False,
          'allow_foreign_fields': True  # allow fields that are not part of the schema
      }

      _fields = {
          'name': COL.Field(validators=[VAL.NotNull(), String_val()]),
          'anything': COL.Field(),
          'species': COL.Field(validators=[VAL.NotNull(), VAL.Length(5, 15), String_val()])
      }

  collection = db.createCollection('Humans')

In addition, you can also define collection properties_ (creation arguments for ArangoDB) right inside the definition:

.. code:: python

  class Humans(COL.Collection):

    _properties = {
        "keyOptions" : {
            "allowUserKeys": False,
            "type": "autoincrement",
            "increment": 1,
            "offset": 0,
        }
    }

      _validation = {
          'on_save': False,
          'on_set': False,
          'allow_foreign_fields': True  # allow fields that are not part of the schema
      }

      _fields = {
          'name': COL.Field(validators=[VAL.NotNull(), String_val()]),
          'anything': COL.Field(),
          'species': COL.Field(validators=[VAL.NotNull(), VAL.Length(5, 15), String_val()])
      }

.. _properties: https://docs.arangodb.com/3.1/HTTP/Collection/Creating.html

A note on inheritence
----------------------

There is no inheritence of the "_validation" and "_fields" dictionaries.
If a class does not fully define its own, the defaults will be automatically assigned to any missing value.

Creating Edges
----------------

.. code:: python

  from pyArango.collection import Edges

  class Connections(Edges):

      _validation = {
          'on_save': False,
          'on_set': False,
          'allow_foreign_fields': True # allow fields that are not part of the schema
      }

      _fields = {
          'length': Field(NotNull=True),
      }

Linking Documents with Edges
-----------------------------

.. code:: python

 from pyArango.collection import *

 class Things(Collection):
   ....

 class Connections(Edges):
   ....

 ....
 a = myThings.createDocument()
 b = myThings.createDocument()

 conn = myConnections.createEdge()

 conn.links(a, b)
 conn["someField"] = 35
 conn.save() # once an edge links documents, save() and patch() can be used as with any other Document object

Geting Edges linked to a vertex
--------------------------------

You can do it either from a Document or an Edges collection:

.. code:: python

  # in edges
  myDocument.getInEdges(myConnections)
  myConnections.getInEdges(myDocument)

  # out edges
  myDocument.getOutEdges(myConnections)
  myConnections.getOutEdges(myDocument)

  # both
  myDocument.getEdges(myConnections)
  myConnections.getEdges(myDocument)

  # you can also of ask for the raw json with
  myDocument.getInEdges(myConnections, rawResults=True)
  # otherwise Document objects are retuned in a list

Creating a Graph
-----------------

By using the graph interface you ensure for example that, whenever you delete a document, all the edges linking
to that document are also deleted:

.. code:: python

 from pyArango.collection import Collection, Field
 from pyArango.graph import Graph, EdgeDefinition

 class Humans(Collection):
     _fields = {
         "name": Field()
     }

 class Friend(Edges): # theGraphtheGraph
     _fields = {
         "lifetime": Field()
     }

 # Here's how you define a graph
 class MyGraph(Graph) :
     _edgeDefinitions = [EdgeDefinition("Friend", fromCollections=["Humans"], toCollections=["Humans"])]
     _orphanedCollections = []

 # create the collections (do this only if they don't already exist in the database)
 self.db.createCollection("Humans")
 self.db.createCollection("Friend")
 # same for the graph
 theGraph = self.db.createGraph("MyGraph")

 # creating some documents
 h1 = theGraph.createVertex('Humans', {"name": "simba"})
 h2 = theGraph.createVertex('Humans', {"name": "simba2"})

 # linking them
 theGraph.link('Friend', h1, h2, {"lifetime": "eternal"})

 # deleting one of them along with the edge
 theGraph.deleteVertex(h2)

Creating a Satellite Graph
-----------------

If you want to benefit from the advantages of satellite graphs, you can also create them of course.
Please read the official ArangoDB Documentation for further technical information.

.. code:: python

  from pyArango.connection import *
  from pyArango.collection import Collection, Edges, Field
  from pyArango.graph import Graph, EdgeDefinition

  databaseName = "satellite_graph_db"

  conn = Connection()

  # Cleanup (if needed)
  try:
      conn.createDatabase(name=databaseName)
  except Exception:
      pass

  # Select our "satellite_graph_db" database
  db = conn[databaseName] # all databases are loaded automatically into the connection and are accessible in this fashion

  # Define our vertex to use
  class Humans(Collection):
      _fields = {
          "name": Field()
      }

  # Define our edge to use
  class Friend(Edges):
      _fields = {
          "lifetime": Field()
      }

  # Here's how you define a Satellite Graph
  class MySatelliteGraph(Graph) :
      _edgeDefinitions = [EdgeDefinition("Friend", fromCollections=["Humans"], toCollections=["Humans"])]
      _orphanedCollections = []

  theSatelliteGraph = db.createSatelliteGraph("MySatelliteGraph")

Document Cache
--------------

pyArango collections have a caching system for documents that performs insertions and retrievals in O(1):

.. code:: python

 # create a cache a of 1500 documents for collection humans
 humans.activateCache(1500)

 # disable the cache
 humans.deactivateCache()

Statsd Reporting
----------------

pyArango can optionally report query times to a statsd server for statistical evaluation:

  import statsd
  from pyArango.connection import Connection
  statsdclient = statsd.StatsClient(os.environ.get('STATSD_HOST'), int(os.environ.get('STATSD_PORT')))
  conn = Connection('http://127.0.0.1:8529', 'root', 'opensesame', statsdClient = statsdclient, reportFileName = '/tmp/queries.log')

It's intended to be used in a two phase way: (we assume you're using bind values - right?)
 - First run, which will trigger all usecases. You create the connection by specifying statsdHost, statsdPort and reportFileName.
   reportFilename will be filled with your queries paired with your hash identifiers. It's reported to statsd as 'pyArango_<hash>'.
   Later on you can use this digest to identify your queries to the gauges.
 - On subsequent runs you only specify statsdHost and statsdPort; only the request times are reported to statsd.

Examples
========
More examples can be found in the examples directory.
To try them out change the connection strings according to your local setup.

Debian Dependency Graph
-----------------------
If you are on a Debian / Ubuntu you can install packages with automatic dependency resolution.
In the end this is a graph. This example parses Debian package files using the `deb_pkg_tools`,
and will then create vertices and edges from packages and their relations.

Use `examples/debiangraph.py` to install it, or `examples/fetchDebianDependencyGraph.py` to browse
it as an ascii tree.

ArangoDB Social Graph
---------------------
You can create the `ArangoDB SocialGraph <https://docs.arangodb.com/latest/Manual/Graphs/#the-social-graph>`_ using `examples/createSocialGraph.py`.
It resemples `The original ArangoDB Javascript implementation: <https://github.com/arangodb/arangodb/blob/devel/js/common/modules/%40arangodb/graph-examples/example-graph.js#L56>`_ in python.


Mentioned in this article Teams: Astralis

GODSENT’s ownership group, including esports agency RFRSH Entertainment, is seeking a potential buyer, as first reported by Flickshot and confirmed by The Esports Observer. Among a variety of interested parties—including international corporations as well as strategic investors, all directly or indirectly already involved in esports—is a Swedish first division soccer club looking to enter the space, according to sources close to the organization.

Reaching out for comment, RFRSH spokesperson Steen Laursen confirmed ongoing talks, however, didn’t disclose any details.

”We do not comment on specifics in regards to contracts, players, or teams, however, it has always been the intention to work with multiple teams for a limited period of time only,” Laursen said.

The divestiture can be read as a consequence to comply with the World Esports Association’s (WESA) rules regarding multi-team ownership. RFRSH owns majority stakes in both Astralis and Heroic as well as a minority share in GODSENT—all three competing in the WESA-sanctioned ESL Pro League. The Danish agency came to an agreement with WESA last June, under which it was given an 18-month grace period to settle the issue. As a result, the ties with at least two of the three teams need to be cut by December.

While there is still time left, RFRSH is reacting to an increasing demand on the market and the agency being “an obvious choice of contact for many reasons,” as Laursen puts it.

“As the market changes and as our work with teams and brands materialize, the interest from potential investors also increases. On this basis we can confirm that we’re talking to different potential strategic investors—as we have been for a while. Several new potential investors are entering the esports market […]. As such it’s not a new situation for us to have these talks.”

Sources close to the situation, however, told TEO that the talks aren’t as casual and informal as RFRSH makes them sound like. In fact, the current ownership group is actively looking to sell.

Consequently, it is not just RFRSH’s shares that will eventually be sold, but rather the total amount of shares, which confirms the Flickshot report. This includes shares of GODSENT founder Markus “pronax” Wallsten, who already announced plans for a new project with his peer Mikail “Maikelele” Bill. Selling off his shares would certainly help in funding this endeavor.

To date, no deal has been made, however. As is often the case for esports, things can evolve rather quickly, and while specifics about the interested parties remain scarce, one can expect a high-level entry coming out on top. Pinning down a price tag isn’t easy, but GODSENT can be considered a relatively valuable brand. It’s certainly not on the level of, say, the G2-FaZe roster acquisition from two years ago, which was valued at $700,000.

Still, it will be interesting to see, whose bid will prevail in the end. Another high-profile soccer club following the steps of FC Schalke 04 or Paris Saint-Germain? A big corporation? An angel investor? For now, we can only speculate.


In spite of assurances from the Bundesbank to the Federal Reserve that the gold audit questions Germans and the German government are raising will eventually go away, it doesn't look that that will be happening any time soon, as new questions continue to be asked on the internet. Here, for example, are two crucial articles, and they deserve a very close look and analysis. Indeed, in the latter article - long but crucial - there is a detail that connects a great many dots, if you know what dots there are:

Some Follow-Up Questions For The Bundesbank, And Its Gold

James Turk - The Entire German Gold Hoard Is Gone

Let's begin with a few quotation from the first article and note what they mean:

"1. Thiele says: "By 1956, the gold reserves had risen to DM 6.2 billion, or 1,328 tonnes; upon its foundation in 1957, the Bundesbank took over these reserves. No further gold was added until the 1970s" "This is factually incorrect. From a documented source such as Timothy Green's gold reserves report from 1999 (source), we find that German gold reserves were 1,328 tonnes in 1956 and contined to rise every year until 1969 when they hit 4034 tonnes, an increase of 200% since 1956! Offical German gold in 1970 was 3,537 tonnes and declined to 2,963 by 1979. Since then it has increased by just 400 tonnes."

In other words, Thiele is confirming - from the mouth of a central banker - that theme which i have hypothesized here over and over: either the central banks do not know the actual amount of gold, or those amounts are being deliberately obfuscated to cover up a massive fraud. This seems to be confirmed by the next statement:

"2. Thiele says: "At the beginning of the last decade, we brought 930 tonnes of gold to Frankfurt from London and subjected it to a painstaking inspection. Part of the gold was melted down in order to create new bars which conform with the “Good Delivery Standard”. "Fact: All gold stored at the Bank of England has to be London Good Delivery Standard. Bars that do not conform are not accepted. That is how the LBMA system works. There is an accepted refiner list. There would be no need to melt down anything from the Bank of England unless the Bundesbank had been duped with coin bars or similar and/or does not have faith in the BOE in the first place." (Emphasis in the original)

Bingo! Ding ding ding ding ding! "Tyler Durden" at Zero Hedge is correct: what Thiele's admission in fact means is that the Bundesbank had been defrauded and that the fraud included the Bank of England as either the transhipment point, or point of origin. For reasons I won't get into here, I believe it to have been the transmission point. I submit that it is right here that we have the real reason for the concern about the gold reserves in Germany: someone in the German government - someone perhaps even familiar with the 1928 story of Hjalmar Schacht - knew of this fraud and what it portends, and what it portends is nothing less than massive.

Now let's turn to the second, and much more lengthy article. And I will simply present a few quotations, and for your benefit, the ESF refers to Exchange Stabilization Fund, which is, as the author of this article avers, one of the smoking guns:

"James Turk 2001 - This past December in "The Smoking Gun" I provided substantive proof that the Exchange Stabilization Fund was intervening in the gold market. From publicly available reports prepared by the Federal Reserve, I established that the weight of gold held as a component of the US Reserve Assets has been changing, and that these changes – some of which are of significant size – result from activity by the ESF. These Federal Reserve reports conclusively demonstrate that the ESF has been intervening in the gold market since at least 1996. "Though these Federal Reserve reports make clear that the ESF is involved in the gold market up to its 'earmarks', a lot of people remain skeptical. I don't know why that is. It is worth noting that many of the most obstinate skeptics who deny US government involvement in the gold market live overseas and have little, if any, experience or understanding of the way the US government really works. But even Americans find it difficult to accept that the US government intervenes in the gold market. Ironically though, they readily admit that the government intervenes in the debt markets, foreign currency markets, and according to a growing number of people, even in the US stock market. It is therefore most baffling that they do not concede the ESF's involvement in the gold market."

Now consider this:

"CHAIRMAN GREENSPAN. Could I just formally respond to Governor Lindsey? There is a question here of whether or not the amount the United States Treasury gives us has to be appropriated funds, which I think is really where our examination of the issue has to be. In examining the take-out, we ought to make certain that we talk to them with respect to the question of what happens if they do not get the appropriated funds. "MR. TRUMAN. Mr. Chairman, the Exchange Stabilization Fund does not have appropriated funds.

CHAIRMAN GREENSPAN. Are we going to be getting a take-out from the Exchange Stabilization Fund?

MR. TRUMAN. I think that is what is in the program.

CHAIRMAN GREENSPAN. Okay.

SPEAKER(?). That is not the same as the Treasury.

MR. TRUMAN. Even if we didn't, the precedent in the 196Os – I think there was a question then about whether the Treasury could engage in foreign exchange operations outside of the ESF – was the use of Roosa bonds in the 1960s. The Treasury floated Roosa bonds to obtain foreign currencies and used some of those currencies to take us out. That did not involve appropriated funds. That was treated as a debt-management operation. "The above passage confirms what we already know, but many people refuse to admit. The ESF is a slush fund beyond Congressional oversight." (Emphasis added)

Just in case you want to know, the Exchange Stabilization Fund was established in 1934 as a result of - you guessed it - FDR's confiscation of US gold, and thus, as the author correctly deduces, this is a slush fund directly beholden to the American executive and to the financial oligarchy.

In short, you're looking at part of a financial mechanism that is completely off the books... you're looking at something that has the potential for massive fraud, and you're looking at something that could fund a lot of covert activity... and indeed, may have been doing so for a very long time...

... see you on the flip side.


// 2008-08-04
#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <algorithm>
using namespace std;
int main()
{
	int a[2001];
	int i,j,N;
	for(;;)
	{
		scanf("%d",&N);
		if (!N) return 0;
		for (i=0; i<N; i++)
			scanf("%d",a+i);
		a[N++]=-1;
		sort(a,a+N);
		int l,u,m;
		long long total=0;
		for (i=3; i<N; i++)
			for (j=2; j<i; j++)
			{
				l=0;
				u=j-1;
				while (u>l)
				{
					m=(l+u+1)/2;
					if (a[m]+a[j]>=a[i])
						u=m-1;
					else
						l=m;
				}
				total+=l;
			}
		printf("%lld\n",total);
	}
}


Field
The present disclosure relates generally to motion tracking, and more particularly, to a method, system, and computer program product for motion tracking in connection with augmented reality systems, e.g., including a head mounted display (HMD).
Background
Recently there has been an explosion of interest in Augmented Reality well beyond the research community where the field was forged in the early years of the ISMAR conference and its prequels. The popular press has adopted wholesale the vision of the pioneering researchers, in which augmented reality (AR) will become an indispensable tool to augment human performance by providing enhanced situational awareness and visual guidance to complete tasks quickly and accurately without advance training.
For the past several years it seemed that the early focus on HMD-based AR had largely given way to tablet and phone AR because the devices became widely available to consumers and advertisers saw the novelty of simple video AR as a way to reach them. Wearable AR systems leave the user's hands free and can provide an always-on information display that is ready to provide augmentations quickly when they are needed.
This renewed interest in HMDs still faces challenges including optical technologies to produce small comfortable HMDs with sufficient field of view (FOV), and head-tracking that can produce convincing spatio-temporal registration of augmentations to their corresponding physical objects in unprepared real-world environments. Additional details can be found in Azuma, R., and Bishop, G., “Improving Static and Dynamic Registration in a See-Through HMD”, Proceedings of SIGGRAPH 37 '94. In Computer Graphics, Annual Conference Series, Orlando, Fla., pp. 197-204, 1994; Krevelen, D. W. F., & Poelman, R. A Survey of Augmented Reality Technologies, Applications and Limitations. The International Journal of Virtual Reality, 9(2):1-20, 2010; Daniel Wagner, Gerhard Reitmayr, Alessandro Mulloni, Tom Drummond, Dieter Schmalstieg. Pose tracking from natural features on mobile phones. Proceedings of the 7th IEEE/ACM International Symposium on Mixed and Augmented Reality, pages 125-134. ISMAR 2008; Welch, G., Bishop, G., Vicci, L., Brumback, S., Keller, K. & Colluci, D. (2001). High-Performance Wide-Area Optical Tracking: The HiBall Tracking System. Presence: Teleoperators and Virtual Environments vol 10, issue 1, MIT Press; and Zhou, F., Been-Lirn Duh, Henry., Billinghurst, M. Trends in augmented reality tracking, interaction and display: A review of ten years of ISMAR. Proceedings of the 7th IEEE/ACM International Symposium on Mixed and Augmented Reality, Pages 193-202. ISMAR 2008; and Roberts, D., Menozzi, A., Cook, J., Sherrill, T., Snarski, S., Russler, P., . . . & Welch, G. Testing and evaluation of a wearable augmented reality system for natural outdoor environments. In SPIE defense, Security, and Sensing (pp. 87350A-87350A). International Society for Optics and Photonics. May 2013, the entire contents of each of which are incorporated herein by reference.
The ability to operate without markers has been demonstrated in many indoor and outdoor environments at impressive scale, and for video-see-through AR (such as tablets and phones) vision-based techniques also produce rock-solid registration with no noticeable swim or mis-registration. However optical see-through registration is a much harder problem because the view of the physical world cannot be delayed to match the view of the virtual augmentations, and the alignment cannot be simply matched up in a video image, which puts a much greater demand on absolute 6-DOF pose accuracy and relative calibration accuracy of the tracker to the display.
Thus, there remains need in the art for methods of achieving registration that appears “rock solid” with no noticeable “swim.”


SpeakSee makes it simple for a deaf person to join a group conversation

There’s a great deal of activity in the fields of speech recognition and the “Internet of Things,” but one natural application of the two has gone relatively unpursued: helping the deaf and hard of hearing take part in everyday conversations. SpeakSee aims to do this (after crowdfunding, naturally) with a clever hardware design that minimizes setup friction and lets everyone communicate naturally.

It’s meant to be used in situations where someone hard of hearing needs to talk with a handful of others — a meeting, a chat at dinner, asking directions and so on. There are speech-to-text apps out there that can transcribe what someone is saying, but they’re not really suited to the purpose.

“Many deaf people experienced a huge barrier in asking people to download the app and hold the phone close to their mouth. These limitations in the interface meant no one kept using it,” explained SpeakSee CEO and co-founder Jari Hazelebach. “But because we designed our own hardware, we were able to customize it towards the situations it will be used in.”

SpeakSee is simple to use: A set of clip-on microphones live in a little charger case, and when the user wants to have a conversation, they hand those microphones out to whoever will be talking. The case acts as a wireless hub for the mics and relays the audio to the smartphone with which it’s paired. This audio is sent off, transcribed quickly somewhere in the cloud, and displayed on the deaf user’s phone.

Critically, though, each microphone also intelligently and locally accounts for its speaker and background noise.

“Naturally the microphones pick up speech from multiple people,” said Hazelebach. “So we included sensors that tell the microphone what direction the sound is coming from, and the microphones exchange these values. So we can determine which microphone should pick up which person’s speech.”

The result is quickly transcribed speech divided by speaker, delivered quickly and with decent accuracy (there’s always a trade-off between turnaround time and how the process is). And no one has to do anything but wear a mic. (They have a patent pending for this multi-microphone system.)

Hazelebach’s parents are deaf, and he grew up seeing how their ability to interact in ordinary circumstances was being limited.

The mics aren’t exactly small… but that’s how you know they’re real working hardware and not imaginary.

“As you can imagine my parents were the first to test this out,” he said. “At first we had a lot of issues but soon we started engaging with others. We wrote a post on a deaf blog and out of nowhere 200 people signed up. So we’ve been testing in the field with groups in the U.S., and also in the U.K. and the Netherlands.”

Right now English speech recognition is considerably ahead of Dutch and other languages, so the transcriptions will be better for the former, but even so the devices should work with any of 120 languages supported by the cloud service. Transcription is free for up to 5 hours of audio monthly, after which it’s a $10/month subscription. But if it works, it may be more than worth the money.

The team has a finished prototype but is seeking crowdfunding to get production off the ground. “We need to improve the electronics to meet specifications, battery life for example. We expect to ship in February of 2019,” Hazelebach said. Pre-orders are set at $350 for a dock and three mics.

The usual caveats (primarily “emptor”) apply when backing an Indiegogo type campaign — but at the very least, having spoken to the creator, I feel pretty sure this is a real, working product that just needs a boost to get to market.


肺癌发病率及死亡率均高居恶性肿瘤第一位，小细胞肺癌（small cell lung cancer, SCLC）约占肺癌总发病率10%-15%，其临床特点和生物学行为异于其他类型肺癌，表现为倍增时间短，早期易发生转移，恶性程度极高。目前SCLC患者的治疗仍以全身化疗±同步放疗为主，初治缓解率高，但复发率极高，且易发生耐药，5年生存率不足5%。

随着肿瘤分子生物学的迅速发展，针对表皮生长因子受体（epidermal growth factor receptor, *EGFR*）、间变性淋巴瘤激酶（anaplasticlymphoma kinase, *ALK*）突变基因的分子靶向药物在肺腺癌患者中取得了满意的疗效及生存获益，为非小细胞肺癌（non-small cell lung cancer, NSCLC）开辟了新的治疗途径。但SCLC的治疗始终无明显进展，迫切需要新的有效治疗手段。关于SCLC发生发展分子机制方面的各项研究进展相对缓慢，迄今尚未发现有效的分子治疗靶点。其中一个重要原因可能是，绝大多数SCLC患者在就诊时已发生远处转移，失去手术机会，无法获取足够的、令人满意的手术病理标本进行大规模突变基因筛选。

目前，综合已有的几项较大规模SCLC全基因组测序结果，已知潜在的SCLC分子生物治疗靶点主要包括抑癌基因*TP53*、*RB-1*、*PTEN*缺失或失活，PIK3CA、*EGFR*、*c-MET*、*c-Kit*过度表达，*FGFR1*、*SOX2*、*MYC*家族扩增，其他可检测到的还包括*EP300*、*CREBBP*、*ZNF521*、*RUNX1T1*、*KMT2D*等基因突变^\[[@b1]-[@b5]\]^。迄今为止，多种针对上述靶点的药物已经探索性地进入临床研究阶段，然而尚无一种靶向治疗能够得到有效的临床证实。2012年Byers等^\[[@b6]\]^报告了SCLC中两个较为独特的分子特征：果蝇*zeste*基因增强子的人类同源物-2（enhancer of zeste homolog 2, EZH2）和聚腺苷酸二磷酸核糖聚合酶-1\[poly(ADP-ribose)polymerase, PARP-1\]，提出二者作为SCLC潜在驱动基因，有可能为SCLC治疗开辟新的方向。

1. EZH2和PARP-1 {#s1}
===============

Byers等^\[[@b6]\]^应用反向阶段蛋白质阵列技术，测定了34株SCLC细胞系及74株NSCLC细胞系共计193种蛋白表达水平情况。该研究发现，RTK、PI3K、RAS/MAP/ERK在SCLC中的活性以及表达水平远远低于NSCLC，但在SCLC中，转录基因*E2F1*调控因子如EZH2、DNA修复蛋白、胸苷酸合成酶、凋亡因子的表达水平明显高于NSCLC，尤其以EZH2和PARP-1的升高为主。敲除*EZH2*和*PARP-1*基因后，SCLC细胞系的生长受到明显抑制。

1.1. EZH2 {#s1-1}
---------

RB1/E2F信号传导途径异常存在于超过90%的SCLC，是其公认的最具代表性的异常信号传导通路^\[[@b7]\]^。Coe等^\[[@b8]\]^对14份SCLC病理标本及14株SCLC细胞系进行基因检测，在全部标本中均检测到了RB1/E2F信号传导途径上的异常，包括*RB1*抑癌基因缺失或突变、E2F家族扩增。而无论是RB1丢失或E2F扩增，最终都将激活其下游的*EZH2*基因。与此同时，Coe等^\[[@b8]\]^研究了EZH2在SCLC细胞中的表达情况，结果显示*EZH2*基因的表达水平均有明显升高。*RB1*抑癌基因主要通过抑制E2F转录因子家族表达起到抑制细胞增殖作用，而E2F家族成员如E2F1在不同的人类癌症微环境中可能起到促进或抑制癌细胞增殖这两种截然相反的作用^\[[@b9]\]^。因此，存在于RB1/E2F信号传导途径下游*EZH2*基因似乎更适合作为SCLC驱动基因。

*EZH2*基因定位于人染色体7q35位点上，是多梳基因（polycomb group genes, *PcG*）家族重要成员之一。PcG家族是人体生长发育过程中一类重要表观遗传调控因子，家族成员间相互结合成多梳抑制复合体发挥作用，能使某些特定基因的沉默，在DNA修复中也起到一定作用^\[[@b10]\]^。EZH2是多梳抑制复合体2的关键催化亚单位，在染色质结构的形成、基因表达调节以及生长控制等过程中发挥重要作用。

*EZH2*基因异常激活后可以甲基化组蛋白3的27号赖氨酸（histone H3 lysine 27, H3K27），与DNA甲基转移酶（DNA methyltransferases, DNMTs）、组蛋白去乙酰化酶（histone deacetylases, HDACs）一起发挥转录抑制作用，沉默200多种抑癌基因的表达，亦可激活某些靶基因，导致恶性肿瘤形成发展^\[[@b11],\ [@b12]\]^。Hubaux等^\[[@b13]\]^利用短发夹RNA（short hairpin RNA, shRNA）沉默SCLC细胞系中的*EZH2*基因表达后，观察到处于S或G~2~/M期的细胞比例降低，p21蛋白水平升高，促凋亡因子Puma和Bad上调，细胞凋亡活性明显增加，认为这可能为EZH2在SCLC形成中的分子作用机制。

近年来，研究者们陆续在前列腺癌、乳腺癌、膀胱癌等多种肿瘤组织中发现*EZH2*基因高表达现象^\[[@b14]-[@b16]\]^。其中，对乳腺癌、前列腺癌的研究显示EZH2可能与肿瘤的高度侵袭性相关。有观点认为EZH2可以使某些抗转移基因表达沉默，如E-钙粘蛋白、基质金属蛋白酶组织抑制因子等。也有观点认为EZH2可参与潜在转移源头"肿瘤干细胞"的自我更新^\[[@b17]\]^。对卵巢癌的研究则表明EZH2与顺铂耐药性的产生密切相关^\[[@b18]\]^。目前，*EZH2*基因在癌变过程中的具体作用机制尚不十分清楚。目前关于EZH2抑制剂的研究仍在进行中，尚无成熟的EZH2抑制剂进入临床前期试验。

1.2. PARP-1 {#s1-2}
-----------

PARP超家族主要在碱基切除修复（base excision repair, BER）过程发挥重要作用，17个家族成员中以可以生成活性形式聚腺苷二磷酸核糖\[poly（ADP-ribose）, PAR\]的PARP-1、PARP-2、PARP5A、PARP5B研究较为深入透彻^\[[@b19]\]^，被认为是潜在的肿瘤生物治疗靶点。PARP-1是此家族中结构最典型、最为重要的一个异构体，是在DNA受损时最早出现并起主要修复作用的蛋白质之一^\[[@b20],\ [@b21]\]^。

PARP-1以尼克酰胺腺嘌呤二核苷酸为底物，生成PAR，后者可使RNA聚合酶、DNA聚合酶等多种DNA修复蛋白发生聚ADP核糖基化，显著增强其DNA修复能力，使整个DNA修复过程顺利完成。BER是DNA发生DNA单链断裂（single strand breaks, SSBs）时的主要修复途径，SSBs若得不到及时修复，可逐渐累积进展至更为严重的DNA双链断裂（double stand breaks, DSBs），后者修复主要依赖同源重组（homologous recombination, HR）和非同源性末端接合（non-homologous end joining, NHEJ）2种途径。抑癌基因*BRCA*是HR途径中的主要成员。PARP-1亦可通过HR及NHEJ途径参与DSBs修复。故在*BRCA*基因突变患者中，BER途径的DNA修复作用尤其必不可少。而反过来根据生物体内的"合成致死现象"（synthetic lethality），在BRAC功能缺失情况下抑制肿瘤细胞*PARP*基因的表达，DNA损伤将无法得到有效修复从而导致死亡。

Byers等^\[[@b6]\]^对135例肺癌标本进行了免疫组化分析，结果显示PARP-1在SCLC中的表达水平显著高于腺癌及鳞癌。体外试验中，NSCLC细胞系对PARP-1抑制剂均表现出了不同程度的抵抗性，然而，绝大多数SCLC细胞对PARP-1抑制剂如AZD2281、AG014699则较敏感。可能的机制是，SCLC作为一种乏氧肿瘤，其慢性缺氧环境可刺激E2F/p130结合抑癌基因*BRCA1*和*RAD5*启动子位点，导致BRCA1和RAD51表达水平下调。BRCA、PARP介导的DNA修复途径均被抑制，最终引起SCLC细胞凋亡^\[[@b22]\]^。在放疗或化疗诱导出现癌细胞SSBs损伤时，PARP抑制剂通过抑制DNA修复作用可进一步增强肿瘤细胞对放化疗敏感度。

目前，多种PARP抑制剂如rucaparib、niraparib、olaparib已进入Ⅲ期临床试验。针对SCLC的BMN673、viliparib已完成Ⅰ期临床试验，正在进行Ⅱ期临床试验。值得注意的是，Cardnell等^\[[@b23]\]^进行的一项研究发现伴有PI3K途径激活的SCLC细胞系往往对PARP抑制剂耐药。Juvekar等^\[[@b24]\]^在乳腺癌小鼠模型中观察到，联合应用PI3K抑制剂NVP-BKM120与PRAP抑制剂olaparib可延长肿瘤倍增时间达70 d以上，数倍于单用NVP-BKM120或olaparib的延长时间。上述研究结果提示，在SCLC治疗中，可尝试联用PI3K抑制剂与PRAP抑制剂，以改善PARP抑制剂敏感性，增强治疗效果。

2. 其他传统驱动基因 {#s2}
===================

2.1. P13K-AKT-mToR信号传递通路 {#s2-1}
------------------------------

P13K-AKT-mToR途径为EGFR、HER2等RTKs主要下游信号传递通路之一，该通路异常激活能够加速肿瘤细胞周期、抑制细胞凋亡、促进肿瘤细胞迁移，以及增加化疗药物耐药性。SCLC是最早报道存在该通路异常的众多肿瘤之一。

### 2.1.1. PTEN {#s2-1-1}

*PTEN*是抑癌基因，位于人染色体10q23位点上，负性调节PI3K下游AKt/mToR信号通路的活性。有研究^\[[@b25]\]^显示，大约15%的SCLC中存在*PTEN*基因突变，突变后的*PTEN*基因功能丧失，可引起第二信使PIP3的大量聚集，使得下游通路被激活，从而促进肿瘤的形成。

### 2.1.2. PIK3CA {#s2-1-2}

负责编码PI3Ks家族的催化亚单位p110a，在肿瘤细胞中，p110a主要作用为上调Akt的表达水平，并通过磷酸化多种底物，包括凋亡相关蛋白、mTOR组成成分等，促进细胞存活、生长和增殖。日本学者扩大了基因突变筛查范围后，在SCLC细胞株及SCLC病理标本中分别发现23%、13%的*PIK3CA*基因突变^\[[@b26]\]^。目前已知PI3K抑制剂如wortmannin和LY294002对携带*PIK3CA*突变的SCLC细胞有效^\[[@b27]\]^。问题是目前上述抑制剂均未表现出适当的靶向特异性，潜在毒副作用较大。

### 2.1.3. mTOR {#s2-1-3}

mTOR属于磷脂酰肌醇3-激酶相关激酶（plosphatidylinositol 3-kinase-related kinase, PIKK）蛋白家族的一员，活化的*mTOR*基因使蛋白翻译过程中的某些因子（最主要是4EBP1和P70S6K）发生磷酸化，进而参与多项细胞功能。据报道，S6K1和S6K2在SCLC细胞系中可过度表达，促进肿瘤细胞增殖。由于其各自的活化不依赖PI3K，于是可被特异性mTOR抑制剂阻断^\[[@b28]\]^。mTOR抑制剂依维莫司联合标准EP方案一线治疗转移性SCLC正在研究中。

2.2. 成纤维细胞生长因子受体-1（fibroblast growth factor receptor-1, FGFR1）扩增 {#s2-2}
-------------------------------------------------------------------------------

FGFR1由位于染色体8p12上的独立基因编码。其与配体FGFs结合后，主要通过激活下游RAS/RAf/MEK/Erk、PI3K/Akt信号通路，参与调节胚胎发育、组织修复、血管生成等重要过程。FGR-FGFR信号转导通路异常在多种肿瘤的生长、移行和血管生成过程中起核心作用。

据报道^\[[@b29]\]^，大约20%肺鳞癌中存在*FGFR1*基因扩增，以FGFR1为靶点的分子药物治疗已进入临床试验阶段，并在肺鳞癌患者中取得一定疗效。Schultheis等^\[[@b30]\]^应用荧光原位杂交（fluorescence *in situ* hybridization, FISH）法检测251份SCLC肿瘤组织，证实约5.6%的SCLC也存在高水平FGFR1扩增，但与肺鳞癌扩增形式有显著不同，主要为同源性扩增，且均匀分布于肿瘤细胞，无肺鳞癌中的"分布热点"现象。Ruotsalainen等^\[[@b31]\]^在刚确诊SCLC患者的血清中发现存在高水平FGF-2，既往研究证明FGF-2与肿瘤血管生长丰富及预后不良密切相关。Pardo等^\[[@b32]\]^研究发现FGF-2可作为SCLC细胞的促分离原，并诱导凋亡蛋白抑制因子Bcl-XL、XIAP表达，逃避依托泊苷诱导的细胞凋亡。FGF/FGFRs抑制剂在SCLC中的有效性值得进一步研究。

2.3. *SOX2*扩增 {#s2-3}
---------------

SOX转录因子家族主要参与调节胚胎干细胞及神经干细胞分化，也是肺发育过程中的一类重要功能调节因子。*SOX2*突变与*FGFR1*突变一样，在肺鳞癌多见。*SOX*扩增在SCLC中占27%，Titulaer等^\[[@b33]\]^应用shRNA沉默SOX2表达后存在*SOX2*扩增的SCLC细胞系明显生长受抑。

2.4. *MYC*扩增 {#s2-4}
--------------

原癌基因*MYC*转录产物具有刺激细胞增殖和促进细胞凋亡双重作用，与恶性肿瘤形成、发展有密切关系。*L-MYC*、*N-MYC*、*C-MYC*异常扩增在肺癌中较明确，其中*L-MYC*、*N-MYC*在SCLC中更多见。有研究^\[[@b34]\]^显示SCLC中*MYC*扩增一般伴有抑癌基因*MAX*（MYC-associated factor X gene）、*BRG1*基因的失活，而并未在NSCLC中观察到此现象。研究显示*MYC*突变可能发生在癌变过程的启动阶段。

2.5. EGFR {#s2-5}
---------

EGFR属于Ⅰ酪氨酸激酶型受体，激活后触发肿瘤细胞增殖、分化、迁移、粘附、血管形成等一系列下游事件。除已知肺鳞癌和肺腺癌中存在EGFR过度表达，也有证据表明在SCLC中存在低水平的*EGFR*突变，且存在*EGFR*突变的SCLC细胞系表现出更强的侵袭性。*EGFR*突变阳性率水平与其对酪氨酸激酶抑制剂（tyrosine kinase inhibitor, TKI）类药物的敏感性并不是完全平行的。体外试验中SCLC细胞系对吉非替尼表现出一定敏感性。但之后的Ⅱ期临床试验并未观察到有效反应。有个例报道TKI类药物在广泛期SCLC有一定临床效果。

2.6. c-Kit {#s2-6}
----------

人类*c-Kit*原癌基因位于人染色体4qll-12位点上，其mRNA长约5, 084 bp，其中2, 928 bp编码蛋白产物，即为c-Kit受体（CD117）。该受体为Ⅲ型酪氨酸激酶受体，与配体干细胞因子（stem cell factor, SCF）结合，激活下游信号转导通路，包括P13K通路、JAK -STAT通路、MAPK通路等，促进各类细胞的增殖、迁移和分化^\[[@b35]\]^。

L'opez-Martin等^\[[@b36]\]^利用免疫组化方法分析204例SCLC标本，结果显示73%（*n*=149）有c-Kit表达。在离体实验中，c-Kit阳性SCLC细胞系接触到SCF后瘤细胞可出现迅速增殖及转移，抑制c-Kit受体后SCLC肿瘤细胞的生长则明显受限^\[[@b37],\ [@b38]\]^。但在进一步的临床试验中，c-Kit抑制剂如伊马替尼却未能在SCLC患者中显示抗肿瘤活性。

2.7. c-Met {#s2-7}
----------

c-Met属于Ⅱ型酪氨酸激酶受体，配体为肝细胞生长因子（human hepatocyte growth factor, HGF）。c-Met/HGF信号转导途径活化后可以促进肿瘤细胞增殖、运动、分化及血管形成，对肿瘤的侵袭和转移有重要促进作用。c-Met高表达在多种恶性肿瘤中已有报道，在各型肺癌中以SCLC多见。Wang等^\[[@b39]\]^运用siRNA下调c-Met表达后发现SCLC细胞增殖性以及侵袭性均明显受抑制，表明c-Met/HGF信号转导途径异常在SCLC的形成及进展中起重要作用。多种c-MET抑制剂如AMG102联合标准EP方案（依托泊苷+顺铂）治疗转移性SCLC的临床研究正在进行中。

SCLC中已知许多致癌基因突变及分子改变，早期进行的针对其特异性靶点分子靶向治疗药物，如VEGFR抑制剂、bcl-2反义寡核苷酸、IGF-IR抑制剂等，在进行的多项临床试验中并没有明显改变本病的进程。最新研究表明EZH2、PARP-1在SCLC中存在明显高表达现象，特异性优于其他分子治疗靶点，有望由此在SCLC靶向治疗方面获得新的突破。但是，目前以EZH2、PARP-1为靶点的分子靶向治疗在SCLC中开展的研究性试验还十分有限，EZH2、PARP-1具体的致癌分子作用机制仍需进一步研究，相应药物的研发及其在SCLC治疗中的敏感性及安全性问题更需要未来很长一段时间逐步逐层论证落实。此外，在一些SCLC发生发展中可能存在数个驱动基因或信号通路同时异常活化，各自通过不同机制促进肿瘤形成，也许是单一分子靶向治疗效果不佳原因之一。总而言之，目前仍然需要对SCLC驱动基因及具体分子作用机制不断深入研究，以指导临床优化治疗策略。