Contribute to Open Source. Search issue labels to find the right project for you!

Cached locator and AST parsing


This is another stab at caching parsing operations. This comes at the expense of memory, but YOLO.

This cannot be opt-out, so the patch is just an example: it should only be handled when building source locators via dependency injection.

The results are as following:


Time: 19.22 seconds, Memory: 70.00MB

OK, but incomplete, skipped, or risky tests!
Tests: 1658, Assertions: 29353, Skipped: 7.

real    0m19.263s
user    0m19.104s
sys 0m0.144s


Time: 17.56 seconds, Memory: 70.00MB

OK, but incomplete, skipped, or risky tests!
Tests: 1658, Assertions: 29353, Skipped: 7.

real    0m17.593s
user    0m17.436s
sys 0m0.136s

I’ll check parsing large class trees in a sec.

Updated 20/08/2017 01:27 2 Comments

Change RetrieveDocsForReader job to limit requests made by eFolder to VBMS


Before eFolder is enabled for Reader, the RetrieveDocumentsForReader batch job needs to be adjusted to limit the number of requests made by eFolder to VBMS.

The batch job should run nightly to: 1. Retrieve all active appeals assigned to Reader users (this will need to be limited in the future as well when opened to 700 users) 1. Loop through the appeals 1. For each appeal, retrieve the list of documents for the case from eFolder. - This request triggers eFolder to cache these documents from VBMS into S3

Currently, the job has no way to tell if eFolder has to make requests to VBMS for the documents. It will not stop until all documents for all appeals have been retrieved.

This ticket may need a tech spec for how to implement the required changes to the eFolder API to return a field that shows if an appeal has to be fetched from VBMS or not

Updated 19/08/2017 01:40

Remove Redux


Everything can be expressed via typed props. Just as I had it in old Este. Relay Modern is going to replace cases for a local state anyway. Meanwhile, we can persist app state manually. The song explains it.

Updated 19/08/2017 01:02 1 Comments

Dockerize the GM Fabric development environment


The goal of this issue is to replicate all of the external dependencies that gm-fabric-jvm uses in the production environment in local docker-compose infrastructure on the developer’s workstation.

This should include the following: - Developing an NGINX / Gatekeeper container that runs the dashboard being developed. This should be integrated into the WebPack build pipeline and maintain hot reloading. - Dockerizing multiple fake GM-Fabric-JVM microservices using the mock-json Node.js app in the project. - Using Node.js to mock out the API of the new microservice Josh is creating??? - Adding Zookeeper - ????

Note: This should be implemented in separately from the docker-compose infrastructure that Josh built containing Envoy, Graphite, statsd, etc.

Updated 18/08/2017 19:05 1 Comments

Appoint Club Safety Officers by September 14, 2017


ACM needs to appoint a Club Safety Officer(s). Traditionally this is just the same person as the President, but potentially a position we can offer to anyone in club.

Due September 14, 2017.

This is the email received from SA: ```Dear engineering club leaders,

With the start of the academic year approaching, your club may already be considering some of the exciting projects and activities you will be offering your membership. Due to the potential hazards of many hands-on club activities, each engineering student club is required to have at least one Club Safety Officer.

It is mandatory that each club select at least one Club Safety Officer for the year. Larger clubs should select two or three individuals to hold Club Safety Officer responsibilities. While your club’s Safety Officer(s) may be a member of your executive board, do consider offering this position to a non-elected member of your organization to more widely distribute opportunities for leadership and professional development.

Club Safety Officers play a critical role in the operations of any club that seeks to fabricate physical devices, tools, models, etc. They are expected to establish and maintain close working relationships with faculty advisors and UB Environment, Health & Safety (EH&S) officers to ensure that all club activities are pursued in safe and appropriate ways. Further, the Club Safety Officer plays an important role in the training and experiential learning of other club members. Holding the office of Club Safety Officer is a valuable addition to any student resume!

The responsibilities of a Club Safety Officer include: · Attend mandatory EH&S training arranged through the Dean’s Office · Presence at all times when club members are building or carrying out any potentially hazardous activity. (Hence why larger clubs with many planned activities may need more than one officer). · Promote safety awareness, ensure club members comply with UB safety polices · Write Standard Operating Procedures where necessary (using chemicals or hazardous operations) · Identify unsafe operations and practices, and act to stop/shut down operations if necessary · Ensure all club members attend applicable training sessions (EHS, department, etc.) and maintain training records · Work with EH&S to help identify risks and hazards associated with certain procedures, report problems/issues/incidents to faculty advisor and UB EH&S if necessary · Assure that the proper personal protective equipment (PPE) is obtained based on club projects and ensure that PPE is used when working with hazardous materials · Ensure that all students are aware of hazards and safe operating methods for club projects · Ensure that students and advisors know how to get help if needed

If you have already selected one or more Club Safety Officers for your organization, please reply to this e-mail with the name and e-mail address of the individual(s).

If you are still in the process of appointing a club member to this role, please make your selections by September 14.

The mandatory safety training session and a secondary make-up date are currently being organized for weekdays in late September or early October. Information regarding exact date, time, and location of the training sessions will be sent to Club Safety Officers and club leaders in the coming weeks.

Please reach out if you have any questions or concerns. We look forward to seeing you in the fall!


Chelsea Montrois Student Affairs Assistant 410 Bonner Hall 716-645-0958 ```

Updated 18/08/2017 06:55

Put back .graphqlconfig


It’s disabled for now because it can’t recognize connection directive. Otherwise, it’s super awesome because it enables live linting and auto-completion within Atom.

Updated 18/08/2017 01:06

React 16


It’s blocked by Next.js, which depends on React 15 internals.

Updated 17/08/2017 23:23 1 Comments

Date range UI [replaces #1435]


See #1435 for previous discussion

Based on further understanding of the EDS date range/facet, I’m replacing the original UI design. Intent is to later add a histogram, parallel to catalog. Interaction details, labels etc. should be the same in both.

  • Center the form fields above the slider.
  • Change Apply button style from .btn-default to .btn-primary
  • Button is disabled before any change is made; enabled when any change is made in the input field(s) or slider.
  • User clicks Apply to submit the change; no live updating.


start state, button disabled

<img width=“388” alt=“screen shot 2017-08-17 at 12 42 02 pm” src=“”>

changed state, button enabled

<img width=“379” alt=“screen shot 2017-08-17 at 12 40 33 pm” src=“”>


start state, button disabled

<img width=“379” alt=“screen shot 2017-08-17 at 12 47 24 pm” src=“”>

changed state, button enabled

<img width=“384” alt=“screen shot 2017-08-17 at 12 39 28 pm” src=“”>

Updated 17/08/2017 19:49

ruleKey is mandatory on issue error


Hey, I tried using the plugin by adding the compiled jar to the plugins folder. It shows up in sonar no problem, and I just used the defaults, didn’t change any options. Is there anything you have to set to get this to work other than adding the plugin? When I run gradle build sonarqube, I get the following: ``` Execution failed for task ‘:sonarqube’.

ruleKey is mandatory on issue full stack: * Exception is: org.gradle.api.tasks.TaskExecutionException: Execution failed for task ‘:sonarqube’. at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions( at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute( at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute( at org.gradle.api.internal.tasks.execution.ResolveTaskOutputCachingStateExecuter.execute( at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute( at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute( at org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute( at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute( at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute( at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute( at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute( at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker$ at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute( at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute( at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute( at at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute( at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute( at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.processTask( at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.access$200( at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute( at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute( at org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.execute( at org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.executeWithTask( at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$ at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute( at org.gradle.internal.concurrent.StoppableExecutorImpl$ at org.gradle.internal.concurrent.ThreadFactoryImpl$ Caused by: java.lang.NullPointerException: ruleKey is mandatory on issue at at org.sonar.api.batch.sensor.issue.internal.DefaultIssue.doSave( at at io.gitlab.arturbosch.detekt.sonar.sensor.DetektSensor$reportIssues$1.accept(DetektSensor.kt:57) at io.gitlab.arturbosch.detekt.sonar.sensor.DetektSensor$reportIssues$1.accept(DetektSensor.kt:21) at io.gitlab.arturbosch.detekt.sonar.sensor.DetektSensor.reportIssues(DetektSensor.kt:49) at io.gitlab.arturbosch.detekt.sonar.sensor.DetektSensor.execute(DetektSensor.kt:32) at org.sonar.scanner.sensor.SensorWrapper.analyse( at org.sonar.scanner.phases.SensorsExecutor.executeSensor( at org.sonar.scanner.phases.SensorsExecutor.execute( at org.sonar.scanner.phases.AbstractPhaseExecutor.execute( at org.sonar.scanner.scan.ModuleScanContainer.doAfterStart( at org.sonar.core.platform.ComponentContainer.startComponents( at org.sonar.core.platform.ComponentContainer.execute( at org.sonar.scanner.scan.ProjectScanContainer.scan( at org.sonar.scanner.scan.ProjectScanContainer.scanRecursively( at org.sonar.scanner.scan.ProjectScanContainer.doAfterStart( at org.sonar.core.platform.ComponentContainer.startComponents( at org.sonar.core.platform.ComponentContainer.execute( at org.sonar.scanner.task.ScanTask.execute( at org.sonar.scanner.task.TaskContainer.doAfterStart( at org.sonar.core.platform.ComponentContainer.startComponents( at org.sonar.core.platform.ComponentContainer.execute( at org.sonar.scanner.bootstrap.GlobalContainer.executeTask( at org.sonar.batch.bootstrapper.Batch.executeTask( at org.sonarsource.scanner.api.internal.batch.BatchIsolatedLauncher.execute( at org.sonarsource.scanner.api.internal.IsolatedLauncherProxy.invoke( at com.sun.proxy.$Proxy168.execute(Unknown Source) at org.sonarsource.scanner.api.EmbeddedScanner.doExecute( at org.sonarsource.scanner.api.EmbeddedScanner.runAnalysis( at at org.gradle.internal.reflect.JavaMethod.invoke( at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.doExecute( at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execute( at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execute( at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute( at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute( at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$ at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute( at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute( at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute( at at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction( at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions( … 27 more ```

Updated 18/08/2017 07:08 1 Comments

update templates to run `exo template test`


Setup CI to run exo template test for each of the following repos:

Blocked on 0.23.0.alpha.3 being released with this command

Updated 17/08/2017 17:29

Rings & amulets

  • Visible item types and invisible (for multiplayer): ring, amulet is invisible, there is no need to send message when it’s equipped.
  • Allow units to carry 1 amulet and 2 rings. Equipping should change last equipped one.
  • Add magic rings and amulets.
  • New items generation, add some to bosses

Blocked by #157

Updated 17/08/2017 13:26

util: improve inspect performance


I reworked a couple of things in util inspect for performance. This is based on #14880 as the bug fix will likely land earlier and that is independent from the performance changes. #14790 should also land before this one.

Please have a close look at the ctx.seen and ctx.seenSet part.

EDIT: The code is fully covered. EDIT2: #14790 landed

 util/inspect.js showHidden=0 method="boxed_string" n=200000     52.97 %        *** 2.364127e-06
 util/inspect.js showHidden=0 method="buffer" n=200000            6.74 %            5.193261e-02
 util/inspect.js showHidden=0 method="date" n=200000              3.37 %          * 3.455711e-02
 util/inspect.js showHidden=0 method="empty_object" n=200000     23.81 %         ** 2.800295e-03
 util/inspect.js showHidden=0 method="error" n=200000             0.86 %            4.565854e-01
 util/inspect.js showHidden=0 method="object" n=200000          144.15 %        *** 2.092473e-06
 util/inspect.js showHidden=0 method="set" n=200000              54.05 %        *** 8.493353e-07
 util/inspect.js showHidden=0 method="string" n=200000           29.99 %         ** 1.564397e-03
 util/inspect.js showHidden=1 method="boxed_string" n=200000     67.66 %        *** 7.416857e-08
 util/inspect.js showHidden=1 method="buffer" n=200000            6.31 %          * 4.634528e-02
 util/inspect.js showHidden=1 method="date" n=200000              7.48 %        *** 2.100219e-05
 util/inspect.js showHidden=1 method="empty_object" n=200000     16.49 %        *** 5.941544e-05
 util/inspect.js showHidden=1 method="error" n=200000            47.59 %        *** 2.244601e-10
 util/inspect.js showHidden=1 method="object" n=200000          119.68 %        *** 3.111998e-06
 util/inspect.js showHidden=1 method="set" n=200000              71.64 %        *** 2.485425e-08
 util/inspect.js showHidden=1 method="string" n=200000           37.75 %        *** 1.472355e-07
 util/inspect-array.js type="denseArray showHidden" len=100000 n=500     11.63 %        *** 5.295949e-08
 util/inspect-array.js type="denseArray" len=100000 n=500                79.84 %        *** 1.625585e-23
 util/inspect-array.js type="mixedArray" len=100000 n=500                10.48 %         ** 7.362620e-03
 util/inspect-array.js type="sparseArray" len=100000 n=500                5.31 %            1.864732e-01 
 util/inspect-proxy.js n=100000 v=1     66.10 %        *** 6.020332e-06
 util/inspect-proxy.js n=100000 v=2     59.75 %        *** 6.662180e-04
The following changes got in:

- Only use try catch if necessary
- Use if else to prevent checking for things when not necessary
- Prevent using arguments for legacy usage
- Use a lazy inititated set instead of an array to reduce complexity
- Prevent checking for RegExp and others twice
- Improve primitive detection
- Move boxed detection for the common case
- Optimize formatProperty code paths
- Use const if possible
- Do not reassign nextRecurseTimes
- Improve recurseTimes handling
- Use plain for loops instead of built-ins
- Use faster number detection (no RegExp)
- Do not concat symbols
- Inline key length check
- Add object fast path
- Only calculate str length if not definitely out of range
- Improve string format fast path
- Only check extra array keys if necessary
- Directly expose isRegExp and isDate instead of wrapping them

The circular reference check is a bit special for backwards
compatibility reasons. As the `ctx` is passed to the customInspect
function it has to stay a array in that case. Internally a set is
always used

<!– Remove items that do not apply. For completed items, change [ ] to [x]. –>

  • [x] make -j4 test (UNIX), or vcbuild test (Windows) passes
  • [x] tests and/or benchmarks are included
  • [x] documentation is changed or added
  • [x] commit message follows commit guidelines
Affected core subsystem(s)

<!– Provide affected core subsystem(s) (like doc, cluster, crypto, etc). –> util, benchmark

Updated 18/08/2017 14:58 2 Comments

PCC: use shared_configs


Once there is a settings.yml file used by PCC (and perhaps once we have a VM? – See sul-dlss/preservation2017#34) we should start using shared_configs.

Note that we should also have the capistrano deploy (#2) grab the latest configs from the correct branch. This is done with a line or two in deploy.rb, I think … as Jessie’s gem for this is now part of dlss-capistrano.

Updated 16/08/2017 20:50

Modify browser-based polling to poll the current microservice the user is looking at


Currently the dashboard begins polling a statically configured endpoint upon browser load. This feeds a single microservice instance’s metrics into Redux as timeseries data (stored in memory).

This approach works fine for a single microservice, but it likely does not scale well for multiple microservices because: - Each microservice pulls a fairly large metrics.json file (~98kb for the ESS service) pretty often (now every 5 seconds by default). This means approximately 20kbps per microservice - Each poll must be parsed and refactored into timeseries metrics, some of which happens on the main UI thread. - Because the timeseries metrics are stored in Redux, this information is held in memory. The memory footprint for a single microservice grows substantially over time (at a theoretical rate of ~4KBps for ESS, likely less than half that due to JS runtime optimizations). This amounts to somewhere between 175 - 350 MB after collecting 24 hours of metrics.

In order to support multiple microservices before a full TSDB implementation, it makes sense to limit the app to polling a single microservice at a time. This should be whatever microservice the user is actively looking at. Initially, metrics should just be purged and replaced when switching between active microservices ( bringing us to feature parity with current implementation).

However, in a future PR, Redux can namespace metrics by service name and instance IDs to preserve previously captured metrics.

Updated 16/08/2017 17:02 1 Comments

Implement "Services" and "Instances" Components and expand navigation to an entire Fabric of microservices


The dashboard currently only monitors a single instance of a microservice using static configs stored in meta tags in their respective index.html files.

Having a Fabric-wide view of microservices relies on the presence of thegm-services-gateway as a landing page that links to the separate dashboards. The landing page is essentially a static website that has microservice information injected by ZooKeeper/NGINX via Mustache tags.

We intend to enhance gm-fabric-dashboard to allow a single instance to monitor an entire microservice fabric.

To make this possible, the following UI changes must occur: - The SummaryBar component must behave differently based on if it’s showing the entire Fabric, a microservice composed of a cluster of instances, or a single instance - Routing must add parameters for microservices and instances like /:serviceName/:instanceID/threads to support the ability to render different microservices - New components must be created to show something in the main view area. Absent a TSDB, the mocks for dashboards based on metrics rollup across a cluster of instances is not possible, but intermediate content should be generated.

Updated 16/08/2017 16:39 1 Comments

password with non ascii character break the admin interface


Please use the appropriate part of the template: “Bug” or “Feature Request”



A non ascii character in the password when creating a user via the admin interface shows a traceback.

Steps to Reproduce

  • vagrant up development
  • vagrant ssh development
  • cd /vagrant/securedrop
  • ./ add-admin # user admin
  • firefox # login as user admin
  • firefox
    • user foobar
    • password aaaaaaaaaaaaé # note the accented letter at the end
    • repeat password aaaaaaaaaaaaé
  • click Add user

Expected Behavior

The user is created.

Actual Behavior

<pre> - - [16/Aug/2017 12:36:48] “POST /admin/add HTTP/1.1” 500 - Traceback (most recent call last): File “/usr/local/lib/python2.7/dist-packages/flask/”, line 1997, in call return self.wsgi_app(environ, start_response) File “/usr/local/lib/python2.7/dist-packages/flask/”, line 1985, in wsgi_app response = self.handle_exception(e) File “/usr/local/lib/python2.7/dist-packages/flask/”, line 1540, in handle_exception reraise(exc_type, exc_value, tb) File “/usr/local/lib/python2.7/dist-packages/flask/”, line 1982, in wsgi_app response = self.full_dispatch_request() File “/usr/local/lib/python2.7/dist-packages/flask/”, line 1614, in full_dispatch_request rv = self.handle_user_exception(e) File “/usr/local/lib/python2.7/dist-packages/flask/”, line 1517, in handle_user_exception reraise(exc_type, exc_value, tb) File “/usr/local/lib/python2.7/dist-packages/flask/”, line 1612, in full_dispatch_request rv = self.dispatch_request() File “/usr/local/lib/python2.7/dist-packages/flask/”, line 1598, in dispatch_request return self.view_functionsrule.endpoint File “/vagrant/securedrop/”, line 96, in wrapper return func(*args, **kwargs) File “/vagrant/securedrop/”, line 188, in admin_add_user otp_secret=otp_secret) File “<string>”, line 4, in init

File “/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/”, line 414, in initialize_instance manager.dispatch.init_failure(self, args, kwargs) File “/usr/local/lib/python2.7/dist-packages/sqlalchemy/util/”, line 66, in exit compat.reraise(exc_type, exc_value, exc_tb) File “/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/”, line 411, in initialize_instance return manager.original_init(*mixed[1:], kwargs) File “/vagrant/securedrop/”, line 256, in init self.set_password(password) File “/vagrant/securedrop/”, line 290, in set_password self.pw_hash = self.scrypt_hash(password, self.pw_salt) File “/vagrant/securedrop/”, line 274, in scrypt_hash return scrypt.hash(str(password), salt, params) UnicodeEncodeError: ‘ascii’ codec can’t encode character u'\xe9' in position 15: ordinal not in range(128) </pre>


The passwords should accept non-ascii: non-english speaker will need them to have good passphrases that they can memorize.

Updated 18/08/2017 00:07 2 Comments

Create screencast of EPUB reader


In an effort to make sure demonstrations of the EPUB reader at various meetings/presentations, are stable.

Screencast would include:

  • [ ] Demo of the EPUB reader
  • [ ] Demo of the EPUB reader integrated with the catalog page (how the EPUB is connected to the Fulcrum book page, etc.)

Please note: we are awaiting the director of NYUP to say it’s ok that we use NYUP’s Show Sold Separately as the subject of our screencast.

Updated 16/08/2017 11:08

Fix Bootstrap 4.0.0-beta bugs


Creating this issue to track progress on fixing issues related to the recent Bootstrap move to beta.

  • [x] Classname changes
  • [x] Colors now defined as Sass maps
  • [X] Misplaced cards in search widget (fixed in 96c0f8df244098f335a01cbf837df6ed6b0fbf58)
  • [X] Double arrow on select elements (fixed in d92d2f53473b0a6755c03d746b05d365fb0b3123)
  • [ ] Dropdown menus not working (depends on kaliber5/ember-bootstrap#410)
  • [ ] Form error styles not applied
  • [ ] Tooltips and popups have no arrows (depends on kaliber5/ember-bootstrap#410)
Updated 17/08/2017 22:53

Send transaction action from contact profile should prefill user in send command


User Story

As a user I don’t want to type or select the name of my contact again after selecting the action send transaction from his profile


Type: Bug Summary: Currently when selecting the send transaction action from a contact profile I still have to type or select his name before being able to select an amount and send it


  • Open Status
  • Go to contacts
  • Select Jarrad
  • Click on the profile icon on the top right corner and select profile
  • Select Send transaction

The /send command is selected but you still have to input the user before being able to select an amount



Wait for issue #1617 to be resolved

Updated 15/08/2017 19:39

Use HydroShare Production URL


Once HydroShare 1.12 is released, containing the fix for, revert #2145.

This card should be ready once this URL resolves correctly:

Updated 15/08/2017 14:14

Update UI theme colors to match new default theme


With #15 almost merged, there are some other modules that need their colors updated.

<img width=“956” alt=“screen shot 2017-08-15 at 6 38 23 am” src=“”>

specifically the borders on the modals and the active state for the control buttons.

Work on this should not start until #481 has been completed and merged

Updated 15/08/2017 11:45

OneCore Voices: Support faster speech rates, greater pitch range, etc.


Compared with NVDA, Narrator is able to speak at faster rates with the OneCore Voices. It can also access a much wider pitch range. In addition, the rate set in Narrator is not affected by the rate set in Windows Settings, whereas NVDA is affected by this. This is because Narrator used an API which was previously private. That API has now been made public, so NVDA will be able to use it.

See the Options property on the SpeechSynthesizer class and the SpeechSynthesizerOptions class. Note that AudioPitch, AudioVolume and SpeakingRate (the properties we want) were only introduced in Windows 10 Insider 10.0.16257.0.

Unfortunately, we can’t use these just yet for a few reasons:

  1. We need a newer version of the Windows 10 SDK, but versions after 10.0.15063 only work with Visual Studio 2017. We can’t yet build with Visual Studio 2017. So, this is blocked by our move to VS 2017, which is in turn blocked by support in SCons.
  2. This is still a preview version of the SDK. Even once it’s out of preview, it might be a while before it gets installed on AppVeyor.

Implementation notes:

  1. Because this will only be available in later builds of Windows 10, we’ll need to test for support of this new API at runtime. I know UWP provides a way to do this, but I’ve never done it myself.
  2. Aside from testing for the API, we’ll probably still need to keep the code around which adjusts rate, etc. with SSML to work with earlier Windows 10 builds. We might just be able to pass the default rate, volume, etc. to _OcSsmlConverter if the new API is supported instead of passing the cached user settings, but I’m not certain. Either way, this part of the code is going to get a bit ugly because we have to support these two cases.
Updated 15/08/2017 05:37 2 Comments

[Proposal] Reorganize codebase in a more idiomatc way


Currently contains the main.go (and some build files, etc.) and everything else is located under This has the following consequences: - It’s tough for external contributors to dive into minio and understand the layer-structure of the minio server/gateway - it took me quite a while and I’m working currently full time on the minio server. - Build times are quite long - even tough the Go compiler is pretty fast. - Currently /cmd exports stuff more or less randomly. - It is very hard to test functionality properly because /cmd is one global namespace and you cannot rely on invariants. Somebody can modify every state from everywhere in the code.

Go natural approach to face these kind of problems is the package. Packages provide: - A structured way to organize code. It’s easier to understand the architecture of a project if you can look at it’s components and see how they interact. This helps new (and old :wink: ) contributors to figure out which part of the code is responsible for what. - Faster build and test times. The go compiler does incremental builds by default. It only compiles packages which have changed. This sames time during development. - Go supports internal (private) packages. Currently somebody can import and may raise issues because we’re breaking the code after every release. We can prevent misuse of minio/cmd by using internal packages. - A package exports a public API used by other packages to build minio’s functionality but we can also protect state and rely on certain invariants and assumptions. Packages will help us to prevent bugs by accidentally changing invariants.

Expected Behavior

There a many Go projects which follow a package-based approach: - Caddy - Kubernetes - Prometheus

Possible Solution

I propose to introduce packages for minio to face the listed problems. The packages should mirror the architecture of minio. Minio consists of 3 independent layers: storage, object and handler. Further minio supports FS and XL as well as Gateway (GCS, Azure and AWS). Within XL erasure coding and bitrot protection is a special/complex code base.

We should discuss about the right structure of packages and keep the balance between useful abstractions and over-engineering but I think the general structure should look like this: ``` minio/ - main.go - … - storage/ - storage.go - storage_test.go - posix/ - posix.go - … - posix_test.go - rpc/ - rpc.go - … - object/ - object.go - fs/ - fs.go - xl/ - xl.go

…. ``` /cc @fwessels @harshavardhana @abperiasamy @krishnasrinivas @donatello @krisis

Updated 15/08/2017 00:49 9 Comments

Poll if texture modding should be added


Some people like different colored hair, skin, features. It shouldn’t be that hard to add atlas loading from file so users could modify how characters and enemies look. Let’s just make sure they want that and that there is a big enough audience to vote on it first.

Updated 11/08/2017 20:10

Add section in prefs to turn off Highlights


At minimum the whole section can be turned off but the full feature is to be able to individually turn off bookmarks and visited sites.

<img width=“357” alt=“image” src=“”>

  • If the user unchecks both Bookmarks and Visited Sites, the Highlights section is also unchecked.
  • If Highlights section is unchecked, the sub option box is disabled at 50% opacity not allowing clicks but maintains whatever the user has checked for Bookmarks and Visited Sites.
  • If all sub options are unchecked and the user is turning on Highlights section, all options are now checked.

Strings: - Highlights - Find your way back to interesting things you’ve recently visited or bookmarked. - Bookmarks - Visited Sites

Updated 14/08/2017 18:13 2 Comments

Re-enable CA2242 (TestForNaNCorrectlyAnalyzer) for Roslyn.sln

dotnet/roslyn changes the BinaryOperatorKind enum public API, which breaks this analyzer at

This analyzer should be fixed to consume the new API and re-enabled in Roslyn.

Updated 11/08/2017 16:35

[Frontend] Daily Docket | Pre-save 'edited' field on hearings redux state


When we need to update Redux, we need to mark what’s been updated so we can know whether or not to send a request to the backend.


Screen Shot 2017-08-14 at 10.02.17 AM.png

Add ‘edited’ at same level as id, user_id, appeal_id, etc

Acceptance Criteria: - After editing a hearing’s field, add a redux field ‘edited’ on the hearing and set it to true

Updated 16/08/2017 14:43

Add section called "Highlights"


Fill as many cards on Highlights with Bookmarks (first order citizen) up to 5 days old Fill the rest with most recent history item (history items don’t show bookmarks) Looks like the total is 9 cards with no timestamp but “Bookmarked” or “Visited” with matching icon. The prefs from #3155 section allows for turning off of bookmarks and/or history.


Strings: - Highlights - <insert empty state string here> – see this link that should be updated

Updated 14/08/2017 18:22 1 Comments

Welcome page | Change search ui component



Right now the search in the welcome page works the way the search in document list works (type ahead…). This is the wrong feature for this task because a user can type in (the wrong) valid ID for a shorter number without completely typing in an ID.


  • [x] Switch the search so that it is using the Style guide big search component
  • [x] Make sure the search box width (not including button) is 250px
  • [x] Verify that user can enter search by pressing the search button or pressing enter on keyboard
  • [ ] Verify that when there is latency that the search turns into the loading button and make sure the logo inside is in reader brand color



Updated 18/08/2017 20:48 3 Comments

Update Billing Pivot Table article


article: (aka rackspace-how-to/content/general/

This due Aug 15. I have email attachments with content suggestions in word & pdf and new images to include.

I’ll convert to markdown and submit PR for review.

Updated 14/08/2017 17:06 1 Comments

Batch Review


ACCEPTANCE - [ ] on the batch status view page, give me a button / link that takes me to a search with results that consist of all the items in the batch - [ ] from the primary search box, give me an option to search by batch ID that returns all of the items in that batch

Updated 09/08/2017 22:50 1 Comments

Fork me on GitHub