text:
January 7, 2022 11:00am Comment João Carrasqueira
Lenovo ThinkPad X1 Carbon Gen 10 vs Yoga Gen 7: Clamshell or convertible?
Lenovo recently announced the latest generation of the ThinkPad X1 lineup, including the classic ThinkPad X1 Carbon and the X1 Yoga convertible. The ThinkPad X1 Carbon Gen 10 and X1 Yoga Gen 7 both bring big improvements to the table in their respective families, and they share a lot of the same DNA. They've historically been some of the best business laptops out there, and two of Lenovo's flagship ThinkPads for years.
But there are still some notable differences, the most notable being the fact that one is a clamshell and the other is a convertible. That one difference also has other implications in the design, portability, and more. If you're trying to decide between the two, we're putting them side-by-side to help you make the right choice for your needs.
Lenovo ThinkPad X1 Carbon Gen 10
Lenovo ThinkPad X1 Yoga Gen 7
Up to 12th Generation Intel Core i7 with vPro, U and P series, up to 14 cores
14-inch WUXGA 16:10 (1920×1200) IPS low-power, anti-glare, 400 nits, 100%sRGB
14-inch WUXGA 16:10 (1920×1200) IPS low-power, anti-glare, touch, 400 nits, 100%sRGB
14-inch WUXGA 16:10 (1920×1200) IPS low-power, anti-glare, touch, Privacy Guard, 500 nits, 100%sRGB
14-inch 2.2K 16:10 (2240×1400) IPS anti-glare, 300nit, 100% sRGB
14-inch 2.8K 16:10 (2880×1800) OLED, anti-glare, anti-reflection, anti-smudge, 400nit, 100% DCI-P3
14-inch WQUXGA 16:10 (3840×2400) IPS low-power, anti-glare, 500nit, 100% DCI-P3, HDR400, Dolby Vision
14-inch WQUXGA 16:10 (3840×2400) IPS low-power, touch, anti-glare, anti-reflection, anti-smudge, 500nit, 100% DCI-P3, HDR400, Dolby Vision
14-inch WUXGA 16:10 (1920 x 1200) IPS low-power, touch, anti-glare, 400 nits, 100% sRGB
14-inch WUXGA 16:10 (1920 x 1200) IPS low-power, touch, anti-reflective, anti-smudge, 400 nits, 100% sRGB
14-inch WUXGA 16:10 (1920 x 1200) IPS low-power, touch, anti-glare, Privacy Guard, 500 nits, 100% sRGB
14-inch WQUXGA 16:10 (3840 x 2400) OLED low-power, touch, anti-reflective, anti-smudge, 500 nits, 100% DCI-P3, Dolby Vision
Up to 2TB PCIe Gen 4 NVMe SSD
57Whr battery
Up to 65W USB Type-C power adapter
2 x Thunderbolt 4 (USB Type-C)
1x HDMI 2.0b
Nano SIM slot
Dolby Atmos speaker system
720p HD RGB webcam
1080p Full HD RGB webcam
1080p Full HD RGB + IR webcam
1080p Full HD MIPI RGB + IR webcam with Computer Vision
Windows Hello
IR webcam (optional)
Intel Wi-Fi 6E
Cellular options:
5G sub-6 Cat2o
4G LTE Cat16
Optional Carbon fiber weave cover
Storm Grey
Size (WxDxH)
HD webcam: 315.6 x 222.50 x 14.95 mm (12.42 x 8.76 x 0.59 in)
Full HD webcam: 315.6 x 222.50 x 15.36 mm (12.42 x 8.76 x 0.60 in)
314.4 x 222.3 x 15.53 mm (12.38 x 8.75 x 0.61 in)
Dimensions Starts at 1.12kg (2.48 lbs) Starts at 1.38kg (3 lbs)
Price Starting at $1,639 Starting at $1,749
This specs list alone makes it clear that these are two extremely similar laptops in terms of their specs. The main differences here are in the design and display, so let's dive right in. Performance should be nearly identical, so we'll leave that for last.
Display: ThinkPad X1 models have OLED now
One of the big news with the latest ThinkPad X1 Carbon and X1 Yoga models is that they now come with OLED panels, but they're still quite different in a few ways. The ThinkPad X1 Carbon gives you more configuration options than ever. It starts with a Full HD+ (1920 x 1200) panel, which can be upgraded with touch support and a Privacy Guard. Then there's a 2.2K IPS panel that's sharper but not as bright, and then the 2.8K OLED model that's bound to look stunning. If you want the most sharpness possible, then the Ultra HD+ (3840 x 2400) IPS panel is still an option, and it now comes with optional touch support for the first time.
The ThinkPad X1 Nano doesn't give you as many options, but it has some advantages, too. For one thing, all the models include support for touch, since it's a convertible. Only two options for the X1 Carbon include touch support, and that doesn't include the OLED panel. The ThinkPad X1 Nano also comes with a Lenovo pen that's stored in the laptop itself.
The X1 Nano also starts with a Full HD+ IPS panel, and you can add an anti-smudge coating or a Privacy Guard. The final option is an Ultra HD+ OLED panel, though, arguably the best display option of the bunch. It combines the super-sharp resolution with the benefits of OLED, plus touch support, so it's bound to be a fantastic experience. Both laptops still have great displays, so you won't go wrong with either one. But if you want the cream of the crop, the X1 Nano reaches slightly greater heights.
Above the displays, the two laptops also have identical cameras. They start with a 720p HD webcam, but you can upgrade to a 1080p camera and add Windows Hello facial recognition if you want to. Plus, there's a new option with a feature called Computer Vision, which adds some smart features. For example, previous ThinkPads had optional human presence detection, but with computer vision, the laptop can also tell whether you're approaching the laptop to use it or if someone (or something) was just walking by, so it will only wake up when it actually needs to.
As for audio, both laptops have a non-specific Dolby Atmos speaker system and a quad-array microphone setup with Dolby Voice, so you should sound loud and clear during video calls.
Design and ports: The ThinkPad X1 Nano is a convertible
Another major set of differences between these two laptops has to do with their design, including their form factor. As we've mentioned, the ThinkPad X1 Yoga is a convertible, meaning you can use it like a regular laptop, but also as a tablet, and in a variety of different stances. That also means it supports touch across the board. Meanwhile, the X1 Carbon is a classic clamshell, and while you can add touch support to the display, it's always going to be a typical laptop.
The differences extend to the overall appearance, too. Both laptops still carry the iconic ThinkPad lineage with red accents, a TrackPoint in the keyboard, and duplicated mouse buttons above the touchpad. However, while the X1 Carbon Gen has its classic Deep Black chassis, the X1 Yoga comes in Storm Grey. It's not exactly a ground-breaking look, but it does stand out among the ThinkPad family.
Being a convertible also has some implications in size and weight. The ThinkPad X1 Yoga Gen 7 is noticeably heavier than the X1 Carbon, starting at 3.0lbs versus 2.48lbs. That's not an insignificant difference, but it's to be expected with a convertible. The 360-degree hinge plus the fact that it needs a glass cover for the display contributes to this difference. The ThinkPad X1 Yoga is also slightly thicker, measuring 15.53mm, while the ThinkPad X1 Carbon maxes out at 15.36mm with a Full HD webcam (14.95mm if you get a 720p camera).
In terms of ports and connectivity, the two laptops are pretty much identical. You get two Thunderbolt 4 ports, two USB Type-A ports, HDMI 2.0b, a headphone jack, and an optional nano-SIM slot. That also means they both support 4G LTE or sub-6GHz 5G if you want it, as well as Wi-Fi 6E and Bluetooth 5.2.
Performance: Big upgrades for both
Just like their respective predecessors, the Lenovo ThinkPad X1 Carbon and X1 Nano are identical as far as performance goes. This time, they're both getting big upgrades with Intel's 12th-generation Core processors. This is a big deal for two reasons. For starters, it's the debut of the new hybrid architecture Intel is using, mixing high-performance cores with more power-efficient cores to balance battery life, thermals, and performance as necessary.
It's also a big deal because for the first time, the ThinkPad X1 laptops all come with the option for P-series processors. These processors are available for the first time in Windows laptops, and they have a higher 28W power rating, meaning they use more energy but deliver more performance. The ThinkPad X1 Carbon Gen 10 and X1 Yoga Gen 7 are two of the very first laptops announced with these new processors.
Along with that, both laptops now support and include LPDDR5 RAM for even faster speeds, along with a PCIe Gen 4 SSD, which should reduce any wait times when loading files or opening games. Both max out with 32GB of RAM and 2TB of storage, so, once again, they're pretty much the same, and they're both great.
Choosing between these two laptops mostly comes down to the form factor you prefer, and the implications it has on portability. If you're like me, the convertible form factor of the ThinkPad X1 Yoga Gen 7 is a must. It gives you more flexibility in how you use the laptop, and it includes touch and pen support across all its configurations.
The ThinkPad X1 Carbon is a regular clamshell laptop, which is less flexible. But on the flip side, it's noticeably lighter and slightly thinner, so if you're planning to be on the move often, it might be a better option. It also sticks closer to the iconic ThinkPad look if that's something you adore.
Beyond that, the differences are minor. There are a few different display options, and the X1 Nano giving you the best possible combination with its 4K OLED panel, but the X1 Carbon is far from bad. It's also available with a 2.8K OLED display, which is more than sharp enough for a 14-inch laptop. The X1 Nano is technically better, but you'll have a great experience either way. As for performance, they're exactly the same, barring any potential differences in the cooling system because of the different form factor.
At the end of the day, one isn't necessarily better than the other. If you want a convertible, go with the X1 Yoga; if you want something lighter, the X1 Carbon is for you. Neither of these laptops is available to buy yet, and they're planned to launch in March. We'll be sure to add purchase links below once they're available. In the meantime, you can check out our list of the best laptops you can buy right now.
Tags lenovo thinkpad x1 carbonlenovo thinkpad x1 yoga
XDA » Buying Guides » Lenovo ThinkPad X1 Carbon Gen 10 vs Yoga Gen 7: Clamshell or convertible?
João Carrasqueira
Writer at XDA Computing. I've been covering the world of technology since 2018, but I've loved the field for a lot longer. And I have a weird affinity for Nintendo videogames, which I'm always happy to talk about.


text:
Q: How to have marker end enable to end of path in a d3 tree Below is my code snippet where I would like to have multiple arrowhead markers at the end of my path pointing it towards the children instead of the parent. But I have been able to point a single arrow marker towards my parent but not a child. Please let me know what needs to be done
The below image shows the arrow pointing towards the parent. I would like to have it point towards children.
The below image shows is the plain code without arrow markers

I would like to see the below image like type functionality to my code

<!DOCTYPE html>
<meta charset="UTF-8">
<style>
    .node circle {
        fill: #fff;
        stroke: steelblue;
        stroke-width: 3px;
    }

    .node text {
        font: 12px sans-serif;
    }

    .link {
        fill: none;
        stroke: #ccc;
        stroke-width: 2px;
    }

    .link path {
        fill: none;
        stroke: #ccc;
        stroke-width: 2px;
    }

    .link text {
        font: 12px sans-serif;
        stroke: #333;
        stroke-width: 1;
    }
</style>

<body>

    <!-- load the d3.js library -->
    <script src="https://d3js.org/d3.v4.min.js"></script>
    <script>

        var treeData =
        {
            "name": "Top Level",
            "linkname": "null",
            "children": [
                {
                    "name": "Level 2: A",
                    "linkname": "Link_1",
                    "children": [
                        { "name": "Son of A", "linkname": "Link_2.1" },
                        { "name": "Daughter of A", "linkname": "Link_2.2" }
                    ]
                },
                { "name": "Level 2: B", "linkname": "Link_3", }
            ]
        };

        // Set the dimensions and margins of the diagram
        var margin = { top: 20, right: 90, bottom: 30, left: 90 },
            width = 960 - margin.left - margin.right,
            height = 500 - margin.top - margin.bottom;

        // append the svg object to the body of the page
        // appends a 'group' element to 'svg'
        // moves the 'group' element to the top left margin
        var svg = d3.select("body").append("svg")
            .attr("width", width + margin.right + margin.left)
            .attr("height", height + margin.top + margin.bottom)
            .append("g")
            .attr("transform", "translate("
                + margin.left + "," + margin.top + ")");

        var i = 0,
            duration = 750,
            root;

        // declares a tree layout and assigns the size
        var treemap = d3.tree().size([height, width]);

        // Assigns parent, children, height, depth
        root = d3.hierarchy(treeData, function (d) { return d.children; });
        root.x0 = height / 2;
        root.y0 = 0;

        // Collapse after the second level
        root.children.forEach(collapse);

        update(root);

        // Collapse the node and all it's children
        function collapse(d) {
            if (d.children) {
                d._children = d.children
                d._children.forEach(collapse)
                d.children = null
            }
        }

        function update(source) {

            // Assigns the x and y position for the nodes
            var treeData = treemap(root);

            // Compute the new tree layout.
            var nodes = treeData.descendants(),
                links = treeData.descendants().slice(1);

            // Normalize for fixed-depth.
            nodes.forEach(function (d) {
                d.y = d.depth * 180
            });

            // ****************** Nodes section ***************************

            // Update the nodes...
            var node = svg.selectAll('g.node')
                .data(nodes, function (d) {
                    return d.id || (d.id = ++i);
                });

            // Enter any new modes at the parent's previous position.
            var nodeEnter = node.enter().append('g')
                .attr('class', 'node')
                .attr("transform", function (d) {
                    return "translate(" + source.y0 + "," + source.x0 + ")";
                })
                .on('click', click);

            // Add Circle for the nodes
            nodeEnter.filter(function (d) {
                return (!d.data.type || d.data.type !== 'data');
            }).append('circle')
                .attr('class', 'node')
                .attr('r', 1e-6)
                .style("fill", function (d) {
                    return d._children ? "lightsteelblue" : "#fff";
                });

            nodeEnter.filter(function (d) {
                return (d.data.type && d.data.type === 'data');
            }).append('rect')
                .attr('class', 'node')
                .attr('width', 20)
                .attr('height', 20)
                .attr('y', -10)
                .attr('x', -10)
                .style("fill", function (d) {
                    return d._children ? "lightsteelblue" : "#fff";
                });

            // Add labels for the nodes
            nodeEnter.append('text')
                .attr("dy", "2em")
                .attr("x", function (d) {
                    return d.children || d._children ? 13 : 13;
                })
                .attr("text-anchor", function (d) {
                    return d.children || d._children ? "start" : "start";
                })
                .text(function (d) {
                    return d.data.name;
                });

            // UPDATE
            var nodeUpdate = nodeEnter.merge(node);

            // Transition to the proper position for the node
            nodeUpdate.transition()
                .duration(duration)
                .attr("transform", function (d) {
                    return "translate(" + d.y + "," + d.x + ")";
                });

            // Update the node attributes and style
            nodeUpdate.select('circle.node')
                .attr('r', 10)
                .style("fill", function (d) {
                    return d._children ? "lightsteelblue" : "#fff";
                })
                .attr('cursor', 'pointer');

            // Remove any exiting nodes
            var nodeExit = node.exit().transition()
                .duration(duration)
                .attr("transform", function (d) {
                    return "translate(" + source.y + "," + source.x + ")";
                })
                .remove();

            // On exit reduce the node circles size to 0
            nodeExit.select('circle')
                .attr('r', 1e-6);

            // On exit reduce the opacity of text labels
            nodeExit.select('text')
                .style('fill-opacity', 1e-6);

            // ****************** links section ***************************

            // Update the links...
            var link = svg.selectAll('g.link')
                .data(links, function (d) {
                    return d.id;
                });

            // Enter any new links at the parent's previous position.
            var linkEnter = link.enter().insert('g', 'g')
                .attr("class", "link");

            linkEnter.append('text')
                .attr("class","linkLabels")
                .text(function (d, i) {
                    if (d.parent && d.parent.children.length > 1) {
                        if (!d.parent.index) d.parent.index = 0;
                        return d.data.linkname;
                    }
                })
                .attr("opacity",0)
                .attr('dy', "-1em");

            linkEnter.append('path')
                .attr('d', function (d) {
                    var o = {
                        x: source.x0,
                        y: source.y0
                    }
                    return diagonal(o, o)
                })
                .on("mouseover", function(){
                    d3.select(this.parentNode).select("text").attr("opacity",1);
                })
                .on("mouseleave", function(){
                    d3.select(this.parentNode).select("text").attr("opacity",0);
                })

            // UPDATE
            var linkUpdate = linkEnter.merge(link);

            // Transition back to the parent element position
            linkUpdate.select('path').transition()
                .duration(duration)
                .attr('d', function (d) {
                    return diagonal(d, d.parent)
                });

            linkUpdate.select('text').transition()
                .duration(duration)
                .attr('transform', function (d) {
                    if (d.parent) {
                        return 'translate(' + ((d.parent.y + d.y) / 2) + ',' + ((d.parent.x + d.x) / 2) + ')'
                    }
                })

            // Remove any exiting links
            link.exit().each(function (d) {
                d.parent.index = 0;
            })

            var linkExit = link.exit()
                .transition()
                .duration(duration);

            linkExit.select('path')
                .attr('d', function (d) {
                    var o = {
                        x: source.x,
                        y: source.y
                    }
                    return diagonal(o, o)
                })

            linkExit.select('text')
                .style('opacity', 0);

            linkExit.remove();

            // Store the old positions for transition.
            nodes.forEach(function (d) {
                d.x0 = d.x;
                d.y0 = d.y;
            });

            // Creates a curved (diagonal) path from parent to the child nodes
            function diagonal(s, d) {
                path = `M ${s.y} ${s.x}
                        C ${(s.y + d.y) / 2} ${s.x},
                            ${(s.y + d.y) / 2} ${d.x},
                            ${d.y} ${d.x}`
                return path
            }

            // Toggle children on click.
            function click(d) {
                if (d.children) {
                    d._children = d.children;
                    d.children = null;
                } else {
                    d.children = d._children;
                    d._children = null;
                }
                update(d);
            }
        }

    </script>
</body>

A: Probably not 100% what you want, but can be a starting point for you, basically I did it by manipulating marker attributes .attr("orient", "auto-start-reverse") check the MDN documentation for more information about this attribute, also refX, and refY finally the path attribute I used marker-start instead of marker-end since in this example the path drawn from the children to the parent not the reverse
if this is not what you want, there is another stack-overflow question that is a bit close to your case but its not a tree but can help:
Align Marker on node edges D3 Force Layout

var treeData = {
  name: "Top Level",
  linkname: "null",
  children: [
    {
      name: "Level 2: A",
      linkname: "Link_1",
      children: [
        { name: "Son of A", linkname: "Link_2.1" },
        { name: "Daughter of A", linkname: "Link_2.2" }
      ]
    },
    { name: "Level 2: B", linkname: "Link_3" }
  ]
};

// Set the dimensions and margins of the diagram
var margin = { top: 20, right: 90, bottom: 30, left: 90 },
  width = 960 - margin.left - margin.right,
  height = 500 - margin.top - margin.bottom;

// append the svg object to the body of the page
// appends a 'group' element to 'svg'
// moves the 'group' element to the top left margin
var svg = d3
  .select("body")
  .append("svg")
  .attr("width", width + margin.right + margin.left)
  .attr("height", height + margin.top + margin.bottom)
  .append("g")
  .attr("transform", "translate(" + margin.left + "," + margin.top + ")");

svg
  .append("svg:defs")
  .selectAll("marker")
  .data(["end"]) // Different link/path types can be defined here
  .enter()
  .append("svg:marker") // This section adds in the arrows
  .attr("id", String)
  .attr("viewBox", "0 -5 10 10")
  .attr("refX", 15)
  .attr("refY", 0)
  .attr("markerWidth", 6)
  .attr("markerHeight", 6)
  .attr("orient", "auto-start-reverse")
  .append("svg:path")
  .attr("d", "M0,-5L10,0L0,5");

var i = 0,
  duration = 750,
  root;

// declares a tree layout and assigns the size
var treemap = d3.tree().size([height, width]);

// Assigns parent, children, height, depth
root = d3.hierarchy(treeData, function(d) {
  return d.children;
});
root.x0 = height / 2;
root.y0 = 0;

// Collapse after the second level
root.children.forEach(collapse);

update(root);

// Collapse the node and all it's children
function collapse(d) {
  if (d.children) {
    d._children = d.children;
    d._children.forEach(collapse);
    d.children = null;
  }
}

function update(source) {
  // Assigns the x and y position for the nodes
  var treeData = treemap(root);

  // Compute the new tree layout.
  var nodes = treeData.descendants(),
    links = treeData.descendants().slice(1);

  // Normalize for fixed-depth.
  nodes.forEach(function(d) {
    d.y = d.depth * 180;
  });

  // ****************** Nodes section ***************************

  // Update the nodes...
  var node = svg.selectAll("g.node").data(nodes, function(d) {
    return d.id || (d.id = ++i);
  });

  // Enter any new modes at the parent's previous position.
  var nodeEnter = node
    .enter()
    .append("g")
    .attr("class", "node")
    .attr("transform", function(d) {
      return "translate(" + source.y0 + "," + source.x0 + ")";
    })
    .on("click", click);

  // Add Circle for the nodes
  nodeEnter
    .filter(function(d) {
      return !d.data.type || d.data.type !== "data";
    })
    .append("circle")
    .attr("class", "node")
    .attr("r", 1e-6)
    .style("fill", function(d) {
      return d._children ? "lightsteelblue" : "#fff";
    });

  nodeEnter
    .filter(function(d) {
      return d.data.type && d.data.type === "data";
    })
    .append("rect")
    .attr("class", "node")
    .attr("width", 20)
    .attr("height", 20)
    .attr("y", -10)
    .attr("x", -10)
    .style("fill", function(d) {
      return d._children ? "lightsteelblue" : "#fff";
    });

  // Add labels for the nodes
  nodeEnter
    .append("text")
    .attr("dy", "2em")
    .attr("x", function(d) {
      return d.children || d._children ? 13 : 13;
    })
    .attr("text-anchor", function(d) {
      return d.children || d._children ? "start" : "start";
    })
    .text(function(d) {
      return d.data.name;
    });

  // UPDATE
  var nodeUpdate = nodeEnter.merge(node);

  // Transition to the proper position for the node
  nodeUpdate
    .transition()
    .duration(duration)
    .attr("transform", function(d) {
      return "translate(" + d.y + "," + d.x + ")";
    });

  // Update the node attributes and style
  nodeUpdate
    .select("circle.node")
    .attr("r", 10)
    .style("fill", function(d) {
      return d._children ? "lightsteelblue" : "#fff";
    })
    .attr("cursor", "pointer");

  // Remove any exiting nodes
  var nodeExit = node
    .exit()
    .transition()
    .duration(duration)
    .attr("transform", function(d) {
      return "translate(" + source.y + "," + source.x + ")";
    })
    .remove();

  // On exit reduce the node circles size to 0
  nodeExit.select("circle").attr("r", 1e-6);

  // On exit reduce the opacity of text labels
  nodeExit.select("text").style("fill-opacity", 1e-6);

  // ****************** links section ***************************

  // Update the links...
  var link = svg.selectAll("g.link").data(links, function(d) {
    return d.id;
  });

  // Enter any new links at the parent's previous position.
  var linkEnter = link
    .enter()
    .insert("g", "g")
    .attr("class", "link");

  linkEnter
    .append("text")
    .attr("class", "linkLabels")
    .text(function(d, i) {
      if (d.parent && d.parent.children.length > 1) {
        if (!d.parent.index) d.parent.index = 0;
        return d.data.linkname;
      }
    })
    .attr("opacity", 0)
    .attr("dy", "-1em");

  linkEnter
    .append("path")
    .attr("d", function(d) {
      var o = {
        x: source.x0,
        y: source.y0
      };
      return diagonal(o, o);
    })
    .on("mouseover", function() {
      d3.select(this.parentNode)
        .select("text")
        .attr("opacity", 1);
    })
    .on("mouseleave", function() {
      d3.select(this.parentNode)
        .select("text")
        .attr("opacity", 0);
    })
    .attr("stroke-linecap", "round")
    .attr("marker-start", "url(#end)");

  // UPDATE
  var linkUpdate = linkEnter.merge(link);

  // Transition back to the parent element position
  linkUpdate
    .select("path")
    .transition()
    .duration(duration)
    .attr("d", function(d) {
      return diagonal(d, d.parent);
    });

  linkUpdate
    .select("text")
    .transition()
    .duration(duration)
    .attr("transform", function(d) {
      if (d.parent) {
        return (
          "translate(" +
          (d.parent.y + d.y) / 2 +
          "," +
          (d.parent.x + d.x) / 2 +
          ")"
        );
      }
    });

  // Remove any exiting links
  link.exit().each(function(d) {
    d.parent.index = 0;
  });

  var linkExit = link
    .exit()
    .transition()
    .duration(duration);

  linkExit.select("path").attr("d", function(d) {
    var o = {
      x: source.x,
      y: source.y
    };
    return diagonal(o, o);
  });

  linkExit.select("text").style("opacity", 0);

  linkExit.remove();

  // Store the old positions for transition.
  nodes.forEach(function(d) {
    d.x0 = d.x;
    d.y0 = d.y;
  });

  // Creates a curved (diagonal) path from parent to the child nodes
  function diagonal(s, d) {
    path = `M ${s.y} ${s.x}
            C ${(s.y + d.y) / 2} ${s.x},
                ${(s.y + d.y) / 2} ${d.x},
                ${d.y} ${d.x}`;
    return path;
  }

  // Toggle children on click.
  function click(d) {
    if (d.children) {
      d._children = d.children;
      d.children = null;
    } else {
      d.children = d._children;
      d._children = null;
    }
    update(d);
  }
}
.node circle {
  fill: #fff;
  stroke: steelblue;
  stroke-width: 3px;
}

.node text {
  font: 12px sans-serif;
}

.link {
  fill: none;
  stroke: #ccc;
  stroke-width: 2px;
}

.link path {
  fill: none;
  stroke: #ccc;
  stroke-width: 2px;
}

.link text {
  font: 12px sans-serif;
  stroke: #333;
  stroke-width: 1;
}
<!DOCTYPE html>
<meta charset="UTF-8">
<style>

</style>

<body>
  <!-- load the d3.js library -->
  <script src="https://d3js.org/d3.v4.min.js"></script>
</body>

redpajama_set_name: RedPajamaStackExchange


text:
Q: Как в списке в json командой удалить айди пользователя? Пример:
Фаил users.json в нём есть [айди, айди, т.д...], как мне командой, заставить убрать айди то котрое я укажу? Если можно то напешите подробно!
idT - список этих айди
idO - является само айди в списке

A: from json import load, dump
from discord.ext import commands

@commands.command()
async def removeID(ctx: commands.Context, id):
    with open("users.json", 'r') as f:
        idT = load(f)

    del idT[id]

    with open("users.json", 'w') as f:
        dump(idT, f)


Please put the name of the person the gift certificate is for and the address the gift card should be sent to if different than the address of the purchaser. If you received a gift certificate through PayPal for the holidays you may use it here as well. Please email with any questions, thanks!


Plants commonly called "ice plants" comprise those once all lumped botanically into a genus named Mesembryanthemum. All low-growing succulent perennials, they conserve water in their leaves, but depending on their native habitats, they tolerate or require differing water regimens. Those native to southern Africa that naturally receive summer rains must not be allowed to dry out like more arid ice plant species.
This ice plant genus hails from South Africa where it's called sour fig and thrives in dry sandy soils. In fact, it prospers so well on rocky and sandy sunny soils that in California it chokes out native plants on beaches and is considered invasive. High humidity causes fungal rot, so allow natural rainfall to sustain these plants. Too much rain anytime of year in moist soils leads to death.
Usually called the red spike ice plants, those in the Cephalophyllum group appreciate regular watering in a well-draining soil when the plants develop new leaves and are in flower, a time frame of early winter to mid-spring. Greatly reduce watering in the heat of summer.
Perhaps this plant genus, Delosperma, comprises the greatest number of ice plant species that gardeners across much of North America know and grow. These cold-hardy succulents manage to survive with a little moisture in the heat of summer, but appreciate regular watering or rains when growing. Of course, do not overwater, as light waterings just to sustain plump foliage and ample flowering is the goal, not encouraging stem and leaf rot.
Members of the Drosanthemum genus also appreciate water in summer when they actively grow and flower. Reduce watering in their well-draining soils in autumn and winter.
The Lampranthus species of ice plants was once called Oscularia, something to note when looking through garden literature dating earlier than the year 2000. There are scores of species, all of which need watering during the spring or summer when they flower and put on new growth. Diminish watering from autumn to early spring so stems do not rot away. Many of the Lampranthus ice plants gain favor as hanging basket specimens since their stems grow so long.


text:
San Esteban de los Patos is een gemeente in de Spaanse provincie Ávila in de regio Castilië en León met een oppervlakte van 10,36 km². San Esteban de los Patos telt  inwoners ().

Demografische ontwikkeling

Bron: INE, 1857-2011: volkstellingen

Gemeente in Ávila

redpajama_set_name: RedPajamaWikipedia


A day trip to Hudson via Amtrak® with a return sunset boat ride to Albany on The Dutch Apple Cruise Line.
Friday night marks the grand opening of the Hudson River Café Coffee House at 227 Quail St. with an electronic dubs show to jump start the new venture. The 1,700-square-foot shop is the brainchild of Anton Pasquill, a graduate of the state University at Albany. Pasquill has garnered support from his mother and grandmother to get the shop up and running. The show Friday features Heady Productions - including Brother Suarez, Just the Sauce, DJ Far East, and Mr. Kissner.
"We don't throw your typical parties, we're riding the wave of resurgence of electronic music and I will play any space I can find," said Matthew Davidowicz. Invitations for the event have been circulated via Facebook and word-of-mouth and Pasquill anticipates about 100 patrons Friday. "People should get here early on Friday, I'm expecting it to get full very quickly," he said.
Not only is the Café a music venue but it also has a tranquil atmosphere, a full espresso bar, as well as pastries, a full sandwich menu, and free wireless internet. The espresso bar offers lattes, chai lattes and regular coffee.
Hudson River Café gets its coffee from Capital City Roasters in the Hudson Valley, and each cup is made with freshly ground coffee beans. A cup of coffee runs from $1.75 to $4. In addition, the cafe also serves a full breakfast sandwich menu and a "Hudson Hogie" menu for lunch and dinner.
The cover charge for the 10 p.m. show Friday night is $5. The Café will host a show on Saturday night, Dec. 11, when local band "Tarot" performs at 9:30 p.m.
New owner Pasquill has an economics degree and has worked for a number of years at local coffee houses and restaurants including both at the Muddy Cup and Subway. The moment he graduated he wanted to open something unique and exciting. His father suggested he look at spots on Quail Street and from there the Hudson River Café was born.
Inside the old Hudson River Telephone Company building is a new interesting design with inviting lounge tables and couches, as well as old school arcade games.
Hudson River Café is currently working on an "open mic" night schedule and will also host a regular venue – "starving artists Thursdays." Performers will have an hour or so to play a set of their music in exchange for food and drink, compliments of the café.
It is really a local artists' playground. According to Pasquill, his main goal is to "ramp up" the café as a musical venue. The cafe operator hopes to develop the spot into a showcase for local artists as well. Every Friday of the month Hudson River will feature their work. The Café is big enough for two artists to display work at the same time.
"This is what Albany is missing, come visit us," said Pasquill.
October 3, 2010 - Biketoberfest/NJSPCA Poker Run - $15 for all coming!!
Music, Poker Run, Contests, Prizes and Fun while supporting a great organization.
Please help us raise money for the NJSPCA by joining us for a day of awesome music and fun!
Admission: $15 at the door, in advance or if you're on one of the runs!
There are 4 different poker runs all leading to an all day concert at Hidden Valley Resort in Vernon NJ which will be the last stop on all of the runs. For people participating in the runs at your first stop is where you will pay for the days events.
For those who will be purchasing tickets online please bring actual ticket (not receipt for ticket, they will not be honored) to the first stop of the run you will be on. If you are not participating in the run bring ticket to the gate at Hidden Valley the day of the event.
Doors will open at Hidden Valley at 12:30pm!
9:00 - 11:00 Indoor Show - House Band/Open Jam- Mike Lawlor, Mike VanTine, Tim Roberts.
NEW YORK – The U.S. Army Corps of Engineers, New York District, has awarded a $3.3 million contract to Great Lakes Dredge & Dock Company of Oak Brook, Ill., to perform maintenance dredging of the Hudson River Federal Navigation Channel to improve access for ships going in and out of the Port of Albany.
Approximately 60,000 cubic yards of material will be removed from the Albany Turning Basin and placed upland at the federally owned Houghtaling Island Placement Site.
Work required to prepare the placement site to accept the dredged material is expected to begin in mid- September. A mechanical dredge is anticipated to be on site in early October to begin actual in-water dredging activities.
The $3.3 million includes $575,000 from the American Recovery and Reinvestment Act, better known as the President's "Stimulus" package. The stimulus money is specifically designated for work at the Houghtaling Island Placement Site to increase its capacity.
The Port of Albany is located approximately 125 miles north of the New York and New Jersey Harbor up the Hudson River and can accommodate ships with up to a 32' draft.
Summer at the NYS Museum!
8/19 - Food for Thought: "Philospher Kings"
There is certainly something special about playing at the WAMC Performing Arts Studio. I didn't know what to expect the first time I played there, but after a terrific experience, I knew I would go back again and again. The staff is great, the sound spectacular and the audiences are warm and responsive. It's all you could want from ANY venue and nestled right in the heart of Albany. Who knew?
9/11 - Asbury Shorts New York: 30th Anniversary "An Evening of the World's Best Short Films"
9/16 - Food for Thought: "Queen of the Sun: What are the bees telling us?"
9/23 - Film/Discussion: "The Shadow Effect"
All tickets are for GENERAL ADMISSION seating - no reserved seating. The Linda - WAMC's Performing Arts Studio does not exchange or refund tickets purchased for events at the Linda unless WAMC cancels the show. In that case we will contact you with options. If you have any questions about this policy, please feel free to contact Howard Glassman at 465-5233 ext 145. Thank you.
The Linda is handicapped accessible.
Your event ticket does not include parking. Click here for parking information.


WASHINGTON, D.C., June 5, 2015 – Today, Sports Fans Coalition Chairman David Goodfriend named SackNFLTaxBreaks.org co-founder Ryan Rudominer — a lifelong sports fan and veteran communications strategist in our nation's capital—as Chairman of the Sports Fan Coalition's Mid-Atlantic region. Rudominer comes to Sports Fans fresh off having helped sack the National Football League's nonprofit tax-exempt status, a special exception in the tax code carved out by Congress in the 1960s. SackNFLTaxBreaks.org was launched on the eve of Super Bowl XLVIII by Rudominer and co-founder Lynda Woolard, a New Orleans Saints fan whose Change.org petition calling on Congress to "Revoke the Tax-Exempt Status of the NFL" collected nearly half a million signatures. "When Ryan helped to take down the NFL's longstanding tax exempt status, he became a hero to American sports fans and proved he was the right guy to take a new leadership role with Sports Fans Coalition," said David Goodfriend, Chairman of the Sports Fan Coalition. "For sports fans of the mid-Atlantic region and beyond, Ryan will be a great champion." "Our victory in pressuring the NFL to give up its nonprofit tax-exempt status is just the tip of the iceberg when it comes to ending taxpayer giveaways that benefit the most profitable sports leagues on the planet," said Rudominer. "Together we kicked off a movement of nearly half a million sports fans from states and congressional districts across the country – one that cuts across party labels, socio-economic status, religion, gender, race, and ethnicity. Today I am truly honored to join Sports Fans Coalition in this exciting new capacity and look forward to achieving continued hard-earned victories on behalf of fellow sports fans everywhere." A Wisconsin native and proud Green Bay Packers fan and shareholder, Rudominer lives and works in our nation's capital where he is a principal at R2 Strategic Consulting, a strategic communications, advocacy and media relations firm. About Sports Fans Coalition: The nation's largest sports fan advocacy group in the public policy arena, founded by Clinton and Bush White House staffers in 2009 and based in Washington, D.C., Sports Fans Coalition advocated for an end to the Federal Communications Commission's "Sports Blackout Rule," culminating in a unanimous Commission vote in 2014 to eliminate the rule and the NFL's announcement in 2015 that it would suspend its own local blackout policy.
Charter Communications announced today that beginning next Tuesday, June 9th, its subscribers in Los Angeles will be able to view Dodgers games on SportsNet LA. For over a year, while Comcast tried to buy Time Warner Cable (the parent of SportsNet LA), Sports Fans Coalition opposed the deal, pointing to the fact that only Time Warner Cable subscribers could view Dodgers games in their home market. Comcast eventually gave up its bid for Time Warner Cable amidst overwhelming opposition to the deal. Today's announcement vindicates Sports Fans Coalition's staunch advocacy on behalf of L.A. Dodgers fans. Charter has announced its intent to buy Time Warner Cable but, unlike Comcast, seems to understand the importance of listening to sports fans and making the games more available. That's good. Charter should be cheered by fans for getting this issue right. We hope it means even more availability of Dodgers games in the future.
Fans Beat Comcast in Upset!
Thanks to outspoken fans concerned about missing their home team sports, together with consumer groups, businesses, and other opponents of the deal, the FCC and Dept. of Justice decided to oppose Comcast's acquisition of Time Warner Cable. Comcast announced it is withdrawing its bid. Both cable companies have atrocious records of mistreating fans by withholding games. Sports Fans Coalition hopes that the outcome of this proceeding will inspire better treatment of fans, particularly in Los Angeles, where Time Warner Cable still withholds Dodgers games from 70% of fans there.


text:
package com.kii.cloud.board;

import java.text.DateFormat;
import java.util.List;

import android.app.AlertDialog;
import android.app.ListActivity;
import android.content.AsyncQueryHandler;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Color;
import android.net.Uri;
import android.os.Bundle;
import android.text.TextUtils;
import android.text.format.DateUtils;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.TextView;
import android.widget.Toast;

import com.kii.ad.KiiAdNetLayout;
import com.kii.cloud.board.cache.TopicCache;
import com.kii.cloud.board.sdk.Constants;
import com.kii.cloud.board.sdk.KiiBoardClient;
import com.kii.cloud.board.sdk.Message;
import com.kii.cloud.board.sdk.Topic;
import com.kii.cloud.board.utils.AdsUtil;
import com.kii.cloud.board.utils.ProgressingDialog;
import com.kii.cloud.board.utils.Utils;
import com.kii.cloud.storage.KiiObject;
import com.kii.cloud.storage.callback.KiiObjectCallBack;
import com.kii.cloud.storage.query.KQExp;
import com.kii.cloud.storage.query.KiiQuery;
import com.kii.cloud.storage.query.KiiQueryResult;

public class RemoteMessageListActivity extends ListActivity {
    private ChatListAdaptor mAdapter;
    private Cursor mCursor;
    ProgressingDialog progressing;
    private TextView mUpdateTime;
    private KiiAdNetLayout mAdLayout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        requestWindowFeature(Window.FEATURE_NO_TITLE);

        setContentView(R.layout.remote_thread);

        mUpdateTime = (TextView) findViewById(R.id.header_text);

        ListView lv = getListView();
        lv.setFastScrollEnabled(false);
        lv.setTextFilterEnabled(true);
        lv.setOnCreateContextMenuListener(this);

        mAdapter = (ChatListAdaptor) getLastNonConfigurationInstance();
        if (mAdapter == null) {
            mAdapter = new ChatListAdaptor(getApplication(), this,
                    R.layout.chat_list_item, mCursor, new String[] {},
                    new int[] {});
            setListAdapter(mAdapter);
            setTitle(R.string.app_name);
            getListCursor(mAdapter.getQueryHandler(), null);
        } else {
            mAdapter.setActivity(this);
            setListAdapter(mAdapter);
            mCursor = mAdapter.getCursor();
            if (mCursor != null) {
                init(mCursor);
            } else {
                getListCursor(mAdapter.getQueryHandler(), null);
            }
        }

        progressing = new ProgressingDialog(this);
        updateRefreshTime(false);
        Intent intent = getIntent();
        String action = intent.getAction();
        if (!TextUtils.isEmpty(action)
                && action.contentEquals(Constants.ACTION_REFRESH)) {
            handleRefresh(null);
        }

        if(Constants.ENABLE_ADS){
	        mAdLayout = AdsUtil.getKiiAdsLayout(this, Constants.APP_ID,
	                Constants.APP_KEY);
	        AdsUtil.addToLayout(this, R.id.main_remote, mAdLayout);
        }

    }

    private static final int MENU_DELETE = 0;

    @Override
    public boolean onContextItemSelected(MenuItem item) {
        final AdapterContextMenuInfo info = (AdapterContextMenuInfo) item
                .getMenuInfo();

        if (item.getItemId() == MENU_DELETE) {
            progressing.showProcessing(0, "Deleting Thread...");
            mCursor.moveToPosition(info.position);
            final int idx = mCursor.getColumnIndex(TopicCache.URI);
            final String uriString = mCursor.getString(idx);
            final Uri uri = Uri.parse(uriString);
            KiiQuery query = new KiiQuery();
            query.setWhere(KQExp.equals(Message.PROPERTY_TOPIC, uriString));
            KiiObject
                    .deleteQuery(null, KiiBoardClient.CONTAINER_MESSAGE, query);
            KiiObject obj = new KiiObject(uri);
            obj.delete(new KiiObjectCallBack() {
                @Override
                public void onDeleteCompleted(int token, boolean success,
                        Exception exception) {
                    if (success) {
                        Uri deleteUri = ContentUris.withAppendedId(TopicCache.CONTENT_URI,
                                info.id);
                        RemoteMessageListActivity.this.getContentResolver()
                                .delete(deleteUri, null, null);
                    }
                    progressing.closeProgressDialog();
                    mAdapter.notifyDataSetChanged();
                }

            });

        }

        return super.onContextItemSelected(item);
    }

    @Override
    protected void onStop() {
        super.onStop();
        mAdLayout = null;
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mAdLayout = null;
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v,
            ContextMenuInfo menuInfo) {
        menu.add(0, MENU_DELETE, 0, "Delete");
        super.onCreateContextMenu(menu, v, menuInfo);
    }

    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        Intent intent = new Intent(this, RemoteConversationActivity.class);
        intent.putExtra(Utils.INTENT_TOPIC_ID, id);

        startActivity(intent);
    }

    public void init(Cursor cursor) {
        mAdapter.changeCursor(cursor);
    }

    public void handleRefresh(View v) {
        progressing.showProcessing(0, "Refreshing Topic info...");
        mQuery = new KiiQuery();
        mQuery.setLimit(25);
        KiiObject.query(mCallBack, KiiBoardClient.CONTAINER_TOPIC, mQuery);
    }

    private KiiQuery mQuery;
    KiiObjectCallBack mCallBack = new KiiObjectCallBack() {
        @Override
        public void onQueryCompleted(int token, boolean success,
                KiiQueryResult<KiiObject> objects, Exception exception) {
            progressing.closeProgressDialog();
            if (success) {
                List<KiiObject> result = objects.getResult();
                updateLocalDB(result);
                updateRefreshTime(true);
            }
        }
    };

    public static final String TAG = "RemoteMessageList";

    private void updateRefreshTime(boolean isUpdatePreference) {
        long time = System.currentTimeMillis();
        if (isUpdatePreference) {
            KiiBoardClient.setUpdateTime(this, time);
        } else {
            time = KiiBoardClient.getUpdateTime(this);
        }

        if (time > 0) {
            mUpdateTime.setText("Last refresh time:"
                    + Utils.formatTimeStampString(this, time, true));
        }
    }

    public void handleNewTopic(View v) {
        LayoutInflater factory = LayoutInflater.from(this);
        final View textEntryView = factory.inflate(
                R.layout.alert_dialog_text_entry, null);
        AlertDialog dialog = new AlertDialog.Builder(this)
                .setIcon(R.drawable.alert_dialog_icon)
                .setTitle("Create new topic")
                .setView(textEntryView)
                .setPositiveButton("Create",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog,
                                    int whichButton) {
                                TextView input = (TextView) textEntryView
                                        .findViewById(R.id.topic_edit);
                                String topic_name = input.getText().toString();
                                if (!TextUtils.isEmpty(topic_name)) {
                                    KiiObject topic = new KiiObject(
                                            KiiBoardClient.CONTAINER_TOPIC);
                                    topic.set(Topic.PROPERTY_NAME, topic_name);
                                    topic.set(Topic.PROPERTY_CREATOR,
                                            KiiBoardClient.getInstance()
                                                    .getloginUser()
                                                    .getUsername());

                                    progressing.showProcessing(0,
                                            "Creating topic...");
                                    topic.save(new KiiObjectCallBack() {
                                        @Override
                                        public void onSaveCompleted(int token,
                                                boolean success,
                                                KiiObject object,
                                                Exception exception) {
                                            progressing.closeProgressDialog();
                                            if (success) {
                                                KiiObject newTopic = (KiiObject) object;
                                                ContentValues values = new ContentValues();
                                                values.put(
                                                        TopicCache.CREATOR_ID,
                                                        newTopic.getString(Topic.PROPERTY_CREATOR));
                                                values.put(
                                                        TopicCache.NAME,
                                                        newTopic.getString(Topic.PROPERTY_NAME));
                                                values.put(TopicCache.URI,
                                                        newTopic.toUri()
                                                                .toString());
                                                values.put(
                                                        TopicCache.DATE,
                                                        newTopic.getModifedTime());
                                                RemoteMessageListActivity.this
                                                        .getContentResolver()
                                                        .insert(TopicCache.CONTENT_URI,
                                                                values);
                                            } else {
                                                Toast.makeText(
                                                        RemoteMessageListActivity.this,
                                                        "create topic error!",
                                                        Toast.LENGTH_SHORT)
                                                        .show();
                                            }

                                        }

                                    });
                                }
                            }
                        })
                .setNegativeButton("Cancel",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog,
                                    int whichButton) {

                            }
                        }).create();

        dialog.show();
    }

    private void updateLocalDB(List<KiiObject> entities) {
        getContentResolver().delete(TopicCache.CONTENT_URI, null, null);

        if (entities == null || entities.size() == 0)
            return;
        for (KiiObject obj : entities) {
            ContentValues values = new ContentValues();
            values.put(TopicCache.CREATOR_ID,
                    obj.getString(Topic.PROPERTY_CREATOR, ""));
            values.put(TopicCache.NAME, obj.getString(Topic.PROPERTY_NAME, ""));
            values.put(TopicCache.URI, obj.toUri().toString());
            values.put(TopicCache.DATE, obj.getModifedTime());
            getContentResolver().insert(TopicCache.CONTENT_URI, values);
        }
        mCursor.requery();
        mAdapter.notifyDataSetChanged();
    }

    private Uri mUri = TopicCache.CONTENT_URI;

    public Cursor getListCursor(AsyncQueryHandler async, String filter) {
        Cursor ret = null;
        String selection = null;

        if (filter != null)
            selection = filter;

        if (async != null) {
            async.startQuery(0, null, mUri, null, selection, null, null);
        } else {
            ret = managedQuery(mUri, null, selection, null, null);
        }

        return ret;
    }

    public Cursor getListCursor() {
        return mCursor;
    }

    public void setListCursor(Cursor c) {
        mCursor = c;
    }

    static class ChatListAdaptor extends SimpleCursorAdapter {
        private AsyncQueryHandler mQueryHandler;
        private RemoteMessageListActivity mActivity;
        private int mTitleIdx;

        private boolean mConstraintIsValid = false;
        private String mConstraint = null;

        public class ViewHolder {
            public TextView line1;
            public TextView time;
        }

        class QueryHandler extends AsyncQueryHandler {
            QueryHandler(ContentResolver res) {
                super(res);
            }

            @Override
            protected void onQueryComplete(int token, Object cookie,
                    Cursor cursor) {
                mActivity.init(cursor);
            }
        }

        public ChatListAdaptor(Context context,
                RemoteMessageListActivity currentactivity, int layout,
                Cursor c, String[] from, int[] to) {
            super(context, layout, c, from, to);
            mActivity = currentactivity;
            mQueryHandler = new QueryHandler(context.getContentResolver());
        }

        @Override
        public View newView(Context context, Cursor cursor, ViewGroup parent) {
            View v = super.newView(context, cursor, parent);
            ViewHolder vh = new ViewHolder();
            vh.line1 = (TextView) v.findViewById(R.id.line1);
            vh.time = (TextView) v.findViewById(R.id.time);
            v.setTag(vh);
            int position = cursor.getPosition();
            if (position % 2 == 0) {
                v.setBackgroundColor(Color.rgb(0xFA, 0xFA, 0xFA));
            } else {
                v.setBackgroundColor(Color.rgb(0xF7, 0xF7, 0xF7));
            }
            return v;
        }

        @Override
        public void bindView(View view, Context context, Cursor cursor) {
            ViewHolder vh = (ViewHolder) view.getTag();
            String name = cursor.getString(mTitleIdx);
            vh.line1.setText(name);
            long time = cursor.getLong(cursor.getColumnIndex(TopicCache.DATE));
            vh.time.setText(DateUtils.formatSameDayTime(time / 1000,
                    System.currentTimeMillis(), DateFormat.DEFAULT,
                    DateFormat.DEFAULT));
        }

        @Override
        public Cursor runQueryOnBackgroundThread(CharSequence constraint) {
            String s = constraint.toString();
            if (mConstraintIsValid
                    && ((s == null && mConstraint == null) || (s != null && s
                            .equals(mConstraint)))) {
                return getCursor();
            }

            Cursor c = mActivity.getListCursor(null, s);
            mConstraint = s;
            mConstraintIsValid = true;
            return c;
        }

        public AsyncQueryHandler getQueryHandler() {
            return mQueryHandler;
        }

        public void setActivity(RemoteMessageListActivity newactivity) {
            mActivity = newactivity;
        }

        @Override
        public void changeCursor(Cursor cursor) {
            if (cursor != mActivity.getListCursor()) {
                mActivity.setListCursor(cursor);
                getColumnIndices(cursor);
                super.changeCursor(cursor);
            }

        }

        private void getColumnIndices(Cursor cursor) {
            if (cursor != null) {
                mTitleIdx = cursor.getColumnIndexOrThrow(TopicCache.NAME);
            }
        }

    }
}

redpajama_set_name: RedPajamaGithub


text:
"...all the past is but a beginning of a beginning, and that all that is and has been is but the twilight of dawn."
— H.G. Wells
A Close Call
By Kevin at Thu, 06/23/2011 - 6:45pm
A small asteroid will skim past Earth on Monday:
http://www.skyandtelescope.com/observing/home/124430479.html
The Known Universe by AMNH
By kuky at Sun, 04/17/2011 - 9:18am
The Known Universe takes viewers from the Himalayas through our atmosphere and the inky black of space to the afterglow of the Big Bang. Every star, planet, and quasar seen in the film is possible because of the world's most complete four-dimensional map of the universe, the Digital Universe Atlas that is maintained and updated by astrophysicists at the American Museum of Natural History. The new film, created by the Museum, is part of an exhibition, Visions of the Cosmos: From the Milky Ocean to an Evolving Universe, at the Rubin Museum of Art in Manhattan through May 2010.
Winter Solstice Eclipse
A Total Lunar Eclipse will occur on the morning of Tuesday, December 21, 2010 from 1:33 am to 5:01 am.
For more info see the Newark Museum' Blog
Comet 103p/Hartley2
By ebfaulkner6a at Fri, 09/24/2010 - 6:34am
103p/Hartley2
This video was taken with my newly purchased Astrotech 111EDT telescope, Starlight Xpress ccd SVXF-H9 and guider, on a CGEM mount, 37x60 sec images combined of Comet 103p/Hartley2. Wait and watch as the comet moves between two stars and ends past another bright star (I did not get their names). Taken from Whiting, New Jersey
M82 Galaxy's Mysterious Radio Waves by Linda Moulton Howe
By JohnMiksits at Fri, 05/28/2010 - 8:42am
Einstein-Rosen bridge
Tom Muxlow
http://www.earthfiles.com/news.php?ID=1705&category=Science
I was listening to the radio program Coast to Coast this morning and heard about a mysterious object in M82. http://www.coasttocoastam.com/ I believe this program often has off the wall articles, but the story I've linked is about astronomy. The link above cuts straight to the story.
State of New Jersey offers Non-Profits computers
Pentium III
The State offers non-profit charitable organizations the chance to get computers. I don't see the NJAG as such a charity, but we do help schools from time to time and other and it is defined and registered as a non-profit with NJ. Should we look into getting one for say: astrophotography, web development, SETI, etc?
http://www.state.nj.us/treasury/surpluspc/
Any thoughts on a project?
SETI's Best Chance: Find the Beacon
If we're going to get lucky with SETI, it's probably going to be through the reception of an interstellar beacon rather than the chance detection of an electronic emission from space. Sure, chance catches are possible, and for all we know odd receptions like the WOW! signal of 1977 might be cases in point.
The ISS has a Living Room WIndow!
cupola
Dark Matter Spectrophomoter being test for flight to ISS
Cool Astronomy News
Lots of cool astronomy news coming out of Washington this week!
See: NASA at AAS

redpajama_set_name: RedPajamaCommonCrawl


text:
"Feroze is not financially stable right now", says the actor's lawyer
by Web Desk December 6, 2022
Following the case of children's maintenance, Feroze Khan's lawyer said he is not getting big projects after the allegations made by his former wife against him.
While talking to the media, Feroze Khan's lawyer shared the latest updates related to the case of the former couple's children's maintenance and the amount asked by their mother Aliza.
He said, "Feroze Khan is not in a good financial position right now because of the allegations against him. He is not getting big projects".
He further said that "we will submit a proposal on 15 December in Court in which we will mention the amount Feroze will give presently because work is not being offered at the moment. If in future he gets big projects we will cooperate with Aliza".
He said that we hope that madam Aliza and her family will play a positive role in solving the case respectfully.
Tags: Aliza Sultan case children Feroze khan maintenance
Hamza Firdous stands with Feroze Khan amid recent controversy involving fellow celebrities
Hamza Firdous, son of veteran actor Firdous Jamal recalled Feroze Khan's step to stand for his father when Momina Duraid
"That one tweet changed my entire life, I lost contracts worth millions of rupees": Ali Zafar
Singer and actor Ali Zafar recently appeared on The Talk Talk Show and talked about an alleged case of harassment
Feroze Khan's ex-brother-in-law Shamoon Abbasi urges people to stop interfering in other's domestic matters
Pakistani actor and Humaima Malick's ex-husband Shamoon Abbasi shared his opinion about the recent controversy surrounding Feroze Khan and urged


There's an elephant in the room. It's a phrase that hails from a short 1814 fable, in which a man enjoyed all the small wonders of a museum but failed completely to see the giant elephant exhibition. It's a brief read and pretty much encapsulates the idiom: "You can't see the forest for the trees." In short, you get so wrapped up in the detail that you fail to appreciate the bigger picture.
Unfortunately, this definition kind of derails my intention of calling online security the elephant in the room. So, instead, I'd like to invoke a bit of writer's hubris — a dash of arrogance just because I happen to put words to page for a living.
Let's call that elephant in the room a subject that everyone notices yet only discusses superficially before moving on.
This is how we deal with digital security; it's that elephant we mention in passing but don't really want to tackle with full appreciation.
But there is only one consistent answer among experts when it comes to digital security, and that is encryption.
Every other means of making our digital lives more secure is falling away.
The amount of ways to deliver dangerous software onto a device grows every time you see a new headline.
Twenty years ago, a virus — a piece of infected software that had to be run by a user — was how you got a system infected.
Today it can be done with an MMS or the compromised ad network of an unsuspecting site. There have even been reports of malware propagating through sound.
These are examples in the pre-Internet of things days. We joke about malware attaching itself to our cars and fridges, but these are going to be tomorrow's concerns.
Only, they are also yesterday's debates: experts were arguing about connected car security for years before such vehicles arrived on the market — and there is no answer yet.
So, if you think that somebody is on top of the security issue, you are dead wrong. It's the elephant: we'll talk about it, but in tones suggesting that someone else is taking care of business.
We could argue that people need better online habits, that a lot of the fault lies with uninformed and negligent users. Fair enough. But after a century of cars, we still have bad drivers.
This is another elephant we're paying lip service to: security may be too much of a responsibility to be left to the digitally unwashed masses. Data will be stolen, so all we can hope for is that the encryption securing that data will not be breached.
US President Barack Obama opened SXSW in Austin, Texas at the weekend by saying encryption isn't an absolute, that there has to be a middle ground. Well, he's wrong. I don't like an absolute, but some do exist.
For example, a hole in the hull of a space station is an absolute. The mere existence of one would be a catastrophe.
Encryption is the same. It's not the role of a backdoor in software or who controls it — the mere existence of one outweighs its purpose.
Maybe we can trust the US government with backdoor software — although, as Edward Snowden has revealed, we can't — but what about Russia, China and other governments? And will backdoors controlled by governments make us safer?
Politicians: take a hint from Bob Dylan and don't criticise what you clearly don't understand. Admit that you don't appreciate the size of the elephant in the room.
Above all, please stop pretending it's a mouse and that Apple should take care of the problem. You're only endangering every digital citizen and their connected future.


Funny profile pics - Free Dating Chats!
Whatsapp DP Images download: We have at ease the most late DP and survey pic for Whatsapp, Facebook, Instagram and other social media profiles. On our site, you commitment find here composure, attitude, sad, fortunate dp, funny and all types of profile pictures or Whatsapp DP. Latest Whatsapp dp carbons download of female with a guitar profile picture photo girl. Find here 50 beautiful twist images for Whatsapp DP. Best Whatsapp DP for lover profile picture vogue wallpaper photos pics download free.
Most outstanding Cool Whatapp DP pic attitude for the treatment of profile picture photo gallery free download for mobile. Benefit picture lonely broad dp images representing Whatsapp or fb pic photos gallery.
Modern girl sitting dp images download for Whatsapp terrible profile picture wallpaper. Sad boy reflection download for Whatsapp dp photos further pictures wallpaper pics. No DP drawings free download on the side of Whatsapp profile pictures wallpaper photos. Crestfallen whatsapp dp spittings image download for make a bundle picture of unsatisfactory girl photo wallpaper pics.
Latest Whatsapp dp images download for girl statistics picture of Facebook Sad. Every week we upload brand-new profile pictures on our website that you can download free.
Is it really worth risking your life?
There is enough resources in the utilidor to certain that no children out in a continue hungry.
I'm "cute" - does it mean im unattractive?
Cute WhatsApp DP is also very popular among the girls. Profile picture lonely girl dp images for Whatsapp or fb pic photos gallery. But, when it comes to Attitude Profile Pic, Boys have been found to be more attracted towards it. Every week we upload new profile pictures on our website that you can download free. If you are a lover, I am sure you loved these collections.
Facebook Profile Pictures are used to identify the person who is using the Facebook Account. Leave a Reply Cancel reply Your email address will not be published.
There are plentiful mismatched agencies, and they all from contrastive community to talk to and singular (sometimes contradictory) policies and aims.
Holy hell you're twisted. I mean really.


Sophie's Universe, current status. Completed through something like Row 98 at the moment. Reddington and Muad'dib helpfully providing some scale for this massive project. 😸 I've seen lots of versions of Sophie posted over the past few years, but most don't give a true sense of its incredible size.
Who is the real Reddington?
Nel mio 2018 ci sei tu.
A un 2019 all'altezza dei sogni che ho, ma soprattutto pieno di viaggi.
The Scratching Post Saga, a.k.a. How Reddington and Éowyn proved they are too chunky for the likes of a cheap scratching post that skimps on fastening materials 😂😂😂 .


text:
Argus Media: EU urged to put shipping recovery ahead of green deal
Erik Hoffmann global energy and commodity price reporting agency Argus Media on Friday (3 April) published an article on ECSA's plea for the European Commission to prioritise the restoration of the shipping industry before delving into the European Green Deal:
The European Community Shipowners' Associations (ECSA) said the shipping industry has to recover from the impact of the coronavirus pandemic before it can commit to a green deal.
ECSA secretary general Martin Dorsman urged the European Commission to assess the impact of the pandemic on the shipping industry and "work on a recovery plan, before stating that the European green deal is keeping to its deadline no matter what".
The green deal is a plan to decarbonise the EU economy by 2050 through a raft of measures, including carbon market reforms, changes to energy taxation and carbon pricing measures at the EU border. The commission is considering widening the European carbon trading market to cover shipping and road transport.
The EU published a climate law proposal on 4 March as a step towards making the EU's target of zero greenhouse gas (GHG) emissions by 2050 legally binding.
Shipping can be decarbonised by developing more fuel-efficient engines and vessels, and using low-carbon marine fuels such as hydrogen fuel cells, methanol, batteries and ammonia.
Dorsman said it is "impossible for the industry to continue the process of greening the fleet, which was picking up speed before the [coronavirus] pandemic set in, should this continue".
ECSA welcomed the European Green Deal when it was unveiled by the commission in December.
"Through innovation and deployment, we show the rest of the world shipping can be highly competitive while moving towards zero emissions," Dorsman said then.
But as the coronavirus pandemic has curbed shipping demand and particularly passenger ship operations in recent weeks, ECSA said it is unrealistic that the shipping industry will play a part in the move towards a green deal before they have recovered "to sustainable levels of activity".
Many shipping companies "are facing liquidity issues and a sharp decrease in financing options, and a drop in cargo volumes is most likely to happen in the coming months", Dorsman said.
Passenger shipping was hit by the travel bans immediately, but demand for container and bulk shipping has also been severely reduced.
European shipowners own 40% of the global fleet, and shipping makes up 76% of the EU's external trade and 32% of its internal trade, according to ECSA.
Source: Argus Media
Published: 8 April, 2020
Australia highlights regulations on upcoming fuel oil carriage ban
With 1 March just weeks away, the shipping industry is cautioned to pay heed to ways they can comply with the carriage ban and ensure a smooth transition.
Argus Media: Maersk bunker bill 9% lower in 2019
Reporting agency analyses Maersk's marine fuel consumption strategy in preparation for the IMO 2020 transition.
NewOcean Energy net profit up 96%
Hong Kong-based bunker supplier records decrease in local volume due to market developments at China.
Singapore: MPA trials new technology and improves procedures to facilitate crew change
Phase 2 of its Crew Facilitation Centre will be a Centre of Excellence to test-bed emerging technologies that support safer crew change procedures, said MPA.
Endofa top management leaves company
Company CFO, co-founder and head of the Dubai office has left, according to Danish media.
USD 10.5 billion Melaka Gateway project abruptly terminated by state government
Project by KAJ Development was set to be the largest port in the region, but was suddenly terminated in a letter from the state government on 16 November.


Phase 6 Letters and Sounds Weekly planning??
Discussion in 'Primary' started by freshfield, Sep 12, 2010.
Have come across some detailed weekly planning, 3 weeks, from phase 6 which I downloaded last year. It's brilliant and I can't find the remaining weeks! Have been through Resources and Google (the person said they had planned for 24 weeks) Has anyone any idea/or know of such plans? - sorry it's vague, but it's super work. Many thanks.
Are you perhaps thinking of LCP phonics? Nicola Byrne put some of her planning up and it was so popular she published it with LCP. The first three weeks are generally available for all phases. For the rest - you have to buy the scheme.
Use the above link to see if it is the same planning.
Alternatively, look at Support for Spelling which starts at Year 2 and moves into KS2.
It follows Phase 6 but is slightly more detailed.
You can download this from the Strategies site.


text:
ACCEPTED

#### According to
The Catalogue of Life, 3rd January 2011

#### Published in
Phytologia 4:358, t. 2, figs. 1, 2. 1953

#### Original name
null

### Remarks
null


As hydraulic fracturing ("fracking") gains traction in the American energy economy, the supply of American natural gas has skyrocketed, triggering a downshift of the price of gas. Fracking has opened up vast stores of previously inaccessible gas trapped in shale rock more than a mile underground, particularly in gas-rich areas like the Marcellus Shale. This technological boon has benefited natural gas producers, and in the current competitive economy, the new kid on the block (fracking) is edging in on the old standby's financial territory (coal). For the short term, that power shift has put the coal industry on its heels, as coal prices out of central Appalachia have tanked 15.4% in the last year. In roughly the same time frame, natural gas producers and drillers have invested more than $4 billion dollars into the Marcellus Shale—which spans the Appalachian Basin.
However, this dynamic swing of interest, which has prompted coal companies like Alpha Natural Resources to back off production in much of central Appalachia, may not be a long-term economic event. Fracking has problems of its own, primarily in the form of intense Environmental Protection Agency (EPA) scrutiny. Hydraulic fracturing is currently state-regulated, but the EPA and the environmental lobby have teamed up to close the loophole that exempts fracking from federal regulation under the Safe Drinking Water Act. If legislation like the FRAC Act (HR 1084) passes in the near future, the entire fracking industry could be subject to much harsher federal regulations that could stymie or even temporarily stop active fracking operations. The EPA's first section of its forthcoming 2014 study on fracking's environmental impact has garnered mixed reviews. However, the initial report emerged from Wyoming, while the major players in fracking are eastward in Texas and the Appalachian Basin, and the EPA has indicated Wyoming is not indicative of the rest of the country. So while coal has felt the blow of a burgeoning natural gas industry, the natural gas companies face a tough road ahead to remain state regulated: coal has lost the battle, but not the war, and the long term economic effects of the fracking boom remain unclear. In an unexpected twist, an environmental crackdown could actually salvage the struggling coal industry.
 See Liam Denning, Coalface Cracks Under Pressure from Cheap Gas, Wall St. J., Feb. 7, 2012, http://online.wsj.com/article/SB10001424052970203315804577206860331660388.html?mod=WSJ_Energy_leftHeadlines.
 See America's Natural Gas Alliance, Safe & Responsible Development: How We Produce America's New Natural Gas, anga.us, http://anga.us/media/206825/hydraulic%20fracturing%20101.pdf.
 See Denning, supra note 1.
 See Marcellus Shale Coalition, Production Processes, MarcellusCoalition.org, 2011, http://marcelluscoalition.org/marcellus-shale/production-processes/.
 See Ian Thomson & Maya Pope-Chappell, MarketBeat: Stocks to Watch: Micron Technology, Hasbro, Alpha Natural Resources and More, Wall St. J., Feb. 6, 2012, http://blogs.wsj.com/marketbeat/2012/02/06/stocks-to-watch-micron-technology-hasbro-alpha-natural-resources-and-more/?mod=WSJ_qtnews_wsjlatest.
 See Adam Orford, Hydraulic Fracturing: Legislative and Regulatory Trends, Marten Law, Oct. 4, 2011, http://www.martenlaw.com/newsletter/20111004-fracking-roundup.
 See Mead Gruver, Reps. scrutinize EPA frack-pollution link in Wyo., Washington times/Associated Press, Feb. 1, 2012, http://www.washingtontimes.com/news/2012/feb/1/reps-scrutinize-epa-frack-pollution-link-wyoming/#.TymnOB8wHms.email.


text:
Dick Cheney Biopic 'Vice' to Launch in Europe at Capri, Hollywood Film Festival
Nick Vivarelli
Variety December 3, 2018
Annapurna Pictures' Dick Cheney biopic "Vice," starring Christian Bale as the former American vice president, will launch in Europe as the opener of Italy's Capri, Hollywood Film Festival.
The hotly anticipated "Vice" chronicles Cheney's political life, starting with his beginnings as a Washington bureaucrat. Directed by Adam McKay ("The Big Short), the film will screen on the Italian island of Capri on Dec. 27 after opening on Christmas Day in the U.S.
Bale reportedly had to shave his head, bleach his eyebrows and put on 40 pounds for the role ,which explores Cheney's service in the administrations of Richard M. Nixon, Gerald Ford, George H.W. Bush and George W. Bush, and as the CEO of energy management company Halliburton.
Amy Adams co-stars as Lynne Cheney, and the rest of the star-studded cast includes Steve Carell as Donald Rumsfeld and Sam Rockwell as George W. Bush. The producers are Megan Ellison, Will Ferrell, Dede Gardner, Jeremy Kleiner, Kevin J. Messick, Brad Pitt and director McKay.
Pascal Vicedomini, founder and chief of the informal Capri get-together dedicated to launching Oscar hopefuls and forging ties between Hollywood and Italy, said he has not yet confirmed talents and/or producers who will be coming to promote "Vice" besides Andrea Leone, president of the biopic's Italian co-distributor. Leone Film Group and Eagle Pictures will release the biopic in Italian cinemas on Jan. 3, prior to its rollout in key European territories such as the U.K., where "Vice" is scheduled to play on Feb. 1.
As previously announced, the 23rd edition of the fest is being chaired by director and screenwriter Lee Daniels ("Precious"). Career honors will go to helmer Eli Roth for his latest pic "The House With a Clock in Its Walls"; Italy's Matteo Garrone for his drama "Dogman," which is Italy's current contender for the foreign-language Oscar; and prolific Israeli auteur Amos Gitai for the body of his work. Gitai's latest feature is "A Tramway in Jerusalem," which played in Venice.
Other guests expected in Capri include Terry Gilliam, who will introduce his trouble-laden "The Man Who Killed Don Quixote"; Joely Richardson, who will present Henry James adaptation "The Aspern Papers," in which she stars alongside her mother, Vanessa Redgrave; Italy's Mario Martone, who will talk up his "Capri-Revolution," which was shot on the island; and actors Lashana Lynch ("Captain Marvel") and Frederick Schmidt ("Mission: Impossible – Fallout").
Composer Nicholas Britell Reunites With Past Collaborators on 'Beale Street' and 'Vice'
Christian Bale on Playing Dick Cheney and a Panther: 'I Love Crazy Ideas'
'Wildlife' and 'Vice's' Bill Camp on Why Actors Need to Have Full Lives Outside of Work
Subscribe to Variety Newsletters and Email Alerts!
New clothing store catering to Muslim women responds to need in Saint John