Hedera Hashgraph En tant qu’amateur de permaculture, j’ai été tout de suite intrigué par ce nom : Hedera Hashgraph. Hedera vient du latin hedera, lié au lierre, cette plante grimpante qui s’attache, s’étend et avance par réseau. L’image est assez parlante pour une technologie qui veut connecter des acteurs, des applications et des usages différents. Tout comme le lierre, Hedera ambitionne peut-être de s’accrocher aux structures existantes et de se répandre largement. L’anal
bottom of page
(function(){
if (window.__cnJeuxScoreHudV1) return;
window.__cnJeuxScoreHudV1 = true;
var state = { score: 'Score: 0', best: 'Best: ' + (localStorage.getItem('carrementnous_dodge_ball_best_score') || localStorage.getItem('bestScore') || '0') };
function isJeuxPage(){
return //jeux(?:$|[?#/])/.test(window.location.pathname + window.location.search + window.location.hash);
}
function gameIframe(){
return document.querySelector('iframe[title="GAME DODGE BALL"]');
}
function ensureHud(){
var hud = document.getElementById('cn-game-score-hud');
if (!hud) {
hud = document.createElement('div');
hud.id = 'cn-game-score-hud';
hud.innerHTML = '';
document.body.appendChild(hud);
var s = hud.style;
s.position = 'fixed';
s.zIndex = '999999';
s.display = 'none';
s.alignItems = 'center';
s.justifyContent = 'space-between';
s.gap = '8px';
s.boxSizing = 'border-box';
s.pointerEvents = 'none';
s.color = '#fff';
s.background = 'rgba(0,0,0,.78)';
s.border = '1px solid rgba(255,255,255,.55)';
s.borderRadius = '4px';
s.padding = '3px 6px';
s.fontFamily = 'monospace';
s.fontWeight = '800';
s.lineHeight = '1.1';
s.textShadow = '0 1px 2px #000';
}
var left = hud.querySelector('.cn-score-left');
var right = hud.querySelector('.cn-score-right');
if (left) left.textContent = state.score.replace('Score:', 'Score :');
if (right) right.textContent = state.best.replace('Best:', 'Best :');
return hud;
}
function positionHud(){
var hud = ensureHud();
if (!isJeuxPage()) {
hud.style.display = 'none';
return;
}
var iframe = gameIframe();
if (!iframe) {
hud.style.display = 'none';
return;
}
var canvasRect = null;
var frameWidth = 0;
try {
var doc = iframe.contentDocument;
var canvas = doc && doc.getElementById('game');
if (canvas) {
var cr = canvas.getBoundingClientRect();
canvasRect = { x: cr.x, y: cr.y, width: cr.width, height: cr.height };
frameWidth = iframe.contentWindow.innerWidth || 0;
}
} catch (e) {}
if (!canvasRect || !frameWidth) {
hud.style.display = 'none';
return;
}
var ir = iframe.getBoundingClientRect();
var scale = ir.width / frameWidth;
var leftPos = ir.left + canvasRect.x * scale;
var topPos = ir.top + canvasRect.y * scale + 3;
var width = canvasRect.width * scale;
hud.style.display = 'flex';
hud.style.left = Math.round(leftPos) + 'px';
hud.style.top = Math.round(topPos) + 'px';
hud.style.width = Math.round(width) + 'px';
hud.style.height = Math.max(18, Math.round(24 * Math.min(1, Math.max(.78, scale + .28)))) + 'px';
hud.style.fontSize = Math.max(10, Math.min(13, Math.round(width / 16))) + 'px';
}
function injectScoreBridge(){
if (!isJeuxPage()) return false;
var iframe = gameIframe();
if (!iframe) return false;
try {
var win = iframe.contentWindow;
if (!win || win.__cnScorePostPatchV1) return true;
if (!win.CanvasRenderingContext2D) return false;
win.__cnScorePostPatchV1 = true;
var proto = win.CanvasRenderingContext2D.prototype;
var originalFillText = proto.fillText;
proto.fillText = function(text, x, y, maxWidth){
try {
var txt = String(text || '');
if (/^Score:/i.test(txt)) win.parent.postMessage({ type: 'cnDodgeScoreHud', score: txt }, '*');
if (/^Best:/i.test(txt)) win.parent.postMessage({ type: 'cnDodgeScoreHud', best: txt }, '*');
} catch (e) {}
return originalFillText.apply(this, arguments);
};
return true;
} catch (e) {
return false;
}
}
window.addEventListener('message', function(e){
if (!e.data || e.data.type !== 'cnDodgeScoreHud') return;
if (e.data.score) state.score = e.data.score;
if (e.data.best) state.best = e.data.best;
positionHud();
});
function tick(){
injectScoreBridge();
positionHud();
}
window.addEventListener('resize', positionHud, { passive: true });
window.addEventListener('scroll', positionHud, { passive: true });
setInterval(tick, 500);
setTimeout(tick, 250);
setTimeout(tick, 1000);
setTimeout(tick, 2500);
})();