import { useEffect, useState } from "react"; | |
type UseTextSelectionReturn = { | |
text: string; | |
rects: DOMRect[]; | |
ranges: Range[]; | |
selection: Selection | null; | |
}; | |
const getRangesFromSelection = (selection: Selection): Range[] => { |
import * as React from "react"; | |
import { useMousePosition } from "~/hooks/useMousePosition"; | |
/** Component to cover the area between the mouse cursor and the sub-menu, to allow moving cursor to lower parts of sub-menu without the sub-menu disappearing. */ | |
export function MouseSafeArea(props: { parentRef: React.RefObject<HTMLDivElement> }) { | |
const { x = 0, y = 0, height: h = 0, width: w = 0 } = props.parentRef.current?.getBoundingClientRect() || {}; | |
const [mouseX, mouseY] = useMousePosition(); | |
const positions = { x, y, h, w, mouseX, mouseY }; | |
return ( | |
<div |
Moved to Shopify/graphql-design-tutorial
- Blog
- How to GraphQL - Ruby (Tutorial)
- Speaker deck
| Date | Event | Title | Slides | Video | Code |
Types::FoosType = GraphQL::ObjectType.define do | |
field :foos, !types[Types::FooType] do | |
timed true # enable New Relic trace_execution_scoped | |
description "Returns foos" | |
argument :per, types.Int, default_value: 20 | |
argument :page, types.Int, default_value: 1 | |
# Moving to cursor pagination would be better | |
resolve(...) | |
end | |
end |
class FileUploadComponent extends Component{ | |
upload(){ | |
this.props.mutate({ | |
variables: { | |
id, | |
avatar: this.inputFile.files[0] //this is how you send file | |
} | |
}). | |
then(({data}) => { | |
console.log(data) |
# NewRelic instrumenter for GraphQL-ruby | |
# | |
# In your controller: | |
# ::NewRelic::Agent.add_custom_attributes({ | |
# user_id: @user.try(:id), | |
# query_string: @query_string, | |
# query_arguments: @query_variables | |
# }) | |
# | |
# @document = self.class.trace_execution_scoped(["GraphQL#parse"]) do |
import React from 'react'; | |
import {withIntl} from 'ufleet-intl'; | |
const Example = (props) => <div>{props.t('Hello, {name}', {name: 'React'})}</div>; | |
export default withIntl(Example); |
My largest Sidekiq application had a memory leak and I was able to find and fix it in just few hours spent on analyzing Ruby's heap. In this post I'll show my profiling setup.
As you might know Ruby 2.1 introduced a few great changes to ObjectSpace, so now it's much easier to find a line of code that is allocating too many objects. Here is great post explaining how it's working.
I was too lazy to set up some seeding and run it locally, so I checked that test suite passes when profiling is enabled and pushed debugging to production. Production environment also suited me better since my jobs data can't be fully random generated.
So, in order to profile your worker, add this to your Sidekiq configuration:
if ENV["PROFILE"]