TL;DR
I'm not good at committing to projects long term and find it disheartening when I set out to achieve a goal and lose motivation half way through. Yet I have a very adventurous and persistent personality that drives me to think big and want more for myself. This is something I think is not unique to myself and stops a lot of people from doing more with their time. I have come up with a middle ground that I am happy to experiement with. This led me to making a blog where I am going to test out my theory. This is in of itself one of my 'think big' moments.
I have decided that committing to large unbound challenges has in the past turn into a motivation problem if I wasn't able to execute the way I had imagined. My solution is not to stop thinking big or to take on fewer challenges but instead commit to challenges with an end date in mind and a challenge that I can measure the success of.
Caveat for the skeptics: This is not to say that all things in life should have an out in mind. There are times in life where doing something without an expected end date or looking for ways to constantly measure success is a good thing. And if the challenge in mind doesn't fit this mold it doesn't mean it's not a worthwhile or meaningful goal. First example that comes to mind, raising my kids, the measure of success is constantly changing depending on the season of life my wife and I are in. Some times it's going to be very hard to determine what success looks like. Some times there may not be a clear one. But this doesn't mean it's not worthwhile endeavor. Also I have never and will never set an end date to parenting. Having my two beautiful children and marrying my wife was a decision I made with no end to sight and I'm happy with that decision.
This mold is designed to be broken.
Example
I wanted to cook for my wife more often to give her a break and also because I thought my "culinary skills" could grow beyond Mac N' Cheese and hot dogs. Committing once a week for the rest of my life to cook a meal is noble but what happens when I miss a week? Or my motivation wanes? Building in a end date means there is end in sight to give me hope and push me to what could be a breakthrough in something I might actually find enjoyable.
One Month Of... Challenges
This leads me to my one month of challenges. I am going to attempt to learn or do something different once a month for one year. Each month will have it's own guidelines that are unique to the challenge. I will post at minimum:
- what I am attempting to do,
- how long the it will take (should be just a month but who knows)
- how often I plan on doing said challenge,
- how I plan on measuring the success and
- any guidelines that apply to that month's challenge.
Some examples of things that I could see myself doing are: cooking, art, music, geography, contributing to open source projects, writing, language studies, math, computer science etc...
Basically a lot of what I learned as an elementary student that I didn't find terribly interesting then but now I want to explore more deeply to give myself a more well rounded view of others and myself.
Challenge #1
Pick a subject of learning or an area I feel I am weak and dive into it.
- Duration:
- 1 year.
- Frequency:
- Once a month.
- Measure of Success:
- If after a year I have completed at least 12 challenges, making at least 1 blog post per month at the beginning of the challenge outlining the task and 1 blog post at the end of the challenge with a post-mortem and any number of blog posts in the middle with updates. That will be a success. Anything less is a failure, but that's something that I can live with!
- Additional guidelines:
- This should be fun. I'd hate to push myself for a year and regret doing it. I should also be flexible and open to adjusting my premise and rules. If it doesn't look like I can do a month due to my circumstances I wont feel guilty for skipping or stopping or if it looks like I was wrong and my motivations were more than I've outlined I should be willing to re-evaluate.
What am I doing with this blog? Check it out here. tl;dr I'm doing a challenge every month for a year to learn / do something different. Also If you see any typos or bad grammar feel free to edit this page by submitting a change request. Or email me at<EMAIL_ADDRESS>Until next time!
- JAS


Loading...
Revision visualization of Wikipedia article
„Metal Umlaut“
Created with
Raphaël
—JavaScript Vector Library


@inotom/vue-roll-number demo
default options:
custom block name:
animation duration is 10000ms:
animation duration is 10000ms, animation interval is 100ms:


Trade commission finds U.S. industry injured by Chinese mattress imports
WASHINGTON (Reuters) - The U.S. International Trade Commission on Tuesday concluded that U.S. industry is materially injured by mattress imports from China that are sold at less than fair value, paving the way for the U.S. Commerce Department to impose anti-dumping duties.
The commission in a statement said it made a negative finding regarding critical circumstances regarding the mattress imports, which meant that such imports would not be subject to retroactive anti-dumping duties.
It said a full report would be published by Dec. 30.


The data-interval attribute specifies the delay (in milliseconds) between each slide.
The data-pause attribute pauses the carousel from going through the slides when the mouse pointer enters the carousel.
The data-wrap attributes specifies whether the carousel should go through all slides continuously, or stop at the last slide.


About
Cycle through your content without writing a single line of Javascript. To keep things simple, transition effects are optional and have been limited to slide and cross-fade. In browsers that don't support CSS transitions, jQuery's animate is used.
Keyboard navigation is available when the element has focus. Simply use the left/right arrows keys.
Usage
Setup
Before getting started, make sure everything is setup properly. Below is a basic HTML template to use as an example for including the plugin into your projects.
<!DOCTYPE html>   <title>Looper.js</title> <meta charset="utf-8"> <link rel="stylesheet" href="./path/to/looper.css">
Attention! This is just an example and contains the minimum requirements for including Looper.js into your project. All ./path/to references need to be replaced with proper paths.
Via data attributes
To initialize a plugin instance, simply add data-looper="go"
to your element. Be sure to add the looper
class for proper styling.

 ...

Via Javascript
$('.looper').looper();
Accessing instances
Plugin instances are stored in the looperjs
key on each element's data store and can easily be accessed by using jQuery's data method.
var myLooper = $('.looper').data('looperjs');
Options
Options can be passed via data attributes or JavaScript. For data attributes, append the option name to data-
, as in data-interval="3000"
.
| Name | Type | Default | Description | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| interval | number | 5000 | The amount of time (in milliseconds) to display an item. To disable the auto-loop, set to false . |
||||||||||
| pause | string | hover |
When to pause the auto-loop. Set to
|
||||||||||
| speed | number | 500 | The amount of time (in milliseconds) that corresponds to the CSS transition speed specified in looper.css. This value is used to ensure transitions are completed and as the animation speed for browsers that don't support CSS transitions. |
Methods
All methods can be executed with the data-looper
attribute and require a data-target
or href
attribute whose value must correspond to the ID of a Looper.js element. See below for examples.
- .looper(options)
-
Initializes an instance with an optional options
object
.$('.looper').looper({ interval: 3000 });
- .looper('loop')
-
Starts/resumes the auto-loop.
Via data attribute

 ...

Looper
- .looper('pause')
-
Pause the auto-loop.
Via data attribute
Pause
- .looper('next')
-
Show the next item.
Via data attribute
Next
- .looper('prev')
-
Show the previous item.
Via data attribute
Previous
- .looper('to', position)
-
Show the item at the specified position.
Be aware! The position argument is one-based. A value of
1
corresponds to the first item. Negative, zero and out-of-range positions will be ignored.Via data attribute
Go to item 3
The
data-args
attribute is used to pass arguments to a method.
Events
| Name | Description | ||||||
|---|---|---|---|---|---|---|---|
| init | Fires after an instance has been initialized. | ||||||
| show |
Fires before a new item is shown.
Use |
||||||
| shown |
Fired after a new item has been shown.
|
Transitions
Items can be shown with a sliding and/or cross-fade effect. To apply a transition, simply add the proper CSS class. For a sliding transition, add slide
. For a cross-fade effect, add xfade
. The slide
transition has 3 optional classes: right
, up
and down
. Each optional class corresponds to the sliding direction.
Default slide from the right

 ...

Slide up

 ...

Cross-fade

 ...

Slide down with cross-fade

 ...

Examples
Images for these examples are provided by the amazing lorempixel service.
Basic
The following example will auto-loop through items at the specified duration without a transition.
HTML

Result
Transitions
Slide
This example will auto-loop through items with a slide transition.

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.


Home
Sales Information
Store
Location Name
Minumum customer per hour
Maximum customer per hour
Average cookies sold per customer


Father Of Mine: 15 Fathers Day Songs For People With Daddy Issues
Read More »
VH1 Hosts Four Nights Of Live Music For Brooklyns Northside Festival
Read More »
My Dad Is Cooler Than Yours: 10 Unlikely But Awesome Heavy Metal Fathers
Read More »
Last Lap: What Did Fancy Reagan Do With Its First Taste Of Fame?
Read More »
Make A Band Famous Winners Fancy Reagan Discuss Instant Fame
Read More »


THE CEMETERY CLUB A film review by James Berardinelli Copyright 1993 James Berardinelli
Running Length: 1:46 Rated: PG-13 (mature themes, language)
Starring: Ellen Burstyn, Danny Aiello, Olympia Dukakis, Diane Ladd Director: Bill Duke Producers: David Brown, Bonnie Palef, and Sophie Hurst Screenplay: Ivan Menchell Music Direction: Elmer Bernstein Released by Touchstone Pictures
Esther Moskowitz (Ellen Burstyn), Doris Silverman (Olympia Dukakis), and Lucille Rubin (Diane Ladd) are three aging Jewish best friends. When we meet them in a short prologue, they are all married. Four years later, they're widows. Most recently bereaved, and taking her husband's death the hardest, is Esther. Then, one day at the cemetery, she meets Ben Katz (Danny Aiello) by the graveside of his late wife. Together, after an uncertain period of getting to know one another, they begin exploring what love can be like the second time around.
Like USED PEOPLE, THE CEMETERY CLUB tries to present a romantic comedy centered around the over-fifty crowd. Also like USED PEOPLE, THE CEMETERY CLUB is not wholly successful. Both movies suffer from the same problems: an over-reliance on formulas and a plot that meanders.
The recipe-style storytelling of THE CEMETERY CLUB identifies it as a product of one of the Disney subsidiaries (Touchstone), companies which survive by churning out marginally-watchable films that recycle worn-out ideas. In this case, the only thing new is the age of the main characters. Everything else in this film has been overdone before. Perhaps the most disappointing thing about THE CEMETERY CLUB is that there are no surprises from start to finish. Everything is completely predictable. At least most of the humor, some of which seems out-of-place, is amusing.
There are a few moments which are supposed to be poignant. One, where Esther talks about coming home after her husband's death to find his toothbrush still damp, works. The others, however, are marginally successful at best, including the "big" one near the end. With the exception of Esther and Ben, we don't know enough about these characters to really care what happens to them.
THE CEMETERY CLUB runs out of energy about a half-hour before the final credits roll. Around the time that the plot goes on full automatic, I lost interest. When a film should be building toward something, THE CEMETERY CLUB loses momentum. Pacing is part of the problem, but there's enough blame to go around for the director, writer, and producers.
Don't blame the actors for the movie's shortcomings, however. Ellen Burstyn, taking on her first major film role in a while, does an excellent job fleshing out Esther, and almost manages to singlehandedly pull the movie through its murkiest moments. Diane Ladd and Olympia Dukakis, in what amount to supporting roles, have a good sense of their characters - better, I think, than the audience is ever given an opportunity to see. Danny Aiello does as much as he can with a banal, stereotyped persona.
This movie should have been better. The romance between Esther and Ben doesn't have to follow typical Hollywood form, but instead of crafting something special, the producers opted for the easy way out. Also, the relationship between the three women is bland and incompletely developed. Films like ENCHANTED APRIL illustrate the kind of dynamics that could have been present in THE CEMETERY CLUB. While not a total waste, this picture is a definite disappointment.
Rating: 6.8 (C+, **)
- James Berardinelli<EMAIL_ADDRESS>.
The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


PROJECT 1
Exploded 3D Playstation
A 3D Modeled Playstation, from start to finish. Created with grid paper, Adobe Illustrator, Autocad, Cinema4D, and a lot of time.
Creating the 3D Exploded Playstation 1 meant physically taking apart a PS1, measuring each piece, and creating what is called an "Orthographic Projection" which is a fancy way of saying the top/sides/front in a linear view.


Comet parameter: remove_precursor_tolerance
- This parameter specifies the mass tolerance around each precursor m/z
that would be removed when the remove_precursor_peak
option is invoked.
- The mass tolerance units is in Da (or Th if you prefer).
- Any non-negative, non-zero floating point number is valid.
- The default value is "1.5" if this parameter is missing.
Example:
remove_precursor_tolerance = 0.75
remove_precursor_tolerance = 1.5


Use our proprietary algorythm to search a massive database of hostels with a number of parameters.
Gurantee your stay is a happy one with our user rating system.
Keep track of your favorite hostels and check their deals.
As a hostel owner, use our hostel management dashboard to track everything from the moment your guest checks in.


Widget specific module.
MIT. See LICENSE for full details.
These are common commands that apply to all widgets that have them injected.
Get the widget.
The widget.
Specifies the widget to associate with this item. The widget specified must either be a child of the canvas widget or a child of some ancestor of the canvas widget.
| Widget widget | The widget. |
This item to aid method chaining.
Get the widget width.
The widget width.
Specifies the width to assign to the item's widget. If this option is not specified, or if it is specified as zero, then the widget is given whatever width it requests internally.
| W width | The widget width. |
This item to aid method chaining.
Get the widget height.
The widget height.
Specifies the height to assign to the item's widget. If this option is not specified, or if it is specified as zero, then the widget is given whatever height it requests internally.
| H height | The widget height. |
This item to aid method chaining.


{% extends "base.html" %} {% block content %}
Choose a city to see recent moments with bad air quality.


struct: Ray
Namespace: B3
Assembly: B3.Mathematics.dll
A ray that holds a point and a direction (unit vector / normalized).
Interfaces
Quick Links
Compact Summary
Constructors
| Constructor Descriptions |
|---|
|
public Ray(Vector3 origin, Vector3 direction)
A base constructor for creating a ray. |
|
public Ray(Vector2 origin, Vector2 direction)
A constructor for creating a ray. |
Static Fields
| Modifier / Type | Name and Description |
|---|---|
| static readonly Ray |
Empty
A ray that has no direction and origin at (0, 0, 0). |
| static readonly Ray |
UnitXDir
A ray that has direction (1, 0, 0) and origin at (0, 0, 0). |
| static readonly Ray |
UnitYDir
A ray that has direction (0, 1, 0) and origin at (0, 0, 0). |
| static readonly Ray |
UnitZDir
A ray that has direction (0, 0, 1) and origin at (0, 0, 0). |
Properties
| Modifier / Type | Name and Description |
|---|---|
| Vector3 |
Direction
Gets and sets the direction of the ray, will always be a unit vector. |
| Vector3 |
Origin
Gets and sets the origin of the ray. |
Methods
| Modifier / Type | Name and Description |
|---|---|
| virtual bool |
Equals(Ray ray)
Finds if this ray and the other ray are equal. |
| override bool |
Equals(object obj)
Finds if this ray and the other ray are equal. |
| protected virtual void |
Finalize()
Allows an object to try to free resources and perform other cleanup operations before it is reclaimed by garbage collection. (Inherited from object) |
| override int |
GetHashCode()
Gets the hash code from the ray. |
| Type |
GetType()
Gets the Type of the current instance. (Inherited from object) |
| protected object |
MemberwiseClone()
Creates a shallow copy of the current Object. (Inherited from object) |
| override string |
ToString()
Gets the ray in string form. |
Static Methods
| Modifier / Type | Name and Description |
|---|---|
| static void |
GetPoint(float distance, ref Ray ray, out Vector3 result)
Gets the point in the ray from the given distance. |
| static void |
GetPoint(float distance, Ray ray, out Vector3 result)
Gets the point in the ray from the given distance. |
| static Vector3 |
GetPoint(float distance, ref Ray ray)
Gets the point in the ray from the given distance. |
| static Vector3 |
GetPoint(float distance, Ray ray)
Gets the point in the ray from the given distance. |
| static void |
GetPointFromPoint(ref Vector3 point, ref Ray ray, out Vector3 result)
Gets a point on the ray using an arbitrary point in the world. Projects the given point onto the ray. |
| static void |
GetPointFromPoint(Vector3 point, Ray ray, out Vector3 result)
Gets a point on the ray using an arbitrary point in the world. Projects the given point onto the ray. |
| static Vector3 |
GetPointFromPoint(ref Vector3 point, ref Ray ray)
Gets a point on the ray using an arbitrary point in the world. Projects the given point onto the ray. |
| static Vector3 |
GetPointFromPoint(Vector3 point, Ray ray)
Gets a point on the ray using an arbitrary point in the world. Projects the given point onto the ray. |
Operators
| Modifier / Type | Name and Description |
|---|---|
| static operator bool |
Equality(Ray left, Ray right)
Finds if the two rays are equal. |
| static operator bool |
Inequality(Ray left, Ray right)
Finds if the two rays are not equal. |
Constructors
Ray(Vector3 origin, Vector3 direction)
Static Fields
Empty
A ray that has no direction and origin at (0, 0, 0).
public static readonly Ray Empty;
UnitXDir
A ray that has direction (1, 0, 0) and origin at (0, 0, 0).
public static readonly Ray UnitXDir;
UnitYDir
A ray that has direction (0, 1, 0) and origin at (0, 0, 0).
public static readonly Ray UnitYDir;
UnitZDir
A ray that has direction (0, 0, 1) and origin at (0, 0, 0).
public static readonly Ray UnitZDir;
Properties
Direction
Gets and sets the direction of the ray, will always be a unit vector.
public Vector3 Direction { get; set; };
Origin
Methods
Equals(Ray ray)
Finds if this ray and the other ray are equal.
public virtual bool Equals(Ray ray);
Parameters
The other ray to find if it equals.
Returns
Returns true if the two rays are equal to each other.
Equals(object obj)
Finds if this ray and the other ray are equal.
public override bool Equals(object obj);
Parameters
The other ray to find if it equals.
Returns
Returns true if the two rays are equal to each other.
Finalize()
Allows an object to try to free resources and perform other cleanup operations before it is reclaimed by garbage collection.
[System.Runtime.Versioning.NonVersionableAttribute]
protected virtual void Finalize();
GetHashCode()
Gets the hash code from the ray.
public override int GetHashCode();
Returns
Returns the hash code from the ray.
GetType()
Gets the Type of the current instance.
[System.Runtime.CompilerServices.NullableContextAttribute(1)]
public Type GetType();
Returns
The exact runtime type of the current instance.
MemberwiseClone()
Creates a shallow copy of the current Object.
[System.Runtime.CompilerServices.NullableContextAttribute(1)]
protected object MemberwiseClone();
Returns
A shallow copy of the current Object.
ToString()
Gets the ray in string form.
public override string ToString();
Returns
Returns the ray in string form.
Static Methods
GetPoint(float distance, ref Ray ray, out Vector3 result)
Gets the point in the ray from the given distance.
public static void GetPoint(float distance, ref Ray ray, out Vector3 result);
Parameters
GetPoint(float distance, Ray ray, out Vector3 result)
Gets the point in the ray from the given distance.
public static void GetPoint(float distance, Ray ray, out Vector3 result);
Parameters
GetPoint(float distance, ref Ray ray)
Gets the point in the ray from the given distance.
public static Vector3 GetPoint(float distance, ref Ray ray);
Parameters
The distance to go down the ray to get the point.
The ray used to get the point.
Returns
Returns the resulting point that lies within the ray.
GetPoint(float distance, Ray ray)
Gets the point in the ray from the given distance.
public static Vector3 GetPoint(float distance, Ray ray);
Parameters
The distance to go down the ray to get the point.
The ray used to get the point.
Returns
Returns the resulting point that lies within the ray.
GetPointFromPoint(ref Vector3 point, ref Ray ray, out Vector3 result)
Gets a point on the ray using an arbitrary point in the world. Projects the given point onto the ray.
public static void GetPointFromPoint(ref Vector3 point, ref Ray ray, out Vector3 result);
Parameters
GetPointFromPoint(Vector3 point, Ray ray, out Vector3 result)
Gets a point on the ray using an arbitrary point in the world. Projects the given point onto the ray.
public static void GetPointFromPoint(Vector3 point, Ray ray, out Vector3 result);
Parameters
GetPointFromPoint(ref Vector3 point, ref Ray ray)
Gets a point on the ray using an arbitrary point in the world. Projects the given point onto the ray.
public static Vector3 GetPointFromPoint(ref Vector3 point, ref Ray ray);
Parameters
Returns
Returns the resulting point that is projected onto the ray.
GetPointFromPoint(Vector3 point, Ray ray)
Gets a point on the ray using an arbitrary point in the world. Projects the given point onto the ray.
public static Vector3 GetPointFromPoint(Vector3 point, Ray ray);
Parameters
Returns
Returns the resulting point that is projected onto the ray.
Operators
Equality(Ray left, Ray right)
Finds if the two rays are equal.
public static operator bool Equality(Ray left, Ray right);
Parameters
Returns
Returns true if the rays are equal.
Inequality(Ray left, Ray right)
Finds if the two rays are not equal.
public static operator bool Inequality(Ray left, Ray right);
Parameters
The first ray to find if it's not equal.
The second ray to find if it's not equal.
Returns
Returns true if the rays are not equal.


Beta This is a test version of the layout of this page. Take the survey to help us improve it
Guidance
Information for employers showing the benefits of higher apprenticeships to their business.
This guide gives employers the benefits of higher apprenticeships for their business and information on what the apprentice will qualify as after working for them.
Higher apprenticeships offer a work-based learning programme and lead to a nationally recognised qualification at one of the following:
Over 40 different subjects are currently covered, representing hundreds of job roles.
For a list of higher apprenticeships frameworks available, please visit the apprenticeship frameworks online website .
To find out more on becoming an apprenticeship employer please fill out the enquiry form or call 08000 150 600.


This is a program for the Oculus Rift that allows it's user to practice the drums and other various percussion instruments in a virtualized environment. As a drummer I see a lot of utility in this kind of application; it's very hard to practice the drums due to their price and the fact that they're too loud to be played in most public spaces. This was my first time doing anything with virtual reality or Unity, so the learning curve was a bit steep. The main functionality of the drum simulator is to pick up and hold virtual drum sticks with the hand-held Oculus controllers and play/practice whatever instrument is in front of you. The simulator also includes a marimba so that users could also practice that too. One of the main problems with virtual reality applications is motion sickness. To alleviate that, the simulator features teleportation. The user simply points and shoots at another instrument in the virtual drum room and they are instantly transported to that instrument. We also featured audio recording and playback, and vibration for tactile feedback to the user.
This graphics engine features a simple 2D graphics engine that could be used to make games or animations. I optimized the engine to be able to handle rendering over 10,000 textured sprites at 60 frames per second, and this is on an old computer that only has Intel's CPU graphics. The engine also features the rendering of textured 3D shapes and objects, and a 3D "sandbox" mode that allows the user to have the effect of flying around the 3D rendered world. This project was another on of my earlier projects. I wanted to learn C++ and I thought (correcty) that this would be a fun project. I didn't know what I was getting myself into with graphics programming, so by accident I learned some OpenGL along with the C++.
I made a short film called "Tied" with a group of 4 as a part of the UCBUGG organization at Berkeley. We made the entire thing in Autodesk Maya. This includes modeling, rigging, animating, and rendering. Although this wasn't a programming project, it was very tough to finish and it helped me improve my teamwork skills. The short can be watched here.
For my first big programming project me and one of my friends made a Bomberman emulator entirely from scratch in Snap. This version has both multiplayer and single player options. Multiplayer is full of various advantageous items and power-ups. Single player features many levels with some basic AIs. Overall it was a very fun project that taught me the essentials of programming.
For this project I had to convert an existing PHP/MySQL web api to an Azure/C# web api. Previously the scanner apps had been using another company's Cake PHP based web api to pull JSON data from a MySQL database. Socket Mobile wanted host this web-api/database internally because it would be easier to manage, but Socket Mobile operates through the microsoft ecosystem with Windows servers. Using Azure Tables as a database and C#/ .NET api as the backend would make the most sense. Azure tables are not meant for storing large amounts of data, so I had to compress all of the entries before storing them in the table and decompress them when queried. I made an admin page for database maintanence (primarily adding new model entries). The whole website had authenticated security; I used an SQL database for a list of users and their encrypted/salted passwords. Each user is required to login with their passwords, and only priveledged users were allowed to access the admin page.
This program was used by the Operations team to install and update firmware in the tiny engines inside of the scanners we make. I used C# and implemented the Y-Modem transfer protocal. I configured the program to be as user friendly and efficient as possible; after plugging in the engine to a circuit board, all you have to do is press any button on the keyboard and watch a progress bar. Multiple engines could be programmed simultaneously as well. All in all, it greatly improved the efficiency of programming hundreds of scan engines.
I wrote several Powershell and python programs that upload new scanner firmware builds to Sharepoint. New versions of the firmware needed to be QA tested. The QA testing was handled by another company, and Sharepoint was where they accessed the binaries for the new builds. The powershell part was not too bad because there were libraries that made the whole process relatively simple with a few function calls. I had to use python for other builds that were on a Mac. The python was more difficult because I had to format and send HTTP requests to Sharepoints web-api. I then recieved an authenticated token, which I used for another HTTP request to upload my data to sharepoint. I encrypted the password used for authentification and didn't add it to the repository. The encrypted password file only existed on the build servers themselves.
This was a helper program for the web-api described at the top of this section. The program pulls the raw JSON data from the old web-api, reformats certain entries, compresses the data, and then uses Microsoft's .NET libraries to insert entries into the Azure database.
I created Windows installer applications using WiX (XML). These installers were used for quickly updating test fixtures with the latest firmware builds.
I created a script that made tables mapping HID key codes to key inputs. Each table represented a different keyboard layout (US, International, French, Chinese, etc.). These tables were used in the scanners' "keyboard" mode which allows the scanners to output data being scanned to a computer.
A python compiler written in C++ for CS 164 in a team of 3. Python files are first lexed and parsed to create an "abstract syntax tree", or AST. This part was written in Flex/Bison, which are languages designed specifically for lexing and parsing. The compiler then performs static semantic analysis on the AST; this handles scoping rules and the other semantics defined by Python 2.7. Primarily, this stage tags each variable with a number that represents its declaration (variables with the same name that were declared in a different scope will have different names i.e x-297 and x-300). After static semantic analysis, the compiler generates C++ code using the tagged abstract syntax tree. Most of the common compilers generate assembly code, but generating and then compiling C++ code works fine. The only benefit of going straight to assembly is further optimization of the code. However, optimization is extremely tricky and far out of the scope of an intro compiler class.
PintOS is an educational operating system that I implemented for CS 162 in a team of 4. PintOS is a simple operating system where processes are limited to one thread. We did not implement all parts of PintOS. We implimented a clock system to put to sleep and reawaken threads, synchronization primatives (locks & semaphores), a priority scheduler, an MLFQ scheduler, argument passing for user programs, process control syscalls, file operation syscalls, a buffer cache for disk blocks, an extensible file system, and a directory system. I contributed to all of these parts of the project except for argument passing for user programs (this was done all by another group member). Implementing these features in PintOS was not easy, and it required us to gain a deep level of understanding of core OS concepts.
This database is a simple "dropbox" for data. It stores both encrypted user information and encrypted user data. My design is cryptographically secure and guarantees both integrity and confidentiality. A file placed into the database is only available it's owner and anybody who the owner has shared it with. Since the contents of the database are encrypted, the server cannot learn any information from what is in the database. There is also a public key data store, which is used for sharing access to files. Sharing privileges can also be revoked by the owner of the file. This project was extremeley design heavy. I primarily used RSA encryption/decryption, CFB encryption/decryption, RSA signatures/ verification, and SHA256 MAC. This was also my first and only time using GoLang, which wasn't too hard to learn is actually a very nice programming language.
This was more like a series of 5 mini-projects assigned in CS 188 (Artificial intelligence). Me and my partner designed multiple artificial intelligence "pacman" agents to use a variety of common AI algorithms in a virtual game world. We used BFS, DFS, A* search, minimax, expectimax, reinforcement learning with value iteration, Q-Learning, model-free approximation algorithms, particle filtering, and machine learning.
These are two separate projects that I completed for CS 168 (Internet Architecture). I implemented the logic for a Distance-Vector router in python. This DV router receives distance vectors from other routers and updates its routing table appropriately. The router also transmits its own DV to all other immediate neighbors as soon as any of its routes change. It avoids routing loops by using Poisoned Reverse and Split Horizon. I also implemented a slighty simplified version of TCP. This implementation is capable of handing the 3-way handshake, receieving data both in-order and out of order, sending data, adjusting the send window based on the advertised window, retransmissions, and both a passive and active connection close.


Chapter 3 OCD-NET therapist manual
3.1 What is OCD-NET?
The treatment in OCD-NET is based on established treatment protocols for OCD (Foa, Yadin, and Lichner 2012), and focuses on exposure with response prevention (ERP). This means patients do most of the active treatment work away from their computer or mobile device, for example when they are performing exposure and response prevention exercises.
3.1.1 Who is suitable for OCD-NET
OCD-NET has been developed to treat adult patients with OCD. In previous trials evaluating OCD-NET, participants have had comorbid conditions such as depression and anxiety, while autism spectrum disorder, psychotic symptoms and substance use disorder have been exclusion criteria.
The intended use of OCD-NET is within a stepped-care model where patients are offered low-intensity treatments as a first step, see the NICE-guidelines. We therefore recommend that OCD-NET is primarily used for patients with mild to moderate symptom severity without comorbid autism spectrum disorder, psychotic symptoms, or substance use disorder.
3.1.2 Presenting OCD-NET as an option to the patient
It is important to stress that previous trials of OCD-NET have been conducted on patients that have actively requested internet-based treatment when giving this option. Thus, forcing someone to undertake a treatment they do not agree with is unhelpful at the very least and can also be harmful.
With that in mind, we believe there are two particularly strong arguments for the use of OCD-NET rather than face-to-face therapy: patients can access the treatment content and therapist therapist support whenever they want to, and treatment can start right away rather than after a waiting time.
We have also found that many patients like to contribute to research and the development of new treatments. For example, most patients will see the benefit of evaluating remote treatment options.
Other suggestions:
- Write your first message on the first day of treatment to welcome the patient and notify them of ways to contact you with questions
- Provide encouragement throughout treatment to motivate the patient and establish a therapeutic working alliance
3.1.3 Modules in OCD-NET
There are 10 modules in OCD-NET, which patients are expected to complete in 12 weeks. Each module consists of texts and uses well established evidence based interventions for OCD, with exposure and response prevention (ERP) being the core intervention. To progress to the next module participants have to complete homework assignments (such as reading text material, answering a quiz at the end of each module, completing worksheets, or report about ERP exercises) which are viewed by their therapist.
| Treatment module | Content |
|---|---|
| 1. Introduction to the treatment | Introduction to CBT Information about OCD |
| 2. A CBT model of OCD | Psychological model of OCD with patient examples |
| 3. Thinking mistakes in OCD | Common cognitive biases and unhelpful interpretations of thoughts in OCD |
| 4. Introduction to ERP | Goal setting Planning ERP exercises |
| 5. More about ERP | Best practices in ERP |
| 6. Imaginal exposure | Instructions to get started with imaginal exposures |
| 7. Re-exposure | Undoing habitual compulsions |
| 8. Difficulties during treatment | Common problems in ERP Motivation traps |
| 9. Long term goals and values | Increasing valued behaviours Aligning ERP exercises with long term values |
| 10. Summary and wrap up | Maintaining progress Relapse prevention |
We view modules 1, 2, 4, and 5 as the core modules in OCD-NET. Modules 1 and 2 consist of two essential features: the patient needs to report at least some intrusions/compulsions in the OCD diary, and the patient needs to understand the CBT model of OCD. These two features are the building blocks for the subsequent ERP exercises in module 4 and 5. We usually recommend patients to do modules 1-5 in a relatively quick pace in order to get to the active treatment as soon as possible. It is not crucial to have a detailed plan for each ERP exercise before starting; you should encourage patients to get started and fine-tune ERP exercises as they go along.
You can consider modules 3 and 6 as optional for the patient. We advise all our patients to read the text in module 3 (thinking mistakes), but if the patient does not feel that this cognitive intervention is relevant for them, we proceed directly to module 4 (ERP). Module 6 (imaginal exposure) may be beneficial for some patients but our experience is that many patients skip this intervention. Although the text is written from a habituation lens, we often tell our patients that imaginal exposure may be a tool to learn that having a thought or image is not the same as acting that way, and to tolerate uncertainty.
The number of completed modules is not an essential predictor of treatment outcomes in OCD-NET. We have two goals only: get the patient to module 5 and get the patient to do a lot of ERP exercises. Thus it is not essential that the patient progress through all modules as long as he/she does ERP and reports this frequently to the therapist. Patients will gain access to all modules at the end of treatment, and will be able to log onto the platform for one year after completing the OCD-NET treatment. Thus, the role of the therapist is to encourage the patient to do ERP exercises and help them to design and evaluate ERP exercises effectively.
Modules 6-9 can be opened in any order to fit the needs of each patient. For example, a patient might not have any use of imaginal exposure but finds that they have a hard time refraining from habitual compulsions. In that case, you may open up module 7 (re-exposure) instead of module 6 (imaginal exposure). Other patients may struggle with ERP exercises and will find module 8 (difficulties during the treatment) useful. Use your clinical intuition.
3.2 Closing remarks
We hope that you have found this therapist guide useful. Our goal has been to present a few ideas about how to deliver OCD-NET effectively. These are just the first building blocks and you will likely find that adaptations are needed to your particular patients and your own style as a therapist.
We strive to continuously update and improve this material and would appreciate any feedback. You can reach us at<EMAIL_ADDRESS>or talk to us in person at a training session.


--- layout: post title: "[UPDATE] Another Update But This Time with VIDEOS" date: 2020-03-24 01:45:00 -0400 background: '/img/posts/07-hacksmith.jpg' ---
Today, we bring you the long awaited videos of our product in action! After many late nights and hard work in the Hacksmith shop, our product is finally ready for some test prints. Before we get to those videos though, let's quickly talk about changes that have been made and also the plans for the few days remaining before the symposium.
As we have gone through the building process, we have gone through many changes, some of which have been discussed in previous blog posts. The biggest changes recently pertain to the heating element of the machine. The heat gun and plenum combination we had intended to use did not pan out like our simulations predicted. The heating was very uneven across the plastic and we were unable to form with it. We were luckily able to source a heater from Hacksmith and now our product is equipped with a beautiful radiant heater that heats the plastic quickly and evenly.
Another major change was the locking mechanism for the plastic. It has been changed from two plates that are clamped together to wood that has been cut to have a forming area and handles. The plastic is held in place in the forming area with a metal shield that is locked with thumb screws.
The final noteworthy change is the spindle design. There were many issues with the spindle design impeded functionality, but a redesign was done to bring the components closer together to reduce the moment arm. With this change, the product is performing well except for the rare occasion wherein the motor melts the 3d printed parts. In order to prevent this from happening in the future, the spindle parts are being printed with PETG instead of PLA.
As for the coming days, we definitely intend to do test prints, but we also wish to improve performance so we have ordered new and better parts for the spindle. We are in the process of rebuilding the spindle with the new parts and hope to drastically improve the stability and reduce the build times.
Now, on to the fun stuff! We have two time lapse videos of our bed being shifted into the desired position. Look at Formagine Alpha go!
Hopefully, in the next post we will have some beautiful test prints to show you! Please look forward to them :D
Yours Truly,
Formagine


Arthur's CSS Site
Home Page
Cascading Style Sheets, fondly referred to as CSS, is a simple design language intended to simplify the process of making web pages presentable. CSS handles the look and feel part of a web page. Using CSS, you can control the color of the text, the style of fonts, the spacing between paragraphs, how columns are sized and laid out, what background images or colors are used, layout designs,variations in display for different devices and screen sizes as well as a variety of other effects. CSS is easy to learn and understand but it provides powerful control over the presentation of an HTML document. Most commonly, CSS is combined with the markup languages HTML or XHTML. Advantages of CSS CSS saves time − You can write CSS once and then reuse same sheet in multiple HTML pages. You can define a style for each HTML element and apply it to as many Web pages as you want. Pages load faster − If you are using CSS, you do not need to write HTML tag attributes every time. Just write one CSS rule of a tag and apply it to all the occurrences of that tag. So less code means faster download times. Easy maintenance − To make a global change, simply change the style, and all elements in all the web pages will be updated automatically. Superior styles to HTML − CSS has a much wider array of attributes than HTML, so you can give a far better look to your HTML page in comparison to HTML attributes. Multiple Device Compatibility − Style sheets allow content to be optimized for more than one type of device. By using the same HTML document, different versions of a website can be presented for handheld devices such as PDAs and cell phones or for printing. Global web standards − Now HTML attributes are being deprecated and it is being recommended to use CSS. So its a good idea to start using CSS in all the HTML pages to make them compatible to future browsers. Offline Browsing − CSS can store web applications locally with the help of an offline catche.Using of this, we can view offline websites.The cache also ensures faster loading and better overall performance of the website. Platform Independence − The Script offer consistent platform independence and can support latest browsers as well. Who Creates and Maintains CSS? CSS was invited by Håkon Wium Lie on October 10, 1994 and maintained through a group of people within the W3C called the CSS Working Group. The CSS Working Group creates documents called specifications. When a specification has been discussed and officially ratified by W3C members, it becomes a recommendation. These ratified specifications are called recommendations because the W3C has no control over the actual implementation of the language. Independent companies and organizations create that software. NOTE − The World Wide Web Consortium, or W3C is a group that makes recommendations about how the Internet works and how it should evolve. CSS Versions Cascading Style Sheets, level 1 (CSS1) was came out of W3C as a recommendation in December 1996. This version describes the CSS language as well as a simple visual formatting model for all the HTML tags. CSS2 was became a W3C recommendation in May 1998 and builds on CSS1. This version adds support for media-specific style sheets e.g. printers and aural devices, downloadable fonts, element positioning and tables. CSS3 was became a W3C recommendation in June 1999 and builds on older versions CSS. it has divided into documentations is called as Modules and here each module having new extension features defined in CSS2.


|
SmartBox-Sortic
SmartFactory
|
The SmartFactory_Box-Sortic is an implementation from the SmartFactory project for Sortic.
SmartFactory_Box-Sortic is a SmartBox which can detect its fill level. It knows if it must be emptied or filled and communicates this information wirelessly to its environment using the SmartFactory_MQTTCommunication-component.
Multiple nested Finite State Machines (FSM) based on the pattern of the ArdFSM are used to control these processes.
The implementation of the SmartFactory project for Sortic looks like this:
The associated repositorys are:
SmartFactory_MQTTCommunication
The source code is written in C++. To achieve this project, the following listed tools and technologies were used.
Doxygen is used for the documentation of the source-code.
An intorduction to Doxygen and how to install it can be found in the ArdFSM-Repo.
The used IDE is VSCode with the PlatformIO-extension.
For a description of the MQTT-Technologie take a look at the MQTTCommunication-ReadMe.
To build a SmartBox the following hardware is needed:
For detailed building instructions please contact Felix Nyffenegger.
All functions and files are documented on the GitHub-Page with Doxygen.
The documentation includes also the MQTTCommunication-Files.
It is important to mention that all functions are non-blocking and as short as possible so no other process starves. This way a degree of parallelism can be achieved.
Click on the image to open doxygen-documentation.
Extern Libraries:
Click on image to open doxygen-documentation.
In MainConfiguration.h are all important settings for the box defined:
In SensorConfiguration.h are all settings for the Sensors defined:
The SmartBox communicates via the SmartFactory_MQTTCommunication to an MQTT-Broker that distributes the messages. The communication works by subscribing to various topics. The subscribed topics change depending on action and position of the box. The topic-tree looks like this:
The box is constantly subscribed to the topics: error, Box/error, Box/box.id/error and also always publishes its status to Box/box.id/status.
More information about the communication process and the complete procedure is documented in SmartFactroy-Sortic-ReadMe.
For an handshake with a vehicle the topic Box/box.id/handshake is used. The confirmation of the new position is sent from the vehicle to the Box/box.id/position.
/>
So that the box knows what it has loaded, it subscribes itself to the topic Sortic/Handover.
It updated its loading information if a valid message is received.
/>
This repository is designed specifically for Sortic. You can still use it, if you follow the rules below:
- Use the same Handshake and Communication-Sequence for your carrier as documented in SmartFactory-Sortic and Communication.
All open ToDo's can be found in the Documentation on the GitHub-Page
V 1.0 - Release BA FS19 - Luca Mazzoleni
MIT License


Delivering a Powerful Customer Experience with Zoom
Wednesday, August 11 11am PT | 2pm ET
In today’s world, customer experience is as important,
if not more important than the products and services you
sell. In this live webinar, we will live demo the ways
you can deliver world-class customer service using the
Zoom platform.
Get on the Guest List
|


Traintown U.S.A.
Transporting passengers all over the country!
Train Schedule
Name
Destination
Frequency (in minutes)
Next Arrival
Minutes Away
Add Train
Train Name:
Destination:
First Train (HH:mm military time):
Frequency:
Submit


Broadcaster
Create Account
Sign In
Sign In With Your User Account
(Don't have an account? Sign-up first)
Username
Password
Sign In


This is the main page of the site, which will link to the photo descriptions, and the shop.
At the moment there is a page and an image gallery and the rudiments of a shop


--- layout: archive title: Zulip Chat Archive permalink: /stream/113488-general/topic/eq.2Erec.20goal.html ---
If my goal is
eq.rec (finsupp.prod g₂ (λ (r : R) (n : ℤ), minimal_value_group.mk v₂ r ^ n)) _ = finsupp.prod g₂ (λ (r : R) (n : ℤ), minimal_value_group.mk v₂ r ^ n)
then did I take a wrong turn or is there some easy way to finish this?
If both sides are definitional equal then you can just apply refl
. Proof irrelevance in definitional equality allowseq.rec
to compute as long as the data fits.
So the _
(before =
) may be an arbitrary proof, even a variable. Still eq.rec
can reduce by computation, Lean will interpret an arbitrary proof as refl _
as this always fits
I tried refl
and it didn't work, that's why I posted here :-/
dsimp
takes me to
⊢ eq.rec (finsupp.prod g₂ (λ (r : R), pow (minimal_value_group.mk v₂ r))) _ = finsupp.prod g₂ (λ (r : R), pow (minimal_value_group.mk v₂ r))
I haven't got my head around the goal really.
 Is this possible?
@Patrick Massot I am scared I am running into problems because of that structure with a new type in the data.
you haven't really said all that is needed to identify the problem
eq.rec
hides a lot of info
https://gist.github.com/kbuzzard/75f316bccc64cb17f5217e02e364b4e8
what is the type of the argument in the _
?
What's an easy way to find this out?
I don't understand the goal.
possibly suffices h, change eq.rec (finsupp.prod g₂ (λ (r : R), pow (minimal_value_group.mk v₂ r))) h = _
invalid 'eq.rec' application, elaborator has special support for this kind of application (it is handled as an "eliminator"), but expected type must not contain metavariables ?m_1
If you can explain what the goal means then I can think about the maths and try and figure out what I have done.
The goal appeared when I had a term in a quotient group and I applied the induction
tactic on the term.
well this is the problem with eq.rec
terms, they don't give enough information to be reconstructible
Hmm.
Maybe cases
would have been a better tactic.
this is the fault of a simp
or rw
somewhere
does @@eq.rec (λ
(g :
@valuation.minimal_valuation.parametrized_subgroup.Γ.{u₁ u₂} Γ₁ _inst_5
(@valuation.minimal_value_group.{u₁ u₂} R _inst_4
(λ (a b : R), classical.prop_decidable (@eq.{u₁+1} R a b))
Γ₁
_inst_5
v₁)),
@valuation.minimal_valuation.parametrized_subgroup.Γ.{u₁ u₃} Γ₂ _inst_6
(@valuation.minimal_value_group.{u₁ u₃} R _inst_4
(λ (a b : R), classical.prop_decidable (@eq.{u₁+1} R a b))
Γ₂
_inst_6
v₂)) _ h = _
work?
cases
doesn't work but perhaps I need to think about the moment the term appeared and try something less naive.
for the term in the change
That looks like a constant function, meaning you tried to cast a term across an equality of types
type mismatch at application eq.rec ?m_2 h term h has type is_equiv v₁ v₂ but is expected to have type ?m_1 = ?m_2
did you suffices h,
?
So the goal originally had an eq.rec
with one of the g2's replaced by a g1, and I thought "I don't understand that goal, maybe it's just a stupid way of saying the two terms are equal".  So I did a rewrite inside an eq.rec and that's what has burnt me.
can you show more context? What's the proof
that goal doesn't look that bad, you are just proving an equality
This was the goal:
eq.rec (finsupp.prod g₁ (λ (r : R) (n : ℤ), minimal_value_group.mk v₂ r ^ n)) _ = finsupp.prod g₂ (λ (r : R) (n : ℤ), minimal_value_group.mk v₂ r ^ n)
and then I wrote the "suffices" stuff above
no no, like 6 steps before this
how did we get here
this isn't very MWE so give some more context
induction g
was where things started to go wrong.
g
is an element of a quotient group.
I have no idea what g
is or what induction
is proving
but I wanted to get an element of the top group
and the eq.rec
is the assertion that my argument is independent of the choice of lift.
 I guess that will help more.
-- Notes: if v1 equiv v2 then we need a bijection from the image of v1 to the -- image of v2; we need that the supports are the same; we need that -- the minimal_value_group for v2 is isomorphic to the subgroup of Gamma_2 generated -- by the image of the stuff not in the support. -- Theorem we almost surely need -- two equivalence valuations have isomorphic -- value groups. lemma minimal_valuations_biject_of_equiv {R : Type u₁} [comm_ring R] {Γ₁ : Type u₂} [linear_ordered_comm_group Γ₁] {Γ₂ : Type u₃} [linear_ordered_comm_group Γ₂] (v₁ : valuation R Γ₁) (v₂ : valuation R Γ₂) (h : is_equiv v₁ v₂) : (minimal_value_group v₁).Γ → (minimal_value_group v₂).Γ := λ g, begin induction g with g g₁ g₂ h12, exact finsupp.prod g (λ r n,(minimal_value_group.mk v₂ r) ^ n), cases h12 with h12 hoops, swap,cases hoops, -- If φ1 is the function from R to Γ1 which is v1 away from the support and -- sends the support to 1, then φ1 extends to a group hom Z[R] -> Γ1 (free ab group on R) -- and h12 is the hypothesis that g₁⁻¹g₂ is in the kernel, so g₁ and g₂ get sent to -- the same element of Γ1. We need the analogous result for φ2. convert rfl, suffices : finsupp.prod g₁ (λ (r : R) (n : ℤ), minimal_value_group.mk v₂ r ^ n) = finsupp.prod g₂ (λ (r : R) (n : ℤ), minimal_value_group.mk v₂ r ^ n), subst this, swap,sorry, simp, dsimp, -- I am in eq.rec hell end
Instead of induction g
I could perhaps have used some more suitable approach for working with quotient groups.
you are constructing a function by tactics?
oh oops
this isn't a lemma
oh yeah
good catch. It used to be a lemma.
dammit
I see, you should have used quotient.lift instead of this induction/cases business
even if this worked I wouldn't be able to prove anything about it.
Yes. Do you remember that a few weeks ago I constructed my own quotient types just by using sets of equivalence classes?
And I said "look what I did, what's all this quot axiom stuff?"
and people made comments about computability that I didn't understand.
What is (minimal_value_group v₁).Γ
?
is it a quotient?
or more to the point, shouldn't it be hidden behind an API?
Yes
https://leanprover.zulipchat.com/#narrow/stream/113488-general/topic/why.20is.20quot.20an.20axiom.3F
Can you see that the proof...erm...construction is full of comments? I was just trying to run at it and make notes to see what API I need.
The top down approach, frowned upon by you guys.
I'm not as good as you at working out what API I need, I just try and prove the thing I want and let the API come later when I get stuck.
well, minimal_value_group
sounds like a thing you want to have an abstract characterization of
if it's defined as a quotient, then probably there is a lift like theorem about it, possibly slightly different than the one lean gives you
what's the math story here?
The notes above the theorem are intermediate results which I realised I needed precisely because I was getting stuck. There is more than one sorry in the proof.
There is a set-theoretic issue in the definition of a perfectoid space and it is one that we have already talked about at length.
right
minimal_value_group
is the resolution, and it has a UMP that you put some blood/sweat/tears into
use it
A valuation on a ring R is a pair consisting of an abelian group G in an arbitrary universe and, lying slightly, a map from R to G.
The blood sweat and tears was replacing G by a group G' in the same universe as R and proving that the new valuation was equivalent to the old one.
I am trying to prove a random thing about this equivalence that I am not ready for, but my idea is that proving it tells me more about the API I need.
So G' is minimal_value_group
right?
You say replacing G by G', what is the relation between them
Let's say two valuations on R are isomorphic if the G's are isomorphic and the diagram commutes.
I am trying to prove that if two valuations are equivalent, then the associated minimal valuations are isomorphic.
aha, okay, that sounds like an easy consequence of the right UMP
If R were a group and v were a group homomorphism (which it may as well be for the purposes of this discussion) then the minimal valuation group would be the image of R under v
wait that's exactly wrong
the minimal valuation group would be the quotient of R by the kernel of v
which is in R's universe
there should be some kind of commutative diagram here
like a map factors through this minimal valuation
I think what I need is a second "minimal" valuation which is the thing I just said, replace G with the subgroup which is the image of R
didn't you already do that?
I never introduced the second one.
Given R,G,v I made G1 := R/ker(v)
(here R is a group)
(and v a group hom)
but I never made G2 := im(v)
and I think that I must need it.
we don't need it
Oh great!
they are iso, right?
Yes
what we need is the UMP associated to G1
I see.
if you have a suitable map out of R, it factors through the valuation to make a map out of G1
I proved that (v,G) and (v1,G1) were equivalent
or something like that
but I need more.
This is really annoying. I might need G2.
this should all be a consequence of the fact that you defined G1 := R/ker(v), just unfold what those things mean
The definition of equivalent is really crappy. v:R->G and w:R->H are equivalent if the image of v and the image of w are isomorphic via an isomorphism that makes the diagram commute.
sounds fine to me
the problem is that this involves images
although maybe it might be good to have the one directional version, make a category kind of setup
because then you can talk about initiality
Actually, another problem is that not even this is the definition, this is a lemma which I am only now realising I need.
Dammit the underlying problem is exactly this "mathematicians don't know how to write an API" issue. I write something down and then because so many things are trivially true and their proof does not even need mentioning, I can lecture on it assuming a whole bunch of stuff (like the first isomorphism theorem) and not even notice what I am using.
I can see exactly which lemmas have content and it's those that I prove in a lecture
You have a category of valuations and valuation morphisms, where the homs v -> w are ordered group homs f : G->H such that v o f = w
but you want me to prove all the content-free ones.
Is there an issue with this approach because the valuations can take values in an arbitrary universe?
you don't have to define this category explicitly, but you should keep it in mind to state the facts
But you're right, this is exactly the thing I should be thinking about. I have not defined a morphism of valuations.
as long as you don't try to define the category, the universe thing shouldn't matter
But I need to define the morphisms because I am using them again and again.
and an iso in this category should be an equivalence of valuations
It's worse than that
and the minimal valuation is an initial object in the category
An iso in this category is an isomorphism of valuations
The equivalences are the ones for which the underlying map G -> H is an injection
no it's not even that
the equivalences are ones for which the underlying map G -> H induces an isomorphism v(R) -> w(R)
The problem is that these groups are "too big" in general
so isomorphism is too strong
We only care about the image of R
hence the notion of equivalence
why isn't that the same as I said?
Because if G=R and H is a far larger group containing R and both v and w are the obvious maps
for the condition v o f = w only the value on elements of R matters
but there's no map H -> G
which is the identity on G. Groups are harder than that.
I see, so you want f : v(R) -> w(R) but otherwise it should be the same
is v(R) a subgroup?
yes
I am talking about a toy model where R is a group and v is a group hom
The truth is that R is a ring, G is an ordered group, v goes from R to G union {0} and satisfies some axioms
but that's not the problem as far as I am concerned.
I think the underlying problems I have are all present in the toy model.
so does it work like I said?  But you said homs are f : G -> H such that v o f = w I think
and now isos are equivalences of valuations
yes
It's a strange category because the f's are not defined on the full groups but this is the way to think about it I think
now there are some issues because functions on images are not nice in lean
I think it's important to let G and H be as big as you like, because we don't want to write "WLOG v is surjective" everywhere.
that's fine, I think, as long as the homs take this into account
[in the real model, the "image" is actually the subgroup of G generated by v(R') where R' is the subset of R consisting of elements r such that v(r) is not zero]
But I have never once used this image, or even defined it.
then what is f?
do you let it be 0 outside or something?
I consistently use the quotient of the free abelian group on R -- the thing in the right universe.
There's an auxiliary function v' which is defined to be v on R' and if v(r)=0 then v'(r)=1.
I then look at the map from the free abelian group on R to G extending v' and the minmal value group is the quotient of the free abelian group on R by the kernel of this map.
I only mention these technicalities because you mentioned the image as being hard to work with and actually we have something more complicated than the image. But note that I never constructed the image. We can look at the subgroup of G generated by v' but this object, which is isomorphic to the minimal value group, has never been mentioned before.
in a lot of ways the coimage is actually easier to work with
The coimage is what we have, right?
The quotient of the free ab group by the kernel?
yes, seems like
When I was saying "pretend R is a group" earlier I was thinking "replace R by the free abelian group on R'"
so it sounds like now instead of f : v(R) -> w(R) we have f : R*/ker(v) -> R*/ker(w)
where R*
is the free ab group
So we need the coimage because it's in the right universe.
yes that's it
We should make R*
the free abelian group on R
, because R' depends on v, but this is OK.
and now v o f = w becomes what?
the obvious diagram commutes
wait that's true by definition
no it isn't
There's a canonical map from R*
to R*/ker(v)
and one from R*
to R*/ker(w)
and that's the diagram we want to commute
Before, we had v : R -> G which restricts to v : R -> v(R). Now we are using the coimage, which is isomorphic, so there should be another canonical construction
we are only allowed to write down maps from R*/ker(v)
to R*/ker(w)
which commute with the two canonical projections
(projection the way mathematicians use the word)
oh, I see, and that's all that's necessary?
I think so
okay, so now initiality says that we have v1
such that for any other v
there is a map R*/ker(v1) -> R*/ker(v)
and that should be min_value_group
I don't think it's quite like that.
Given v, the min-value-group for v is R*/ker(v)
there's an induced valuation v_min:R->(R*/ker(v)) union 0
that's the min valuation associated to v. We love it because it lives in a sensible universe.
What I want is that if v and w are equivalent
which means that the images v(R*)
and w(R*)
are isomorphic in a way that makes the diagram commute
then v_min
and w_min
are now equal
and it was in proving this that I got my eq.rec
goal
No!
I wasn't proving anything.
You are telling me that what I should be proving is that ker(v)=ker(w)
but if I follow my nose then I end up proving that the images are isomorphic
So if v : R -> G and w : R -> H, we have the min-value-group R*/ker(v)
, and another valuation vmin : R -> R*/ker(v)
. Initiality is saying that if w respects v in some sense, then there is a group hom lift w : R*/ker(v) -> H
This should translate into a proof that the coimages are isomorphic
I think w respects v should be something like ker(v) <= ker(w)
, which can be translated to something about w and v directly
yes
<=
is a set-theoretic containment I assume
in this free abelian group R*
in the lattice of subgroups, yes
right
So this more general notion of "respecting v" is defintely not in the repo.
I don't think it needs to be given a name and everything, it's just the side condition on lift
The paper says "two valuations are equivalent if im(v) is isomorphic to im(w) in a way that makes the diagrams commute"
I'm not thinking about equivalent valuations just yet here
No you're working with a general morphism
once you have this lift function, it should be easy to prove the thing about equivalent valuations, just lift wmin
I read the paper and I read it as "coim(v) is isomorphic to coim(w) in a way that makes the diagrams commute" because I can rewrite canonical isomorphisms -- the mathematician's superpower.
and "isomorphic in a way that makes the diagrams commute" is the same as "equal"
It's incredible how much of a kerfuffle it is to get this into dependent type theory. I need to disassociate images and coimages in my mind. Because the coimage is a quotient you have specific tools for writing functions on it and I should use these tools.
It's like the category of open subsets of a topological space again. It's extremely similar in fact. I regard id' U
and U
as _equal_ but you regard them as distinct but isomorphic elements of this category.
I am not sure that making this distinction ever helps you in mathematics
but it certainly helps you in dependent type theory.

Then I try to use the fact that they're _equal_ when defining a map on sheaves and get into all kinds of trouble in dependent type theory, which I do not see in mathematics.
This has been very helpful, many thanks Mario. I am back thinking seriously about the perfectoid project now and goodness knows how long I would have spent stuck on this issue had your comments not clarified how someone who knows type theory properly thinks about these questions.
@Patrick Massot I think my fears are unfounded. I just don't have enough API yet.
The problem with things being equal in the material set theory sense is that it tends to make the wrong distinctions, like id' U = U but coimage(v) != image(v)
If you want to be able to talk about equality when you mean isomorphism, you have to have some kind of background formalism that mimics DTT in some ways
because isomorphism doesn't mean unique isomorphism, and there are plenty of examples where the collection of all isomorphisms X -> Y has interesting structure
oh god what hell is this discussion
@Kevin Buzzard If you gave me an MWE then I might be able to solve it
It's all pushed to the perfectoid project, in valuations.lean. But I know what I have to do, and it doesn't really involve solving this problem. It involves making more API and not typing induction g
to get an element of G from an element of G/H.
Do you know that rintro
is very useful when working with quotients?
This is a complete XY problem. You only got to eq.rec because you used induction
on a quotient.
I know
but I knew that I needed some more API so I've been working on that instead.
great
Patrick suggested using rintro which I'm sure is better, but I could see that there was no point proceeding anyway because I couldn't prove the thing which reduced me to the eq.rec hell anyway, so I thought I'd work on that instead (Huber 1.27 or so)
{% endraw %}Last updated: Apr 24 2020 at 19:02 UTC


__MSG__ASSIGN_A_LOCATION__
__MSG__CLOSE_DIALOG__
__MSG__CONTENT_WILL_BE_INCLUDED_IN_THESE_LOCATIONS__
__MSG__GROUP_WILL_BE_INCLUDED_IN_THESE_LOCATIONS__
__MSG__USER_WILL_BE_INCLUDED_IN_THESE_LOCATIONS__
__MSG__SELECT_LOCATION_OR_SEARCH__
__MSG__SAVE__
__MSG__DONT_SAVE__
__MSG__LOCATION_SAVED__
__MSG__LOCATION_SUCCESSFULLY_SAVED__