use

‘Restore stops for mofussil buses on Samayapuram service road’




use

Coimbatore car blast: NIA interrogates three accused of raising funds for operation

The NIA sleuths will interrogate them in custody till November 14, said a source privy to the investigation




use

Building a Dictaphone Using Media Recorder and getUserMedia

Chris Mills brushes up his shorthand and shows how the MediaStream Recording API in modern browsers can be used to capture audio directly from the user’s device. Inching ever closer to the capabilities of native software, it truly is an exciting time to be a web developer.


The MediaStream Recording API makes it easy to record audio and/or video streams. When used with MediaDevices.getUserMedia(), it provides an easy way to record media from the user’s input devices and instantly use the result in web apps. This article shows how to use these technologies to create a fun dictaphone app.

A sample application: Web Dictaphone

To demonstrate basic usage of the MediaRecorder API, we have built a web-based dictaphone. It allows you to record snippets of audio and then play them back. It even gives you a visualisation of your device’s sound input, using the Web Audio API. We’ll just concentrate on the recording and playback functionality in this article, for brevity’s sake.

You can see this demo running live, or grab the source code on GitHub. This has pretty good support on modern desktop browsers, but pretty patchy support on mobile browsers currently.

Basic app setup

To grab the media stream we want to capture, we use getUserMedia(). We then use the MediaRecorder API to record the stream, and output each recorded snippet into the source of a generated <audio> element so it can be played back.

We’ll first declare some variables for the record and stop buttons, and the <article> that will contain the generated audio players:

const record = document.querySelector('.record');
const stop = document.querySelector('.stop');
const soundClips = document.querySelector('.sound-clips');

Next, we set up the basic getUserMedia structure:

if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
   console.log('getUserMedia supported.');
   navigator.mediaDevices.getUserMedia (
      // constraints - only audio needed for this app
      {
         audio: true
      })

      // Success callback
      .then(function(stream) {

      })

      // Error callback
      .catch(function(err) {
         console.log('The following `getUserMedia` error occured: ' + err);
      }
   );
} else {
   console.log('getUserMedia not supported on your browser!');
}

The whole thing is wrapped in a test that checks whether getUserMedia is supported before running anything else. Next, we call getUserMedia() and inside it define:

  • The constraints: Only audio is to be captured for our dictaphone.
  • The success callback: This code is run once the getUserMedia call has been completed successfully.
  • The error/failure callback: The code is run if the getUserMedia call fails for whatever reason.

Note: All of the code below is found inside the getUserMedia success callback in the finished version.

Capturing the media stream

Once getUserMedia has created a media stream successfully, you create a new Media Recorder instance with the MediaRecorder() constructor and pass it the stream directly. This is your entry point into using the MediaRecorder API — the stream is now ready to be captured into a <Blob>, in the default encoding format of your browser.

const mediaRecorder = new MediaRecorder(stream);

There are a series of methods available in the MediaRecorder interface that allow you to control recording of the media stream; in Web Dictaphone we just make use of two, and listen to some events. First of all, MediaRecorder.start() is used to start recording the stream once the record button is pressed:

record.onclick = function() {
  mediaRecorder.start();
  console.log(mediaRecorder.state);
  console.log("recorder started");
  record.style.background = "red";
  record.style.color = "black";
}

When the MediaRecorder is recording, the MediaRecorder.state property will return a value of “recording”.

As recording progresses, we need to collect the audio data. We register an event handler to do this using mediaRecorder.ondataavailable:

let chunks = [];

mediaRecorder.ondataavailable = function(e) {
  chunks.push(e.data);
}

Last, we use the MediaRecorder.stop() method to stop the recording when the stop button is pressed, and finalize the Blob ready for use somewhere else in our application.

stop.onclick = function() {
  mediaRecorder.stop();
  console.log(mediaRecorder.state);
  console.log("recorder stopped");
  record.style.background = "";
  record.style.color = "";
}

Note that the recording may also stop naturally if the media stream ends (e.g. if you were grabbing a song track and the track ended, or the user stopped sharing their microphone).

Grabbing and using the blob

When recording has stopped, the state property returns a value of “inactive”, and a stop event is fired. We register an event handler for this using mediaRecorder.onstop, and construct our blob there from all the chunks we have received:

mediaRecorder.onstop = function(e) {
  console.log("recorder stopped");

  const clipName = prompt('Enter a name for your sound clip');

  const clipContainer = document.createElement('article');
  const clipLabel = document.createElement('p');
  const audio = document.createElement('audio');
  const deleteButton = document.createElement('button');

  clipContainer.classList.add('clip');
  audio.setAttribute('controls', '');
  deleteButton.innerHTML = "Delete";
  clipLabel.innerHTML = clipName;

  clipContainer.appendChild(audio);
  clipContainer.appendChild(clipLabel);
  clipContainer.appendChild(deleteButton);
  soundClips.appendChild(clipContainer);

  const blob = new Blob(chunks, { 'type' : 'audio/ogg; codecs=opus' });
  chunks = [];
  const audioURL = window.URL.createObjectURL(blob);
  audio.src = audioURL;

  deleteButton.onclick = function(e) {
    let evtTgt = e.target;
    evtTgt.parentNode.parentNode.removeChild(evtTgt.parentNode);
  }
}

Let’s go through the above code and look at what’s happening.

First, we display a prompt asking the user to name their clip.

Next, we create an HTML structure like the following, inserting it into our clip container, which is an <article> element.

<article class="clip">
  <audio controls></audio>
  <p>_your clip name_</p>
  <button>Delete</button>
</article>

After that, we create a combined Blob out of the recorded audio chunks, and create an object URL pointing to it, using window.URL.createObjectURL(blob). We then set the value of the <audio> element’s src attribute to the object URL, so that when the play button is pressed on the audio player, it will play the Blob.

Finally, we set an onclick handler on the delete button to be a function that deletes the whole clip HTML structure.

So that’s basically it — we have a rough and ready dictaphone. Have fun recording those Christmas jingles! As a reminder, you can find the source code, and see it running live, on the MDN GitHub.


This article is based on Using the MediaStream Recording API by Mozilla Contributors, and is licensed under CC-BY-SA 2.5.


About the author

Chris Mills manages the MDN web docs writers’ team at Mozilla, which involves spreadsheets, meetings, writing docs and demos about open web technologies, and occasional tech talks at conferences and universities. He used to work for Opera and W3C, and enjoys playing heavy metal drums and drinking good beer.

More articles by Chris




use

Five Interesting Ways to Use Array.reduce() (And One Boring Way)

Chris Ferdinandi turns the heat down low and lets the sauce reduce while we take a look at how to add spice to our source with a sprinkling of Array.reduce(). Just a little ingenuity with the humblest of functions.


Of all the modern array methods, the one I had the hardest time wrapping my head around was Array.reduce().

On the surface, it seems like a simple, boring method that doesn’t do much. But below its humble exterior, Array.reduce() is actually a powerful, flexible addition to your developer toolkit.

Today, we’re going to look at some cool things you can do with Array.reduce().

How Array.reduce() works

Most of the modern array methods return a new array. The Array.reduce() method is a bit more flexible. It can return anything. Its purpose is to take an array and condense its content into a single value.

That value can be a number, a string, or even an object or new array. That’s the part that’s always tripped me up – I didn’t realize just how flexible it is!

The syntax

The Array.reduce() accepts two arguments: a callback method to run against each item in the array, and a starting value.

The callback also accepts two arguments: the accumulator, which is the current combined value, and the current item in the loop. Whatever you return is used as the accumulator for the next item in the loop. On the very first loop, that starting value is used instead.

var myNewArray = [].reduce(function (accumulator, current) {
  return accumulator;
}, starting);

Let’s look at some examples to make this all tangible.

1. Adding numbers together

Let’s say you had an array of numbers that you wanted to add together. Using Array.forEach(), you might do something like this:

var total = 0;

[1, 2, 3].forEach(function (num) {
  total += num;
});

This is the cliche example for using Array.reduce(). I find the word accumulator confusing, so in this example, I’m calling it sum, because that’s what it is.

var total = [1, 2, 3].reduce(function (sum, current) {
  return sum + current;
}, 0);

Here, we pass in 0 as our starting value.

In the callback, we add the current value to the sum, which has our starting value of 0 on the first loop, then 1 (the starting value of 0 plus the item value of 1), then 3 (the sum value of 1 plus the item value of 2), and so on.

Here’s a demo.

2. Combining multiple array methods into Array.map() and Array.filter() into a single step

Imagine you had an array of wizards at Hogwarts.

var wizards = [
  {
    name: 'Harry Potter',
    house: 'Gryfindor'
  },
  {
    name: 'Cedric Diggory',
    house: 'Hufflepuff'
  },
  {
    name: 'Tonks',
    house: 'Hufflepuff'
  },
  {
    name: 'Ronald Weasley',
    house: 'Gryfindor'
  },
  {
    name: 'Hermione Granger',
    house: 'Gryfindor'
  }
];

You want to create a new array that contains just the names of wizards who are in Hufflepuff. One way you could do that is by using the Array.filter() method to get back just wizards whose house property is Hufflepuff. Then, you’d use the Array.map() method to create a new array containing just the name property for the remaining wizards.

// Get the names of the wizards in Hufflepuff
var hufflepuff = wizards.filter(function (wizard) {
  return wizard.house === 'Hufflepuff';
}).map(function (wizard) {
  return wizard.name;
});

With the Array.reduce() method, we can get the same array in a single pass, improving our performance. You pass in an empty array ([]) as the starting value. On each pass, you check to see if the wizard.house is Hufflepuff. If it is, you push it to the newArr (our accumulator in this example). If not, you do nothing.

Either way, you return the newArr to become the accumulator on the next pass.

// Get the names of the wizards in Hufflepuff
var hufflepuff = wizards.reduce(function (newArr, wizard) {
  if (wizard.house === 'Hufflepuff') {
    newArr.push(wizard.name);
  }
  return newArr;
}, []);

Here’s another demo.

3. Creating markup from an array

What if, instead of creating an array of names, we wanted to create an unordered list of wizards in Hufflepuff? Instead of passing an empty array into Array.reduce() as our starting value, we’ll pass in an empty string ('') and call it html.

If the wizard.house equals Hufflepuff, we’ll concatenate our html string with the wizard.name wrapped in an opening and closing list item (li). Then, we’ll return the html to become the accumulator on the next loop.

// Create a list of wizards in Hufflepuff
var hufflepuffList = wizards.reduce(function (html, wizard) {
  if (wizard.house === 'Hufflepuff') {
    html += '<li>' + wizard.name + '</li>';
  }
  return html;
}, '');

Add an opening and closing unordered list element before and after Array.reduce(), and you’re ready to inject your markup string into the DOM.

// Create a list of wizards in Hufflepuff
var hufflepuffList = '<ul>' + wizards.reduce(function (html, wizard) {
  if (wizard.house === 'Hufflepuff') {
    html += '<li>' + wizard.name + '</li>';
  }
  return html;
}, '') + '</ul>';

See it in action here.

4. Grouping similar items in an array together

The lodash library has a groupBy() method takes a collection of items as an array and groups them together into an object based on some criteria.

Let’s say you want an array of numbers.

If you wanted to group all of the items in numbers together based on their integer value, you would do this with lodash.

var numbers = [6.1, 4.2, 6.3];

// returns {'4': [4.2], '6': [6.1, 6.3]}
_.groupBy(numbers, Math.floor);

If you had an array of words, and you wanted to group the items in words by their length, you would do this.

var words = ['one', 'two', 'three'];

// returns {'3': ['one', 'two'], '5': ['three']}
_.groupBy(words, 'length');

Creating a groupBy() function with Array.reduce()

You can recreate that same functionality using the Array.reduce() method.

We’ll create a helper function, groupBy(), that accepts the array and criteria to sort by as arguments. Inside groupBy(), we’ll run Array.reduce() on our array, passing in an empty object ({}) as our starting point, and return the result.

var groupBy = function (arr, criteria) {
  return arr.reduce(function (obj, item) {
    // Some code will go here...
  }, {});
};

Inside the Array.reduce() callback function, we’ll check to see if the criteria is a function, or a property of the item. Then we’ll get its value from the current item.

If there’s no property in the obj with that value yet, we’ll create it and assign an empty array as its value. Finally, we’ll push the item to that key, and return the object as the accumulator for the next loop.

var groupBy = function (arr, criteria) {
  return arr.reduce(function (obj, item) {

    // Check if the criteria is a function to run on the item or a property of it
    var key = typeof criteria === 'function' ? criteria(item) : item[criteria];

    // If the key doesn't exist yet, create it
    if (!obj.hasOwnProperty(key)) {
      obj[key] = [];
    }

    // Push the value to the object
    obj[key].push(item);

    // Return the object to the next item in the loop
    return obj;

  }, {});
};

Here’s a demo of the completed helper function.

Special thanks to Tom Bremer for helping me make some improvements to this one. You can find this helper function and more like it on the Vanilla JS Toolkit.

5. Combining data from two sources into an array

Remember our array of wizards?

var wizards = [
  {
    name: 'Harry Potter',
    house: 'Gryfindor'
  },
  {
    name: 'Cedric Diggory',
    house: 'Hufflepuff'
  },
  {
    name: 'Tonks',
    house: 'Hufflepuff'
  },
  {
    name: 'Ronald Weasley',
    house: 'Gryfindor'
  },
  {
    name: 'Hermione Granger',
    house: 'Gryfindor'
  }
];

What if you had another data set, an object of house points each wizard has earned.

var points = {
  HarryPotter: 500,
  CedricDiggory: 750,
  RonaldWeasley: 100,
  HermioneGranger: 1270
};

Imagine you wanted to combine both sets of data into a single array, with the number of points added to each wizard’s data in the wizards array. How would you do it?

The Array.reduce() method is perfect for this!

var wizardsWithPoints = wizards.reduce(function (arr, wizard) {

  // Get the key for the points object by removing spaces from the wizard's name
  var key = wizard.name.replace(' ', '');

  // If the wizard has points, add them
  // Otherwise, set them to 0
  if (points[key]) {
    wizard.points = points[key];
  } else {
    wizard.points = 0;
  }

  // Push the wizard object to the new array
  arr.push(wizard);

  // Return the array
  return arr;

}, []);

Here’s a demo combining data from two sources into an array.

6. Combining data from two sources into an object

What if you instead wanted to combine the two data sources into an object, where each wizard’s name was the key, and their house and points were properties? Again, the Array.reduce() method is perfect for this.

var wizardsAsAnObject = wizards.reduce(function (obj, wizard) {

  // Get the key for the points object by removing spaces from the wizard's name
  var key = wizard.name.replace(' ', '');

  // If the wizard has points, add them
  // Otherwise, set them to 0
  if (points[key]) {
    wizard.points = points[key];
  } else {
    wizard.points = 0;
  }

  // Remove the name property
  delete wizard.name;

  // Add wizard data to the new object
  obj[key] = wizard;

  // Return the array
  return obj;

}, {});

Here’s a demo combining two data sets into an object.

Should you use Array.reduce() more?

The Array.reduce() method has gone from being something I thought was pointless to my favorite JavaScript method. So, should you use it? And when?

The Array.reduce() method has fantastic browser support. It works in all modern browsers, and IE9 and above. It’s been supported in mobile browsers for a long time, too. If you need to go back even further than that, you can add a polyfill to push support back to IE6.

The biggest complaint you can make about Array.reduce() is that it’s confusing for people who have never encountered it before. Combining Array.filter() with Array.map() is slower to run and involves extra steps, but it’s easier to read. It’s obvious from the names of the methods what they’re supposed to be doing.

That said, there are times where Array.reduce() makes things that would be complicated more simple rather than more complicated. The groupBy() helper function is a good example.

Ultimately, this is another tool to add to your toolkit. A tool that, if used right, can give you super powers.


About the author

Chris Ferdinandi helps people learn vanilla JavaScript. He believes there’s a simpler, more resilient way to make things for the web.

Chris is the author of the Vanilla JS Pocket Guide series, creator of the Vanilla JS Academy training program, and host of the Vanilla JS Podcast. His developer tips newsletter is read by thousands of developers each weekday.

He’s taught developers at organizations like Chobani and the Boston Globe, and his JavaScript plugins have been used used by Apple and Harvard Business School. Chris Coyier, the founder of CSS-Tricks and CodePen, has described his writing as “infinitely quote-worthy.”

Chris loves pirates, puppies, and Pixar movies, and lives near horse farms in rural Massachusetts. He runs Go Make Things with Bailey Puppy, a lab-mix from Tennessee.

More articles by Chris




use

Uniqlo turns three in the India market; launches second edition of its collaboration with Italian luxury fashion house Marni

Headquartered in Tokyo, the Japanese apparel brand focusses on technology and sustainability, and its latest collection of fleece jackets is made of recycled PET bottles



  • Life &amp; Style

use

Editorial. Gold users must get a transparent Re-based price

There is a need to provide consumers with a transparently derived domestic reference rate which is under regulatory supervision




use

Editorial. Skilling sops useful, but education is key

There can be no getting away from the fact that the skills crisis in India’s young (15-29 years) reflects a failure of the education system — and the best skilling efforts cannot make up for this lack




use

Editorial. SEBI’s take on household financial savings clears the air

SEBI has calculated net primary and secondary market investment in equity and debt based on actual data at its disposal




use

Use-case approach to drive digital payments, says Worldline India CEO

The payments firm has set up POS terminals at villages in Tamil Nadu for payment of taxes and also for devotees making payments to temples.



  • Money &amp; Banking

use

Deutsche Bank infuses ₹5,113 crore capital into India operations

Over the last decade, the bank has significantly increased its capital investments, tripling the capital base for Deutsche Bank Group in India



  • Money &amp; Banking

use

Bevel Up - Drugs, Users and Outreach Nursing / directed by: Nettie Wild ; produced by: Fiona Gold, Juanita Maginley, Betsy Carson, Nettie Wild, Svend-Erik Eriksen, Rina Fraticelli ; production agencies: National Film Board of Canada (Montreal), British Co

Montreal : National Film Board of Canada, 2016




use

Reflections on Practice : Pregnant Users / directed by: Nettie Wild ; production agencies: British Columbia Centre for Disease Control. Street Nurse Program (Vancouver), National Film Board of Canada (Montreal)

Montreal : National Film Board of Canada, 2019




use

Topics : Nurses Who Use Drugs / directed by: Nettie Wild ; production agencies: British Columbia Centre for Disease Control. Street Nurse Program (Vancouver), National Film Board of Canada (Montreal)

Montreal : National Film Board of Canada, 2019




use

Govt. is focused on creating conducive environment for industrial growth in Andhra Pradesh, says Finance Minister Keshav

A sum of ₹3,127 crore has been allocated to the sector in the 2024-25 Budget, he says, adding that the government has been able to rekindle interest among investors to make Andhra Pradesh their investment destination of choice




use

Depression, family environment can be causes for adolescents’ poor academic performance




use

RTA makes pneumatic doors mandatory for mofussil and express buses operating from Mangaluru




use

Rape and murder of 8-year-old girl in Mangaluru: Three accused sentenced to death




use

SC refuses to examine plea to appoint 'yoga mitra' instructors in schools

A Bench of Chief Justice of India D Y Chandrachud and Justices J B Pardiwala and Manoj Misra told petitioner advocate Ashwini Kumar Upadhyay that it was a policy matter




use

'Happy Birthday' review: An excuse for a launch

The narrative takes many breaks along the way to accommodate cringe-worthy comedy sequences that comprise characters trying to grope women and sleep with them forcibly.




use

Sunshine Music Tours and Travels review: An excuse for brand promotion

Forget memorable, the passengers are so irritating that one would rather hop off the film and abort the trip




use

Proptech start-up HouseEazy raises $7 mn in funding from Chiratae Ventures, others

Funds will be utilised to fuel company’s growth across NCR




use

Surge in bank credit to CRE linked to high demand for office and warehouse space

With leasing activities surging across major cities and growing interest from big industrial groups, the commercial real estate market shows promising prospects for future lending and growth




use

Rising costs make urban affordable houses unviable for builders

Government’s PM Awas Yojana faces challenges due to rising land prices, construction costs, and pricing limitations for builders




use

Signature Global to deliver 16 msf houses over next two years

The real estate developer is targeting collections of ₹3800 crore in the current fiscal year




use

NRIs are buying more houses in India than before

According to Anarock Group, there was a 15-20 per cent increase in demand by NRIs in 2023 compared with 2022 and the first half of 2024 has seen similar traction




use

Lodha sells houses worth ₹4290 crore in Q2FY25

The Mumbai-based real estate developer said it was the best quarterly sales ever and it came during a period taken up by the inauspicious ‘shraadh’ period when people avoid making large ticket purchases




use

Festive season pushes demand for new houses

There is a growing demand for houses priced above ₹2 crore




use

WeHouse streamlines home construction with transparency, expands to Tier-II cities

By dividing the construction journey into 24 well-defined milestones, the startup provides clients with complete visibility into their projects, aligning payments with milestones to build trust




use

Call to use of path-breaking technology in construction sector

Adoption of insulation technology is currently delivering substantial benefits, including a massive 80 per cent reduction in energy utilization for homes using air conditioning




use

Stereoselective access to furan-fused [5.5.0] bicyclic heterocycles enabled by gold-catalyzed asymmetric [8 + 4] cycloaddition

Org. Chem. Front., 2024, Advance Article
DOI: 10.1039/D4QO01841A, Research Article
Xunhua Wang, Jianhua Wang, Xiaoxun Li
A gold-catalyzed asymmetric [8 + 4] cycloaddition was developed to afford highly functionalized furan/pyrrole-fused [5.5.0] polycyclic heterocycles with good diastereo- and enantioselectivity.
To cite this article before page numbers are assigned, use the DOI form of citation above.
The content of this RSS Feed (c) The Royal Society of Chemistry




use

Copper(II)-catalyzed synthesis of sulfonyl-functionalized quinone-fused cyclopenta[b]indoles via four-component cascade annulation

Org. Chem. Front., 2024, Advance Article
DOI: 10.1039/D4QO01560F, Research Article
Hong Xu, Jie Liao, Fei Ren, Chuan-Rong Zhou, Xiao-Zhuo Liu, Yao Xiao, Dong-Wei Hang, Fuyu Li, Bei Wang, Ji-Yu Wang
Through crucial selective radical tandem process and intramolecular nucleophilic addition, a facile copper-catalyzed four-component cascade has been realized to selectively construct novel sulfonyl-functionalized quinone-fused cyclopenta[b]indole.
To cite this article before page numbers are assigned, use the DOI form of citation above.
The content of this RSS Feed (c) The Royal Society of Chemistry




use

Palladium-catalyzed cascade decarboxylative cyclization of alkyne-tethered aryl iodides with o-bromobenzoic acids for the synthesis of fused isoquinolinones

Org. Chem. Front., 2024, Advance Article
DOI: 10.1039/D4QO01573H, Research Article
Zhaolin Quan, Yubo Duan, Zhengkai Chen
A straightforward approach for the preparation of fused isoquinolinone derivatives via palladium-catalyzed cascade decarboxylative cyclization of alkyne-tethered aryl iodides with o-bromobenzoic acids is described.
To cite this article before page numbers are assigned, use the DOI form of citation above.
The content of this RSS Feed (c) The Royal Society of Chemistry




use

π-extended regioisomeric dithienoacenes fused pyrenes: structures, properties, and application in field-effect transistors

Org. Chem. Front., 2025, Accepted Manuscript
DOI: 10.1039/D4QO01592D, Research Article
Bin Lu, Shiqian Zhang, Dong Liu, Wendong Jin, Dalin Li, Zhiqiang Liu, Tao He
The development of π-conjugated semiconducting molecules with fused rings has been a focus of research in organic electronics. In this study, optoelectronic and field-effect transistors (FET) properties of two novel...
The content of this RSS Feed (c) The Royal Society of Chemistry




use

TGSRTC Karimnagar region to operate special buses to Arunachala Hill in Tamil Nadu on November 13




use

No more parties without permission: Telangana Excise Dept. to farmhouse owners




use

Man, accused of murdering ‘friend’ in Sept., arrested




use

Lovely lotuses blossomed by the sun

Ramanuja’s interpretations of the Sanskrit verses proved that he had the potential of being a good commentator.



  • History &amp; Culture

use

The stage, his muse

Writer, director and composer Gopal Sharman leaves behind a legacy of creative work.




use

A House for Mr. Rao



  • History &amp; Culture

use

When Germany’s Humboldt Forum museum turned into a venue for East-West musical experiment

Veena exponent Jayanthi Kumaresh recalls how she and violinist Kala Ramnath, along with European musicians, explored the beauty of Baroque music




use

Self-immolative polydisulfides and their use as nanoparticles for drug delivery systems

RSC Adv., 2024, 14,35568-35577
DOI: 10.1039/D4RA07228F, Paper
Open Access
  This article is licensed under a Creative Commons Attribution 3.0 Unported Licence.
Katharina Völlmecke, Maurice Kramer, Corinna Horky, Oliver Dückmann, Dennis Mulac, Klaus Langer, Dirk Kuckling
Polydisulfide based nanoparticles can be degraded by glutathione (GSH) to deliver hydrophobic drugs.
The content of this RSS Feed (c) The Royal Society of Chemistry




use

BJP government in Rajasthan takes over Gandhi Vatika Museum’s management

Conceptualised by the Gandhi Peace Foundation, the museum makes concerted efforts to keep the Gandhian philosophy relevant to the life and times of India




use

After raping and murdering doctor, accused went to sleep, washed his clothes: Kolkata Police

West Bengal Chief Minister Mamata Banerjee vowed to seek death penalty for the perpetrator in the Kolkata doctor rape and murder case




use

Hathras stampede: 11 accused appear in court, next hearing on August 23

The police had last month arrested 11 people in connection with the July 2 Hathras stampede




use

Shots fired at house of Manipur college principal

Police said masked men on a scooter fired five rounds on Tuesday evening. In July 17, miscreants had lobbed a grenade, but it did not explode and was later disposed of by a special squad




use

Tension in U.P.’s Muzaffarnagar after Muslim man buys house in Hindu-majority neighbourhood

Right-wing outfits allegedly warning that under no circumstances will Muslim families be allowed to settle in the predominantly Hindu locality




use

U.S. FDA proposes ending use of popular decongestant present in cold medicines

An agency review of the available data determined that oral phenylephrine, a major component of popular products such as Benadryl, Advil and Tylenols was not effective against nasal congestion




use

You can use text-wrap: balance; on icons

The CSS text-wrap property is (rightfully) widely assumed to be used strictly for text elements. But Terrence Eden posted an article on his blog that shows how it can also be used to balance the way other types of elements wrap, including icons.


You can use text-wrap: balance; on icons originally published on CSS-Tricks, which is part of the DigitalOcean family. You should get the newsletter.




use

Drone strike launched toward Israeli PM Benjamin Netanyahu’s house

Neither Israel’s Prime Minister Benjamin Netanyahu nor his wife were home and there were no casualties, says spokesperson




use

Biden, Harris celebrate Diwali with 600 Indian American guests at the White House

Biden shared a message of hope and democracy, while Harris highlighted the importance of knowledge and peace in her Diwali message from the campaign trail