|
BA Point Cloud Renderer
1.6
Unity Rendering System for Large Point Clouds
|
Resembles a node of the nested octree. More...
Public Member Functions | |
| Node (string name, PointCloudMetaData metaData, BoundingBox boundingBox, Node parent) | |
| Creates a new node object. More... | |
| int | GetLevel () |
| Returns how deep in the tree this node is. 0 means it is the root node, 1 means it is a child of the root node and so on... More... | |
| void | CreateGameObjects (MeshConfiguration configuration, Transform parent) |
| Creates the Game Object(s) containing the points of this node. Vertices and Colors have to be set before calling this function (via SetPoints)! This function has to be called from the main thread! More... | |
| GameObject | CreateBoundingBoxGameObject () |
| Creates a transparent box game object with the shape of the bounding box of this node. The color is determined by the hashcode of this node. Used for debugging purposes only. More... | |
| void | CreateAllGameObjects (MeshConfiguration configuration, Transform parent) |
| Creates GameObjects for this node and all its (grand-)children. Useable for displaying a whole point cloud at once. Vertices and Colors have to be set before calling this function (via SetPoints) for this object and all its children! This function has to be called from the main thread! More... | |
| void | RemoveGameObjects (MeshConfiguration config) |
| Removes the GameObjects of this node. Has to be called from the main thread. More... | |
| void | RemoveAllGameObjects (MeshConfiguration configuration) |
| Removes the GameObjects of this node and all it's children. Has to be called from the main thread. More... | |
| void | DeactivateGameObjects () |
| Deactivates the GameObjects of this node. Has to be called from the main thread. More... | |
| void | DeactivateAllGameObjects () |
| Deactivates the GameObjects of this node and of all its children. Has to be called from the main thread. More... | |
| void | ReactivateGameObjects () |
| Reactivates the GameObjects of this node. Has to be called from the main thread. More... | |
| void | ReactivateAllGameObjects () |
| Deactivates the GameObjects of this node and of all its children. Has to be called from the main thread. More... | |
| void | SetPoints (Vector3[] vertices, Color[] colors) |
| Sets the point data. Throws an exception if gameobjects already exist or vertices or colors are null or their length do not match. Also sets the point count. More... | |
| void | ForgetPoints () |
| Deletes the loaded vertex- and color-information (to release the used memory). The point count stays saved however. More... | |
| bool | HasPointsToRender () |
| Returns true, iff vertices and colors are set More... | |
| bool | HasGameObjects () |
| Returns true, iff this object has GameObjects. More... | |
| void | SetChild (int index, Node node) |
| Sets the child with the given index More... | |
| Node | GetChild (int index) |
| Returns the child at the given index More... | |
| bool | HasChild (int index) |
| Returns true, iff the node has a child at the given index. More... | |
| IEnumerator< Node > | GetEnumerator () |
| Returns an enumerator with which it is possible to enumerate through the children of the node (not including null-values) More... | |
| override string | ToString () |
| Returns a string representation of the Node (for example "Node: r123") More... | |
Properties | |
| Vector3 [] | VerticesToStore [get] |
| Color [] | ColorsToStore [get] |
| string | Name [get] |
| The name of the node, which is the path of the node in the tree. For example "023" for the forth child of the third child of the first child of the root node. (readonly) More... | |
| BoundingBox | BoundingBox [get] |
| The BoundingBox of the node (readonly) More... | |
| Node | Parent [get, set] |
| The parent of this node (may be null, if this is a root node) More... | |
| int | PointCount [get] |
| Number of points given the last time SetPoints was called. Or -1 if it hasn't been called yet More... | |
| PointCloudMetaData | MetaData [get] |
| The metadata identifying which pointcloud this node belongs to More... | |
Resembles a node of the nested octree.
|
inline |
Creates a new node object.
| name | The path of the node in the tree. For example "023" for the forth child of the third child of the first child of the root node. |
| metaData | The meta data of the point cloud, to identify which cloud this node belongs to. |
| boundingBox | The bounding box of this node. |
| parent | The parent node. May be null if this is the root node. |
|
inline |
Creates GameObjects for this node and all its (grand-)children. Useable for displaying a whole point cloud at once. Vertices and Colors have to be set before calling this function (via SetPoints) for this object and all its children! This function has to be called from the main thread!
| configuration | The MeshConfiguration which should be used for creating the Game Objects |
|
inline |
Creates a transparent box game object with the shape of the bounding box of this node. The color is determined by the hashcode of this node. Used for debugging purposes only.
|
inline |
Creates the Game Object(s) containing the points of this node. Vertices and Colors have to be set before calling this function (via SetPoints)! This function has to be called from the main thread!
| configuration | The MeshConfiguration which should be used for creating the Game Objects |
|
inline |
Deactivates the GameObjects of this node and of all its children. Has to be called from the main thread.
|
inline |
Deactivates the GameObjects of this node. Has to be called from the main thread.
|
inline |
Deletes the loaded vertex- and color-information (to release the used memory). The point count stays saved however.
|
inline |
Returns the child at the given index
| index | 0 <= index < 8 |
|
inline |
Returns an enumerator with which it is possible to enumerate through the children of the node (not including null-values)
|
inline |
Returns how deep in the tree this node is. 0 means it is the root node, 1 means it is a child of the root node and so on...
|
inline |
Returns true, iff the node has a child at the given index.
| index | 0 <= index < 8 |
|
inline |
Returns true, iff this object has GameObjects.
|
inline |
Returns true, iff vertices and colors are set
|
inline |
Deactivates the GameObjects of this node and of all its children. Has to be called from the main thread.
|
inline |
Reactivates the GameObjects of this node. Has to be called from the main thread.
|
inline |
Removes the GameObjects of this node and all it's children. Has to be called from the main thread.
| config | The MeshConfiguration which should be used for removing the Game Objects |
|
inline |
Removes the GameObjects of this node. Has to be called from the main thread.
| config | The MeshConfiguration which should be used for removing the Game Objects |
|
inline |
Sets the child with the given index
| index | 0 <= index < 8 |
| node | Child node. |
|
inline |
Sets the point data. Throws an exception if gameobjects already exist or vertices or colors are null or their length do not match. Also sets the point count.
| vertices | Position-Data |
| colors | Color-Data (has to have the same length as vertices) |
|
inline |
Returns a string representation of the Node (for example "Node: r123")
|
get |
The BoundingBox of the node (readonly)
|
get |
The metadata identifying which pointcloud this node belongs to
|
get |
The name of the node, which is the path of the node in the tree. For example "023" for the forth child of the third child of the first child of the root node. (readonly)
|
getset |
The parent of this node (may be null, if this is a root node)
|
get |
Number of points given the last time SetPoints was called. Or -1 if it hasn't been called yet


MilestoneTG Transient Fault Handling Libraries
Much of the work in this project is derived from Microsoft's Enterrpise Library Transient Fault Handling Block and Microsoft's RestClientRuntime.
Usage
Database Operations
You can execute a command using the ReliableSqlConnection
class...
using(var cn = new ReliableSqlConnection(connectionString))
{
using(var cmd = new SqlCommand(sql))
{
cn.Open();
using(var rdr = cn.ExecuteCommand<IDataReader>(cmd))
{
...
}
}
}
...or you can use the OpenWithRetry()
and ExecuteXxxxWithRetry()
extension methods, and pass a specific RetryPolicy
...
using(var cn = new SqlConnection(connectionString))
{
using(var cmd = new SqlCommand(sql, cn))
{
cn.OpenWithRetry(connectionRetryPolicy);
using(var rdr = cmd.ExecuteReaderWithRetry(commandRetrypolicy)}
{
...
}
}
}
Using the extension methods allows you to taylor retry policies specific to a particular command.
Http Operations
var retryHandler = new RetryDelegatingHandler { InnerHandler = new HttpClientHandler() };
var httpClient = new HttpClient(retryHandler);
Idempotency
Be careful when using retries on operations that change state--ie. database INSERT, UPDATE, DELETE and Http POST, PUT, DELETE. Ensure that the operation is idempotent--the operation will yield the same result regardless of how many times it is performed. Severed connections, espectially in HTTP, can result in the request still completing. Most databases, will rollback a transaction automatically if a connection is broken prior to commit.
Entity Framework
EF6 and EF Core, provide transient retry out of the box with the SQL Server, Pomelo.EntityFrameworkCore.MySql, Npgsql.EntityFrameworkCore.PostgreSQL, and DevArt providers. MilestoneTG.TransientFaultHandling.Data.* is not needed in these scenarios.
HttpClient Packages
MilestoneTG.TransientFaultHandling.Http
Contains RetryDelegatingHandler
and supporting constructs that adds transient retry capability to the HttpClient
pipeline.
MilestoneTG.TransientFaultHandling.Http.Extensions
HttpClientBuilder extensions to support HttpClientFactory.
Database Packages
Microsoft SQL Server
MilestoneTG.TransientFaultHandling.Data.SqlServer
Supports transient fault handling for Microsoft SQL Server, including cloud provided solutions such as Azure SQL Database, AWS RDS for SQL Server.
MilestoneTG.NHibernate.TransientFaultHandling.SqlServer
NHiberate provider for Microsoft SQL Server that leverages reliable connections and commands.
MySQL (as of v2.2)
MilestoneTG.TransientFaultHandling.Data.MySql
Supports transient fault handling for most implementations of MySQL including MySQL, MariaDB, Percona MySQL, Azure Database for MySQL, AWS Aurora MySQL (including Aurora Serverless) and, AWS RDS for MySQL.
PostGreSQL (as of v2.2)
MilestoneTG.TransientFaultHandling.Data.Postgres
Supports transient fault handling for most implementations of PostreSQL including PostgreSQL, EnterpriseDB, Percona PostgreSQL, Azure Database for PostgreSQL, AWS Aurora PostgreSQL, AWS RDS for PostgreSQL, and AWS Red Shift.
Oracle (as of v3.0)
MilestoneTG.TransientFaultHandling.Data.Oracle
Supports transient fault handling for most deployments of Oracle including on premises, Azure, AWS RDS, and Oracle Cloud.
Contributing
If you wish to contribute to this project, please open an issue first to discuss the desired change/contribution.
Bugs and Feedback
For bugs, questions and discussions please use the GitHub Issues.


Update 0.4.8 | API Release
NotFood made an API, and patched a whole load of mods in the process.
API Release
Thanks to NotFood the API for Rimworld Multiplayer has finally been released with Update 0.4.8. Hopefully this will streamline the process for external mod creators to make their mods compatible with Rimworld Multiplayer.
The documentation for the multiplayer mod can be found here.
Mod Compatibility
Rimworld Multiplayer now has a separate multiplayer compatibility mod. In short, this mod is a collection of different patches for other mods to make them work with Rimworld Multiplayer. You can find a full list of which mods it patches on its github page
Feel free to submit any patches you’ve made as PRs. They’ll be reviewed and most likely added if they are functional.
Patchnotes
- Comms console fix
- Scheduled Incidents fix (Ransoms etc.)
- Full Cross OS Compatibility
- NPE fix for all assign Windows
- Removed autoclean changes to repo
- DNS Resolution
- Savedata folder command line option is passed to the Arbiter
- Major Translation Updates
The protocol version is now 17.


Are you a fan of doughnuts? Do you like supporting locally-owned businesses? Do you love stuffing your face with pastries until you can't move anymore? Then Donut Delights is the doughnut shop for you!
Doughnut Fact-of-the-Day:
Did you know that the largest doughnut ever made was an American-style jelly donut weighing 1.7 tons?


Difference between TDD and BDD
2019-06-10 23:12:00, published in Auckland
If you have any question, you can email me<EMAIL_ADDRESS>If you understand the latest software development practices, then you will often hear the terms unit test, TDD and BDD. Many Javascript developers are not very clear about these terms. This article will explain what they are and where the differences are.
Unit testing
Unit testing tends to focus on only one piece of code, usually a module or function. The test code should be simple and fast to implement and run. This also means that you will write a lot of unit test cases to ensure that the code is functioning properly. Unit tests should have no dependencies, such as requesting database data via a network request. There are many tools that can simulate Api’s response data to run test files. The basic principle of unit testing is: multiple test cases, each testing different functions and not dependent on each other. There are also some people who think that any automated test is a unit test. This is not true. There are different types of automated tests, and each type of function is different.
- Unit tests: a single code fragment test (usually a function), independent of test cases.
- Integration tests: Associate multiple test cases at the same time, such as obtaining test data through test database.
- Acceptance tests (also called Functional tests): Testing the entire application
TDD (Test-Driven Development)
TDD is a test to drive software development. It has the following five steps:
- Firstly, developers write some tests.
- Developers run these tests, but these tests will obviously fail because you didn’t implement the code details.
- Developer implementation code details
-
If the developer successfully implements the code, all tests will run through.
- Developers can refactor the code, and if the new code is not functioning correctly, the corresponding test file will also fail.
Developers can implement more requirements based on this process, as shown in the following flow chart:
For example, If the developer writes a function to calculate the factorial, then the conventional TDD mode uses this function to enter a specific value to determine if the output is correct. In this example, Mocha is used as the test framework.
var assert = require('assert'),
factorial = require('../index');
suite('Test', function (){
setup(function (){
// Create any objects that we might need
});
suite('#factorial()', function (){
test('equals 1 for sets of zero length', function (){
assert.equal(1, factorial(0));
});
test('equals 1 for sets of length one', function (){
assert.equal(1, factorial(1));
});
test('equals 2 for sets of length two', function (){
assert.equal(2, factorial(2));
});
test('equals 6 for sets of length three', function (){
assert.equal(6, factorial(3));
});
});
});
This test will definitely fail before the code is implemented. We now implement this function:
module.exports = function (n) {
if (n < 0) return NaN;
if (n === 0) return 1;
return n * factorial(n - 1);
};
Now running this test file will all pass, this is the TDD development model, now let’s see what is different about BDD.
BDD (Behavior-driven development)
Many people think that BDD is very close to TDD. Compared with TDD, BDD is based on the behavior and documentation we write to drive development. These document descriptions are very similar to our test code.
For example:
var assert = require('assert'),
factorial = require('../index');
describe('Test', function (){
before(function(){
// Stuff to do before the tests, like imports, what not
});
describe('#factorial()', function (){
it('should return 1 when given 0', function (){
factorial(0).should.equal(1);
});
it('should return 1 when given 1', function (){
factorial(1).should.equal(1);
});
it('should return 2 when given 2', function (){
factorial(2).should.equal(2);
});
it('should return 6 when given 3', function (){
factorial(3).should.equal(6);
});
});
after(function () {
// Anything after the tests have finished
});
});
The main difference is in the description of the test, BDD uses a more straightforward text to describe the test case. Although the above example is very simple, we can see that BDD pays more attention to the function of demand, rather than the actual result. BDD is more conducive to helping us design software development than TDD.
TDD and BDD
Is that good to use TDD or BDD? It depends on whether the language you are using has a suitable testing framework, and which way your colleagues prefer.


HOBBIES
Home
×
Hobbies
Listening songs
Singing
I love to play Guitar
Learn about new tech
Show content


Thanks to Fred Kelso for submitting these articles
from 1914-1930
-
NEW INDUSTRIES FORMED IN MISSISSIPPI
The Biloxi-Gulfport Daily Herald May 20, 1913
Pinehurst Hotel Company, Laurel, capitalized at $40,000; W.B.Rogers, A.A.Edwards, W.F.Rumble and others.
Click Here to see the Full Newspaper Page
back to top of page
-
MISSISSIPPI ITEMS
The Biloxi-Gulfport Daily Herald September 17, 1914
The first house ever erected in this city was destroyed Tuesday. It was a pine log affair on Maple Street,
occupied by Negroes. It was built thirty years ago, when Laurel consisted of merely a saw mill.
There were over 2,000 attendants at the opening of the city schools. The enrollment is expected to
reach 4,000. The new Pinehurst Hotel, with 100 rooms, has been completed.
Click Here to see the Full Newspaper Page
back to top of page
-
NEW HOTEL IS OPENED
The New Orleans Times-Picayune November 5, 1914
Laurel Citizens Sit At Grown-In-Mississippi Banquet
Special to The Times-Picayune
Laurel, Miss, November 4, 1914 – Nearly four hundred guests were present last evening when Hotel Pinehurst was
opened with a “grown in Mississippi” dinner, prepared and served by the ladies of the Episcopal Church under
the auspices of the Laurel Commercial Club. The dinner was arranged for competition for the handsome silver
cup by a well-known Jackson jeweler, donated through the State Department of Agriculture. The city which distances
the showing made by Laurel last evening will have to score high. The menu was excellent, consisting entirely of
edibles collected from the farms of Mississippi, and was faultlessly served. All of the 103 members of the
Commercial Club were present, and this alone counts for 30 per cent in the competition for the cup. As the
event marked the opening of Laurel’s handsome new hotel, the Pinehurst, which has just been completed at a
cost of more than $100,000, Manager Pontaine aided materially in making the event a success, and was
accorded a resolution of thanks by the Commerical Club for his interest in the affair.
Click Here to see the Full Newspaper Page
back to top of page
-
ARCHITECT CHOSEN FOR LAUREL’S NEW THEATRE
The Biloxi-Gulfport Daily Herald March 18, 1926
Laurel, Miss, March 18 – Emile Weil of New Orleans has been chosen architect for the new theatre
which will be erected at the rear of the Pinehurst Hotel, at a cost of approximately $80,000.
L.W. Duffee of Laurel is to be associated with Mr. Weil in drawing of the the plans. The building,
which will seat approximately 1000 people, will have an entrance throught the new annex of the
hotel, which is now under contruction.
Click Here to see the Full Newspaper Page
back to top of page
-
CONTRACT AWARDED FOR LAUREL’S NEW THEATRE
The Biloxi-Gulfport Daily Herald June 14, 1926
Laurel, June 14 – The Norman Construction Company of Laurel was awarded the contract for the erection
of the new theatre building for the Strand Amusement Company, which will be constructed at the rear
of the Hotel Pinehurst annex. The playhouse will have a seating capacity of 1000 persons, tiled
and marble lobbies, a steel projecting room, monster pipe organ and typhoon cooling system. The
amount of the winning bid was $52,000 for the building. The plant when completed and fully equipped
will cost in the neighborhood of $100,000. Emile Weil, Inc., New Orleans architects, drew the
plans. L.W. Duffee of Laurel is associate architect.
Click Here to see the Full Newspaper Page
back to top of page
-
BODENHAMER URGES UNIVERSAL SERVICE IN ADDRESS
The Biloxi-Gulfport Daily Herald November 25, 1929
Laurel, Miss, Nov. 25 – The American Legion will urge the adoption by Congress this winter of the resolution
looking toward passage of the universal service law. O.L. Bodenhamer, national commander of the legion,
said this in an address here today following a luncheon given in his honor by the Marvin E. Stainton
post of the American Legion.
The luncheon was attended by Legionnaires from other posts in the section of Mississippi, the local Legion
Auxiliary and members of the Kiwanis and Rotary Clubs, who arranged their own luncheons to be with chief of the veterans.
Commander Bodenhamer arrived in Laurel at 9 o’clock this morning and participated in a conference of Legionnaires
from South Mississippi at the Arabian Theatre before noon. He was the honored guest of the consolidated luncheon
of veterans and civic clubs, and the public was invited to hear his address immediately thereafter in the
auditorium of the Y.W.C.A.
Click Here to see the Full Newspaper Page
back to top of page
-
THEATRE MANAGERS INDICTED AT LAUREL
The Huntsville Daily Times October 12, 1930
Laurel, Miss Oct 11 – Officers of the Strand Amusement Company, operators of the Strand and Arabian
Theatres, motion picture houses, have been indicted on three counts each for operation of the two
theatres on Sunday, by the grand jury which has made its final report to Judge W. Joe Pack in circuit
court here. Those indicted are Charles Green, Ben Schneider and W.S. Taylor. The theatres have
been operated without charge on Sunday for several weeks.
Numerous other violations of the Sunday laws were brought to the attention of the grand jury, but no
other indictments were made. This was explained in the grand jury report in the following words:
“We have had a great amount of evidence before us as to the violation of the Sabbath day, and it
is alarming to every member of this grand jury of the growing spirit among the people and even the
Christian people, to disregard, set aside and desecrate Sunday. We have returned a few indictments,
but we had evidence of over seventy violations of the Sunday law. But of our motion, and without the
advice or suggestion on the part of any person or attorney, have referred these seventy or eighty
cases to the county court, to the justice of peace court and to the mayor’s court, where they can
be handled, tried and disposed of with speed and without much cost to the tax payers.”
Click Here to see the Full Newspaper Page
back to top of page


Dad’s Job at H. A. F. B.
In the fall of 1951, Dad closed up his slaughter house because of lack of funds. He went up to Butt Montana where he found a job in a meat packing plant. He would leave home on Sunday afternoon and drive to Butt. He would sleep in the back of the pickup and work in the day time. On Friday after work he would drive home getting there quite late. I have often wondered how he did it and how he didn't freeze at night, with only the thin shell over the pickup bed to protect him. I guess there was a lot my Dad did to provide for his family that mostly went unnoticed. I remember of times that he would go to bed without dinner, just saying that he didn’t feel hungry tonight. I didn’t notice that there wasn't enough for all of us.
While Dad was doing this, Bob who had enlisted in the Air Force came home on leave. He went down to the slaughter house and got looking around and found two orange crates. One was full and the other half full of bill books of people that owed Dad money for meat he had sold them or for an animal that he had processed for them. (An orange crate, at that time, was a wooden crate built 12” X 12” X 24” with a center divider so that it consisted of two sections each equaling 1 foot square.) Dad had written the receipt, but he had never received payment on them. Mom told me that one evening Dad came home from a long day at work and saw her writing at the table. Dad asked he what she was writing and she said that she was just sending letters to some of the people that owed him money asking them if they could pay some on the account. Dad became quite upset with her and told her that she would not do that. These people had told him that they would pay and she was not to remind them of their promise. Bob took the bills to the Attorney in Drigg's and after looking through some of them, said that if Bob would get a power of Attorney from Dad, we could collect about half of them, the other half were already past the date of expiration (I believe that is 7 years). Bob was excited for Dad to come home. When he announced to Dad what he had found out, Dad just went out to his pickup, drove to the slaughter house and burned the bill books. When Bob asked why, Dad just said, "You will hurt people doing that."
Early the next spring (May 24, 1952) as Dad was driving home, on a Friday night, the steering went out on the pickup and Dad rolled the pickup in the Hebdon Lake area. He later told of how he realized he was dead because he remembered looking at the wreck and his body was still laying in the cab. He said he doesn't know how or when he went back to his body, but remembered as he started to regain consciousness, that he realized it was hard to breathe. It impressed him for he had never realized it took effort to breath. He tried to get the doors to open but both were jammed. The truck was upside down. He kicked the rear window out and crawled out through the back.  He then crawled up the embankment to the road where he flagged a couple down, who took him to the Hospital in St. Anthone.
In later years after Dad was gone and I looked at a map of the area of Hebdon Lake, I wondered why Dad would have been in that area. This would have been out of his way. One day while visiting to Lois, Richard’s wife, I told her of my questions about Dad being in the area of Hebdon Lake. If you look at the map as one came from Butt Montana to Victor Idaho, Hebdon Lake is off the route. A few days later Lois suggested that Dad must have gone to West Yellowstone for some reason. I then remembered that Dad told of returning to the sight of the accident and seeing the pickup almost covered with water and eggs and egg shells floating all around. We then concluded that Dad had bought crates of eggs in Montana and was taking them to the restaurants in West Yellowstone, for resale, to make a little extra money.
After Dad recovered and was home from the hospital for a few days, he started looking for work. He couldn't go back to Montana for now we were without a vehicle. He took the bus to Idaho Falls where he got a job with Dodge, Margaret's husband, painting. He said there were three of them assigned to paint the outside of a four story building from scaffolding. The scaffolding had no safety bars or other safety equipment. Dad said that after they had been painting for a few minutes that he turned to Dodge and said that he didn't feel very safe up there. Just then the third man slipped and fell. Dad said he and Dodge just watched him fall hitting scaffolding as he went down. When he hit the ground, Dad said he and Dodge just looked at each other and climbed down. Help was already at the hurt man so they just left the job site and never came back.
Dad heard that there were job openings at Hill Air Force Base in Utah, so he took the bus down to Ogden to look into it. He said he went in to fill out an application and as he began answering the questions, he came to the question asking for his date of birth, he thought that if they knew he was 65 years old, they would not consider him. He, therefore, changed his date of birth to 1896 instead of 1886. He got the job and went to work as a painter on the aircrafts. He worked there until he retired at age 74 on a medical. Hill Field was offering early retirements and Dad had a heart attack two years earlier, his supervisors convinced him that he could get his full sick pay by taking a medical retirement, plus some incentive for retiring then. He would also get all of his accumulated sick leave and all of his accumulated annual leave.  Dad decided that because he had changed his age by ten years, when he applied for the job that he should wait until he was 75 to put in for Social Security. When he did apply for the Social Security, he got a letter back stating that he should have applied at age 65 and they gave him back payment.
Dad would often tell of his experiences at the base. One of the experiences that Dad told about at Hill Field was about mixing paint. After he had been at Hill Field a few years, he got the position over the paint shop. One day a man came to him and said, "I know that you don't have the paint that we need, but I have to ask you anyway." Dad ask him what he needed and the man gave him the paint specifications and again repeated that he know they were out of that paint. Dad told him to come back in a little while and he would see what he could find. Later the man returned and Dad gave him the paint. The man was surprised but took the paint and painted the parts he was to paint. Later the inspector came to Dad asking where he had got that paint. Dad, ask him, what paint? The paint for those aircraft parts! Dad asked if the paint was the right color and was told it was. Dad then asked if it was the right specifications, and was again told it was. Dad then asked, what was the matter with it and was told nothing except they didn't have any of that paint on the Base. Dad just told him that he got it off of the shelve. The inspector just muttered and left. Dad said he wasn't going to tell him that all you had to do was to know your color wheel and you could mix any color you wanted.
Dad met Dean Rose at Hill Field and they became good friends the rest of Dad's life, especially after Mom and Dad move to Sunset, for Dean lived just a couple of miles away. Dad told of first meeting Dean when he saw this man painting a sign. The first thing that caught Dad's attention was that Dean was crippled through his arms and shoulders from polio. The second think that struck Dad is that Dean was painting the sign from the top. This was being done free hand. Dad ask him how he did that? Dean questioned as to what he meant? Dad said, "Writing upside down and backward?" Dean just laughed and said letter are just pictures and once you get the picture in your mind, the picture is the same no matter which way you look at it.
Dad's first heart attack came on a Sunday evening when he was 71 years old. I had been to Sacrament meeting with a date, and when I came home from taking my date home, Mom told me that Dad was in a lot of pain. She was sure he was having a heart attack, but he wouldn't let her do any thing for him. I went into his bedroom to an expression of pain like I have never before or since seen on a person's face. Sweat was running of his head as though he had a garden hose running over him. I ask Dad if I could call the doctor and was told "no". I then asked if I could call the Bishop, and Dad told me not to call anyone but to leave him alone. The pain quit before mid-night and Dad went to sleep. The next morning the alarm went off at its usual 4:30 AM time. Dad got up as always, fixed his lunch and breakfast and went to work. He would complain each evening as he returned from work, of the pain in his chest, but would not hear of going to the Doctor. Mom had called the Doctor and told him the symptoms. The Doctor told her that he couldn't do anything unless Dad came in for an examination. He also told her that he should go to the hospital, which Mom explained that there was no way she could get him to consent to going to the hospital. The Doctor then told her that if she could get him into his office, he could get him to the hospital. When Dad came home Thursday, still complaining about the pain, Mom again suggested that they see the Doctor. Dad consented and they went in to the office. The Doctor just listened to his heart and said he needed an ex-ray and his machine at the office wasn't large enough. He would need to go up to the Hospital where they had a larger machine. When they got to the hospital, the Doctor said he needed Dad to sign a paper so they could take the ex-ray; however, the paper was actually an admittance form. When the Doctor saw the ex-ray, he said that Dad should have died at the first sign of pain. The heart had torn away from the lining and scare tissue was already forming. He put Dad to bed in the hospital with orders that he was not to get out of bed for any reason. I went in to visit Dad the next Thursday evening, stopping and putting gas in my car. When I got to the hospital and went to Dad’s room, Dad asked if I could go get him a hamburger, for he was hungry. I asked him if they hadn't brought him his dinner. He said, "Oh yes, but see the man in the next bed?” Well, when they brought Dad his dinner, the man said, “that sure looks good.’ Dad asked him where his dinner was and the man said they hadn't given him any thing except jello and water for two days. Dad just passed his dinner to the man and the man ate the whole dinner. As I looked at the man he was sound a sleep or I wondered if he might be dead. I told Dad that I had just put my last dollar into gas in order to come into town. He said he had some money, so he called for the nurse. He asked her where his pants were, to which she told him he wasn't getting his pants, she couldn't keep him in bed without his pants and she wasn't letting him have his pants. She said that if he gave her permission, she would get the money from his pants for him. He told her to, so she got the money out of his wallet for him. I went over to the Drug store across the street and got him something to eat. When I got back Dad told me that the nurse kept filling up his water glass and then would check the urinal bottle. He said she kept him so full of water that every time she would leave the room, he had to get up and run to the restroom. The Doctor had given orders that Dad was not to get out of bed for any reason. On Saturday the Doctor released Dad to go home, telling him that he would not obey the nurse’s orders, to stay in bed, so he had just as well be at home. Dad went back to work at Hill Field just a few days after getting home.


Meggings cliche Banksy freegan. Narwhal retro ennui, Carles YOLO Shoreditch. Cardigan flannel McSweeney's, four loko master cleanse tofu High Life fixie wolf. Williamsburg mustache ethical, you probably haven't heard of them single-origin coffee quinoa Shoreditch selvage cliche scenester sriracha. Cardigan kitsch YOLO Vice iPhone Intelligentsia, vinyl kogi Tumblr banh mi 8-bit. 3 wolf moon banh mi flannel artisan VHS locavore sustainable, aesthetic mixtape kitsch lo-fi cornhole butcher pug. Fanny pack American Apparel street art, jean shorts gentrify skateboard readymade lo-fi Shoreditch lomo selfies farm-to-table keffiyeh synth flannel.
Meh skateboard bicycle rights cliche, hella deep v Tonx before they sold out farm-to-table butcher wolf Marfa VHS. Butcher cardigan chia, kale chips DIY pop-up Neutra leggings. Stumptown XOXO banjo, Banksy kitsch put a bird on it brunch narwhal wayfarers slow-carb lo-fi Austin literally deep v. Squid cliche fixie tofu vinyl, XOXO fap church-key food truck Marfa before they sold out retro. Odd Future Kickstarter normcore, before they sold out blog church-key High Life lo-fi keytar quinoa authentic 8-bit selvage. Pork belly skateboard Echo Park bespoke. Fixie retro kogi, lomo freegan twee biodiesel fashion axe mlkshk 90's hella flexitarian jean shorts.
Intelligentsia biodiesel wayfarers messenger bag. Pop-up mumblecore Marfa, bespoke church-key tofu Godard raw denim twee aesthetic direct trade Tumblr banjo post-ironic.
Here is some text in bold
Intelligentsia biodiesel wayfarers messenger bag. Pop-up mumblecore Marfa, bespoke church-key tofu Godard raw denim twee aesthetic direct trade Tumblr banjo post-ironic.
Here is some text that is in italic.
Some things to remember
Parts of a story


pmf = self._expand(x).reshape(self._shape)
h_total = -np.nansum(pmf * np.log2(pmf))
inputs = tuple(range(len(self._shape) - 1))
p_output = pmf.sum(axis=inputs)
h_output = -np.nansum(p_output * np.log2(p_output))
input_pmf = pmf.sum(axis=-1)
reduced_pmf = pmf.sum(axis=0)
h_reduced = -np.nansum(reduced_pmf * np.log2(reduced_pmf))
others_pmf = pmf.sum(axis=(0, 2))
h_others = -np.nansum(others_pmf * np.log2(others_pmf))
omi = h_others + h_output - h_reduced


Avro C++
Main Page
Namespaces
Classes
Files
Directories
Class List
Class Hierarchy
Class Members
boost
integral_constant
Public Types
|
Static Public Attributes
boost::integral_constant< T, val > Struct Template Reference
Inheritance diagram for boost::integral_constant< T, val >:
List of all members.
Public Types
typedef
integral_constant
< T, val >
type
typedef T
value_type
Static Public Attributes
static const T
value
= val
template<class T, T val>
struct boost::integral_constant< T, val >
The documentation for this struct was generated from the following file:
api/
Boost.hh
Generated on Thu Feb 21 2013 13:40:26 for Avro C++ by
<IP_ADDRESS>


I suck at writing Forth, but its very fun to learn and play around with.
If you're interested in Forth, consider reading the following resources:


What does it mean for an argument to be valid? (3 points)
An argument is valid just in case, if the premises are all true, then the conclusion must be true.
Why does using the method of counterexample show that an argument is invalid? (3 points)
If an argument is valid, then the conclusion is true in every world in which the premises are all true. So, if we can find a world in which the premises are true, but the conclusion is false, then we have shown the argument to be invalid.
Fill in the blanks below with the logical concept that best completes the sentence. Draw your answers from the list of concepts provided. Each concept is used at most once; some will not be used at all. (2 points each)
Concepts:proof, counterexample, truth conditions, possibility, logical truth, truth table, reflexive, commutative, transitive, equivalent, inverse, semantics, syntax, idempotence, associative
If an argument is invalid, then it is possible to construct a counterexample to it.
If a sentence is a logical truth, then it is true in all possible worlds.
BackOf(x,y) and FrontOf(x,y) are an example of predicates that stand in the inverse relation.
A proof is a step by step procedure for showing one sentence to be a logical consequence of other sentences.
If a sentence is a tautology, then it is true in every row of its truth table.
The Boolean connective ∧ has the property of being communtative because the order of the sentences it connects does not matter to its truth value.
If sentence A is equivalent to sentence B, then we can replace A for B in any line of a proof.
In FOL, the meaning of a sentence is constituted by its truth conditions.
Since the predicate Larger(x,y) is transitive, we can infer Larger(a,c) from Larger(a,b) and Larger(b,c).
A ∨ (B ∨ C) is equivalent to (A ∨ B) ∨ C because the Boolean connective ∨ has the property of being associative.
Translations
For each of the English sentences below, write an appropriate translation into FOL. (2 points each)
Craig is not hungry, and Dana is starving. ¬Hungry(craig) ∧ Starving(dana)
Either Fran or Gilbert ate the last cookie. Ate(fran,cookie) ∨ Ate(gilbert,cookie)
Hugh had a headache and went home. Headache(hugh) ∧ Went(hugh,home)
It is not the case that Ichabod loves Julie. ¬Loves(ichabod,julie)
Kale is not both tasty and good for you. ¬(Tasty(kale) ∧ GoodFor(kale,you)
Assessing truth
Using the world on the left, indicate whether each of the FOL sentences on the right is true or false by placing either a T or an F to the left of each sentence. (2 points each)
F a. Large(c)
T b. Large(f) ∧ Tet(f)
T b. Medium(c) ∨ FrontOf(a,b)
F b. RightOf(a,c)
T b. (SameSize(d,f) ∧ SameSize(b,c)) ∧ SameSize(e,d)
T b. SameSize(b,c)
T b. SameRow(a,a)
F b. Adjoins(a,b) ∨ a = b
F b. Between(e,d,f)
F b. LeftOf(d,d)
Using the checkerboard on the right, construct a world in which every sentence on the left is true. You may want to practice on some scratch paper before drawing your official world on the exam. (2 points each)
Tet(a)
c = d
RightOf(a,c)
Between(a,c,f)
Cube(d) ∧ Medium(d)
¬SameRow(a,f)
Larger(f,d)
Proofs
The proofs below have a number of missing pieces. Fill in the blanks with a sentence of FOL or a justification where appropriate. (Remember that justifications must include the rule name and the line numbers for the lines you use in the justification.) (3 points per blank)
Argument 1
Argument 2
Counterexample
The argument below is invalid. Using the checkerboard provided, construct a counterexample world that shows the argument to be invalid. (5 points)
Truth tables
Fill out the truth tables below. Make sure that you fill the column under every Boolean connective. (4 points per table)
What does the left table above tell us about the relation between sentences of the form ¬A ∨ B and ¬(¬B ∧ A)? (2 points)
It tells us that sentences of these two forms are equivalent. Thus, they can be freely exchanged for each other in a proof.
Bonus
For any of the proof lines you marked with Ana Con in the Proofs section, explain your intuitive reason for the justification you gave. Be sure to give the argument and line number in your explanation. (2 points each)
Argument a, line 5: By line 3, we know that a and d are the same size, so whatever size one has, the other must have it, too. By line 4, we know that d is large. It follows that a must be large.
Argument b, line 4: This follows from lines 1 and 3 and the fact that RightOf(x,y) is a transitive predicate.
Explain what it means to say that FOL is a recursive language. (3 points)
A recursive language has syntax rules that apply to their outputs. This allows for an indefinite number of sentences to be constructed for the language. In FOL, the syntax rules for the Boolean connectives are recursive.
Translate the following English sentence into FOL. (2 points)
Vera has never not gotten either an A or a B on any exam she has taken.
For all exams she's taken: ExamGrade(vera,a) ∨ ExamGrade(vera,b)
For all exams she's taken: ¬(¬ExamGrade(vera,a) ∧ ¬ExamGrade(vera,b))
Strictly speaking, we need quantifiers to express this sentence's meaning, but we don't have them yet.


Before Change
path_def = os.path.abspath(path_def)
if not os.path.exists(path_def):
raise ValueError(
"data input folder "{}" not found, did you maybe "
"forget to download data?".format(path_i))
path.append(path_def)
elif name == "filename_contains":
After Change
continue
if not default_folder:
tf.logging.fatal(
"data input folder "%s" not found, did you maybe "
"forget to download data?", path_i)
raise ValueError
path_def = os.path.join(default_folder, path_i)
path_def = os.path.abspath(path_def)
if not os.path.exists(path_def):


Page 2 of 6
Posted:
Sun Dec 24, 2006 11:22 pm
by Skitari
can we use wavs that are in public domain and/or free websites? I could cut some up to make spell sounds I.E thunder for zap etc.
Posted:
Sun Dec 24, 2006 11:25 pm
by thadiusofx3
yeah as long as they are royalty free we could use them
Posted:
Mon Dec 25, 2006 5:05 pm
by Karl G.
As I replied to Ender, I'll make a sound forum when there's enough reason to do so. Posts seem to work well for now.
Posted:
Mon Dec 25, 2006 8:50 pm
by Ender
Just uploaded a
rough recreation of "relax."
link:
http://www.mydatabus.com/public/Test2/z/relax_rough.mp3
Notes:
1) This is a recreation, the melody and instrumentation aren't exactly the same. (and if you listen close the guitar part isn't either)
2) This is "rough" because I left my main hardware up at college over break. The family comp I'm working on now can barely handle 3 instruments sampled at 44k.
When I get back from break I'll release a final version of this that will be a lot better. (Better orchestration, higher quality sounds, some dynamic variation, and a little longer). I'd also like anyone's opinion on the fret/string noise. I like it because it's a more authentic* sound, but it might be weird to have that in a game.
Since this isn't the final version I just left it in .mp3. If anyone would like the midi or FL file for this to tweak, let me know and I'll upload them.
*all of relax is in a-minor and can technically be played on guitar without moving up the strings (so no fret noise), but the VST plugin I'm using isn't advanced enough to know that (and I doubt any program is).
Posted:
Tue Dec 26, 2006 3:05 pm
by Necromadon
Amazing! The sounds in this post are great, It's awesome how fast they're comming.
edit:
That program isn't working for me. I'll try it on my main computer when I get home.
Posted:
Tue Dec 26, 2006 3:57 pm
by thadiusofx3
Yeah it doesn't work on the computer I'm on either, I'll try it on my main computer when i get home as well
Posted:
Tue Dec 26, 2006 9:22 pm
by Ender
On the comp I'm using it takes about 20 seconds to create 2 .dat files and launch the program. But if you waited that long and still nothing happened, I'll try and figure out what's wrong with it.
Also, did the previous version work for you guys?
Posted:
Tue Dec 26, 2006 10:45 pm
by thadiusofx3
Works fine on my main rig at home, takes about 5 seconds to create the files and start up.
Posted:
Tue Dec 26, 2006 10:59 pm
by thadiusofx3
how do I uh... save stuff? Do I have to like record it with audacity or something
Posted:
Tue Dec 26, 2006 11:16 pm
by Ender
Yeah, the easiest way is to load the .dll as a VST plugin and record it in Audacity/FL Studio/Cakewalk or whatever. That way you can use midi commands and automations too.
Posted:
Tue Dec 26, 2006 11:19 pm
by thadiusofx3
ok thats what i did, works great, thanks
Posted:
Wed Dec 27, 2006 11:54 am
by Necromadon
Ya works fine at this pc, I just don't understand the purpose of the program
Posted:
Wed Dec 27, 2006 12:10 pm
by thadiusofx3
I could make a decent arrangment of play.wav if I could figure out which keyboard key plays the right-hand keys lol
Posted:
Wed Dec 27, 2006 1:19 pm
by Ender
Necromadon wrote:Ya works fine at this pc, I just don't understand the purpose of the program
So anyone with some freeware and a mouse can create half-decent drones (like death.wav).
And so I could learn to make better ones in the future.
Posted:
Wed Dec 27, 2006 4:08 pm
by thadiusofx3
I'd like to hear the final version of your relax if you've got it done, the rough recreation was freakin awesome.
On a side note, if you've got a sound that you think is ready for the final game put it into the awaiting approval folder in the file storage so everyone can take a look at it and we can get everyones opinion.
Posted:
Wed Dec 27, 2006 10:08 pm
by thadiusofx3
I uploaded a rough uncomplete version of play.wav that a friend and I worked on today.
check it out and tell me what you think guys
Posted:
Fri Dec 29, 2006 4:50 pm
by Ender
the play recreation sounds great Thad. Are you doing that with Audacity?
Posted:
Fri Dec 29, 2006 5:27 pm
by thadiusofx3
Guitar Pro 5
Posted:
Fri Dec 29, 2006 5:49 pm
by Ender
thadiusofx3 wrote:Guitar Pro 5
Didn't see that coming. Maybe I should start using it for more than reading tabs.
Posted:
Fri Dec 29, 2006 5:58 pm
by thadiusofx3
It was a joint effort between me and spectre
Posted:
Fri Dec 29, 2006 9:59 pm
by Ender
an update on what I'm doing:
started work on "danger.wav", will post the rough version sometime tomorrow.
After that I'll do some drones.
Also, expect final versions of what I've done sometime around Jan. 10th. (dorms open back up on the 8th, so I'll have access to my stuff then)
Posted:
Fri Dec 29, 2006 10:01 pm
by thadiusofx3
Spectre is moving to another apartment this weekend, but once he gets settled in we are gonna work on some more models and sounds.
Posted:
Sat Dec 30, 2006 10:00 am
by stoody
I made a rough version of the old intro, i'll try to finish it when I get off work.
Posted:
Sat Dec 30, 2006 10:03 am
by Karl G.
sounds good
Posted:
Sat Dec 30, 2006 3:21 pm
by Ender
Here is a rough version of danger.wav:
http://www.mydatabus.com/public/Test2/z ... _rough.mp3
My family's PC was at 90% CPU with just 4 instruments loaded
. I'll add more when I get back to college, so that melody line won't sound as strange.


{{aggregate}} handlebars helper. Inlines content from multiple files optionally using wildcard (globbing/minimatch) patterns, extracts YAML front matter to pass to context for each file. Accepts compare function as 3rd parameter for sorting inlined files.
In the root of your project, run the following in the command line:
npm i helper-aggregate --save-dev
{{aggregate 'path /to /.hbs '}}
In your Gruntfile, simply add helper-aggregate
to the helpers
property in the
Assemble task or target options:
grunt.initConfig({
assemble: {
options: {
// must be in devDependencies for assemble
// to automatically resolve the helper
helpers: ['helper-aggregate' ]
}
...
}
});
With that completed, you may now use the {{aggregate}}
helper in your Assemble project.
See examples of the {{aggregate}}
helper being used in the
yfm project:
Type: String
Default value: \n
The separator to append after each inlined file.
Set options as hash arguments.
{{aggregate 'my /book /chapters /.hbs ' sep ="<!- Chapter -->" }}
Pass Assemble options into the helper.
In your project's Gruntfile, options for the {{aggregate}}
helper can be defined in the Assemble task options:
assemble: {
options: {
helpers: ['helper-aggregate' ],
aggregate: {
sep: '\n\n',
compare_fn: function (a, b) {
return a.index >= b.index ? 1 : -1;
}
}
}
...
}
Note that the options are defined in the
custom property, aggregate
, not on the options
object itself.
The helper will also process any valid Lo-Dash templates in the YAML front matter of targeted files, using grunt.config.data
and the context of the "current" file. For example:
Given you have this in the gruntfile:
// Project configuration.
grunt.initConfig({
// Metadata for our book.
book: require('./test/fixtures/book/book.yml' ),
assemble: {
options: {
helpers: ['helper-aggregate' ],
aggregate: {
sep: '',
compare_fn: function (a, b) {
return a.index >= b.index ? 1 : -1;
}
},
book: {
src: ['chapters/*.hbs' ],
dest: 'book/'
}
}
}
});
And these Lo-Dash and Handlebars templates:
---
title: <%= book.title %>
chapter: 1
intro: Chapter <%= chapter %>
---

 Content from {{title }}

 {{intro }}

 Chapter: {{chapter }}

would result in:
<!DOCTYPE html>

<meta charset="UTF-8">
<title>My Amazing Book</title>

Content from My Amazing Book

Chapter 1

Chapter: 1

Content from My Amazing Book

Chapter 2

Chapter: 2

Content from My Amazing Book

Chapter 3

Chapter: 3

Jon Schlinkert
Licensed under the MIT License Copyright (c) Jon Schlinkert, contributors.
See the template for this page →
Find an error? Let us know →


{% load static %}
News blog on Django
{% include "index/includes/bootstrap.html" %}
Example of using Django 2.2+
{% block content %} {% endblock %}
Main page
News »
Contacts
© All rights reserved 2019


Parsing JSON data file
Parsing KML data file
Supports features with holes and multiple parts
Highlighting/selecting/unselecting colors are based on feature data, via responsive_*_opts callbacks
Multigeometries only
Multigeometries + polygons


There are three DIVs in this paragraph, but only one will be showing. SimpleAB has picked one at random. Whoa, magic!


metacell.storage package¶
Submodules¶
metacell.storage.genes module¶
Manage storage of per-gene data.
-
class
metacell.storage.genes.
Genes
(full: metacell.storage.genes.GenesSet, names: tgutils.numpy.ArrayStr)¶ Bases:
object
A collection of genes with some associated data.
This must be consistent between all profiles that are processed together.
-
__init__
(full: metacell.storage.genes.GenesSet, names: tgutils.numpy.ArrayStr) → None¶ Initialize the genes.
-
abstract
any_array
(name: str) → numpy.ndarray¶ Load a per-gene data array.
-
array
(cls: Type[A], name: str) → A¶ Load a per-gene data array.
-
abstract
available_data
() → List[str]¶ Return a list of the available data.
-
count
= None¶ Convenient access to the number of genes.
-
static
created
(path: str, organism: str) → None¶ Write the
genes.yaml
file after creating a genes directory.At minimum, the directory should contain the gene names file.
-
full
= None¶ The full gene set this is derived from.
-
abstract
has_array
(name: str) → bool¶ Whether there exists some per-gene data.
-
static
load
(path: str, organism: Optional[str] = None) → metacell.storage.genes.Genes¶ Load genes from a directory.
-
names
= None¶ The sorted upper-case names of genes in the set.
-
uuid
= None¶ The unique identifier of this list of gene names.
-
-
class
metacell.storage.genes.
GenesMetadata
(**kwargs)¶ Bases:
metacell.storage.metadata.YamlMetadata
Per-batch meta-data.
-
__init__
(**kwargs) → None¶ Create metadata for for some genes.
-
genes_count
= None¶ The number of genes.
-
organism
= None¶ The organism these are genes of.
-
required_keys
= {'genes_count': <class 'int'>, 'organism': <class 'str'>, 'uuid': <class 'str'>}¶
-
-
class
metacell.storage.genes.
GenesSet
(metadata: metacell.storage.genes.GenesMetadata)¶ Bases:
metacell.storage.genes.Genes
A set of genes with some associated data.
This must be consistent between all batches that are processed together.
-
__init__
(metadata: metacell.storage.genes.GenesMetadata) → None¶ Open a genes set directory for access.
-
any_array
(name: str) → numpy.ndarray¶ Load a per-gene data array.
-
available_data
() → List[str]¶ Return a list of the available data.
-
data_path
(path: str) → str¶ Return the path of a data file in the genes directory.
-
has_array
(name: str) → bool¶ Whether there exists some per-gene data.
-
metadata
= None¶ The meta-data describing the genes.
-
-
class
metacell.storage.genes.
GenesSubset
(superset: metacell.storage.genes.Genes, included_indices: tgutils.numpy.ArrayInt32)¶ Bases:
metacell.storage.genes.Genes
A subset of some genes.
-
__init__
(superset: metacell.storage.genes.Genes, included_indices: tgutils.numpy.ArrayInt32) → None¶ Create a subset of some genes.
-
any_array
(name: str) → numpy.ndarray¶ Load a per-gene data array.
-
available_data
() → List[str]¶ Return a list of the available data.
-
has_array
(name: str) → bool¶ Whether there exists some per-gene data.
-
included_indices
= None¶ The indices of the superset genes which are included in the subset.
-
superset
= None¶ The genes this is a subset of.
-
metacell.storage.hca module¶
Handle HCA (h5) files.
metacell.storage.helpers module¶
Helper functions.
-
metacell.storage.helpers.
combine_uuids
(uuids: List[uuid.UUID]) → uuid.UUID¶ Use
md5sum
to combine multiple UUIDs into a single UUID.
-
metacell.storage.helpers.
file_uuid
(path: str) → uuid.UUID¶ Compute a checksum of a disk file.
-
metacell.storage.helpers.
sum_profiles_loop
(expected: int) → tgutils.application.Loop¶ Create a logged loop for summing profiles.
metacell.storage.imports module¶
Handle multi-lane sparse format data.
-
class
metacell.storage.imports.
CsvFormat
(path: str, data: Dict[str, Any])¶ Bases:
object
Describe the format of a CSV file.
-
__init__
(path: str, data: Dict[str, Any]) → None¶ Construct from an entry in a
format.yaml
file.
-
field_names
= None¶ When the file has no header line, assume this header line is used.
-
field_types
= None¶ For each recognized field of the file, its expected data type.
-
separator
= None¶ The separator between fields.
-
-
class
metacell.storage.imports.
DelaneData
¶ Bases:
object
Data needed to delane the UMIs matrix.
-
__init__
() → None¶ Initialize self. See help(type(self)) for accurate signature.
-
data_of_lanes
= None¶ The per-lane data.
-
data_of_profiles
= None¶ The per-profile data by the 0-based original index.
-
get_lane
(lane_name: str) → metacell.storage.imports.LaneData¶ Get the data for a specific lane.
-
-
class
metacell.storage.imports.
DirFormat
(path: str)¶ Bases:
object
Describe the format of all CSV files in a standard format directory.
-
__init__
(path: str) → None¶ Construct the format from a
format.yaml
file.
-
genes
= None¶ The format of the genes CSV file.
-
profiles
= None¶ The format of the profiles CSV file.
-
-
class
metacell.storage.imports.
LaneData
(name: str)¶ Bases:
object
Per-lane data needed to delane the UMIs matrix.
-
__init__
(name: str) → None¶ Initialize empty lane data.
-
add_entry
(gene_index: int, profile_index: int, umis_count: int) → None¶ Add a scanned UMIs entry to the lane.
-
entry_lines
= None¶ The lines of the entries of the lane.
-
last_profile_data_line_index
= None¶ The last profile data line index of the lane.
-
name
= None¶ The unique lane name.
-
profiles_count
= None¶ The number of profiles in the lane.
-
write_umis_matrix
(delaned_root: str, umis_header_line: str, genes_count: int) → None¶ Write the collected entries into the UMIs matrix file.
-
-
class
metacell.storage.imports.
ProfileData
(lane_data: metacell.storage.imports.LaneData)¶ Bases:
object
Per-profile data needed to delane the UMIs matrix.
-
__init__
(lane_data: metacell.storage.imports.LaneData) → None¶ Initialize scanned profile data.
-
index_in_lane
= None¶ The 1-based index of the profile in the lane.
-
lane_data
= None¶ The lane the profile belongs to.
-
metacell.storage.matrices module¶
Memory-mapped matrices for observations storage.
-
metacell.storage.matrices.
MAGIC_BYTES
= b'METACELL SPARSE MEMORY MAPPED MATRIX VERSION 0\x00\x00'¶ The magic string for a sparse memory mapped matrix.
-
metacell.storage.matrices.
MAGIC_SIZE
= 48¶ Size of the magic string identifying the file type.
-
class
metacell.storage.matrices.
MemoryMappedMatrix
(path: str)¶ Bases:
object
A read-only memory mapped file containing a series of integer measurements per profile.
This is optimized to allow for accessing the data of arbitrary profiles. It does not allow for efficient extraction of the data of arbitrary genes.
The file format is as follows:
Magic string: containing the
metadata.storage.matrices.MAGIC_BYTES
.Profiles count: 4-bytes little-endian.
Genes count: 4-bytes little-endian.
Profiles data: See below.
Padding to 4 bytes alignment using 0 bytes.
Index of offsets of profile data: See below.
The format of the index of the offsets is as follows:
For each profile, the 4-byte little-endian offset of the 1st byte of its data.
Finally, the offset of the 1st byte following the data of the last profile.
The format of the profile data is as follows:
A sequence of pairs of bytes, where the 1st byte is the unsigned delta to apply to the current gene index, and the 2nd byte is the unsigned value to add to the current gene of the profile.
This format is very compact when more than 1/256 of the genes have non-zero data, and when the measurement value is typically less than 256. When genes are sparser, we write additional byte pairs with a delta gene index of 255 and measurement of 0. When the measurement value is too high, we write additional byte pairs with a delta gene index of 0.
Decompression is reasonably fast as there are no branches involved. It is difficult to vectorize but the saving in I/O (especially when accessing the data over a network) “should” justify this compression. However it is trivial to parallelize decompression of multiple profile data.
The compression rate is pretty good (around 1/50 compared to dense encoding). The optimal number of bits for the genes and measurement deltas is actually 8 and 4, respectively. However, this complicates the code and only reduces the file sizes by around 20%. Using an optimized Huffman tree or
gzip
it is possible to further compress the result to around 1/2th the current size, but this would come at the cost of much slower decompression speed.The profile data offsets index appears at the end of the file, but its location is known to be
file_size - (profiles_count + 1) * 4
. The profiles count is known to be at the offsetmetaprofile.storage.matrices.MAGIC_SIZE
.All 4-byte values are stored on a 4-byte aligned offset, and are in little-endian order. This allowing a memory-mapped implementation on most processors to decode the value using an efficient aligned pointer dereference.
-
__init__
(path: str) → None¶ Open a read-only memory-mapped matrix file.
-
add_profile_data
(profile_index: int, array: tgutils.numpy.ArrayFloat32) → None¶ Add the profile data into a numpy array.
-
close
() → None¶ Release all the resources held by the file.
-
entries_count
() → int¶ Return the total number of non-zero entries in the matrix.
-
genes_count
= None¶ The number of genes in the matrix.
-
mmap
= None¶ The mapped memory.
-
profiles_count
= None¶ The number of profiles in the matrix.
-
to_numpy_matrix
() → tgutils.numpy.MatrixFloat32¶ Return the full matrix as a dense numpy array, whose rows are genes, columns are profiles, and entries are 4-byte integers containing observations.
-
static
write
(path: str, genes_count: int, data: List[List[Tuple[int, int]]]) → None¶ Write a sparse memory-mapped matrix.
- Parameters
path – The path of the disk file to write.
genes_count – The number of genes (size of gene set).
data – A list of profile data, where each profile data is a list of tuples, where each tuple has a gene index and an observation. The list of tuples must be sorted by the gene index. Entries with zero observations are allowed, and have no effect on the output. Multiple tuples with the same gene index are allowed, and are summed into the output.
metacell.storage.metadata module¶
Manage meta-data in YAML files.
-
class
metacell.storage.metadata.
YamlMetadata
(**kwargs)¶ Bases:
types.SimpleNamespace
Meta-data stored in a YAML file.
-
__init__
(**kwargs) → None¶ Create the metadata object.
-
as_dict
(**kwargs) → Dict[str, Any]¶ Return the metadata as a clean dictionary for dumping to YAML.
-
static
detect_cls
(cls: Type[YM], _dictionary: Dict[str, Any]) → Type[YM]¶ Decide on the concrete metadata class to load from the dictionary.
-
dump
(yaml_path: str, **kwargs) → None¶ Dump batch metadata into a file.
-
classmethod
load
(yaml_path: str) → YM¶ Load the batch meta-data from a file.
-
path
= None¶ The path of the directory containing the data.
-
removed_keys
= ['path', 'yaml_path']¶ The keys that should be removed from the YAML file.
-
required_keys
= {'uuid': <class 'str'>}¶ The keys that must appear in the YAML file.
-
uuid
= None¶ The globally unique identifier of the data.
-
yaml_path
= None¶ The path of the YAML meta-data file.
-
metacell.storage.profiles module¶
Maintain per-gene-per-profile UMIs data on the disk.
-
class
metacell.storage.profiles.
CombinedMetadata
(yaml_path: str, data: Any)¶ Bases:
types.SimpleNamespace
Per-combined profiles container metadata.
-
__init__
(yaml_path: str, data: Any) → None¶ Load the meta-data from a YAML file.
-
as_dict
(**kwargs) → Dict[str, Any]¶ Return the metadata as a clean dictionary for dumping to YAML.
-
name
= None¶ The name of the combined container in the collection.
-
profiles_count
= None¶ The number of profiles in the combined container.
-
uuid
= None¶ The unique identifier of the combined container.
-
-
class
metacell.storage.profiles.
Profiles
(*, metadata: metacell.storage.profiles.ProfilesMetadata, genes: metacell.storage.genes.Genes, name: str = '')¶ Bases:
object
Common base class for all profile containers.
-
__init__
(*, metadata: metacell.storage.profiles.ProfilesMetadata, genes: metacell.storage.genes.Genes, name: str = '') → None¶ Initialize self. See help(type(self)) for accurate signature.
-
add_into_gp_array
(name: str, profile_index: int, profile_array: tgutils.numpy.ArrayFloat32) → tgutils.numpy.ArrayFloat32¶ Add the requested data of a profile into an array.
-
any_array
(kind: str, name: str) → numpy.ndarray¶ Return a per-gene or per-profile array of any type.
-
any_frame
(kind: str, name: str, *, profile_indices: Optional[Collection], gene_indices: Optional[Collection]) → pandas.core.frame.DataFrame¶ Return a per-gene/gene, per-gene/profile or per-profile/profile data of any type.
Note
The returned frame index for genes (for
gg
andgp
) is the gene names, even though thegene_indices
parameter uses the integer index. Both theprofile_indices
and the returned frame index for profiles (forgp
andpp
) use the integer profile indices.
-
any_matrix
(kind: str, name: str, profile_indices: Optional[Collection] = None, gene_indices: Optional[Collection] = None) → numpy.ndarray¶ Return a per-gene/gene, per-gene/profile or per-profile/profile data of any type.
-
any_series
(kind: str, name: str) → pandas.core.series.Series¶ Return a series of per-gene or per-profile data of any type.
-
array
(cls: Type[A], kind: str, name: str) → A¶ Return a per-gene or per-profile array of some type.
-
available_data
(kind: str) → List[str]¶ Return a list of the available data of the specified kind (‘g’, ‘p’, ‘gp’, ‘gg’ or ‘pp’).
-
data_path
(path: str) → str¶ Return the path of a data file in the container directory.
-
abstract
dir_paths
() → List[str]¶ Return the list of directories containing actual UMIs data for the container.
This is just a single path for a batch, and a list for a merged collection of batches. For a view it contains the view’s directory in addition to the base container’s.
-
frame
(cls: Type[F], kind: str, name: str, *, profile_indices: Optional[Collection] = None, gene_indices: Optional[Collection] = None) → F¶ Return a per-gene/gene, per-gene/profile or per-profile/profile data of some type.
Note
The returned frame index for genes (for
gg
andgp
) is the gene names, even though thegene_indices
parameter uses the integer index. Both theprofile_indices
and the returned frame index for profiles (forgp
andpp
) use the integer profile indices.
-
genes
= None¶ The genes set stored for each profile.
-
has_array
(kind: str, name: str) → bool¶ Test whether the container contains some per-gene or per-profile data file.
-
has_matrix
(kind: str, name: str) → bool¶ Test whether the container contains some per-gene/gene, per-gene/profile or per-profile/profile data file.
-
static
load
(path: str, genes: metacell.storage.genes.Genes, *, name: str = '', profiles_kind: Optional[str] = None) → metacell.storage.profiles.Profiles¶ Load a profiles container from disk directory.
-
matrix
(cls: Type[A], kind: str, name: str, *, profile_indices: Optional[Collection] = None, gene_indices: Optional[Collection] = None) → A¶ Return a per-gene/gene, per-gene/profile or per-profile/profile data of any type.
-
metadata
= None¶ The meta-data describing the container.
-
name
= None¶ The human friendly name of the container.
-
profile_indices
() → tgutils.numpy.ArrayInt32¶ Return an array of profile indices.
-
abstract
profile_name
(profile_index: int, *, base_index: int = 0) → str¶ Return a human-friendly profile name.
This uses the profile’s barcode (if a
p.barcode.txt
file exists), otherwise the numeric profile index. In both cases the name is prefixed with the specific batch name, if any.
-
profile_names
(*, base_index: int = 0) → tgutils.numpy.ArrayStr¶ Return an array of all the profile names.
-
profiles_count
= None¶ The number of profiles in the container (to be filled by the sub-class).
-
series
(cls: Type[S], kind: str, name: str) → S¶ Return a series of per-gene or per-profile data of some type.
-
total_umis
(kind: str, profile_indices: Optional[Collection] = None) → tgutils.numpy.ArrayFloat32¶ Return an array of the per-gene or per-profile total UMIs, for all or some of the profiles.
The first time this is called (only for all the profiles), it ts cached on disk.
-
write
(cls: Type[A], array: A, kind: str, name: str) → None¶ Write a data array or matrix into the container.
-
-
class
metacell.storage.profiles.
ProfilesBatch
(*, metadata: metacell.storage.profiles.ProfilesMetadata, genes: metacell.storage.genes.Genes, name: str = '')¶ Bases:
metacell.storage.profiles.Profiles
A batch of UMIs measurement profiles.
-
__init__
(*, metadata: metacell.storage.profiles.ProfilesMetadata, genes: metacell.storage.genes.Genes, name: str = '') → None¶ Open a batch of profiles for access.
-
static
created
(path: str, genes: metacell.storage.genes.Genes, profiles_kind: str) → None¶ Write the
profiles.yaml
file after creating a profiles batch in some directory.At minimum, the directory should include a raw UMIs matrix.
-
dir_paths
() → List[str]¶ Return the list of directories containing actual UMIs data for the container.
This is just a single path for a batch, and a list for a merged collection of batches. For a view it contains the view’s directory in addition to the base container’s.
-
metadata
= None¶ The meta-data describing the batch.
-
profile_name
(profile_index: int, *, base_index: int = 0) → str¶ Return a human-friendly profile name.
This uses the profile’s barcode (if a
p.barcode.txt
file exists), otherwise the numeric profile index. In both cases the name is prefixed with the specific batch name, if any.
-
-
class
metacell.storage.profiles.
ProfilesBatchMetadata
(**kwargs)¶ Bases:
metacell.storage.profiles.ProfilesMetadata
Per-batch meta-data.
-
container
¶ alias of
ProfilesBatch
-
-
class
metacell.storage.profiles.
ProfilesCollection
(metadata: metacell.storage.profiles.ProfilesMetadata, genes: metacell.storage.genes.Genes, name: str = '')¶ Bases:
metacell.storage.profiles.Profiles
A collection of named containers.
Each combined container is a sub-directory which is, itself, a profiles container. Per-profile and per-gene-per-profile data is collected from the leaf (batch or view) containers.
-
__init__
(metadata: metacell.storage.profiles.ProfilesMetadata, genes: metacell.storage.genes.Genes, name: str = '') → None¶ Initialize self. See help(type(self)) for accurate signature.
-
add_into_gp_array
(name: str, profile_index: int, profile_array: tgutils.numpy.ArrayFloat32) → tgutils.numpy.ArrayFloat32¶ Add the requested data of a profile into an array.
-
available_data
(kind: str) → List[str]¶ Return a list of the available data of the specified kind (‘g’, ‘p’, ‘gp’, ‘gg’ or ‘pp’).
-
container_index_of_profile
(profile_index: int) → int¶ Return the index of the container to which a specific profile belongs.
-
containers
= None¶ The combined (leaf) containers.
-
static
created
(path: str, combined_dirs: List[str]) → None¶ Write the
profiles.yaml
file after creating a profiles collection in some directory.The directory should include all the combined profile containers.
-
dir_paths
() → List[str]¶ Return the list of directories containing actual UMIs data for the container.
This is just a single path for a batch, and a list for a merged collection of batches. For a view it contains the view’s directory in addition to the base container’s.
-
first_profile_indices
= None¶ The first index of each container (for searching).
-
has_array
(kind: str, name: str) → bool¶ Test whether the container contains some per-gene or per-profile data file.
-
has_matrix
(kind: str, name: str) → bool¶ Test whether the container contains some per-gene/gene, per-gene/profile or per-profile/profile data file.
-
index_by_name
= None¶ The index of a combined container by its name.
-
metadata
= None¶ The meta-data describing the collection.
-
profile_name
(profile_index: int, *, base_index: int = 0) → str¶ Return a human-friendly profile name.
This uses the profile’s barcode (if a
p.barcode.txt
file exists), otherwise the numeric profile index. In both cases the name is prefixed with the specific batch name, if any.
-
-
class
metacell.storage.profiles.
ProfilesCollectionMetadata
(**kwargs)¶ Bases:
metacell.storage.profiles.ProfilesMetadata
Per-collection meta-data.
-
__init__
(**kwargs) → None¶ Create metadata for a collection of batches of profiles.
-
as_dict
(**kwargs) → Dict[str, Any]¶ Return the metadata as a clean dictionary.
-
combined_profiles
= None¶ The list of batches contained in the collection.
-
container
¶ alias of
ProfilesCollection
-
required_keys
= {'combined_profiles': <class 'list'>, 'genes_count': <class 'int'>, 'genes_uuid': <class 'str'>, 'organism': <class 'str'>, 'profiles_count': <class 'int'>, 'profiles_kind': <class 'str'>, 'uuid': <class 'str'>}¶
-
-
class
metacell.storage.profiles.
ProfilesGroups
(*, metadata: metacell.storage.profiles.ProfilesMetadata, genes: metacell.storage.genes.GenesSet, name: str = '')¶ Bases:
metacell.storage.profiles.ProfilesBatch
A batch of profiles where each one is the sum of a group of profiles from some other container.
-
__init__
(*, metadata: metacell.storage.profiles.ProfilesMetadata, genes: metacell.storage.genes.GenesSet, name: str = '') → None¶ Open a view of a profiles groups container for access.
In this case, the passed genes parameter is the full genes, which must match the full genes of the grouped container. The exact used genes are identical to the genes of the grouped container.
-
static
created
(path: str, grouped_profiles: metacell.storage.profiles.Profiles) → None¶ Write the
profiles.yaml
file after creating a profiles groups in some directory.The directory should contain the
p.grouped_count.npy
file with the size of each group.
-
grouped_profiles
= None¶ The open grouped container.
-
metadata
= None¶ The meta-data describing the groups.
-
-
class
metacell.storage.profiles.
ProfilesGroupsMetadata
(**kwargs)¶ Bases:
metacell.storage.profiles.ProfilesBatchMetadata
Per-groups meta-data.
-
container
¶ alias of
ProfilesGroups
-
required_keys
= {'genes_count': <class 'int'>, 'genes_uuid': <class 'str'>, 'grouped_profiles': <class 'str'>, 'grouped_uuid': <class 'str'>, 'organism': <class 'str'>, 'profiles_count': <class 'int'>, 'profiles_kind': <class 'str'>, 'uuid': <class 'str'>}¶
-
-
class
metacell.storage.profiles.
ProfilesMetadata
(**kwargs)¶ Bases:
metacell.storage.metadata.YamlMetadata
Common meta-data for any profiles container.
-
__init__
(**kwargs) → None¶ Create metadata for a batch of profiles.
-
container
= None¶ The (concrete) container of the (derived) class.
-
static
detect_cls
(_cls: Type[YM], dictionary: Dict[str, Any]) → Type[YM]¶ Decide on the concrete metadata class to load from the dictionary.
-
genes_count
= None¶ The number of genes.
-
genes_uuid
= None¶ The set of genes that were measured for each profile.
-
open
(genes: metacell.storage.genes.Genes, *, name: str = '') → metacell.storage.profiles.Profiles¶ Open the actual container for data access.
-
organism
= None¶ The organism the data is for (‘human’, ‘mouse’, etc.).
-
profiles_count
= None¶ The number of profiles this contains.
-
profiles_kind
= None¶ The kind of profiles this contains (‘cells’, ‘metacells’, etc.)
-
required_keys
= {'genes_count': <class 'int'>, 'genes_uuid': <class 'str'>, 'organism': <class 'str'>, 'profiles_count': <class 'int'>, 'profiles_kind': <class 'str'>, 'uuid': <class 'str'>}¶ The keys that must appear in the metadata YAML file.
-
-
class
metacell.storage.profiles.
ProfilesView
(*, metadata: metacell.storage.profiles.ProfilesMetadata, genes: metacell.storage.genes.GenesSet, name: str = '')¶ Bases:
metacell.storage.profiles.ProfilesBatch
A restricted view of some profiles container.
The view is specified using the two optional files,
p.base_index.npy
andgenes.base_index.npy
. If missing, then the view is assumed to use the full profiles and/or genes of the base container.Having a view which uses the full base container data is useful when creating a new collection. Such a “just a link” view allows the collection to refer to an arbitrary existing container, without having to physically copy it into the collection directory. This is different from a symbolic link in that it has different modification times (for
make
-like tools), and allows creating additional computed data inside the view without modifying the original base container.Note
Some data of the base container may not be meaningfully subset-able. For example,
p.total_umis
would be incorrect if the view uses a subset of the genes. By default, the code assumes all data is subset-able, as this allows for each access to barcodes and other meta-data associated with each profile (or gene). To avoid subset-ing computed data, add the name of the data to one ofmetacell.storage.profiles.ProfilesView.GENES_DEPENDENT_DATA
,metacell.storage.profiles.ProfilesView.PROFILES_DEPENDENT_DATA
.-
GENES_DEPENDENT_DATA
= {'g': {'mean_fraction'}, 'gg': {}, 'gp': {}, 'p': {'total_umis'}, 'pp': {'balanced_ranks', 'correlation', 'edge_weights', 'pruned_ranks'}}¶ For each kind (
gp
,gg
,pp
,g
,p
), the names of data which depends on the set of genes.
-
PROFILES_DEPENDENT_DATA
= {'g': {'mean_fraction', 'total_umis'}, 'gg': {}, 'gp': {'fold_in_group'}, 'p': {}, 'pp': {'balanced_ranks', 'correlation', 'edge_weights', 'pruned_ranks'}}¶ For each kind (
gp
,gg
,pp
,g
,p
), the names of data which depends on the set of profiles.
-
__init__
(*, metadata: metacell.storage.profiles.ProfilesMetadata, genes: metacell.storage.genes.GenesSet, name: str = '') → None¶ Open a view of a profiles container for access.
In this case, the passed genes parameter is the full genes, which must match the full genes of the base container. The exact used gene subset is computed based on the base container’s genes, and the content of the
genes.base_index.npy
file, if any.
-
add_into_gp_array
(name: str, profile_index: int, profile_array: tgutils.numpy.ArrayFloat32) → tgutils.numpy.ArrayFloat32¶ Add the requested data of a profile into an array.
-
available_data
(kind: str) → List[str]¶ Return a list of the available data of the specified kind (‘g’, ‘p’, ‘gp’, ‘gg’ or ‘pp’).
-
base_gene_index
(gene_index: int) → int¶ Return the index of the gene in the base profiles container.
-
base_gene_indices
= None¶ The indices of the included genes, or
None
if all genes are included.
-
base_profile_index
(profile_index: int) → int¶ Return the index of the profile in the base profiles container.
-
base_profile_indices
= None¶ The indices of the included profiles, or
None
if all profiles are included.
-
base_profiles
= None¶ The open base container.
-
static
created
(path: str, base_profiles: metacell.storage.profiles.Profiles) → None¶ Write the
profiles.yaml
file after creating a profiles view in some directory.The directory should contain the
base_index
files of the filtered profiles and/or genes.
-
dir_paths
() → List[str]¶ Return the list of directories containing actual UMIs data for the container.
This is just a single path for a batch, and a list for a merged collection of batches. For a view it contains the view’s directory in addition to the base container’s.
-
has_array
(kind: str, name: str) → bool¶ Test whether the container contains some per-gene or per-profile data file.
-
has_matrix
(kind: str, name: str) → bool¶ Test whether the container contains some per-gene/gene, per-gene/profile or per-profile/profile data file.
-
is_slicing
() → bool¶ Whether the view only includes some of the base container’s data.
-
is_slicing_genes
() → bool¶ Whether the view only includes some of the base container’s genes.
-
is_slicing_profiles
() → bool¶ Whether the view only includes some of the base container’s profiles.
-
metadata
= None¶ The meta-data describing the batch.
-
-
class
metacell.storage.profiles.
ProfilesViewMetadata
(**kwargs)¶ Bases:
metacell.storage.profiles.ProfilesBatchMetadata
Per-view meta-data.
-
container
¶ alias of
ProfilesView
-
required_keys
= {'base_profiles': <class 'str'>, 'base_uuid': <class 'str'>, 'genes_count': <class 'int'>, 'genes_uuid': <class 'str'>, 'organism': <class 'str'>, 'profiles_count': <class 'int'>, 'profiles_kind': <class 'str'>, 'uuid': <class 'str'>}¶
-
-
metacell.storage.profiles.
RawMatrix
= typing.Union[metacell.storage.matrices.MemoryMappedMatrix, numpy.ndarray]¶ A matrix of data per profile and gene.
-
metacell.storage.profiles.
grouped_kind
(groups_kind: str) → str¶ Return the profiles kind for the grouped profiles.
-
metacell.storage.profiles.
groups_kind
(grouped_kind: str) → str¶ Return the profiles kind for the profiles groups.
metacell.storage.views module¶
Create profile views.
Module contents¶
Manage disk storage of metacell data.


Image Lucida
Web app for to help create datasets from archival images, 2017-Present
I started working on Image Lucida as my final project at the Nashville Software School. The idea for the app was born out of my frustrations trying to digitize archival materials and extract meta-data from them. I’ve been using for a few years a combination of DevonThink and AbbyFinereader, but I really struggled with basic image file managment (my DevonThink projects would get too large to open) and OCRing files without extracting images.
Image Lucida solves these problems and let’s me fully digitize my research workflow. First, I can create projects and folders with relevant information about what they contain.
Then, I can upload images to AWS S3 instance, transform the images to fix any skewed perspective, add meta-data, and place them in a folder.
Finally, I can process the individual photos using a combination of OCR, manual image segmentation, and automated image segementation. Initially, I had hoped to use just automated image segmentation using a combination of OpenCV and scikit-image, but the newspaper microfilm copies I have were getting really low OCR rates. So now I manually segment the articles out of my newspapers and then process them with Tesseract or Google Vision OCR APIs.
At the end of the process, I now have an archival image that has searchable text, segmented images, and is tagged for later classification.
Image Lucida was initially built in Django, Python, and Angular. I used a dbsqlite and AWS to store everything. The OCR was completed with the Tesseract and Google Vision APIs, and the image segmentation with Pillow, OpenCV, and scikit-image. I’m currently working on deploying the website live on heroku. You can find some of my analysis using Image Lucida in my Depictions of Decolonization project.


DASHBOARD
CATALOGUE
FEELING LUCKY
REVIEWS
YOUR LIST
SIGN-OUT
Sorry, your browser doesn't support canvas. Please try another.


--- kind: article created_at: 2006/11/30 title: CakePHP and HasManyAndBelongsToMany excerpt: Figuring out has and belongs to many for CakePHP. tags: - CakePHP ---
CakePHP is a brilliant framework, but the documentation (like Ruby on Rails) is not always very clear. I usually find it more usefull to get an example then a description.
Now that i've finally figured it out here's an example to fill a selectbox with values from an associated table.
We have to models, Workshop and Workareas. One workshop can have several workareas and one workarea can have several workshops, that means Has and belongs to many for Cake!
We begin with the Workarea model:
array('className' => 'Workshop',
'joinTable' => 'workshop_workarea',
'foreignKey' => 'workarea_id',
'associationForeignKey' => 'workshop_id',)
);
}
?>
Then we have the workshop model
array('className' => 'Workarea',
'joinTable' => 'workshop_workarea',
'foreignKey' => 'workshop_id',
'associationForeignKey' => 'workarea_id',)
);
}
?>
Now here comes the difficult part, the Controller. Since it's a part of a project of mine i'm only pasting the edit action. It should give you enough to make the other actions too.
set('workareas',$this->Workshop->Workarea->generateList());
// If there's no data (i.e. new page)
if (empty($this->data))
{
$this->Workshop->id = $id;
$this->data = $this->Workshop->read();
// Get the selected workareas from the database
$this->set('selected_workareas', $this->getSelectedItems($this->data['Workarea']));
}
// If there is data
else
{
// Check if the admin has selected a workarea
if (empty($this->params['data']['Workarea']['Workarea'])) {
// He didn't so lets show some errors
$this->Workshop->invalidate('Workarea');
$this->set('workareaInvalid', true);
$this->set('selected_workareas', null);
}
// He did
else {
// Populate the workareas from the users's input in case there's a problem saving the page (i.e. there are errors)
// if the lack of workareas triggerd the problem for saving the page do not populate the workareas (he didn't select them anyways)
$selected_workareas = (!empty($this->params['data']['Workarea']['Workarea'])) ? $this->params['data']['Workarea']['Workarea'] : null;
// There is a "magic" array_flip wich makes the selected workareas the right ones and not the array positions (it's a long story)
$this->set('selected_workareas',array_flip($selected_workareas));
}
// If we can save the data
if($this->Workshop->save($this->data))
{
// Redirect to the index
$this->Session->setFlash('Training is gewijzigd.');
$this->redirect('/workshops/index');
}
// If not
else
{
// Show the errors and a nice flashy message
$this->Session->setFlash('Het formulier bevat fouten, corrigeer deze en probeer het opnieuw.');
$this->render();
}
}
}
}
?>
The key is that you have to use an array_flip() to make the fields selected when the page is submitted and there's an error. If you don't use array_flip the array is like: [0]=>1, [1]=>4 and so on. The select uses the indexes (the 0 and the 1) instead of the 1 and the 4. array_flip fixes that.
There's also a function in the app_controller wich prepares the aray you have gotten from the database so it can select the fields as they came from the database.
// A function with uses the input from the hasmanyandbelongsto query and turns it into something usefull (an array with the ID's as the first key and the value as the second to be used in a selectbox)
function getSelectedItems( $data, $nameField = 'name'){
$return = array();
foreach ($data as $row){
$return[$row['id']] = $row[ $nameField ];
}
return $return;
}
And finally the view (well at least the most important part of it)
The if then else function is there because you can't use $this->Workshop->invalidate('Workarea'); The workarea field is called ['Workarea']['Workarea'] instead of ['Workshop']['Workarea']. Thats why i set another value and check it in the view. If that value $workareaInvalid is true, then show the select with the error class, if not then i show the select without it.
Now i'm shure there are some things about my code that i should have done another way, but i spend a lot of hours searching for the awnsers in the google groups and i'm tired right now.


We learned about Helios Voting from a Carleton CS Tea talk by Josh Benaloh. Helios is an open-source internet voting system in active development by Ben Adida and a small community of developers that was built in coordination with Mr. Benaloh. Helios offers an interesting feature set, and is mostly written in Python, which made it an attractive option for exploration. Helios also boasts a number of academic studies, and lots of related literature like Josh Benaloh’s 2006 paper SVE, which introduced the overall structure of a Helios-like voting system. This popularity and access to resources made Helios an attractive option for our foray into socially distanced i-voting. We discuss some of the features that made looking into Helios worthwhile in Helios Basics.


You need the wallet seed to restore this personal wallet.
Write it down and keep them somewhere safe.
To restore this {{index.m}}-{{index.n}} shared wallet you will need
:
Your wallet seed and access to the server that coordinated the initial wallet creation. You still need {{index.m}} keys to spend.
OR the wallet seed of all copayers in the wallet
OR 1 wallet export file and the remaining quorum of wallet seeds (e.g. in a 3-5 wallet: 1 wallet export file + 2 wallet seeds of any of the other copayers).
To restore this {{index.m}}-{{index.n}} shared wallet you will need
:
Your wallet seed and access to the server that coordinated the initial wallet creation. You still need {{index.m}} keys to spend.
OR the wallet seeds of all copayers in the wallet
Wallet seed not available. You can still export it from Advanced > Export.


|
SVG plot
|
Demonstration of a few facets of using the SVG interface directly. More...
#include <boost/cstdlib.hpp>
#include <boost/svg_plot/svg.hpp>
#include <boost/svg_plot/svg_fwd.hpp>
#include <iostream>
#include <vector>
#include <string>
#include <boost/array.hpp>
Functions | |
| int | main () |
| void | symb (boost::array< const poly_path_point, 6 > shape, const poly_path_point position, const poly_path_point size, g_element &g) |
Demonstration of a few facets of using the SVG interface directly.
This only demonstrates a very few of the possible features because most users will only need to use the plot interfaces. But this might provide a little guidance for producing other diagrams and drawings. This module is to demonstrate features of the svg class. It is entirely contrived and has no other conceivable use!
| int main | ( | ) |
| void symb | ( | boost::array< const poly_path_point, 6 > | shape, |
| const poly_path_point | position, | ||
| const poly_path_point | size, | ||
| g_element & | g | ||
| ) |


Full Stack Developer
Originator • Automator
Minimalist
BASED IN PUNE, INDIA
more than 3 years experience in Web Development, software Architecture, SysAdmin Roles & General Software Development.
9th march 2018 - Present
March 2017 to 9th March 2018
March 2017 to Present
Before joining Inkpixels, I was freelancing, in which I worked on an extensive set of technologies with Qsystem Software & Consultancy and Medinisoft. I worked primarily on the Front end and ASP.Net projects. I gave demos and deployments in large companies like Mercedes Benz and Alfa Laval for Automotive Automation.
I can build a UI for your Design.
I can build backend For your App.
I can build your App.


KWDataSourceKit
KWDataSourceKit is a library containing flexible data sources for UITableView
and UICollectionView
. It aims to slim down your view controllers be moving UITableViewDataSource
and UICollectionViewDataSource
to a separate object.
Installation
Embedded frameworks require a minimum deployment target of iOS 8.
KWDataSourceKit is not supported on iOS 7 due to the lack of support for frameworks.
Carthage
Carthage is a decentralized dependency manager that builds your dependencies and provides you with binary frameworks.
To integrate KWDataSourceKit into your Xcode project using Carthage, specify it in your Cartfile
:
github "kupferwerk/KWDataSourceKit"
Run carthage update
to build the framework and drag the built KWDataSourceKit.framework
into your Xcode project.
Using Carthage is the preferred way of integrating KWDataSourceKit into your project.
Cocoapods
CocoaPods is a dependency manager for Cocoa projects.
CocoaPods 0.39.0+ is required to build KWDataSourceKit.
To integrate KWDataSourceKit into your Xcode project using CocoaPods, specify it in your Podfile
:
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0'
use_frameworks!
pod 'KWDataSourceKit', :git => 'https://github.com/kupferwerk/KWDataSourceKit.git'
Then, run the following command:
$ pod install
Usage
KWDataSourceKit
aims to slim your view controllers by removing UITableViewDataSource
and UICollectionViewDataSource
implementations from them. There is some work to be done in your view controller however. Here is an example:
private var dataSource: ArrayDataSource<SomeTableViewCell, String>!
override func viewDidLoad() {
super.viewDidLoad()
dataSource = ArrayDataSource<TableViewCell, Link>(tableView: tableView) { (cell, item) in
cell.textLabel?.text = item.title
}
dataSource.items = ["Lorem", "ipsum"]
tableView.dataSource = dataSource
}
In this snippet of code we have initialized the DataSource
object and configured our UITableView
instance to use it. Depending on the specific type of data source you intend to use, setting everything up may involve some extra work.
ArrayDataSource
ArrayDataSource
can be used to power a UITableView
or UICollectionView
with a single section. It supports uniform array of items which you would like to display in your UITableView
or UICollectionView
.
SectionedDataSource
SectionedDataSource
is very similar to ArrayDataSource
but has support for multiple sections. Each section can have a header and a footer. It’s items
property is an array of Section<ItemType>
. Because of that, items need to be of the same type for all sections.
CoreDataSource
CoreDataSource
makes it easy to display NSManagedObject
s retrieved from Core Data in an UITableView
or UICollectionView
. It works by utilizing Apple’s NSFetchedResultsController
and can automatically update your UITableView
or UICollectionView
once the data in the assigned NSManagedObjectContext
changes. It supports multiple sections through the sectionNameKeyPath
property.
Configuring CoreDataSource
is a little different:
private var dataSource: CoreDataSource<TableViewCell, EntityType>!
override func viewDidLoad() {
super.viewDidLoad()
// The fetchRequest tells the data source which objects
// it should load from Core Data
let fetchRequest = NSFetchRequest(entityName: "Entity")
fetchRequest.sortDescriptors = [NSSortDescriptor(key: "title", ascending: true)]
// We initialize a `CoreDataSource` with the previously configured fetch request
// and a `NSManagedObjectContext` that should be used to execute the fetch
// request. Typically, this is a main queue context.
dataSource = CoreDataSource<TableViewCell, Entity>(fetchRequest: fetchRequest,
inContext: CoreData.sharedController.mainContext,
tableView: tableView) { (cell, item) -> () in
cell.textLabel?.text = item.title
}
// We assign it to the `UITableView`s `dataSource` property
tableView.dataSource = dataSource
// Tell the data source to execute the fetch request and update
// table view
dataSource.loadContent()
}
License
Copyright 2016 Kupferwerk GmbH
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.
Note: The Configuration folder contains a third party project xcconfigs and it’s README.md. The license in that README.md only applies to the contents of the Configuration folder that are part of xcconfigs.


Hiring people to write code to sell is not the same as hiring people to design and build durable, usable, dependable software. --Larry Constantine [Beyond Chaos]


Our mission is to help businesses and teams thrive in the relationship era.
customers worldwide
countries used in
languages supported
We’ve always been obsessed with helping businesses grow and foster how teams of relationship-makers work together.
Back in 2014, that meant reimagining Customer Relationship Management (crm) with removing the “bad stuff” (aka data entry, pricing, admin headaches, clunky interface…).
From the start, we have believed in delivering a different kind of crm: one that’s user centric, works in the tools you use, and ultimately makes building and growing lasting business relationships easier.
Modern teams are looking to find crms that enable them to move beyond data management and eliminate busy work so they can focus on the quality of their customer relationships.
we believe in
A crm that ends data entry
A crm that people will actually use
A crm that works in productivity tools (G Suite)
A crm that is not just for sellers, but for any relationship type
A crm that you can deploy in minutes
A crm that is designed like the tools you love
A crm that works where you work
A crm that adapts to any team
A crm that recommends what to do next
On our journey, we’ve built a home for new breed relationship-makers. A better way to organize and capture all your customer relationship files, docs, emails, sheets and more without the burden of data entry.
We aim to maximize your workday and minimize distraction. So you can focus on what matters.
May 2013
Copper is founded with seed round funding
May 2014
Copper builds native integration with G Suite
August 2015
Copper builds Google Sheets add-on integration
March 2016
Copper is named Google's Partner of the Year
May 2016
Copper builds integration with Google Slides
September 2016
Series B funding with True Ventures, Storm Ventures, NextWorld Capital, Industry Ventures, Devoteam, Financiere Saint James
September 2017
Copper secures series C funding with Norwest Venture Partners, GV, DHVC
February 2018
Copper launches Google Hangouts Chat bot
July 2018
Copper expands to 110 countries and is available in 9 languages
April 2014
Copper adds admin console
March 2015
Series A funding with new investors True Ventures and Bloomberg Beta
November 2015
Became recommended crm on G Suite marketplace
April 2016
Copper reaches 1,000 international customers
August 2016
Copper launches second edition for enterprise businesses
April 2017
Copper is EU-U.S. Privacy Shield certified
November 2017
Copper becomes SOC 2 compliant
April 2018
Copper reaches 10,000 customers
July 2018
Copper defines the Relationship Era
May 2013
Copper is founded with seed round funding
April 2014
Copper adds admin console
May 2014
Copper builds native integration with G Suite
March 2015
Series A funding with new investors True Ventures and Bloomberg Beta
August 2015
Copper builds Google Sheets add-on integration
November 2015
Became recommended crm on G Suite marketplace
March 2016
Copper is named Google's Partner of the Year
April 2016
Copper reaches 1,000 international customers
May 2016
Copper builds integration with Google Slides
August 2016
Copper launches second edition for enterprise businesses
September 2016
Series B funding with True Ventures, Storm Ventures, NextWorld Capital, Industry Ventures, Devoteam, Financiere Saint James
April 2017
Copper is EU-U.S. Privacy Shield certified
September 2017
Copper secures series C funding with Norwest Venture Partners, GV, DHVC
November 2017
Copper becomes SOC 2 compliant
February 2018
Copper launches Google Hangouts Chat bot
April 2018
Copper reaches 10,000 customers
July 2018
Copper expands to 110 countries and is available in 9 languages
July 2018
Copper defines the Relationship Era
What's next...
Dennis Fois
CEO
Carrie Shaw
Chief Marketing Officer
Ben Hance
General Counsel
Eugen Ilie
Head of Growth
Wyndham Hudson
VP Product
Olga Lykova
VP Global Alliances
Kent Holland
VP Sales
Cory Thomas
VP Engineering
Lorraine Dorrow
VP of People