--- layout: post title: "The Business of Ed-Tech: December 2017 Funding Data" date: 2017-12-29 11:10:00 +0000 tags: image: https://s3.amazonaws.com/hackedu/2017-03-01-money.jpg imagecredits: https://www.flickr.com/photos/chrisdlugosz/3403776466 ---
Here is the latest data on “the business of education” for the month of December:
December wasn’t the slowest month of the year in terms of the number of investments. (That was April, with 9.) But it was the month with the least amount of money flowing into ed-tech companies.
Errata: I listed an investment in WorldStrides in my November roundup, but it turns out that money was actually an acquisition. Oops. $500 million is a big mistake to make. I’ve updated all my calculations to reflect this.
You can read more analysis about “the business of ed-tech” in 2017 on 2017trends.hackeducation.com. But here are some of the totals for the year:
The amount of investment is up from last year by over $1 billion. But it’s down from the record-setting year in 2015 – down by about a billion from then. The number of deals this year is also down from the two previous years, as is the number of acquisitions.
The companies that have raised the most money in 2017 (not including the venture capital firms that have raised new funds):
These are (as far as I can tell) currently the most well-funded startups in education:
The most active venture capitalist firms this year:
No large company went on a startup-buying streak this year. That is to say, no one bought more than two companies. Chegg, for example, bought refMe and Cogeon. Elsevier bought Plum Analytics and bepress. Thomas Bravo bought Frontline Education which bought Teachers-Teachers and School Improvement Network in turn.
Other notable acquisitions: Apollo Global Management bought West Corporation for $5.2 billion; Vista Equity Partners bought EAB for $2.58 billion; Baring Private Equity Asia and CITIC Capital bought Wall Street English from Pearson for $300 million; Barnes & Noble Education bought the MBS Textbook Exchange for $174.2 million; Navient bought the student loan company Earnest for $155 million; Berkshire Partners bought Curriculum Associates for $145 million; the Education Testing Service bought Questar for $127.5 million; 2U bought GetSmarter for $103 million; WeWork bought the Flatiron School for an undisclosed sum; Cogswell Education bought Adtalem Education (a.k.a. DeVry University) for an undisclosed sum; and Square bought the remnants of the defunct Yik Yak for $1 million.
There were just a handful of mergers this year, and none as high profile as the joining of for-profit colleges Strayer Education and Capella Education.
Other mergers: Taskstream with Tk20; InsideTrack with Strada Education; and Code/Interactive with Mouse.
There was one spinoff this year: Voyage, which spun off of parent company Udacity.
There were four (!!!) education IPOs this year: for-profit college chain Laureate Education (LAUR); private preschool company RYB Education (RYB); English language learning company Rise Education Cayman (REDU); and tutoring company Four Seasons Education (FEDU).
Also notable: Saint Francis High School in California that invested $15,000 in a seed round of Snap in 2012. It sold two-thirds of its shares this year when Snap IPO’d, earning some $24 million.
Four education companies joined the “deadpool” this year: Yik Yak, The Iron Yard, Dev Bootcamp, and TechShop.
Yik Yak had raised some $73 million in venture capital before folding. The Iron Yard and Dev Bootcamp, both coding bootcamps, had been acquired by for-profit colleges (Apollo Education Group and Kaplan respectively) who opted not to keep the lights on.
If you’re looking for more details (or want to double-check my math), you can see who’s received funding, who’s been acquired, who’s IPO’d, which startups have closed, and who’s investing in the stories that Edsurge is telling you about the shape of the education technology industry.
I have created separate GitHub repositories for all areas of funding that I monitor:
These sites include human- and machine-readable versions of this funding data. I have created many other repositories where I track on the people and investments of venture capital firms, philanthropic organizations, and other ed-tech-related companies, all available at GitHub/Hack-Education-Data.
If you see an error or omission, please file a GitHub issue. You’re welcome to fork or download the repositories too, of course.


Main-script of the DamApplication put in a class.
More...
Main-script of the DamApplication put in a class.
◆ __init__()
| def dam_analysis.DamAnalysis.__init__ |
( |
|
self, |
|
|
|
model, |
|
|
|
project_parameters |
|
) |
| |
◆ CreateModelPart()
| def dam_analysis.DamAnalysis.CreateModelPart |
( |
|
self | ) |
|
◆ CreatePostModelPartMechanical()
| def dam_analysis.DamAnalysis.CreatePostModelPartMechanical |
( |
|
self | ) |
|
◆ CreatePostModelPartThermal()
| def dam_analysis.DamAnalysis.CreatePostModelPartThermal |
( |
|
self | ) |
|
◆ DefineParallelType()
| def dam_analysis.DamAnalysis.DefineParallelType |
( |
|
self | ) |
|
◆ DefineVariables()
| def dam_analysis.DamAnalysis.DefineVariables |
( |
|
self | ) |
|
◆ Finalize()
| def dam_analysis.DamAnalysis.Finalize |
( |
|
self | ) |
|
◆ Initialize()
| def dam_analysis.DamAnalysis.Initialize |
( |
|
self | ) |
|
◆ PreviousSelfweightProblem()
| def dam_analysis.DamAnalysis.PreviousSelfweightProblem |
( |
|
self | ) |
|
◆ PrintOutput()
| def dam_analysis.DamAnalysis.PrintOutput |
( |
|
self | ) |
|
◆ Run()
| def dam_analysis.DamAnalysis.Run |
( |
|
self | ) |
|
◆ RunMainTemporalLoop()
| def dam_analysis.DamAnalysis.RunMainTemporalLoop |
( |
|
self | ) |
|
◆ SetSolver()
| def dam_analysis.DamAnalysis.SetSolver |
( |
|
self | ) |
|
◆ add_displacement
| dam_analysis.DamAnalysis.add_displacement |
◆ add_previous_results
| dam_analysis.DamAnalysis.add_previous_results |
◆ add_reference_temperature
| dam_analysis.DamAnalysis.add_reference_temperature |
◆ add_stress
| dam_analysis.DamAnalysis.add_stress |
◆ add_temperature
| dam_analysis.DamAnalysis.add_temperature |
◆ aux_file_name_mechanical
| dam_analysis.DamAnalysis.aux_file_name_mechanical |
◆ aux_file_name_thermal
| dam_analysis.DamAnalysis.aux_file_name_thermal |
◆ buffer_size
| dam_analysis.DamAnalysis.buffer_size |
◆ consider_construction
| dam_analysis.DamAnalysis.consider_construction |
◆ consider_selfweight
| dam_analysis.DamAnalysis.consider_selfweight |
◆ construction_utilities
| dam_analysis.DamAnalysis.construction_utilities |
Initialize Construction Utility.
◆ delta_time
| dam_analysis.DamAnalysis.delta_time |
◆ domain_size
| dam_analysis.DamAnalysis.domain_size |
◆ echo_level
| dam_analysis.DamAnalysis.echo_level |
◆ end_time
| dam_analysis.DamAnalysis.end_time |
◆ file_name_mechanical
| dam_analysis.DamAnalysis.file_name_mechanical |
◆ file_name_thermal
| dam_analysis.DamAnalysis.file_name_thermal |
◆ gid_output
| dam_analysis.DamAnalysis.gid_output |
◆ list_of_output_processes
| dam_analysis.DamAnalysis.list_of_output_processes |
◆ list_of_processes
| dam_analysis.DamAnalysis.list_of_processes |
◆ main_model_part
| dam_analysis.DamAnalysis.main_model_part |
◆ model
| dam_analysis.DamAnalysis.model |
◆ model_mechanical
| dam_analysis.DamAnalysis.model_mechanical |
◆ model_selfweight
| dam_analysis.DamAnalysis.model_selfweight |
◆ model_thermal
| dam_analysis.DamAnalysis.model_thermal |
◆ post_model_part_mechanical
| dam_analysis.DamAnalysis.post_model_part_mechanical |
◆ post_model_part_thermal
| dam_analysis.DamAnalysis.post_model_part_thermal |
◆ problem_name
| dam_analysis.DamAnalysis.problem_name |
◆ problem_path
| dam_analysis.DamAnalysis.problem_path |
◆ project_parameters
| dam_analysis.DamAnalysis.project_parameters |
◆ save_final_mechanical_variables
| dam_analysis.DamAnalysis.save_final_mechanical_variables |
◆ save_final_thermal_variables
| dam_analysis.DamAnalysis.save_final_thermal_variables |
◆ save_intermediate_mechanical_variables
| dam_analysis.DamAnalysis.save_intermediate_mechanical_variables |
◆ save_intermediate_thermal_variables
| dam_analysis.DamAnalysis.save_intermediate_thermal_variables |
◆ save_intermediate_variables_step
| dam_analysis.DamAnalysis.save_intermediate_variables_step |
◆ save_utility
| dam_analysis.DamAnalysis.save_utility |
◆ self_weight_model_part
| dam_analysis.DamAnalysis.self_weight_model_part |
Creating Selfweight model part -----------------------------------------------------------—.
◆ solver
| dam_analysis.DamAnalysis.solver |
◆ start_time
| dam_analysis.DamAnalysis.start_time |
◆ streamline_utility
| dam_analysis.DamAnalysis.streamline_utility |
◆ time
| dam_analysis.DamAnalysis.time |
◆ time_scale
| dam_analysis.DamAnalysis.time_scale |
◆ time_unit_converter
| dam_analysis.DamAnalysis.time_unit_converter |
◆ tol
| dam_analysis.DamAnalysis.tol |
◆ transfer_utility
| dam_analysis.DamAnalysis.transfer_utility |
Construct the solver for selfweight problem ----------------------------------------------—.
Kratos Selfweight Model ------------------------------------------------------------------— DamSelfWeightModel = KratosMultiphysics.Model() DamSelfWeightModel.AddModelPart(self.self_weight_model_part)
Initialize -------------------------------------------------------------------------------—
◆ type_of_results
| dam_analysis.DamAnalysis.type_of_results |
Initialize Mapping Variables Utility.
◆ use_streamline_utility
| dam_analysis.DamAnalysis.use_streamline_utility |
◆ UseStreamlineUtility
| dam_analysis.DamAnalysis.UseStreamlineUtility |
The documentation for this class was generated from the following file:
- /home/runner/work/Documentation/Documentation/master/applications/DamApplication/python_scripts/dam_analysis.py


Abstract: Portfolio for an Art Director and Manager. Focus on online media, branding and print.
AIM Games
NS broadband I
NS broadband II
Netscape ISP
NS user icons
Navigator
NS broadband I
Sports Illustrated
Apple
AIM
Browser 8.0 ads
NS broadband II
NS channels
NS portal 2003
NS portal 2005
IBM brochure
Young Isaac
Columbus
Museum of Art
Digital marquetry
screen
Kips Bay cabinet
Kips Bay doors
Wall hanging
Invitation
Photography
This site requires that JavaScript be enabled for full function.


@*
* Copyright 2023 HM Revenue & Customs
*
* 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.
*@
@import uk.gov.hmrc.platformstatusfrontend.controllers.CodeRequest
@import views.html.helper.CSRF
@this(
layout: Layout
)
@(
codeForm: Form[CodeRequest]
)(implicit
request : Request[_],
messages : Messages,
flash : Flash
)
@layout(pageTitle = Some("Generate specific response codes")) {
@flash.get("success").getOrElse("Player 1, choose your response code...")


Specifies subjects for a constrained classification of content topics.
This cell can be empty in the topicSubjectHeader element but must identify the classified topics within the topicSubjectRow element.
Within the topicSubjectHeader element, the subjectCell element specifies a constraint on the classifying subjects in the column. For a facet classification, the subjectCell element specifies the top subject for a facet category.
Within the topicSubjectRow element, the subjectCell element specifies the subjects that classify the content topics in the topicCell element within the same row. If a header row specifies a constraint for the column, the subjects in the cell must conform to that constraint. For a facet classification, the subjects must appear within the hierarchy for the facet category in a scheme.
Use the topicsubject element if the subject is the primary subject for the content topics. Otherwise, use the subjectref element.
( (topicsubject) (optional) then (subjectref) (any number))


When I was a small boy, my father told
me never to recommend a church or a woman
to anyone. And I have found it wise never to
recommend a restaurant either Something
always goes wrong with the cheese soufflé
There is Something profoundly satifying
about sharing a meal. Eating together,
breaking bread together, is one of the
oldest and the most fundermentally unifying of
human experiences.
Hot Deals
SPECIAL COMBO PACK
Burger Pizz
Fries & Drinks
There is something profoundly satisfying about sharing a meal. Eating together, breaking bread together, is one of the oldest and most fundamental unifying of human experiences.
Contact Us
There is something profoundly satisfying
about sharinga meal.Eating together,
breaking bread together, is one of the
oldest and most fundamental unifying of
human
experiences.


This task was to create a webpage that took data from a JSON file and output that data in a nice format, limiting what data was output by the user search.


sealed class Withdraw : GrapheneObject
Echo sidechain base withdraw model
Author
Dmitriy Bushuev
BtcWithdraw |
Describes single btc withdraw model class BtcWithdraw : Withdraw |
EthWithdraw |
Describes single ethereum withdraw model class EthWithdraw : Withdraw |
Undefined |
Currently undefined withdraw type class Undefined : Withdraw |
account |
val account: String |
isApproved |
val isApproved: Boolean |
value |
val value: String |


NSS IIT Patna
Home
Get Involved
About Us
FAQs
Magazine 2k18-19
Rules & Policies
Units
Adhyayan
Technical Skills
Rural Development
Chetna
Teaching
Environment
Prayatna
Our Team
Prayatna
Events
Gallery
Think Thank
Check Hours
Blood Request


AI Powered
Artificial Intelligence powered systems, helpline bots.
Ethical Dialer
Nobody likes spam, even spammers do ignore unwanted call and sms!
Freight Forwarding
Freight documentation and accounting for Ocean Freight and Air Freight.
Mechanical Systems
Cooling load calculation, Fire safety system design and CFD.


Xiaomi launches the low-cost Mi Band 3i fitness tracker in India
by Sudhanshu SinghXiaomi launches the low-cost Mi Band 3i fitness tracker in India
A good option for first-time fitness band users
Chinese tech giant Xiaomi has launched the Mi Band 3i, a successor to Mi Band HRX, in India. It will be available for pre-order on Mi.com starting November 21 for Rs 1,299.
The company emphasizes that its latest affordable fitness band is made specifically for the Indian market. Xiaomi also launched its most recent Mi Band 4 in the country a couple of months ago, priced at Rs 2,299. The new addition to Xiaomi's current wearable portfolio in India will give another option to buyers looking for a more affordable alternative.
It will further strengthen Xiaomi's position in the wearable segment in India, as it's currently the number one wearable company in the country. As per Canalys Wearable Band Analysis, Aug 2019, Xiaomi holds the number one spot with 39% market share in the segment.
Mi Band 3i features
It comes with several new upgrades over its predecessor, Mi Band HRX. The display size is increased from 1.2cm to 1.9cm, with AMOLED technology and touch support added on top.
While the Mi Band 3i retains basic metric tracking like steps and calories, it also introduces notification viewing on the band. It also features the "Find Device" option, which allows users to detect the paired smartphone directly from the band. Mi Smart Band 3i is water-resistant up to 5ATM (50 meters in depth for 10 minutes), letting users wear it while swimming or taking a shower.
The Mi Band 3i has a 110mAh battery, a significant increase over its predecessor's 70mAh cell. Xiaomi claims up to 20 days of usage, which has been a constant on the previously launched Mi Band devices.


Kongming's Blog
Le vent se lève, il faut tenter de vivreHello, my name is Junwei Zhuge, Master Candidate in University of Pittsburgh, majored in Information Science, Big Data track.
❦ Coding, Traveling, Workout. ❦ C++, Swift, Web development.
Hello, my name is Junwei Zhuge, Master Candidate in University of Pittsburgh, majored in Information Science, Big Data track.
❦ Coding, Traveling, Workout. ❦ C++, Swift, Web development.


Tweet
Follow @jcukier
contact me


vignettes/V_magnitude_phenometrics.Rmd
V_magnitude_phenometrics.Rmd
Magnitude Phenometrics are a suite of eight metrics derived from Status and Intensity data. This data type provides information on the extent to which a phenophase is expressed across multiple individuals or sites, for a given set of sequential time intervals. The data user may select a weekly, bi-weekly, monthly, or custom time interval to summarize the metrics. Two metrics are available for both plants and animals, one metric is available for plants alone and five metrics are available for animals alone (table 1). Three of the five animal metrics correct animal abundance values for observer effort in time and space.
Here’s an example of how to query for Magnitude Phenometrics, for the active individuals phenophase for black-capped chickadee data, in 2018. Requirements are similar to other data types. You must additionally specify the time interval by which the data should be summarized. Typically this is weekly, biweekly or monthly, as in the POP and Visualization Tool. The interval chosen in this example is 7 days.
npn_download_magnitude_phenometrics(
request_source = 'Your Name Here',
years = '2018',
period_frequency = "7",
species_ids = '245',
phenophase_ids = '292',
download_path = 'MPM_BCC_ActInd_2018.csv'
)
In this example we’re able to see all of the magnitude phenometric fields, including proportion_yes_records, and mean_num_animals_in-phase. See the Open File Report on USA-NPN Observational Data for full field descriptions.
From this dataset we can view the Proportion_Yes_Records (of all the records submitted on this species, what proportion are positive/yes records) by weekly interval:
BCC_AI<-read.csv(
'MPM_BCC_ActInd_2018.csv',
header = TRUE,
na=-9999,
stringsAsFactors = FALSE
)
plot(
BCC_AI$proportion_yes_record~as.Date(BCC_AI$start_date,"%Y-%m-%d"),
ylab=c("Proportion Yes Records"),
xlab=c("Date"),
cex=2,
cex.axis=1.5,
cex.lab=1.5,
pch=21,
xlim=as.Date(c("2018-01-01", "2018-08-01")),
ylim=c(0,1)
)


Filtering the data
Click the
Filters tab to apply filters to the database
You can apply filters on meta informations such as precipitation, temperature, age uncertainty, etc. by interacting with the charts. All charts are linked together so that filters applied in one chart will update the others, as well as the map.
Some meta data is filtered by menus. Simply select the entry in the menu to apply a filter.
To cancel a filter, click on "reset".
Navigating the map
You can view information about a sample (name, site, position, etc.) when you click on one of the markers. If you hover over it with your mouse, the sample will also be highlighted in bold text in the
Meta data table tab.
When several proxies share the same location, they are grouped together in a cluster (colored circles).
Click on a cluster to display all the proxies it contains.
Red clusters represent more than 100 proxies, yellow clusters contain more than 10, and all others are green.
Accessing the sample Data
When you click on a sample in the map, you can see the pollen percentages in the
Pollen diagram tab below it.
Additionally, you can see a diagram of Precipitation and Temperature based on the data from
WorldClim in the
Climate diagram tab.
You can select samples through the
button. Either use the popup or the checkbox in the
Meta data table to select a single sample, or use the button below the map to select all currently selected samples.
To download the data, as a tab-separated file, use the
button.


GLM_GTC_double_float extension: Add support for double precision floating-point types. More...
Typedefs | |
| typedef detail::tmat2x2< float > | fmat2 |
| 2 * 2 matrix of single-precision floating-point numbers. | |
| typedef detail::tmat3x3< float > | fmat3 |
| 3 * 3 matrix of single-precision floating-point numbers. | |
| typedef detail::tmat4x4< float > | fmat4 |
| 4 * 4 matrix of single-precision floating-point numbers. | |
| typedef detail::tvec2< float > | fvec2 |
| Vector of 2 single-precision floating-point numbers. | |
| typedef detail::tvec3< float > | fvec3 |
| Vector of 3 single-precision floating-point numbers. | |
| typedef detail::tvec4< float > | fvec4 |
| Vector of 4 single-precision floating-point numbers. |
GLM_GTC_double_float extension: Add support for double precision floating-point types.
| typedef detail::tmat2x2<float> fmat2 |
2 * 2 matrix of single-precision floating-point numbers.
From GLM_GTC_double_float extension.
Definition at line 45 of file double_float.hpp.
| typedef detail::tmat3x3<float> fmat3 |
3 * 3 matrix of single-precision floating-point numbers.
From GLM_GTC_double_float extension.
Definition at line 49 of file double_float.hpp.
| typedef detail::tmat4x4<float> fmat4 |
4 * 4 matrix of single-precision floating-point numbers.
From GLM_GTC_double_float extension.
Definition at line 53 of file double_float.hpp.
| typedef detail::tvec2<float> fvec2 |
Vector of 2 single-precision floating-point numbers.
From GLM_GTC_double_float extension.
Definition at line 33 of file double_float.hpp.
| typedef detail::tvec3<float> fvec3 |
Vector of 3 single-precision floating-point numbers.
From GLM_GTC_double_float extension.
Definition at line 37 of file double_float.hpp.
| typedef detail::tvec4<float> fvec4 |
Vector of 4 single-precision floating-point numbers.
From GLM_GTC_double_float extension.
Definition at line 41 of file double_float.hpp.


Tournament
Download
Action
Participants
Number
Name
Country
Club
Seed
Pool
— no pool —
remove
— Add participant —
Pool Phase
Pools
Generate pools
×
Pool generation parameters
Participants of this tournament are added to a number of pools
Pool count
pool
999
name
×
Pool X
Nr
Name
Country
Club
999
name
Fights
fight
unscheduled
999
name
Preliminaries
Add round
Generate round
fight
unscheduled
999
name
Elimination Phase
Generate
Top 2 per pool
Top 2 per pool
Top 2 per pool
Top 2 per pool
Top 2 per pool
fight
unscheduled
999
name
Finals
fight
unscheduled
999
name
Participants
999
Pool Phase
Pools
Fights
Preliminaries
Elimination Phase
Finals


A powerful search tool that lets singles filter according to what matters
Based on your interests, we make sure that you find what you need. If you already know who you want to meet, you can find them using their nicknames.
Based on your interests, we make sure that you find what you need. If you already know who you want to meet, you can find them using their nicknames.


Oct 27, 2011
Android Fragmentation - Visualized
This blog post (and graphic) drives home the how manufacturers are not updating Android frequently (my Top 10 peeve with the platform). A few of the stats really jump out at me:
- 10 of 18 were at least two major versions behind well within their two year contract period.
- 15 of 18 don’t run Gingerbread, which shipped in December 2010.
Check out Android Orphans blog post to get all the information.
Oct 6, 2011
Thank you, Steve
Thank you, Steve for inspiring me to create technology that “just works”
Thank you, Steve for proving to me that technology doesn’t have to be clunky, messy and awkward
Thank you, Steve for helping me appreciate beautiful design
You sure put a ding in the universe. I promise to Stay Hungry and Stay Foolish.
RIP
Aug 20, 2011
Know Thy Mobile User
Knowing your users and the context in which they are using your app is a key aspect of developing useful and user-engaged mobile apps. This is especially important in a fragmented market (and a recurring theme in the frustrations of developers). The Hunch Blog has some interesting stats on broad demographics and patterns of iOS and Android users.
 (They are 50% more likely to have visited more than five countries and 55% more likely to have used their frequent flyer miles).
Takeaway: Optimize your app for slower data connections and Be sure to test your app in “Airplane mode”.
-
Stat: iOS users are 26% more likely to prefer spending their money and Android users are 29% more likely to prefer saving their money .
Takeaway: Charge for your iOS apps :-) even if it is just 99 cents
-
**Stat: **iOS Users are early adopters, 50% more likely to first use the Internet before ‘92 and 67% more likely to back up their computer constantly.
**Takeaway: **This is further confirmation that iCloud is going to have a lot of potential. You start with a user base that backs up constantly and then give them a very easy way for their data to be available everywhere. If you have iOS apps and weren’t already considering iCloud, you should.
Other Interesting stats:
* Android users are 10% more likely to be men and iOS users are 10% more likely to be women.
* iOS users are 50% more likely to text while driving. (Seriously!)
* Android users are 50% more likely to use Yahoo! Mail. (Maybe this bodes well for Yahoo’s upcoming Android phone)
As with any other broad based demographics, analyze it in the context of your users and be sure not to confuse correlation with causation.
Aug 15, 2011
Google Buys Motorola Mobility - This is good for users and product managers alike
Google just announced that it is acquiring Motorola Mobility (reportedly for $12.5 billion). This could be really good news for the end-to-end user experience in the Android platform. Google is also committing to keep the Android platform open. To quote the blog post :
> This acquisition will not change our commitment to run Android as an open platform. Motorola will remain a licensee of Android and Android will remain open. We will run Motorola as a separate business.
>
>
I see this as Google taking a cautious step in the right direction in the whole debate on “Open” vs “Integrated”. It’d be great if Google can find the perfect balance, but if it can’t, I’d much rather it move towards Integrated rather than staying open.The mobile (and tablet) industry is converging on a single playbook for succeeding in the post-PC era. It involves hardware and software from the same vendor, providing a rich user experience. This is the third of the marriages of hardware + software vendor, following RIM’s purchase of QNX, HP’s purchase of Palm for WebOS.
This is really good news for users and developers alike. The one recurring theme in the Top 10 things that I hate about Android was fragmentation. Assuming that Google provides a strong baseline implementation, this will force other manufacturers to follow suit otherwise, over time, only Google’s phone will be selling.
This could also mean that Xoom 2 (or 3), might be a good viable alternative to iPad 2. Right now, it doesn’t even come close, but with a converged OS for mobile and tablet (Ice-cream sandwich), and hardware from the same vendor, and with Android’s reach, we might very well be looking at 2012 as the year of the iPad competitor.
Good luck Google!
Aug 11, 2011
A Product Manager's nightmares with the Android Platform
My observations on the pain points of developing for the Android platform, and suggested workarounds for those pain points are published today in TechRepublic. To summarize a few key points :
-
Fragmentation is a nightmare and makes Android development a lot more complicated than it should be.
-
There should be broad based agreements on what manufacturers and carriers can and cannot do to the platform, and the ecosystem should work together to provide a good, solid baseline that all developers can take or granted. It is in the best interest of the platform
-
Google should act as a “good cop” in helping the platform as it matures.
-
Patent related issues (aka “The Pink Elephant in the room”) need to be addressed sooner than later.
You can read the entire blog post at TechRepublic
And finally, I’d like to leave you with an image (From Engadget) that I think captures the gist of all things wrong about the platform. Think about it!


France's 5G spectrum to be sold at floor price of €2.17bn
Ministry at odds with telco regulator.
by Mathieu RosemainFrances’s 5G spectrum will be sold at a floor price of €2.17 billion (A$3.5 billion), a minister said on Sunday, significantly more than the amount previously recommended by the country’s telecoms regulator Arcep.
Wary of the heavy investments needed for the deployment of the new mobile technology, Arcep’s president Sébastien Soriano said earlier this week that the minimum price for the sale of the spectrum should not be higher than €1.5 billion.
France’s economy ministry has the final word on the floor price for sale.
“The floor (price) that we’re proposing seems reasonable to us,” Junior Economy Minister Agnès Pannier-Runacher told French newspaper Les Echos.
“It’s up to the government to assume its responsibilities and decide.”
Arcep kicked off the long-awaited sale of 5G spectrum on Thursday, ending months of intense debate between the country’s four telecoms operators and authorities on how to best deploy the new mobile technology.
Disagreements between the finance ministry and the telecoms authority over the spectrum to be auctioned and the minimum price for the 5G frequency blocs postponed the process, two sources close to the matter told Reuters this week.
For French authorities, the key issue is to find the right balance between raising cash from the sale and avoiding putting an excessive financial burden on telecoms operators so that they deploy the pricy technology fast.
Germany and Italy have raised about €6.5 billion each through 5G spectrum auctions, an amount that shocked the industry and raised concerns among the four French telecoms operators — Orange, Altice Europe’s SFR, Iliad and Bouygues Telecoms — whose margins are already suffering from a protracted price war.


Internal Server Error (HTTP 500)
{{ if [error_for_error] }}
Error page for error page
An error occurred on the server during the processing of your request
Additionally, another error was encountered while trying to render a helpful error page. Below are both the error we encountered, and the original one we tried to tell you about.
{{ else }}
An error occurred on the server during the processing of your request
Here's what we know went wrong, though we still have to figure out why:
{{ endif }}
[exc:type]
[exc:value]
Traceback (most recent call first)
{{ for frame in [exc:traceback] }}
-
- File: "[frame:file]"
- Scope: [frame:scope]
-
| Source code |
{{ for filename, line_no in [frame:source] }}
| [filename] | [line_no] |
{{ endfor }}
{{ if not [error_for_error] }}
-
| Frame locals |
{{ for name, value in [frame:locals|items|sorted] }}
| [name] | [value] |
{{ endfor }}
{{ endif }}
{{ endfor }}
{{ if [error_for_error] }}
Original error (that the error page broke on)
[orig_exc:type]
[orig_exc:value]
Traceback (most recent call first)
{{ for frame in [orig_exc:traceback] }}
-
- File: "[frame:file]"
- Scope: [frame:scope]
-
| Source code |
{{ for filename, line_no in [frame:source] }}
| [filename] | [line_no] |
{{ endfor }}
{{ endfor }}
{{ endif }}
Environment information
{{ if [cookies] }}
| Cookies |
{{ for name, value in [cookies|items|sorted] }}
| [name] | [value] |
{{ endfor }}
{{ endif }}
{{ if [query_args] }}
| Query arguments (GET) |
{{ for name, value in [query_args|items|sorted] }}
| [name] | [value] |
{{ endfor }}
{{ endif }}
{{ if [post_data] }}
| POST data |
{{ for name, value in [post_data|items|sorted] }}
| [name] | [value] |
{{ endfor }}
{{ endif }}
{{ if [environ] }}
| Full environment |
{{ for name, value in [environ|items|sorted] }}
| [name] | [value] |
{{ endfor }}
{{ endif }}


Copyright (c) 2002 Walter Joris
This game is played on a 6x6 board with the following setup:
|
| An example
An ended game. The marked stones are those in the hole. White won by a 6-1 score. |
This game can be player with just pencil and paper. It is presented at 100 Strategic Games for Pen and Paper by Walter Joris.


ECN says EVMs can produce a paper trail to show total votes cast
The ECN says electronic voter machines (EVMs) can produce a paper trail, to show how votes were cast to both Presidential and National Assembly elections.
Its chief elections and referenda officer Theo Mujoro said this when he addressed the SADC Election Observer Mission on the transparency of the EVMs, in the absence of the voter verifiable paper audit trail (VVPAT).


## peter mcbreen ### addison-wesley, 2002
summary
the whole book is about turning away from the engineer approach, and towards the craftsmanship approach, by putting the emphasis on people. this provides a useful framework for the purpose of beautiful code. it’s not just understanding in order to maintain but understanding in order to learn.
the book proposes to rethink software development from engineering to craftsmanship, moving from a focus on formal processes to a focus on people. the highlight of craftmanship asks the same question as sennett: knowledge transmission.
Howard Baetjer sees the key challenge of software development as coordinating distributed learning and the key limitation as “our sheer ability to understand what it is we’re trying to do” -> again, it is about TRANSMITTING UNCERTAIN KNOWLEDGE (learning, communication, negotiation process). and craftsmanship implies aesthetics
historical shift from programming the computer (focusing on the machine), to programming for people
“software engineers use Ada, craftsmen use C”
all the pragmatic programmer, elements of programming style, psychology of programming books attempt at creating a tradition of software craftsmanship
claim that craftsmanship is personal in the work process, but collective in the work result
“make sure you understand the problem, then look long and hard for a solution, then test that solution on a small-scale first -> software craftsmanship builds systems that can be understood (again, claim)
trained technicians follow the book, master craftsmen ask lots of questions and then deliver what you really need (as opposed to what you asked for)
learning software development is different from learning how to program: it happens by trial and error, different from what they teach at schools (which is teaching sth out of its context)


Why the Algerian Government Doesn't Want You to See the Country's Oscar Entry 'Papicha'
TheWrap Oscar magazine: Director Mounia Meddour says the government’s cancellation of screenings stemmed from the film’s time period, subject matter and a statement the cast and crew made in Cannes
by Steve PondThis story first appeared in the International Film edition of TheWrap’s Oscar magazine.
Only a few days before Mounia Meddour’s film “Papicha” was due to debut in Algeria, the government canceled all screenings of the movie, which deals with a group of young women in the early 1990s living through the country’s civil war and the rise of fundamentalist Islam.
The move could have disqualified “Papicha” from the Oscar race even though it was Algeria’s official submission in the Best International Feature Film category, but the Academy granted the film a waiver because its filmmakers had no control over the government’s action. (Oscar entries are chosen by independent bodies of film professionals in each country, not by politicians.)
Meddour addressed the controversy — and the challenges of making his film.
Did the government ever give you a reason why your film cannot be shown in Algeria?
No. But there is an election coming up, and I think they are worried. The film is set in 1991, during the Civil War — that was a very bad time, and I think they do not want us to be telling stories about it. Also, when we went to Cannes, the actresses and I wore buttons on our dresses that said we stood with the Algerian people. Why would we not stand with the people of Algeria? But I think the government noticed that and did not like it.
And it is a film about how women were treated, which is a subject I am sure they do not like.
Also Read:
Why was it important to you to make a film about that time and that subject?
It was very personal to me. I grew up in Algeria, and I lived at the university like the girls in the film. And there was one year when we could not go to school because the situation was bad. I stayed home and made clothes like Nedjma, the girl in the movie, and sold them at a very small shop near me. It was a small town, and I could walk down the street and think, “She is wearing my clothes. And she is wearing them. And she is wearing them.”
What were the particular challenges of this film?
We had to shoot it in only five weeks. We only had €1 million. That is very, very, very small, and not enough money for a longer shooting schedule. I sometimes said, “We don’t have time to shoot coverage or wide shots. We’ll shoot close-ups only.”
It was also hard because we shot during Ramadan, and the Algerian actors and crew could not eat from sunrise to sunset. We had two different areas, one for the French and Belgian crew, where we could serve lunch, and one for Algerians, who could only take naps during the lunch break. But a lot of the Algerians forgot about religion and came to the French and Belgian side to eat.
Read more from the International Film edition of TheWrap’s Oscar magazine.
The South Korean auteur joins stars Song Kang-ho and Park So-dam for an interview and photo session
View In Gallery


Steve Harris
Open Market, Inc.
7 May 1996
Java is an object-oriented programming language developed by Sun Microsystems. The Java Depvelopers Kit (JDK), which contains the basic Java class packages, is available from Sun in both source and binary forms at Sun's JavaSoft site. This document assumes that you have some familiarity with the basics of compiling and running Java programs.
There are two kinds of applications built using Java.
The initial emphasis on using Java for client side applets should not obscure the fact that Java is a full strength programming language which can be used to develop server side stand alone applications, including CGI and now FastCGI applications.
The remainder of this document explains how to write and run FastCGI Java applications. It also illustrates the conversion of a sample Java CGI program to a FastCGI program.
Writing a FastCGI application in Java is as simple as writing one in C.
On return from FCGIaccept() you can access the request's environment variables using System.getProperty and perform request-related I/O through the standard variables System.in, System.out, and System.err.
To illustrate these points, the kit includes examples/TinyCGI, a CGI Java application, and examples/TinyFCGI, the FastCGI version of TinyCGI. These programs perform the same functions as the C programs examples/tiny-cgi.c and examples/tiny-fcgi.c that are used as examples in the FastCGI Developer's Kit document.
class TinyCGI { public static void main (String args[]) { int count = 0; ++count; System.out.println("Content-type: text/html\n\n"); System.out.println(""); System.out.println( "<TITLE>CGI Hello</TITLE>"); System.out.println(""); System.out.println("
CGI-Hello
"); System.out.println("request number " + count + " running on host " + System.getProperty<"SERVER_NAME")); System.out.println(""); System.out.println(""); } }
import FCGIInterface; class TinyFCGI { public static void main (String args[]) { int count = 0; while(new FCGIInterface().FCGIaccept()>= 0) { count ++; System.out.println("Content-type: text/html\n\n"); System.out.println(""); System.out.println( "<TITLE>FastCGI-Hello Java stdio</TITLE>"); System.out.println(""); System.out.println("
FastCGI-HelloJava stdio
"); System.out.println("request number " + count + " running on host " + System.getProperty<"SERVER_NAME")); System.out.println(""); System.out.println(""); } } }
We assume that you have downloaded the JDK and the FastCGI Developer's Kit, and that you have a Web server running that can access the fcgi-devel-kit/examples directory. In all cases where we specify paths, we are using relative paths within fcgi-devel-kit or the JDK which will need to be enlarged to a full path by the user.
Due to gaps in the Java interpreter's support for listening sockets, Java FastCGI applications are currently limited to being started as external applications. They can't be started and managed by the Web server because they are incapable of using a listening socket that the Web server creates.
As we have seen above, FastCGI for Java offers a redefinition of standard I/O corresponding to the the fcgi_stdio functionality. It also offers a set of directly callable I/O methods corresponding to the fcgiapp C library. To understand where these methods occur we need to look briefly at the FastCGI redefinition of standard I/O.
Java defines standard I/O in the java.System class as follows:
public static InputStream in = new BufferedInputStream(new FileInputStream(FileDescriptor.in), 128);
public static PrintStream out = new PrintStream(new BufferedOutputStream(new
FileOutputStream(FileDescriptor.out), 128), true);
public static PrintStream err = new PrintStream(new BufferedOutputStream(new
FileOutputStream(FileDescriptor.err), 128), true);
The File Descriptors in, out, err are constants set to 0, 1 and 2 respectively.
The FastCGI interface redefines java.System in, out, and err by replacing the File streams with Socket streams and inserting streams which know how to manage the FastCGI protocol between the Socket streams and the Buffered streams in the above definitions.
For those cases where the FCGI application needs to bypass the standard I/O streams, it can directly access the methods of the FCGI input and output streams which roughly correspond to the functions in the C fcgiapp library. These streams can be accessed via the request class variable in FCGIInterface. Each Request object has instance variables that refer to an FCGIInputStream, and to two FCGIOutputStreams associated with that request.
Java does not use the C environ list. Nor is there a getenv command that reads system environment variables. This is intentional for reasons of portability and security. Java has an internal dictionary of properties which belongs to the System class. These System properties are name/value associations that constitute the Java environment. When a Java application starts up, it reads in a file with default properties. As we have seen, additional System properties may be inserted by using the -D Java command argument.
For CGI, where the Java application is invoked from a .cgi script that, in turn, invokes the Java interpreter, this script could read the environment and pass the variables to the Java application either by writing a file or by creating -D options on the fly. Both of these methods are somewhat awkward.
For FastCGI Java applications, the environment variables are obtained from the FastCGI web server via FCGI_PARAMS records that are sent to the application at the start of each request. The FastCGI interface stores the original startup properties, combines these with the properties obtained from the server, and puts the new set of properties in the System properties dictionary. The only parameter that has to be specifically added at startup time is the FCGI_PORT parameter for the Socket creation. In the future, we expect that even this parameter won't be needed, since its use is due to an acknowledged rigidity in the JDK's implementation of sockets.
The next two examples illustrate the points made in the last two sections. EchoFCGI and Echo2FCGI both echo user input and display the application's environment variables. EchoFCGI reads the user input from System.in, while Echo2FCGI reads the user input directly from the intermediate FastCGI input stream.
import FCGIInterface; import FCGIGlobalDefs; import java.io.*; class EchoFCGI { public static void main (String args[]) { int status = 0; while(new FCGIInterface().FCGIaccept()>= 0) { System.out.println("Content-type: text/html\n\n"); System.out.println(""); System.out.println( "<head%gt;<TITLE>FastCGI echo </TITLE>"); System.out.println(""); System.out.println( "
FastCGI echo
"); System.out.println("
STDIN
"); for ( int c = 0; c != -1; ) { try { c = System.in.read(); } catch(IOException e) { System.out.println( "
SYSTEM EXCEPTION"); Runtime rt = Runtime.getRuntime(); rt.exit(status); } if (c != -1) { System.out.print((char)c); } } System.out.println( "
Environment Variables:
"); System.getProperties().list(System.out); System.out.println(""); System.out.println(""); } } }
import FCGIInterface; import FCGIGlobalDefs; import FCGIInputStream; import FCGIOutputStream; import FCGIMessage; import FCGIRequest; import java.io.*; class Echo2FCGI { public static void main (String args[]) { int status = 0; FCGIInterface intf = new FCGIInterface(); while(intf.FCGIaccept()>= 0) { System.out.println("Content-type: text/html\n\n"); System.out.println(""); System.out.println( "<TITLE>FastCGI echo </TITLE>"); System.out.println(""); System.out.println("
FastCGI echo
"); System.out.println("
STDIN:
); for ( int c = 0; c != -1; ) { try { c = intf.request.inStream.read(); } catch(IOException e) { System.out.println( "
SYSTEM EXCEPTION"); Runtime rt = Runtime.getRuntime(); rt.exit(status); } if (c != -1) { System.out.print((char)c); } } System.out.println( "
Environment Variables:
"); System.getProperties().list(System.out); System.out.println(<"/body>"); System.out.println(""); } } }
As with TinyFCGI, you need to configure the web server to recognize these two FastCGI applications. Your configuration now looks like this:
ExternalAppClass java1 -host hostname:portNum Responder java1 fcgi-devel-kit/examples/TinyFCGI ExternalAppClass java2 -host hostname:portNumA Responder java2 fcgi-devel-kit/examples/EchoFCGI ExternalAppClass java3 -host hostname:porNumB Responder java3 fcgi-devel-kit/examples/Echo2FCGI
Note that the application classes and port numbers are different for each application.
As with TinyFCGI, you need to run these programs with the -D option using FCGI_PORT and the appropriate port number. To get some data for standard input we have created two html pages with forms that use a POST method. These are echo.html and echo2.html. You must edit these .html files to expand the path to fcgi-devel-kit/examples to a full path. Once the appropriate Java program is running, point your browser at the corresponding HTML page, enter some data and select the go_find button.
The Java FastCGI classes are included in both source and byte code format in fcgi-devel-kit/java/src and :fcgi-devel-kit/java/classes respectively. The following is a brief description of these classes:


The NPath complexity of a method is the number of acyclic execution paths through that method. A threshold of 200 is generally considered the point where measures should be taken to reduce complexity. Example :
public class Foo { void bar() { // lots of complicated code } }