예제 #1
0
        private LayoutChoice_Set make_randomParticipations_layout()
        {
            List <Participation> participations = this.Participations;

            int availableCount = participations.Count;

            if (participations.Count < 1)
            {
                return(this.Get_NoParticipations_Layout());
            }

            // randomize the first few participations
            int numParticipationsToShow = Math.Min(this.maxNumRandomActivitiesToShow, participations.Count);

            for (int i = 0; i < numParticipationsToShow; i++)
            {
                Participation temp = participations[i];
                int           j    = this.randomGenerator.Next(i, participations.Count);
                participations[i] = participations[j];
                participations[j] = temp;
            }

            if (participations.Count > numParticipationsToShow)
            {
                participations = participations.GetRange(0, numParticipationsToShow);
            }

            TitledControl mainView = new TitledControl("" + participations.Count + " random participations (of " + availableCount + " matches) in " + this.Category.Name, 30);

            mainView.SetContent(new ListParticipations_Layout(participations, this.ShowRatings, this.engine, this.scoreSummarizer, this.layoutStack, this.randomGenerator));
            return(mainView);
        }
예제 #2
0
        private LayoutChoice_Set make_extremeParticipations_layout()
        {
            // Find the participations, filter them, and sort them
            List <Participation> participations = this.SortedParticipations;
            int availableCount = participations.Count;

            if (participations.Count < 1)
            {
                return(this.Get_NoParticipations_Layout());
            }

            // determine how many best and worst participations to show
            int maxCount  = Math.Min(participations.Count, this.maxNumTopParticipationsToShow);
            int lowCount  = maxCount / 2;
            int highCount = maxCount - lowCount;

            // get the best and worst participations
            // The participations are already in the right order (decreasing score), we just want to take the beginning and end of the list
            List <Participation> highParticipations   = participations.GetRange(0, lowCount);
            List <Participation> lowParticipations    = participations.GetRange(participations.Count - highCount, highCount);
            List <Participation> chosenParticipations = highParticipations;

            chosenParticipations.AddRange(lowParticipations);

            // build layout
            TitledControl mainView = new TitledControl("" + chosenParticipations.Count + " matching participations with most extreme " + this.sortBy_box.SelectedItem.ToLower() + " (of " + availableCount + ") in " + this.Category.Name, 30);

            mainView.SetContent(this.New_ListParticipationsLayout(chosenParticipations));
            return(mainView);
        }
        private static LayoutChoice_Set makeNavigationHelp_layout(LayoutStack layoutStack)
        {
            LayoutChoice_Set result = new TitledControl("Navigating ActivityRecommender",
                                                        new HelpWindowBuilder()
                                                        .AddMessage("To find your way around in ActivityRecommender, do this:")
                                                        .AddMessage("1. Decide what you want to do with ActivityRecommender. If you don't know what ActivityRecommender can do, then " +
                                                                    "go back and visit the Get Excited or How to Use screens.")
                                                        .AddMessage("2. Look at the current screen and try to determine whether it seems capable of doing what you want.")
                                                        .AddMessage("2a. If you're not sure, look for a button labelled Help and press it.")
                                                        .AddLayout(
                                                            new HelpButtonLayout("Help",
                                                                                 new TextblockLayout("The screen you were reading explains how to find things in ActivityRecommender, and you successfully found the Help button. Congratulations!"),
                                                                                 layoutStack
                                                                                 )
                                                            )
                                                        .AddMessage("2b. If you're still not sure, you can ask for help here:")
                                                        .AddLayout(OpenIssue_Layout.New())
                                                        .AddMessage("3. Whenever the current screen looks promising, press a button and see what happens!")
                                                        .AddMessage("4. Whenever the current screen doesn't seem like what you want, push one of the back buttons at the bottom of the screen")
                                                        .AddLayout(
                                                            new HelpButtonLayout("Tell me more about the back buttons",
                                                                                 (new HelpWindowBuilder()
                                                                                  .AddLayout(
                                                                                      new HelpWindowBuilder()
                                                                                      .AddMessage("As you visit more screens, you will see more buttons at the bottom of the screen. Each button will jump you back to the screen " +
                                                                                                  "that it represents. Press one!")
                                                                                      .AddMessage("You may notice that the very first screen in ActivityRecommender doesn't usually get a back button. That's because you will almost " +
                                                                                                  "never want to return to it, so we only show you its back button when it's the only screen left to go back to.")
                                                                                      .Build()
                                                                                      )
                                                                                  .AddLayout(
                                                                                      new HelpButtonLayout("How many back buttons can there be?",
                                                                                                           new TextblockLayout("The maximum number of back buttons you can see onscreen at once depends on the size of your screen and the length of " +
                                                                                                                               "the words in them. How many do you see now?"),
                                                                                                           layoutStack
                                                                                                           )
                                                                                      )
                                                                                  .Build()
                                                                                 ),
                                                                                 layoutStack
                                                                                 )
                                                            )
                                                        .Build()
                                                        );


            return(result);
        }
예제 #4
0
        private LayoutChoice_Set make_goodRandomParticipation_layout()
        {
            List <Participation> participations = this.SortedParticipations;
            Participation        participation  = this.chooseInterestingParticipation(participations);

            if (participation == null)
            {
                return(this.Get_NoParticipations_Layout());
            }

            TitledControl result = new TitledControl("Remember this?", 30);

            result.SetContent(this.New_ListParticipationsLayout(new List <Participation>()
            {
                participation
            }));
            return(result);
        }
예제 #5
0
        private LayoutChoice_Set make_topParticipations_layout()
        {
            List <Participation> participations = this.SortedParticipations;
            int availableCount = participations.Count;

            if (participations.Count < 1)
            {
                return(this.Get_NoParticipations_Layout());
            }

            if (participations.Count > this.maxNumTopParticipationsToShow)
            {
                participations = participations.GetRange(0, this.maxNumTopParticipationsToShow);
            }

            TitledControl mainView = new TitledControl("" + participations.Count + " matching participations with highest " + this.sortBy_box.SelectedItem + " (of " + availableCount + ") in " + this.Category.Name, 30);

            mainView.SetContent(this.New_ListParticipationsLayout(participations));
            return(mainView);
        }
        public static LayoutChoice_Set New(LayoutStack layoutStack)
        {
            TitledControl mainLayout = new TitledControl("ActivityRecommender: Spend Your Time Better");

            MenuLayoutBuilder menuBuilder = new MenuLayoutBuilder(layoutStack);

            menuBuilder.AddLayout("What makes this awesome", FeatureOverviewLayout.New(layoutStack));

            menuBuilder.AddLayout("How to navigate", makeNavigationHelp_layout(layoutStack));

            menuBuilder.AddLayout("How to use", (new HelpWindowBuilder())
                                  .AddMessage("Step 1: Get excited. To see a list of key features of ActivityRecommender so you can decide whether they interest you, go back and choose \"Get Excited\". Everything " +
                                              "else mentioned here is under the \"Start\" menu option.")
                                  .AddMessage("Step 2: Add some activities. Everything that ActivityRecommender does is based on the activities that you tell it about. Think of some activities that you like to do, " +
                                              "and enter their names. The only activity that exists initially is the built-in activity named Activity. Each other must have a parent activity. For example, if you " +
                                              "create a new activity named Exercise whose parent is Activity, you can then create a new activity named Frisbee whose parent is Exercise. The main advantage to categorizing " +
                                              "activities like this is it allows ActivityRecommender to know that they are related and enables ActivityRecommender to give better suggestions. Additionally, this also allows you " +
                                              "to later view a graph of your total time spent in Exercise, which would then include Frisbee.")
                                  .AddMessage("Step 3: Record some participations. Whereas an activity is something like \"Frisbee\", a participation is something like \"I played Frisbee today from 14:00 to 15:00 " +
                                              "and it was 1.1 times as much fun as having watched television earlier today.\" For ActivityRecommender to know what you like to do, it needs some information about what " +
                                              "you have done in the past, along with how much you liked it. Before you can report having played Frisbee, you must have recorded that Frisbee is an activity.")
                                  .AddMessage("Step 4a: Ask for suggestions. Once you've entered at least one activity, ActivityRecommender will be able to give you activity recommendations. As you enter more data, " +
                                              "ActivityRecommender will be able to give you better and better suggestions.")
                                  .AddMessage("Step 4b: Export a backup of your data if it's important to you.")
                                  .AddMessage("Step 4c: Explore! ActivityRecommender has more features than are mentioned here :)")
                                  .Build());

            menuBuilder.AddLayout("Discoveries made", DiscoveriesLayout.New(layoutStack));

            menuBuilder.AddLayout("Credits", new CreditsWindowBuilder(layoutStack)
                                  .AddContribution(ActRecContributor.ANNI_ZHANG, new System.DateTime(2019, 8, 18), "Discussed the organization of the introduction and get-excited screens")
                                  .AddContribution(ActRecContributor.TOBY_HUANG, new System.DateTime(2021, 2, 16), "Suggested describing ActivityRecommender's purpose more clearly")
                                  .Build());


            mainLayout.SetContent(menuBuilder.Build());

            return(mainLayout);
        }
예제 #7
0
        private void show()
        {
            List <Participation> participations = this.activity.getParticipationsSince(this.start);
            // we reduce the number of visible participations
            string title;
            int    maxNumParticipations = 20;

            if (participations.Count > maxNumParticipations)
            {
                title          = "Last " + maxNumParticipations + " participations in " + this.activity.Name;
                participations = participations.GetRange(participations.Count - maxNumParticipations, maxNumParticipations);
            }
            else
            {
                title = "Participations in " + this.activity.Name + " since " + this.start;
            }
            ListParticipations_Layout content = new ListParticipations_Layout(participations, this.engine, this.scoreSummarizer, this.layoutStack);

            content.AddParticipationComment += Content_AddParticipationComment;
            TitledControl results = new TitledControl(title, content, 10);

            this.layoutStack.AddLayout(results, "Participations");
        }
예제 #8
0
        public static LayoutChoice_Set New(LayoutStack layoutStack)
        {
            TitledControl     mainLayout  = new TitledControl("I want...");
            MenuLayoutBuilder menuBuilder = new MenuLayoutBuilder(layoutStack);

            menuBuilder.AddLayout("To be happy now",
                                  new TitledControl("Happiness at any time!",
                                                    (new MenuLayoutBuilder(layoutStack))
                                                    .AddLayout("So many activity ideas", (new HelpWindowBuilder())
                                                               .AddMessage("To help you effortlessly get started, there are hundreds of wonderful, categorized activity ideas under Start -> Organize Activities -> Quickstart / Premade.")
                                                               .AddMessage("These ideas can supplement your own ideas that you can add under Start -> Organize Activities -> New Activity.")
                                                               .Build()
                                                               )
                                                    .AddLayout("Awesome suggestions", (new HelpWindowBuilder())
                                                               .AddMessage("Go to Start -> Suggestions/Experiment for endless, personalized ideas!")
                                                               .AddMessage("If you like an idea, press the 'Doing it!' button which will take you straight to the Record Participations screen.")
                                                               .AddMessage("ActivityRecommender learns based on how you rate what you do, so be sure to enter a rating often.")
                                                               .AddMessage("If you press the X button on an idea, it will go away and will appear less often. If it's a very good idea, though, it might be back quite soon!")
                                                               .Build()
                                                               )
                                                    .AddLayout("Advanced: Efficiency Experiment", (new HelpWindowBuilder())
                                                               .AddMessage("Imagine you have some tasks you need to do, and you want to estimate how efficient you are at various times of day.")
                                                               .AddMessage("If you are willing to work on these tasks in a random order, then you can measure your efficiency! Doing them in a random order allows us to correct for the fact that some tasks " +
                                                                           "may be harder than expected.")
                                                               .AddMessage("ActivityRecommender offers this feature under Start -> Suggest/Experiment -> Efficiency Experiment.")
                                                               .AddMessage("These efficiency measurements will show up in various places in the application, including in graphs!")
                                                               .Build()
                                                               )
                                                    .Build()
                                                    )
                                  );
            menuBuilder.AddLayout("To be happy later",
                                  new TitledControl("Live a happy life!",
                                                    new MenuLayoutBuilder(layoutStack)
                                                    .AddLayout("Fulfilling suggestions", (new HelpWindowBuilder())
                                                               .AddMessage("ActivityRecommender's suggestions are optimized to make you happy for long periods of time. If something you do tends to make you slightly happy now and very unhappy later, such " +
                                                                           "as staying up late, then as ActivityRecommender gets to know you better, it will suggest this less and less. Of course, if something makes you very happy now and slightly unhappy later, then " +
                                                                           "you can expect ActivityRecommender to keep suggesting it.")
                                                               .AddMessage("You don't have to do anything special to enable this! Just keep recording ratings for the things that you do.")
                                                               .Build()
                                                               )
                                                    .AddLayout("Validating feedback: way to go!", (new HelpWindowBuilder())
                                                               .AddMessage("Even something as simple as recording your time here is really fun. ActivityRecommender can understand what makes you happy and when, and chooses accordingly from hundreds " +
                                                                           "of possible responses!")
                                                               .AddMessage("Go to Start -> Record Participations to record what you're up to, and be sure to enter lots of ratings.")
                                                               .Build()
                                                               )
                                                    .AddLayout("Analysis: what makes you least happy?", (new HelpWindowBuilder())
                                                               .AddMessage("To see what has had the largest postive or negative impact on your happiness recently, go to Start -> Analyze -> Significant Activities.")
                                                               .AddMessage("This analysis will be weighted by the amount of time you spent on various things, so even a small problem that lasts for a long time can be considered significant!")
                                                               .Build()
                                                               )
                                                    .AddLayout("Analysis: reminisice", (new HelpWindowBuilder())
                                                               .AddMessage("If you want to browse happy things you have done in the past, you can go to Start -> Analyze -> Search Participations and request a 'random, probably good one'.")
                                                               .AddMessage("Of course, this will be more interesting after you've recorded more comments under Start -> Record Participations.")
                                                               .Build()
                                                               )
                                                    .AddLayout("Analysis: graphs", (new HelpWindowBuilder())
                                                               .AddMessage("Obviously, ActivityRecommender also provides interesting graphs of what you've been doing.")
                                                               .AddMessage("Go to Start -> Analyze -> Visualize one Activity to see!")
                                                               .Build()
                                                               )
                                                    .AddLayout("Summaries to share with friends", (new HelpWindowBuilder())
                                                               .AddMessage("ActivityRecommender even offers multiple types of summaries you can share with friends.")
                                                               .AddMessage("For a summary of what you've been up to lately, to share with old friends, see Start -> Analyze -> Life Story.")
                                                               .AddMessage("For a summary of what kinds of things you like to do, to share with new friends, see Start -> Analyze Favorite Activities.")
                                                               .Build()
                                                               )
                                                    .Build()
                                                    )
                                  );
            menuBuilder.AddLayout("To be motivated and impactful",
                                  new TitledControl("Be powerful",
                                                    (new MenuLayoutBuilder(layoutStack))
                                                    .AddLayout("Great suggestions", (new HelpWindowBuilder())
                                                               .AddMessage("Go to Start -> Suggestions/Experiment for endless suggestions!")
                                                               .AddMessage("If a suggestion sounds like a difficult thing to do at first, try thinking about it for a few minutes. You might find that you would like it anyway!")
                                                               .Build()
                                                               )
                                                    .AddLayout("Measure and optimize your efficiency", (new HelpWindowBuilder())
                                                               .AddMessage("Imagine you have some tasks you need to do, and you want to estimate how efficient you are at various times of day.")
                                                               .AddMessage("If you are willing to work on these tasks in a random order, then you can measure your efficiency! Doing them in a random order allows us to correct for the fact that some tasks " +
                                                                           "may be harder than expected.")
                                                               .AddMessage("ActivityRecommender offers this feature under Start -> Suggest/Experiment -> Efficiency Experiment.")
                                                               .AddMessage("These efficiency measurements will show up in various places in the application, including in suggestions and feedback.")
                                                               .Build()
                                                               )
                                                    .AddLayout("Save partial ideas to improve later", (new HelpWindowBuilder())
                                                               .AddMessage("Have you ever had an idea that you thought was really cool but not quite complete? Can you immediately recall all of the ideas you've ever had?")
                                                               .AddMessage("Have you ever tried writing your ideas down so you can remember them later? Have you ever found that your list quickly became too long and disorganized?")
                                                               .AddMessage("ActivityRecommender solves this problem by allowing you to save your ideas, compare them, edit them, browse your top ideas, promote them into Activities, and delete them.")
                                                               .AddMessage("These ideas are called ProtoActivities (because they turn into Activities) and can be found at Start -> Activities -> Protoactivities: Brainstorm")
                                                               .AddMessage("If you ever have an idea you want to remember later, just make a ProtoActivity. If you ever need inspiration, just browse your best protoactivities.")
                                                               .Build()
                                                               )
                                                    .Build()
                                                    )
                                  );

            menuBuilder.AddLayout("Something free and convenient",
                                  new TitledControl("Free!",
                                                    (new MenuLayoutBuilder(layoutStack))
                                                    .AddLayout("No fees, no ads", (new HelpWindowBuilder())
                                                               .AddMessage("There are no advertisements in ActivityRecommender, and there is no fee to install it either.")
                                                               .AddMessage("Why?")
                                                               .AddMessage("1. I created ActivityRecommender in 2011 primarily to help motivate myself. I really really really hope you like it too, but the success of the project isn't dependent " +
                                                                           "on getting anyone to pay for it.")
                                                               .AddMessage("2. I think it would be extremely cool if you like and use ActivityRecommender. That means I've improved your life, right? I don't want to risk interfering with that by " +
                                                                           "charging money for it or including any distractions in it.")
                                                               .AddMessage("3. ActivityRecommender doesn't require any money to keep a server running, because all the data and processing happen on your device.")
                                                               .Build()
                                                               )
                                                    .AddLayout("Fast interface, lots of autocomplete", (new HelpWindowBuilder())
                                                               .AddMessage("ActivityRecommender has autocomplete in many places.")
                                                               .AddMessage("When entering an activity name, press Enter to accept the autocomplete suggestion.")
                                                               .AddMessage("It's common to be able to record a participation by pressing the screen only six times (One press to select the name box, two presses to type the first two letters, " +
                                                                           "one press of Enter to select the autocomplete suggestion, one press of \"End = Now\" to select and end time, and one press of OK to record it).")
                                                               .Build()
                                                               )
                                                    .AddLayout("Not trying to make you use it more", (new HelpWindowBuilder())
                                                               .AddMessage("ActivityRecommender has a deep understanding of how happy you are with your life, and that's what it optimizes.")
                                                               .AddMessage("ActivityRecommender doesn't assume that using it more is a sign of being happier.")
                                                               .AddMessage("In fact, any time you spend using ActivityRecommender is time that you don't spend doing something else.")
                                                               .AddMessage("So, on the Suggestions screen, if you ever push the X button, then ActivityRecommender assumes that while that " +
                                                                           "activity was onscreen, you were spending all of your brainpower contemplating whether to do that activity, and that that " +
                                                                           "time was worth 0 happiness to you.")
                                                               .AddMessage("ActivityRecommender will only attempt to use more of your time when it estimates that your resultant increase in " +
                                                                           "happiness will be enough to compensate (for example, when you ask for a suggestion, it may suggest that you do your chores even " +
                                                                           "if it thinks there is only a small chance that you will take the suggestion).")
                                                               .Build()
                                                               )
                                                    .AddLayout("All runs on the device", (new HelpWindowBuilder())
                                                               .AddMessage("No internet is required. Really!")
                                                               .AddMessage("On-device processing is pretty fast.")
                                                               .AddMessage("ActivityRecommender itself does not send your data to other devices. Of course, if your device automatically makes backup of application data, then those " +
                                                                           "backups may contain copies of your ActivityRecommender data. You can still use the Export functionality within ActivityRecommender to save a data snapshot to the " +
                                                                           "device, which you can then separately save.")
                                                               .Build()
                                                               )
                                                    .AddLayout("Open source", new Vertical_GridLayout_Builder().Uniform()
                                                               .AddLayout(new TextblockLayout("To see how ActivityRecommender works, check out the source code at:").AlignHorizontally(TextAlignment.Center).AlignVertically(TextAlignment.Center))
                                                               .AddLayout(new OpenUrl_Layout("https://github.com/mathjeff/ActivityRecommender"))
                                                               .AddLayout(new TextblockLayout("If you're thinking about contributing:").AlignHorizontally(TextAlignment.Center).AlignVertically(TextAlignment.Center))
                                                               .AddLayout(OpenIssue_Layout.New())
                                                               .AddLayout(new TextblockLayout("Thanks!").AlignHorizontally(TextAlignment.Center).AlignVertically(TextAlignment.Center))
                                                               .Build()
                                                               )
                                                    .AddLayout("But feel free to thank us", (new HelpWindowBuilder())
                                                               .AddMessage("If you tell us that we've done something that you like, that will make us very happy :)")
                                                               .AddMessage("If you describe something that you would like changed, then that will help us to make improvements, and if you tell us that you like those improvements, that will make " +
                                                                           "us very happy :) . We'll probably even add your name inside the application as an acknowledgement!")
                                                               .AddMessage("Getting feedback makes us more productive! Believe us, we measured it: about 30-60 minutes for the first instance each day.")
                                                               .AddMessage("If you would like to give us feedback, good options include leaving a review on the application that you downloaded from the store, or opening a bug.")
                                                               .AddMessage("Thanks!")
                                                               .Build()
                                                               )
                                                    .Build()
                                                    )
                                  );

            mainLayout.SetContent(menuBuilder.Build());
            return(mainLayout);
        }
        public static LayoutChoice_Set New(LayoutStack layoutStack)
        {
            TitledControl mainLayout = new TitledControl("Discoveries made by using ActivityRecommender:\nHow many of these apply to you?");

            MenuLayoutBuilder menuBuilder = new MenuLayoutBuilder(layoutStack);

            menuBuilder.AddLayout("Large impact of environment on happiness",
                                  new HelpWindowBuilder()
                                  .AddMessage("Every time I've changed cities or jobs, it's been correlated with a 1 - 3% change in net present happiness.")
                                  .AddMessage("If a change of 1 - 3 % sounds small, consider that it equals 15 - 45 minutes per day.")
                                  .AddMessage("How do you feel about your city and your job?")
                                  .Build()
                                  );

            menuBuilder.AddLayout("Willpower is consistent over long periods of time",
                                  new HelpWindowBuilder()
                                  .AddMessage("Imagine that you relaxed all day and feel terrible at the end of the day for not having gotten any work done. Presumably, " +
                                              "you are imagining that if you had gotten more work done during the day then that would have been free and would not affect your " +
                                              "motivation to get work done on a later day. Right?")
                                  .AddMessage("By recording via ActivityRecommender my time spent working, I've made two observations. The first is that graph of the " +
                                              "cumulative amount of time I've spent working, over long periods of time tends to be fairly straight. If each day's productivity were random, then this graph would be " +
                                              "more varied. In other words, there's a limit to the average amount of work I can do per day using sheer willpower, and expending an " +
                                              "above-average amount of willpower on one day generally results in less willpower available for later days.")
                                  .AddMessage("The second observation is a measurement of how many extra hours of work I can do before I run out of willpower. For me, " +
                                              "the size of my pool of willpower is 120 hours. This means, for example, that if I feel there is an urgent problem that I must solve as soon as possible, " +
                                              "then I can devote my average amount of work to it, plus an additional 40 hours per week above my average, for 3 weeks (40*3=120), " +
                                              "before I'm no longer willing to do an above average amount of work. Alternatively, if I instead devote only 1 hour per day beyond " +
                                              "my average amount of work, then I can keep that pace up for 120 days before running out of interest and willpower.")
                                  .AddMessage("The size of this reserve of extra worktime may be different for different users, but still may be larger than users may " +
                                              "expect, if it can take ~3 months to deplete.")
                                  .Build()
                                  );

            menuBuilder.AddLayout("Feedback empowers more work",
                                  new HelpWindowBuilder()
                                  .AddMessage("On 2017-09-20, I added a feature into ActivityRecommender that causes it to give users feedback when they record " +
                                              "participations. This feedback could look like 'Nice! +55 days!' and refers to the difference between the user's predicted net present " +
                                              "happiness after doing this activity compared to what it would have been without this participation.")
                                  .AddMessage("This was really exciting for me as a user because suddenly it felt like I could count on some entity to give me " +
                                              "some thoughts about the things I was doing and to at least offer some independent confirmation about whether the things I was " +
                                              "doing were reasonable, even if it was only doing math on the data I input and confirming that because I seemed to be enjoying " +
                                              "these things, that it didn't notice anything to be wrong.")
                                  .AddMessage("During the following year from 2017-09-20 to 2018-09-20, I spent 108 additional hours (an average increase of 18 minutes " +
                                              "per day) working on technology projects (primarily ActivityRecommender) beyond my historical average .")
                                  .AddMessage("Note that because this 108 hour increase is less than the size of my previously measured pool of willpower of 120 " +
                                              "hours, I can't be quite sure that this feedback was the reason for this extra motivation, but it seems likely because after one year was " +
                                              "over, I did not stop working as hard; instead, I added a new feature into ActivityRecommender that motivated me more (and " +
                                              "therefore made it hard to collect data for this feature specifically).")
                                  .Build()
                                  );

            menuBuilder.AddLayout("Measuring efficiency empowers even more work",
                                  new HelpWindowBuilder()
                                  .AddMessage("On 2018-09-20 I added a feature into ActivityRecommender that allows users to run experiments to measure their " +
                                              "efficiency.")
                                  .AddMessage("This was really exciting for me because it suddenly meant that there was an extremely clear meaning in whether I " +
                                              "accomplished various tasks, and there was also a uniform way to compare very different tasks.")
                                  .AddMessage("In the two years after implementing this feature, I spent an additional 202 additional hours working on technology projects " +
                                              "than my previous average from 2017-09-20 to 2018-09-20, (an increase of about 17 minutes per day).")
                                  .Build()
                                  );

            menuBuilder.AddLayout("Large impact of efficiency measurement on happiness",
                                  new HelpWindowBuilder()
                                  .AddMessage("On 2018-09-20 I implemented the experimentation feature in ActivityRecommender, which allows users to " +
                                              "run experiments to measure their efficiency. It was very exciting and meaningful to feel that an entity was keeping score of the " +
                                              "things I accomplished, large and small.")
                                  .AddMessage("The experimentation feature was correlated with a 3% improvement to my net present happiness. That's " +
                                              "equivalent to having an additional 45 minutes of free time every day!")
                                  .Build()
                                  );

            menuBuilder.AddLayout("More efficient in the morning",
                                  new HelpWindowBuilder()
                                  .AddMessage("Using the efficiency data I collected via experiments, I computed the linear regression of my efficiency as a function " +
                                              "time of day (number of seconds since midnight).")
                                  .AddMessage("My calculations indicate that I am 1.317 times as efficient in the morning than in the evening.")
                                  .AddMessage("This suggests that in the morning I am better suited to tasks that involve effort, and that the evening is the most " +
                                              "appropriate time for tasks that involve more waiting.")
                                  .Build()
                                  );

            menuBuilder.AddLayout("Working on a project requires enough projects!",
                                  new HelpWindowBuilder()
                                  .AddMessage("Shortly after implementing the experimentation feature in ActivityRecommender, I began to find myself having difficulty " +
                                              "thinking of enough measurable tasks to work on. Without enough tasks, I wouldn't have anything to experiment on, and wouldn't be " +
                                              "able to gain the happiness and efficiency benefits from running an experiment and learning the results.")
                                  .AddMessage("When this happened and I was low on ToDos, the value in entering a new ToDo became more clear because it was easily " +
                                              "recognizable as a prerequisite for being motivated to do the work that it described. Suddenly, entering a new ToDo became exciting " +
                                              "because it was a prerequisite for running an exciting experiment.")
                                  .AddMessage("Regardless of your motivation for completing your ToDos, if thinking of a ToDo is a prerequisite for doing it, you " +
                                              "may find that thinking of new ToDos is valuable too.")
                                  .Build()
                                  );

            mainLayout.SetContent(menuBuilder.Build());
            return(mainLayout);
        }